it-swarm-vi.tech

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

Tôi đang chạy Ubuntu và muốn tìm hiểu UUID của một hệ thống tệp 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.

135
Brad Gilbert

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:

[email protected]:~$ 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:

[email protected]:~$ 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 -L có nghĩa khác và blkid -o list nên được sử dụng thay thế)

[email protected]:~$ 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:

[email protected]:~$ Sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda
169
Christopher Cashell

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 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ú ý.

Để lấy GUID của phân vùng 1 trên đĩa được định dạng GPT/dev/sda, 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 được liên kết đề cập đến một phân vùng, nhưng không phải 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 phân vùng trên một đĩa mới sẽ có GUID UUID. Cùng một phân vùng 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 dành cho các đĩa được phân vùng kế thừa. Ở đây thường không có nhiều tiện ích hơn ngoài việc chỉ định root=/dev/sda1 hoặc là root=8:1.

Các câu trả lời hiện tại khác đề cập đến UUID của a 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ố nhân 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 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 trong 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#n18

11
John S Gruber

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.

8
Tom Hale

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

/sbin/tune2fs -l /dev/sda1
5
Eddie

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 Ubuntu, 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.

3
Hamish Downer

Điều này dường như làm việc cho tôi:

Sudo dumpe2fs /dev/sda1 | grep UUID
3
Marcus Junius Brutus

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:

[[email protected] ~]$ 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 so với udev-> vol_id, nhưng 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ỳ kernel nào Phân phối Linux theo mặc định trong đường dẫn cho bất kỳ người dùng nào.

2
Mihai Limbăşan

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 này, thay thế sda1 với 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
kiri
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 nó - 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.

1
Eric Eberhard

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
0
Rich Adams