Dapatkan UUID of / filesystem dari skrip

11

Bagaimana saya bisa mendapatkan UUID volume yang berisi sistem /file? Hal terbaik untuk yang saya temukan sampai saat ini adalah blkid -o list. Tetapi hasil ini mudah dibaca manusia dan sulit diurai. Mungkin ada cara yang lebih baik?

Saya membutuhkannya untuk membuat parameter manajemen konfigurasi dengan templat khusus sistem.

CATATAN tentang blkidgotcha bagi mereka yang dapat menggunakan kembali hasil dari pertanyaan saya di masa depan: blkidcache hasil dari berjalan sebelumnya di /etc/blkid.tab. Itu berarti menjalankan blkidsebagai pengguna non-root pertama kali tidak akan mengembalikan data apa pun. Juga, berjalan blkidsebagai pengguna non-root setelah root dijalankan akan mengembalikan data basi (mungkin salah).

Dmitriusan
sumber
Pada sistem saya sendiri, saya menetapkan label unik yang dapat dibaca manusia untuk semua partisi. Maka saya dapat mengetahui hampir semua hal tentang mereka dengan menggunakan label mereka dan /dev/disk/by-label... Ini juga berfungsi untuk partisi yang tidak dipasang. Ini memiliki keuntungan karena dapat menulis skrip yang melakukan hal-hal seperti rsync dari root ke root-bak yang jauh lebih sedikit kesalahan daripada menggunakan 2 UUID yang tidak "berarti" apa pun.
Joe

Jawaban:

25

Gunakan 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

Ia juga memiliki beberapa opsi untuk mengontrol bagaimana informasi itu dilihat, dan bagaimana menyajikannya (termasuk output JSON!). Itu bagian dari mountpaket, jadi tersedia di setiap instalasi Ubuntu.

muru
sumber
Ini berfungsi dengan baik pada 16.04. Gagal berfungsi untuk saya pada 14,04. Saya harus menggunakan pendekatan ini untuk mendapatkan hasil yang diinginkan pada trusty.
Penatua Geek
11

Solusi lain:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n menekan tajuk (tidak benar-benar dibutuhkan, tetapi lebih aman untuk parsing)
  • -r membuat output mentah (membuatnya lebih aman untuk diuraikan)
  • -o UUID,MOUNTPOINT hanya menyertakan informasi yang diperlukan
pLumo
sumber
5

Anda dapat menggunakan lsblkperintah untuk mengeluarkan UUID, tetapi Anda memerlukan nama perangkat partisi (seperti / dev / sda2). Anda bisa mendapatkan ini dengan menggunakan dfperintah dan memangkas output. Gunakan subtitusi perintah untuk memberikan nama perangkat lsblk. Tampaknya Anda memerlukan sudo untuk mengakses UUID, meskipun output normal lsblk tidak memerlukannya:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
Arronikal
sumber
2
Ini bekerja untuk saya tanpa sudopada 16.04.
Eliah Kagan
hanya jika Anda (atau beberapa skrip) pernah menjalankan perintah ini sebagai root sebelumnya. Juga, ouput mungkin basi (dari cache) dalam kasus ini
Dmitriusan
@ Dmitriusan Saya menjalankan ini pada sistem 14,04 yang belum pernah lsblkatau blkiddijalankan oleh root dan itu bekerja dengan sempurna. Apakah Anda tahu mengapa akan ada masalah caching dengan perintah ini dan bukan dengan versi yang diposting oleh Rovo? Apakah output mentah menghindari caching dalam beberapa cara?
Arronical
Saya pikir perintah apa pun yang mengakses UUID perangkat akan memerlukan akses root (termasuk versi yang diposting oleh Rovo). Mengenai lsblk, berikut adalah pertanyaan terkait unix.stackexchange.com/questions/210889/… (lihat jawaban pertama)
Dmitriusan
Saya setuju bahwa sudo diperlukan, tetapi tidak dapat menemukan apa pun yang menunjukkan bahwa lsblk bergantung pada caching. Bahkan jika saya jalankan blkidsebagai root, membuat file cache di /dev/.blkid.tab, penggunaan non-sudo lsblktidak akan menampilkan apa pun dari kolom UUID. Saya tidak berpikir ada risiko output basi.
Arronical
4

Solusi terbaik yang berhasil saya buat adalah

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

Terasa seperti tidak optimal, tetapi bekerja.

Catatan: [[: spasi:]] berartiSpace

Dmitriusan
sumber
Ini bekerja untuk saya tetapi dengan sudo.
pa4080
4

Sesuaikan nilai mountpointke titik pemasangan saat ini dari sistem file yang dimaksud:

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

Inilah yang saya gunakan:

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

tune2fs ada dalam paket e2fsprogs, yang saya tidak ingat apakah itu diinstal secara default.

sudo apt install e2fsprogs

jika tidak diinstal.

John
sumber
Saya mendapatkan awk: not an option: -esaya mengedit jawaban Anda untuk membuatnya fungsional. Jika saya melangkahi, silakan memutar kembali. Bersulang! :-)
Penatua Geek
Aneh, sepertinya bekerja dengan atau tanpa -e untukku. -e didokumentasikan di halaman manual untuk awk. Saya selalu menggunakannya dalam skrip dan saya terkejut itu bekerja dengan baik tanpa itu :) Saya pikir -e adalah kebiasaan lama UNIX. Tapi, saya harus konsisten dalam penggunaan dan digunakan -e di kedua tempat atau di kedua tempat agar tidak membingungkan orang.
John
Ah, saya mendapatkan hasil yang sama seperti Anda di bawah 14,04 yang menggunakan gawk. Saya mendapatkan kesalahan yang ditentukan di bawah 16,04 yang tampaknya digunakan mawksebagai gantinya.
Penatua Geek
Ini adalah salah satu dari hal-hal tersebut / etc / alternative. / etc / alternative / awk -> / usr / bin / gawk untuk saya di 16.04 saya. Mawk diinstal, tetapi tidak aktif di / etc / alternatif. Pada 17,04 gnome saya itu menunjuk ke awk. Pada instalasi baru saya 17,10 itu mawk. Setelah menginstal gawk, tautan menunjuk ke gawk, menghapus instalan gawk mengembalikannya ke mawk.
Yohanes
:-) Ini perbedaan kecil antara program yang seharusnya serupa yang cenderung mengarah pada pernyataan seperti "Lebih sedikit lebih banyak"
Penatua Geek
1

Diuji untuk bekerja pada 14,04 dan 16,04

Satu kalimat sederhana yang harus selalu menghasilkan UUID dari root /adalah

export DRIVE = $ (mount | grep '/' | awk -F "on" '{print $ 1}'); blkid $ DRIVE | cut -d '"' -f2`

Apa yang kami lakukan di sini adalah menangkap output mount untuk mencocokkan simbol root dengan spasi di kedua sisi /untuk menghindari pencocokan ketika /digunakan sebagai simbol ekstensi jalur, memipiskan bahwa dengan awkmenggunakan "on" sebagai pemisah bidang untuk menghasilkan hanya nama perangkat dan menetapkan BAHWA untuk variabel lingkungan $ DRIVE, kemudian menggunakan output dari blkid $DRIVEpipa melalui pemotongan menggunakan "sebagai pemisah bidang dan memilih hanya bidang kedua yang menghapus semua yang lainnya, hanya menyisakan UUID.

Perhatikan bahwa apa yang termasuk setelah grep pada perintah di atas sebenarnya ' space/ space' dan bukan '/' seperti yang muncul.

Ini bermanfaat karena tidak memerlukan sudodan akan mengembalikan hasil yang sesuai terlepas dari bagaimana drive dipasang.

Akan lebih bijak untuk memastikan bahwa Anda tidak menggunakan variabel lingkungan $ DRIVE untuk hal lain sebelum mencoba pendekatan ini echo $DRIVEakan menghasilkan baris kosong jika Anda tidak menggunakan variabel.

Penatua Geek
sumber