스크립트를 통해 이중 파티션 SD 카드 이미지 생성

스크립트를 통해 이중 파티션 SD 카드 이미지 생성

임베디드 Linux 시스템을 구축하는 시스템이 있습니다. 시스템은 세 가지 파일을 출력합니다.

  • rootfs를 포함하는 tarball(커널 모듈 제외)
  • 커널 모듈을 포함하는 타르볼
  • uimage

시스템은 1GB SD 카드에 배포되며, 10MB는 FAT 부팅 파티션에 할당되고 나머지는 ext4 루트 파티션에 할당됩니다.

시스템에 가장 적합한 출력 형식은 dd를 사용하여 SD 카드에 쓸 수 있는 이미지 파일입니다. 이제 SD 카드를 수동으로 파티션하고 포맷하고, 파일을 추출/복사한 다음 dd를 사용하여 카드 내용을 읽어 이미지 파일이 생성됩니다. 작동하지만 프로세스가 훨씬 쉬울 수 있습니다.

카드를 나타내는 루프 파일 시스템을 만들고 그 위에 파일 시스템을 만든 다음 그 안에 있는 파일을 추출/복사하는 것이 가능하다는 것을 알고 있습니다. 시도해 보았는데 어느 정도 효과가 있지만 충분하지 않습니다. 문제는 파티션 및 SD 카드의 "형상"과 관련된 것 같습니다(예: 하드 드라이브의 기하학적 구조는 내가 아는 한 메모리 카드에는 중요하지 않음). 마치 파티션이 구체적이어야 하는 것처럼 보입니다. 카드 모델에 대해서는 잘 모르지만 해당 분야의 전문가는 더 많은 정보를 제공할 수 있습니다.

dd를 사용하여 SD 카드에 복사할 수 있는 두 개의 타르볼과 uImage에서 이미지를 얻는 올바른 방법은 무엇입니까?

답변1

SD 카드가 항상 실제 가지고 있는 SD 카드와 동일한 크기(또는 그 이상)이고 복사하려는 항목에 1G이면 충분하다고 확신하는 경우 다음 단계를 수행할 수 있습니다.

  1. 적절한 SD 카드를 수동으로 파티션하고 파티션을 비워 둡니다(단, 필요한 파일 시스템을 생성합니다).
  2. 전체 SD 카드(예: /dev/sdb)를 시스템에 복사합니다.dd if=/dev/sdb of=empty.image bs=4M
  3. 새 SD 카드를 만들어야 할 때마다 빈 이미지를 새 이미지에 복사하세요.cp empty.image new.image
  4. 이제 이 파일에 루프 장치를 만듭니다. ( 이렇게 하면 커널이 파티션 정보를 읽게 되므로 losetup -f -P new.image중요합니다 .)-P

그러면 새 루프 장치가 생성됩니다(예 /dev/loop0: ).그리고 파티션 /dev/loop0p1.../dev/loop0pn. 이제 "일반" 파티션처럼 마운트하고 사용할 수 있습니다. 작업이 끝나면 losetup -d /dev/loop0통화로 생성된 이미지를 사용하여 SD에 복사하세요 dd if=new.image of=/dev/sdb bs=4M. 이 모든 단계는 프로그래밍될 수 있습니다.

편집하다:

위의 2)와 3) 대신:

또한 파티션 블록(MBR인 경우)을 복사하고 유지할 수도 있습니다( dd if=/dev/sdb of=empty_MBR bs=512 count=1). 그런 다음 새 SD의 경우 스파스 파일 truncate -s 1G empty.file(크기=0)인 빈 파일( )을 만들고 파티션 테이블을 복사합니다( dd if=empty_MBR of=empty.file). , 장치 루프( losetup -f -P empty.file)를 생성하고 파티션을 포맷한 후 위와 같이 진행합니다.

편집 2:

작은 MBR 파일을 보관하고 싶지 않다면 sfdisk스크립트를 사용할 수도 있습니다( man sfdisk또는https://superuser.com/questions/332252/creating-and-formating-a-partition-using-a-bash-script). 즉, 빈 파일(sa) 생성, 루프 장치 생성(파티션 없음, 파티션 없음 -P), 해당 장치 분할 sfdisk, 루프 장치 분리, 루프 장치 재연결(파티션 포함 -P) 및 계속을 의미합니다.

관련 정보