vfs — virtuális fájlrendszer-vezérlés

A vfs modul olyan függvényeket tartalmaz, amelyekkel fájlrendszer-objektumokat hozhatunk létre, és csatlakoztathatjuk (mount) vagy leválaszthatjuk (unmount) azokat a virtuális fájlrendszerben.

Fájlrendszer csatlakoztatása

Egyes portok virtuális fájlrendszert (VFS) biztosítanak, valamint lehetővé teszik több „valódi” fájlrendszer csatlakoztatását ezen a VFS-en belül. A fájlrendszer-objektumok csatlakoztathatók akár a VFS gyökerébe, akár a gyökérben elhelyezkedő alkönyvtárba. Ez lehetővé teszi a Python programok által látott fájlrendszer dinamikus és rugalmas konfigurálását. Az ezzel a funkcióval rendelkező portok biztosítják a mount() és umount() függvényeket, valamint esetenként a VFS-osztályok által megvalósított különféle fájlrendszer-implementációkat.

vfs.mount(fsobj: Any, mount_point: str, *, readonly: bool = False) None

Csatlakoztatja az fsobj fájlrendszer-objektumot a VFS-ben az mount_point karakterlánc által megadott helyre. Az fsobj lehet egy mount() metódussal rendelkező VFS-objektum, vagy egy blokkeszköz. Ha blokkeszköz, akkor a fájlrendszer típusa automatikusan felismerésre kerül (kivétel keletkezik, ha egyetlen fájlrendszer sem ismerhető fel). Az mount_point lehet '/' az fsobj gyökérbe való csatlakoztatásához, vagy '/<name>' a gyökér alatti alkönyvtárba való csatlakoztatásához.

Ha a readonly értéke True, akkor a fájlrendszer csak olvashatóként kerül csatlakoztatásra.

A csatlakoztatási folyamat során a fájlrendszer-objektum mount() metódusa hívódik meg.

OSError(EPERM) hibát vált ki, ha az mount_point már csatlakoztatva van.

vfs.mount() List[Tuple[Any, str]]

Argumentumok nélküli mount() hívás esetén egy listát ad vissza, amely az összes aktív csatlakozási pontot reprezentáló rendezett értékpárokat (tuple) tartalmazza.

A visszaadott lista formátuma [(fsobj, mount_point), …].

vfs.umount(mount_point: str | Any) None

Leválaszt egy fájlrendszert. Az mount_point lehet egy karakterlánc, amely a csatlakozási helyet nevezi meg, vagy egy korábban csatlakoztatott fájlrendszer-objektum. A leválasztási folyamat során a fájlrendszer-objektum umount() metódusa hívódik meg.

OSError(EINVAL) hibát vált ki, ha az mount_point nem található.

class vfs.VfsFat(block_dev: AbstractBlockDev)

Létrehoz egy fájlrendszer-objektumot, amely a FAT fájlrendszer-formátumot használja. A FAT fájlrendszer tárolását a block_dev biztosítja. Az ezzel a konstruktorral létrehozott objektumok a mount() segítségével csatlakoztathatók.

static mkfs(block_dev: AbstractBlockDev) None

FAT fájlrendszert épít a block_dev eszközön.

class vfs.VfsRom(buffer: bytes | bytearray | memoryview)

Létrehoz egy fájlrendszer-objektumot, amely a ROMFS csak olvasható fájlrendszer-formátumot használja. A buffer egy olyan objektum kell legyen, amely támogatja a puffer protokollt (bytes, bytearray vagy memoryview), és érvényes ROMFS-képet tartalmaz.

Az ezzel a konstruktorral létrehozott objektumok a mount() segítségével csatlakoztathatók.

A teljes részletekért lásd a Munka a ROMFS-sel szakaszt, beleértve azt is, hogyan építhetők és telepíthetők ROMFS-képek az mpremote eszközzel.

vfs.rom_ioctl(op: int, *args: Any) Any

Alacsony szintű interfész az eszköz csak olvasható memória (ROM) partíciójának vagy partícióinak eléréséhez. A támogatott műveletek a következők:

Hívás

Viselkedés

rom_ioctl(1)

Visszaadja az elérhető ROM-partíciók számát.

rom_ioctl(2, id)

Visszaadja a(z) id partíciót memoryview objektumként.

rom_ioctl(3, id, length)

Törli a(z) id partíció első length bájtját az íráshoz való előkészítésként. Visszaadja a minimális írási igazítást bájtokban.

rom_ioctl(4, id, offset, buf)

A buf tartalmát a(z) id partícióba írja a(z) offset bájteltolásnál.

rom_ioctl(5, id)

Lezárja a(z) id partícióba történő írási műveletsort (kiüríti a gyorsítótárakat stb.).

Ezeket a műveleteket általában közvetetten hívja meg az mpremote egy ROMFS-kép telepítésekor; a legtöbb alkalmazásnak nem kell közvetlenül meghívnia őket.

class vfs.VfsPosix(root: str | None = None)

Létrehoz egy fájlrendszer-objektumot, amely a gazdagép POSIX fájlrendszerét éri el. Ha meg van adva a root, akkor annak a gazdagép fájlrendszerében lévő útvonalnak kell lennie, amelyet a VfsPosix objektum gyökereként kíván használni. Egyébként a gazdagép fájlrendszerének aktuális könyvtára lesz használva.

Megjegyzés

A VfsPosix csak a MicroPython Unix portján érhető el; az OpenMV Cam firmware-ben nincs jelen.

Blokkeszközök

A blokkeszköz olyan objektum, amely megvalósítja a blokkprotokollt. Ez lehetővé teszi, hogy egy eszköz támogassa a MicroPython fájlrendszereket. A fizikai hardvert egy felhasználó által definiált osztály reprezentálja. Az AbstractBlockDev osztály egy ilyen osztály tervezésének sablonja: a MicroPython valójában nem biztosítja ezt az osztályt, de egy valódi blokkeszköz-osztálynak meg kell valósítania az alább leírt metódusokat.

Ennek az osztálynak egy konkrét implementációja általában lehetővé teszi egy hardverdarab (például flash memória) memóriaszerű funkcióinak elérését. Egy blokkeszköz bármely támogatott fájlrendszerre formázható, és az os metódusaival csatlakoztatható.

A blokkeszközök az alább leírt blokkprotokoll két változatát használó példa-implementációihoz lásd a Munka a fájlrendszerekkel szakaszt.

Egyszerű és kibővített interfész

A readblocks és writeblocks metódusoknak két kompatibilis szignatúrája van (lásd alább), hogy számos felhasználási esetet támogassanak. Egy adott blokkeszköz megvalósíthatja az egyik vagy a másik formát, vagy egyszerre mindkettőt. A második formát (az offset paraméterrel) „kibővített interfésznek” nevezzük.

Egyes fájlrendszerek nagyobb kontrollt igényelnek az írási műveletek felett – például al-blokk régiók írását törlés nélkül –, és szükségük van arra, hogy a blokkeszköz támogassa a kibővített interfészt.

class vfs.AbstractBlockDev

Dokumentációs sablon a blokkeszköz-protokollhoz. A MicroPython valójában nem teszi elérhetővé ezt az osztályt — itt csak azon metódusok dokumentálására szolgál, amelyeket egy felhasználó által definiált blokkeszköz-osztálynak meg kell valósítania. A konstruktor argumentumai teljes mértékben az implementációtól függenek (jellemzően olyan dolgok, mint a flash busz, a chip-select láb, a szektorméret stb.).

readblocks(block_num: int, buf: bytearray) None
readblocks(block_num: int, buf: bytearray, offset: int) None

Bájtokat olvas az eszközről a buf pufferbe. Két túlterhelés (overload) teszi elérhetővé az egyszerű és kibővített interfészt.

Egyszerű forma (readblocks(block_num, buf)): teljes blokkokat olvas a block_num blokkindextől kezdve. A len(buf) értékének a blokkméret többszörösének kell lennie, és a beolvasott blokkok száma len(buf) // block_size.

Kibővített forma (readblocks(block_num, buf, offset)): len(buf) bájtot olvas be – nem feltétlenül egész számú blokkot – a block_num blokkon belüli offset bájttól kezdve. Akkor használja ezt a formát, amikor a fájlrendszernek al-blokk szintű olvasási hozzáférésre van szüksége.

writeblocks(block_num: int, buf: bytes) None
writeblocks(block_num: int, buf: bytes, offset: int) None

Bájtokat ír a buf pufferből az eszközre.

Egyszerű forma (writeblocks(block_num, buf)): teljes blokkokat ír a block_num blokkindextől kezdve. A len(buf) értékének a blokkméret többszörösének kell lennie, és a kiírt blokkok száma len(buf) // block_size. Az implementáció felelős minden célblokk előzetes törléséért, ha az alapul szolgáló hardver ezt megköveteli.

Kibővített forma (writeblocks(block_num, buf, offset)): len(buf) bájtot ír – nem feltétlenül egész számú blokkot – a block_num blokkon belüli offset bájttól kezdve. Csak az éppen kiírt bájtok változhatnak meg; a hívó fél felelős azért, hogy az érintett blokkok egy korábbi ioctl(6, block_num) hívással törölve legyenek. Ennek a formának az implementációi soha nem törölhetnek implicit módon egy blokkot, még akkor sem, ha az offset értéke nulla.

ioctl(op: int, arg: int) int | None

Vezérli a blokkeszközt, és lekérdezi annak paramétereit. A végrehajtandó műveletet az op adja meg, amely a következő egész számok egyike:

  • 1 – az eszköz inicializálása (az arg nem használt)

  • 2 – az eszköz leállítása (az arg nem használt)

  • 3 – az eszköz szinkronizálása (az arg nem használt)

  • 4 – a blokkok számának lekérdezése, egész számot kell visszaadnia (az arg nem használt)

  • 5 – egy blokkban lévő bájtok számának lekérdezése, egész számot kell visszaadnia, vagy None értéket, amely esetben az alapértelmezett 512-es érték lesz használva (az arg nem használt)

  • 6 – egy blokk törlése, az arg a törlendő blokk száma

Legalább az ioctl(4, ...) műveletet el kell kapni; a kibővített interfészt használó fájlrendszerek ezen felül az ioctl(6, ...) műveletet is megkövetelik. A többi művelet szükségessége hardverfüggő.

Minden writeblocks(block, ...) hívás előtt egy kibővített interfészt használó fájlrendszer kiadja az ioctl(6, block) hívást, hogy a meghajtó először törölhesse a blokkot, ha a hardver ezt megköveteli. Egy meghajtó ehelyett elkaphatja az ioctl(6, block) hívást, és 0-t (sikert) adhat vissza, magára vállalva annak felelősségét, hogy maga ismerje fel, mikor van szükség törlésre.

Hacsak nincs másként megadva, az ioctl(op, arg) visszaadhat None értéket. Ennek következtében egy implementáció figyelmen kívül hagyhatja az op nem használt értékeit. Ahol az op el van kapva, ott a 4-es és 5-ös műveletek visszatérési értéke a fentebb részletezettek szerint alakul. A többi műveletnek sikeresség esetén 0-t, hiba esetén nem nulla értéket kell visszaadnia, ahol a visszaadott érték egy OSError errno kód.