Як перевірити, чи встановлений розділ UUID?


16

Якщо у мене є UUID дискового розділу, як би я почав з'ясовувати, встановлений він чи ні, використовуючи командний рядок?


У мене на дисках дублюються UUID, і цього не уникнути.
Джошуа

Я вважаю, що ви можете змінити uuid розділу з допомогою tune2fs.
Арронічний

@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?
Арронічний

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
На жаль, мій привід, який підключений, відображається в цьому списку, навіть якщо він не встановлений.
Арронічний

Шукайте "цікаві" повідомлення в dmesgі /var/log/kern.log*. Здається, що система не задоволена файловою системою на розділі, і не може її встановити. Однією з можливих причин є сплячка Windows.
waltinator

Я думаю, що я, можливо, заплутався, привід встановлюється та відключається чисто. Це просто те, що поки він не змонтований, але підключений та включений, він відображається в /dev/disks/by-uuid/каталозі.
Арронічний

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