มีข้อเสียใด ๆ จากการใช้ mount - ผูกแทนการเชื่อมโยงสัญลักษณ์?


55

symlinks มีข้อ จำกัด ในการทำงานวิธีการเช่นls, mvและcpสามารถทำงานกับพวกเขาเพราะไม่เหมือนเปลือกริเริ่มคำสั่งเช่นcdฟังก์ชั่นเหล่านี้ไม่ได้มีข้อมูลเกี่ยวกับวิธีการใช้เข้าถึงไดเรกทอรีที่เกี่ยวกับเส้นทางตรรกะ (ดูที่เกี่ยวข้องกับการโพสต์ ) ดูเหมือนว่าการใช้mount --bindตัวเลือกนี้สามารถแก้ไขสิ่งนี้ได้โดยเพิ่มฟังก์ชั่นการใช้งานและความเข้ากันได้กับแซมบ้าและเซิร์ฟเวอร์ไฟล์อื่น ๆ เพราะไดเรกทอรีที่เมาท์จะมีเส้นทางฟิสิคัลที่เป็นอิสระสองเส้นทางแทนที่จะเป็นลิงค์

ฉันต้องการแทนที่ลิงก์สัญลักษณ์ทั้งหมดของฉันด้วยการอ้างอิงโดยใช้mount --bindตัวเลือก แต่นี่หมายถึงการติดตั้งมากกว่า 150 จุดใน fstab มีปัญหาเรื่องประสิทธิภาพที่อาจเกิดขึ้นจากสิ่งนี้หรือข้อเสียอื่น ๆ ที่ฉันควรพิจารณาหรือไม่?


คุณคิดว่าใช้ฮาร์ดลิงก์หรือไม่?
ire_and_curses

1
@ire_and_curses ระบบที่เหมือน Unix ส่วนใหญ่ห้ามการเชื่อมโยงอย่างหนักเพื่อเหตุผลที่ดี (และด้วยเหตุผลเดียวกันคุณไม่ควรใช้มันในระบบที่คุณสามารถทำได้)
Eliah Kagan

3
@ire_and_curses: เพื่อชี้แจงคำสั่งของ Eliah คุณไม่สามารถสร้างฮาร์ดลิงก์ไปยังไดเรกทอรี (แม้ว่า HFS + จะสนับสนุนในทางใดทางหนึ่ง) และการสร้างแผนผังแบบเรียกซ้ำของฮาร์ดลิงก์ไม่ทำให้ทั้งสองเส้นทางไดเรกทอรีตรงกัน
บาฮามา

คำตอบ:


62

ด้วยmount --bindต้นไม้ไดเรกทอรีอยู่ในสอง (หรือมากกว่า) ในลำดับชั้นไดเรกทอรี สิ่งนี้อาจทำให้เกิดปัญหาจำนวนหนึ่ง การสำรองข้อมูลและสำเนาไฟล์อื่น ๆ จะเลือกสำเนาทั้งหมด เป็นการยากที่จะระบุว่าคุณต้องการคัดลอกระบบไฟล์: คุณจะสิ้นสุดการคัดลอกไฟล์ที่ผูกติดสองครั้ง การค้นหาด้วยfind, grep -r, locateฯลฯ จะสำรวจสำเนาทั้งหมดและอื่น ๆ

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

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

เฉพาะ root เท่านั้นที่สามารถจัดการการเชื่อมต่อ bind พวกเขาไม่สามารถขยับได้ด้วยวิธีธรรมดา พวกเขาล็อคตำแหน่งและไดเรกทอรีบรรพบุรุษ

โดยทั่วไปหากคุณส่งลิงก์สัญลักษณ์ไปยังคำสั่งคำสั่งจะดำเนินการกับลิงก์เองหากทำงานกับไฟล์และอยู่บนเป้าหมายของลิงก์หากดำเนินการกับเนื้อหาไฟล์ สิ่งนี้จะไปในไดเรกทอรีด้วย นี่คือสิ่งที่ถูกต้อง บางคำสั่งมีตัวเลือกในการรักษาการเชื่อมโยงสัญลักษณ์ที่แตกต่างกันเช่นls -L, ,cp -d rsync -lไม่ว่าคุณจะพยายามทำอะไรมันมีโอกาสมากที่ symlink จะเป็นเครื่องมือที่เหมาะสมกว่าผูกติดเป็นเครื่องมือที่เหมาะสม


ขอบคุณ ฉันคิดว่าฉันไม่ได้พิจารณาถึงผลกระทบของการสำรองข้อมูลคัดลอกและค้นหาไฟล์ ฉันสามารถให้แซมบ้าติดตาม symlink ได้โดยเพิ่ม 'follow symlinks = ใช่' ใน smb.conf แต่สิ่งนี้จะลดความปลอดภัยลงซึ่งผู้ใช้ samba ทุกคนสามารถดำเนินการพูด 'ln -s / etc' ในโฟลเดอร์ที่เขียนได้และได้รับ เข้าถึงไฟล์ระบบ ฉันพยายามหาวิธีแก้ไขปัญหานี้ โปรดแจ้งให้เราทราบหากคุณรู้จัก
mrtrujiyo

2
@mrtrujiyo สำหรับความต้องการนั้นฉันคิดว่ามันน่าจะใช้เซิร์ฟเวอร์ samba ใน chroot และผูกไดเรกทอรีที่คุณต้องการส่งออกภายใน chroot ตรวจสอบให้แน่ใจว่าได้แยกรากของ chroot ออกจากการสำรองข้อมูลและอื่น ๆ (ด้วยองค์กรนี้คุณจะต้องยกเว้นไดเรกทอรีระดับบนสุดหนึ่งไดเรกทอรีเท่านั้นดังนั้นจึงไม่ต้องกังวลเรื่องการบำรุงรักษามากนัก)
Gilles 'หยุดความชั่วร้าย'

14

นอกเหนือจากสิ่งที่ @Gilles เขียนไว้ก่อนหน้านี้เป็นสิ่งที่ควรสังเกตว่ายูทิลิตี้บางอย่างอาจพิจารณาว่าไดเรกทอรีที่ผูกเข้าด้วยกันนั้นเป็นระบบไฟล์แยกต่างหาก สิ่งนี้อาจมีประสิทธิภาพหรือฟังก์ชั่นการใช้งานหากโปรแกรมไม่สามารถสันนิษฐานได้ว่าหมายเลขไอโหนดเดียวกันอ้างถึงไฟล์เดียวกัน (ซึ่งถ้าหากมันไม่ได้อยู่ในระบบไฟล์ที่แตกต่างกัน) การย้ายไม่สามารถปรับให้เหมาะกับการเชื่อมโยงได้ target-then-unlink-source เป็นต้น


ขอบคุณ ฉันสงสัยว่ายูทิลิตี้อย่างง่ายเช่น df และ du จะจัดการการคำนวณขนาดไดเรกทอรีในระบบไฟล์ที่มีการเชื่อมต่อผูกได้อย่างไร
mrtrujiyo

1
อย่างน้อย GNU dfในระบบของฉันไม่ได้พิจารณาไดเรกทอรีติดตั้งผูกติดอยู่โดยค่าเริ่มต้น แต่ถ้าถามเฉพาะมันจะถือว่าเป็นเมานต์อื่นของระบบไฟล์เดียวกัน (ซึ่งถ้าคุณถามฉันคาดว่าพฤติกรรมการใช้เครื่องมือที่มีวัตถุประสงค์ของ DF.)
CVn

6

คุณควรต้องการใช้การเชื่อมต่อแบบเชื่อมแทนการเชื่อมโยงเมื่อคุณใช้การสนับสนุนที่อาจไม่ได้อยู่ในสถานที่เสมอ (เช่นดิสก์ภายนอก) และคุณต้องการให้แน่ใจว่าโครงสร้างไดเรกทอรีดั้งเดิมอยู่ในตำแหน่งแม้ว่าการสนับสนุน ล้มเหลวหรือถูกลบออก

ตัวอย่างเช่นถ้าฉันต้องการเก็บ / var / tmp ในการ์ด sd ฉันจะใช้การผูกติดตั้งเนื่องจากบางโปรแกรมจะคาดหวัง / var / tmp เป็นไดเรกทอรีที่ถูกต้องแม้ว่าจะลบการ์ด


1

ฉันได้ลองผูกติดตั้งเพื่อแก้ไขปัญหาการติดตั้งแพ็กเกจบางอย่างด้วยpacman(archlinux, เพิ่มเติมเกี่ยวกับที่นี่ ) บนระบบที่/var(รวมถึง/homeและ/usr/local) symlink (ข้ามระบบไฟล์: SSD ถึง SATA)

มันดูดีในตอนแรก แต่เป็นกิลส์ชี้locateให้เสมอผลหลายไฟล์เดียวแม้จะมีสายในPRUNE_BIND_MOUNTS = "yes"/etc/updatedb.conf

$ locate \*/findutils-4.4.2 | xargs ls -ldiog
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /SHARED/LOCALS/Manjaro/src/findutils-4.4.2
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /usr/local/src/findutils-4.4.2

ขุดอีกหน่อยฉันพบว่าการผูกที่ซับซ้อนมากขึ้นอาจถูกตัดอย่างถูกต้อง:

$ sudo mount --bind /SHARED/LOCALS/common/ /usr/local/common
$ findmnt | fgrep -n sdb
34:├─/SHARED/LOCALS                  /dev/sdb5           ext4           rw,relatime,data=ordered
35:│ └─/SHARED/LOCALS/Manjaro/common /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
36:├─/usr/local                      /dev/sdb5[/Manjaro] ext4            rw,relatime,data=ordered
37:│ └─/usr/local/common             /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
38:├─/SHARED/HOMES                   /dev/sdb4           ext4            rw,relatime,data=ordered
39:├─/home                           /dev/sdb4[/Manjaro] ext4            rw,relatime,data=ordered
40:├─/SHARED/VARS                    /dev/sdb3           ext4            rw,relatime,data=ordered
41:├─/var                            /dev/sdb3[/Manjaro] ext4            rw,relatime,data=ordered
42:└─/opt                            /dev/sdb5[/opt]     ext4            rw,relatime,data=ordered

$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
Rebuilding bind_mount_paths:
Matching bind_mount_paths:
Skipping `/SHARED/LOCALS/Manjaro/common': bind mount
Skipping `/usr/local/common': bind mount

$ locate \*/mmedia
/SHARED/LOCALS/common/mmedia

หากไม่มีตัวเลือก PRUNE_BIND_MOUNT ฉันจะได้ผลลัพธ์ 3 รายการ:

$ sudo sed -i '1 s/yes/no/' /etc/updatedb.conf 
$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
$ locate \*/mmedia
/SHARED/LOCALS/Manjaro/common/mmedia
/SHARED/LOCALS/common/mmedia
/usr/local/common/mmedia
$ sudo sed -i '1 s/no/yes/' /etc/updatedb.conf 

ปัญหาอื่นที่มีการเชื่อมโยงผูก:

แน่นอนหนึ่งสามารถเพิ่มม้าผูก (mounpoint หรือเป้าหมาย) ไป ในPRUNEPATHS/etc/updatedb.conf

นอกจากนี้ยังสามารถใช้คำสั่งหรือฟังก์ชั่นmountpointต่าง ๆstatในเครื่องมือเพื่อปรับปรุงการข้ามผ่านระบบไฟล์ตามที่เสนอไว้ที่นี่

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