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