SD 카드에있는 이미지를 사용하여 이미지 (.img)를 만드는 방법 (그러나 원래의 것만 큼 컴팩트 함)?


20

나는 시도했다 :

sudo dd bs=4k if=/dev/mmcblk0 of=/media/1BAB47551C66A42B/raspbian_migs2.gz

7.6GB의 .img 파일을 만듭니다 (카드 크기, 그러나 카드의 파일 크기는 700MB 임).

과:

sudo dd bs=4k if=/dev/mmcblk0 | gzip > /media/1BAB47551C66A42B/raspbian_migs2.gz

2.7GB의 .gz 파일을 만듭니다.

http://www.raspberrypi.org/downloads 의 원본 Raspbian ( Debian 7 (Wheezy)) 은 494.44 MiB입니다.

SD 카드에있는 이미지에서 비슷한 크기의 이미지를 만들려면 어떻게해야합니까?

(우분투에 있습니다.)


답변:


18

RooTer에 대한 의견에서 A)로 초기 파티션 크기를 줄 gparted였지만 dd여전히 전체 카드를 복사하고 B) 이미지에 두 파티션을 모두 포함하고 싶다고 언급했습니다.

"A"문제는 쉽게 설명 할 수 있습니다 /dev/mmcblk0. 이것이 바로 전체 카드를 복사하는 것 입니다. 각각의 파티션은 물론이다 /dev/mmcblk0p1/dev/mmcblk0p2. 이것은 문제 "B"의 합병증이지만 dd시작 부분의 파티션 테이블 /dev/mmcblk0 이 각 파티션의 시작과 길이를 색인화 하기 때문에 각 파티션을 간단하게 연결하고 두 파일을 함께 연결할 수는 없습니다 . 그렇지 않으면 이미지를 사용할 수 없게됩니다.

그러나에서 각 파티션의 길이를 가져 와서 fdisk -l이를 사용하여에 대한 일부 매개 변수를 결정할 수 있습니다 dd. 예를 들면 다음과 같습니다.

> fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 16.1 GB, 16138633216 bytes
4 heads, 16 sectors/track, 492512 cylinders, total 31520768 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: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1    8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2  122880    26746879    13312000   83  Linux

"시작"및 "종료"단위는 섹터이며 섹터 크기는 512 바이트입니다. 를 들어 /dev/mmcblk0p2, 26746879 (마지막 부문) - 122880 (첫번째 섹터) = 2분의 26,623,999 (킬로바이트 당 2 개 부문) / 1024 (MB 당 KB) / 1024 (GB 당 MB는) 내가 gparted를 사용하여 파티션을 성장하는 12.69를 = 12GB로 설정하면 올바르게 보입니다 (실제로 스토리지가있는 제수로 1024가 아닌 1000을 사용해야하며 13.31GB로 작동하지만 gparted 및 일부 다른 도구도 1024를 사용한다고 생각합니다).

따라서 가장 먼저 확인하려는 것은 두 번째 파티션이 실제로 설정 한 크기보다 작은 것입니다. 다음으로 그 숫자를 dd; 와 함께 사용하십시오 . 나를 위해 그것은 :

dd if=/dev/mmcblk0 of=rpi.img bs=512 count=26746880

dd작동 방식 에 대한 오해로 인해 어떤 종류의 문제도 피할 수있는 추가 부문이 있습니다. 이것이 작동하는지 확인하는 간단한 방법이 있습니다.

> fdisk -l rpi.img

Disk rpi.img: 102 MB, 102400000 bytes
255 heads, 63 sectors/track, 12 cylinders, total 200000 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: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
rpi.img1          8192      122879       57344    c  W95 FAT32 (LBA)
rpi.img2        122880    26746879    13312000   83  Linux

여기에 약간의 불일치가 있습니다. "시작"및 "종료"섹터는 원래 파티션 테이블과 일치하지만 통계의 총 크기는 102MB에 불과합니다! 왜냐하면 실제로 12GB 사본을 사용하고 싶지 않기 때문에 실제로 count=200000매개 변수로 사용 dd했기 때문입니다 ( "총 200000 섹터"에 유의). 하단의 표가 이것을 반영하지 않는 이유는 fdisk가 SD 카드의 시작 부분에서 이미지의 시작 부분에 그대로 복사 된 파티션 데이터에서 정보를 가져 오기 때문입니다. 두 번째 단락에서 언급했듯이 유지하다. 나머지를 (적절하게) 복사하면 숫자가 공평하고 이미지가 실용적입니다.

시도해보십시오. :)


OSX에서 fdisk는 섹터 크기를 바이트 단위로 명확하게 인쇄하지 않습니다. 대신 실린더 / 헤드 / 섹터를 나타내는 "형상 : 966/255/63 [15523840 섹터]"를 제공합니다. 이 경우 어떤 bs 및 count 값을 사용해야합니까?
Arthur Hebert

@ArthurHebert : 총 바이트 / 총 섹터. 위의 첫 번째 경우의 예 : 제 200,000분의 102,400,000 = 512 31,520,768분의 16,138,633,216 = 512 일 것이다
골디락스

1
fdisk -l <device>대화식 모드로 전환하지 않고도 테이블을 인쇄하고 사용할 수 있습니다 .
berto

5

문제는 여전히 사용 된 섹터에 여전히 먼지가있는 것으로 생각됩니다. 파일이 삭제되면 데이터 자체가 아닌 파일 시스템에서 메타 데이터 만 제거되므로 0으로 만 구성된 블록을 압축하는 대신 임의의 0으로 남겨 둡니다.

쉬운 해결책이지만 카드의 모든 여유 공간을 다시 써야합니다. SD 카드 수명은 다시 쓰기 횟수에 의해 제한되므로이 방법을 사용하지 않는 것이 좋습니다.

dd bs=4M if=/dev/zero of=/root/junk
sync
rm junk

당시에 해당 SD 카드를 사용하지 않는 다른 컴퓨터에 zerofree 를 설치해야하므로 더욱 복잡한 솔루션 입니다.

zerofree /dev/mmcblk0p2

자세한 내용은 http://intgat.tigress.co.uk/rmy/uml/index.html을 참조하십시오.

기억해야 할 것은 파티션이 더 작더라도 / dev / mmcblk0의 dd 를 수행 하면 전체 장치를 복사 한다는 것 입니다. 당신이 사용하는 경우 raspi-설정을 방법 위의 중 하나를 수행하기 전에 주 파티션을 확장하면 잘 될 것입니다.

추신 : 형식 이미지 파일을 변경하는 것이 마음에 들지 않으면 알려진 파일 시스템에 대해 아직 더러움이 있어도 해제 된 블록을 생략 하는 partimage 를 사용할 수 있습니다. 파일 시스템이 마운트되지 않은 경우 백업 손상을 피하기 위해 partimage를 다시 사용하는 것이 가장 좋습니다. 아마도 읽기 전용으로 다시 마운트하지 않아도 될 것입니다. 그러나 나는 당신의 재량에 맡길 것입니다.


노력에 대한 나의 탐구의 일환으로 완수하기 위해, 내가있는 데이터 만 acomodate하기 위해 sdcard에 파티션을 줄이기 위해 gparted를 사용, 그럼 내가 시도 DD ING와 결과는 동일 7.6GB 파일이 개 파티션에 저장 partimage를 캔트 (/입니다 1 이미지로 부팅 + /)
mf_

어쩌면 나는 그것을 충분히 명확하게하지 못했습니다 .gzip을 사용해 보았을 때 압축 할 때 차이가 있어야합니다.
RooTer

이러한 방식으로 카드를 채우면 전체 쓰기주기가 발생하고 카드 수명이 단축됩니다. 시도dd bs=4M if=/dev/zero of=/root/junk
nc4pk

@ tapped-out thx,
edit ;;

4

짧은 대답-2GB SD 카드를 사용하십시오.

긴 대답 dd은 "좋은"데이터가 어디에서 끝나는 지 전혀 모르는 것입니다.

2GB SD 카드를 사용하는 것이 가장 쉬운 두 가지 방법이 있습니다.이 방법은 2GB 이상으로 복사를 자동으로 중지하고 원하는대로 500MB 압축 파일을 생성합니다.

다른 방법으로, 복잡한 방법으로는 파티션 테이블에서 정확한 데이터 크기를 계산하고이 올바른 크기를 매개 변수로 dd명령하는 것입니다. 이를 위해 bs=XXX(블록 크기) 및 count=XXX(블록 수) 매개 변수를 사용할 수 있습니다. 예를 들어 bs=10M10MB 블록 크기 (명령에 사용하는 4k 블록 크기에 비해 복사 속도가 훨씬 빠름)를 지정하고 count=20010MB * 200 = 2000MB (2GB)를 복사 할 수 있습니다 . SD 카드 파티션 구성표 에 따라 블록 크기와 블록 수를 조정해야 할 수도 있습니다 .


1
dd특정 크기를 주는 것은 결코 효과가 없습니다. 파일 시스템의 모든 실제 데이터가 장치의 시작 부분에 깔끔하게 정렬되어 있다고 가정하므로 8GB 파티션에 2GB가 있으면 첫 번째 2GB를 복사하면됩니다. 이것은 거짓입니다. 이 2GB의 데이터는 전체 공간에 흩어져 있으며 특히 사용 가능한 모든 블록을 한 번 이상 사용하기 전에는 블록을 두 번 재사용하지 않는 최신 SD 카드에 뿌려집니다 ( 마모 레벨링 이라고 하며 카드 수명을 연장시킵니다).
goldilocks

@goldilocks 모든 파티션을 가능한 최대 크기로 줄이기 위해 sdcard의 크기를 조정하면 어떻게됩니까?
mf_

@ goldilocks 제발, 질문과 답변을 더 신중하게 읽으십시오. 나는 야생의 상상력이 어떻게 든 당신에게 말했듯이 8GB 파티션의 2GB 데이터가 아니라 8GB SD 카드의 2GB 파티션에 대해 이야기하고 있습니다.
lenik

1
lenik : 예, 조금 기절했습니다. 모든 사과를 드리겠습니다. 불행히도 게시물을 편집하지 않으면 내 공감대를 되돌릴 수 없습니다. -이것은 단순히 파티션을 작성 하는 것이 아니기 때문에 그렇게하는 방법에 대한 지침은 유용하지 않습니다.)하지만 그렇게 할 것입니다. @mf_ 그렇습니다, 그것은 가능합니다 (내 대답을 읽었습니까? 효과가있을 것입니다 ...)
goldilocks

@ goldilocks 답변을 편집했습니다. 왜 그것이 유용하지 않은지, 특히 더 자세한 내용으로 정확히 똑같은 대답을했을 때 왜 알 수 없는지 모르겠습니다.
lenik

1

dd - copy and convert요청한 작업을 수행 할 수있는 올바른 도구가 아닙니다. 부트 섹터, 포맷 장치 및 모든 종류의 저수준 작업을 복사하는 데 유용한 하위 수준의 섹터 별 복사 (및 변환) 도구입니다. 당신이 사용하는 경우 dd당신이이 파일 시스템 구조에 포함되지 않은 경우에도, 이미지에 섹터를 복사합니다.

Raspberry Pi 재단에서 제공 하는 이미지는 설치 스크립트, 압축 풀기 바이너리 및 초기 설정으로 특별히 컴파일 된 이미지입니다. 그 후에 인터넷에서 업데이트를 가져와야합니다.

빈 섹터를 복사하지 않는 한 가지 일반적인 솔루션은 파일 레벨 복사 시스템 을 사용하는 것입니다. CloneZilla는 독립형이며 CD에서 부팅 할 수 ye olde Norton Ghost있지만 CD와 함께 부팅 가능 하지만 clonezilla는 Linux (및 그 이상) 파일 시스템을 지원합니다. 따라서 사용중인 파일 만 복사하고 해당 파일에서만 컨테이너를 만듭니다. 크기를 크게 줄입니다!


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