ค้นหาอุปกรณ์ / dev / root ใดที่แสดงถึงใน Linux?


17

บน linux จะมี/dev/rootโหนดอุปกรณ์ /dev/sdaXนี้จะเป็นอุปกรณ์ป้องกันเช่นเดียวกับโหนดอุปกรณ์อื่นเช่น ฉัน/dev/rootจะแก้ไขโหนดอุปกรณ์ 'ของจริง' ในสถานการณ์นี้เพื่อให้ฉันสามารถแสดงชื่ออุปกรณ์ที่สมเหตุสมผลได้อย่างไร

/proc/mountsตัวอย่างเช่นผมอาจจะพบกับสถานการณ์นี้เมื่อแยก

ฉันกำลังมองหาวิธีแก้ปัญหาที่สามารถใช้งานได้จากสคริปต์ shell / python แต่ไม่ใช่ C


คุณตรวจสอบที่นี่? linux-diag.sourceforge.net/Sysfsutils.htmlมันแนะนำวิธีการค้นหาเคอร์เนลเกี่ยวกับอุปกรณ์ที่แนบมาทุกชนิดไม่แน่ใจว่ามันเป็นสิ่งที่คุณกำลังมองหา!

คำตอบ:


14

แยกพารามิเตอร์จากroot=/proc/cmdline


ว้าวปฏิกิริยาจากฟ้าผ่า :-)

1
ปลอดภัยกว่าการอ้างอิงลิงค์สัญลักษณ์ +1 :)
Tim Post

1
สิ่งนี้ใช้งานได้ในสาม distros (fc14, rhel5, ubuntu 11.04) ที่ฉันได้ดูด้วยข้อแม้เล็กน้อยว่ามีขั้นตอนพิเศษที่จำเป็นในการจัดการกับรูทอาร์กิวเมนต์ = UUID = type
kdt

ฉันสนใจว่าเพราะเหตุใดจึงปลอดภัยกว่าโซลูชัน readlink ใครจะอธิบายเพิ่มเติมได้ไหม
opello

readlink ใช้ไม่ได้ผลฉันกำลังแก้ไขปัญหาอยู่ในขณะนี้และพบผู้ใช้ที่ระบบไม่แสดงผลลัพธ์จาก: readlink / dev / root - ซึ่งสะดุดผิดพลาดในโปรแกรมที่ฉันทำงานซึ่งเป็นสาเหตุที่ฉันมา ไปที่หัวข้อนี้ การทดสอบที่ถูกต้องคือการทำครั้งแรก: readlink / dev / root จากนั้นถ้าเป็นโมฆะค้นหาใน / proc / cmdline แต่การวิเคราะห์ / proc / cmdline ไม่ใช่วิธีที่ง่ายกว่าโซลูชันที่ดีกว่าดังนั้นฉันจะคอยดูต่อไป
Lizardx

12

ในระบบที่ฉันดู/dev/rootเป็น symlink ไปยังอุปกรณ์จริงดังนั้นreadlink /dev/root(หรือreadlink -f /dev/rootถ้าคุณต้องการเส้นทางแบบเต็ม) จะทำมัน


หรือเพียงls -l /dev/root- พิมพ์ให้สั้นลง :)
rozcietrzewiacz

@ankes แต่แล้วคุณต้องแยกเอาท์พุทของls(เขาขอสิ่งที่จะใช้ในสคริปต์)
cjm

อาขอโทษ - มองข้ามว่า
rozcietrzewiacz

Nope - ในเครื่อง RHEL5 ของฉันมันไม่ใช่ symlink อย่างแน่นอนแม้ว่าบน FC14 หรือ ubuntu 11.04 เครื่อง
kdt

1
ไม่ทำงานบน archlinux
g33kz0r

7

ดี/dev/rootเป็นเพียงการเชื่อมโยงสัญลักษณ์กับอุปกรณ์จริงเพื่อให้คุณสามารถใช้readlink(2)เพื่อหาที่มันชี้จากโปรแกรมหรือreadlink(1)ที่จะทำสิ่งเดียวกันจากเชลล์สคริปต์


ไม่ไม่ทำงานบน archlinux
g33kz0r

ยังไม่ได้อยู่ใน Debian, openSUSE, CentOS (รายการที่ไม่สมบูรณ์) :(
pevik

เพิ่ม Ubuntu ลงในรายการ
Lizardx

3

สิ่งนี้อาจได้รับการอัปเดตเนื่องจากข้อมูลจำนวนมากที่ให้ที่นี่ทำให้เข้าใจผิดและอาจไม่ถูกต้องอย่างแท้จริง

https://bootlin.com/blog/find-root-device/

สำหรับจุด / เมาท์คุณจะได้รับแจ้งว่าตรงกับ / dev / root ซึ่งไม่ใช่อุปกรณ์จริงที่คุณกำลังมองหา

แน่นอนคุณสามารถดูบรรทัดคำสั่งเคอร์เนลและดูว่าระบบไฟล์รูทเริ่มต้นระบบใดที่ Linux ได้รับคำสั่งให้บูต (พารามิเตอร์รูท):

$ cat / proc / cmdline mem = คอนโซล 512M = ttyS2,115200n8 root = / dev / mmcblk0p2 rw rootwait

อย่างไรก็ตามนี่ไม่ได้หมายความว่าสิ่งที่คุณเห็นคืออุปกรณ์รูทปัจจุบัน ระบบ Linux จำนวนมากทำการบู๊ตบนระบบไฟล์รูทระดับกลาง (เช่น initramdisks และ initramfs) ซึ่งใช้เพื่อเข้าถึงระบบสุดท้าย

สิ่งหนึ่งที่ชี้ให้เห็นคือสิ่งที่อยู่ใน / proc / cmdline นั้นไม่จำเป็นต้องเป็นรูทอุปกรณ์สุดท้ายจริง ๆ

มาจากคนไม่ว่างที่ฉันคิดว่ารู้ว่าพวกเขากำลังพูดถึงเรื่องการบูตเครื่อง

https://www.linuxquestions.org/questions/slackware-14/slackware-current-dev-root-688189/page2.html

ทรัพยากรที่มีประโยชน์ที่สองที่ฉันพบคือ Slackware เธรดที่เก่าแก่มากเกี่ยวกับคำถามของ / dev / root จากอายุของเธรดนี้เราจะเห็นว่าตัวแปรทั้งหมดมีอยู่เสมอ แต่ฉันเชื่อว่า distros ส่วนใหญ่ใช้สัญลักษณ์ วิธีการเชื่อมโยง แต่นั่นเป็นสวิตช์คอมไพล์เคอร์เนลที่เรียบง่ายมันสามารถสร้างได้หรือไม่ทำถ้าฉันเข้าใจโปสเตอร์อย่างถูกต้องนั่นคือสลับไปทางเดียวและ readlink / dev / root จะรายงานชื่ออุปกรณ์จริงสลับไปมา อื่น ๆ และมันไม่

เนื่องจากหัวข้อหลักของเธรดนั้นคือวิธีการกำจัด / dev / root พวกเขาต้องเข้าไปในสิ่งที่เป็นจริงสิ่งที่ทำให้ ฯลฯ ซึ่งหมายความว่าพวกเขาต้องเข้าใจมันเพื่อกำจัดมัน

gnashly อธิบายได้ดี:

/ dev / root เป็นอุปกรณ์ทั่วไปที่สามารถใช้ใน fstab ท่านสามารถใช้ 'rootfs' การทำเช่นนี้มีข้อได้เปรียบบางอย่างที่ทำให้คุณมีความเฉพาะเจาะจงน้อยลง สิ่งที่ฉันหมายถึงคือถ้าพาร์ติชันรูทอยู่ในไดรฟ์ภายนอกอาจไม่แสดงขึ้นเป็นอุปกรณ์เดียวกันและติดตั้งเป็น / จะต้องเปลี่ยน fstab เพื่อให้ตรงกับอุปกรณ์ที่ถูกต้อง โดยใช้ / dev / root มันจะตรงกับอุปกรณ์ใดก็ตามที่ระบุไว้ในเคอร์เนลบูตพารามิเตอร์จาก lilo หรือด้วง

/ dev / root มีจุดเมานท์เสมือนอยู่เสมอแม้ว่าคุณจะไม่เคยเห็นก็ตาม ดังนั้นมี rootfs (เปรียบเทียบสิ่งนี้กับอุปกรณ์เสมือนพิเศษเช่น proc และ tmpfs ซึ่งไม่มีการมาก่อน / dev)

/ dev / root เป็นอุปกรณ์เสมือนเช่น 'proc' หรือ / dev / tcp ' ไม่มีโหนดอุปกรณ์ใน / dev สำหรับสิ่งเหล่านี้ - มันมีอยู่แล้วในเคอร์เนลเป็นอุปกรณ์เสมือน

สิ่งนี้อธิบายว่าทำไมลิงก์สัญลักษณ์ไม่จำเป็นต้องมีอยู่ ฉันประหลาดใจที่ฉันไม่เคยพบปัญหานี้มาก่อนในขณะนี้เนื่องจากฉันมีบางโปรแกรมที่จำเป็นต้องทราบข้อมูลนี้ แต่ก็ยังดีกว่าไม่สาย

ฉันเชื่อว่าวิธีแก้ปัญหาบางอย่างที่นำเสนอในที่นี้จะ 'ทำงานบ่อย' และอาจเป็นสิ่งที่ฉันจะทำ แต่มันไม่ใช่วิธีการแก้ปัญหาจริงที่แท้จริงซึ่งตามที่ผู้เขียน busybox ระบุไว้นั้นมีความซับซ้อนมากขึ้น ลักษณะที่แข็งแกร่ง

[อัพเดต:} หลังจากได้รับข้อมูลการทดสอบของผู้ใช้ฉันจะใช้วิธีการเมานท์ซึ่งดูเหมือนจะโอเคสำหรับบางกรณีอย่างน้อย / proc / cmdline ไม่มีประโยชน์เพราะมีหลายรุ่นมากเกินไป ในตัวอย่างแรกคุณจะเห็นวิธีเก่า นี่เป็นเรื่องธรรมดาที่น้อยลงเพราะไม่แนะนำให้ใช้ (ไวยากรณ์ชนิด / dev / sdx [0-9] ดั้งเดิม) เนื่องจากเส้นทางเหล่านั้นสามารถเปลี่ยนแปลงได้แบบไดนามิก (คำสั่งสลับดิสก์ใส่ดิสก์ใหม่ ฯลฯ และทันใด / dev / sda1 กลายเป็น / dev / sdb1)

root=/dev/sda1
root=UUID=5a25cf4a-9772-40cd-b527-62848d4bdfda
root=LABEL=random string
root=PARTUUID=a2079bfb-02

VS สะอาดมากและง่ายต่อการแยก:

mount
/dev/sda1 on / type ext4 (rw,noatime,data=ordered)

ในกรณีของ cmdline คุณจะเห็นตัวแปรเพียงตัวเดียวที่เป็น 'คำตอบ' ที่ถูกต้องในทางทฤษฎีคือคำตอบแรกที่คัดค้านเนื่องจากคุณไม่ควรอ้างอิงรูตไปยังเป้าหมายที่เคลื่อนไหวเช่น / dev / sdxy

สองรายการถัดไปต้องการดำเนินการเพิ่มเติมเพื่อรับลิงก์สัญลักษณ์จากสตริงนั้นใน / dev / disk / by-uuid หรือ / dev / disk / by-label

อันสุดท้ายฉันต้องเชื่อว่าใช้ parted -l เพื่อค้นหาว่า id ที่แยกส่วนนั้นชี้ไปยังอะไร

นั่นเป็นเพียงตัวแปรที่ฉันรู้จักและได้เห็นเท่านั้นเช่นอื่น ๆ เช่น GPTID

ดังนั้นวิธีที่ฉันใช้คือ:

ก่อนอื่นดูว่า / dev / root เป็นลิงค์สัญลักษณ์ หากเป็นเช่นนั้นให้ตรวจสอบว่าไม่ได้เป็น / dev / disk / by-uuid หรือ by-label หากเป็นเช่นนั้นคุณต้องทำขั้นตอนที่สองของการประมวลผลเพื่อให้ได้เส้นทางที่แท้จริงสุดท้าย ขึ้นอยู่กับเครื่องมือที่คุณใช้

หากคุณไม่มีอะไรให้ไปที่ภูเขาและดูว่าเป็นอย่างไร ในกรณีที่มีทางเลือกสุดท้ายสิ่งหนึ่งที่ฉันไม่ได้ใช้เพราะอาร์กิวเมนต์ที่ให้ไว้ไม่จำเป็นต้องเป็นพาร์ติชันหรืออุปกรณ์ที่เป็นปัญหาจริงนั้นดีพอที่ฉันจะปฏิเสธวิธีแก้ปัญหานั้นสำหรับโปรแกรมของฉัน การเมานต์ไม่ใช่โซลูชันที่สมบูรณ์และฉันแน่ใจว่าได้รับตัวอย่างเพียงพอมันจะง่ายต่อการค้นหาเคสที่ไม่ถูกต้องเลย แต่ฉันเชื่อว่าทั้งสองกรณีนี้ครอบคลุมผู้ใช้ 'ส่วนใหญ่' ซึ่งเป็นสิ่งที่ฉันต้องการ

ทางออกที่ดีที่สุดสะอาดและน่าเชื่อถือที่สุดสำหรับเคอร์เนลที่มักจะสร้างลิงก์สัญลักษณ์ซึ่งจะไม่ทำร้ายอะไรหรือใครก็ตามและเรียกมันว่าดี แต่นั่นไม่ใช่วิธีการทำงานในโลกแห่งความเป็นจริง .

ฉันไม่ได้พิจารณาสิ่งเหล่านี้เป็นโซลูชัน 'ดีหรือแข็งแกร่ง' แต่ตัวเลือกการเมานท์ดูเหมือนจะตอบสนอง 'ดีพอ' และหากต้องการโซลูชันที่แข็งแกร่งอย่างแท้จริงให้ใช้สิ่งที่แนะนำให้ใช้ busybox


2

บางทีฉันอาจจะพลาดบางอย่าง แต่สิ่งที่เกี่ยวกับ:

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