dd는 전체 디스크에 있지만 빈 부분은 원하지 않습니다.

dd는 전체 디스크에 있지만 빈 부분은 원하지 않습니다.

/dev/sda와 같은 디스크가 있습니다.

다음은 fdisk -l입니다.

 Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          27      209920   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              27         525     4000768    5  Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5              27         353     2621440   83  Linux
/dev/sda6             353         405      416768   83  Linux
/dev/sda7             405         490      675840   83  Linux
/dev/sda8             490         525      282624   83  Linux

우리가 제조하고 있는 다른 장치를 플래싱하는 데 사용하기 위해 파일 서버에 저장할 이미지를 만들어야 하므로 사용된 공간(약 4GB)만 원합니다. 복사가 완료되는 즉시 이 장치가 부팅 준비가 되어야 하므로 MBR 등을 유지하고 싶습니다.

어떤 아이디어가 있나요? 나는 이전에 를 사용하고 있었지만 dd if=/dev/sda of=[//fileserver/file]당시 내 마스터 복사본은 4GB 플래시 IDE에 있었습니다.

답변1

예전에 임베디드 Linux 배포판에서 비슷한 문제에 직면했습니다. 이미지를 압축하기 전에 모든 정크 파일을 제거하십시오.

dd if=/dev/zero of=asdf.txt. 죽을 때까지 기다리십시오. asdf.txt를 삭제하세요.

방금 장치의 모든 여유 공간에 0을 썼습니다.

이제 디스크 이미지를 가져와서 gzip을 통해 실행해 보세요. 짜잔, 희박한 이미지.

아마도 확장성이 좋지 않고 실제로 디스크에 써야 하는 경우 문제가 발생할 수 있지만, 안녕하세요.

디스크의 rsync 스냅샷을 다른 볼륨으로 가져와서 0으로 만든 다음 해당 디스크 이미지를 가져올 수 있습니다.

참고: SSD에는 위험할 수 있으므로 사용자는 커밋하기 전에 이 작업을 고려해야 합니다.

답변2

/dev/sdXN저장 하려고 하며 /tgtfs/image.raw루트 사용자라고 가정합니다.

  1. mkdir /srcfs && mount /dev/sdXN /srcfs

  2. 사용 zerofill하거나 zerofree다음을 사용하십시오.
    dd if=/dev/zero of=/srcfs/tmpzero.txt
    사용하지 않는 블록을 0으로 채우십시오. 파일 시스템이 완전히 채워질 때까지 기다린 후 다음을 수행하십시오.
    rm /srcfs/tmpzero.txt

  3. dd를 사용하여 이미지를 가져오고, conv=sparse를 사용하여 즉석에서 0을 펀치합니다.
    dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw

압축을 사용하려면 dd를 사용하여 0을 펀치할 필요가 없습니다. 0 블록은 압축 가능성이 높기 때문입니다.

dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw

추신: 플래시 메모리 기반 저장 미디어(예: SSD인 소스 파일 시스템)에서 정기적으로 이 작업(파일 시스템을 0으로 채우는 것)은 좋은 생각이 아니라는 점에 유의해야 합니다. 이렇게 하면 광범위한 쓰기가 발생하기 때문입니다. SSD에 저장되어 수명이 단축됩니다. (단, 가끔 데이터를 전송하는 경우에는 괜찮습니다)

답변3

count 옵션과 함께 dd를 사용하십시오.

귀하의 경우에는 fdisk를 사용하고 있었으므로 그 접근 방식을 취하겠습니다. "sudo fdisk -l "이 생성되었습니다:

    Disk /dev/sda: 64.0 GB, 64023257088 bytes
    255 heads, 63 sectors/track, 7783 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x0000e4b5

    Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1          27      209920   83  Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2              27         525     4000768    5  Extended
    Partition 2 does not end on cylinder boundary.
    /dev/sda5              27         353     2621440   83  Linux
    /dev/sda6             353         405      416768   83  Linux
    /dev/sda7             405         490      675840   83  Linux
    /dev/sda8             490         525      282624   83  Linux

주목해야 할 두 가지 사항은 1) 단위 크기와 2) "End" 열입니다. 귀하의 경우에는 8225280바이트와 동일한 실린더가 있습니다. "End" 열에서 sda8은 525(525[units]*16065*512 = ~4.3GB)에서 종료됩니다.

dd는 오프셋 이후에 시작하거나 특정 블록 수 이후에 중지하는 등 많은 작업을 수행할 수 있습니다. 우리는 dd의 count 옵션을 사용하여 후자를 수행할 것입니다. 명령은 다음과 같이 나타납니다.

    sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526

여기서 -bs는 블록 크기이고(fdisk가 사용하는 단위를 사용하는 것이 가장 쉽지만 count 옵션이 이 단위에 선언되어 있는 한 모든 단위는 사용할 수 있습니다) count는 복사하려는 단위의 수입니다(참고 마지막 블록을 캡처하기 위해 개수를 1씩 증가시킵니다.)

답변4

당신은 할 수 없습니다. dd매우 낮은 수준의 도구이며 파일과 빈 공간을 구별할 수 있는 수단이 없습니다.

반면에 빈 공간은 매우 훌륭하게 압축되므로 쓰기 시간 등 저장 공간만 고려한다면 gzip을 통해 파이프하면 됩니다.

관련 정보