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
bufferegy olyan objektum kell legyen, amely támogatja a puffer protokollt (bytes,bytearrayvagymemoryview), é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)
idpartíciótmemoryviewobjektumként.rom_ioctl(3, id, length)Törli a(z)
idpartíció elsőlengthbá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
buftartalmát a(z)idpartícióba írja a(z)offsetbájteltolásnál.rom_ioctl(5, id)Lezárja a(z)
idpartí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
VfsPosixobjektum 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
VfsPosixcsak 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. Alen(buf)értékének a blokkméret többszörösének kell lennie, és a beolvasott blokkok számalen(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ülioffsetbá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. Alen(buf)értékének a blokkméret többszörösének kell lennie, és a kiírt blokkok számalen(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ülioffsetbá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ábbiioctl(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 azoffseté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 azioctl(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 azioctl(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 azioctl(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)visszaadhatNoneértéket. Ennek következtében egy implementáció figyelmen kívül hagyhatja azopnem használt értékeit. Ahol azopel 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 egyOSErrorerrno kód.