Bagaimana cara menemukan UUID dari sistem file

133

Saya menjalankan Ubuntu, dan ingin mencari tahu UUIDtentang sistem file tertentu (bukan partisi). Saya tahu saya dapat menggunakan e2label /dev/sda1untuk mencari tahu label sistem file, tetapi sepertinya tidak ada cara yang mirip untuk menemukan UUID.

Brad Gilbert
sumber
Terima kasih atas semua jawabannya, saya yakin saya akan menggunakannya semuanya dalam keadaan yang berbeda.
Brad Gilbert
2
Perhatikan bahwa judul yang digunakan adalah "Bagaimana cara menemukan UUID partisi". Pertanyaan itu hanya masuk akal ketika menggunakan tabel partisi GPT. Inilah jawaban untuk pertanyaan itu .
Alastair Irvine

Jawaban:

164

Perintah lain yang mungkin tersedia dan juga berfungsi dengan baik untuk ini adalah 'blkid'. Itu bagian dari paket e2fsprogs. Contoh penggunaannya:

Cari data di / dev / sda1:

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

Tampilkan data UUID untuk semua partisi:

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

Tampilkan data UUID untuk semua partisi dalam format yang lebih mudah dibaca: (Catatan: dalam rilis yang lebih baru, blkid -Lmemiliki arti yang berbeda, dan blkid -o listharus digunakan sebagai gantinya)

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

Tampilkan hanya UUID untuk / dev / sda1 dan tidak ada yang lain:

topher@crucible:~$ sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda
Christopher Cashell
sumber
1
Di komputer Ubuntu saya, saya tidak perlu menggunakan sudo.
Brad Gilbert
Hanya mengetik blkid, mendapatkan apa yang saya inginkan, tetapi tidak cukup dengan apa yang saya minta. (Saya tetap menerimanya, karena saya yakin saya akan sering menggunakannya)
Brad Gilbert
3
Pada versi Ubuntu yang lebih baru, perintah yang setara untuk blkid -Lsekarang adalah blkid -o list; yang -Lpilihan telah diubah untuk -L labeluntuk mencari perangkat yang menggunakan label tertentu.
aculich
@aculich Saya telah memperbarui jawaban untuk menyertakan sintaks terbaru untuk blkid. Terima kasih telah menyebutkannya.
Christopher Cashell
2
Luar biasa, saya tidak pernah tahu blkid; Saya selalu baru saja selesai ls -l /dev/disk/by-uuid. Di Gentoo, blkidada disys-apps/util-linux
AdmiralNemo
10

Hanya Untuk GPT Partitioned Disk

Pada disk yang diformat GPT setiap partisi diberi GUID, yang merupakan bentuk UUID, meskipun mungkin bukan apa yang dimaksud oleh poster asli. Karena itu jawaban ini mungkin kurang membantu bagi penanya yang asli. Meskipun demikian saya percaya ada perbedaan penting yang harus diperhatikan.

Untuk mendapatkan GUID partisi 1 pada disk / dev / sda yang diformat GPT, serta label partisi dan sebagainya:

sudo sgdisk -i 1 /dev/sda

atau semua dengan:

ls -l /dev/disk/by-partuuid

Untuk mem-boot dengan root dari sistem file yang berada di partisi tertentu Anda akan menggunakan sintaks parameter kernel linux dari:

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

Dalam hal ini Anda dapat menentukan hanya awal UUID - cukup unik. Parameter ini lebih primitif dan dapat dipahami oleh kernel sebelumnya dalam proses bootnya.


Ada perbedaan dalam semantik antara ini:

Disk memegang partisi, partisi memegang sistem file, sistem file menyimpan direktori dan file. Untuk beberapa pengaturan dan sistem operasi ada lebih banyak lapisan.

GUID UUID dan label terkait merujuk ke partisi, tetapi bukan konten partisi. Partisi baru pada disk yang sama, atau partisi pada disk baru akan memiliki GUID UUID baru. Partisi yang sama dapat menampung satu sistem file satu hari dan yang lain pada hari yang berbeda. Ini hanya ada untuk disk yang diformat GPT, tetapi tidak untuk disk yang dipartisi sebelumnya. Biasanya tidak ada utilitas di sini selain dari menentukan root=/dev/sda1atau root=8:1.

Jawaban lain saat ini merujuk pada UUID sistem file di beberapa partisi yang berisi. Jika sistem file disalin, secara keseluruhan, ke partisi atau hard disk lain, nilainya tetap sama. UUID ini bermanfaat untuk menemukan sistem file yang dipindahkan. Karena itu, ini mungkin lebih relevan bagi kebanyakan orang. Parameter kernel Linux root=UUID=87654321-4321-4321-a567-123456789012mengacu pada ini.

Saya percaya root=LABEL=dan root=UUID=diterapkan oleh userspace awal, kode init yang saya lihat kemarin di sistem saya menerjemahkan parameter-parameter ini ke / dev / disk / by-uuid dan / dev / disk / oleh-label (tautan yang saya percaya dibuat oleh udev di userspace di sistem saya).

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

John S Gruber
sumber
Penggunaan yang benar tampaknya -i1atau -i 1, sebagai lawan dari -i:1, dengan sgdisk 1.0.1.
Charles Duffy
@CharlesDuffy terima kasih telah menemukan kesalahan itu. Saya telah mengedit jawaban untuk memperbaikinya.
John S Gruber
7

Cara bersih-skrip untuk melakukan ini yang bekerja pada semua jenis filesystem adalah:

lsblk -no UUID <device-containing-FS>

Atau, mengingat titik mount (atau file apa pun di dalamnya):

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

Outputnya adalah UUID, seluruh UUID, dan tidak lain adalah UUID.

Tom Hale
sumber
1
Ini lebih baik daripada blkiddalam jawaban dari @ christopher-cashell, karena Anda tidak perlu menjadi root. Untuk mount point atau file berbuat lebih baik: lsblk -no UUID $(findmnt -n -o SOURCE --target <file>).
marcz
@marcz Itu gagal pada subvolume btrfs: findmnt -n -o SOURCE --target ~memberikan:/dev/mapper/vg_svelte-home[/@home]
Tom Hale
Right @ tom-hale, lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)harus menyingkirkan subvolume saat ada.
marcz
5

Cara termudah untuk melakukan ini untuk ext2 / ext3 / ext4 adalah:

/sbin/tune2fs -l /dev/sda1
Eddie
sumber
3
Ini akan berfungsi asalkan filesystem Anda diformat sebagai ext2, ext3 atau ext4. Sebagian besar filesystem adalah salah satunya tetapi tidak semua. Ini juga tidak akan berfungsi untuk partisi swap. Lihat jawaban saya untuk cara universal.
Hamish Downer
Ini menghasilkan kasus saya menjadiCouldn't find valid filesystem superblock.
Michel
3

Cara yang disarankan untuk melakukan ini adalah melakukan

sudo vol_id -u /dev/sda2

Untuk lebih lanjut tentang penggunaan UUID, lihat artikel ini (dari bantuan ubuntu, tetapi harus berfungsi untuk distro linux apa pun yang menggunakan UUID).

Seperti tercantum dalam komentar untuk pertanyaan ini, vol_id mungkin tidak ada di jalur Anda. Di ubuntu ia berada di / sbin sehingga hal di atas akan berfungsi. Untuk fedora tampaknya perlu

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

Jika distribusi lain memiliki vol_id di tempat lain maka poskan komentar dan saya akan menambahkannya ke jawaban ini.

Hamish Downer
sumber
Ini tidak berfungsi pada laptop Fedora 10 saya.
Eddie
Ini adalah solusi yang jauh lebih baik daripada milik saya. Eddie, vol_id terletak di / lib / udev. mish, bisakah Anda mengedit jawaban Anda untuk mengawali path lengkap di depan vol_id? / lib / udev secara default tidak ada di jalur root pada distribusi apa pun yang saya ketahui.
Mihai Limbăşan
"/ lib / udev / vol_id / dev / sda2" tampaknya berfungsi. Hanya sedikit orang yang memiliki / lib / udev di jalurnya.
Eddie
Di komputer Ubuntu saya ada link simbolis dari /sbin/vol_idke/lib/udev/vol_id
Brad Gilbert
4
vol_id telah dihapus dari Ubuntu pada Karmic (9,10) jadi tidak berguna atau relevan lagi. Itu melewati banyak contortions untuk sampai ke sana karena vol_id pada satu titik dibangun untuk menggantikan blkid .
Alain O'Dea
3

Ini sepertinya bekerja untuk saya:

sudo dumpe2fs /dev/sda1 | grep UUID
Marcus Junius Brutus
sumber
2

Dengan asumsi Anda menginginkan UUID untuk sda1, Anda dapat mencoba sesuatu seperti ini:

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

Sesuaikan sda1 sesuai. Untuk mendapatkan UUID untuk semua partisi, jatuhkan greps dan cut, a la:

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

Contoh output untuk sda1 di desktop saya:

[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

Sunting: Harap dicatat bahwa solusi ini, walaupun lebih dibikin daripada udev-> vol_id, tidak memerlukan hak akses root, akan bekerja pada kernel pasca-2005 atau lebih, dan bergantung pada alat yang ada dalam distribusi Linux yang secara default di jalur untuk setiap pengguna.

Mihai Limbăşan
sumber
Ini akan bekerja pada komputer mana pun yang menjalankan devf yang cukup baru.
Eddie
1

Anda juga dapat menggunakan ini untuk mencetak semua UUID:

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

atau perintah yang bisa dibilang lebih sederhana ini, ganti sda1dengan perangkat yang ingin Anda cari:

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

adaptasi dari metode kedua untuk mencetak semua UUID:

find /dev/disk/by-uuid -type l -exec sh -c 'basename $(readlink {}); basename {}; echo' \;
kiri
sumber
1
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

Di atas tampaknya berfungsi pada sebagian besar (semua yang saya temukan) sistem Linux selama bertahun-tahun. Mungkin ada kekurangan, saya tidak tahu. Saya lebih suka mendapatkan nomor seri tetapi ... ini adalah UUID dari sistem berkas root.

Jika ada yang punya cara untuk mendapatkan nomor seri tanpa perlu menjadi root (seperti milik saya) dan tidak menginstal paket "tidak biasa" yang berbeda dalam versi Unix yang berbeda, saya akan sangat menghargainya - selalu dapat belajar sesuatu. Dan saya sadar saya mencampur hal-hal - itu adalah sistem file root UUID, bukan disk.

Tujuannya, BTW, adalah untuk menghasilkan nomor unik per mesin yang tidak dapat dimodifikasi (seperti nomor seri disk dan seperti alamat MAC dulu dahulu).

Ini digunakan untuk pengkodean perangkat lunak ke satu mesin. Alamat MAC baik-baik saja sampai mereka mengizinkannya menjadi virtual ... beberapa pelanggan busuk hanya mengatur alamat MAC mereka menjadi konstan (pada jaringan yang berbeda tentu saja) dan menghindari membayar saya.

Di AIX ada satu panggilan untuk mendapatkan satu nomor yang mengidentifikasi mesin. Tidak masalah jika perubahan perangkat keras atau pembaruan perangkat lunak terjadi sehingga saya tidak tahu bagaimana mereka melakukannya ... Jika motherboard berubah, maka angkanya berubah, jadi saya pikir mereka menyembunyikannya di sana. Dan itu sangat jarang.

Eric Eberhard
sumber
0

Anda dapat menggunakan yang berikut ini untuk mendapatkan UUID untuk drive tertentu,

sudo vol_id -u /dev/sda1

atau Anda dapat menggunakan ini untuk mendaftar semua UUID untuk media yang dilampirkan,

ls /dev/disk/by-uuid
Adams kaya
sumber
Tidak lagi berlaku pada Ubuntu 9,10 karena vol_id telah dihapus.
Alain O'Dea