it-swarm-eu.dev

Existují nějaké nevýhody z používání mount --bind jako náhrady za symbolické odkazy?

Symlinks mají omezení v tom, jak na ně mohou fungovat funkce jako ls, mv a cp, protože na rozdíl od příkazů Shell iniciovaných jako cd tyto funkce nemají informace o tom, jak uživatel přistoupil k adresáři s ohledem na logickou cestu (viz související post ). Vypadá to, že používáte mount --bind možnost místo toho může obejít a nabízí zvýšenou funkčnost a kompatibilitu s sambou a jinými souborovými servery, protože připojený adresář bude mít místo nezávislého propojení dvě nezávislé fyzické cesty.

Chtěl bych nahradit všechny své symbolické odkazy odkazy pomocí mount --bind varianta, ale to by znamenalo namontování více než 150 bodů v fstab. Existují nějaké problémy s výkonem, které by mohly potenciálně vyvstávat z tohoto nebo jiných nedostatků, které bych měl zvážit?

59
mrtrujiyo

S mount --bind, strom adresářů existuje na dvou (nebo více) místech v hierarchii adresářů. To může způsobit řadu problémů. Zálohy a další kopie souborů vyberou všechny kopie. Je obtížné určit, že chcete kopírovat souborový systém: skončíte tím, že zkopírujete soubory připojené dvakrát. Vyhledávání s find, grep -r, locate atd. budou procházet všemi kopiemi atd.

Nezískáte žádnou „zvýšenou funkčnost a kompatibilitu“ s vázáním. Vypadají jako jakýkoli jiný adresář, který většinou není žádoucí chování. Například Samba ve výchozím nastavení zobrazuje symbolické odkazy jako adresáře; s připojením mount nelze nic získat. Na druhé straně vazby mohou být užitečné k odhalení hierarchií adresářů nad NFS.

Nebudete mít žádné problémy s výkonem s vázáním. Co budete mít, jsou bolesti hlavy v administraci. Svázané připojení má svá použití, například zpřístupnění stromu adresářů z chrootu nebo odhalení adresáře skrytého bodem připojení (toto je obvykle přechodné použití, zatímco se mění struktura adresářů). Nepoužívejte je, pokud nemáte potřebu.

Pouze root může manipulovat s vázáním. Nelze je pohybovat běžnými prostředky; zamknou své umístění a adresáře předků.

Obecně řečeno, pokud předáte symbolický odkaz na příkaz, příkaz působí na samotný odkaz, pokud pracuje se soubory, a na cíl odkazu, pokud pracuje s obsahem souboru. To platí i pro adresáře. To je obvykle správná věc. Některé příkazy mají možnosti, jak zacházet se symbolickými odkazy odlišně, například ls -L, cp -d, rsync -l. Ať už se snažíte udělat cokoli, je mnohem pravděpodobnější, že symbolické odkazy jsou tím správným nástrojem, než aby byly svazky správným nástrojem.

Kromě co @Gilles napsal dříve, stojí za zmínku, že některé nástroje by mohly považovat adresář připojený k vázání za samostatný souborový systém. To může mít dopad na výkon nebo funkčnost, pokud program již nemůže předpokládat, že stejné číslo inodu odkazuje na stejný soubor (což není, pokud jsou na různých souborových systémech), tah nelze optimalizovat jako link-at- target-then-unlink-source, atd.

14
a CVn

Měli byste také chtít použít vazby připojování namísto symbolických odkazů, pokud se spoléháte na podporu, která nemusí být vždy na místě (například externí disk) a chcete si být jisti, že původní struktura adresáře je na místě, i když podpora selže nebo je odstraněn.

Například pokud chci ponechat/var/tmp na sd kartě, použiji mount bind, protože některé programy budou očekávat, že/var/tmp bude platný adresář, i když bude karta odebrána.

6
TopperH

Vyzkoušel jsem mount mount, abych vyřešil problém s instalací některých balíčků s pacman (archlinux, více o tom zde ) v systému, kde /var (jakož i /home a /usr/local) byly symlinks (napříč souborovými systémy: SSD na SATA).

Zpočátku to vypadalo skvěle, ale jak Gilles zdůraznil, locate vždy poskytl více výsledků pro jeden soubor, navzdory Prune_BIND_MOUNTS = "yes" řádek v /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

Při kopání o něco dále jsem zjistil, že složitější úchyty vázání mohou být správně prořezány:

$ 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

Bez možnosti Prune_BIND_MOUNT bych získal 3 výsledky:

$ 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 

Další problém s vázáním.

Samozřejmě lze manuálně přidat vazby (mountpoint nebo target) k PRUNEPATHS in /etc/updatedb.conf.

V nástrojích lze také použít mountpoint a různé stat příkazy nebo funkce pro zlepšení procházení souborového systému jak je zde navrženo

1
RockyRoad

Používám to takto:

/mnt/sdb1/.user_cache/User1_cache /home/User1/.cache none bind 0 0
/mnt/sdb1/.user_cache/User2_cache /home/User2/.cache none bind 0 0

Snažím se omezit zápisy na ssd připojený pomocí defaults,relatime,data=ordered,commit=600 0 1 také symlinked složky do mé ~, které nejsou IO kritické).

0
rochr4

Pokud jde o připojování svazků souborů, chovají se blíže k pevným odkazům než odkazy na odkazy. To může mít poněkud jemné důsledky, například:

# echo 1 > 1.txt
# touch 2.txt
# mount --bind 1.txt 2.txt
# cat 2.txt
1
# echo 1a > 1.txt
# cat 2.txt
1a

Zatím je to dobré, ale nyní zvažte, kolik programů (editory, správně napsané skripty atd.) Soubory skutečně upravuje:

# echo 1new > 1new.txt
# mv 1new.txt 1.txt
# cat 1.txt
1new
# cat 2.txt
1a

Pokud 2.txt byl symbolický odkaz na 1.txt pak by poslední příkaz měl výstup 1new, což by člověk pravděpodobně očekával.

To může způsobit některé jemné problémy: v systemd jsem používal BindReadOnlyPaths= , aby konkrétní služba použila jinou resolv.conf soubor než zbytek systému, ale ukázalo se, že je to podivné a podivné a těžko diagnostikovatelné způsoby, protože resolvconf nahradí zdrojový soubor za zády služby.

0
Etienne Dechamps