Как проверить, смонтирован ли раздел по UUID?


16

Если у меня есть UUID раздела диска, как бы я узнал, смонтирован ли он или нет, с помощью командной строки?


У меня UUID дублированы на моих дисках, и этого нельзя избежать.
Джошуа

Я считаю, что вы можете изменить UUID раздела с tune2fs.
Arronical

@Joshua, @Arronical Да, вы можете изменить UUID с помощью tune2fs -U random /dev/sdxx. Но это не будет работать для всех типов разделов.
Кату

На самом деле это не сработает. Диски должны иметь одинаковый UUID, потому что они зеркальные. Попытка обнаружения по UUID возвращает дубликаты путей, а не только зеркальное устройство.
Иисус Навин

Ответы:


20

lsblkможет помочь. Он может печатать только UUID и точку монтирования, поэтому, учитывая UUID, просто посмотрите, не пуста ли точка монтирования:

uuid=foo
lsblk -o UUID,MOUNTPOINT | awk -v u="$uuid" '$1 == u {print $2}'

Так:

uuid=foo
mountpoint=$(lsblk -o UUID,MOUNTPOINT | awk -v u="$uuid" '$1 == u {print $2}')
if [[ -n $mountpoint ]]
then
    echo mounted
else
    echo not mounted
fi

Так как lbslkможет действовать на определенных устройствах, вы также можете сделать:

mountpoint=$(lsblk -o MOUNTPOINT "/dev/disk/by-uuid/$uuid" | awk 'NR==2')

При первом способе не будет ошибки, если этот UUID не с подключенного в данный момент диска. При втором методе lsblkпроизойдет ошибка, если /dev/disk/by-uuid/$uuidона не существует.


17
lsblk -o UUID,SIZE,MOUNTPOINT

Если вам нужна только одна строка с вашим UUID и точкой монтирования ($ UUID представляет ваш UUID):

lsblk -o UUID,MOUNTPOINT|grep "$UUID"

Точка монтирования будет пустой, если она отключена. Попробуйте lsblk -hбольше вариантов.

Используйте awkдля печати результата. Если NF(Количество полей) больше одного, это означает, что у него есть точка монтирования:

lsblk -o UUID,MOUNTPOINT|grep "$UUID"|awk '{if (NF>1) print $1" is mounted"; else print $1" is unmounted";}'

3
да это! именно это ! также может быть улучшен с помощью grep, чтобы отфильтровать определенный UUID, возможно, даже проанализировать с помощью awk
Сергей Колодяжный,

9

Если вы хотите, чтобы детали с mount

for uuid in /dev/disk/by-uuid/*; do if [[ "$uuid" =~ .*your-UUID-here.* ]]; then echo $(mount | grep "$(readlink -e "$uuid")") ; fi; done

заменить your-UUID-hereна ваш UUID

более читабельно:

 for uuid in /dev/disk/by-uuid/*; do 
   if [[ "$uuid" =~ .*your-UUID-here.* ]]
     then echo $(mount | grep "$(readlink -e "$uuid")")
   fi
 done

пример вывода:

/dev/mmcblk1p2 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

Вы можете просто проверить, что строка не равна нулю, и повторить «смонтировано»:

for uuid in /dev/disk/by-uuid/*; do if [[ "$uuid" =~ .*your-UUID-here.* ]]; then if [[ $(mount | grep "$(readlink -e "$uuid")") ]]; then echo "mounted"; fi; fi; done

но другие дали лучшие способы сделать это :)


Мне нравится альтернативный маршрут +1 :)
Arronical

@ Arronical очень щедрый из вас: D
Zanna

6

Ubuntu использует UDisks2демон, который опрашивает большую часть информации о файловых системах, и мы можем использовать udisksctlи фильтровать его вывод, чтобы найти быстрый и грязный способ найти нужную нам информацию:

udisksctl dump | python -c 'import sys;lines = [l.strip() for l in sys.stdin if " UUID" in l or " MountPoints:" in l];print "\n".join(lines)'

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

$ udisksctl dump | python -c 'import sys;lines = [l.strip() for l in sys.stdin                                           
> if " UUID" in l or " MountPoints:" in l];print "\n".join(lines)'
MountPoints:        /
UUID:               000b5321-01
MountPoints:
UUID:               bbf23a81-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               bbf23a87-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               bbf23a89-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               bbf23a8f-808e-11e4-a445-201a06d7b0e9
MountPoints:
UUID:               02fe8de2-a408-11e4-8eeb-f0761c8c6df7
MountPoints:        /mnt/HDD
UUID:               53827413-0b7e-4ae6-ae09-1daea529d6a1

6

Мое решение

  • использует только оболочку и procfs, таким образом, никаких странных проблем форматирования вывода команды,
  • не (повторно) сканирует UUID устройства, но использует кеш ядра,
  • поэтому не требует привилегий суперпользователя,
  • не полагается на канонизированные имена путей, но использует идентификацию файла (устройства).
my_uuid=...
while IFS=' ' read -r dev mnt remainder; do
  case "$dev" in
  /dev/*)
    if [ "$dev" -ef "/dev/disk/by-uuid/$my_uuid" ]; then
      echo "$my_uuid ($dev) mounted at $mnt"
      break
    fi;;
  esac
done < /proc/mounts

5

Опираясь на прекрасные ответы, которые я получил на этот вопрос, я понял, что работать с именами устройств гораздо проще. Чтобы получить имя устройства из UUID:

disk_uuid=foo
disk_devname=$(blkid -U "$disk_uuid")

Что означает, что я могу быстро вывести, если он смонтирован, сгребая вывод df:

df | grep -q "$disk_devname" && echo "Disk mounted" || echo "Disk not mounted"

Или с помощью кода в ответе Муру , который имеет дополнительный бонус, сообщая мне, где смонтирован диск:

mountpoint=$(lsblk -no MOUNTPOINT "$disk_devname")
if [[ -n  "$mountpoint" ]]; then
   echo "Disk is mounted at $mountpoint"
else
   echo "Disk not mounted"
fi

4

Вы можете использовать dfкоманду, чтобы увидеть смонтированные файловые системы и их точку монтирования. Вот пример с моей машины ... раздел sdb3, на котором у меня установлена ​​другая система, не смонтирован, поэтому не указан (разделы переименованы, поэтому вместо UUID отображаются имена):

df
Filesystem                   1K-blocks     Used Available Use% Mounted on
udev                           8100756        0   8100756   0% /dev
tmpfs                          1625296     9952   1615344   1% /run
/dev/sdb4                     41022688  7074348  31834804  19% /
tmpfs                          8126464    19456   8107008   1% /dev/shm
tmpfs                             5120        4      5116   1% /run/lock
tmpfs                          8126464        0   8126464   0% /sys/fs/cgroup
/dev/loop0                       76800    76800         0 100% /snap/ubuntu-core/423
/dev/sdb1                      4186108    12160   4173948   1% /boot/efi
zsc-lxd/containers/uc-1604-1  58620160   516736  58103424   1% /var/lib/lxd/containers/uc-1604-1.zfs
zsc-lxd/containers/uc-1610-1  58637184   533760  58103424   1% /var/lib/lxd/containers/uc-1610-1.zfs
tmpfs                          1625292      124   1625168   1% /run/user/1000
/dev/sdb5                     61796348 10766892  47867344  19% /media/cl/virtual
/dev/sda4                    206293688 13419740 182371804   7% /media/cl/system
/dev/sda3                    206293688 32116600 163674944  17% /media/cl/rescue
/dev/sda2                    206293688  1867604 193923940   1% /media/cl/media
/dev/sda1                    206293688  2539712 193251832   2% /media/cl/data  

Могу ли я использовать раздел UUID с df?
Arronical

0

Если есть ссылка с именем " the_UUID" в /dev/disk/by-uuid/разделе монтируется. На моей Ubuntu 14.04.5 (YMMV):

$ ll /dev/disk/by-uuid
total 0
lrwxrwxrwx 1 root root  9 Nov 14 04:30 0123-4567 -> ../../sde
lrwxrwxrwx 1 root root 10 Nov 11 00:25 06ee65d5-26f7-41f3-91ab-3497021a6213 -> ../../dm-0
lrwxrwxrwx 1 root root 10 Nov 11 00:25 12817b99-9d2b-4357-a4ca-c11eab672a20 -> ../../sdb6
lrwxrwxrwx 1 root root 10 Nov 11 00:25 362254e8-2b99-442d-8ad9-4a348bc08032 -> ../../sda1
lrwxrwxrwx 1 root root 10 Nov 11 00:25 83a64b80-5a37-4659-b797-221b88ef41f8 -> ../../sdb5
lrwxrwxrwx 1 root root 10 Nov 11 00:25 ff359af0-d996-4949-b27e-f24ce453c48c -> ../../sdc1

2
К сожалению, мой диск, который подключен, отображается в этом списке, даже если он не подключен.
Arronical

Ищите "интересные" сообщения в dmesgа /var/log/kern.log*. Похоже, система недовольна файловой системой раздела и не может ее смонтировать. Одной из возможных причин является спящий режим Windows.
вальтинатор

Я думаю, что я мог сбить с толку, диск монтируется и размонтируется чисто. Просто он не подключен, но подключен и включен, но отображается в /dev/disks/by-uuid/каталоге.
Arronical

2
Нет, /dev/disk/by-uuidи его аналоги содержат все UUID / идентификаторы / метки подключенных устройств, известных udev, независимо от их состояния монтирования.
Дэвид Фёрстер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.