A fordító bármely olyan Hurd OS -en futó szerver , amely alapvető fájlrendszeri felületet biztosít. A Hurd OS lehetővé teszi a fordító telepítését bármely olyan fájlba vagy könyvtárba, amelyhez a fordítót telepítő felhasználó hozzáférési jogokkal rendelkezik. A lefordított fájlrendszer-objektumok - az inodes szimbolikus hivatkozások és beillesztési pontok keresztezése, amelyek a Unix - szerű operációs rendszerekben ismertek .
Mielőtt megpróbálná kitalálni, mi a fordító, meg kell ismerkednie azzal, hogy mi az a normál fájlrendszer (FS). A fájlrendszer hierarchikusan felépített könyvtárak és fájlok halmaza .
Bármely fájl eléréséhez egy szöveges karakterláncot használnak, amely nem más, mint a fájl elérési útja. Ezenkívül létezik egy technológia a szimbolikus hivatkozások létrehozására és használatára , amelyek lehetővé teszik egyetlen fájl elérését a hierarchikus címtárfa különböző helyein található könyvtárakból önmagukon keresztül, valamint lehetőség van kemény hivatkozások létrehozására is , amelyek lehetővé teszik több hivatkozás hozzárendelését. neveket egyszerre egyetlen fájlba. A kernelben található speciális eszközfájlok is találhatók az eszközillesztőkkel való kommunikációhoz, és vannak olyan könyvtárak is, amelyek csatolási pontként szolgálnak a merevlemez-partíciókhoz és egyéb tárolóeszközökhöz. És vannak FIFO típusú fájlok is .
Bár ezek az objektumok különböznek egymástól, mindegyiknek van közös tulajdonsága, például mindegyiknek van tulajdonosa és csoportja, amellyel társítva vannak, valamint megfelelő jogosultságokkal ( permissions ). Mindezek az információk egy speciális fájlban vannak tárolva, amelyet a - inode ( inode ) kifejezés jelöl. Ez a fájlrendszer -objektumok közös tulajdonsága : minden objektumhoz egy inode tartozik (a kemény hivatkozások szokatlanok ebből a szempontból, mert a fájlokhoz társított merev hivatkozások halmaza egyáltalán ugyanazt az inode-ot használja). Néha egy inode további bejegyzéseket tartalmaz. Például egy inode tartalmazhatja a fájl elérési útját, amelyre egy szimbolikus hivatkozás mutat .
Ezeket a közös tulajdonságokat azonban általában nem használják közvetlenül a programokban, mivel ehhez vannak absztrakt programozási felületek . Bármely inode elérhető a POSIX függvények, például a read() és write() függvények meghívásával . Például, ha új típusú objektumokat szeretne támogatni az FS-ben (például új típusú hivatkozásokat) egy normál monolitikus unix kernelhez, át kell írnia a forráskódokat minden egyes használt fájlrendszertípushoz.
A Hurd rendszerben minden más. Bár a Hurd rendszerben egy speciális fájlrendszer-kiszolgáló képes működni a szabványos objektumtípusok speciális tulajdonságaival, például hivatkozásokkal (például "gyors hivatkozásokkal" ( gyors hivatkozásokkal ) az ext2 fájlrendszerben ), a Hurd rendszermagnak van egy általános interfész, amely lehetővé teszi új szolgáltatások hozzáadását a rendszerhez a rendszer forrásszövegeinek módosítása nélkül .
A trükk az, hogy a fordítóprogramot a fordítófájl tényleges tartalma és a felhasználói program, és ennek megfelelően a fájlhoz hozzáférő felhasználó közé helyezzük. Az ilyen közvetítő programot fordítónak nevezik, mert többféle módon képes feldolgozni a bejövő kéréseket. Más szóval, a fordító a Hurd rendszeren futó szerver, amely alapvető fájlrendszeri felületet biztosít.
A fordítók érdekes tulajdonságokkal rendelkeznek. A kernel szempontjából ezek csak felhasználói folyamatok. Ez azt jelenti, hogy a fordítókat bármely felhasználó futtathatja. A felhasználónak nincs szüksége szuperfelhasználói jogosultságra a fordító telepítéséhez vagy módosításához, csupán hozzáférési jogok szükségesek a fordítandó inode-hoz (fájlhoz). Sok fordítónak nincs szüksége fájlokra a fordításhoz és a munkához, hanem saját maga által generált információkat szolgáltathat. Ez az oka annak, hogy a fordítói információkat inode-okban tárolják.
A fordítóknak részt kell venniük minden olyan fájlrendszer-műveletben, amely hatással van az általuk lefordított inódokra. Tekintettel arra, hogy nem korlátozódnak a közönséges FS-objektumok listájára ( eszközfájlok , hivatkozások stb.), olyan adatokat küldhetnek vissza, amelyeket a fejlesztő munkájuk eredményeként szükségesnek tart. Elképzelhető egy olyan fordító, amely könyvtárként viselkedik, ha ls -sel vagy cd -vel éri el, ugyanakkor fájlként viselkedik, ha cat segítségével éri el .
A csatolási pont egyfajta inode-nak tekinthető, amelyet egy speciális szerver fordít le. Célja, hogy a fájlrendszer műveleteit egy másik fájlrendszerhez tartozó beillesztési pontra fordítsa , például egy másik lemezpartícióra.
Valójában így van megvalósítva a fájlrendszer a Hurd OS-ben. A fájlrendszer egy fordító. Ez a fordító néhány tárolóeszközt vesz argumentumként, és képes a fájlrendszer műveleteit teljesen átlátható módon kezelni.
Sok különböző eszközfájl létezik, és a monolitikus kernellel rendelkező rendszereken mindegyik a kernel támogatása miatt működik. A Hurd rendszerben az összes eszközfájlt a fordítók támogatják. Ugyanaz a fordító sok hasonló eszközfájlt támogathat, például az összes lemezpartíciót. Így a szükséges fordítók száma meglehetősen kicsi. Ne feledje azonban, hogy az egyes eszközfájlok eléréséhez külön fordítói feladat fut. De mivel a Hurd valóban többfeladatos rendszer, nem jár túl sok ráfordítással.
Amikor hozzá kell férni a számítógép hardveréhez, a fordító általában beszélni kezd a kernellel, hogy adatokat kapjon az eszközökről. Ha azonban nem szükséges hozzáférni a hardvereszközökhöz, akkor nincs szükség a rendszermag elérésére. Például a /dev/zero eszköz nem igényel hozzáférést a hardverhez, és teljes mértékben megvalósítható a felhasználói programok végrehajtási területén.
A szimbolikus link fordítóként is felfogható. A szimbolikus hivatkozás elérésének kísérlete elindítja a megfelelő fordítót, amely továbbítja a bejövő kéréseket annak a fájlrendszernek, amely tartalmazza azt a fájlt, amelyre a hivatkozás mutat.
A jobb teljesítmény érdekében azonban a szimbolikus hivatkozásokat natív támogatással rendelkező fájlrendszerek használhatják ezt a funkciójukat a csatolási mechanizmus másként, belső megvalósítására, így a szimbolikus hivatkozáson keresztüli hozzáférés nem indít el külön fordítói folyamatot. Ez azonban továbbra is úgy fog kinézni, mint egy passzív fordítóhoz intézett hívás a felhasználó számára (lásd alább, hogy mi is az a passzív fordító).
A Hurd rendszer magával visz egy symlink fordítót , ami azt jelenti, hogy minden olyan szerver, amely különféle típusú fájlrendszerekkel (ext2 stb.) dolgozik, és amely támogatja a fordítókon keresztüli munkát, automatikusan képes dolgozni szimbolikus hivatkozásokkal (mind firmlinkekkel , mind eszközfájlokkal ). stb.). Ez azt jelenti, hogy később magán a szerveren keresztül gyorsan elérheti a fájlokat, és hozzáadhat támogatást a szimbolikus hivatkozásokhoz és egyéb szolgáltatásokhoz.
Kétféle fordító létezik: passzív és aktív. Valójában két különböző típusú fordítóról van szó, ezért nem célszerű összetéveszteni őket egymással, de a kétféle program kölcsönhatásban van.
Az aktív fordító egy futó fordítói folyamat, a fent leírtak szerint. Az aktív fordítót a settrans -a paranccsal állíthatja be vagy távolíthatja el . Az -a kapcsoló szükséges ahhoz, hogy a settrans közölje, hogy az aktív fordítót módosítani kell.
A settrans parancs háromféle argumentumot vehet fel. Először is beállíthatja magának a settrans parancsnak a beállításait , például az -a kapcsolót az aktív fordító módosításához. Ezután meg kell adni a módosítandó inode-ot. Ne feledje, hogy a fordító mindig a könyvtárak és fájlok fában található inode-hoz van társítva. Egyszerre csak egy inode módosítható. Ha nem küld több argumentumot a settrans számára, akkor megpróbálja eltávolítani a meglévő fordítót. Az, hogy mennyire óvatosan távolítja el a fordítót, a megadott kényszertörlési beállítástól függ (ha a fordítót valamilyen folyamat használja, akkor "eszköz vagy erőforrás foglalt" hibaüzenet jelenik meg , hacsak a fordítót nem nyers erővel ürítették ki).
De ha további argumentumokat adunk meg, akkor azokat parancssorként értelmezi a program a fordító elindításához. Ez azt jelenti, hogy a következő argumentum a végrehajtható fordító neve. Minden további argumentum magának a fordítónak a beállítása, nem a settrans parancsé.
Például egy ext2fs partíció csatlakoztatásához futtassa a settrans -a -c /mnt /hurd/ext2fs /dev/hd2s5 parancsot . A -c kapcsoló új csatolási pontot hoz létre, ha még nem létezik. Egyébként a csatolási pontnak nem kell könyvtárnak lennie. A visszacsatoláshoz futtassa a settrans -a /mnt parancsot .
A passzív fordító telepítése és módosítása ugyanazzal a szintaxissal történik, mint az aktív fordító (de az -a kapcsoló nélkül ), vagyis a fent leírtak teljes mértékben érvényesek a passzív fordítókra. Vannak azonban különbségek: a passzív fordítók nem kezdenek azonnal.
Ez logikus, mert általában pontosan erre van szükség. Nincs szükség lemezpartíció csatlakoztatására, kivéve, ha a partíción lévő fájlokhoz ténylegesen hozzáférnek. Nincs szükség a hálózati interfész és a hálózat aktiválására, hacsak nincs adatcsere kommunikációs csatornákon, stb.
Ehelyett, amikor egy passzív fordítót hívunk meg, az automatikusan kiolvassa az inode-ból, és aktív fordítóként fut, az inode-ban tárolt parancssorból származó parancsok használatával. Ez hasonló a Linux automounter tervezéséhez és működéséhez . Ez azonban nem valami további bónusz, amelyet magának kell telepítenie, hanem a rendszer szerves része. Tehát egy passzív fordító telepítése késlelteti a fordító elindítását és végrehajtását addig a pillanatig, amikor valóban szükség lesz rá. Ezenkívül, ha egy passzív fordítón keresztül elindított aktív fordító valamilyen okból meghal, a megfelelő inode legközelebbi elérésekor a fordító újraindul.
Még több különbség van: egy aktív fordító meghalhat vagy eltévedhet. Ha egy aktív fordító futó folyamata megszűnik (például azért, mert a számítógépet újraindították ), az helyrehozhatatlanul elveszik. A passzív fordítók nem töltődnek ki, és az újraindítás során pontosan addig maradnak az inode-ban, amíg a settrans programmal nem módosítják őket, vagy amíg el nem távolítják azt az inode-ot, amelyhez csatolták őket. Ez azt jelenti, hogy nincs szükség beillesztési pontadatokat tartalmazó konfigurációs fájlra a rendszeren.
És még valami: Ha már telepítve van egy passzív fordító, akkor is telepíthet egy másik aktív fordítót. Csak akkor, ha a fordító automatikusan elindult, és az inode elérésekor még nem futott aktív fordítói folyamat, csak akkor hívják meg a passzív fordítót.
Amint azt korábban tárgyaltuk, a settrans paranccsal beállíthatja a passzív és az aktív fordítókat. Számos lehetőség van a settrans parancs viselkedésének megváltoztatására arra az esetre, ha valami rosszul sülne el, és meghatározhatja, hogy mit tegyen. Íme néhány példa a parancs általános használatára:
Lemezpartíciót csatlakoztat, a fordító az újraindítás után mentésre kerül.
A fájlrendszert az adatfájlba illeszti, a fordító eltűnik, ha meghal, vagy a számítógép újraindítása után.
A fordító leállását okozza.
A showtrans paranccsal is megnézheti, hogy van-e fordító csatolva egy inode-hoz vagy sem. Ez a parancs azonban csak a passzív fordítókról jelenít meg információkat.
Az aktív (fájlrendszer) fordító működési módjának beállításait az fsysopts paranccsal is módosíthatja a fordító újratöltése nélkül. Nagyon kényelmes. Például megteheti azt, amit a Linux "egy partíció csak olvasható újracsatlakoztatásának" nevez, egyszerűen az fsysopts /mntpoint --readonly parancs kiadásával . Ha lehetséges, a futó aktív fordító a kapott kérésnek megfelelően megváltoztatja a viselkedését. Az opciók nélkül meghívott fsysopts /mntpoint parancs az aktuális beállításokat mutatja.