Bagaimana cara memeriksa apakah partisi sudah di-mount oleh UUID?

16

Jika saya memiliki UUID partisi drive, bagaimana saya mencari tahu apakah sudah terpasang atau tidak, menggunakan baris perintah?

Arronikal
sumber
Saya memiliki UUID yang diduplikasi pada drive saya, dan ini tidak dapat dihindari.
Joshua
Saya percaya bahwa Anda dapat mengubah uuid partisi dengan tune2fs.
Arronical
@ Yosua, @Arronical Ya, Anda dapat mengubah UUID dengan tune2fs -U random /dev/sdxx. Tetapi ini tidak akan bekerja untuk semua jenis partisi.
Katu
Sebenarnya itu tidak akan berhasil. Drive harus memiliki UUID yang sama karena dicerminkan. Mencoba mendeteksi dengan UUID mengembalikan jalur duplikat daripada hanya perangkat cermin.
Joshua

Jawaban:

20

lsblkmungkin membantu. Ini dapat mencetak hanya UUID dan titik mount, jadi, mengingat UUID, lihat saja apakah titik mount tidak kosong:

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

Begitu:

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

Karena lbslkdapat bertindak pada perangkat tertentu, Anda juga dapat melakukan:

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

Dengan metode pertama, tidak akan ada kesalahan jika UUID itu tidak dari disk yang saat ini terhubung. Dengan metode kedua, lsblkakan keluar kesalahan jika /dev/disk/by-uuid/$uuidtidak ada.

muru
sumber
17
lsblk -o UUID,SIZE,MOUNTPOINT

Jika Anda hanya ingin satu baris dengan UUID dan mountpoint Anda ($ UUID mewakili UUID Anda):

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

Titik pemasangan akan kosong jika tidak di-mount. Coba lsblk -huntuk lebih banyak opsi.

Gunakan awkuntuk mencetak hasilnya. jika NF(Jumlah bidang) lebih dari satu itu berarti memiliki titik mount:

lsblk -o UUID,MOUNTPOINT|grep "$UUID"|awk '{if (NF>1) print $1" is mounted"; else print $1" is unmounted";}'
Katu
sumber
3
Iya ini ! ini tepatnya! juga dapat ditingkatkan dengan grep untuk memfilter UUID tertentu, bahkan mungkin diuraikan dengan awk
Sergiy Kolodyazhnyy
9

Jika Anda ingin detailnya dari mount

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

ganti your-UUID-heredengan UUID Anda

lebih mudah dibaca:

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

contoh output:

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

Anda bisa membuatnya memeriksa bahwa string tidak null dan echo "dipasang":

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

tetapi yang lain memberi cara yang lebih baik untuk melakukan itu :)

Zanna
sumber
Saya suka rute alternatif +1 :)
Arronical
@Arronical sangat bermurah hati kepada Anda: D
Zanna
6

Ubuntu menggunakan UDisks2daemon, yang mengumpulkan banyak informasi tentang sistem file, dan kita dapat menggunakan udisksctldan memfilter outputnya untuk menemukan cara cepat dan kotor untuk menemukan info yang kita butuhkan:

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

Apa yang Anda lihat di atas, pada dasarnya akan mencetak UUID dari filesystem dan mountpoint-nya. Dengan inspeksi visual, Anda sekarang dapat mengetahui, UUID mana yang dipasang, dan mana yang tidak.

$ 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
sumber
6

Solusi saya

  • hanya menggunakan shell dan procfs, jadi tidak ada masalah format perintah output yang aneh,
  • tidak (kembali) memindai UUID perangkat tetapi menggunakan cache kernel,
  • karena itu tidak memerlukan hak pengguna super,
  • tidak bergantung pada nama jalur yang dikanonikalisasi tetapi menggunakan identitas file (perangkat).
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
sumber
5

Dengan membangun jawaban luar biasa yang saya terima untuk pertanyaan ini, saya menyadari bahwa lebih mudah untuk bekerja dengan nama perangkat. Untuk mendapatkan nama perangkat dari UUID:

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

Yang berarti saya dapat dengan cepat menyimpulkan jika sudah terpasang dengan menangkap output dari df:

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

Atau dengan menggunakan kode dalam jawaban Muru , yang memiliki bonus tambahan untuk memberi tahu saya di mana drive dipasang:

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

Anda dapat menggunakan dfperintah untuk melihat sistem file yang terpasang dan titik pemasangannya. Ini adalah contoh dari komputer saya ... partisi sdb3, tempat saya menginstal sistem lain, tidak dipasang, jadi tidak terdaftar (partisi diberi label ulang, itu sebabnya nama-nama ditampilkan sebagai ganti 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  
cl-netbox
sumber
Bisakah saya menggunakan UUID partisi dengan df?
Arronical
0

Jika ada tautan bernama " the_UUID" di /dev/disk/by-uuid/partisi yang dipasang. Di Ubuntu 14.04.5 (YMMV) saya:

$ 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
sumber
2
Sayangnya drive saya yang terhubung muncul di daftar ini walaupun tidak dipasang.
Arronical
Cari pesan "menarik" di dmesgdan /var/log/kern.log*. Sepertinya sistem tidak senang dengan sistem file di partisi, dan tidak bisa memasangnya. Salah satu penyebab yang mungkin adalah hibernasi Windows.
waltinator
Saya pikir saya mungkin membingungkan, drive terpasang dan dilepas dengan bersih. Hanya saja sementara itu tidak dipasang, tetapi terhubung dan dihidupkan, itu muncul di /dev/disks/by-uuid/direktori.
Arronical
2
Tidak, /dev/disk/by-uuiddan mitranya memegang semua UUID / ID / label perangkat yang terhubung yang diketahui udev terlepas dari status pemasangannya.
David Foerster