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.