Существует ли команда для наблюдения, где диск смонтирован?

Так как Вы упоминаете Gvim конкретно, я предполагаю, что это - редактор Ваш предпочитать. Gvim/vim действительно поддерживает справа налево текст.

Используйте опцию :set rl или подробная форма :set rightleft включить его. Можно добавить это к Вашему .vimrc если Вы хотите всегда использовать его.

vim должен будет быть скомпилирован с +rightleft опция. Я не на 100% уверен, делает ли Ubuntu это, но CentOS делает. Для проверки я сделал vim --version | grep +rightleft с тех пор vim может отобразить, с какими опциями это было скомпилировано.

30
22.03.2012, 09:31
6 ответов

В соответствии с Linux, можно получить информацию точки монтирования непосредственно от ядра в /proc/mounts. mount программа записывает подобную информацию в /etc/mtab. Пути и опции могут отличаться, как /etc/mtab представляет что mount переданный ядру, тогда как /proc/mounts показывает данные, как замечено в ядре. /proc/mounts всегда актуально тогда как /etc/mtab не мог бы быть то, если /etc было только для чтения в какой-то момент, который не ожидался сценариями начальной загрузки. Формат аналогичен /etc/fstab.

В обоих файлах первое разделенное от пробела поле содержит путь устройства, и второе поле содержит точку монтирования.

awk -v needle="$device_path" '$1==needle {print $2}' /proc/mounts

или если у Вас нет awk:

grep "^$device_path " /proc/mounts | cut -d ' ' -f 2

Существует много пограничных случаев, где Вы не могли бы получить то, что Вы ожидаете. Если устройство было смонтировано через другой путь в /dev это определяет то же устройство, Вы не заметите его этот путь. В /proc/mounts, свяжите монтирование, неотличимы от оригинала. Может быть больше чем одно соответствие, если точка монтирования тени другой (это необычно).

В /proc/self или /proc/$pid, существует для каждого процесса mounts файл, который подражает глобальному файлу. Информация о монтировании может варьироваться между процессами, например, из-за chroot. Существует дополнительный названный файл mountinfo это имеет другой формат и включает больше информации, в особенности устройство главные и незначительные числа. Из документации:

36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
(1)(2)(3)   (4)   (5)      (6)      (7)   (8) (9)   (10)         (11)

(1) mount ID:  unique identifier of the mount (may be reused after umount)
(2) parent ID:  ID of parent (or of self for the top of the mount tree)
(3) major:minor:  value of st_dev for files on filesystem
(4) root:  root of the mount within the filesystem
(5) mount point:  mount point relative to the process's root
(6) mount options:  per mount options
(7) optional fields:  zero or more fields of the form "tag[:value]"
(8) separator:  marks the end of the optional fields
(9) filesystem type:  name of filesystem of the form "type[.subtype]"
(10) mount source:  filesystem specific information or "none"
(11) super options:  per super block options

Таким образом, при поиске устройства числом можно сделать это как это:

awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'
14
27.01.2020, 19:38
  • 1
    , "Если устройство было смонтировано через другой путь в/dev, который определяет то же устройство, Вы не заметите его этот путь". — Который на самом деле имеет место: Я имею udisks символьная ссылка (в/dev/disk/by-label/...). Но я могу решить к использованию узла устройства readlink -f. Мне нравится /proc/mounts идея, я думаю, что это могло бы быть немного более надежно, чем /etc/mtab. –  detly 23.03.2012, 01:59
  • 2
    @detly Или Вы можете использовать mountinfo. Звонить stat для получения номеров устройств (см. мой обновленный ответ я забыл включать команду ранее). –  Gilles 'SO- stop being evil' 23.03.2012, 02:04
  • 3
    Вам, возможно, понадобится -d " " опция для cut в этом grep команда. –  Craig McQueen 08.05.2015, 07:47
  • 4

mount команда без аргументов перечислит все в настоящее время монтируемые файловые системы; Вы можете grep это для диска Вы хотите (или grep /etc/mtab, который является файлом mount читает информацию из):

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
6
27.01.2020, 19:38
  • 1
    Это имеет много постороннего текста все же. Я должен смочь передать точку монтирования другим командам. (Извините, я разъяснил это в Q.) А-ч –  detly 22.03.2012, 09:31
  • 2
    , grep ${NODE} /etc/mtab | cut -d ' ' -f 2 должен сделать это. –  detly 22.03.2012, 09:33
  • 3
    Хотя grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2" намного менее хрупко... –  detly 22.03.2012, 09:41

В Linux теперь можно использовать команду findmnt из util-linux (начиная с версии 2.18):

$ findmnt -S /dev/VG_SC/home
TARGET SOURCE                 FSTYPE OPTIONS
/home  /dev/mapper/VG_SC-home ext4   rw,relatime,errors=remount-ro,data=ordered

или lsblk (также из util-linux), начиная с версии 2. 19):

$ lsblk /dev/VG_SC/home
NAME       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
VG_SC-home 254:2    0  200G  0 lvm  /home

Это также полезно для поиска всей файловой системы, смонтированной под определенным устройством (диском или разделом...):

$ lsblk  /dev/sda2
NAME                    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda2                      8:2    0  59.5G  0 part
├─linux-debian64 (dm-1) 252:1    0    15G  0 lvm
└─linux-mint (dm-2)     252:2    0    15G  0 lvm  /

Для получения только точки монтирования:

$ findmnt -nr -o target -S /dev/storage/home
/home
$ lsblk -o MOUNTPOINT -nr /dev/storage/home
/home

Выше findmnt возвращается со статусом выхода из сбоя, если устройство не смонтировано, а не lsblk.

Итак:

if mountpoint=$(findmnt -nr -o target -S "$device"); then
  printf '"%s" is mounted on "%s"\n' "$device" "$mountpoint"
else
  printf '"%s" does not appear to be directly mounted\n' "$device"
fi
27
27.01.2020, 19:38

Да. Вы можете посмотреть Показаны только интересные точки горы/неинтересные типы фильтрации или Каталоги листинга под /, которые не находятся под одной и той же точкой горы, для примера использования, но ниже также есть краткая сводка. Команда, о которой вы спрашиваете, findmnt (хотя lsblk также может служить):

lsblk -f /dev/sda[12]

NAME FSTYPE LABEL UUID                                 MOUNTPOINT
sda1 vfat   ESP   F0B7-5DAE                            /esp
sda2 btrfs  sys   94749918-bde1-46e6-b77c-b66e0368ecdb /    

Теперь, как вы видите, /dev/sda1 смонтирован на /esp. Интересно, установлен ли он и в другом месте?

findmnt /dev/sda1

TARGET SOURCE                    FSTYPE OPTIONS
/esp   /dev/sda1                 vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro
/boot  /dev/sda1[/EFI/arch_root] vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro

Ага. Понятно. Подпапка также --bind смонтирована поверх загрузки. Хорошо...

sudo umount /boot /esp
findmnt /dev/sda1

Ничего. Какого черта?

echo "$?"

1

Охх... Ну, это мило. Хммм...

for d in 1 2
do    findmnt "/dev/sda$d" >/dev/null
      printf  "/dev/sda$d%.$((6>>!$?))s%s\n"\
              " isn't" " currently mounted."
done

/dev/sda1 isn't currently mounted.
/dev/sda2 is currently mounted.

О, да, очень мило.

for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda2[/arch_root] /

А теперь давайте вернем sda1 на место и попробуем еще раз...

sudo mount -a
for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda1                 /esp
/dev/sda1[/EFI/arch_root] /boot
/dev/sda2[/arch_root] /

Но где я нашел эту волшебную команду?

man mount | sed -e:n -e'/findmnt/!d;N;/\n$/q;bn'

Для более надежного и настраиваемого вывода используйте findmnt(8), особенно в ваших скриптах. Обратите внимание, что управляющие символы в имени точки монтирования заменяются на ?.

2
27.01.2020, 19:38

Я не знаю чистого и простого способа определить, установлен ли узел устройства в /dev или нет. Однако, это то, что я могу предложить. Он работает непосредственно с устройствами (/dev/sda1) и с устройствами, смонтированными по UUID (/dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f). Он разбивается, если имена устройств содержат пробелы.

deviceIsMounted()
{
    local DEVICE="$1"
    local MOUNT=$(
        (
            echo "$DEVICE"
            find /dev -type l -lname "*${DEVICE/*\/}" -exec readlink -f {} \; -print |
                xargs -n2 |
                awk -v device="$DEVICE" '$1 == device {print $2}'
        ) |
            xargs -n1 -i{} grep -F {} /proc/mounts
    )
    test -n "$MOUNT" && echo "$MOUNT"
}

deviceIsMounted /dev/sda1 && echo yes              # Mountpoint and status
deviceIsMounted /dev/md2 >/dev/null && echo yes    # Just status

Функция записывает запись из /proc/mount в stdout, если она найдена, а также устанавливает статус выхода равным 0. В противном случае статус выхода равен 1.

.
1
27.01.2020, 19:38

Просто выполните следующую команду:

df -h
-1
27.01.2020, 19:38

Теги

Похожие вопросы