findmnt ไม่สามารถแสดงรายการการเชื่อมโยงผูกได้อย่างไร?


11

ผู้คนมากมายบอกว่าลีนุกซ์ไม่เก็บข้อมูลเกี่ยวกับการผูกเมาท์ดังนั้นจึงไม่มีวิธีรับรายการของพวกเขาและแหล่งที่มา นี่คือตัวอย่างบางส่วน:

  • จากหนึ่งในความคิดเห็นที่นี่ :

    IIRC ข้อมูลนี้จะไม่ถูกเก็บไว้ที่ใด: หลังจากmount --bindนั้นสำเนาสองชุดนั้นมีความเท่าเทียมกันและไม่มี "ต้นฉบับ" มากกว่าอีกชุดหนึ่ง /mntท้ายที่สุดอาจไม่มีต้นฉบับถ้าคุณยกเลิกการต่อเชื่อมแล้ว

  • จากคำตอบในเว็บไซต์นี้ :

    /etc/mtabดังนั้นวิธีเดียวที่จะจำสิ่งที่ม้าเป็นม้าผูกเป็นบันทึกการติดคำสั่งที่เหลืออยู่ใน การดำเนินการ bind mount ถูกระบุโดยตัวเลือก bind mount (ซึ่งทำให้ระบบไฟล์ถูกละเว้น) แต่การเมานต์ไม่มีตัวเลือกให้แสดงเฉพาะระบบไฟล์ที่เมาท์พร้อมชุดของชุดตัวเลือกโดยเฉพาะ

  • จากรายงานข้อบกพร่องของเดเบียน :

    นี่คือเจตนา จุดเชื่อมต่อทั้งสองนั้นเท่ากันทุกวิธีดังนั้นเคอร์เนลจะไม่เก็บค่าสถานะใด ๆ เพื่อแยกความแตกต่าง

ข้างต้นเป็นเรื่องไร้สาระแม้ว่า เครื่องมือfindmntนี้สามารถแสดงรายการที่มาของเส้นทางของการเชื่อมต่อผูก (ในรูปแบบของdevice[source-path]; ฉันยังพยายามที่จะได้รับมันเพียงแค่รายการเส้นทางที่มาและไม่ได้อุปกรณ์) ถ้าเคอร์เนลคือการรักษาผูกติดแล้วว่าข้อมูลที่จะต้องมีการจัดเก็บไว้ที่ใดที่หนึ่งมิฉะนั้นจะไม่สามารถรู้ว่าถูกผูกไว้กับ/home /usersแล้วข้อมูลนี้อยู่ที่ไหน? มันถูกเก็บไว้ในพื้นที่ที่ไม่ชัดเจนใน RAM หรือไม่? ไม่findmntมองใน/procบาง?


findmntคุณกำลังใช้เวอร์ชันใดอยู่และมีตัวเลือกอะไรบ้าง ฉันไม่ได้พิมพ์ออกมาอย่างนั้นและดูที่ซอร์สโค้ดมันดูเหมือนว่าจะใช้_PATH_PROC_MOUNTINFOซึ่งดูเหมือนว่าจะ/proc/self/mountinfoไม่มีข้อมูลนี้อยู่ในนั้น
Bratchley

ตกลงฉันคิดว่า/proc/self/mountinfoค่อนข้างเร็วปรับโครงสร้าง ฉันอยู่ในเครื่อง RHEL6 ของฉันก่อนหน้านี้ซึ่งไม่มีข้อมูลเส้นทาง แต่เครื่อง RHEL7 ของฉันทำและตามที่ระบุไว้ในลิงก์ของคุณ Wheezy ก็ทำได้เช่นกัน
Bratchley

มันไม่ใช่เรื่องไร้สาระมันเป็นเรื่องจริงกับเมล็ดที่แก่กว่า แต่เมล็ดที่ใหม่กว่านั้นจะติดตามข้อมูล
Gilles 'หยุดชั่วร้าย'

@Gilles แล้ว bind mount ยังคงอยู่ได้อย่างไรถ้าข้อมูลที่หนึ่งในไดเร็กทอรีนั้นถูกเมาท์อยู่ที่อื่นนั้นไม่ถูกติดตาม
Melab

@Melab ที่จริงแล้วการผูกติดจะง่ายกว่าถ้าคุณไม่ติดตามว่ามันเป็น bind mount เมื่อ/dev/Aติดตั้งใน/Bและคุณทำmount --bind /B /Cเมล็ดเก่าจำเท่านั้น/B → /dev/Aและ/C → /dev/Aพวกเขาจำไม่ได้ว่าความสัมพันธ์ระหว่างการใด ๆและ/B /Cดังนั้น unmounting ธรรมชาติไม่มีผลต่อ/B /Cเมล็ดที่ใหม่กว่าจำได้ว่า/Cเป็นภูเขาผูก/Bแต่ในวิธีที่ไม่ได้ป้องกันไม่/Cให้ทำงานต่อไปหาก/Bไม่มีการเมานท์ฉันไม่รู้วิธีการอย่างแน่นอน
Gilles 'หยุดชั่วร้าย'

คำตอบ:


12

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

หากคุณดู/proc/self/mountinfoคุณจะเห็นมุมมองเคอร์เนลของโลกแห่งการเมานต์สำหรับกระบวนการนี้ (เนมสเปซทำให้สิ่งต่าง ๆ มีความซับซ้อนมากขึ้นไม่ใช่แค่เพียงมุมมองเดียวของตารางเมานต์)

man 5 procจะอธิบายรูปแบบของไฟล์นี้ แต่คุณสามารถเห็นลำดับชั้นของต้นไม้และตำแหน่งที่การเชื่อมต่อมี "พาเรนต์" นี่คือไฟล์ที่findmntแยกวิเคราะห์


9

ลินุกซ์ไม่ได้เก็บข้อมูลเกี่ยวกับที่ติดถูกผูกติด มันจะเก็บข้อมูลเกี่ยวกับการเมาท์ทั้งหมดรวมทั้งม้าผูก

มันค่อนข้างคล้ายกับลิงก์ยาก เมาท์ลิงก์ไปยังระบบไฟล์เช่นลิงก์ชื่อไฟล์ไปยัง inodes ข้อแตกต่างเพียงอย่างเดียวคือการเมาต์นั้นมีแฟล็กต่อจุดเมานต์และอาจอ้างถึงไดเร็กทอรีย่อยของระบบไฟล์เป้าหมายแทนรูทระบบไฟล์

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

กลับไปที่การโยงการเมานต์: เคอร์เนลจะเก็บตารางที่มีระบบไฟล์ (ระบุโดยตัวหลัก: คู่เลขตัวเล็ก), จุดเมานต์, พา ธ ที่สัมพันธ์กับรูทของระบบไฟล์และแฟล็กบางตัว /proc/self/mountinfoคุณสามารถเข้าถึงรายชื่อนี้โดยดูที่ (มันจะซับซ้อนมากขึ้นเมื่อมีการเชื่อมต่อกับ namespaces ตามที่ @ stephen-harris พูดถึง) findmntแยกวิเคราะห์รายการนี้

หากรูทของคุณอยู่/dev/sda1ในหลัก: รองลงมา8:1และคุณเรียกใช้mount --bind /a /b /proc/self/mountinfoจะมีบรรทัดที่คล้ายกับสิ่งนี้:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro

หากคุณ/homeอยู่/dev/sda2กับหลัก: รองลงมา8:2และคุณเรียกใช้mount --bind /home /usersมันจะมีลักษณะเช่นนี้:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:2 / /home rw - ext4 /dev/sda2 rw
3 1 8:2 / /users rw - ext4 /dev/sda2 rw

คอลัมน์ที่เกี่ยวข้องสำหรับคำถามของคุณคือคอลัมน์ที่สามสี่และห้า นี่คือรหัสระบบไฟล์ (สำหรับระบบไฟล์จริงมันเหมือนกับอุปกรณ์หลัก: เล็กน้อยสำหรับระบบไฟล์เสมือนเช่น tmpfs เป็น [0: ตัวนับ ]) พา ธ ที่สัมพันธ์กับรูทของระบบไฟล์ที่ผูกกับจุดเมานท์ (ปกติ / ปกติ Mounts อาจเป็นอะไรก็ได้สำหรับการผูก Mounts) และ Mountpoint
สำหรับความหมายของเหลือคอลัมน์ดูเอกสารลินุกซ์

findmntเรียกพา ธ ต้นทางที่สัมพันธ์กับรูทของระบบไฟล์ "FSROOT" คุณสามารถใช้findmnt -o TARGET,FSROOTเพื่อรับมัน หากคุณต้องการเส้นทางที่มาแน่นอนคุณอาจต้องแยกวิเคราะห์/proc/self/mountinfoด้วยตัวเองและรวมข้อมูลเกี่ยวกับการเมาท์สำหรับระบบไฟล์เดียวกัน

สำหรับข้อมูลเพิ่มเติมโปรดดูคำตอบของฉัน "รายการเพียงม้าผูก"


หาก/proc/self/mountinfoสามารถมีบรรทัดเช่น2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-roนั้นแน่นอนที่สุด Linux จะเก็บข้อมูลบางอย่างเกี่ยวกับการผูกติด
Melab

ไม่ดูตัวอย่างที่สองของฉัน มันช่วยให้ข้อมูลที่ถูกติดตั้งระบบแฟ้มและเส้นทางที่สัมพันธ์กับรากระบบแฟ้มถูกติดตั้ง ดังนั้นสำหรับmount --bind /home/melab /mntเส้นที่เกิดขึ้นอาจมีลักษณะเช่นใด ๆ ขึ้นต่อไปที่ของ/homeและ/home/melabเป็นจุดเมานท์ A: 3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw, 3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw,3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
cg909

มันเป็นความจริงที่บางสิ่งที่แตกต่างจาก/ในคอลัมน์ที่สี่มักจะบ่งบอกถึงการผูกติด แต่มันอาจจะเป็น Bvfs subvolume
cg909

คือ/dev/sda3ควรจะติดตั้งที่/home/melab?
Melab

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