ฉันจะค้นหา UUID ของระบบไฟล์ได้อย่างไร


133

ฉันใช้งาน Ubuntu และต้องการค้นหาUUIDระบบไฟล์เฉพาะ (ไม่ใช่พาร์ติชัน) ฉันรู้ว่าฉันสามารถใช้e2label /dev/sda1เพื่อหาฉลากระบบแฟ้ม UUIDแต่มีไม่ดูเหมือนจะเป็นวิธีที่คล้ายกันเพื่อหาสิ่งที่


ขอบคุณสำหรับคำตอบทั้งหมดฉันแน่ใจว่าฉันจะใช้พวกเขาทั้งหมดในสถานการณ์ที่แตกต่างกัน
แบรดกิลเบิร์

2
โปรดทราบว่าชื่อนั้นเคยเป็น "ฉันจะค้นหา UUID ของพาร์ติชัน" ได้อย่างไร คำถามนั้นสมเหตุสมผลเมื่อใช้ตารางพาร์ติชัน GPT นี่คือคำตอบสำหรับคำถามนั้น
Alastair Irvine

คำตอบ:


164

คำสั่งอื่นที่อาจพร้อมใช้งานและยังทำงานได้ค่อนข้างดีสำหรับสิ่งนี้คือ 'blkid' มันเป็นส่วนหนึ่งของแพ็คเกจ e2fsprogs ตัวอย่างของการใช้งาน:

ค้นหาข้อมูลบน / dev / sda1:

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

แสดงข้อมูล UUID สำหรับพาร์ติชันทั้งหมด:

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

แสดงข้อมูล UUID สำหรับพาร์ติชันทั้งหมดในรูปแบบที่อ่านง่ายกว่า: (หมายเหตุ: ในรีลีสที่ใหม่กว่าblkid -Lมีความหมายต่างกันและblkid -o listควรใช้แทน)

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

แสดงเพียง UUID สำหรับ / dev / sda1 และไม่มีอะไรอื่น:

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

1
บนคอมพิวเตอร์ Ubuntu ฉันไม่จำเป็นต้องใช้ sudo
แบรดกิลเบิร์

แค่พิมพ์blkidให้ฉันได้ตามที่ฉันต้องการ แต่ไม่ใช่สิ่งที่ฉันขอ (ฉันยอมรับมันอยู่แล้วเพราะผมมั่นใจว่าผมจะใช้มันบ่อย)
แบรดกิลเบิร์

3
ในรุ่นใหม่ของ Ubuntu คำสั่งเทียบเท่าblkid -Lคือตอนนี้blkid -o list; -Lตัวเลือกที่ได้รับการเปลี่ยน-L labelการมองหาอุปกรณ์ที่ใช้ฉลากที่ระบุ
aculich

@aculich blkidผมได้ปรับปรุงคำตอบรวมถึงไวยากรณ์ที่ผ่านมาสำหรับ ขอบคุณที่พูดถึงมัน
Christopher Cashell

2
ยอดเยี่ยมฉันไม่เคยรู้เกี่ยวกับblkid; ฉันเพิ่งทำls -l /dev/disk/by-uuidไป ใน Gentoo blkidอยู่ในsys-apps/util-linux
AdmiralNemo

10

สำหรับดิสก์พาร์ติชัน GPT เท่านั้น

บนดิสก์ที่จัดรูปแบบ GPT แต่ละพาร์ติชันจะได้รับ GUID ซึ่งเป็นรูปแบบของ UUID แม้ว่าอาจไม่ใช่สิ่งที่โปสเตอร์ดั้งเดิมอ้างถึง ดังนั้นคำตอบนี้อาจเป็นประโยชน์น้อยกว่าผู้ถามเดิม อย่างไรก็ตามฉันเชื่อว่ามีความแตกต่างที่สำคัญที่จะสังเกตเห็น

ในการรับ GUID ของพาร์ติชัน 1 บนดิสก์ที่จัดรูปแบบ GPT / dev / sda รวมถึงฉลากพาร์ติชันและอื่น ๆ :

sudo sgdisk -i 1 /dev/sda

หรือทั้งหมดที่มี:

ls -l /dev/disk/by-partuuid

ในการบูตด้วยรูทของระบบไฟล์ที่อยู่ในพาร์ติชั่นบางตัวคุณจะต้องใช้ไวยากรณ์ของพารามิเตอร์ linux kernel ของ:

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

ในกรณีนี้คุณสามารถระบุเพียงจุดเริ่มต้นของ UUID - เพียงพอที่จะไม่ซ้ำกัน พารามิเตอร์นี้ดั้งเดิมมากขึ้นและสามารถเข้าใจได้โดยเคอร์เนลก่อนหน้านี้ในกระบวนการบูต


มีความแตกต่างในความหมายระหว่างสิ่งเหล่านี้:

ดิสก์เก็บพาร์ติชันพาร์ติชันเก็บระบบไฟล์ระบบไฟล์เก็บไดเรกทอรีและไฟล์ สำหรับการติดตั้งและระบบปฏิบัติการมีเลเยอร์มากขึ้น

GUID UUID และเลเบลที่เกี่ยวข้องอ้างถึงพาร์ติชัน แต่ไม่ใช่เนื้อหาของพาร์ติชัน พาร์ติชันใหม่บนดิสก์เดียวกันหรือพาร์ติชันบนดิสก์ใหม่จะมี GUID UUID ใหม่ พาร์ติชันเดียวกันอาจมีระบบไฟล์หนึ่งวันในวันอื่น มีอยู่สำหรับดิสก์ที่จัดรูปแบบ GPT เท่านั้น แต่ไม่ใช่สำหรับดิสก์ที่แบ่งพาร์ติชันแบบดั้งเดิม มักจะมีไม่มีสาธารณูปโภคเพิ่มเติมได้ที่นี่กว่าที่ระบุหรือroot=/dev/sda1root=8:1

คำตอบปัจจุบันอื่น ๆ อ้างถึง UUID ของระบบไฟล์ในบางพาร์ติชันที่มี หากระบบไฟล์ถูกคัดลอกไปยังพาร์ติชันหรือฮาร์ดดิสก์อื่นโดยที่ค่านั้นยังคงเหมือนเดิม UUID นี้มีประโยชน์ในการค้นหาระบบไฟล์ที่ถูกย้าย ดังนั้นนี่อาจเกี่ยวข้องกับคนส่วนใหญ่ พารามิเตอร์เคอร์เนล Linux root=UUID=87654321-4321-4321-a567-123456789012อ้างถึงสิ่งนี้

ฉันเชื่อroot=LABEL=และroot=UUID=ดำเนินการโดย userspace เริ่มต้นรหัส init ที่ฉันเห็นเมื่อวันก่อนในระบบของฉันแปลพารามิเตอร์เหล่านี้เป็น / dev / disk / by-uuid และ / dev / disk / by-label (ลิงก์ที่ฉันเชื่อว่าสร้างโดย udev ใน userspace บนระบบของฉัน)

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


การใช้งานที่ถูกต้องนั้นดูเหมือนจะเป็น-i1หรือ-i 1ตรงข้าม-i:1กับ sgdisk 1.0.1
Charles Duffy

@CharlesDuffy ขอบคุณสำหรับการค้นหาข้อผิดพลาดนั้น ฉันได้แก้ไขคำตอบเพื่อแก้ไข
John S Gruber

7

วิธีทำความสะอาดสคริปต์ในการทำสิ่งนี้ซึ่งทำงานกับระบบไฟล์ทุกประเภทคือ:

lsblk -no UUID <device-containing-FS>

หรือรับ mountpoint (หรือไฟล์ใด ๆ ที่อยู่ภายใน):

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

ผลลัพธ์คือ UUID, UUID ทั้งหมดและไม่มีอะไรนอกจาก UUID


1
ดีกว่าblkidคำตอบจาก @ christopher-cashell เพราะคุณไม่จำเป็นต้องกลายเป็นรูต lsblk -no UUID $(findmnt -n -o SOURCE --target <file>)สำหรับจุดเชื่อมต่อหรือไฟล์ที่ดีกว่าทำ:
marcz

@marcz ที่ล้มเหลวใน bvfs subvolumes: findmnt -n -o SOURCE --target ~ให้:/dev/mapper/vg_svelte-home[/@home]
Tom Hale

Right @ tom-hale lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)ควรกำจัด subvolume เมื่อมีอยู่
marcz

5

วิธีที่ง่ายที่สุดสำหรับ ext2 / ext3 / ext4 คือ:

/sbin/tune2fs -l /dev/sda1

3
สิ่งนี้จะทำงานหากระบบไฟล์ของคุณมีรูปแบบเป็น ext2, ext3 หรือ ext4 ระบบไฟล์ส่วนใหญ่เป็นหนึ่งในสิ่งเหล่านี้ แต่ไม่ทั้งหมด มันจะไม่ทำงานสำหรับการสลับพาร์ติชัน ดูคำตอบของฉันสำหรับวิธีสากล
Hamish Downer

ซึ่งส่งผลให้ในกรณีของฉันเป็นCouldn't find valid filesystem superblock.
มิเชล

3

วิธีที่แนะนำให้ทำคือทำ

sudo vol_id -u /dev/sda2

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ UUID ดูบทความนี้ (จากวิธีใช้ ubuntu แต่ควรใช้กับลินุกซ์ distro โดยใช้ UUIDs)

ดังที่ระบุไว้ในความคิดเห็นสำหรับคำถามนี้ vol_id อาจไม่อยู่ในเส้นทางของคุณ บน Ubuntu มันอยู่ใน / sbin ดังนั้นข้างต้นจะได้ผล สำหรับ fedora ดูเหมือนว่าต้องการ

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

หากการแจกแจงอื่นมี vol_id ในที่อื่นให้โพสต์ความคิดเห็นและฉันจะเพิ่มในคำตอบนี้


สิ่งนี้ใช้ไม่ได้กับแล็ปท็อป Fedora 10 ของฉัน
Eddie

นี่เป็นทางออกที่ดีกว่าของฉันมาก Eddie, vol_id ตั้งอยู่ใน / lib / udev ผิดพลาดคุณสามารถแก้ไขคำตอบของคุณเพื่อนำหน้าเส้นทางแบบเต็มหน้า vol_id ได้หรือไม่? / lib / udev ไม่ได้อยู่ในเส้นทางของรูทโดยค่าเริ่มต้นจากการแจกจ่ายใด ๆ ที่ฉันรู้
Mihai Limbăşan

"/ lib / udev / vol_id / dev / sda2" ปรากฏขึ้นเพื่อใช้งานได้ ไม่กี่คนที่จะมี / lib / udev ในเส้นทางของพวกเขา
Eddie

บนคอมพิวเตอร์อูบุนตูของฉันมีการเชื่อมโยงสัญลักษณ์จาก/sbin/vol_idไป/lib/udev/vol_id
แบรดกิลเบิร์

4
vol_idถูกปล่อยจาก Ubuntu ตั้งแต่ Karmic (9.10) ดังนั้นจึงไม่มีประโยชน์หรือเกี่ยวข้องอีกต่อไป มันผ่านการคัดค้านมากมายเพื่อไปที่นั่นเนื่องจากvol_idอยู่ที่จุดหนึ่งที่สร้างขึ้นเพื่อแทนที่blkid
Alain O'Dea


2

สมมติว่าคุณต้องการ UUID สำหรับ sda1 คุณสามารถลองดังนี้:

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

ปรับ sda1 ตามลำดับ ในการรับ UUID สำหรับพาร์ติชันทั้งหมดให้วาง greps and บาดแผล a:

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

ตัวอย่างเอาต์พุตสำหรับ sda1 บนเดสก์ท็อปของฉัน:

[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

แก้ไข: โปรดทราบว่าโซลูชันนี้ในขณะที่มีการวางแผนมากกว่า udev-> vol_id ไม่ต้องการสิทธิ์รูทจะทำงานกับเคอร์เนลหลังปี 2005 หรือมากกว่านั้นและอาศัยเครื่องมือที่มีอยู่ในการกระจาย Linux ใด ๆ ซึ่งเป็นค่าเริ่มต้นใน เส้นทางสำหรับผู้ใช้ใด ๆ


สิ่งนี้จะใช้ได้กับคอมพิวเตอร์ทุกเครื่องที่ใช้งาน devfs มากพอ
Eddie

1

คุณสามารถใช้สิ่งนี้เพื่อพิมพ์ UUID ทั้งหมด:

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

หรือคำสั่งที่ง่ายกว่านี้โดยแทนที่sda1ด้วยอุปกรณ์ที่คุณต้องการค้นหา:

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

การปรับวิธีที่สองเพื่อพิมพ์ 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}'

ข้างต้นดูเหมือนว่าจะทำงานบนระบบ Linux ส่วนใหญ่ (ทั้งหมดที่ฉันได้พบ) ในช่วงหลายปีที่ผ่านมา มันอาจมีข้อบกพร่องฉันไม่รู้ ฉันต้องการรับหมายเลขซีเรียล แต่ ... นี่คือ UUID ของระบบไฟล์รูท

หากใครมีวิธีรับหมายเลขซีเรียลโดยไม่จำเป็นต้องเป็นรูท (เหมือนของฉัน) และไม่ติดตั้งแพ็คเกจ "ผิดปกติ" ที่แตกต่างกันใน Unix เวอร์ชันต่าง ๆ ฉันจะขอบคุณมัน - สามารถเรียนรู้บางสิ่งได้เสมอ และฉันรู้ว่าฉันกำลังผสมสิ่งต่าง ๆ - นี่คือระบบไฟล์รูท UUID ไม่ใช่ดิสก์

วัตถุประสงค์ BTW คือการสร้างหมายเลขเฉพาะต่อเครื่องที่ไม่สามารถแก้ไขได้ (เช่นหมายเลขซีเรียลดิสก์และเช่นเดียวกับที่อยู่ MAC เมื่อนานมาแล้ว)

มันใช้สำหรับการเข้ารหัสของซอฟต์แวร์ไปยังเครื่องเดียว ที่อยู่ MAC นั้นใช้ได้จนกว่าพวกเขาจะอนุญาตให้เป็นเสมือน ... ลูกค้าที่ไม่น่าไว้วางใจบางคนได้ตั้งที่อยู่ MAC ของพวกเขาเป็นค่าคงที่ (บนเครือข่ายที่แตกต่างกันของหลักสูตร) ​​และหลีกเลี่ยงการจ่ายเงินให้ฉัน

ใน AIX มีการเรียกเพียงครั้งเดียวเพื่อรับหนึ่งหมายเลขที่ระบุเครื่อง มันไม่สนใจว่าการเปลี่ยนแปลงฮาร์ดแวร์หรือการอัพเดตซอฟต์แวร์จะเกิดขึ้นหรือไม่ดังนั้นฉันจึงไม่รู้ว่าจะทำอย่างไร ... หากแผงวงจรหลักเปลี่ยนไปจำนวนนั้นจะเปลี่ยนดังนั้นฉันคิดว่าพวกเขาซ่อนมันไว้ที่นั่น และนั่นเป็นสิ่งที่หายาก


0

คุณสามารถใช้สิ่งต่อไปนี้เพื่อรับ UUID สำหรับไดรฟ์หนึ่ง ๆ

sudo vol_id -u /dev/sda1

หรือคุณสามารถใช้สิ่งนี้เพื่อแสดงรายการ UUID ทั้งหมดสำหรับสื่อที่แนบมา

ls /dev/disk/by-uuid

ไม่สามารถใช้งานได้อีกต่อไปตั้งแต่ Ubuntu 9.10 เนื่องจากvol_idถูกลบแล้ว
Alain O'Dea
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.