임베디드 시스템용 디스크 이미지(4GB SD 카드에 배치)를 구축 중입니다. 시스템에 두 개의 파티션이 있기를 원합니다. "루트" 파티션 1개(200Mb)와 "데이터" 파티션 1개(800Mb).
dd를 사용하여 빈 1GB 파일을 만들었습니다. 그런 다음 parted를 사용하여 파티션을 설정합니다. 루프 장치에 별도로 설치한 다음 포맷했습니다. ext2는 "root"를 나타내고 ext4는 "data"를 나타냅니다. 내 루트 파일 시스템을 "루트" 파티션에 추가하고 "데이터"를 비워 두었습니다.
그것이 문제이다. 현재 200MB의 데이터만 있는 1GB 이미지가 남아 있습니다. 이론적으로 이미지를 201MB로 자르고 파일 시스템을 마운트할 수는 없나요? 불행히도 나는 이것이 사실임을 발견하지 못했습니다.
과거에 전체 4GB SD 카드를 활용하는 파티션이 있는 30Mb 이미지를 생성하기 위해 Freescale의 빌드 환경을 사용했던 기억이 납니다. 불행하게도 현재로서는 그들이 어떻게 하는지 알 수 없습니다.
나는 ext 파일 시스템의 디스크 형식을 읽었으며 첫 번째 슈퍼 블록 이후에 데이터가 없으면(백업 슈퍼 블록 및 사용되지 않은 블록 테이블 제외) 거기에서 잘라낼 수 있다고 생각합니다.
불행하게도 이 작업을 수행했을 때 설치 시스템이 충돌했습니다. 그런 다음 FSCK를 실행하고, 슈퍼블록과 블록 테이블을 복원하고, 문제 없이 마운트할 수 있습니다. 나는 그것이 필요하다고 생각하지 않습니다.
어쩌면 다른 파일 시스템이 작동할까요? 어떤 아이디어가 있나요?
감사해요,
편집하다
파일 시스템을 읽으려면 파티션을 변경하십시오. 파티션은 그대로 있고 변경되지 않았지만 이미지를 자른 후 파일 시스템이 손상되었습니다.
편집하다
내가 발견한 것은 파일을 첫 번째 "데이터" 파티션 슈퍼블록 및 inode/블록 테이블 세트(데이터 블록 범위 내의 어딘가)의 크기보다 크게 자르면 파일 시스템이 아무 것도 할 필요가 없다는 것입니다. 나머지 슈퍼블록 및 블록/inode 테이블을 복구하는 데 사용되는 fsck를 언로드합니다.
답변1
가장 쉬운 방법은 지원 파일을 스파스 파일로 생성하는 것입니다. 즉, truncate -s 1G disk.img
대신 1GB로 설정하는 것 dd if=/dev/zero bs=1048576 count=1024 of=disk.img
입니다. 아주 좋고 truncate
훨씬 빠릅니다.
파일에 작업을 수행 하면 ls -l
1GB로 표시되지만 이는 표면 크기일 뿐입니다. du disk.img
실제 치수가 제공됩니다.
(희소 파일을 지원하는 파일 시스템에 이미지를 저장해야 합니다. 일반적인 Unix는 모두 지원합니다. Ext2/3/4는 모두 지원합니다. FAT32는 지원하지 않습니다. HFS+도 마찬가지입니다.)
참고: 논리적으로 스파스 파일은 여전히 전체 크기입니다. 단지 작성되지 않은 부분이 물리적으로 디스크에 저장되지 않는다는 점일 뿐입니다. 대부분의 경우 실제로 저장되지 않는 부분은 프로그램에서 숨겨집니다. 그러나 일부 유틸리티에서는 이를 지원합니다. (예:,,, dd conv=sparse
등 cp --sparse=auto/always
). 실제 USB 메모리 스틱할 수 없다부족한. 이를 작성 하면 dd conv=sparse
훨씬 더 빠를 수 있지만 NUL(0x00)로 가득 찬 예상 블록 대신 이전에 존재했던 데이터가 남게 됩니다. 여유 공간으로 인해 잘 작동하지만 USB 스틱에 오래된 데이터가 남게 됩니다. 보안 문제일 수 있습니다.
답변2
먼저 희소 이미지를 디스크에 씁니다.아니요해당 이미지 파일(구멍 및 전체)의 전체 크기를 제외한 모든 크기가 디스크를 덮어쓰게 됩니다. 이 때문입니다다루다희소 파일 수는 파일 시스템의 품질과 원시 장치의 품질을 결정합니다.(이미지를 쓰는 것과 같습니다)그와 같은 일은 없다하지만. 스파스 파일은 다음과 같습니다.저장됨파일 시스템으로 제어되는 미디어에 안전하게 저장분명한스파스 파일(예: ext4 장치)하지만 일단 글을 써보면, 당신이 말하고 싶은 모든 것이 담겨 있을 것입니다. 그래서 당신이 해야 할 일은:
쓸 준비가 될 때까지 파일을 인식하지 못하는 파일 시스템에 저장하면 됩니다.
2겹 깊이로 만드세요...
즉, 기본 이미지를 파일에 쓰고 다른 이미지를 만듭니다.부모희소 파일을 이해하는 fs를 사용하여 이미지를 복사한 다음부모이미지, 그리고...
이미지를 작성할 때는 상위 이미지를 먼저 작성한 다음 기본 이미지를 작성하세요.
2단계에서 수행하는 방법은 다음과 같습니다.
1GB 스파스 파일 생성...
dd bs=1kx1k seek=1k of=img </dev/null
두 개 쓰다
ext4
파티션 테이블을 분할합니다: 1 200MB, 2 800MB...printf '%b\n\n\n\n' n '+200M\nn\n' 'w\n\c' | fdisk img
2개 생성
ext4
파일 시스템은-P
할당된 루프 장치에 있고 두 번째 파일 시스템의 복사본은 첫 번째 파일 시스템에 배치됩니다.sudo sh -c ' for p in "$(losetup --show -Pf img)p"* ### the for loop will iterate do mkfs.ext4 "$p" ### over fdisks two partitions mkdir -p ./mnt/"${p##*/}" ### and mkfs, then mount each mount "$p" ./mnt/"${p##*/}" ### on dirs created for them done; sync; cd ./mnt/*/ ### next we cp a sparse image cp --sparse=always "$p" ./part2 ### of part2 onto part1 dd bs=1kx1k count=175 </dev/zero >./zero_fill ### fill out part1 w/ zeroes sync; cd ..; ls -Rhls . ### sync, and list contents umount */; losetup -d "${p%p*}" ### last umount, destroy rm -rf loop*p[12]/ ' ### loop devs and mount dirs
mke2fs 1.42.12 (29-Aug-2014) Discarding device blocks: done Creating filesystem with 204800 1k blocks and 51200 inodes Filesystem UUID: 2f8ae02f-4422-4456-9a8b-8056a40fab32 Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done mke2fs 1.42.12 (29-Aug-2014) Discarding device blocks: done Creating filesystem with 210688 4k blocks and 52752 inodes Filesystem UUID: fa14171c-f591-4067-a39a-e5d0dac1b806 Superblock backups stored on blocks: 32768, 98304, 163840 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done 175+0 records in 175+0 records out 183500800 bytes (184 MB) copied, 0.365576 s, 502 MB/s ./: total 1.0K 1.0K drwxr-xr-x 3 root root 1.0K Jul 16 20:49 loop0p1 0 drwxr-xr-x 2 root root 40 Jul 16 20:42 loop0p2 ./loop0p1: total 176M 12K drwx------ 2 root root 12K Jul 16 20:49 lost+found 79K -rw-r----- 1 root root 823M Jul 16 20:49 part2 176M -rw-r--r-- 1 root root 175M Jul 16 20:49 zero_fill ./loop0p1/lost+found: total 0 ./loop0p2: total 0
지금은 많은 출력이 있습니다. 대부분은 다음에서 나옵니다 . 하지만 맨 아래 비트에
mkfs.ext4
특별한 주의를 기울이십시오 . 실제를 보여줄 것이다ls
ls -s
-s
크기디스크에 있는 파일 이름 - 항상 첫 번째 열에 표시됩니다.이제 기본적으로 이미지를 첫 번째 파티션으로 줄일 수 있습니다.
fdisk -l img
Disk img: 1 GiB, 1073741824 bytes, 2097152 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xc455ed35 Device Boot Start End Sectors Size Id Type img1 2048 411647 409600 200M 83 Linux img2 411648 2097151 1685504 823M 83 Linux
fdisk
첫 번째 파티션에 411647 +1 512바이트 섹터가 있음을 알려줍니다 .img
...dd seek=411648 of=img </dev/null
이 내용은 잘립니다.
img
첫 번째 파티션에만 파일을 저장하세요. 바라보다?ls -hls img
181M -rw-r--r-- 1 mikeserv mikeserv 201M Jul 16 21:37 img
...하지만 여전히 파티션을 마운트할 수는 있습니다...
sudo mount "$(sudo losetup -Pf --show img)p"*1 ./mnt
...이것이 그 내용입니다...
ls -hls ./mnt
total 176M 12K drwx------ 2 root root 12K Jul 16 21:34 lost+found 79K -rw-r----- 1 root root 823M Jul 16 21:34 part2 176M -rw-r--r-- 1 root root 175M Jul 16 21:34 zero_fill
그리고두 번째 파티션의 스토리지 이미지를 첫 번째 파티션에 연결할 수 있습니다.
sudo sh -c ' dd seek=411648 if=./mnt/part2 of=img umount ./mnt; losetup -D mount "$(losetup -Pf --show img)p"*2 ./mnt ls ./mnt; umount ./mnt; losetup -D'
1685504+0 records in 1685504+0 records out 862978048 bytes (863 MB) copied, 1.96805 s, 438 MB/s lost+found
이제 우리의
img
문서: 더 이상 드물지 않습니다...ls -hls img
1004M -rw-r--r-- 1 mikeserv mikeserv 1.0G Jul 16 21:58 img
...하지만 두 번째로 삭제하는 것도 물론 처음처럼 쉽습니다...
dd seek=411648 of=img </dev/null ls -hls img
181M -rw-r--r-- 1 mikeserv mikeserv 201M Jul 16 22:01 img
답변3
SD 카드에 복사할 수 있도록 800MB의 공간이 있는 이 이미지를 생성하시겠습니까? 하지만 이미지를 저장할 때 공간을 낭비하고 싶지는 않습니다. 그렇다면 압축(예 bzip
: .
답변4
질문을 올바르게 이해하길 바랍니다.
파일 시스템과 파티션을 축소합니다. 사용 gparted
.