SD 카드에 쓰기 전에 이미지 파일의 크기를 조정하는 방법은 무엇입니까?


13

다른 커널 (CAN 지원)과 Python 3.3이 설치된 새로운 Raspbian 이미지를 만들려고했습니다. Raspberry Pi 에서이 모든 작업을 수행하는 대신 컴퓨터 에서이 작업을 수행하는 것이 재미있을 것이라고 생각했습니다 ( 이 지침을 따르십시오 ). 그러나 일단 이미지가 마운트되고 준비가되면 디스크 공간이 빨리 부족합니다. 나는 이것이 사용자가 파일 시스템이 SD 카드에 쓰여지면 파일 시스템의 크기를 조정할 것이라는 기대로 이미지의 크기가 충분히 커야하기 때문이라고 생각합니다.

공간이 부족하지 않고 더 많은 사용자 정의를 수행 할 수 있도록 이미지와 파일 시스템을 SD 카드에 쓰기 전에 크기를 조정할 수 있습니까?


이 질문 이 도움 될 것입니다.
Jivings 2013

1
@Jivings :이 모든 답변은 이미지 가 SD 카드에 기록 된 이미지 크기를 조정하는 방법을 설명합니다 . 나는 그것을하는 방법을 알고있다. SD 카드에 이미지 쓰기 전에 이미지 크기를 조정하는 방법에 관심이 있습니다.
DrAl

답변:


7

원본 이미지 파일의 크기를 조정하는 방법입니다. 나는 그것이 바보처럼 들리는 것을 알고 있지만 작동합니다.

원본을 확장하려는 크기의 빈 이미지를 만듭니다 (예에서는 5GB 사용).

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

이것을 원본 이미지에 추가하십시오.

cat /path/to/temp_image >> /path/to/rasperrypi.img

디스크 끝에있는 파일 시스템의 크기를 조정하십시오 (보통 더 큰 파일입니다).

resize2fs -f /path/to/rasperrypi.img

끝난! 이제 디스크가 5GB 더 커야합니다!


완벽하게 들립니다. 감사합니다. 오늘 밤에 테스트하겠습니다.
DrAl

5
방금 시도한 결과 resize2fs 단계에 도달하면 (파일에 1GB를 추가 한 후) "2012-12-16-wheezy-raspbian.img를 열려고 시도하는 동안 수퍼 블록에 잘못된 매직 번호가 표시됩니다" 유효한 파일 시스템 수퍼 블록을 찾을 수 없습니다. " 내가 뭘 잘못하고 있는지에 대한 제안?
DrAl

파티션 (/ dev / sda2와 동등한) 대신 전체 이미지 (/ dev / sda와 동등한)의 크기를 조정하려고한다는 사실에 문제가있는 것처럼 보입니다. 그러나 나는 틀릴 수 있고 성공하지 못한 몇 가지 다른 시도를 시도했습니다 (fdisk로 파티션 크기를 조정하는 것과 같이 작동하지만 파일 시스템 크기를 조정하는 데 도움이되지 않음).
DrAl

3
좋아, 나는 약간의 인터넷 검색으로 마지막 비트에 대한 답을 찾았습니다. 이미지의 파티션을 가리키는 루프 장치를 만들어야했습니다. 나는 두 번째 파티션의 시작 섹터를 fdisk -l file.img(122880)에서 얻은 다음 losetup --offset $((122880 * 512)) /dev/loop0 file.img. 그때 사용할 수 resize2fs/dev/loop0와 함께 정돈 losetup -d /dev/loop0. 이를 포함하도록 답변을 업데이트하면 해당 답변을 허용 된 답변으로 표시합니다. 올바른 방향으로 나를 가리켜 주셔서 감사합니다.
DrAl

1
@ DrAl Hey, resize2fson 을 사용하여 솔루션을 시도했지만 /dev/loop0부팅시 수퍼 블록 크기와 파티션 크기가 일치하지 않는다는 커널 패닉 The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocks이 발생합니다.
GuySoft

4

이것은 위와 다른 곳에서 나에게 도움이 된 답변을 합성 한 것입니다-실수를 대비하여 이미지를 백업하십시오.

먼저 이미지 파일을 더 크게 만듭니다 (여기서 1GB를 추가합니다).

truncate -s +1G ./image.img

다음으로 전체 이미지를 루프 장치로 매핑하여 파티션 테이블을 찌를 수 있습니다.

sudo losetup /dev/loop0 ./image.img

나중에 참조 할 수 있도록 덤프하십시오.

sudo fdisk -l /dev/loop0

출력은 다음과 같습니다.

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 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
Disk identifier: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

이제 마지막 파티션을 삭제 한 다음 동일한 시작 위치, 동일한 유형이지만 다른 끝 위치에서 다시 생성합니다. 따라서 loop0p2 (파티션 2-Linux 파티션)의 "시작"열을 기록해 두십시오. 나중에 사용할 것입니다. 여기서는 122880입니다.

sudo fdisk /dev/loop0

다음 내용을 입력하십시오-입력하기에 안전합니다. 다음 설명을 읽을 때까지 영구적 인 것은 없습니다.

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. 그냥 Enter 키를 눌러 기본값을 수락하십시오.
  9. p

1 단계-현재 테이블을 인쇄합니다. 2-3 단계-파티션 2 삭제, 4-8 단계-새로운 끝점으로 파티션 2를 다시 작성 (기본값은 이미지의 끝), 9 단계-새 테이블을 인쇄합니다.

새로 인쇄 된 테이블이 종료 값 및 블록 값 (예 : 크기가 변경됨)을 제외하고 원본 테이블과 동일하다고 가정하면 커밋 할 수 있습니다.

입력 w한 후, 변경 사항을 커밋 입력 q종료합니다.

루프백 장치를 삭제하면 두 번째 파티션을 위해 다른 장치를 만듭니다. 위에서 언급하고 사용한 시작 오프셋을 기억하십시오. 다시 사용하겠습니다.

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

그것은 /dev/loop0파티션 2 를 가리키는 것에 대한 새로운 매핑을 만들 것입니다 -참조 512는 첫 번째 fdisk출력 에서 볼 수있는 섹터 크기 입니다.

이제 사용 가능한 공간을 채우려면 파티션 크기를 조정하십시오.

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

완료-이제 정리 :

sudo losetup -d /dev/loop0

고마워 ... 위의 지침은 저에게 효과적이지 않지만 이것은 효과가있었습니다. 파티션 테이블을 작성할 때 경고가 발생했습니다 :```Command (m for help) : w 파티션 테이블이 변경되었습니다. ioctl ()을 호출하여 파티션 테이블을 다시 읽습니다. 파티션 테이블을 다시 읽지 못했습니다. 잘못된 인수 커널에서 여전히 기존 테이블을 사용합니다. 새 테이블은 다음에 다시 부팅하거나 partprobe (8) 또는 kpartx (8)를 실행 한 후에 사용됩니다. ```방금 무시했는데 괜찮 았습니다.
StFS

우수한! 당신은 정답을 한 유일한 사람입니다! 감사.
yushulx

3

Oracle VM VirtualBox를 실행하는 사람들에게는 매우 쉽습니다.

Windows 시스템에서 상황은 다음과 같습니다.

input.img여기에 크기를 줄여야하는 이미지 output.img가 있으며이 이미지에서는 7000MB로 정의 된 최종 이미지입니다.

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

이것이 조금 도움이되기를 바랍니다.


이 솔루션에 매우 감사합니다. 내가 찾은 유일한 것은 무료이며 Windows에서 완벽하게 작동합니다. 16GB 카드와 크기가 같지 않아 이미지 크기를 조정해야하는 문제가있었습니다.
Josh

커널 패닉 오류가 발생했습니다. Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX

이미지가 잘 리므로 7000MB가 지난 경우 데이터가 손실됩니다. 명령이 경고하거나 불평하지 않습니다.
Mike Redrobe 2016 년

2

원본 이미지 파일의 크기를 조정하는 방법입니다. 나는 그것이 바보처럼 들리는 것을 알고 있지만 작동합니다.

원본을 확장하려는 크기의 빈 이미지를 만듭니다 (예에서는 5GB 사용).

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

이것을 원본 이미지에 추가하십시오.

cat /path/to/temp_image >> /path/to/rpi.img

다음은 파티션과 파일 시스템의 크기를 조정하는 것입니다. 먼저 파티션의 오프셋을 가져옵니다.

fdisk -l /path/to/rpi.img

다음과 같은 테이블이 생성됩니다.

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

두 번째 파티션의 시작 오프셋에 유의하십시오.

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

마지막으로 / dev / loop 마운트 해제

losetup -d /dev/loop0

끝난! 이제 디스크가 5GB 더 커야합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.