vfs --- điều khiển hệ thống tập tin ảo¶
Module vfs chứa các hàm để tạo đối tượng hệ thống tập tin và gắn kết/tháo gắn kết chúng trong Hệ thống Tập tin Ảo.
Gắn kết hệ thống tập tin¶
Một số cổng cung cấp Hệ thống Tập tin Ảo (VFS) và khả năng gắn kết nhiều hệ thống tập tin "thực" trong VFS này. Các đối tượng hệ thống tập tin có thể được gắn kết tại thư mục gốc của VFS, hoặc tại một thư mục con nằm trong thư mục gốc. Điều này cho phép cấu hình linh hoạt và động của hệ thống tập tin mà các chương trình Python nhìn thấy. Các cổng có chức năng này cung cấp hàm mount() và umount(), và có thể có các triển khai hệ thống tập tin khác nhau được đại diện bởi các lớp VFS.
- vfs.mount(fsobj: Any, mount_point: str, *, readonly: bool = False) None¶
Gắn kết đối tượng hệ thống tập tin fsobj tại vị trí trong VFS được chỉ định bởi chuỗi mount_point. fsobj có thể là đối tượng VFS có phương thức
mount(), hoặc là thiết bị khối. Nếu là thiết bị khối thì loại hệ thống tập tin sẽ được tự động phát hiện (ngoại lệ sẽ được ném ra nếu không nhận ra hệ thống tập tin nào). mount_point có thể là'/'để gắn kết fsobj tại thư mục gốc, hoặc'/<name>'để gắn kết tại thư mục con bên dưới thư mục gốc.Nếu readonly là
Truethì hệ thống tập tin được gắn kết ở chế độ chỉ đọc.Trong quá trình gắn kết, phương thức
mount()được gọi trên đối tượng hệ thống tập tin.Sẽ ném ra
OSError(EPERM)nếu mount_point đã được gắn kết.
- vfs.mount() List[Tuple[Any, str]]
Khi không có đối số truyền vào
mount(), trả về danh sách các tuple đại diện cho tất cả các điểm gắn kết đang hoạt động.Danh sách trả về có dạng [(fsobj, mount_point), ...].
- vfs.umount(mount_point: str | Any) None¶
Tháo gắn kết một hệ thống tập tin. mount_point có thể là chuỗi đặt tên vị trí gắn kết, hoặc là đối tượng hệ thống tập tin đã được gắn kết trước đó. Trong quá trình tháo gắn kết, phương thức
umount()được gọi trên đối tượng hệ thống tập tin.Sẽ ném ra
OSError(EINVAL)nếu không tìm thấy mount_point.
- class vfs.VfsFat(block_dev: AbstractBlockDev)¶
Tạo đối tượng hệ thống tập tin sử dụng định dạng hệ thống tập tin FAT. Bộ nhớ của hệ thống tập tin FAT được cung cấp bởi block_dev. Các đối tượng được tạo bởi hàm khởi tạo này có thể được gắn kết bằng
mount().- static mkfs(block_dev: AbstractBlockDev) None¶
Xây dựng hệ thống tập tin FAT trên block_dev.
- class vfs.VfsRom(buffer: bytes | bytearray | memoryview)¶
Tạo đối tượng hệ thống tập tin sử dụng định dạng hệ thống tập tin chỉ đọc ROMFS.
bufferphải là đối tượng hỗ trợ giao thức buffer (bytes,bytearrayhoặcmemoryview) chứa ảnh ROMFS hợp lệ.Các đối tượng được tạo bởi hàm khởi tạo này có thể được gắn kết bằng
mount().Xem Làm việc với ROMFS để biết chi tiết đầy đủ, bao gồm cách xây dựng và triển khai ảnh ROMFS bằng mpremote.
- vfs.rom_ioctl(op: int, *args: Any) Any¶
Giao diện cấp thấp để truy cập (các) phân vùng bộ nhớ chỉ đọc (ROM) của thiết bị. Các thao tác được hỗ trợ là:
Lệnh gọi
Hành vi
rom_ioctl(1)Trả về số lượng phân vùng ROM khả dụng.
rom_ioctl(2, id)Trả về phân vùng
iddưới dạngmemoryview.rom_ioctl(3, id, length)Xóa
lengthbyte đầu tiên của phân vùngidđể chuẩn bị ghi. Trả về căn chỉnh ghi tối thiểu theo byte.rom_ioctl(4, id, offset, buf)Ghi
bufvào phân vùngidtại byteoffset.rom_ioctl(5, id)Hoàn tất một chuỗi ghi vào phân vùng
id(xả bộ nhớ đệm cache, v.v.).Các thao tác này thường được thực hiện gián tiếp bởi mpremote khi triển khai ảnh ROMFS; hầu hết các ứng dụng không cần gọi trực tiếp chúng.
- class vfs.VfsPosix(root: str | None = None)¶
Tạo đối tượng hệ thống tập tin truy cập hệ thống tập tin POSIX của máy chủ. Nếu root được chỉ định thì nó phải là đường dẫn trong hệ thống tập tin máy chủ để sử dụng làm thư mục gốc của đối tượng
VfsPosix. Nếu không thì thư mục hiện tại của hệ thống tập tin máy chủ sẽ được sử dụng.Ghi chú
VfsPosixchỉ khả dụng trên cổng Unix của MicroPython; nó không có mặt trong firmware OpenMV Cam.
Thiết bị khối¶
Thiết bị khối là đối tượng triển khai giao thức khối. Điều này cho phép thiết bị hỗ trợ các hệ thống tập tin MicroPython. Phần cứng vật lý được đại diện bởi một lớp do người dùng định nghĩa. Lớp AbstractBlockDev là mẫu thiết kế cho lớp như vậy: MicroPython thực sự không cung cấp lớp đó, nhưng lớp thiết bị khối thực tế phải triển khai các phương thức được mô tả bên dưới.
Một triển khai cụ thể của lớp này thường sẽ cho phép truy cập vào chức năng giống bộ nhớ của một phần cứng (như bộ nhớ flash). Một thiết bị khối có thể được định dạng cho bất kỳ hệ thống tập tin được hỗ trợ nào và gắn kết bằng các phương thức của os.
Xem Làm việc với hệ thống tệp để biết các ví dụ triển khai thiết bị khối sử dụng hai biến thể của giao thức khối được mô tả bên dưới.
Giao diện đơn giản và mở rộng¶
Có hai chữ ký tương thích cho các phương thức readblocks và writeblocks (xem bên dưới), nhằm hỗ trợ nhiều trường hợp sử dụng khác nhau. Một thiết bị khối cụ thể có thể triển khai một trong hai dạng, hoặc cả hai cùng lúc. Dạng thứ hai (với tham số offset) được gọi là "giao diện mở rộng".
Một số hệ thống tập tin yêu cầu kiểm soát tốt hơn đối với các thao tác ghi -- ví dụ, ghi vào các vùng nhỏ hơn khối mà không xóa -- và cần thiết bị khối hỗ trợ giao diện mở rộng.
- class vfs.AbstractBlockDev¶
Mẫu tài liệu cho giao thức thiết bị khối. MicroPython thực sự không cung cấp lớp này --- nó được trình bày ở đây chỉ để ghi lại các phương thức mà lớp thiết bị khối do người dùng định nghĩa phải triển khai. Các đối số khởi tạo hoàn toàn tùy thuộc vào triển khai (thường là các thứ như bus flash, chân chip-select, kích thước sector, v.v.).
- readblocks(block_num: int, buf: bytearray) None¶
- readblocks(block_num: int, buf: bytearray, offset: int) None
Đọc các byte từ thiết bị vào buf. Hai dạng nạp chồng cung cấp giao diện đơn giản và mở rộng.
Dạng đơn giản (
readblocks(block_num, buf)): đọc toàn bộ các khối bắt đầu từ chỉ số khối block_num.len(buf)phải là bội số của kích thước khối, và số khối đọc làlen(buf) // block_size.Dạng mở rộng (
readblocks(block_num, buf, offset)): đọclen(buf)byte -- không nhất thiết phải là số nguyên lần khối -- bắt đầu từ byteoffsettrong khối block_num. Sử dụng dạng này khi hệ thống tập tin cần truy cập đọc nhỏ hơn khối.
- writeblocks(block_num: int, buf: bytes) None¶
- writeblocks(block_num: int, buf: bytes, offset: int) None
Ghi các byte từ buf vào thiết bị.
Dạng đơn giản (
writeblocks(block_num, buf)): ghi toàn bộ các khối bắt đầu từ chỉ số khối block_num.len(buf)phải là bội số của kích thước khối, và số khối ghi làlen(buf) // block_size. Triển khai chịu trách nhiệm xóa từng khối đích trước nếu phần cứng bên dưới yêu cầu.Dạng mở rộng (
writeblocks(block_num, buf, offset)): ghilen(buf)byte -- không nhất thiết phải là số nguyên lần khối -- bắt đầu từ byteoffsettrong khối block_num. Chỉ các byte đang được ghi mới có thể thay đổi; người gọi chịu trách nhiệm đảm bảo các khối bị ảnh hưởng đã được xóa thông qua lệnh gọiioctl(6, block_num)trước đó. Các triển khai dạng này tuyệt đối không được xóa khối ngầm định, kể cả khioffsetbằng không.
- ioctl(op: int, arg: int) int | None¶
Kiểm soát thiết bị khối và truy vấn các tham số của nó. Thao tác cần thực hiện được xác định bởi op là một trong các số nguyên sau:
1 -- khởi tạo thiết bị (arg không được sử dụng)
2 -- tắt thiết bị (arg không được sử dụng)
3 -- đồng bộ thiết bị (arg không được sử dụng)
4 -- lấy số lượng khối, phải trả về số nguyên (arg không được sử dụng)
5 -- lấy số byte trong một khối, phải trả về số nguyên, hoặc
Nonetrong trường hợp đó giá trị mặc định 512 được sử dụng (arg không được sử dụng)6 -- xóa một khối, arg là số khối cần xóa
Tối thiểu
ioctl(4, ...)phải được xử lý; các hệ thống tập tin sử dụng giao diện mở rộng cũng yêu cầuioctl(6, ...). Sự cần thiết của các thao tác khác phụ thuộc vào phần cứng.Trước bất kỳ lệnh gọi nào tới
writeblocks(block, ...)một hệ thống tập tin sử dụng giao diện mở rộng sẽ gọiioctl(6, block)để driver có thể xóa khối trước nếu phần cứng yêu cầu. Driver cũng có thể chặnioctl(6, block)và trả về 0 (thành công), tự đảm nhận trách nhiệm phát hiện khi nào cần xóa.Trừ khi có ghi chú khác,
ioctl(op, arg)có thể trả vềNone. Do đó, một triển khai có thể bỏ qua các giá trịopkhông sử dụng. Khiopđược xử lý, giá trị trả về cho các thao tác 4 và 5 như đã mô tả ở trên. Các thao tác khác nên trả về 0 khi thành công và khác 0 khi thất bại, với giá trị trả về là mã errnoOSError.