Есть ли простая команда, которая берет узел устройства диска в качестве входных данных и сообщает мне, где (и смонтирован ли) этот диск? Возможно ли получить точку монтирования отдельно, чтобы я мог передать ее другой команде?
Я работаю над системой Debian Squeeze Live с минимальной установкой (при необходимости могу установить дополнительные пакеты).
решение1
В 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
решение2
В 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
монтирования bind неотличимы от оригинала. Может быть более одного соответствия, если точка монтирования затеняет другую (это необычно).
В /proc/self
или /proc/$pid
есть mounts
файл per-process, который имитирует глобальный файл. Информация о монтировании может различаться между процессами, например, из-за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}'
решение3
Команда mount
без аргументов выведет список всех смонтированных в данный момент файловых систем; вы можете grep
сделать это для нужного вам диска (или grep
/etc/mtab
, с которого файл mount
считывает информацию):
$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
решение4
Я не знаю простого и понятного способа определить, /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/mounts
встандартный выводесли найдено, также устанавливается статус выхода 0. В противном случае статус выхода равен 1.