Nhận UUID của / filesystem từ tập lệnh


11

Làm cách nào tôi có thể nhận được UUID của một ổ chứa /hệ thống tập tin? Điều tốt nhất mà tôi tìm thấy cho đến nay là blkid -o list. Nhưng đầu ra này là con người có thể đọc và khó phân tích. Có lẽ có một cách tốt hơn?

Tôi cần điều đó để tham số hóa quản lý cấu hình với các mẫu dành riêng cho hệ thống.

LƯU Ý về blkidgotcha cho những người có thể sử dụng lại kết quả câu hỏi của tôi trong tương lai: blkidlưu trữ kết quả của các lần chạy trước tại /etc/blkid.tab. Điều đó có nghĩa là blkidlần đầu tiên chạy như người dùng không phải là root sẽ không trả về bất kỳ dữ liệu nào. Ngoài ra, chạy blkidnhư người dùng không root sau khi chạy root sẽ trả về dữ liệu cũ (có thể không chính xác).


Trên các hệ thống của riêng tôi, tôi gán nhãn duy nhất có thể đọc được của con người cho tất cả các phân vùng. Sau đó, tôi có thể tìm ra hầu hết mọi thứ về họ bằng cách sử dụng nhãn của họ và /dev/disk/by-label... Điều này cũng hoạt động đối với các phân vùng không được gắn kết. Nó có lợi thế là có thể viết các tập lệnh thực hiện những việc như rsync từ root đến root-bak, ít bị lỗi hơn nhiều so với sử dụng 2 UUIDS không "có nghĩa" gì cả.
Joe

Câu trả lời:


25

Sử dụng findmnt:

$ findmnt /        
TARGET SOURCE       FSTYPE OPTIONS
/      /dev/md127p1 ext4   rw,relatime,stripe=256,data=ordered
$ findmnt / -o UUID
UUID
046a554b-d9f5-4b23-82e6-ffaeb98284aa
$ findmnt / -o UUID -n
046a554b-d9f5-4b23-82e6-ffaeb98284aa

Nó cũng có một số tùy chọn để kiểm soát cách nó tìm kiếm thông tin và cách trình bày thông tin đó (bao gồm cả đầu ra JSON!). Đây là một phần của mountgói, vì vậy có sẵn trên mọi cài đặt Ubuntu.


Điều này hoạt động tuyệt vời vào ngày 16.04. Nó không hoạt động cho tôi vào ngày 14.04. Tôi đã phải sử dụng phương pháp này để có được kết quả mong muốn về sự tin cậy.
Anh Cả Geek

11

Giải pháp khác:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n ngăn chặn tiêu đề (không thực sự cần thiết, nhưng an toàn hơn để phân tích cú pháp)
  • -r làm cho đầu ra thô (làm cho nó an toàn hơn để phân tích cú pháp)
  • -o UUID,MOUNTPOINT chỉ bao gồm thông tin cần thiết

5

Bạn có thể sử dụng lsblklệnh để xuất UUID, nhưng bạn cần tên thiết bị của phân vùng (chẳng hạn như / dev / sda2). Bạn có thể có được điều này bằng cách sử dụng dflệnh và cắt đầu ra. Sử dụng thay thế lệnh để đặt tên thiết bị cho lsblk. Có vẻ như bạn cần sudo để truy cập UUID, mặc dù đầu ra bình thường của lsblk không yêu cầu:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"

2
Điều này làm việc cho tôi mà không có sudongày 16.04.
Eliah Kagan

chỉ khi bạn (hoặc một số tập lệnh) đã từng chạy lệnh này với quyền root trước đó. Ngoài ra, thông số có thể cũ (từ bộ đệm) trong trường hợp này
Dmitriusan

@Dmitriusan Tôi đã chạy cái này trên hệ thống 14.04 chưa bao giờ có lsblkhoặc blkidchạy bằng root và nó hoạt động hoàn hảo. Bạn có biết tại sao sẽ có vấn đề về bộ nhớ đệm với lệnh này mà không phải với phiên bản được đăng bởi Rovo không? Liệu đầu ra thô phá vỡ bộ nhớ đệm theo một cách nào đó?
Arronical

Tôi nghĩ rằng bất kỳ lệnh nào truy cập UUID của thiết bị sẽ yêu cầu quyền truy cập root (bao gồm cả phiên bản được đăng bởi Rovo). Về lsblk, đây là một câu hỏi liên quan unix.stackexchange.com/questions/210889/ (xem câu trả lời đầu tiên)
Dmitriusan

Tôi đồng ý rằng sudo là cần thiết, nhưng không thể tìm thấy bất cứ điều gì để đề xuất rằng lsblk dựa vào bộ nhớ đệm. Ngay cả khi tôi chạy blkidbằng root, tạo tệp bộ đệm tại /dev/.blkid.tab, việc sử dụng không sudo lsblksẽ không hiển thị bất cứ điều gì từ cột UUID. Tôi không nghĩ rằng có nguy cơ đầu ra cũ.
Arronical

4

Giải pháp tốt nhất tôi quản lý để đưa ra là

blkid -o list | awk '/\/[[:space:]]+/{ print $0 }' | tr -s ' ' | cut -d ' ' -f 4

Cảm thấy như không tối ưu, nhưng hoạt động.

Lưu ý: [[: dấu cách:]] có nghĩa làSpace


Điều này làm việc cho tôi nhưng với sudo.
pa4080

4

Điều chỉnh giá trị của mountpointđiểm gắn kết hiện tại của hệ thống tệp được đề cập:

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'

1

Đây là những gì tôi sử dụng:

sudo tune2fs -l $(df  / | tail -1 |awk '{print $1}') |grep UUID|awk '{ print $3 }'

Tune2fs nằm trong gói e2fspross, mà tôi không thể nhớ nếu nó được cài đặt theo mặc định.

sudo apt install e2fsprogs

nếu nó không được cài đặt.


Tôi nhận được awk: not an option: -etôi đã chỉnh sửa câu trả lời của bạn để làm cho nó hoạt động. Nếu tôi đã vượt qua, xin vui lòng cuộn lại. Chúc mừng! :-)
Anh Cả Geek

Thật kỳ lạ, nó dường như hoạt động với hoặc không có -e cho tôi. -e được ghi lại trong trang man cho awk. Tôi đã luôn sử dụng nó trong các kịch bản và tôi đã ngạc nhiên khi nó hoạt động tốt mà không có nó :) Tôi nghĩ rằng - đó là một thói quen UNIX cũ. Nhưng, đáng lẽ tôi nên nhất quán trong cách sử dụng và sử dụng -e ở cả hai nơi hoặc không phải nơi nào để không gây nhầm lẫn cho mọi người.
Giăng

Ah, tôi nhận được kết quả giống như bạn dưới 14.04 gawk. Tôi nhận được lỗi được chỉ định theo 16.04 có vẻ như sẽ sử dụng mawkthay thế.
Anh Cả Geek

Đó là một trong những điều / etc / thay thế. / etc / thay thế / awk -> / usr / bin / gawk cho tôi vào ngày 16.04. Mawk được cài đặt, nhưng không hoạt động trong / etc / thay thế. Trên gnome 17.04 của tôi, nó chỉ ra awk. Trên bản cài đặt mới 17.10 của tôi, đó là mawk. Sau khi cài đặt gawk các điểm liên kết đến gawk, gỡ cài đặt gawk trả nó về mawk.
Giăng

:-) Chính những khác biệt nhỏ giữa các chương trình được cho là tương tự có khả năng dẫn đến những tuyên bố như "Ít hơn là nhiều hơn"
Elder Geek

1

Đã thử nghiệm để làm việc vào ngày 14.04 và 16.04

Một lớp lót đơn giản luôn tạo ra UUID của gốc /

xuất DRIVE = $ (mount | grep '/' | awk -F "trên" '{in $ 1}'); blkid $ DRIVE | cắt -d '"' -f2`

Những gì chúng ta đang làm ở đây là lấy đầu ra của mount để khớp với biểu tượng gốc với các khoảng trắng ở hai bên /để tránh khớp khi /được sử dụng làm biểu tượng mở rộng đường dẫn, awksử dụng "bật" làm dấu tách trường để chỉ xuất ra tên thiết bị và gán THAT cho biến môi trường $ DRIVE, sau đó sử dụng đầu ra của blkid $DRIVEđường ống được cắt bằng cách sử dụng "như một dấu tách trường và chỉ chọn trường thứ hai loại bỏ mọi thứ khác, chỉ để lại UUID.

Lưu ý rằng những gì thuộc về grep trong lệnh trên thực sự là ' space/ space' chứ không phải '/' như nó xuất hiện.

Điều này có lợi ích là không yêu cầu sudovà sẽ trả về kết quả phù hợp bất kể ổ đĩa được gắn như thế nào.

Sẽ là khôn ngoan khi đảm bảo rằng bạn không sử dụng biến môi trường $ DRIVE cho bất kỳ điều gì khác trước khi thử phương pháp echo $DRIVEnày sẽ trả về dòng trống nếu bạn không sử dụng biến.

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.