파일시스템 다루기#
이 튜토리얼에서는 OpenMV Cam이 장치 내 파일시스템을 제공하여 표준 Python 파일 I/O 메서드를 영구 저장소와 함께 사용할 수 있도록 하는 방법을 설명합니다.
OpenMV Cam은 전원이 켜질 때 기본 구성을 생성하고 기본 파일시스템을 자동으로 감지하여 마운트하므로, 이 튜토리얼은 주로 플래시를 다시 파티셔닝하거나 파일시스템 유형을 변경하거나 사용자 정의 블록 장치를 사용하려는 경우에 유용합니다.
파일시스템은 내부 플래시 메모리에 의해 지원되며, SD 카드가 설치된 경우에는 SD 카드에 의해 지원됩니다.
VFS#
MicroPython은 Unix와 유사한 가상 파일시스템(VFS) 계층을 구현합니다. 마운트된 모든 파일시스템은 루트 / 에서 시작하는 하나의 가상 파일시스템으로 결합됩니다. 파일시스템은 이 구조 내의 디렉터리에 마운트되며, 시작 시 작업 디렉터리는 기본 파일시스템으로 설정됩니다.
OpenMV Cam에서 내부 플래시는 /flash 에 마운트되며 작업 디렉터리가 됩니다. SD 카드가 설치되어 있으면 /sdcard 에 마운트되어 대신 작업 디렉터리가 됩니다.
블록 장치#
블록 장치는 vfs.AbstractBlockDev 프로토콜을 구현하는 클래스의 인스턴스입니다.
전원이 켜지면 OpenMV Cam은 내부 플래시(또는 SD 카드)에서 파일시스템을 감지하여 자동으로 구성하고 마운트하려고 시도합니다. 파일시스템을 찾을 수 없으면 플래시 전체에 걸친 FAT 파일시스템이 생성됩니다. 온보드 파일시스템을 지우거나 다시 포맷하는 가장 쉬운 방법은 OpenMV IDE 또는 공장 초기화 를 사용하는 것입니다. 아래의 하위 수준 Python API는 고급/프로그래밍 용도로 제공됩니다.
내부 플래시#
STM32 기반 OpenMV Cam에서는 pyb.Flash 클래스가 내부 플래시에 대한 접근을 제공합니다. 더 큰 외부 플래시를 갖춘 보드에서는 대신 그것을 사용합니다. start 키워드 인수는 항상 지정해야 합니다. 즉 pyb.Flash(start=0) 와 같이 사용합니다.
참고: 이전 버전과의 호환성을 위해, 인수 없이 생성된 경우(즉 pyb.Flash())에는 단순 블록 인터페이스만 구현하며 USB 대용량 저장소에 제공되는 가상 장치를 반영합니다(즉 시작 부분에 가상 파티션 테이블을 포함합니다).
사용자 정의 블록 장치#
Python에서 직접 블록 장치를 만들어 마운트할 수도 있습니다. 예를 들어 RAM 디스크가 있습니다. 다음 클래스는 bytearray 를 사용하여 데이터를 RAM에 저장하는 간단한 블록 장치를 구현합니다:
class RAMBlockDev:
def __init__(self, block_size, num_blocks):
self.block_size = block_size
self.data = bytearray(block_size * num_blocks)
def readblocks(self, block_num, buf):
for i in range(len(buf)):
buf[i] = self.data[block_num * self.block_size + i]
def writeblocks(self, block_num, buf):
for i in range(len(buf)):
self.data[block_num * self.block_size + i] = buf[i]
def ioctl(self, op, arg):
if op == 4: # get number of blocks
return len(self.data) // self.block_size
if op == 5: # get block size
return self.block_size
다음과 같이 사용할 수 있습니다:
import vfs
bdev = RAMBlockDev(512, 50)
vfs.VfsFat.mkfs(bdev)
vfs.mount(bdev, '/ramdisk')
마운트되면 파일시스템은 일반적으로 Python 코드에서 사용하는 것과 동일하게 사용할 수 있습니다. 예를 들면 다음과 같습니다:
with open('/ramdisk/hello.txt', 'w') as f:
f.write('Hello world')
print(open('/ramdisk/hello.txt').read())
파일시스템#
OpenMV Cam은 내부 플래시를 FAT 로 포맷하므로, USB 대용량 저장소를 통해 파일시스템을 노출하는 보드에서는 호스트 PC가 추가 드라이버 없이 읽고 쓸 수 있습니다.
FAT는 쓰기 도중 전원 장애에 견디지 못하므로 파일시스템 손상으로 이어질 수 있습니다. 카메라의 전원을 끄기 전에 호스트에서 드라이브를 꺼내거나 마운트 해제하고, 스크립트가 다시 쓰는 데이터에 대해서는 내부 플래시보다 SD 카드를 선호하십시오.
STM32 기반 OpenMV Cam에서는 Python에서 내부 플래시를 다시 포맷할 수 있습니다:
import os, vfs, pyb
vfs.umount('/flash')
vfs.VfsFat.mkfs(pyb.Flash(start=0))
vfs.mount(pyb.Flash(start=0), '/flash')
os.chdir('/flash')