วิธีรับชื่ออุปกรณ์บล็อกจากชื่ออุปกรณ์พาร์ทิชัน?


14

ฉันกำลังมองหาวิธีพกพาที่จะได้รับชื่ออุปกรณ์บล็อกแม่ (เช่น/dev/sda) ให้ชื่ออุปกรณ์พาร์ทิชัน (เช่น/dev/sda1) ฉันรู้ว่าฉันสามารถทิ้งอักขระตัวสุดท้ายได้ แต่นั่นอาจไม่ได้ผลในบางกรณี:

  • โดยทั่วไปแล้วเครื่องอ่านการ์ด MMC จะมีชื่อเหมือน/dev/mmcblk0ในขณะที่พาร์ทิชันของพวกเขามีชื่อเช่น/dev/mmcblk0p1(สังเกตเห็นพิเศษp)
  • ทางเลือก: อุปกรณ์บล็อกบางตัวไม่มีตารางพาร์ติชั่นเลยและมีการจัดรูปแบบเป็นพาร์ติชันเดียว ในกรณีนี้อุปกรณ์พาร์ทิชันและอุปกรณ์บล็อกหลักเหมือนกัน

ปริมาตร LVM เป็นปลาที่แตกต่างกันอย่างสิ้นเชิง ฉันไม่ต้องการสนับสนุนพวกเขาในตอนนี้ แต่ถ้าคำนึงถึงพวกเขาต้องการความพยายามเพิ่มเล็กน้อยฉันก็ไม่รังเกียจ


พกพาได้อย่างไร แล็ปท็อปของฉันมีพาร์ติชั่นรูท/dev/sd0aแต่ไม่มี/dev/sd0อุปกรณ์ใด ๆ(มี/dev/sd0c... )
59

@don_crissti /dev/sda1และ/dev/mmcblk0p1เป็นเฉพาะ Linux ต่อไป lsblkค่อนข้างล่าสุดแม้ว่า
Stéphane Chazelas

lsblkยังใช้หมายเลขโหนดอุปกรณ์เพื่อค้นหาหมายเลขที่ถูกต้องแทนที่จะใช้ชื่อ ดูเหมือนว่าทางออกที่ง่ายที่สุดสำหรับ Linux และ util-linux น่าจะมีให้ใช้งานอยู่เสมอ
ilkkachu

1
@don_crissti lsblk -dpno pkname $devnameผ่านการทดสอบทั้งหมดของฉันแล้ว! บางทีคุณควรเพิ่มคำตอบ
Dmitry Grigoryev

@ thrig ใช่ฉันคาดหวังว่าสคริปต์จะกลับมา/dev/sd0cในกรณีนี้ คำตอบด้านล่างใช้ได้สำหรับคุณหรือไม่
Dmitry Grigoryev

คำตอบ:


16

หากคุณใช้ Linux คุณสามารถใช้lsblk(ซึ่งเป็นส่วนหนึ่งของutil-linux):

lsblk -no pkname /dev/sda1

2
ของฉันlsblk( util-linux: 2.20.1, อูบุนตู 14.04) ไม่ได้มีคอลัมน์เพียงpkname kname
heemayl

3
@heemayl - มันถูกเพิ่มเข้ามาเพียง สี่ปีที่ผ่านมาดังนั้นจึงไม่สามารถใช้ได้กับ distros ที่ใช้รุ่นเก่ากว่า ...
don_crissti

$ lsblk -no pkname /dev/nvme0n1p3ส่งคืน 7 บรรทัดในระบบของฉัน ใช่พาร์ติชันนี้ถูกเข้ารหัสและมี LVM นี่ไม่ใช่สถานการณ์ที่ไม่สำคัญ ฉันไม่รู้ว่าคุณควรเลือกสายที่ถูกต้องจากสคริปต์ได้อย่างน่าเชื่อถือ
elboulangero

16

หากอุปกรณ์เป็นพาร์ติชันของอุปกรณ์อื่น/sys/class/block/$devจะมีไฟล์ชื่อpartition(ซึ่งเนื้อหาคือหมายเลขพาร์ติชัน)

หากเป็นกรณีนี้คุณจะได้รับชื่ออุปกรณ์หลักด้วย:

basename "$(readlink -f "/sys/class/block/$dev/..")"

หรือด้วยzsh:

echo /sys/class/block/$dev(:A:h:t)

ตัวอย่าง:

$ dev=sda1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
sda
$ dev=nbd0p1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
nbd0

ปริมาตร LVM นั้นแตกต่างกันอย่างสิ้นเชิงไม่ใช่พาร์ติชั่นยกเว้นในกรณีพิเศษซึ่งเป็นหนึ่งในlinearการแมปต่อเนื่องกันของฟิสิคัล PV

หากคุณอยู่ในกรณีเช่นนี้คุณจะได้รับชื่อของ PV นั้นด้วย:

ls "/sys/class/block/$dev/slaves"

ไหน$devเป็นสิ่งที่ต้องการdm-2(ซึ่งคุณสามารถได้รับจาก"$(basename "$(readlink -f /dev/VG/LV)")")


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