vfs — sanal dosya sistemi denetimi¶
vfs modülü, dosya sistemi nesneleri oluşturmaya ve bunları Sanal Dosya Sistemi içinde bağlamaya/ayırmaya yönelik işlevler içerir.
Dosya sistemi bağlama¶
Bazı portlar bir Sanal Dosya Sistemi (VFS) ve bu VFS içinde birden fazla “gerçek” dosya sistemini bağlama yeteneği sağlar. Dosya sistemi nesneleri ya VFS’in kök dizinine ya da kökte yer alan bir alt dizine bağlanabilir. Bu, Python programları tarafından görülen dosya sisteminin dinamik ve esnek bir şekilde yapılandırılmasına olanak tanır. Bu işlevselliğe sahip portlar mount() ve umount() işlevlerini ve muhtemelen VFS sınıfları ile temsil edilen çeşitli dosya sistemi uygulamalarını sağlar.
- vfs.mount(fsobj: Any, mount_point: str, *, readonly: bool = False) None¶
fsobj dosya sistemi nesnesini, VFS içinde mount_point dizesiyle verilen konuma bağlar. fsobj,
mount()metoduna sahip bir VFS nesnesi ya da bir blok aygıtı olabilir. Bir blok aygıtıysa, dosya sistemi türü otomatik olarak algılanır (tanınan bir dosya sistemi yoksa bir istisna oluşturulur). mount_point, fsobj‘i kök dizine bağlamak için'/'ya da kökün altındaki bir alt dizine bağlamak için'/<name>'olabilir.readonly
Trueise dosya sistemi salt okunur olarak bağlanır.Bağlama işlemi sırasında dosya sistemi nesnesi üzerinde
mount()metodu çağrılır.mount_point zaten bağlıysa
OSError(EPERM)oluşturulur.
- vfs.mount() List[Tuple[Any, str]]
mount()işlevine hiçbir bağımsız değişken verilmezse, etkin tüm bağlama noktalarını temsil eden bir demet listesi döndürülür.Döndürülen liste [(fsobj, mount_point), …] biçimindedir.
- vfs.umount(mount_point: str | Any) None¶
Bir dosya sistemini ayırır. mount_point, bağlama konumunu adlandıran bir dize ya da daha önce bağlanmış bir dosya sistemi nesnesi olabilir. Ayırma işlemi sırasında dosya sistemi nesnesi üzerinde
umount()metodu çağrılır.mount_point bulunamazsa
OSError(EINVAL)oluşturulur.
- class vfs.VfsFat(block_dev: AbstractBlockDev)¶
FAT dosya sistemi biçimini kullanan bir dosya sistemi nesnesi oluşturur. FAT dosya sisteminin depolaması block_dev tarafından sağlanır. Bu yapıcıyla oluşturulan nesneler
mount()kullanılarak bağlanabilir.- static mkfs(block_dev: AbstractBlockDev) None¶
block_dev üzerinde bir FAT dosya sistemi oluşturur.
- class vfs.VfsRom(buffer: bytes | bytearray | memoryview)¶
ROMFS salt okunur dosya sistemi biçimini kullanan bir dosya sistemi nesnesi oluşturur.
buffer, geçerli bir ROMFS imajı içeren ve arabellek protokolünü destekleyen bir nesne (bytes,bytearrayya damemoryview) olmalıdır.Bu yapıcıyla oluşturulan nesneler
mount()kullanılarak bağlanabilir.ROMFS imajlarının mpremote ile nasıl oluşturulup dağıtılacağı dahil tüm ayrıntılar için bkz. ROMFS ile Çalışma.
- vfs.rom_ioctl(op: int, *args: Any) Any¶
Aygıtın salt okunur bellek (ROM) bölümlerine erişmek için alt seviye arayüz. Desteklenen işlemler şunlardır:
Çağrı
Davranış
rom_ioctl(1)Kullanılabilir ROM bölümlerinin sayısını döndürür.
rom_ioctl(2, id)idbölümünü birmemoryviewolarak döndürür.rom_ioctl(3, id, length)Yazmaya hazırlık olarak
idbölümünün ilklengthbaytını siler. Bayt cinsinden minimum yazma hizalamasını döndürür.rom_ioctl(4, id, offset, buf)buf‘uidbölümüneoffsetbaytı konumunda yazar.rom_ioctl(5, id)idbölümüne yapılan bir yazma dizisini sonlandırır (önbellekleri boşaltır vb.).Bu işlemler normalde bir ROMFS imajı dağıtılırken mpremote tarafından dolaylı olarak çağrılır; çoğu uygulamanın bunları doğrudan çağırması gerekmez.
- class vfs.VfsPosix(root: str | None = None)¶
Ana makine POSIX dosya sistemine erişen bir dosya sistemi nesnesi oluşturur. root belirtilirse,
VfsPosixnesnesinin kökü olarak kullanılacak, ana makine dosya sistemindeki bir yol olmalıdır. Aksi takdirde ana makine dosya sisteminin geçerli dizini kullanılır.Not
VfsPosixyalnızca MicroPython Unix portunda kullanılabilir; OpenMV Cam aygıt yazılımında (firmware) bulunmaz.
Blok aygıtları¶
Blok aygıtı, blok protokolünü uygulayan bir nesnedir. Bu, bir aygıtın MicroPython dosya sistemlerini desteklemesini sağlar. Fiziksel donanım, kullanıcı tanımlı bir sınıfla temsil edilir. AbstractBlockDev sınıfı, böyle bir sınıfın tasarımı için bir şablondur: MicroPython aslında bu sınıfı sağlamaz, ancak gerçek bir blok aygıtı sınıfı aşağıda açıklanan metotları uygulamalıdır.
Bu sınıfın somut bir uygulaması genellikle bir donanım parçasının (flash bellek gibi) bellek benzeri işlevselliğine erişime izin verir. Bir blok aygıtı, desteklenen herhangi bir dosya sistemine biçimlendirilebilir ve os metotları kullanılarak bağlanabilir.
Aşağıda açıklanan blok protokolünün iki çeşidini kullanan blok aygıtı örnek uygulamaları için bkz. Dosya sistemleriyle çalışma.
Basit ve genişletilmiş arayüz¶
Çeşitli kullanım durumlarını desteklemek için readblocks ve writeblocks metotlarının (aşağıya bakın) uyumlu iki imzası vardır. Belirli bir blok aygıtı bunlardan birini ya da diğerini, ya da her ikisini aynı anda uygulayabilir. İkinci biçim (offset parametresine sahip olan) “genişletilmiş arayüz” olarak adlandırılır.
Bazı dosya sistemleri yazma işlemleri üzerinde daha fazla denetim gerektirir – örneğin, silmeden alt blok bölgelerine yazmak gibi – ve blok aygıtının genişletilmiş arayüzü desteklemesine ihtiyaç duyar.
- class vfs.AbstractBlockDev¶
Blok aygıtı protokolü için belgeleme şablonu. MicroPython bu sınıfı aslında açığa çıkarmaz — burada yalnızca kullanıcı tanımlı bir blok aygıtı sınıfının uygulaması gereken metotları belgelemek için gösterilmiştir. Yapıcı bağımsız değişkenleri tamamen uygulamaya bağlıdır (genellikle flash veri yolu, çip seçim pini, sektör boyutu vb. gibi şeyler).
- readblocks(block_num: int, buf: bytearray) None¶
- readblocks(block_num: int, buf: bytearray, offset: int) None
Aygıttan buf‘a baytları okur. İki aşırı yükleme basit ve genişletilmiş arayüzleri açığa çıkarır.
Basit biçim (
readblocks(block_num, buf)): block_num blok dizininden başlayarak tam blokları okur.len(buf)blok boyutunun katı olmalıdır ve okunan blok sayısılen(buf) // block_size‘dir.Genişletilmiş biçim (
readblocks(block_num, buf, offset)): block_num bloğu içindeoffsetbaytı konumundan başlayaraklen(buf)bayt okur – ille de tam sayıda blok olması gerekmez. Dosya sisteminin alt blok okuma erişimine ihtiyaç duyduğu durumlarda bu biçimi kullanın.
- writeblocks(block_num: int, buf: bytes) None¶
- writeblocks(block_num: int, buf: bytes, offset: int) None
buf‘tan aygıta baytları yazar.
Basit biçim (
writeblocks(block_num, buf)): block_num blok dizininden başlayarak tam blokları yazar.len(buf)blok boyutunun katı olmalıdır ve yazılan blok sayısılen(buf) // block_size‘dir. Alttaki donanım gerektiriyorsa, her hedef bloğu önce silmekten uygulama sorumludur.Genişletilmiş biçim (
writeblocks(block_num, buf, offset)): block_num bloğu içindeoffsetbaytı konumundan başlayaraklen(buf)bayt yazar – ille de tam sayıda blok olması gerekmez. Yalnızca yazılmakta olan baytlar değişebilir; etkilenen blokların daha önce birioctl(6, block_num)çağrısıyla silinmiş olmasını sağlamaktan çağıran sorumludur. Bu biçimin uygulamaları,offsetsıfır olsa bile bir bloğu asla örtük olarak silmemelidir.
- ioctl(op: int, arg: int) int | None¶
Blok aygıtını denetler ve parametrelerini sorgular. Gerçekleştirilecek işlem, aşağıdaki tam sayılardan biri olan op ile verilir:
1 – aygıtı başlat (arg kullanılmaz)
2 – aygıtı kapat (arg kullanılmaz)
3 – aygıtı eşitle (arg kullanılmaz)
4 – blok sayısını al, bir tam sayı döndürmelidir (arg kullanılmaz)
5 – bir bloktaki bayt sayısını al, bir tam sayı döndürmeli ya da bu durumda varsayılan 512 değeri kullanılan
Nonedöndürmelidir (arg kullanılmaz)6 – bir bloğu sil, arg silinecek blok numarasıdır
En azından
ioctl(4, ...)yakalanmalıdır; genişletilmiş arayüzü kullanan dosya sistemleri ek olarakioctl(6, ...)gerektirir. Diğer işlemlere olan ihtiyaç donanıma bağlıdır.Genişletilmiş arayüzü kullanan bir dosya sistemi, herhangi bir
writeblocks(block, ...)çağrısından önceioctl(6, block)yayınlar; böylece sürücü, donanım gerektiriyorsa bloğu önce silebilir. Bir sürücü bunun yerineioctl(6, block)‘u yakalayıp 0 (başarı) döndürerek, silmenin ne zaman gerektiğini kendisi algılama sorumluluğunu üstlenebilir.Aksi belirtilmedikçe
ioctl(op, arg)Nonedöndürebilir. Sonuç olarak bir uygulama,op‘un kullanılmayan değerlerini yok sayabilir.op‘un yakalandığı durumlarda, 4 ve 5 numaralı işlemler için döndürülen değer yukarıda ayrıntılandırıldığı gibidir. Diğer işlemler başarıda 0, başarısızlıkta sıfır olmayan bir değer döndürmelidir; döndürülen değer birOSErrorerrno kodudur.