배경: uboot(및 필요한 경우 사용자 정의 베어메탈 코드)를 사용하여 eMMC에서 ext4 파티션을 복제해야 합니다. 를 사용하여 전체 파티션을 복사한 mmc read
결과 대부분의 파티션이 비어 있지만 일부 데이터 블록(예: inode 테이블)이 파티션에 분산되어 있음을 발견했습니다. 이는 전체 파티션을 복사해야 함(너무 느리고 자주 수행해야 함) 또는 파티션의 어느 부분이 관련되어 있는지 확인해야 함을 의미합니다.
이 질문과 가장 유사한 Q&A는 dd
create a sparse image or piping to that을 사용하는 것을 제안 gzip
하지만 저는 OS를 실행하고 있지 않으므로 파일 시스템 레이아웃을 이해해야 합니다. 이러한 비트맵 타일을 사용하여 사용된 콘텐츠와 무료 콘텐츠를 식별할 수 있나요? ext4 문서는 자세한 내용이 나올 때마다 Linux 커널 코드를 참조하는 것 같습니다.
uboot 코드를 사용하여 이 작업을 수행하는 것이 가장 좋지만 uboot에서 실행할 수 있는 일부 베어 메탈 코드를 작성할 수도 있습니다.
경계 조건도 있습니다. 파티션 복제의 대상이 비어 있지 않으므로 원본에 0만 있는 블록이 있고 해당 블록이 0이어야 하는 경우 대상에서 해당 블록을 0으로 덮어써야 합니다.
답변1
사용자 환경에서 원본 파일 시스템을 마운트할 수 없는 경우 이를 사용하여 debugfs
파일 시스템 레이아웃과 copy
대상 파일을 확인할 수 있습니다. 약간의 작업만으로 debugfs
원본 파일 시스템을 나열하고 반복하고 임시 위치에 복사한 다음 이를 사용하여 mke2fs -d
새 파일 시스템에 쓰거나 대상 위치에 직접 복사하는 스크립트를 작성할 수 있습니다.
자신만의 코드를 작성하려는 경우 libext2fs를 사용하여 libext2fs
파일 시스템을 열고 디렉터리 트리를 읽고 이를 대상 파일 시스템에 반복적으로 복사할 수 있습니다(libext2fs를 사용하여 열 수도 있음). 이것은 ~이 될 것이다많은디스크에서 ext4 형식을 처리하기 위해 자체 코드를 작성하는 것보다 쉽습니다.
귀하의 환경에서 eMMC 장치를 블록 장치로 액세스하는 데 장애가 있는 경우(죄송합니다. ext4 측면만 아는 바가 없습니다.) libext2fs용 사용자 정의 IO 드라이버(예: lib/ext2fs/unix_io.c
또는 .../nt_io.c
) 를 작성할 수 있습니다. 드라이버는 eMMC 장치에 직접 읽고 쓸 수 있으며 debugfs+scripts 또는 사용자 정의 libext2fs 복사 도구를 사용할 수 있습니다.
답변2
e2image -ar
파일 시스템의 관련 부분을 복사하는 데 사용됩니다 . 파일 시스템을 이해하고 사용되지 않는 공간을 건너뛰면서 파일에 사용되는 모든 필수 메타데이터와 데이터 블록을 복사합니다.