Virtuális fájlrendszerek Linuxon: miért van szükség rájuk és hogyan működnek? 2. rész

Üdvözlünk mindenkit, megosztjuk veletek a "Virtuális fájlrendszerek Linuxban: mire valóak és hogyan működnek?" című publikáció második részét. Az első részt itt olvashatjátok itt. Emlékeztetjük, hogy ez a publikációs sor egy új kurzus beindításához kapcsolódik „Linux Adminisztrátor”, amely hamarosan elindul.

Hogyan figyelhetjük meg a VFS-t eBPF és bcc eszközökkel

A legjobb módja, hogy megértsük, hogyan dolgozik a kernel a fájlokkal sysfs – ha gyakorlatban is látjuk ezt, és a legkönnyebb megfigyelni az ARM64-et, ha eBPF-t használunk. Az eBPF (Berkeley Packet Filter rövidítése) egy virtuális gépből áll, amelyet a kernelben, amelyhez a jogosultsággal rendelkező felhasználók hozzáférhetnek (query) a parancssorból. A kernel forráskódja tájékoztatja az olvasót arról, hogy mit tud tenni a kernel; az eBPF eszközök futtatása egy terhelt rendszerben megmutatja, hogy valójában mit csinál a kernel.

Virtuális fájlrendszerek Linuxon: miért van szükség rájuk és hogyan működnek? 2. rész

Szerencsére az eBPF használata elég egyszerű az bccelérhető eszközök segítségével, amelyek a közös disztribúció részeként érhetők el Linux és részletesen dokumentáltak Bernard Gregg által. Az eszközök bcc Python script-ek, kis C kódrészletekkel, ami azt jelenti, hogy bárki, aki ismeri mindkét nyelvet, könnyen módosíthatja őket. A bcc/tools 80 Python scriptet tartalmaz, ami azt jelenti, hogy nagy valószínűséggel a fejlesztő vagy rendszergazda talál magának megfelelő megoldást a feladatára.
Ahhoz, hogy legalább egy felszínes betekintést nyerjünk arról, hogy a VFS milyen munkát végez a futó rendszeren, próbáljuk ki vfscount vagy vfsstat. Ez megmutatja, például, hogy a vfs_open() és barátai hívásai szó szerint minden másodpercben történnek. vfsstat.py

Virtuális fájlrendszerek Linuxon: miért van szükség rájuk és hogyan működnek? 2. rész

egy Python script, C kód beillesztésekkel, ami egyszerűen megszámolja a VFS funkciók hívásait. Nézzünk meg egy egyszerűbb példát, és figyeljük meg, mi történik, amikor USB flash meghajtót csatlakoztatunk a számítógéphez, és azt a rendszer észleli.

Az eBPF segítségével megnézhetjük, mi történik,

Virtuális fájlrendszerek Linuxon: miért van szükség rájuk és hogyan működnek? 2. rész

, amikor USB flash meghajtót csatlakoztatunk. Itt egy egyszerű és egy bonyolult példa látható. /sysA fent bemutatott példa szerint

trace.py bcc továbbképzési támogatásért üzenetet ad ki, amikor a sysfs_create_files() parancs fut.Látjuk, hogy parancs fut. a kworker szálon keresztül indult, válaszul arra, hogy a flash meghajtót csatlakoztatták, de milyen fájl jött létre e közben? A második példa megmutatja az eBPF teljes erejét. Itt потока в ответ на то, что флешка была вставлена, но какой файл при этом создался? Второй пример показывает всю мощь eBPF. Здесь üzenetet ad ki, amikor a kimeneti nyomvonalat ad vissza (kernel backtrace) (-K opció) és a létrehozott fájl nevét parancs fut.. Az egysoros megjegyzések – egy C kód, amely tartalmaz egy könnyen felismerhető formátumot, amelyet a Python szkript biztosít, amely elindítja az LLVM-t just-in-time fordító. Ezt a sort lefordítja és végrehajtja a virtuális gépen a kernel belsejében. A funkcja teljes szignatúrája sysfs_create_files () meg kell, hogy reprodukálják a második parancsban, hogy a formátum hivatkozhasson az egyik paraméterre. A C kód ezen a részén lévő hibák nyilvánvaló C fordítói hibákhoz vezetnek. Például, ha a -l paraméter hiányzik, akkor a következő hibaüzenetet fogja kapni: „BFP szöveg lefordítási hiba.” Azok a fejlesztők, akik ismerik a C-t és a Python-t, az eszközöket bcc egyszerűnek találják a bővítéshez és módosításhoz.

Amikor a USB meghajtót csatlakoztatják, a kernel nyomvonal megmutatja, hogy a PID 7711 az a szál szálon keresztül indult, válaszul arra, hogy a flash meghajtót csatlakoztatták, de milyen fájl jött létre e közben? A második példa megmutatja az eBPF teljes erejét. Itt, amely létrehozta a fájlt „events” be. sysfs. Ennek megfelelően, a hívás a sysfs_remove_files() megmutatja, hogy a meghajtó eltávolítása a fájl eltávolítását eredményezte events, ami megfelel a hivatkozások számának általános fogalmának. Eközben a sysfs_create_link () eBPF-vel a USB meghajtó csatlakoztatásakor azt mutatja, hogy legalább 48 szimbolikus hivatkozás lett létrehozva.

Mi tehát az események fájl jelentősége? A cscope felhasználásával keresve __device_add_disk(), kiderül, hogy ez a hívás a következőt indítja el: disk_add_events (), és vagy "media_change", vagy "eject_request" íródhat a események fájlba. Itt a kernel blokk rétege értesíti a userspace-t a „lemez” megjelenéséről és eltávolításáról. Figyelje meg, mennyire tájékoztató ez a kutatási módszer a USB meghajtó csatlakoztatása példájaként, szemben azzal, hogy csak az forráskódokból próbálják kideríteni, hogyan működik minden.

Az csak olvasható gyökér fájlrendszerek lehetővé teszik a beépített eszközöket

Természetesen senki sem kapcsolja ki a szerverét vagy a számítógépét azzal, hogy kihúzza a dugót a konnektorból. De miért? Azért, mert a fizikai tárolóeszközökön lévő csatlakoztatott fájlrendszerek késleltetett írásokat tartalmazhatnak, és az állapotuk rögzítésére szolgáló adatszerkezetek nem szinkronizálódhatnak a tárolás rögzítéseivel. Amikor ez megtörténik, a rendszertulajdonosok a következő indításra várnak, hogy elindítsák a fsck fájlrendszer-helyreállító programot, és a legrosszabb esetben adatokat veszthetnek.

Mindazonáltal mindannyian tudjuk, hogy sok IoT-eszköz, valamint route-erek, termosztátok és járművek most már Linux alatt működnek. Ezeknek az eszközöknek gyakorlatilag nincs felhasználói felületük, és nincs lehetőség a 'tisztán' való kikapcsolásukra. Képzelje el, hogy egy lemerült akkumulátorral indítja el az autót, amikor az irányító eszköz áramellátása Linux folyton ugrál felfelé és lefelé. Hogyan lehetséges, hogy a rendszer hosszú fsckbeindítás nélkül elindul, amikor a motor végre működésbe lép? A válasz egyszerű. Az beágyazott eszközök a gyökér fájlrendszerre csak olvasásra (rövidítve ro-rootfs (read-only root filesystem).

ro-rootfs Számos előnyük van, amelyek kevésbé nyilvánvalóak, mint a hamisítatlanság. Az egyik előnye, hogy a rosszindulatú szoftverek nem tudnak írni a /usr vagy /lib, ha egyetlen Linux folyamat sem tud oda írni. Egy másik előny az, hogy a nagymértékben változatlan fájlrendszer kulcsszerepet játszik a távoli eszközök terepi támogatásában, mivel a segédszemélyzet helyi rendszereket használ, amelyek névlegesen azonosak a helyszíni rendszerekkel. Talán a legfontosabb (de legszofisztikáltabb) előny az, hogy a ro-rootfs arra kényszeríti a fejlesztőket, hogy döntsék el, milyen rendszerobjektumok maradnak változatlanok, már a rendszer tervezési szakaszában. A ro-rootfs-lel való munka kényelmetlen és fájdalmas lehet, ahogy az gyakran előfordul a programozási nyelvek const változóival, de az előnyök könnyen megérik a további költségeket.

Módszer kidolgozása squashfs A csak olvasásra állapot némi plusz erőfeszítést igényel az beágyazott rendszerek fejlesztőitől, és itt jön be a VFS. A Linux megköveteli, hogy a fájlok a /var írásra elérhetők legyenek, sőt, sok népszerű alkalmazás, amely beágyazott rendszerekben fut, meg fog próbálni konfigurációs dot-fájlokat be. $HOMElétrehozni. Egyik megoldás az otthoni könyvtárban található konfigurációs fájlok számára általában az, hogy előre generálják és összefoglalják őket, squashfs. A /var az egyik lehetséges megközelítés az, hogy egy külön felosztáson írásra elérhetővé tesszük, míg maga a / csak olvasásra van csatolva. Egy másik népszerű alternatíva a kötött vagy átfedési csatolások (bind or overlay mounts) alkalmazása.

A kapcsolódó és rétegelt csatlakozások, használatuk a konténerekben

Parancs végrehajtása man mount – a legjobb módja annak, hogy megismerkedjünk a kapcsolódó és rétegelt csatlakozásokkal, amelyek lehetővé teszik a fejlesztők és rendszergazdák számára, hogy egy fájlrendszert egy útvonalon létrehozzanak, majd azt más alkalmazások számára biztosítsák. Beágyazott rendszerek esetén ez lehetőséget jelent az adatok tárolására /var olvasásra írásvédett flash meghajtón, de a csatlakozási vagy rétegelt csatlakozási útból tmpfs be. /var a rendszer indításakor lehetővé teszi az alkalmazások számára, hogy oda jegyzeteket írjanak (scrawl). A következő bekapcsoláskor a módosítások /var elvesznek. A rétegelt csatlakozás egy egyesítést teremt a tmpfs és az alapparmány fájlrendszer között, és lehetővé teszi a meglévő fájlok látszólagos módosításait ro-tootf míg a kapcsolódó csatlakozás új üres tmpfs mappákat láthatóvá tehet mint írásra elérhetőeket a ro-rootfs útvonalakon. Míg overlayfs az a megfelelő (proper) típusa a fájlrendszernek, a kapcsolódó csatlakozás a VFS névtérben valósul meg..

A rétegelt és kapcsolódó csatlakozás leírásának alapján senki sem lepődik meg, hogy a Linux konténerek aktívan használják őket. Nézzük meg, mi történik, amikor használjuk systemd-nspawn konténer indításához a mountsnoop tól bcc.

Hívás a system-nspawn a konténer indításánál mountsnoop.py.

Nézzük meg, hogy sikerült:

Indítás mountsnoop a konténer „betöltése” során azt mutatja, hogy a konténer futási környezete erősen függ a kapcsolódó csatlakozástól (Csak a hosszú kimenet eleje jelenik meg).

Itt systemd-nspawn a kiválasztott fájlokat a procfs és sysfs gazda rendszerben a konténerbe mint útvonalként. squashfs. A MS_BIND zászló, amely a kapcsolódó csatlakozást beállítja, más egyéb zászlók a csatlakoztatott rendszerben meghatározzák a kapcsolatot a gazda névtér és a konténer közötti változások között. Például a kapcsolódó csatlakozás elengedheti a változásokat /proc és /sys a konténerbe, vagy elrejtheti azokat a hívástól függően.

Zárás

A Linux belső működésének megértése lehetetlennak tűnhet, mivel magának a kernelnek hatalmas mennyiségű kódja van, figyelmen kívül hagyva a Linux felhasználói tér alkalmazásait és a C nyelvű könyvtárak rendszerhívásainak interfészeit. glibc-t. Az egyik módja a fejlődés elérésének az, hogy elolvassuk a kernel egyik alrendszerének forráskódját, különös figyelmet fordítva a felhasználói térbe irányuló rendszerhívások és fejlécek megértésére, valamint a kernel fő belső interfészeire, például a táblázatra. file_operations. A fájlműveletek a „minden fájl” elvet képviselik, ezért a kezelésük különösen élvezetes. A kernel forrásfájljai C nyelven a legfelső szinten találhatóak. fs/ a virtuális fájlrendszerek megvalósítását kínálják, amelyek egy burkoló réteg, amely széleskörű és viszonylag egyszerű kompatibilitást biztosít a népszerű fájlrendszerek és tárolóeszközök között. A Linux névterekkel való összekapcsolás és az elhelyezés varázslata a VFS, amely lehetővé teszi a konténerek és az írásvédett gyökér fájlrendszerek létrehozását. A forráskód tanulmányozásával, az eBPF kernel eszközzel és annak interfészével bcc
a kernel kutatását könnyebbé teszik, mint valaha.

Barátok, írjátok meg, hasznos volt-e számotokra ez a cikk? Talán van valami megjegyzésetek vagy észrevételetek? Akiket érdekel a „Linux Rendszergazda” kurzus, azokat várjuk nyílt napra, amely április 18-án kerül megrendezésre.

Első rész.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster