mtd 및 nandsim을 통해 "루트" 디렉터리의 단일 볼륨을 포함하는 btrfs 파일 시스템을 만들려고 합니다.
내 루트 디렉터리에 일부 토큰 파일과 디렉터리가 있고 파일 시스템을 성공적으로 생성하고 마운트했습니다.
sudo modprobe mtdblock
sudo flash_erase /dev/mtd0 0 0
sudo mkfs.btrfs -m single -s 2048 -r root /dev/mtdblock0
세상 모든 것이 옳습니다. 이제 루트 디렉터리의 실제 콘텐츠(일부 메타데이터 파일, 각각 2k로 구성된 128k 미만의 바이너리 파일)를 추가합니다. 동일한 방법을 다시 시도하면 mkfs.btrfs가 실패하고 "오류: 출력 파일을 0으로 설정할 수 없습니다."
내부에소스 코드, pwrite64()에 대한 호출이 실패하면 라인 407의 문제가 되는 메서드가 실패합니다. 시스템 호출이 허용하는 전체 크기에 제한이 없는 한 이것이 왜 실패하는지 이해할 수 없습니다.
즉, RAM과 디스크 공간이 넉넉한 시스템에서 내 장치의 용량은 256MB에 불과합니다. 그럴 가능성은 거의 없습니다.
누구든지 올바른 방향으로 나를 가리킬 수 있습니까? 몇 가지 주요 단계를 놓쳤습니까?
중요한 경우 Bionic 18.04 커널 4.15.0-99-generic에서 btrfs-progs v4.15.1을 사용하고 있습니다.
답변1
-r
또는 옵션을 사용하여 BTRFS 파일 시스템을 미리 채우려고 할 때 동일한 오류가 발생했습니다 --rootdir
. 내 경우 문제는 rootdir의 파일이 모든 크기를 추가한 후 BTRFS 파일 시스템에 쓰려고 했던 블록 장치보다 크다는 것입니다. rootdir 옵션을 사용하는 경우 mkfs.btrfs
rootdir에 있는 모든 파일의 크기를 합산한 다음 지정된 블록 장치/파일의 해당 위치에 0바이트를 씁니다. I 장치가 제공되고 장치 끝을 넘어서 쓰기가 수행되면 "오류: 출력 파일을 0으로 설정할 수 없습니다"라는 오류 메시지와 함께 오류가 발생합니다. 블록 장치가 아닌 파일이 있는 경우 최대 쓰기 위치가 있는 위치의 크기에 맞게 파일 크기가 조정되므로 이는 일반적으로 문제가 되지 않습니다. 이 경우 오류 메시지가 크게 개선될 수 있습니다. 여기에는 한 가지가 있습니다.깃허브 문제이를 위해.
따라서 du -hs --apparent-size root
/dev/mtdblock0의 크기보다 작은지 확인하겠습니다.
또한 flash_erase
시작 블록과 지울 블록 수가 필요하기 때문에 통화가 꺼진 것 같습니다. 지우려는 블록 수는 0으로 설정됩니다.