GNU/Linux >> Znalost Linux >  >> Linux

Bind Mount?

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).

Související:Jak ladit bash skript?

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 obsahuje foo a tree2 obsahuje bar pak jejich sjednocovací pohled obsahuje obě foo a bar . 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ů

Linux
  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  3. Příkaz pro zjištění, kde je disk připojen?

  1. Jak změnit montážní body?

  2. Připojit /tmp a /home k samostatnému pevnému disku?

  3. unix:///var/run/supervisor.sock žádný takový soubor

  1. Jak migrovat server DNS BIND na nový hardware?

  2. /sys/ dokumentace?

  3. Málo místa v /run