Pracoval jsem na projektu skriptování bash pro automatické sestavení Linuxu od nuly. Pokaždé, když procházím kód, najdu způsob, jak jej udělat čistším. Vezmu malou část kódu a vylepším to.
Onehdy jsem prováděl úpravu, abych zkontroloval, zda je souborový systém připojen před jeho připojením. Hledal jsem lepší způsob, jak to udělat. Nechtěl jsem použít obvyklý mount | grep nebo jakýkoli podobný kód. Chtěl jsem něco čistšího.
Mount vs Findmnt
Nevím proč, ale v tu chvíli jsem si říkal, proč se tak často připojuji k internetu, abych našel informace, které už mám na notebooku. Takže spustím man mount Rychle jsem se podíval na manuálovou stránku a všiml jsem si tohoto:
A tam jsem měl svou odpověď. Nejprve už nějakou dobu používám špatný příkaz. Zadruhé, Google nemá vždy nejlepší odpověď.
Ironií je, že to není zmíněno v online manuálových stránkách, které obvykle prohlížím. Přesvědčte se sami na manuálové stránce mount, findmnt je odkazováno pouze na konci. Kdybych prošel své běžné kanály, abych našel odpověď, nepsal bych tento článek.
Hned jsem byl velmi zvědavý, o kolik je tento findmnt lepší ? Kolik kanálů budu moci odstranit ze svých skriptů? Ukázalo se, že je to mnohem lepší než mount výpis. Nejprve porovnejme výchozí výstup každého příkazu.
Připojit výchozí výstup
Při pohledu na výše uvedený seznam připojeného souborového systému je snadné pochopit, proč se grep stal tak populární. Všechny informace tam jsou, ale lepší formát by usnadnil čtení. Abyste toho dosáhli, již byste potřebovali potrubí a externí příkaz. Nyní se podíváme na findmnt .
Findmnt výchozí výstup
To vypadá mnohem lépe. S findmnt se to zlepší již nebudete muset používat kombinaci nástrojů. Je velmi flexibilní a dává vám šanci napsat čistší kód, když je použit ve skriptu.
Praktické použití příkazu findmnt v Linuxu
Kontrola, zda je souborový systém připojen pomocí findmnt je mnohem jednodušší. Můžete zkontrolovat zdroj nebo cíl bez použití jakýchkoliv možností. Zadejte přípojný bod (cíl ) nebo zařízení (zdroj ) bez možnosti a findmnt se pokusí porovnat argument, který jste uvedli proti oběma.
findmnt /boot
Findmnt skutečně funguje jako vyhledávací příkaz pro souborový systém. Pokud budou nalezeny shody, budou vytištěny a findmnt vrátí 0. Pokud vašemu dotazu nic neodpovídá, findmnt nevytiskne nic a vrátí 1.
Dlouhý seznam možností obsahuje findmnt . Máte 2 hlavní kategorie možností, zužující vyhledávání a formátování výstupu.
Zúžení vyhledávání
Líbí se mi najít pro hledání souborů findmnt slouží k nalezení souborového systému. Již víte, jak omezit vyhledávání zadáním řetězce, který bude porovnán se SOURCE a TARGET. Pokud potřebujete zúžit vyhledávání na SOURCE nebo TARGET, použijte možnosti -S a -T.
Již v tomto okamžiku jsem byl prodán pomocí findmnt místo mount . Mohu se dotázat na oddíl, který chci. A dýmku nepoužívám. Findmnt tím nekončí, má mnoho možností navržených tak, aby vám poskytly výkonné prohledávání systému souborů.
Myslím, že jedna z nejzajímavějších možností je -O , –možnosti . -O možnosti vám umožní napsat seznam možností, s nimiž bude vaše vyhledávání srovnáno. Vyhledávání souborového systému pouze pro čtení je nyní stejně snadné jako findmnt -O ro.
-O volby mohou také obsahovat seznam oddělený čárkami. To vám umožní vyhledávat podle více možností a vypsat pouze souborový systém, který má všechny požadované možnosti.
Hledání daného typu souborového systému také nevyžaduje použití externích nástrojů. Jednoduše použijte -t možnosti. V níže uvedeném příkladu jsem uvedl všechny tmpfs mount.
Ve všech výše uvedených příkladech findmnt hledal /etc/fstab, /etc/mtab a /proc/self/mountinfo. Toto široké vyhledávání můžete snadno omezit pomocí následujících možností:
- –fstab (Zúžit vyhledávání pouze na /etc/fstab)
- –mtab (Zúžit vyhledávání pouze na /etc/mtab)
- –kernel (Hledejte pouze v /proc/self/mountinfo)
Další zajímavou možností je -i , –invertovat . Což převrací smysl pro shodu. V předchozím příkladu jsme uvedli všechny tmpfs pomocí -t volba. Níže uvedený příklad zobrazí seznam všech souborových systémů typu swap pouze z fstab.
findmnt --fstab -t swap
Tento zobrazí seznam všech systémů souborů kromě jakéhokoli typu swap.
findmnt --fstab -t swap -i
Již s danými možnostmi se můžete vyhnout používání spousty potrubí a externích programů. A tady to nekončí. Najít poskytuje dobrou sadu možností pro přizpůsobení výstupu výsledků vyhledávání.
Přizpůsobení výstupu příkazu findmnt
K odstranění záhlaví nebudete muset používat příkaz head. Jednoduše zavolejte na findmnt s -n možnost:
Nečekal jsem, že další možnost bude vůbec možností. Findmnt dokáže napodobit výstup příkazu df. Volání findmnt s -D nebo –df řekne findmnt pro zobrazení informací o prostoru pro každý uvedený souborový systém.
Možnosti lze kombinovat pro přesnější vyhledávání. V tomto dalším příkladu používám findmnt vypíše celý souborový systém z /etc/fstab a požádá o zobrazení informací df.
findmnt --fstab --df
Nevím jak vy, ale mě začíná findmnt bavit . Kromě těchto UUID s posledním příkazem. Chápu, je to dobrý způsob, jak identifikovat zařízení pro OS. Já bych chtěl lidsky čitelnější způsob. Toho dosáhnete pomocí -e možnost.
-e nebo –vyhodnotit možnost s převodem všech značek jako UUID, LABEL, PARTLABEL, PARTUUID na odpovídající název zařízení. Zobrazit výsledky, když spustím stejný příkaz s -e možnosti.
Líbí se mi způsob findmnt zformátujte jeho výstup. Je to lidštější. Na druhou stranu se s tímto formátem při použití ve skriptu může hůře manipulovat. Jednoduchý řádek po řádku, prostorově oddělený soubor dat by byl jednodušší. To lze snadno provést pomocí -r , – syrové možnost.
Tato další možnost je opravdu pěkná. Myslím, že to odstraňuje potřebu | grep skoro úplně. Můžete říct findmnt přesně který sloupec vytisknout pomocí -o , –výstup . Tato volba vyžaduje k tisku seznam sloupců oddělených čárkami. Pomocí následujícího příkazu můžete získat pouze dostupný prostor vašeho kořenového oddílu bez záhlaví.
findmnt -T / --df -o AVAIL -n
Vše, co musíte ve skriptech udělat, je odstranit poslední znak. Ve výše uvedeném příkazu jsem dal –df volba. To nebylo nutné, stejné výsledky budou vytištěny i bez této možnosti.
Findmnt poskytuje poměrně rozsáhlý seznam výstupních sloupců. Níže vám poskytnu krátký seznam sloupců, o kterých si myslím, že by vás mohly zajímat. Úplný seznam můžete zobrazit pomocí findmnt –help
- Zdrojové zařízení SOURCE
- TARGET přípojný bod
- Typ souborového systému FSTYPE
- OPTIONS všechny možnosti připojení
- štítek souborového systému LABEL
- UUID souborového systému UUID
- MAJ:MIN hlavní:vedlejší číslo zařízení
- Velikost souborového systému SIZE
- Dostupná velikost souborového systému DOSTUPNÉ
- POUŽITÁ velikost použitého souborového systému
- POUŽÍVEJTE % procenta využití souborového systému
- Kořenový adresář souborového systému FSROOT
Výchozí seznam vytištěných sloupců lze místo nahrazení rozšířit. Jednoduše zadejte seznam v následujícím formátu:+seznam . Následující příkaz poskytne stejné informace jako při použití –df , kromě toho, že sloupce budou přidány na konec.
findmnt -T / -o +SIZE,USE%,AVAIL
Už jsem se zamiloval do findmnt . To mi ušetří spoustu potrubí a dlouhých příkazových řádků. A findmnt tam nekončí. Je tu ještě jedna funkce, o které chci mluvit. Dotazování .
Ano, findmnt lze použít ke sledování změn v souboru /proc/self/mountinfo. To vám umožní efektivně sledovat váš systém pro činnosti související s montáží. Už žádná smyčka while v bash skriptech.
Najít bude naslouchat následujícím akcím, připojit , umount , znovu připojit a přesunout . Můžete to omezit poskytnutím čárkou odděleného seznamu akcí, které se mají poslouchat. Následující příklad bude monitorovat pouze připojení souborového systému.
Na obrázku výše vidíte výstup vytištěný findmnt když byl připojen nový oddíl. Všimnete si nového sloupce AKCE ? Pomocí ankety možnost máte 3 nové sloupce, které lze zobrazit:
- AKCE:K dispozici pro připojení, připojení, opětovné připojení a přesun
- STARÝ CÍL:K dispozici pro akci umount a přesun.
- STARÉ MOŽNOSTI:K dispozici pro umount a remount.
Při použití v tomto režimu findmnt bude blokovat, pokud je použit ve skriptu, skript se „zasekne“. Čas, kdy – anketa bude blokovat a naslouchat akcím lze omezit pomocí 2 možností
- –pouze první :Findmnt se ukončí po zjištění první akce.
- –časový limit X :Findmnt se ukončí po X milisekundách.
Když to všechno dáte dohromady, findmnt je jeden mocný nástroj. Při použití ve skriptech se zbavíte spousty kódu navíc. Potřeba přepojovat se na externí příkazy byla výrazně snížena.
Dříve uvedené možnosti lze také použít s –poll . V níže uvedeném příkladu findmnt bude čekat na akci připojení a vytiskne SOURCE, TARGET, SIZE a USE %. Ale pouze v případě, že cíl připojení odpovídá -T možnosti.
findmnt -T /mnt/lfs --poll=mount -o SOURCE,TARGET,SIZE,USE%
Bonusový tip:Skutečný příklad findmnt
Již nějakou dobu pracuji na skriptovaném prostředí bash pro kompilaci Linuxu od nuly. Pomocí findmnt v mých skriptech vyústil v lepší a čistší kód.
Během počátečního spuštění mého skriptu zkontroluji, zda je oddíl LFS připojen, pokud ne, skripty je připojí. Kód dříve vypadal takto:
if [[ `grep "$pd on $pm" < <(mount) | wc -l` < 1 ]];
then
...
...
fi
Projekt je určen pro vzdělávací účely, proto jsem ve výše uvedeném testu použil procesní substituci a potrubí. V celém svém kódu zobrazuji několik způsobů, jak provést stejný úkol. Pomocí findmnt Přišel jsem s čistším způsobem, jak udělat totéž.
findmnt -S $pd -T $pm > /dev/null || (
...
...
)
Přesměruji výstup do /dev/null, nepotřebuji mít findmnt výstup vytištěný na konzole. Najít vrátí 1, pokud vyhledávání selže, což způsobí, že se spustí kód v ( … ).
Doufám, že se vám líbilo a naučili jste se nový příkaz. Pokud pro něj máte zajímavé využití, podělte se prosím v komentářích. Tento článek má také další pohled:online vyhledávání není vždy nejlepší. Máme tendenci zapomínat, že Linux je dodáván s manuálem.