Jak sprawdzić, czy partycja jest montowana przez UUID?

16

Jeśli mam identyfikator UUID partycji dysku, jak mam się dowiedzieć, czy jest on zamontowany, czy nie, za pomocą wiersza polecenia?

Arroniczny
źródło
Mam zduplikowane UUID na moich dyskach i nie można tego uniknąć.
Joshua
Wierzę, że możesz zmienić identyfikator użytkownika partycji za pomocą tune2fs.
Arronical
@Joshua, @Arronical Tak, możesz zmienić UUID za pomocą tune2fs -U random /dev/sdxx. Ale to nie zadziała dla wszystkich typów partycji.
Katu
W rzeczywistości to nie zadziała. Dyski muszą mieć ten sam UUID, ponieważ są dublowane. Próba wykrycia przez UUID zwraca zduplikowane ścieżki, a nie tylko urządzenie dublujące.
Joshua

Odpowiedzi:

20

lsblkmoże pomóc. Może wydrukować tylko UUID i punkt podłączenia, więc biorąc pod uwagę UUID, sprawdź, czy punkt podłączenia nie jest pusty:

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

Więc:

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

Ponieważ lbslkmoże działać na określonych urządzeniach, możesz także:

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

W przypadku pierwszej metody nie wystąpi błąd, jeśli ten identyfikator UUID nie pochodzi z aktualnie podłączonego dysku. Druga metoda lsblkspowoduje błąd, jeśli /dev/disk/by-uuid/$uuidnie istnieje.

muru
źródło
17
lsblk -o UUID,SIZE,MOUNTPOINT

Jeśli chcesz mieć tylko jedną linię z UUID i punktem montowania ($ UUID reprezentuje Twój UUID):

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

Punkt montowania będzie pusty, jeśli zostanie odmontowany. Wypróbuj lsblk -hwięcej opcji.

Użyj, awkaby wydrukować wynik. jeśli NF(liczba pól) jest większa niż jedno, oznacza to, że ma punkt montowania:

lsblk -o UUID,MOUNTPOINT|grep "$UUID"|awk '{if (NF>1) print $1" is mounted"; else print $1" is unmounted";}'
Katu
źródło
3
tak to ! Dokładnie to ! można również poprawić za pomocą grep, aby odfiltrować konkretny UUID, może nawet
parsować
9

Jeśli chcesz szczegóły od mount

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

zamień na your-UUID-hereswój UUID

bardziej czytelnie:

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

przykład wyjścia:

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

Możesz po prostu sprawdzić, czy łańcuch nie ma wartości zerowej, a echo „zamontowane”:

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

ale inni dali lepsze sposoby na to :)

Zanna
źródło
Lubię alternatywną trasę +1 :)
Arronical
@Arronical bardzo hojny z was: D
Zanna
6

Ubuntu używa UDisks2demona, który sonduje całą masę informacji o systemach plików, a my możemy użyć udisksctli przefiltrować jego dane wyjściowe, aby znaleźć szybki i brudny sposób na znalezienie potrzebnych informacji:

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)'

To, co widzisz powyżej, w zasadzie spowoduje wydrukowanie identyfikatorów UUID systemów plików i ich punktów montowania. Dzięki kontroli wizualnej możesz teraz dowiedzieć się, który UUID jest zamontowany, a który nie.

$ 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
Sergiy Kolodyazhnyy
źródło
6

Moje rozwiązanie

  • używa tylko powłoki procfs, więc żadne dziwne problemy z formatowaniem danych wyjściowych poleceń,
  • nie skanuje (ponownie) UUID urządzeń, ale używa pamięci podręcznej jądra,
  • dlatego nie wymaga uprawnień superużytkownika,
  • nie opiera się na kanonicznych nazwach ścieżek, ale używa tożsamości pliku (urządzenia).
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
David Foerster
źródło
5

Opierając się na doskonałych odpowiedziach, jakie otrzymałem na to pytanie, zdałem sobie sprawę, że o wiele łatwiej jest pracować z nazwami urządzeń. Aby uzyskać nazwę urządzenia z UUID:

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

Co oznacza, że ​​mogę szybko wywnioskować, czy jest on zamontowany, grepując dane wyjściowe df:

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

Lub wykorzystując kod w odpowiedzi Muru , który ma dodatkową zaletę, mówiąc mi, gdzie jest zamontowany dysk:

mountpoint=$(lsblk -no MOUNTPOINT "$disk_devname")
if [[ -n  "$mountpoint" ]]; then
   echo "Disk is mounted at $mountpoint"
else
   echo "Disk not mounted"
fi
Arroniczny
źródło
4

Możesz użyć dfpolecenia, aby zobaczyć podłączone systemy plików i ich punkty podłączenia. Oto przykład z mojego komputera ... partycja sdb3, na której mam zainstalowany inny system, nie jest zamontowana, więc nie znajduje się na liście (partycje są ponownie oznaczone, dlatego zamiast UUID wyświetlane są nazwy):

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  
cl-netbox
źródło
Czy mogę używać UUID dla partycji df?
Arronical
0

Jeśli the_UUIDw /dev/disk/by-uuid/partycji jest zamontowane łącze o nazwie „ ” . Na moim 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
waltinator
źródło
2
Niestety mój podłączony dysk pokazuje się na tej liście, nawet jeśli nie jest zamontowany.
Arronical
Poszukaj „interesujących” wiadomości w dmesgi /var/log/kern.log*. Wygląda na to, że system nie jest zadowolony z systemu plików na partycji i nie może go zamontować. Jedną z możliwych przyczyn jest hibernacja systemu Windows.
waltinator,
Wydaje mi się, że mogłem się pomylić, ponieważ napęd montuje się i odmontowuje w sposób czysty. Po prostu nie jest on zamontowany, ale jest podłączony i włączony, pojawia się w /dev/disks/by-uuid/katalogu.
Arronical
2
Nie, /dev/disk/by-uuida jego odpowiedniki zawierają wszystkie identyfikatory UUID / identyfikatory / etykiety podłączonych urządzeń znanych z udev, niezależnie od ich stanu podłączenia.
David Foerster,