vfs — virtuaalisen tiedostojärjestelmän hallinta

vfs-moduuli sisältää funktioita tiedostojärjestelmäobjektien luomiseen sekä niiden liittämiseen ja irrottamiseen virtuaalisessa tiedostojärjestelmässä.

Tiedostojärjestelmän liittäminen

Jotkin portit tarjoavat virtuaalisen tiedostojärjestelmän (VFS) ja mahdollisuuden liittää useita ”todellisia” tiedostojärjestelmiä tähän VFS:ään. Tiedostojärjestelmäobjektit voidaan liittää joko VFS:n juureen tai juuressa sijaitsevaan alihakemistoon. Tämä mahdollistaa Python-ohjelmien näkemän tiedostojärjestelmän dynaamisen ja joustavan määrittelyn. Portit, joissa on tämä toiminnallisuus, tarjoavat funktiot mount() ja umount() sekä mahdollisesti erilaisia tiedostojärjestelmätoteutuksia, joita edustavat VFS-luokat.

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

Liittää tiedostojärjestelmäobjektin fsobj VFS:ssä paikkaan, jonka mount_point-merkkijono määrittää. fsobj voi olla VFS-objekti, jolla on mount()-metodi, tai lohkolaite. Jos kyseessä on lohkolaite, tiedostojärjestelmän tyyppi tunnistetaan automaattisesti (poikkeus nostetaan, jos mitään tiedostojärjestelmää ei tunnistettu). mount_point voi olla '/', jolloin fsobj liitetään juureen, tai '/<name>', jolloin se liitetään juuren alla olevaan alihakemistoon.

Jos readonly on True, tiedostojärjestelmä liitetään vain luku -tilassa.

Liittämisen aikana tiedostojärjestelmäobjektin mount()-metodia kutsutaan.

Nostaa OSError(EPERM), jos mount_point on jo liitetty.

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

Kun mount() kutsutaan ilman argumentteja, palautetaan lista monikoista, jotka edustavat kaikkia aktiivisia liitospisteitä.

Palautettu lista on muotoa [(fsobj, mount_point), …].

vfs.umount(mount_point: str | Any) None

Irrottaa tiedostojärjestelmän. mount_point voi olla merkkijono, joka nimeää liitospaikan, tai aiemmin liitetty tiedostojärjestelmäobjekti. Irrotuksen aikana tiedostojärjestelmäobjektin umount()-metodia kutsutaan.

Nostaa OSError(EINVAL), jos mount_point -liitospistettä ei löydy.

class vfs.VfsFat(block_dev: AbstractBlockDev)

Luo tiedostojärjestelmäobjektin, joka käyttää FAT-tiedostojärjestelmämuotoa. FAT-tiedostojärjestelmän tallennustila tarjotaan block_dev:n kautta. Tällä konstruktorilla luodut objektit voidaan liittää funktiolla mount().

static mkfs(block_dev: AbstractBlockDev) None

Rakentaa FAT-tiedostojärjestelmän block_dev:hen.

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

Luo tiedostojärjestelmäobjektin, joka käyttää ROMFS-pohjaista vain luku -tiedostojärjestelmämuotoa. buffer täytyy olla puskuriprotokollaa tukeva objekti (bytes, bytearray tai memoryview), joka sisältää kelvollisen ROMFS-vedoksen.

Tällä konstruktorilla luodut objektit voidaan liittää funktiolla mount().

Katso ROMFS:n käyttö saadaksesi täydelliset tiedot, mukaan lukien kuinka ROMFS-vedoksia rakennetaan ja otetaan käyttöön työkalulla mpremote.

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

Matalan tason rajapinta laitteen vain luku -muistin (ROM) osioiden käyttöön. Tuetut toiminnot ovat:

Kutsu

Toiminta

rom_ioctl(1)

Palauttaa käytettävissä olevien ROM-osioiden määrän.

rom_ioctl(2, id)

Palauttaa osion id muodossa memoryview.

rom_ioctl(3, id, length)

Tyhjentää osion id ensimmäiset length tavua kirjoituksen valmistelua varten. Palauttaa kirjoituksen vähimmäiskohdistuksen tavuina.

rom_ioctl(4, id, offset, buf)

Kirjoittaa buf:n osioon id tavusiirtymään offset.

rom_ioctl(5, id)

Viimeistelee kirjoitussekvenssin osioon id (tyhjentää välimuistit jne.).

Nämä toiminnot kutsutaan yleensä epäsuorasti työkalulla mpremote ROMFS-vedosta käyttöön otettaessa; useimpien sovellusten ei tarvitse kutsua niitä suoraan.

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

Luo tiedostojärjestelmäobjektin, joka käyttää isäntäkoneen POSIX-tiedostojärjestelmää. Jos root on määritetty, sen tulisi olla isäntäkoneen tiedostojärjestelmän polku, jota käytetään VfsPosix-objektin juurena. Muutoin käytetään isäntäkoneen tiedostojärjestelmän nykyistä hakemistoa.

Muista

VfsPosix on saatavilla vain MicroPythonin Unix-portissa; sitä ei ole OpenMV Camin laiteohjelmistossa.

Lohkolaitteet

Lohkolaite on objekti, joka toteuttaa lohkoprotokollan. Tämä mahdollistaa laitteen tukemaan MicroPython-tiedostojärjestelmiä. Fyysistä laitteistoa edustaa käyttäjän määrittelemä luokka. AbstractBlockDev-luokka on malli tällaisen luokan suunnittelulle: MicroPython ei itse asiassa tarjoa tätä luokkaa, mutta varsinaisen lohkolaiteluokan täytyy toteuttaa alla kuvatut metodit.

Tämän luokan konkreettinen toteutus mahdollistaa yleensä pääsyn jonkin laitteiston muistinkaltaiseen toiminnallisuuteen (kuten flash-muistiin). Lohkolaite voidaan alustaa mihin tahansa tuettuun tiedostojärjestelmään ja liittää os-metodien avulla.

Katso Tiedostojärjestelmien käyttö saadaksesi esimerkkitoteutuksia lohkolaitteista, jotka käyttävät alla kuvattuja lohkoprotokollan kahta muunnelmaa.

Yksinkertainen ja laajennettu rajapinta

Metodeille readblocks ja writeblocks on kaksi yhteensopivaa signatuuria (katso alla), jotta voidaan tukea erilaisia käyttötapauksia. Tietty lohkolaite voi toteuttaa yhden tai toisen muodon tai molemmat samanaikaisesti. Toiseen muotoon (offset-parametrilla) viitataan ”laajennettuna rajapintana”.

Jotkin tiedostojärjestelmät vaativat enemmän hallintaa kirjoitusoperaatioiden suhteen – esimerkiksi alilohkoalueille kirjoittamista ilman tyhjentämistä – ja edellyttävät, että lohkolaite tukee laajennettua rajapintaa.

class vfs.AbstractBlockDev

Dokumentaatiomalli lohkolaiteprotokollalle. MicroPython ei itse asiassa altista tätä luokkaa — se näytetään tässä vain dokumentoimaan metodit, jotka käyttäjän määrittelemän lohkolaiteluokan täytyy toteuttaa. Konstruktorin argumentit ovat täysin toteutuksen päätettävissä (tyypillisesti esimerkiksi flash-väylä, chip-select-nasta, sektorin koko jne.).

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

Lukee tavuja laitteesta puskuriin buf. Kaksi ylikuormitusta altistaa yksinkertaisen ja laajennetun rajapinnan.

Yksinkertainen muoto (readblocks(block_num, buf)): lukee kokonaisia lohkoja alkaen lohkoindeksistä block_num. len(buf) täytyy olla lohkokoon monikerta, ja luettujen lohkojen määrä on len(buf) // block_size.

Laajennettu muoto (readblocks(block_num, buf, offset)): lukee len(buf) tavua – ei välttämättä kokonaista lohkomäärää – alkaen tavusiirtymästä offset lohkon block_num sisällä. Käytä tätä muotoa, kun tiedostojärjestelmä tarvitsee alilohkotason lukukäytön.

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

Kirjoittaa tavuja puskurista buf laitteeseen.

Yksinkertainen muoto (writeblocks(block_num, buf)): kirjoittaa kokonaisia lohkoja alkaen lohkoindeksistä block_num. len(buf) täytyy olla lohkokoon monikerta, ja kirjoitettujen lohkojen määrä on len(buf) // block_size. Toteutus vastaa kunkin kohdelohkon tyhjentämisestä ensin, jos taustalla oleva laitteisto sitä vaatii.

Laajennettu muoto (writeblocks(block_num, buf, offset)): kirjoittaa len(buf) tavua – ei välttämättä kokonaista lohkomäärää – alkaen tavusiirtymästä offset lohkon block_num sisällä. Vain kirjoitettavat tavut voivat muuttua; kutsuja vastaa siitä, että vaikutuksen alaiset lohkot on tyhjennetty aiemmalla ioctl(6, block_num) -kutsulla. Tämän muodon toteutukset eivät saa koskaan implisiittisesti tyhjentää lohkoa, edes silloin kun offset on nolla.

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

Ohjaa lohkolaitetta ja kysyy sen parametreja. Suoritettava operaatio annetaan parametrilla op, joka on jokin seuraavista kokonaisluvuista:

  • 1 – alustaa laitteen (arg ei ole käytössä)

  • 2 – sammuttaa laitteen (arg ei ole käytössä)

  • 3 – synkronoi laitteen (arg ei ole käytössä)

  • 4 – hakee lohkojen lukumäärän, palauttaa kokonaisluvun (arg ei ole käytössä)

  • 5 – hakee lohkon tavujen määrän, palauttaa kokonaisluvun tai None, jolloin käytetään oletusarvoa 512 (arg ei ole käytössä)

  • 6 – tyhjentää lohkon, arg on tyhjennettävän lohkon numero

Vähintään ioctl(4, ...) täytyy siepata; laajennettua rajapintaa käyttävät tiedostojärjestelmät vaativat lisäksi ioctl(6, ...). Muiden operaatioiden tarve on laitteistosta riippuvainen.

Ennen jokaista writeblocks(block, ...) -kutsua laajennettua rajapintaa käyttävä tiedostojärjestelmä antaa kutsun ioctl(6, block), jotta ajuri voi tyhjentää lohkon ensin, jos laitteisto sitä vaatii. Ajuri voi vaihtoehtoisesti siepata kutsun ioctl(6, block) ja palauttaa 0 (onnistuminen) ottaen itse vastuun sen tunnistamisesta, milloin tyhjennystä tarvitaan.

Ellei toisin mainita, ioctl(op, arg) voi palauttaa None. Näin ollen toteutus voi jättää huomiotta käyttämättömät op-arvot. Kun op siepataan, operaatioiden 4 ja 5 palautusarvot ovat yllä kuvatun mukaiset. Muiden operaatioiden tulisi palauttaa 0 onnistuessaan ja nollasta poikkeava arvo epäonnistuessaan, jolloin palautettu arvo on OSError-errno-koodi.