Co je to „vázaná montáž“? Jak ho udělám? K čemu je to dobré?
Bylo mi řečeno, abych na něco použil spojovací držák, ale nerozumím tomu, co to je nebo jak to používat.
Přijatá odpověď:
Co je připojení k připojení?
Vazba je alternativní pohled na strom adresářů. Klasicky připojení vytváří pohled na úložné zařízení jako strom adresářů. Připojení vazby místo toho vezme existující strom adresářů a replikuje jej pod jiným bodem. Adresáře a soubory v připojeném připojení jsou stejné jako originál. Jakákoli úprava na jedné straně se okamžitě projeví na druhé straně, protože oba pohledy zobrazují stejná data.
Například po vydání příkazu Linux-
mount --bind /some/where /else/where
adresáře /some/where
a /else/where
mají stejný obsah, což je obsah /some/where
. (Pokud /else/where
nebyl prázdný, jeho předchozí obsah je nyní skrytý.)
Na rozdíl od pevného odkazu nebo symbolického odkazu nemá připojení k připojení vliv na to, co je uloženo v souborovém systému. Je to vlastnost živého systému.
Jak vytvořím připojení?
bindfs
bindfs
filesystem je souborový systém FUSE, který vytváří pohled na strom adresářů. Například příkaz
bindfs /some/where /else/where
vytvoří /else/where
přípojný bod, pod kterým je obsah /some/where
jsou viditelné.
Protože bindfs je samostatný souborový systém, soubory /some/where/foo
a /else/where/foo
se zobrazují jako různé soubory aplikací (souborový systém bindfs má svůj vlastní st_dev
hodnota). Jakákoli změna na jedné straně se „magicky“ projeví na druhé straně, ale skutečnost, že soubory jsou stejné, je patrná pouze tehdy, když člověk ví, jak bindfs funguje.
Bindfs nezná přípojné body, takže pokud je přípojný bod pod /some/where
, objeví se jako další adresář pod /else/where
. Připojení nebo odpojení souborového systému pod /some/where
se zobrazí pod /else/where
jako změna odpovídajícího adresáře.
Bindfs může změnit některá metadata souboru:může zobrazit falešná oprávnění a vlastnictví souborů. Podrobnosti naleznete v příručce a příklady naleznete níže.
Souborový systém bindfs lze připojit jako uživatel bez oprávnění root, potřebujete pouze oprávnění k připojení souborových systémů FUSE. V závislosti na vaší distribuci to může vyžadovat, abyste byli v fuse
skupiny nebo být povoleno všem uživatelům. Chcete-li odpojit souborový systém FUSE, použijte fusermount -u
místo umount
, např.
fusermount -u /else/where
nullf
FreeBSD poskytuje nullfs
souborový systém, který vytváří alternativní pohled na souborový systém. Následující dva příkazy jsou ekvivalentní:
mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where
Po zadání některého z příkazů /else/where
se stává přípojným bodem, ve kterém je obsah /some/where
jsou viditelné.
Protože nullfs je samostatný souborový systém, soubory /some/where/foo
a /else/where/foo
se zobrazují jako různé soubory pro aplikace (souborový systém nullfs má svůj vlastní st_dev
hodnota). Jakákoli změna na jedné straně se „magicky“ projeví na druhé straně, ale skutečnost, že soubory jsou stejné, je patrná pouze tehdy, když víme, jak nullfs funguje.
Na rozdíl od FUSE bindfs, který působí na úrovni adresářového stromu, nullfs FreeBSD působí hlouběji v jádře, takže připojujte body pod /else/where
nejsou viditelné:pouze strom, který je součástí stejného přípojného bodu jako /some/where
se odráží pod /else/where
.
Souborový systém nullfs může být použitelný pod jinými variantami BSD (OS X, OpenBSD, NetBSD), ale není zkompilován jako součást výchozího systému.
Linux bind mount
V Linuxu jsou připojení připojení k dispozici jako funkce jádra. Můžete jej vytvořit pomocí mount
předáním buď --bind
možnost příkazového řádku nebo bind
možnost montáže. Následující dva příkazy jsou ekvivalentní:
mount --bind /some/where /else/where
mount -o bind /some/where /else/where
Zde je „zařízení“ /some/where
není diskový oddíl jako v případě souborového systému na disku, ale existující adresář. Přípojný bod /else/where
musí to být existující adresář jako obvykle. Všimněte si, že není specifikován žádný typ souborového systému:vytvoření připojení k připojení nezahrnuje ovladač souborového systému, ale zkopíruje datové struktury jádra z původního připojení.
mount --bind
také podporuje připojení neadresáře na neadresář:/some/where
může být běžný soubor (v takovém případě /else/where
musí být také běžný soubor).
Linux bind mount je většinou k nerozeznání od originálu. Příkaz df -T /else/where
zobrazuje stejné zařízení a stejný typ souborového systému jako df -T /some/where
. Soubory /some/where/foo
a /else/where/foo
jsou k nerozeznání, jako by to byly pevné odkazy. Je možné odpojit /some/where
, v takovém případě /else/where
zůstane namontovaný.
Se staršími jádry (nevím přesně kdy, myslím, že až do nějakých 3.x) byly bind mounty skutečně k nerozeznání od originálu. Nedávná jádra sledují připojení připojení a zpřístupňují informace prostřednictvím PID /mountinfo, který umožňuje
findmnt
k označení připojení připojení jako takového.
Položky připojení vazby můžete umístit do /etc/fstab
. Stačí zahrnout bind
(nebo rbind
atd.) v možnostech spolu s dalšími požadovanými možnostmi. „Zařízení“ je existující strom. Sloupec souborového systému může obsahovat none
nebo bind
(je to ignorováno, ale použití názvu souborového systému by bylo matoucí). Například:
/some/where /readonly/view none bind,ro
Pokud jsou pod /some/where
přípojné body , jejich obsah není viditelný pod /else/where
. Místo bind
, můžete použít rbind
, také replikovat přípojné body pod /some/where
. Například pokud /some/where/mnt
je potom přípojný bod
mount --rbind /some/where /else/where
je ekvivalentní k
mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt
Kromě toho Linux umožňuje připojení deklarovat jako sdílené , otrok , soukromé nebo zrušitelné . To ovlivní, zda se tato operace připojení projeví pod připojením vazby, které replikuje bod připojení. Další podrobnosti naleznete v dokumentaci jádra.
Linux také poskytuje způsob, jak přesunout připojení:kde --bind
kopie, --move
přesune bod připojení.
Je možné mít různé možnosti připojení ve dvou adresářích připojených k vazbě. Je tu však jedna zvláštnost:vytvoření připojení k připojení a nastavení možností připojení nelze provést atomicky, musí to být dvě po sobě jdoucí operace. (Starší jádra to neumožňovala.) Například následující příkazy vytvářejí pohled pouze pro čtení, ale existuje malé časové okno, během kterého /else/where
je čtení a zápis:
mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where
Nemohu zprovoznit připojení k připojení!
Pokud váš systém nepodporuje FUSE, klasickým trikem, jak dosáhnout stejného efektu, je spustit NFS server a nechat jej exportovat soubory, které chcete zpřístupnit (umožnění přístupu k localhost
) a namontujte je na stejný stroj. To má značnou režii, pokud jde o paměť a výkon, takže připojení k připojení mají jednoznačnou výhodu, pokud jsou k dispozici (což je u většiny unixových variant díky FUSE).
Případy použití
Zobrazení pouze pro čtení
Může být užitečné vytvořit náhled souborového systému pouze pro čtení, ať už z bezpečnostních důvodů, nebo jen jako vrstvu zabezpečení, která zajistí, že jej náhodně nezměníte.
S bindfs:
bindfs -r /some/where /mnt/readonly
S Linuxem jednoduchý způsob:
mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly
Tím zůstane krátký časový interval, během kterého /mnt/readonly
je čtení-zápis. Pokud se jedná o bezpečnostní problém, nejprve vytvořte připojení připojení v adresáři, ke kterému má přístup pouze uživatel root, nastavte jej pouze pro čtení a poté jej přesuňte do veřejného bodu připojení. Ve úryvku níže si uvědomte, že je důležité, aby /root/private
(adresář nad bodem připojení) je soukromý; původní oprávnění na /root/private/mnt
jsou irelevantní, protože jsou skryty za bodem připojení.
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
Přemapování uživatelů a skupin
Souborové systémy zaznamenávají uživatele a skupiny podle jejich číselných ID. Někdy skončíte s více systémy, které stejné osobě přidělují různá uživatelská ID. To není problém s přístupem k síti, ale ID uživatelů ztrácí smysl, když přenášíte data z jednoho systému do druhého na disku. Předpokládejme, že máte disk vytvořený pomocí víceuživatelského souborového systému (např. ext4, btrfs, zfs, UFS, …) v systému, kde má Alice uživatelské ID 1000 a Bob má uživatelské ID 1001, a chcete tento disk zpřístupnit na systém, kde má Alice ID uživatele 1001 a Bob má ID uživatele 1000. Pokud disk připojíte přímo, soubory Alice se zobrazí jako vlastněné Bobem (protože ID uživatele je 1001) a Bobovy soubory se zobrazí jako vlastněné Alice (protože ID uživatele je 1000).
K přemapování ID uživatelů můžete použít bindfs. Nejprve připojte diskový oddíl do soukromého adresáře, kde k němu má přístup pouze root. Poté vytvořte pohled bindfs ve veřejné oblasti s přemapováním ID uživatele a ID skupiny, které vymění uživatelská ID Alice a Boba a ID skupiny.
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
Viz Jak lze povolit přístup k souborům v domovské složce uživatele nezavedeného systému? a mount –bind other user jako já další příklady.
Montáž ve vězení nebo kontejneru
Chroot vězení nebo kontejner spouští proces v podstromu stromového adresáře systému. To může být užitečné pro spuštění programu s omezeným přístupem, např. provozovat síťový server s přístupem pouze ke svým vlastním souborům a souborům, které obsluhuje, ale ne k jiným datům uloženým na stejném počítači). Omezení chroot je, že program je omezen na jeden podstrom:nemůže přistupovat k nezávislým podstromům. Bind mounts umožňují naroubování dalších podstromů na tento hlavní strom. To je činí základními pro nejpraktičtější použití kontejnerů pod Linuxem.
Předpokládejme například, že na počítači běží služba /usr/sbin/somethingd
který by měl mít přístup pouze k datům pod /var/lib/something
. Nejmenší adresářový strom, který obsahuje oba tyto soubory, je kořen. Jak může být služba omezena? Jednou z možností je vytvořit pevné odkazy na všechny soubory, které služba potřebuje (alespoň /usr/sbin/somethingd
a několik sdílených knihoven) pod /var/lib/something
. To je však těžkopádné (pevné odkazy je třeba aktualizovat při každé aktualizaci souboru) a nefunguje, pokud /var/lib/something
a /usr
jsou na různých souborových systémech. Lepším řešením je vytvořit ad hoc kořen a naplnit jej pomocí připojení:
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 &
Jmenné prostory Linuxu zobecňují chrooty. Bind mounts jsou způsoby, jak lze flexibilně naplnit jmenné prostory. Příklad viz Jak proces číst jiný soubor se stejným názvem souboru.
Spuštění jiné distribuce
Dalším využitím chrootů je instalace jiné distribuce do adresáře a spouštění programů z něj, i když vyžadují soubory na pevně zakódovaných cestách, které nejsou přítomny nebo mají jiný obsah v základním systému. To může být užitečné například pro instalaci 32bitové distribuce na 64bitový systém, který nepodporuje smíšené balíčky, pro instalaci starších vydání distribuce nebo jiných distribucí pro testování kompatibility, pro instalaci novější verze pro testování nejnovější funkce při zachování stabilního základního systému atd. Viz Jak spustím 32bitové programy na 64bitovém Debianu/Ubuntu? například na Debian/Ubuntu.
Předpokládejme, že máte instalaci nejnovějších balíčků vaší distribuce v adresáři /f/unstable
, kde spouštíte programy přepnutím do tohoto adresáře pomocí chroot /f/unstable
. Chcete-li z těchto instalací zpřístupnit domovské adresáře, připojte je k chrootu:
mount --bind /home /f/unstable/home
Program schroot to provede automaticky.
Přístup k souborům skrytým za přípojným bodem
Když připojíte souborový systém do adresáře, skryje to, co je za adresářem. Soubory v tomto adresáři se stanou nedostupnými, dokud nebude adresář odpojen. Protože připojení BSD nullf a připojení Linuxu fungují na nižší úrovni než infrastruktura připojení, připojení nulfs nebo připojení připojení souborového systému odhaluje adresáře, které byly v originále skryty za dílčími připojeními.
Související:Aktualizovat hodnoty souboru pomocí informací z jiného souboru?
Předpokládejme například, že máte souborový systém tmpfs připojený na /tmp
. Pokud byly soubory pod /tmp
když byl vytvořen souborový systém tmpfs, tyto soubory mohou stále zůstat, účinně nepřístupné, ale zabírají místo na disku. Spustit
mount --bind / /mnt
(Linux) nebo
mount -t nullfs / /mnt
(FreeBSD) k vytvoření pohledu na kořenový souborový systém na /mnt
. Adresář /mnt/tmp
je ten z kořenového souborového systému.
NFS exportuje různými cestami
Některé servery NFS (jako například server NFS s jádrem Linuxu před NFSv4) vždy při exportu adresáře inzerují skutečné umístění adresáře. To znamená, když klient požaduje server:/requested/location
, server obsluhuje strom v umístění /requested/location
. Někdy je žádoucí umožnit klientům požádat o /request/location
ale ve skutečnosti poskytuje soubory pod /actual/location
. Pokud váš server NFS nepodporuje poskytování alternativního umístění, můžete vytvořit připojení k očekávanému požadavku, např.
/requested/location *.localdomain(rw,async)
v /etc/exports
a následující v /etc/fstab
:
/actual/location /requested/location bind bind
Náhrada za symbolické odkazy
Někdy byste chtěli vytvořit symbolický odkaz na vytvoření souboru /some/where/is/my/file
zobrazí se pod /else/where
, ale aplikace, která používá file
rozšiřuje symbolické odkazy a odmítá /some/where/is/my/file
. Toto může obejít připojení připojení:bind-mount /some/where/is/my
na /else/where/is/my
a poté realpath
bude hlásit /else/where/is/my/file
být pod /else/where
, nikoli pod /some/where
.
Nežádoucí účinky spojovacích prvků
Rekurzivní procházení adresářů
Pokud používáte připojení připojení, musíte se postarat o aplikace, které procházejí strom souborového systému rekurzivně, jako jsou zálohy a indexování (např. k vytvoření lokalizační databáze).
Obvykle by připojení vázání měla být vyloučena z rekurzivního procházení adresářů, takže každý strom adresářů bude procházet pouze jednou, v původním umístění. S bindfs a nullfs nakonfigurujte nástroj procházení tak, aby ignoroval tyto typy souborových systémů, pokud je to možné. Připojení linuxových vazeb nelze jako taková rozpoznat:nové umístění je ekvivalentní původnímu. S připojeními linuxových vazeb nebo s nástroji, které mohou vyloučit pouze cesty a nikoli typy souborových systémů, musíte vyloučit přípojné body pro připojení připojení.
Průchody, které se zastaví na hranicích souborového systému (např. find -xdev
, rsync -x
, du -x
, …) se automaticky zastaví, když narazí na přípojný bod bindfs nebo nullfs, protože tento přípojný bod je jiný souborový systém. S připojením linuxových vazeb je situace trochu komplikovanější:hranice souborového systému existuje pouze v případě, že připojení připojení roubuje jiný souborový systém, nikoli v případě, že roubuje jinou část stejného souborového systému.
Překračování vazeb připojení
Připojení připojení poskytují pohled na strom adresářů na jiném místě. Vystavují stejné soubory, možná s různými možnostmi připojení a (s bindfs) odlišným vlastnictvím a oprávněními. Souborové systémy, které představují změněný pohled na strom adresářů, se nazývají překryvné souborové systémy nebo stohovatelné souborové systémy . Existuje mnoho dalších překryvných souborových systémů, které provádějí pokročilejší transformace. Zde je několik běžných. Pokud zde není pokryt váš požadovaný případ použití, zkontrolujte úložiště souborových systémů FUSE.
- loggedfs — protokolování všech přístupů k souborovému systému pro účely ladění nebo monitorování (syntaxe konfiguračního souboru, Je možné zjistit, který program nebo skript vytvořil daný soubor?, Seznam souborů, ke kterým program přistupuje)
Filtrovat viditelné soubory
-
clamfs — při čtení spouštět soubory pomocí antivirového skeneru
-
filterfs — skrytí částí souborového systému
-
rofs — zobrazení pouze pro čtení. Podobné jako
bindfs -r
, jen trochu lehčí. -
Sjednocená připojení — představují více souborových systémů (nazývaných větve ) pod jedním adresářem:if
tree1
obsahujefoo
atree2
obsahujebar
pak jejich sjednocovací pohled obsahuje oběfoo
abar
. Nové soubory se zapisují do konkrétní větve nebo do větve zvolené podle složitějších pravidel. Existuje několik implementací tohoto konceptu, včetně:- aufs — implementace linuxového jádra, ale mnohokrát odmítnutá upstream
- funionfs — implementace FUSE
- mhddfs — FUSE, zápis souborů do větve na základě volného místa
- overlay – implementace jádra Linuxu, začleněná do systému Linux v3.18
- unionfs-fuse — FUSE s funkcí ukládání do mezipaměti a kopírování při zápisu
Upravit názvy souborů a metadata
- ciopfs – názvy souborů bez ohledu na velikost písmen (mohou být užitečné pro připojení souborových systémů Windows)
- convmvfs – převod názvů souborů mezi znakovými sadami (příklad)
- posixovl – ukládání názvů souborů Unix a dalších metadat (oprávnění, vlastnictví, …) na více omezených souborových systémech, jako je VFAT (příklad)
Zobrazit obsah změněného souboru
- avfs — pro každý archivní soubor uveďte adresář s obsahem archivu (příklad, další příklady). Existuje také mnoho souborových systémů FUSE, které odhalují konkrétní archivy jako adresáře.
- fuseflt — spouštět soubory potrubím při jejich čtení, např. překódovat textové soubory nebo mediální soubory (příklad)
- lzopfs — transparentní dekomprese komprimovaných souborů
- mp3fs – překódování souborů FLAC na MP3 při jejich čtení (příklad)
- scriptfs – spouštění skriptů pro poskytování obsahu (jakýsi místní CGI) (příklad)
Upravit způsob ukládání obsahu
- chironfs – replikace souborů na více podkladových úložišť (RAID-1 na úrovni stromu adresářů)
- copyfs – uchovávat kopie všech verzí souborů
- encfs – šifrování souborů
- pcachefs — vrstva mezipaměti na disku pro pomalé vzdálené souborové systémy
- simplecoowfs – ukládejte změny prostřednictvím poskytnutého zobrazení do paměti, přičemž původní soubory zůstanou nedotčené
- wayback – uchovávat kopie všech verzí souborů