รับ UUID จาก / ระบบไฟล์จากสคริปต์


11

ฉันจะรับ UUID ของไดรฟ์ข้อมูลที่มี/ระบบไฟล์ได้อย่างไร blkid -o listสิ่งที่ดีที่สุดสำหรับการที่ฉันได้พบว่าวันที่ แต่ผลลัพธ์นี้เป็นมนุษย์อ่านได้และยากที่จะแยกวิเคราะห์ อาจจะมีวิธีที่ดีกว่า

ฉันต้องการใช้การจัดการการกำหนดค่าพารามิเตอร์ด้วยเทมเพลตเฉพาะระบบ

หมายเหตุเกี่ยวกับblkidgotcha สำหรับผู้ที่อาจนำมาใช้ผลของคำถามของฉันในอนาคต: แคชผลของการทำงานก่อนหน้านี้ที่blkid /etc/blkid.tabนั่นหมายความว่าการทำงานblkidในฐานะผู้ใช้ที่ไม่ใช่รูทในครั้งแรกจะไม่ส่งคืนข้อมูลใด ๆ นอกจากนี้การรันblkidในฐานะผู้ใช้ที่ไม่ใช่รูทหลังจากรันรูทจะส่งคืนข้อมูลเก่า (อาจไม่ถูกต้อง)


ในระบบของฉันฉันกำหนดเลเบลที่ไม่ซ้ำใครที่สามารถอ่านได้ให้กับพาร์ติชันทั้งหมด จากนั้นฉันสามารถค้นหาเกือบทุกอย่างเกี่ยวกับพวกเขาโดยใช้ป้ายกำกับของพวกเขาและ/dev/disk/by-label... นอกจากนี้ยังใช้งานได้กับพาร์ติชันที่ไม่ได้ติดตั้ง มันมีข้อดีของความสามารถในการเขียนสคริปต์ที่ทำสิ่งต่าง ๆ เช่น rsync จากรูทไปยังรูทบั๊กซึ่งเป็นข้อผิดพลาดน้อยกว่าง่ายกว่าการใช้ 2 UUIDS ที่ไม่ได้หมายความว่าอะไร
Joe

คำตอบ:


25

การใช้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

นอกจากนี้ยังมีหลายตัวเลือกในการควบคุมวิธีการค้นหาข้อมูลและวิธีการนำเสนอ (รวมถึงเอาต์พุต JSON!) มันเป็นส่วนหนึ่งของmountแพ็คเกจจึงมีให้สำหรับการติดตั้ง Ubuntu ใด ๆ


มันใช้งานได้ดีในวันที่ 16.04 มันไม่สามารถทำงานให้ฉันได้ใน 14.04 ฉันต้องใช้วิธีการนี้เพื่อให้ได้ผลลัพธ์ที่ต้องการจากความไว้วางใจ
Elder Geek

11

ทางออกอื่น:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n ไม่แสดงส่วนหัว (ไม่จำเป็นจริงๆ แต่ปลอดภัยกว่าสำหรับการแยกวิเคราะห์)
  • -r ทำให้ผลผลิตดิบ (ทำให้ปลอดภัยในการแยกวิเคราะห์)
  • -o UUID,MOUNTPOINT รวมถึงข้อมูลที่จำเป็นเท่านั้น

5

คุณสามารถใช้lsblkคำสั่งเพื่อส่งออก UUID แต่คุณต้องการชื่ออุปกรณ์ของพาร์ติชัน (เช่น / dev / sda2) คุณสามารถรับสิ่งนี้ได้โดยใช้dfคำสั่งและตัดทอนผลลัพธ์ lsblkใช้แทนคำสั่งที่จะให้ชื่ออุปกรณ์เพื่อ ดูเหมือนว่าคุณต้องใช้ sudo เพื่อเข้าถึง UUID ถึงแม้ว่าเอาต์พุตปกติของ lsblk ไม่ต้องการ:

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

2
สิ่งนี้ใช้ได้กับฉันโดยไม่ใช้sudoวันที่ 16.04
Eliah Kagan

เฉพาะในกรณีที่คุณ (หรือบางสคริปต์) เคยรันคำสั่งนี้เป็น root ก่อน นอกจากนี้ ouput อาจค้าง (จากแคช) ในกรณีนี้
Dmitriusan

@Dmitriusan ฉันใช้ระบบ 14.04 ที่ไม่เคยมีรูทlsblkหรือblkidรูทและมันทำงานได้อย่างสมบูรณ์แบบ คุณรู้หรือไม่ว่าเหตุใดจึงมีปัญหาการแคชกับคำสั่งนี้และไม่ใช่เวอร์ชันที่โพสต์โดย Rovo? การส่งออกดิบหลีกเลี่ยงการแคชอย่างใด?
Arronical

ฉันคิดว่าคำสั่งใด ๆ ที่เข้าถึง UUID ของอุปกรณ์จะต้องมีการเข้าถึงรูท (รวมถึงเวอร์ชันที่โพสต์โดย Rovo) เกี่ยวกับ lsblk นี่คือคำถามที่เกี่ยวข้องunix.stackexchange.com/questions/210889/ … (ดูคำตอบแรก)
Dmitriusan

ฉันยอมรับว่าจำเป็นต้องใช้ sudo แต่ไม่พบสิ่งใดที่จะแนะนำว่า lsblk อาศัยการแคช แม้ว่าฉันจะเรียกใช้blkidในฐานะ root การสร้างไฟล์แคชที่การใช้งานที่/dev/.blkid.tabไม่ใช่ sudo lsblkจะไม่แสดงอะไรจากคอลัมน์ UUID ฉันไม่คิดว่ามีความเสี่ยงต่อผลลัพธ์ที่ค้างอยู่
Arronical

4

ทางออกที่ดีที่สุดที่ฉันสามารถทำได้คือ

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

รู้สึกเหมือนไม่เหมาะสม แต่ได้ผล

หมายเหตุ: [[: space:]] หมายถึงSpace


งานนี้สำหรับฉัน sudoแต่กับ
pa4080

4

ปรับค่าmountpointเป็นจุดเมานท์ปัจจุบันของระบบไฟล์ที่เป็นปัญหา:

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

1

นี่คือสิ่งที่ฉันใช้:

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

tune2fs อยู่ในแพ็คเกจ e2fsprogs ซึ่งฉันจำไม่ได้ว่ามันติดตั้งเป็นค่าเริ่มต้นหรือไม่

sudo apt install e2fsprogs

หากยังไม่ได้ติดตั้ง


ฉันขอawk: not an option: -eแก้ไขคำตอบของคุณเพื่อให้ใช้งานได้ หากฉันทำงานเกินควรโปรดกลับมาใช้ใหม่ ไชโย! :-)
Elder Geek

แปลกดูเหมือนว่าจะทำงานกับหรือไม่มี -e สำหรับฉัน -e ถูกบันทึกไว้ใน man page สำหรับ awk ฉันมักจะใช้มันในสคริปต์และฉันก็ประหลาดใจว่ามันทำงานได้ดีโดยไม่ต้อง :) ฉันคิดว่า -e เป็นนิสัย UNIX เก่า แต่ฉันควรจะสอดคล้องกันในการใช้งานของฉันและใช้ -e ในสถานที่ทั้งสองหรือที่ใดที่หนึ่งเพื่อไม่ให้คนสับสน
จอห์น

โอ้ฉันได้รับผลเช่นเดียวกับคุณภายใต้ 14.04 gawkซึ่งการใช้งาน ฉันพบข้อผิดพลาดภายใต้ 16.04 ซึ่งดูเหมือนว่าจะใช้mawkแทน
Elder Geek

มันเป็นหนึ่งในสิ่ง / etc / ทางเลือกเหล่านั้น / etc / ทางเลือก / awk -> / usr / bin / gawk สำหรับฉันที่ 16.04 ของฉัน ติดตั้ง Mawk แล้ว แต่ไม่ทำงานใน / etc / ทางเลือก ในคำพังเพย 17.04 ของฉันมันชี้ไปที่ awk ในการติดตั้งใหม่ของฉัน 17.10 มัน mawk หลังจากติดตั้ง gawk ลิงก์ชี้ไปที่ gawk การถอนการติดตั้ง gawk จะส่งคืนไปยัง mawk
จอห์น

:-) นี่เป็นความแตกต่างเล็กน้อยระหว่างโปรแกรมที่คล้ายกันซึ่งน่าจะนำไปสู่ข้อความเช่น "Less is more"
Elder Geek

1

ผ่านการทดสอบการทำงานบน 14.04 และ 16.04

ง่ายหนึ่งซับที่ควรผลิต UUID ของราก/เป็น

ส่งออก DRIVE = $ (เมานต์ | grep '/' | awk -F "กับ" '{พิมพ์ $ 1}'); blkid $ DRIVE | cut -d '"' -f2`

สิ่งที่เรากำลังทำอยู่ที่นี่คือการ grepping เอาต์พุตของ mount เพื่อจับคู่สัญลักษณ์รูทกับช่องว่างทั้งสองข้าง/เพื่อหลีกเลี่ยงการจับคู่เมื่อ/ใช้เป็นสัญลักษณ์ส่วนขยายพา ธawkโดยใช้ "on" เป็นตัวคั่นฟิลด์เพื่อส่งออกเฉพาะ ชื่ออุปกรณ์และกำหนด That ให้กับตัวแปรสภาพแวดล้อม $ DRIVE จากนั้นใช้เอาต์พุตของblkid $DRIVEpiped ผ่านการตัดโดยใช้"เป็นตัวคั่นฟิลด์และเลือกเฉพาะฟิลด์ที่สองซึ่งดึงข้อมูลทุกอย่างออกจาก UUID เท่านั้น

โปรดทราบว่าสิ่งที่เป็นของ grep ในคำสั่งด้านบนคือ ' space/ space' และไม่ใช่ '/' ตามที่ปรากฏ

นี่เป็นข้อดีของการไม่ต้องใช้sudoและจะส่งคืนผลลัพธ์ที่เหมาะสมโดยไม่คำนึงถึงวิธีการติดตั้งไดรฟ์

ขอแนะนำให้คุณมั่นใจว่าคุณไม่ได้ใช้ตัวแปรสภาพแวดล้อม $ DRIVE สำหรับสิ่งอื่นใดก่อนที่จะลองใช้วิธีการนี้echo $DRIVEจะส่งคืนบรรทัดว่างหากคุณไม่ได้ใช้ตัวแปร

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