vfs --- kontrol sistem berkas virtual

Modul vfs berisi fungsi-fungsi untuk membuat objek sistem berkas dan memasang/melepasnya dalam Sistem Berkas Virtual.

Pemasangan sistem berkas

Beberapa port menyediakan Sistem Berkas Virtual (VFS) dan kemampuan untuk memasang beberapa sistem berkas "nyata" di dalam VFS tersebut. Objek sistem berkas dapat dipasang di root VFS atau di subdirektori yang ada di root. Hal ini memungkinkan konfigurasi sistem berkas yang dinamis dan fleksibel yang terlihat oleh program Python. Port yang memiliki fungsionalitas ini menyediakan fungsi mount() dan umount(), serta berbagai implementasi sistem berkas yang diwakili oleh kelas-kelas VFS.

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

Pasang objek sistem berkas fsobj pada lokasi di VFS yang ditentukan oleh string mount_point. fsobj dapat berupa objek VFS yang memiliki metode mount(), atau sebuah perangkat blok. Jika merupakan perangkat blok, jenis sistem berkas akan dideteksi secara otomatis (pengecualian akan dimunculkan jika tidak ada sistem berkas yang dikenali). mount_point dapat berupa '/' untuk memasang fsobj di root, atau '/<name>' untuk memasangnya di subdirektori di bawah root.

Jika readonly adalah True, sistem berkas dipasang dalam mode hanya-baca.

Selama proses pemasangan, metode mount() dipanggil pada objek sistem berkas.

Akan memunculkan OSError(EPERM) jika mount_point sudah terpasang.

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

Tanpa argumen untuk mount(), kembalikan daftar tuple yang mewakili semua titik pemasangan aktif.

Daftar yang dikembalikan memiliki bentuk [(fsobj, mount_point), ...].

vfs.umount(mount_point: str | Any) None

Lepas pasang sebuah sistem berkas. mount_point dapat berupa string yang menamai lokasi pemasangan, atau objek sistem berkas yang sebelumnya telah dipasang. Selama proses pelepasan pemasangan, metode umount() dipanggil pada objek sistem berkas.

Akan memunculkan OSError(EINVAL) jika mount_point tidak ditemukan.

class vfs.VfsFat(block_dev: AbstractBlockDev)

Buat objek sistem berkas yang menggunakan format sistem berkas FAT. Penyimpanan sistem berkas FAT disediakan oleh block_dev. Objek yang dibuat oleh konstruktor ini dapat dipasang menggunakan mount().

static mkfs(block_dev: AbstractBlockDev) None

Bangun sistem berkas FAT pada block_dev.

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

Buat objek sistem berkas yang menggunakan format sistem berkas hanya-baca ROMFS. buffer harus berupa objek yang mendukung protokol buffer (bytes, bytearray, atau memoryview) yang berisi citra ROMFS yang valid.

Objek yang dibuat oleh konstruktor ini dapat dipasang menggunakan mount().

Lihat Bekerja dengan ROMFS untuk detail lengkap, termasuk cara membangun dan menerapkan citra ROMFS dengan mpremote.

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

Antarmuka tingkat rendah untuk mengakses partisi memori hanya-baca (ROM) pada perangkat. Operasi yang didukung adalah:

Panggilan

Perilaku

rom_ioctl(1)

Kembalikan jumlah partisi ROM yang tersedia.

rom_ioctl(2, id)

Kembalikan partisi id sebagai memoryview.

rom_ioctl(3, id, length)

Hapus length byte pertama dari partisi id sebagai persiapan untuk penulisan. Kembalikan keselarasan penulisan minimum dalam byte.

rom_ioctl(4, id, offset, buf)

Tulis buf ke partisi id pada byte offset.

rom_ioctl(5, id)

Selesaikan urutan penulisan ke partisi id (siram cache, dll.).

Operasi ini biasanya dipanggil secara tidak langsung oleh mpremote saat menerapkan citra ROMFS; sebagian besar aplikasi tidak perlu memanggilnya secara langsung.

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

Buat objek sistem berkas yang mengakses sistem berkas POSIX host. Jika root ditentukan, itu harus merupakan path dalam sistem berkas host yang digunakan sebagai root objek VfsPosix. Jika tidak, direktori saat ini dari sistem berkas host akan digunakan.

Catatan

VfsPosix hanya tersedia di port Unix MicroPython; tidak tersedia dalam firmware OpenMV Cam.

Perangkat blok

Perangkat blok adalah objek yang mengimplementasikan protokol blok. Hal ini memungkinkan sebuah perangkat untuk mendukung sistem berkas MicroPython. Perangkat keras fisik diwakili oleh kelas yang ditentukan pengguna. Kelas AbstractBlockDev adalah template untuk perancangan kelas tersebut: MicroPython tidak benar-benar menyediakan kelas itu, tetapi kelas perangkat blok yang sebenarnya harus mengimplementasikan metode-metode yang dijelaskan di bawah ini.

Implementasi konkret dari kelas ini biasanya memungkinkan akses ke fungsionalitas seperti memori dari suatu perangkat keras (seperti flash memory). Perangkat blok dapat diformat ke sistem berkas yang didukung dan dipasang menggunakan metode os.

Lihat Bekerja dengan filesystem untuk contoh implementasi perangkat blok menggunakan dua varian protokol blok yang dijelaskan di bawah ini.

Antarmuka sederhana dan diperluas

Ada dua tanda tangan yang kompatibel untuk metode readblocks dan writeblocks (lihat di bawah), untuk mendukung berbagai kasus penggunaan. Suatu perangkat blok tertentu dapat mengimplementasikan satu bentuk atau yang lainnya, atau keduanya sekaligus. Bentuk kedua (dengan parameter offset) disebut sebagai "antarmuka diperluas".

Beberapa sistem berkas memerlukan kontrol lebih atas operasi tulis -- misalnya, menulis ke wilayah sub-blok tanpa menghapus -- dan membutuhkan perangkat blok untuk mendukung antarmuka diperluas.

class vfs.AbstractBlockDev

Template dokumentasi untuk protokol perangkat blok. MicroPython tidak benar-benar mengekspos kelas ini --- kelas ini hanya ditampilkan di sini untuk mendokumentasikan metode yang harus diimplementasikan oleh kelas perangkat blok yang ditentukan pengguna. Argumen konstruktor sepenuhnya bergantung pada implementasi (biasanya hal-hal seperti bus flash, pin chip-select, ukuran sektor, dll.).

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

Baca byte dari perangkat ke dalam buf. Dua overload mengekspos antarmuka sederhana dan diperluas.

Bentuk sederhana (readblocks(block_num, buf)): membaca seluruh blok mulai dari indeks blok block_num. len(buf) harus merupakan kelipatan dari ukuran blok, dan jumlah blok yang dibaca adalah len(buf) // block_size.

Bentuk diperluas (readblocks(block_num, buf, offset)): membaca len(buf) byte -- tidak harus merupakan bilangan bulat blok -- mulai dari byte offset dalam blok block_num. Gunakan bentuk ini ketika sistem berkas memerlukan akses baca sub-blok.

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

Tulis byte dari buf ke perangkat.

Bentuk sederhana (writeblocks(block_num, buf)): menulis seluruh blok mulai dari indeks blok block_num. len(buf) harus merupakan kelipatan dari ukuran blok, dan jumlah blok yang ditulis adalah len(buf) // block_size. Implementasi bertanggung jawab untuk menghapus setiap blok tujuan terlebih dahulu jika perangkat keras yang mendasarinya memerlukannya.

Bentuk diperluas (writeblocks(block_num, buf, offset)): menulis len(buf) byte -- tidak harus merupakan bilangan bulat blok -- mulai dari byte offset dalam blok block_num. Hanya byte yang ditulis yang boleh berubah; pemanggil bertanggung jawab untuk memastikan blok yang terpengaruh telah dihapus melalui panggilan ioctl(6, block_num) sebelumnya. Implementasi dari bentuk ini tidak boleh secara implisit menghapus blok, bahkan ketika offset adalah nol.

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

Kontrol perangkat blok dan kueri parameternya. Operasi yang akan dilakukan diberikan oleh op yang merupakan salah satu bilangan bulat berikut:

  • 1 -- inisialisasi perangkat (arg tidak digunakan)

  • 2 -- matikan perangkat (arg tidak digunakan)

  • 3 -- sinkronkan perangkat (arg tidak digunakan)

  • 4 -- dapatkan jumlah blok, harus mengembalikan bilangan bulat (arg tidak digunakan)

  • 5 -- dapatkan jumlah byte dalam sebuah blok, harus mengembalikan bilangan bulat, atau None di mana dalam hal ini nilai default 512 digunakan (arg tidak digunakan)

  • 6 -- hapus sebuah blok, arg adalah nomor blok yang akan dihapus

Minimal ioctl(4, ...) harus disadap; sistem berkas yang menggunakan antarmuka diperluas juga memerlukan ioctl(6, ...). Kebutuhan operasi lainnya bergantung pada perangkat keras.

Sebelum setiap panggilan ke writeblocks(block, ...), sistem berkas yang menggunakan antarmuka diperluas mengeluarkan ioctl(6, block) sehingga driver dapat menghapus blok terlebih dahulu jika perangkat keras memerlukannya. Driver dapat sebagai gantinya menyadap ioctl(6, block) dan mengembalikan 0 (berhasil), mengambil tanggung jawab untuk mendeteksi kapan penghapusan diperlukan sendiri.

Kecuali dinyatakan sebaliknya, ioctl(op, arg) dapat mengembalikan None. Oleh karena itu implementasi dapat mengabaikan nilai op yang tidak digunakan. Saat op disadap, nilai kembalian untuk operasi 4 dan 5 seperti yang dijelaskan di atas. Operasi lain harus mengembalikan 0 untuk keberhasilan dan nilai bukan-nol untuk kegagalan, dengan nilai yang dikembalikan berupa kode errno OSError.