/ Dosya sisteminin UUID'sini koddan alın


11

/Dosya sistemini içeren bir birimin UUID'sini nasıl alabilirim ? Bugüne kadar bulduğum en iyi şey blkid -o list. Ancak bu çıktı insan tarafından okunabilir ve ayrıştırılması zordur. Belki daha iyi bir yol var?

Yapılandırma yönetimini sisteme özel şablonlarla parametreleştirmek için buna ihtiyacım var.

blkidGelecekte sorumun sonuçlarını tekrar kullanabilecekler için gotcha hakkında NOT : blkidönceki çalışmaların sonuçlarını önbelleğe alır /etc/blkid.tab. Bu, blkidroot olmayan kullanıcı olarak ilk kez çalıştırmanın herhangi bir veri döndürmeyeceği anlamına gelir . Ayrıca, blkidkök çalıştırdıktan sonra kök olmayan kullanıcı olarak çalıştırmak eski (muhtemelen yanlış) verileri döndürür.


Kendi sistemlerimde, tüm bölümlere insan tarafından okunabilen, benzersiz etiketler atarım. Sonra etiketlerini kullanarak onlar hakkında neredeyse her şeyi bulabilirim ve /dev/disk/by-label... Bu aynı zamanda monte edilmemiş bölümler için de çalışır. Bu, bir şey "anlamına gelmeyen" 2 UUIDS kullanmaktan çok daha az hata eğilimi olan kökten kök-baka rsync gibi şeyler yapan komut dosyaları yazabilme avantajına sahiptir.
Joe

Yanıtlar:


25

Kullanım 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

Ayrıca, bilgilerin nasıl göründüğünü ve nasıl sunduğunu kontrol etmek için çeşitli seçenekler vardır (JSON çıktısı dahil!). mountPaketin bir parçası , bu yüzden herhangi bir Ubuntu kurulumunda mevcut.


Bu 16.04'te harika çalışıyor. 14.04'te benim için çalışmadı. Güvenilir konusunda istenilen sonuçları elde etmek için bu yaklaşımı kullanmak zorunda kaldım .
Elder Geek

11

Başka bir çözüm:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n Başlığı bastırır (gerçekten gerekli değildir, ancak ayrıştırma için daha güvenlidir)
  • -r Ham çıktı üretir (ayrıştırmayı daha güvenli hale getirir)
  • -o UUID,MOUNTPOINT sadece gerekli bilgileri dahil et

5

lsblkUUID çıktısını almak için komutu kullanabilirsiniz , ancak bölümün aygıt adına (/ dev / sda2 gibi) ihtiyacınız vardır. dfKomutu kullanarak ve çıktıyı kırparak bunu elde edebilirsiniz . Aygıt adını vermek için komut değiştirme işlevini kullanın lsblk. Normal lsblk çıktısının gerektirmese de, UUID'ye erişmek için sudo'ya ihtiyacınız var gibi görünüyor:

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

2
Bu benim sudoiçin 16.04 olmadan çalışır .
Eliah Kagan

yalnızca siz (veya bir komut dosyası) bu komutu daha önce root olarak çalıştırdıysanız. Ayrıca, bu durumda çıkış eski (önbellekten) olabilir
Dmitriusan

@Dmitriusan benim hiç bir 14.04 sistemde bu ran lsblkveya blkidroot tarafından işletilen ve mükemmel çalıştı. Rovo tarafından yayınlanan sürümde değil, neden bu komutta önbellekleme sorunu olacağını biliyor musunuz? Ham çıktı bir şekilde önbelleğe almayı engelliyor mu?
17'de

Ben cihazların UUID erişen herhangi bir komut (Rovo tarafından yayınlanan sürümü dahil) kök erişim gerektireceğini düşünüyorum. Lsblk ile ilgili olarak, ilgili bir soru unix.stackexchange.com/questions/210889/… (ilk cevaba bakınız)
Dmitriusan

Sudo'nun gerekli olduğunu kabul ediyorum, ancak lsblk'in önbelleğe almasını önerecek bir şey bulamıyorum. blkidKök olarak çalışsa bile , önbellek dosyasını oluştururken, /dev/.blkid.tabsudo olmayan kullanımı lsblkUUID sütununda hiçbir şey göstermez. Eski çıktı riski olduğunu sanmıyorum.
17'de

4

Gelmeyi başardığım en iyi çözüm

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

Optimal değil gibi hissediyor, ama çalışıyor.

Not: [[: space:]] şu anlama gelirSpace


Bu benim için çalışıyor ama birlikte sudo.
pa4080

4

Değerini, mountpointsöz konusu dosya sisteminin geçerli bağlama noktasına göre ayarlayın :

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

1

İşte ne kullanıyorum:

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

tune2fs e2fsprogs paketinde, varsayılan olarak yüklenmiş olup olmadığını hatırlayamıyorum.

sudo apt install e2fsprogs

yüklü değilse.


Ben olsun awk: not an option: -eben fonksiyonel hale getirmek cevabınızı düzenlenebilir. Eğer fazla adım attıysam, lütfen geri almaktan çekinmeyin. Şerefe! :-)
Elder Geek

Garip, benim için -e ile veya onsuz çalışıyor gibi görünüyor. -e man sayfasında awk için belgelenmiştir. Ben her zaman komut dosyalarında kullandım ve onsuz iyi çalıştı şaşırdı :) Ben -e eski bir UNIX alışkanlığı olduğunu düşünüyorum. Ancak, benim kullanımımda tutarlı olmalı ve -e her iki yerde ya da hiçbir yerde insanları karıştırmamak için kullanmalıydım.
John

Ah, 14.04 altında kullandığınız sonucu aldım gawk. Bunun mawkyerine 16.04 altında belirtilen hatayı alıyorum .
Elder Geek

Bu / etc / alternative şeylerden biri. / etc / alternatifler / awk -> / usr / bin / gawk benim için 16.04. Mawk yüklüdür, ancak / etc / alternative içinde aktif değildir. Benim 17.04 gnome üzerinde awk işaret ediyor. Yeni kurulumumda 17.10 mawk. Gawk'yi yükledikten sonra gawk'a bağlantı noktaları, gawk kaldırıldığında mawk'a geri döner.
John

:-) Muhtemelen benzer programlar arasındaki bu küçük farklılıklar büyük olasılıkla "Daha az daha fazla" gibi ifadelere yol açtı
Elder Geek

1

14.04 ve 16.04'te çalışması test edildi

Her zaman kökün UUID'sini üretmelidir Basit tek satırlık /olduğunu

dışa aktarma DRIVE = $ ("| 1 $ yazdır" üzerinde "grep '/' | awk -F"); blkid $ DRIVE | kes -d '"' -f2 '

Burada yaptığımız şey , bir yol uzatma sembolü olarak kullanıldığında /eşleşmeyi önlemek için kök sembolünü her iki taraftaki boşluklarla eşleştirmek için montaj çıkışını selamlamaktır, sadece bir çıkış ayırıcısı olarak "on" kullanarak cihaz adı ve THAT ortam değişkenine $ DRIVE atandıktan sonra , bir alan ayırıcı olarak kullanarak kesilen boru çıkışını kullanarak ve yalnızca UUID bırakarak diğer her şeyi sıyırtan ikinci alanı seçin./awkblkid $DRIVE"

Not Yukarıdaki komut grep 'aslında sonra ait olanı o space/ space' değil de '/' göründüğü gibi.

Bu, gerekmeme avantajına sahiptir ve sudosürücünün nasıl monte edildiğine bakılmaksızın uygun sonucu döndürür.

Değişkeni kullanmıyorsanız, bu yaklaşımı denemeden önce $ DRIVE ortam değişkenini başka bir şey için kullanmadığınızdan emin olmak akıllıca echo $DRIVEolacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.