Чи є команда побачити, де встановлений диск?


29

Чи є проста команда, яка приймає вузол дискового пристрою як вхідний і каже мені, де (і чи) цей диск встановлений? Чи можливо отримати точку монтажу самостійно, тому я можу передати її іншій команді?

Я працюю над живою системою Debian Squeeze з мінімальною установкою (при необхідності я можу встановити додаткові пакети).

Відповіді:


14

У 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}'

"Якщо пристрій було встановлено через інший шлях в / dev, який позначає той самий пристрій, ви цього не помітите." - Це насправді так: у мене є udisksсимпосилання (in / dev / disk / by-label / ...). Але я можу вирішити проблему з вузлом пристрою, використовуючи readlink -f. Мені подобається /proc/mountsідея, я думаю, що це може бути трохи надійніше, ніж /etc/mtab.
detly

@detly Або ви можете використовувати mountinfo. Телефонуйте, statщоб отримати номери пристроїв (див. Мою оновлену відповідь, я забув включити команду раніше).
Жиль "ТАК - перестань бути злим"

Можливо, вам знадобиться -d " "опція для cutцієї grepкоманди.
Крейг МакКуїн


26

У 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

Завжди добре дізнатися щось нове
roaima

6

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

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0

Але в ньому є багато стороннього тексту. Мені потрібно вміти передавати точку монтажу іншим командам. (Вибачте, я уточнив це в
запитанні

Ах, grep ${NODE} /etc/mtab | cut -d ' ' -f 2слід це робити.
декрет

Хоча grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"набагато менш тендітний ...
спритно

2

Так. Ви можете бачити показ лише цікавих точок монтажу / фільтрування нецікавих типів або лістинг-каталоги під цим, /що не знаходяться під тією ж точкою встановлення для деяких прикладів використання, але нижче також є короткий пробіг. Команда, про яку ви запитуєте, - це 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) , особливо у ваших сценаріях. Зверніть увагу, що символи керування у назві точки кріплення замінюються на ?.


1

Я не знаю, чистим і простим способом виявити, чи встановлений вузол пристрою /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у stdout, якщо його знайдено, також встановлюючи статус виходу на 0. Інакше статус виходу дорівнює 1.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.