การผูกติดคืออะไร?


325

“ ภูเขาผูก” คืออะไร? ฉันจะสร้างได้อย่างไร มันดีสำหรับอะไร?

ฉันได้รับคำสั่งให้ใช้ตัวยึดสำหรับบางอย่าง แต่ฉันไม่เข้าใจว่ามันคืออะไรหรือใช้อย่างไร


2
การอธิบายทางเลือกที่เป็นประโยชน์ระหว่างการติดตั้งและsymlink
Charlie Parker

คำตอบ:


564

การผูกติดคืออะไร?

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

ตัวอย่างเช่นหลังจากออกคำสั่ง Linux

mount --bind /some/where /else/where

ไดเรกทอรี/some/whereและ/else/whereมีเนื้อหาเดียวกัน

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

ฉันจะสร้างการเชื่อมต่อแบบผูกได้อย่างไร

bindfs

bindfsระบบแฟ้มเป็นFUSEระบบแฟ้มที่สร้างมุมมองของต้นไม้ไดเรกทอรี ตัวอย่างเช่นคำสั่ง

bindfs /some/where /else/where

ทำให้/else/whereจุดเมานต์ซึ่งเนื้อหาของ/some/whereสามารถมองเห็นได้

เนื่องจาก bindfs เป็นระบบไฟล์แยกต่างหากไฟล์/some/where/fooและ/else/where/fooปรากฏเป็นไฟล์ที่แตกต่างกันสำหรับแอปพลิเคชัน (ระบบไฟล์ bindfs มีst_devค่าของตัวเอง) การเปลี่ยนแปลงในด้านใดด้านหนึ่งคือ“ อย่างน่าอัศจรรย์” ที่ปรากฎที่อีกด้านหนึ่ง แต่ความจริงที่ว่าไฟล์นั้นเหมือนกันนั้นจะปรากฏต่อเมื่อรู้ว่า bindfs ทำงานอย่างไร

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

Bindfs สามารถแก้ไขข้อมูลเมตาของไฟล์บางส่วน: มันสามารถแสดงสิทธิ์ปลอมและความเป็นเจ้าของไฟล์ ดูคู่มือสำหรับรายละเอียดและดูตัวอย่างด้านล่าง

ระบบไฟล์ bindfs สามารถติดตั้งได้ในฐานะผู้ใช้ที่ไม่ใช่รูทคุณต้องมีสิทธิ์ในการเมานต์ระบบไฟล์ FUSE เท่านั้น ขึ้นอยู่กับการกระจายของคุณสิ่งนี้อาจต้องอยู่ในfuseกลุ่มหรือได้รับอนุญาตจากผู้ใช้ทุกคน ในการเลิกเมานท์ระบบไฟล์ FUSE ให้ใช้fusermount -uแทนumountเช่น

fusermount -u /else/where

nullfs

FreeBSD จัดเตรียมnullfsระบบไฟล์ซึ่งสร้างมุมมองทางเลือกของระบบไฟล์ คำสั่งสองคำสั่งต่อไปนี้เทียบเท่ากัน:

mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where

หลังจากออกคำสั่งอย่างใดอย่างหนึ่ง/else/whereจะกลายเป็นจุดเชื่อมต่อที่/some/whereมองเห็นเนื้อหา

เนื่องจาก nullfs เป็นระบบไฟล์แยกต่างหากไฟล์/some/where/fooและ/else/where/fooปรากฏเป็นไฟล์ที่แตกต่างกันสำหรับแอปพลิเคชัน (ระบบไฟล์ nullfs มีst_devค่าของตัวเอง) การเปลี่ยนแปลงในด้านใดด้านหนึ่งคือ“ อย่างน่าอัศจรรย์” ที่ปรากฎที่อีกด้านหนึ่ง แต่ความจริงที่ว่าไฟล์นั้นเหมือนกันจะปรากฏให้เห็นก็ต่อเมื่อมีใครรู้ว่า nullfs ทำงานอย่างไร

ซึ่งแตกต่างจาก bindfs FUSE ซึ่งทำหน้าที่ในระดับของต้นไม้ไดเรกทอรี nullfs ของ FreeBSD ทำหน้าที่ลึกใน kernel ดังนั้นจุดเมาภายใต้/else/whereไม่สามารถมองเห็นเพียงต้นไม้ที่เป็นส่วนหนึ่งของการติดจุดเดียวกับที่จะสะท้อนให้เห็นภายใต้/some/where/else/where

ระบบไฟล์ nullfs อาจใช้งานได้ภายใต้ตัวแปร BSD อื่น ๆ (OS X, OpenBSD, NetBSD) แต่ไม่ได้รวบรวมเป็นส่วนหนึ่งของระบบเริ่มต้น

Linux ผูกติด

ภายใต้ Linux, การเชื่อมต่อ bind จะพร้อมใช้งานเป็นคุณลักษณะเคอร์เนล คุณสามารถสร้างได้ด้วยmountคำสั่งโดยผ่าน--bindตัวเลือกบรรทัดคำสั่งหรือbindตัวเลือกเมา คำสั่งสองคำสั่งต่อไปนี้เทียบเท่ากัน:

mount --bind /some/where /else/where
mount -o bind /some/where /else/where

ที่นี่“ อุปกรณ์” /some/whereไม่ใช่พาร์ติชั่นดิสก์เหมือนในกรณีของระบบไฟล์บนดิสก์ แต่เป็นไดเรกทอรีที่มีอยู่ จุดเมานท์/else/whereต้องเป็นไดเรกทอรีที่มีอยู่ตามปกติ โปรดทราบว่าไม่มีการระบุประเภทระบบไฟล์ด้วยวิธีใดวิธีหนึ่ง: การสร้างการเชื่อมโยงไม่เกี่ยวข้องกับไดรเวอร์ระบบไฟล์ แต่จะคัดลอกโครงสร้างข้อมูลเคอร์เนลจากการเมาท์ดั้งเดิม

mount --bindยังสนับสนุนการเมาท์ไดเร็กทอรีที่ไม่ใช่ไดเร็กทอรี: /some/whereสามารถเป็นไฟล์ปกติ (ซึ่งในกรณีนี้/else/whereจำเป็นต้องเป็นไฟล์ปกติด้วย)

Linux bind mount นั้นส่วนใหญ่แยกไม่ออกจากต้นฉบับ คำสั่งdf -T /else/whereแสดงอุปกรณ์เดียวกันและระบบไฟล์ชนิดdf -T /some/whereเดียวกัน ไฟล์/some/where/fooและ/else/where/fooแยกไม่ออกราวกับว่าพวกเขามีการเชื่อมโยงอย่างหนัก เป็นไปได้ที่จะยกเลิกการต่อเชื่อม/some/whereซึ่งในกรณีนี้/else/whereยังคงติดตั้งอยู่

ด้วยเมล็ดที่เก่ากว่า (ฉันไม่รู้ว่าเมื่อไหร่ฉันคิดว่าจนถึง 3.x) การผูกภูเขาจะแยกไม่ออกจากต้นฉบับ เคอร์เนลล่าสุดจะติดตามการเมานต์ bind และเปิดเผยข้อมูลผ่าน PID / mountinfo ซึ่งอนุญาตให้findmntระบุการเชื่อม bind เช่นนี้

คุณสามารถใส่รายการเชื่อมโยงเมาท์/etc/fstabได้ เพียงรวมbind(หรือrbindอื่น ๆ ) ในตัวเลือกพร้อมกับตัวเลือกอื่น ๆ ที่คุณต้องการ "อุปกรณ์" เป็นต้นไม้ที่มีอยู่ คอลัมน์ระบบไฟล์สามารถมีnoneหรือbind(มันถูกละเว้น แต่การใช้ชื่อระบบไฟล์อาจสร้างความสับสน) ตัวอย่างเช่น:

/some/where /readonly/view none bind,ro

หากมีจุดเมาภายใต้เนื้อหาของพวกเขาจะไม่สามารถมองเห็นภายใต้/some/where /else/whereแทนที่จะbindคุณสามารถใช้ยังทำซ้ำจุดเชื่อมใต้rbind /some/whereตัวอย่างเช่นถ้า/some/where/mntเป็นจุดเมานต์แล้ว

mount --rbind /some/where /else/where

เทียบเท่ากับ

mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt

นอกจากนี้ยังช่วยให้ลินุกซ์เมาท์จะได้รับการประกาศให้เป็นที่ใช้ร่วมกัน , ทาส , ส่วนตัวหรือunbindable สิ่งนี้มีผลต่อการดำเนินการเมานต์นั้นจะสะท้อนภายใต้การเชื่อมต่อแบบเชื่อมที่ทำซ้ำจุดเมานท์ สำหรับรายละเอียดเพิ่มเติมโปรดดูที่เอกสาร kernel

ลินุกซ์ยังให้วิธีการย้ายเมานท์: ที่--bindคัดลอก--moveย้ายจุดเมานท์

เป็นไปได้ที่จะมีตัวเลือกการเมานต์ที่แตกต่างกันในสองไดเรคทอรี่ที่ผูกเข้าด้วยกัน อย่างไรก็ตามมีการเล่นโวหาร: การทำให้การผูกติดตั้งและการตั้งค่าตัวเลือกการเมานต์ไม่สามารถทำได้แบบอะตอมมิกพวกเขาต้องดำเนินการต่อเนื่องสองครั้ง (เคอร์เนลที่เก่ากว่าไม่อนุญาตสิ่งนี้) ตัวอย่างเช่นคำสั่งต่อไปนี้สร้างมุมมองแบบอ่านอย่างเดียว แต่มีหน้าต่างเล็ก ๆ ของเวลาในระหว่างที่/else/whereอ่าน - เขียน:

mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where

ฉันไม่สามารถผูกเมาท์ให้ทำงานได้!

หากระบบของคุณไม่รองรับ FUSE กลอุบายแบบคลาสสิกเพื่อให้ได้ผลเหมือนกันคือการเรียกใช้เซิร์ฟเวอร์ NFS ให้ทำการส่งออกไฟล์ที่คุณต้องการแสดง (อนุญาตการเข้าถึงlocalhost) และติดตั้งบนเครื่องเดียวกัน สิ่งนี้มีค่าใช้จ่ายที่สำคัญในแง่ของหน่วยความจำและประสิทธิภาพดังนั้นการเชื่อมต่อแบบผูกจึงมีข้อได้เปรียบแน่นอนหากมี (ซึ่งอยู่ในรุ่น Unix ส่วนใหญ่ต้องขอบคุณ FUSE)

ใช้กรณี

มุมมองแบบอ่านอย่างเดียว

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

ด้วย bindfs:

bindfs -r /some/where /mnt/readonly

ด้วย Linux วิธีง่ายๆ:

mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly

การทำเช่นนี้จะทำให้ช่วงเวลาสั้น ๆ ระหว่างที่/mnt/readonlyอ่าน - เขียน หากนี่เป็นข้อกังวลด้านความปลอดภัยอันดับแรกให้สร้างการเชื่อมต่อเชื่อมโยงในไดเรกทอรีที่มีเพียงรูทเท่านั้นที่สามารถเข้าถึงทำให้เป็นแบบอ่านอย่างเดียวจากนั้นย้ายไปยังตำแหน่งเมานท์สาธารณะ ในตัวอย่างด้านล่างโปรดทราบว่าสิ่งสำคัญคือ/root/private(ไดเรกทอรีด้านบนจุดเชื่อมต่อ) เป็นส่วนตัว การอนุญาตดั้งเดิมที่/root/private/mntไม่เกี่ยวข้องเนื่องจากถูกซ่อนอยู่หลังจุดเมานท์

mkdir -p /root/private/mnt
chmod 700 /root/private
mount --bind /some/where /root/private/mnt
mount -o remount,ro,bind /root/private/mnt
mount --move /root/private/mnt /mnt/readonly

ทำการแมปผู้ใช้และกลุ่มใหม่

ระบบไฟล์บันทึกผู้ใช้และกลุ่มด้วยรหัสตัวเลข บางครั้งคุณอาจใช้หลาย ๆ ระบบที่กำหนด ID ผู้ใช้ที่แตกต่างกันให้กับบุคคลเดียวกัน นี่ไม่ใช่ปัญหาการเข้าถึงเครือข่าย แต่จะทำให้ ID ผู้ใช้ไม่มีความหมายเมื่อคุณนำข้อมูลจากระบบหนึ่งไปยังอีกระบบหนึ่งบนดิสก์ สมมติว่าคุณมีดิสก์ที่สร้างด้วยระบบไฟล์ที่มีผู้ใช้หลายคน (เช่น ext4, btrfs, zfs, UFS, …) ในระบบที่ Alice มี ID ผู้ใช้ 1000 และ Bob มี ID ผู้ใช้ 1001 และคุณต้องการทำให้ดิสก์นั้นสามารถเข้าถึงได้ ระบบที่ Alice มี ID ผู้ใช้ 1001 และ Bob มี ID ผู้ใช้ 1000 หากคุณต่อดิสก์โดยตรงไฟล์ของ Alice จะปรากฏขึ้นเป็นของ Bob (เพราะ ID ผู้ใช้คือ 1001) และไฟล์ของ Bob จะปรากฏเป็นของ Alice (เพราะ ID ผู้ใช้คือ 1000)

คุณสามารถใช้ bindfs เพื่อทำการแมป ID ผู้ใช้ใหม่ ก่อนอื่นให้ติดตั้งดิสก์พาร์ติชันในไดเรกทอรีส่วนตัวซึ่งมีเพียงรูทเท่านั้นที่สามารถเข้าถึงได้ จากนั้นสร้างมุมมอง bindfs ในพื้นที่สาธารณะด้วย ID ผู้ใช้และ ID กลุ่ม remaps ที่แลกเปลี่ยน ID ผู้ใช้และ ID กลุ่มของ Alice และ Bob

mkdir -p /root/private/alice_disk /media/alice_disk
chmod 700 /root/private
mount /dev/sdb1 /root/private/alice_disk
bindfs --map=1000/1001:1001/1000:@1000/1001:@1001/1000 /root/private/alice_disk /media/alice_disk

ดูที่หนึ่งไฟล์ที่อนุญาตให้เข้าถึงได้อย่างไรในโฟลเดอร์หลักของผู้ใช้ที่ไม่บู๊ตระบบ และเมานท์ - ผูกผู้ใช้อื่นเป็นตัวฉันอีกตัวอย่างหนึ่ง

ติดตั้งในคุกหรือตู้คอนเทนเนอร์

คุก chrootหรือภาชนะวิ่งกระบวนการในทรีย่อยของต้นไม้ไดเรกทอรีระบบฯ สิ่งนี้มีประโยชน์ในการเรียกใช้โปรแกรมที่มีการ จำกัด การเข้าถึงเช่นใช้เซิร์ฟเวอร์เครือข่ายที่มีการเข้าถึงเฉพาะไฟล์ของตัวเองและไฟล์ที่ให้บริการ แต่ไม่รวมถึงข้อมูลอื่นที่เก็บไว้ในคอมพิวเตอร์เครื่องเดียวกัน) ข้อ จำกัด ของ chroot คือโปรแกรมถูก จำกัด อยู่ที่ทรีย่อย: มันไม่สามารถเข้าถึงทรีย่อยได้ การเชื่อมต่อแบบผูกช่วยให้การต่อกิ่งต้นไม้ย่อยอื่น ๆ บนต้นไม้หลักนั้นได้ สิ่งนี้ทำให้พวกมันเป็นพื้นฐานของการใช้งานจริงของคอนเทนเนอร์ภายใต้ Linux

ตัวอย่างเช่นสมมติว่าเครื่องวิ่งบริการซึ่งควรจะมีเพียงการเข้าถึงข้อมูลภายใต้/usr/sbin/somethingd /var/lib/somethingแผนผังไดเร็กทอรีที่เล็กที่สุดที่มีทั้งไฟล์เหล่านี้คือรูท บริการจะถูก จำกัด อย่างไร? หนึ่งเป็นไปได้ที่จะทำให้การเชื่อมโยงอย่างหนักกับไฟล์ทั้งหมดที่ความต้องการบริการ (อย่างน้อย/usr/sbin/somethingdและห้องสมุดที่ใช้ร่วมกันหลาย ๆ คน) /var/lib/somethingภายใต้ แต่นี่เป็นสิ่งที่ยุ่งยาก (ฮาร์ดลิงก์ต้องได้รับการอัปเดตเมื่อใดก็ตามที่มีการอัปเกรดไฟล์) และจะไม่ทำงานหาก/var/lib/somethingและ/usrอยู่ในระบบไฟล์ที่แตกต่างกัน ทางออกที่ดีกว่าคือการสร้างรากเฉพาะกิจและเติมด้วยการใช้การเมาท์:

mkdir /run/something
cd /run/something
mkdir -p etc/something lib usr/lib usr/sbin var/lib/something
mount --bind /etc/something etc/something
mount --bind /lib lib
mount --bind /usr/lib usr/lib
mount --bind /usr/sbin usr/sbin
mount --bind /var/lib/something var/lib/something
mount -o remount,ro,bind etc/something
mount -o remount,ro,bind lib
mount -o remount,ro,bind usr/lib
mount -o remount,ro,bind usr/sbin
chroot . /usr/sbin/somethingd &

เนมสเปซของการเมานต์ของ Linux จะกำหนดค่า chroots การเชื่อมต่อเชื่อมโยงเป็นวิธีที่เนมสเปซสามารถเติมข้อมูลด้วยวิธีที่ยืดหยุ่น ดูที่การทำให้กระบวนการอ่านไฟล์อื่นสำหรับชื่อไฟล์เดียวกันสำหรับตัวอย่าง

ใช้การกระจายที่แตกต่างกัน

การใช้ chroots อื่นคือการติดตั้งการกระจายตัวที่แตกต่างกันในไดเรกทอรีและเรียกใช้โปรแกรมจากมันถึงแม้ว่าพวกเขาต้องการไฟล์ที่เส้นทางฮาร์ดโค้ดที่ไม่มีอยู่หรือมีเนื้อหาต่าง ๆ ในระบบพื้นฐาน สิ่งนี้มีประโยชน์ตัวอย่างเช่นในการติดตั้งการกระจายแบบ 32 บิตบนระบบ 64 บิตที่ไม่สนับสนุนแพ็คเกจแบบผสมการติดตั้งรุ่นเก่าของการแจกจ่ายหรือการกระจายอื่น ๆ เพื่อทดสอบความเข้ากันได้เพื่อติดตั้งรีลีสใหม่เพื่อทดสอบ คุณสมบัติล่าสุดในขณะที่รักษาระบบฐานที่มั่นคง ฯลฯ ดูฉันจะรันโปรแกรม 32 บิตบน Debian / Ubuntu 64 บิตได้อย่างไร สำหรับตัวอย่างบน Debian / Ubuntu

สมมติว่าคุณมีการติดตั้งแพคเกจล่าสุดของการกระจายของคุณภายใต้ไดเรกทอรีที่คุณเรียกใช้โปรแกรมโดยสลับไปที่ไดเรกทอรีที่มี/f/unstable chroot /f/unstableในการทำให้โฮมไดเร็กทอรีพร้อมใช้งานจากการติดตั้งนี้ให้ผูกเมานต์เหล่านั้นลงใน chroot:

mount --bind /home /f/unstable/home

โปรแกรมschrootทำสิ่งนี้โดยอัตโนมัติ

การเข้าถึงไฟล์ที่ซ่อนอยู่หลังจุดเมานท์

เมื่อคุณเมานต์ระบบไฟล์ในไดเรกทอรีนี้จะซ่อนสิ่งที่อยู่เบื้องหลังไดเรกทอรี ไฟล์ในไดเรกทอรีนั้นไม่สามารถเข้าถึงได้จนกว่าไดเรกทอรีนั้นจะถูก unmount เนื่องจาก BSD nullfs และ Linux bind mounts ทำงานที่ระดับต่ำกว่าโครงสร้างพื้นฐาน mount, nullfs mount หรือ bind mount ของระบบไฟล์จะแสดงไดเรกทอรีที่ซ่อนอยู่ด้านหลัง submounts ในต้นฉบับ

ตัวอย่างเช่นสมมติว่าคุณมีระบบแฟ้ม tmpfs /tmpติดตั้งที่ หากมีไฟล์อยู่ภายใต้/tmpเมื่อระบบไฟล์ tmpfs ถูกสร้างขึ้นไฟล์เหล่านี้อาจยังคงอยู่ไม่สามารถเข้าถึงได้อย่างมีประสิทธิภาพ แต่กินพื้นที่ดิสก์ วิ่ง

mount --bind / /mnt

(Linux) หรือ

mount -t nullfs / /mnt

(FreeBSD) /mntเพื่อสร้างมุมมองของระบบแฟ้มรากที่ ไดเร็กทอรี/mnt/tmpคือหนึ่งจากระบบไฟล์รูท

NFS เอ็กซ์พอร์ตที่พา ธ ที่ต่างกัน

เซิร์ฟเวอร์ NFS บางตัว (เช่นเซิร์ฟเวอร์ Linux เคอร์เนล NFS ก่อน NFSv4) โฆษณาตำแหน่งของไดเรกทอรีที่แท้จริงเสมอเมื่อพวกเขาส่งออกไดเรกทอรี นั่นคือเมื่อมีการร้องขอของลูกค้าเซิร์ฟเวอร์ให้บริการต้นไม้ที่ตั้งserver:/requested/location /requested/locationบางครั้งเป็นที่พึงปรารถนาที่จะอนุญาตให้ลูกค้าร้องขอ/request/locationแต่ให้บริการไฟล์/actual/locationจริง หากเซิร์ฟเวอร์ NFS ของคุณไม่รองรับการให้บริการตำแหน่งอื่นคุณสามารถสร้างการเชื่อมต่อสำหรับคำขอที่ต้องการเช่น

/requested/location *.localdomain(rw,async)

ใน/etc/exportsและต่อไปนี้ใน/etc/fstab:

/actual/location /requested/location bind bind

การแทนที่ลิงก์สัญลักษณ์

บางครั้งคุณต้องการที่จะทำให้การเชื่อมโยงสัญลักษณ์ที่จะทำให้ไฟล์ที่/some/where/is/my/fileปรากฏอยู่ภายใต้/else/whereแต่แอพลิเคชันที่ใช้ขยายการเชื่อมโยงสัญลักษณ์และปฏิเสธfile /some/where/is/my/fileผูกติดสามารถทำงานรอบนี้ผูกติด/some/where/is/myไป/else/where/is/myแล้วrealpathจะรายงาน/else/where/is/my/fileจะอยู่ภายใต้/else/where, /some/whereไม่อยู่ภายใต้

ผลข้างเคียงของการผูกติด

สำรวจเส้นทางแบบเรียกซ้ำ

หากคุณใช้ bind mounts คุณต้องดูแลแอพพลิเคชั่นที่สำรวจทรีของระบบไฟล์ซ้ำเช่นการสำรองข้อมูลและการจัดทำดัชนี (เช่นการสร้างฐานข้อมูลค้นหา )

โดยปกติแล้วการเชื่อมต่อแบบโยงควรถูกแยกออกจากทราฟฟิกไดเร็กทอรีแบบเรียกซ้ำเพื่อให้ทรีไดเรกทอรีแต่ละทราฟฟิกครั้งเดียวที่ตำแหน่งเดิม ด้วย bindfs และ nullfs กำหนดค่าเครื่องมือการแวะผ่านเพื่อละเว้นประเภทระบบไฟล์เหล่านี้ถ้าเป็นไปได้ ไม่รู้จักการเชื่อมต่อ Linux bind: ตำแหน่งใหม่เทียบเท่ากับต้นฉบับ ด้วย Linux bind mounts หรือด้วยเครื่องมือที่สามารถแยกพา ธ และไม่ใช่ประเภทระบบไฟล์ได้คุณต้องแยกจุดเมานท์สำหรับ bind mounts

traversals ที่หยุดที่ขอบเขตระบบแฟ้ม (เช่นfind -xdev, rsync -x, du -x, ... ) จะหยุดโดยอัตโนมัติเมื่อพวกเขาพบ bindfs หรือ nullfs จุดติดเพราะที่จุดติดตั้งเป็นระบบไฟล์ที่แตกต่างกัน ด้วย Linux bind mounts สถานการณ์จะซับซ้อนกว่านี้เล็กน้อย: มีขอบเขตของระบบไฟล์เฉพาะเมื่อการผูก bind mount เป็นการกราฟต์ระบบไฟล์ที่แตกต่างกันไม่ใช่ว่าจะทำการกราฟต์ส่วนอื่นของระบบไฟล์เดียวกัน

จะไปไกลกว่าผูกติด

Bind mounts จัดเตรียมมุมมองของแผนผังไดเร็กทอรีที่ตำแหน่งอื่น พวกเขาเปิดเผยไฟล์เดียวกันอาจมีตัวเลือกการเมานท์ที่แตกต่างกันและ (ด้วย bindfs) ความเป็นเจ้าของและสิทธิ์ที่แตกต่างกัน แฟ้มที่นำเสนอมุมมองที่เปลี่ยนแปลงของต้นไม้ไดเรกทอรีจะเรียกว่าระบบไฟล์ภาพซ้อนทับหรือfilesystems วางซ้อนกันได้ มีระบบไฟล์ซ้อนทับอื่น ๆ อีกมากมายที่ดำเนินการแปลงขั้นสูงมากขึ้น นี่คือบางส่วนที่พบบ่อย หากกรณีการใช้งานที่คุณต้องการไม่ครอบคลุมที่นี่ตรวจสอบพื้นที่เก็บข้อมูลของระบบไฟล์ FUSE

กรองไฟล์ที่มองเห็นได้

  • clamfs - เรียกใช้ไฟล์ผ่านเครื่องสแกนไวรัสเมื่อมีการอ่าน
  • filterfs - ซ่อนบางส่วนของระบบไฟล์
  • rofs - มุมมองแบบอ่านอย่างเดียว คล้ายกับbindfs -rน้ำหนักเบาเพียงเล็กน้อย
  • ม้ายูเนี่ยน - ปัจจุบันระบบไฟล์หลาย ๆ (เรียกว่าสาขา ) ภายใต้ไดเรกทอรีเดียว: ถ้าtree1มีfooและtree2มีbarแล้วมุมมองของสหภาพของพวกเขามีทั้งและfoo barไฟล์ใหม่จะถูกเขียนไปยังสาขาเฉพาะหรือสาขาที่เลือกตามกฎที่ซับซ้อนมากขึ้น แนวคิดนี้มีการใช้งานหลายอย่างรวมไปถึง:

แก้ไขชื่อไฟล์และข้อมูลเมตา

  • ciopfs - ชื่อไฟล์ที่คำนึงถึงขนาดตัวพิมพ์ (สามารถเป็นประโยชน์ในการเมานต์ระบบไฟล์ Windows)
  • convmvfs - แปลงชื่อไฟล์ระหว่างชุดอักขระ ( ตัวอย่าง )
  • posixovl - จัดเก็บชื่อไฟล์ Unix และข้อมูลเมตาอื่น ๆ (สิทธิ์, ความเป็นเจ้าของ, ... ) ในระบบไฟล์ที่ จำกัด เช่น VFAT ( ตัวอย่าง )

ดูเนื้อหาไฟล์ที่เปลี่ยนแปลง

  • avfs - สำหรับแต่ละไฟล์เก็บนำเสนอไดเรกทอรีที่มีเนื้อหาของการจัดเก็บข้อมูล ( ตัวอย่างเช่น , ตัวอย่างเพิ่มเติม ) นอกจากนี้ยังมีระบบไฟล์ FUSE ที่เปิดเผยที่เก็บเฉพาะไดเรกทอรี
  • fuseflt - เรียกใช้ไฟล์ผ่านไปป์ไลน์เมื่ออ่านไฟล์เช่นเพื่อถอดรหัสไฟล์ข้อความหรือไฟล์มีเดีย ( ตัวอย่าง )
  • lzopfs - การบีบอัดโปร่งใสของไฟล์บีบอัด
  • mp3fs - transcode ไฟล์ FLAC เป็น MP3 เมื่อพวกเขาอ่าน ( ตัวอย่าง )
  • scriptfs - รันสคริปต์เพื่อให้บริการเนื้อหา (ประเภท CGI ท้องถิ่น) ( ตัวอย่าง )

ปรับเปลี่ยนวิธีการจัดเก็บเนื้อหา

  • chironfs - ทำซ้ำไฟล์ไปยังที่จัดเก็บข้อมูลหลายชุด ( RAID-1 ที่ระดับแผนผังไดเรกทอรี )
  • copyfs - เก็บสำเนาของไฟล์ทุกเวอร์ชัน
  • encfs - ไฟล์เข้ารหัส
  • pcachefs - เลเยอร์แคชบนดิสก์สำหรับระบบไฟล์ระยะไกลที่ช้า
  • simplecowfs - จัดเก็บการเปลี่ยนแปลงผ่านมุมมองที่ให้ไว้ในหน่วยความจำทำให้ไฟล์ต้นฉบับไม่เปลี่ยนแปลง
  • wayback - เก็บสำเนาของไฟล์ทุกเวอร์ชัน

1
หนึ่งอาจต้องการเพิ่มตัวอย่างของวิธีการทำกับ systemd: utcc.utoronto.ca/~cks/space/blog/linux/SystemdBindMountUnits
dothebart

1
อะไรmount --bind /dir1 /dir1ทำอย่างไร มันแตกต่างจากเคสที่แหล่งที่มาและเป้าหมายของการติดตั้งแตกต่างกันอย่างไร?
ทำเครื่องหมาย

ฉันไม่เห็นบันทึกใด ๆ ใน / proc / self / mountinfo โดยใช้ linux 5.0 เคอร์เนลไม่ได้บอกฉันว่ามันผูกติดหรือไม่ และกระบวนการสามารถทำลาย chroot ได้ง่ายการแยกต้องทำโดยการเมาท์เนมสเปซ
炸鱼薯条德里克

@炸鱼薯条德里克ผมคิดว่าคำถามที่เชื่อมโยงunix.stackexchange.com/questions/295525/.../proc/self/mountinfoอยู่ สำหรับ chroot มันสามารถใช้สำหรับการแยก แต่ไม่ได้อยู่ในตัวของมันเอง คุณไม่ต้องการเมานต์เนมสเปซแม้ว่า: chroot ก็เพียงพอสำหรับส่วนของระบบไฟล์เนมสเปซ คุณจำเป็นต้องตรวจสอบให้แน่ใจว่าไม่มีกระบวนการใดใน chroot รันในฐานะผู้ใช้เดียวกันกับกระบวนการนอก chroot
Gilles

@Mark Bind การติดตั้งไดเรกทอรีเข้ากับตัวเองนั้นไม่มีประโยชน์มากนัก ฉันเดาว่าคุณสามารถใช้มันเพื่อซ่อนระบบไฟล์ที่ติดตั้งภายใต้ไดเรกทอรีบางอย่าง แต่ฉันไม่สามารถนึกถึงเวลาที่ฉันต้องการทำเช่นนั้นโดยเฉพาะ
Gilles

-1

ง่าย ๆ เมื่อคุณใช้ bind mount ไฟล์หรือไดเร็กตอรี่ในเครื่องโฮสต์นั้นจะถูกเมาท์ลงในคอนเทนเนอร์ดังนั้นการเปลี่ยนแปลงใด ๆ ก็ตามที่อยู่ภายในไดเรคทอรีไฟล์ของเครื่องโฮสต์จะพร้อมใช้งานโดยอัตโนมัติภายในคอนเทนเนอร์ในไดเรคทอรี


นั่นเป็นวิธีหนึ่งในการใช้การผูกติด แต่การผูกติดในตัวเองไม่มีอะไรเกี่ยวข้องกับคอนเทนเนอร์ ฉันพูดถึงมันในคำตอบของฉัน แต่ภายใต้ชื่อ "คุก" มากกว่า "ตู้คอนเทนเนอร์"; การเพิ่ม“ container” จะเป็นการแก้ไขที่มีค่า (ฉันจะทำ) นี่เป็นคำอธิบายที่ไม่ดีด้วย: เหตุใดจึงพูดถึงว่าการเปลี่ยนแปลงที่เกิดขึ้นภายนอกนั้นมีอยู่ภายในโดยไม่ต้องพูดถึงรอบอื่น ๆ ด้วย?
Gilles
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.