파일시스템 다루기

이 튜토리얼에서는 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')