Làm cách nào để tìm UUID của hệ thống tệp


133

Tôi đang chạy Ubuntu và muốn tìm hiểu UUIDmột hệ thống tập tin cụ thể (không phải phân vùng). Tôi biết tôi có thể sử dụng e2label /dev/sda1để tìm ra nhãn hệ thống tập tin, nhưng dường như không có cách nào tương tự để tìm UUID.


Cảm ơn tất cả các câu trả lời, tôi chắc chắn tôi sẽ sử dụng tất cả chúng trong các trường hợp khác nhau.
Brad Gilbert

2
Lưu ý rằng tiêu đề được sử dụng là "Làm cách nào để tìm UUID của phân vùng". Câu hỏi đó chỉ có ý nghĩa khi sử dụng bảng phân vùng GPT. Đây là một câu trả lời cho câu hỏi đó .
Alastair Irvine

Câu trả lời:


164

Một lệnh khác có thể có sẵn và cũng hoạt động khá tốt cho việc này là 'blkid'. Đây là một phần của gói e2fspross. Ví dụ về việc sử dụng nó:

Tra cứu dữ liệu trên / dev / sda1:

topher@crucible:~$ sudo blkid /dev/sda1
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"

Hiển thị dữ liệu UUID cho tất cả các phân vùng:

topher@crucible:~$ sudo blkid
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"
/dev/sdb: UUID="467c4aa9-963d-4467-8cd0-d58caaacaff4" TYPE="ext3"

Hiển thị dữ liệu UUID cho tất cả các phân vùng ở định dạng dễ đọc hơn: (Lưu ý: trong các bản phát hành mới hơn, blkid -Lcó ý nghĩa khác và blkid -o listnên được sử dụng thay thế)

topher@crucible:~$ sudo blkid -L
device     fs_type label    mount point    UUID
-------------------------------------------------------------------------------
/dev/sda1 ext3             /              727cac18-044b-4504-87f1-a5aefa774bda
/dev/sdc  ext3             /home          467c4aa9-963d-4467-8cd0-d58caaacaff4

Chỉ hiển thị UUID cho / dev / sda1 và không có gì khác:

topher@crucible:~$ sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda

1
Trên máy tính Ubuntu của tôi, tôi không cần sử dụng sudo.
Brad Gilbert

Chỉ cần gõ blkid, đã cho tôi chính xác những gì tôi muốn, nhưng không hoàn toàn những gì tôi yêu cầu. (Dù sao tôi cũng chấp nhận nó, vì tôi chắc chắn rằng tôi sẽ sử dụng nó thường xuyên)
Brad Gilbert

3
Trên các phiên bản mới hơn của Ubuntu, lệnh tương đương blkid -Lhiện đã có blkid -o list; các -Ltùy chọn đã được thay đổi -L labelđể tìm kiếm một thiết bị sử dụng nhãn chỉ định.
aculich

@aculich Tôi đã cập nhật câu trả lời để bao gồm cú pháp gần đây cho blkid. Cảm ơn đã đề cập đến nó.
Christopher Cashell

2
Tuyệt vời, tôi không bao giờ biết về blkid; Tôi đã luôn luôn hoàn thành ls -l /dev/disk/by-uuid. Trên Gentoo, blkidđang ởsys-apps/util-linux
Đô đốcNemo

10

Chỉ dành cho đĩa được phân vùng GPT

Trên đĩa được định dạng GPT, mỗi phân vùng được gán GUID, đây là một dạng của UUID, mặc dù có lẽ không phải là những gì người đăng ban đầu đã đề cập. Do đó, câu trả lời này có lẽ ít hữu ích hơn cho người hỏi ban đầu. Tuy nhiên, tôi tin rằng có một sự khác biệt quan trọng cần được chú ý.

Để nhận GUID của phân vùng 1 trên đĩa / dev / sda được định dạng GPT, cũng như nhãn phân vùng của nó, v.v.

sudo sgdisk -i 1 /dev/sda

hoặc tất cả với:

ls -l /dev/disk/by-partuuid

Để khởi động với thư mục gốc của hệ thống tệp nằm trên một phân vùng nhất định, bạn sẽ sử dụng cú pháp tham số kernel linux của:

root=PARTUUID=87654321-4321-4321-abcd-123456789012

Trong trường hợp này, bạn có thể chỉ định bắt đầu UUID - đủ để là duy nhất. Tham số này nguyên thủy hơn và có thể được hiểu bởi kernel trước đó trong quá trình khởi động của nó.


Có một sự khác biệt về ngữ nghĩa giữa những điều này:

Một đĩa chứa các phân vùng, một phân vùng chứa một hệ thống tệp, một hệ thống tệp chứa các thư mục và tệp. Đối với một số thiết lập và hệ điều hành có nhiều lớp hơn.

GUID UUID và nhãn liên quan đề cập đến một phân vùng, nhưng không phải là nội dung của phân vùng. Một phân vùng mới trên cùng một đĩa hoặc một phân vùng trên một đĩa mới sẽ có UIDID GUID mới. Phân vùng tương tự có thể chứa một hệ thống tệp một ngày và một hệ thống khác vào một ngày khác. Nó chỉ tồn tại cho các đĩa được định dạng GPT, nhưng không tồn tại cho các đĩa được phân vùng cũ. Thường không có nhiều tiện ích ở đây hơn là chỉ định root=/dev/sda1hoặc root=8:1.

Các câu trả lời hiện tại khác đề cập đến UUID của một hệ thống tệp trong một số phân vùng có chứa. Nếu toàn bộ hệ thống tệp được sao chép sang một phân vùng hoặc đĩa cứng khác thì giá trị đó vẫn giữ nguyên. UUID này hữu ích trong việc tìm kiếm một hệ thống tệp di chuyển. Do đó, điều này có lẽ phù hợp hơn với hầu hết mọi người. Tham số kernel Linux root=UUID=87654321-4321-4321-a567-123456789012đề cập đến điều này.

Tôi tin root=LABEL=root=UUID=được triển khai bởi không gian người dùng sớm, mã init mà tôi thấy vào ngày khác trên hệ thống của tôi đã dịch các tham số này thành / dev / đĩa / by-uuid và / dev / đĩa / by-nhãn (các liên kết tôi tin là do udev tạo ra không gian người dùng trên hệ thống của tôi).

[1] http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/init/do_mounts.c#n183


Cách sử dụng đúng dường như -i1hoặc -i 1trái ngược -i:1với sgdisk 1.0.1.
Charles Duffy

@CharlesDuffy cảm ơn vì đã tìm ra lỗi đó. Tôi đã chỉnh sửa câu trả lời để sửa nó.
John S Gruber

7

Cách làm sạch tập lệnh để thực hiện việc này trên bất kỳ loại hệ thống tập tin nào là:

lsblk -no UUID <device-containing-FS>

Hoặc, được đưa ra điểm gắn kết (hoặc bất kỳ tệp nào trong đó):

lsblk -no UUID $(df -P <file> | awk 'END{print $1}')

Đầu ra là UUID, toàn bộ UUID và không có gì ngoài UUID.


1
Nó tốt hơn blkidtrong câu trả lời từ @ christopher-cashell, vì bạn không cần phải trở thành root. Đối với một điểm gắn kết hoặc một tập tin tốt hơn làm : lsblk -no UUID $(findmnt -n -o SOURCE --target <file>).
marcz

@marcz Điều đó không thành công trên subvolume btrfs: findmnt -n -o SOURCE --target ~đưa ra:/dev/mapper/vg_svelte-home[/@home]
Tom Hale

Phải @ tom-hale, lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)nên thoát khỏi subvolume khi có mặt.
marcz

5

Cách dễ nhất để làm điều này cho ext2 / ext3 / ext4 là:

/sbin/tune2fs -l /dev/sda1

3
Điều này sẽ hoạt động với điều kiện hệ thống tập tin của bạn được định dạng là ext2, ext3 hoặc ext4. Hầu hết các hệ thống tập tin là một trong số đó nhưng không phải tất cả. Nó cũng sẽ không hoạt động cho các phân vùng trao đổi. Xem câu trả lời của tôi cho một cách phổ quát.
Hamish Downer

Điều này dẫn đến trường hợp của tôi thànhCouldn't find valid filesystem superblock.
Michel

3

Cách được đề xuất để làm điều này là làm

sudo vol_id -u /dev/sda2

Để biết thêm về cách sử dụng UUID, hãy xem bài viết này (từ trợ giúp của Ubuntu, nhưng nên hoạt động cho bất kỳ bản phân phối linux nào sử dụng UUID).

Như đã lưu ý trong các bình luận cho câu hỏi này, vol_id có thể không nằm trong đường dẫn của bạn. Trên ubfox, nó nằm trong / sbin nên ở trên sẽ hoạt động. Đối với fedora, nó dường như cần

sudo /lib/udev/vol_id -u /dev/sda2

Nếu các bản phân phối khác có vol_id ở những nơi khác thì hãy đăng bình luận và tôi sẽ thêm nó vào câu trả lời này.


Điều này không hoạt động trên máy tính xách tay Fedora 10 của tôi.
Eddie

Đây là một giải pháp tốt hơn nhiều so với của tôi. Eddie, vol_id nằm ở / lib / udev. mish, bạn có thể chỉnh sửa câu trả lời của bạn để tiền tố đường dẫn đầy đủ ở phía trước vol_id không? / lib / udev không có trong đường dẫn của root theo mặc định trên bất kỳ phân phối nào tôi biết.
Mihai Limbăşan

"/ lib / udev / vol_id / dev / sda2" dường như hoạt động. Rất ít người sẽ có / lib / udev trong con đường của họ.
Eddie

Trên máy tính Ubuntu của tôi có một liên kết tượng trưng từ /sbin/vol_idđến/lib/udev/vol_id
Brad Gilbert

4
vol_id đã bị loại bỏ khỏi Ubuntu kể từ Karmic (9.10) vì vậy không còn hữu ích hoặc có liên quan nữa. Nó đã trải qua rất nhiều mâu thuẫn để đến đó vì vol_id đã được xây dựng để thay thế blkid .
Alain O'Dea


2

Giả sử bạn muốn UUID cho sda1, bạn có thể thử một cái gì đó như thế này:

for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" | grep ../sda1 | cut -d\: -f2 | cut -d/ -f5 ; done

Điều chỉnh sda1 cho phù hợp. Để có được UUID cho tất cả các phân vùng, hãy bỏ các greps và cắt, a la:

for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" ; done

Đầu ra mẫu cho sda1 trên máy tính để bàn của tôi:

[mihailim@home ~]$ for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" | grep ../sdb3 | cut -d\: -f2 | cut -d/ -f5 ; done
dc8c49f1-e2dc-46bc-ba02-013f26c85f70

Chỉnh sửa: Xin lưu ý rằng giải pháp này, mặc dù được sử dụng nhiều hơn udev-> vol_id, không yêu cầu quyền root, sẽ hoạt động trên mọi kernel sau năm 2005 hoặc dựa trên các công cụ có trong bất kỳ bản phân phối Linux nào theo mặc định trong đường dẫn cho bất kỳ người dùng.


Điều này sẽ hoạt động trên bất kỳ máy tính nào chạy một devfs đủ gần đây.
Eddie

1

Bạn cũng có thể sử dụng điều này để in tất cả các UUID:

for disk in /dev/disk/by-uuid/*; do 
    basename "$(readlink "$disk")"
    basename "$disk"
    echo
done

hoặc lệnh đơn giản hơn được cho là này, thay thế sda1bằng thiết bị bạn muốn tìm kiếm:

disk=sda1
find /dev/disk/by-uuid -type l -exec sh -c "readlink {} | grep -o $disk && basename {}" \;

một sự thích ứng của phương pháp thứ hai để in tất cả các UUID:

find /dev/disk/by-uuid -type l -exec sh -c 'basename $(readlink {}); basename {}; echo' \;

1
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

Ở trên dường như hoạt động trên hầu hết (tất cả những gì tôi đã tìm thấy) các hệ thống Linux trong nhiều năm. Nó có thể có sai sót, tôi không biết. Tôi muốn lấy số sê-ri nhưng ... đây là UUID của hệ thống tập tin gốc.

Nếu bất cứ ai có cách lấy số sê-ri mà không cần phải root (như của tôi) và không cài đặt các gói "bất thường" khác nhau trong các phiên bản Unix khác nhau, tôi sẽ đánh giá cao - luôn có thể học được điều gì đó. Và tôi biết rằng tôi đang trộn lẫn mọi thứ - đó là hệ thống tập tin gốc UUID, không phải là đĩa.

Mục đích, BTW, là tạo ra một số duy nhất cho mỗi máy không thể sửa đổi (như số sê-ri đĩa và giống như địa chỉ MAC đã có từ lâu).

Nó được sử dụng để mã hóa phần mềm vào một máy duy nhất. Địa chỉ MAC vẫn ổn cho đến khi họ cho phép họ ảo ... một số khách hàng nhếch nhác chỉ đơn giản đặt địa chỉ MAC của họ thành một hằng số (tất nhiên trên các mạng khác nhau) và tránh trả tiền cho tôi.

Trong AIX có một cuộc gọi duy nhất để nhận một số nhận dạng máy. Không quan tâm nếu thay đổi phần cứng hoặc cập nhật phần mềm xảy ra nên tôi không biết họ làm thế nào ... Nếu bo mạch chủ thay đổi, thì số đó thay đổi, vì vậy tôi nghĩ rằng họ giấu nó ở đó. Và đó là vượt quá hiếm.


0

Bạn có thể sử dụng cách sau để lấy UUID cho một ổ đĩa cụ thể,

sudo vol_id -u /dev/sda1

hoặc bạn có thể sử dụng điều này để liệt kê tất cả các UUID cho phương tiện đính kèm,

ls /dev/disk/by-uuid

Không còn áp dụng kể từ Ubuntu 9.10 vì vol_id đã bị xóa.
Alain O'Dea
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.