HTML

Bagoj úr blogja

Kíváncsi Bagoj befigyel a Linux belsejébe, illetve különféle Linux terjesztéseket próbál ki. Ha jó napja van, scriptet ír Neked.

Friss topikok

Unionfs - bolondbiztos linux

2008.04.27. 09:52 bagoj ur

Nem fogjátok elhinni, de még mindig nem a konkrét megoldás fog következni! :-)
Ugyanis közben elkezdtem egyrészt tűnődni a dolgon, és összeírtam a magam számára is, hogy pontosan milyen lépéseket kellene megtenni, meg hogy hogyan is működik pontosabban a unionfs. Úgyhogy nehogymá ne publikáljam... Persze igyekszem nem lemenni forráskód-szintre!

Amint írtam - és ahogyan a név is sugallja - könyvtárak egyesítését tudjuk elvégezni. Így aztán a unionfs-nek teljesen mindegy, hogy milyen típusú fájlrendszerek vannak az alsóbb szinteken; hiszen könyvtárakkal, nem fájlrendszerekkel foglalkozik. (Bizony, az egyik lehet CD-ROM, a másik akár NFS partíció is, így a változásokat a távoli szerver tárolja.) Ezeket a könyvtárakat branch-nek, ágnak nevezik.

Az egyesített könyvtárakat többféle módon kezelhetjük: lehet egyesíteni több csak olvasható (ro), olvasható és írható (rw), vagy ezek kombinációjából álló partíciókat. A lényeg így néz ki:
mount -t unionfs -o dirs=<első_könyvtár>:<második_könyvtár>:<harmadik könyvtár> none <célkönyvtár>A megadott könyvtárak közül az lesz a magasabb szintű, amit később adtunk meg. Azaz ha egy fájl hasonló névvel létezik kettőben (vagy akár mindegyikben), a legutolsó könyvtárban lévő fog látszani (mintha rétegek lennének egymás felett).

A fájlok létrehozásának lekezelése viszonylag egyszerű: Ha létezik a fájl a legfelső rétegen, és írható a fájlrendszer, akkor létrehozza ott. Ha nem, akkor megnézi egy szinttel lejjebb. De a létrehozott fájl, függetlenül attól, hogy hol jött végül létre, a célkönyvtárban látszani fog. A mi esetünkben itt, ahogy írtam az előző postban, egy copy-on-write történik, azaz az alsó (ro) rétegről átmásolja a felső (rw) rétegre a fájlt és kész.
A fájlok törlése viszont kicsit bonyolultabb: a törlés mindig a legalsó rétegen kezdődik. Ugyanis ha egy fájlt törlünk a célkönyvtárban, akkor alapértelmezésben hipp-hopp, várakozásainknak megfelelően eltűnik. Természetesen nem törlődhet a legalsó rétegről, hiszen az csak olvasható. Ehelyett a unionfs bejegyzi, hogy ez a fájl törölt állapotú (unionfs nyelven: whiteout). És csak akkor fog felbukkanni újra a fájl, ha újra odamásoljuk. Szerencsére nem csak ez a törlési mód van, hanem létezik olyan is, amit mi szeretnénk: törlés esetén ismét "előbukkan" az eredeti fájl a ro partícióról. Ezt a törlési módot nevezik delete_first-nek. Ez az, amit használnunk kell.

Ötlet: Ha jól vágom, a célkönyvtár megegyezhet bármelyik egyesített könyvtárral (!). Tehát, ha úgy akarunk tenni, mintha írható lenne a /media/cdrom0 könyvtárunk:
mount -t unionfs -o dirs=/home/bagoj/cdre:/media/cdrom0=ro none /media/cdrom
Megvalósítás

Ha-ha, ahogy mondani szokás, 4 egyszerű lépésben fogjuk megoldani! :-) Mivel az egészet egy kernel paraméterrel fogjuk szabályozni, először megnézzük, hogy szükséges-e bármit csinálnunk. Nyilván boot paramétert kell alkalmazni, hiszen boot időben kell eldöntenünk, hogy használjuk-e a unionfs-t, vagy pedig csak simán bootolunk (a következő snapshot előállításához). Tehát:

1. A "/" fájlrendszert át kell mozgatni a "/ro" könyvtárba, csak olvashatóra. (Nekem ez a /dev/sda3)
2. Fel kell csatolni a változásokat tartalmazó partíciót a "/rw"-be. (nekem: /dev/sda5)
3. Egyesíteni kell a "/ro"-t és "/rw"-t a "/" alatt; ez lesz a fájlrendszer
4. A "/home"-ba felcsatoljuk a home partíciót (nekem: /dev/sda6)

A boot folyamat kicsit róka fogta csuka: A / fájlrendszerrel dolgozunk, de ahhoz, hogy az egész elindulhasson, szükség van a / fájlrendszerre. Ez az, amiért initrd-t kell használnunk. Azaz, a grub-nak alapértelmezésben szépen megadjuk, hogy most unionfs-t szeretnénk. A grub betölti az initrd-ben található initramfs-t, ami egy mini fájlrendszer, amiben megtalálható a kernel, a szükséges modulok, és szkriptek is. Pontosan ide, erre a pontra fogjuk belegyártani az okosat, hiszen itt el tudjuk dönteni, hogy kell-e; rendelkezésre áll a unionfs modul amit betöltünk a memóriába, meg tudjuk lépni a fent leírt 4 lépést, majd hagyjuk, hogy az initrd-ben lévő kernel folytassa a rendszerindítást.

Első lépésben telepítsük fel a szükséges dolgokat:
bagoj@aranyhal:~$ sudo apt-get update
bagoj@aranyhal:~$ sudo apt-get install unionfs-tools
Ezután meggyártjuk a szkriptet, az Ubuntu beépített eszközével újrageneráljuk az initramfs-t, beleírjuk a grub konfigjába a szükséges paramétert és kész is. A szkripttel fogom folytatni; ha minden igaz, holnap. ;-)

1 komment

Címkék: unionfs ubuntu, linux, kernel, hogyan, fájlrendszerek, konfigurálás,

A bejegyzés trackback címe:

https://bagojur.blog.hu/api/trackback/id/tr60612285

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

bagoj.ur 2008.04.30. 16:41:29

Fejlemények: Kiderült, hogy az Ubuntuban lévő unionfs nem támogatja a delete-first metódust. Ezzel nincs gond végülis, csak kicsit bonyolultabb lesz majd a visszaállítás, mert hidden fájlokat kell törölni a /rw-ről.

A következő fejlemény, hogy az initrd-s szkriptemet még faragom kicsit, mert egyelőre kernel oops az eredmény... :-p