fs.md 5.93 KB
Newer Older
bzt's avatar
bzt committed
1 2
FS/Z Fájlrendszer
=================
bzt's avatar
bzt committed
3

bzt's avatar
bzt committed
4 5
Úgy lett megtervezve, hogy elképzelhetetlen mennyiségű adatot legyen képes tárolni. Klasszikus UNIX fájlrendszer, inode-okkal
és szuperblokkal, de a meglévők limitációi nélkül. Nincs felső határ szabva a fájlok vagy könyvtárak számának FS/Z-ben (kivéve
bzt's avatar
bzt committed
6 7 8
a fizikai kapacitást). A logikai szektorszámozás 2^128 biten van tárolva hogy jövőbiztos legyen. A jelenlegi implementáció csak
2^64 bitet használ (elegendő 64 Zettabájtos lemezekhez 4096-os logikai szektormérettel, és 1 Yottabájtosakhoz 64k-s logikai
szektormérettel).
bzt's avatar
bzt committed
9

bzt's avatar
bzt committed
10
A logikai szektorméret 2048, 4096, 8192... stb. lehet. A javasolt méret megegyezik a mindenkori architektúra memória lapméretével.
bzt's avatar
bzt committed
11
Ez 4096 x86_64-on és AArch64-en.
bzt's avatar
bzt committed
12

bzt's avatar
bzt committed
13
A fájlrendszer új lett kialakítva, hogy sérült lemez esetén az `fsck` a lehető legtöbbet visszanyerhesse. Egy teljesen elrontott
bzt's avatar
bzt committed
14
szuperblokk esetén az adatai visszanyerhetők a többi szektor elemzésével, inode-okat és metaadatokat keresve. Szoftver szintű
bzt's avatar
bzt committed
15
RAID tükrözés szintén lehetséges ezzel a fájlrendszerrel.
bzt's avatar
bzt committed
16

bzt's avatar
bzt committed
17
A pontos, bitszintű specifikáció és a lemezen lévő formátum megtalálható az [fsZ.h](https://gitlab.com/bztsrc/osz/blob/master/include/osZ/fsZ.h)
bzt's avatar
bzt committed
18
fájlban. A magasabb szintű absztrakciós réteg leírásáért pedig lásd [VFS](https://gitlab.com/bztsrc/osz/blob/master/docs/vfs.md).
bzt's avatar
bzt committed
19

bzt's avatar
bzt committed
20 21
Implementációk
--------------
bzt's avatar
bzt committed
22 23 24 25
A fájlrendszer 3 különböző helyen került implementálásra:
 1. a betöltő [loader](https://gitlab.com/bztsrc/osz/blob/master/loader)-ben, ami GPT-t, FAT-et használ az initrd megtalálására, és FS/Z-t, cpio-t, tar-t, sfs-t a kernel keresésére az initrd-ben. Ez egy csak olvasni tudó, töredezettségmentes fájlrendszer implementáció.
 2. a [core](https://gitlab.com/bztsrc/osz/blob/master/src/core/fs.c)-ban, ami az indulás korai szakaszában tölt be fájlokat az initrd-ről (például az FS/Z fájl rendszer meghajtót). Ez szintén egy csak olvasni tudó, töredezettségmentes fájlrendszer implementáció.
 3. mint az FS taszk [fájlrendszer meghajtója](https://gitlab.com/bztsrc/osz/blob/master/src/drivers/fs/fsz/main.c), ami egy teljes értékű implementáció, írás/olvasás és tördezettség támogatással.
bzt's avatar
bzt committed
26

bzt's avatar
bzt committed
27
FS/Z Szuperblokk
bzt's avatar
bzt committed
28 29
----------------

bzt's avatar
bzt committed
30
A szuperblokk a legelső logikai szektor a médián és opcionálisan a legutolsó szektoron megismételve. Ha a két szuperblokk eltér,
bzt's avatar
bzt committed
31
akkor a CRC ellenőrző összeg alapján eldönthető, melyik a helyes.
bzt's avatar
bzt committed
32

bzt's avatar
bzt committed
33 34
Logikai Szektorszám (LSN)
-------------------------
bzt's avatar
bzt committed
35

bzt's avatar
bzt committed
36 37 38
A logikai szektor mérete a szuperblokkban van rögzítve. A szektorszám egy skaláris, szuperblokkhoz viszonyított, relatív szám
2^128-on ábrázolva. A szuperblokk ezért mindig a 0-ás LSN-en található, függetlenül attól, hogy a lemez tartalmaz-e
partíciókat vagy sem, és a 0-ás LSN egyben 0-ás LBA-e. Ez azt jelenti, hogy a fájlrendszert kedvedre átmozgathatod
bzt's avatar
bzt committed
39 40 41
annélkül, hogy a szektorhivatkozások újra kéne számolni benne. Mivel a szuperblokkot tartalmazó 0-ás LSN nem hivatkozható
fájlokból, ezért a leképezésekben a 0-ás LSN egy csupa nullákat tartalmazó szektort jelent, lehetővé téve lyukak tárolását
a fájlokban.
bzt's avatar
bzt committed
42

bzt's avatar
bzt committed
43 44
Fájl Azonosító (fid)
--------------------
bzt's avatar
bzt committed
45

bzt's avatar
bzt committed
46 47
A fájl azonosító (vagy fid röviden) egy olyan logikai szektorszám, ami egy inode-ot tartalmazó szektorra mutat. Ez ellenőrizhető
azzal, hogy a szektor az "FSIN" azonosítóval kezdődik.
bzt's avatar
bzt committed
48

bzt's avatar
bzt committed
49 50
Csomópont (inode)
-----------------
bzt's avatar
bzt committed
51

bzt's avatar
bzt committed
52 53 54
A legfontosabb struktúra az FS/Z-ben. A lemez egy részét írja le mint könyvtárbejegyzés vagy fájl tartalma stb. Ez a logikai
szektor első 1024 bájtja (vagy 2048 ha a szuperblokkban a nagy inode opció van megjelölve). Több változatot is tárol, ezzel
lehetővé téve nemcsak partíciós szintű pillanatképeket, hanem fájl szintű pillanatképeket és gyors visszaállítást is.
bzt's avatar
bzt committed
55

bzt's avatar
bzt committed
56
Az FS/Z továbbá tárol a fájlok tartalmáról metainformációkat (mint például mime típus vagy ellenőrzőösszeg), és cimkéket is kezel.
bzt's avatar
bzt committed
57

bzt's avatar
bzt committed
58
A tartalmak egy saját címtérbe vannak leképezve (ami eltér az LSN-től). Ehhez az FS/Z két, különböző leképezési mechanizmust is
bzt's avatar
bzt committed
59
használ. Az első nagyon hasonló a virtuális memória leképezéshez, a második változó méretű területeket, ún. extent-eket alkalmaz.
bzt's avatar
bzt committed
60

bzt's avatar
bzt committed
61 62
Szektor Lista (sl)
------------------
bzt's avatar
bzt committed
63

bzt's avatar
bzt committed
64 65
Ez használatos az extent-ek, valamint a hibás és szabad szektorok listájához is. Egy listaelem áll egy kezdő LSN-ből és a
logikai szektorok számából, amivel így egy változó méretű, egybefüggő területet ír le a lemezen. Minden extent 32 bájt hosszú.
bzt's avatar
bzt committed
66

bzt's avatar
bzt committed
67 68
Szektor Könyvtár (sd)
---------------------
bzt's avatar
bzt committed
69

bzt's avatar
bzt committed
70
Egy olyan logikai szektor, amiben (logikai szektorméret)/16 bejegyzés található. A memórialeképezéshez hasonlító címzés alapegysége.
bzt's avatar
bzt committed
71 72 73
Akárcsak a szektor listák, 2^128 bites LSN-t tárolnak (kivéve, ha a tartalomellenörző funkció engedélyezve van, ekkor "csak" 2^96),
de a listával ellentétben fix méretű, azonban nem összefüggő területet ír le a lemezen. Nem összekeverendő a sima könyvtárakkal,
amik fid-et rendelnek a fájlnevekhez.
bzt's avatar
bzt committed
74

bzt's avatar
bzt committed
75 76
Könyvtár
--------
bzt's avatar
bzt committed
77

bzt's avatar
bzt committed
78 79 80 81
Minden könyvtárban 128 bájtos bejegyzések találhatók, ami azt jelenti, hogy maximum 2^121-1 bejegyzés lehet egy könyvtárban.
Az első bejegyzés speciális, a könyvtárlista fejléce, a többi sima fid és fájlnév összerendelés. A bejegyzések ábécé szerint
vannak rendezve, ami rendkívül gyors, 0(log n) keresést tesz lehetővé a `libc` függvénykönyvtár
[bsearch](https://gitlab.com/bztsrc/osz/blob/master/src/libc/stdlib.c) függvényét használva.
bzt's avatar
bzt committed
82

bzt's avatar
bzt committed
83 84
16 bájt tárolja a fid-et, egy bájt a fájlnévben található többbájtos karakterek számát. Ez 111 bájtot hagy a névnek (ami lehet,
kevesebb karakterben, mivel az UTF-8 változó hosszúságú kódolás). Ez a legkomolyabb megszorítás az FS/Z-ben, de lássuk be, elég
bzt's avatar
bzt committed
85
jó eséllyel sose találkoztál 42 karakternél hosszabb fájlnévvel. A legtöbb fájlnév 16 karakternél rövidebb.
bzt's avatar
bzt committed
86