Làm cách nào để kiểm tra xem phân vùng có được UUID gắn kết không?


16

Nếu tôi có UUID của phân vùng ổ đĩa, tôi sẽ tìm hiểu xem nó có được gắn kết hay không, sử dụng dòng lệnh?


Tôi có UUID trùng lặp trên các ổ đĩa của mình và điều này không thể tránh được.
Joshua

Tôi tin rằng bạn có thể thay đổi uuid của một phân vùng với tune2fs.
Arronical

@Joshua, @Arronical Có, bạn có thể thay đổi UUID bằng tune2fs -U random /dev/sdxx. Nhưng điều này sẽ không hoạt động cho tất cả các loại phân vùng.
Katu

Trong thực tế, nó sẽ không hoạt động. Các ổ đĩa phải có cùng UUID vì chúng được nhân đôi. Cố gắng phát hiện bằng UUID trả về các đường dẫn trùng lặp thay vì chỉ thiết bị nhân bản.
Joshua

Câu trả lời:


20

lsblkcó thể giúp. Nó có thể chỉ in UUID và điểm gắn kết, vì vậy, với UUID, chỉ cần xem điểm gắn kết không trống:

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

Vì thế:

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

lbslkcó thể hoạt động trên các thiết bị cụ thể, bạn cũng có thể thực hiện:

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

Với phương thức đầu tiên, sẽ không có lỗi nếu UUID đó không phải từ một đĩa hiện được kết nối. Với phương thức thứ hai, lsblksẽ báo lỗi nếu /dev/disk/by-uuid/$uuidkhông tồn tại.


17
lsblk -o UUID,SIZE,MOUNTPOINT

Nếu bạn chỉ muốn một dòng với UUID và mountpoint ($ UUID đại diện cho UUID của bạn):

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

Điểm gắn kết sẽ trống nếu nó không được đếm. Hãy thử lsblk -hđể có nhiều lựa chọn hơn.

Sử dụng awkđể in kết quả. if NF(Số lượng trường) nhiều hơn một nghĩa là nó có điểm gắn kết:

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

3
Vâng cái này ! chính xác điều này! cũng có thể được cải thiện với grep để lọc UUID cụ thể, thậm chí có thể phân tích cú pháp với awk
Sergiy Kolodyazhnyy

9

Nếu bạn muốn các chi tiết như từ mount

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

thay thế your-UUID-herebằng UUID của bạn

dễ đọc hơn:

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

ví dụ đầu ra:

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

Bạn chỉ có thể làm cho nó kiểm tra xem chuỗi không phải là null và echo "mount":

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

nhưng những người khác đã cho những cách tốt hơn để làm điều đó :)


Tôi thích tuyến đường thay thế +1 :)
Arronical

@Arronical rất hào phóng của bạn: D
Zanna

6

Ubuntu sử dụng UDisks2trình nền, trong đó thăm dò toàn bộ thông tin về các hệ thống tệp và chúng tôi có thể sử dụng udisksctlvà lọc đầu ra của nó để tìm một cách nhanh chóng và bẩn thỉu để tìm thông tin chúng tôi cần:

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

Những gì bạn thấy ở trên, về cơ bản sẽ in UUID của các hệ thống tập tin và các điểm gắn kết của chúng. Bằng cách kiểm tra trực quan, bây giờ bạn có thể tìm ra, UUID nào được gắn và cái nào không.

$ 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

Giải pháp của tôi

  • chỉ sử dụng shell và procfs, do đó, không có vấn đề định dạng đầu ra lệnh lạ,
  • không (lại) quét UUID thiết bị nhưng sử dụng bộ đệm kernel,
  • do đó không yêu cầu đặc quyền siêu người dùng,
  • không dựa vào tên đường dẫn chuẩn mà sử dụng nhận dạng tệp (thiết bị).
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

Dựa trên những câu trả lời xuất sắc mà tôi nhận được cho câu hỏi này, tôi nhận ra rằng làm việc với tên thiết bị dễ dàng hơn nhiều. Để lấy tên thiết bị từ UUID:

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

Điều đó có nghĩa là tôi có thể nhanh chóng suy luận nếu nó được gắn kết bằng cách lấy đầu ra của df:

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

Hoặc bằng cách sử dụng mã trong câu trả lời của Muru , có thêm phần thưởng cho tôi biết ổ đĩa được gắn ở đâu:

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

4

Bạn có thể sử dụng dflệnh để xem các hệ thống tệp được gắn kết và điểm gắn kết của chúng. Dưới đây là một ví dụ từ máy của tôi ... phân vùng sdb3mà tôi đã cài đặt hệ thống khác, không được gắn kết, vì vậy không được liệt kê (phân vùng được gắn nhãn lại, đó là lý do tại sao tên được hiển thị thay vì 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  

Tôi có thể sử dụng phân vùng UUID với df?
Arronical

0

Nếu có một liên kết có tên " the_UUID" trong /dev/disk/by-uuid/phân vùng được gắn kết. Trên Ubuntu 14.04.5 (YMMV) của tôi:

$ 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
Thật không may, ổ đĩa của tôi được kết nối sẽ hiển thị trong danh sách này ngay cả khi không được gắn kết.
Arronical

Tìm kiếm tin nhắn "thú vị" trong dmesg/var/log/kern.log*. Có vẻ như hệ thống không hài lòng với hệ thống tệp trên phân vùng và không thể gắn kết nó. Một nguyên nhân có thể là ngủ đông Windows.
hát rong

Tôi nghĩ rằng tôi có thể đã nhầm lẫn, ổ đĩa gắn kết và unmounts sạch sẽ. Chỉ là trong khi nó không được gắn kết, nhưng được kết nối và bật, nó hiển thị trong/dev/disks/by-uuid/ thư mục.
Arronical

2
Không, /dev/disk/by-uuidvà các đối tác của nó giữ tất cả UUID / ID / nhãn của các thiết bị được kết nối được biết đến với udev bất kể trạng thái gắn kết của chúng.
David foerster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.