it-swarm-ko.tech

전체 디스크에 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에있었습니다.

41
Jonathan Henson

당시에는 임베디드 Linux 배포판과 비슷한 문제가 발생했습니다. 이미지를 압축하기 전에 모든 정크를 제거하십시오.

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

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

이제 디스크 이미지를 가져 와서 gzip을 통해 실행하십시오. 짜잔 한 이미지.

아마도 디스크 크기를 잘 조정하지 못하고 실제로 디스크에 기록해야 할 경우 문제가 발생할 수 있습니다.

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

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

39
Rob Bos

/dev/sdXN/tgtfs/image.raw에 저장하려고한다고 가정하면 루트입니다.

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

  2. zerofill를 사용하거나 다음을 수행하십시오.
    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

압축을 사용하려면 0 블록이 압축률이 높으므로 dd로 0을 펀칭 할 필요가 없습니다.

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

추신 : 당신은 플래시 메모리 기반 저장 매체 (즉, 소스 파일 시스템이 SSD 인 경우)에 정기적으로 글을 쓰는 것이 좋지 않습니다 (광범위한 쓰기가 발생할 수 있음) SSD에 넣고 수명을 줄입니다. (그러나 가끔 데이터를 전송해도 괜찮습니다)

21
Microsoft Linux TM

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) "끝"열입니다. 귀하의 경우 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 씩 증가시킵니다.

14
Tom Looby

동안 /dev/zero 여유 디스크 공간을 사용하고 dd conv=sparse/gz -c는 100GB의 빈 공간이있는 거대한 디스크에서 가능합니다. /dev/zeroing은 고통스럽게 느리다-다른 답변에서 언급했듯이 /dev/zero EOF까지 SDD를 수행합니다.

이 상황에 처했을 때 내가 한 일은 다음과 같습니다.

  • Lubuntu 라이브 CD에서 gparted를 사용하여 디스크를 가능한 최소 크기로 '축소'하고 나머지 공간은 할당하지 않았습니다.

  • 익숙한
    dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz 빠른 압축 이미지 생성 (원시 데이터를 저장하기에 충분한 공간이 있거나 CPU로드를 줄이려는 경향이있는 경우 압축을 생략 할 수 있음)

  • 익숙한
    dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY 데이터를 다른 디스크로 다시 복사
  • gparted을 (를) 다시 사용하여 파티션을 '확장'

여러 파티션에 대해 시도하지는 않았지만 대상 디스크의 파티션 테이블을 먼저 만들고 파티션에 포함 된 데이터 만 dd를 통해 복사하면 위의 프로세스를 '파티션'을 복사하도록 조정할 수 있다고 생각합니다 -읽기/쓰기 오프셋 (각각 skipseek/dd 옵션)이 필요합니다.

10
Ashish Chopra

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

반면 빈 공간은 아주 잘 압축되므로 쓰기 시간이 아닌 저장 공간에만 관심이 있다면 gzip을 통해 파이프하십시오.

8
c2h5oh

드라이브의 나머지 부분이 비어 있다고 가정하면 (0까지) gzip을 통해 DD를 파이프하면 빈 공간을 아주 잘 압축 할 수 있습니다. zerofree 와 같은 도구를 사용하여 빈 공간이 실제로 비어 있는지 확인하여 잘 압축하십시오.

partimage , clonezilla 또는 다른 Linux 복제 도구와 같은 도구를 사용하면 대부분의 경우 자동으로 처리됩니다.

7
Zoredache

허용 된 답변이 맞지 않습니다. 위의 의견에 동의합니다. 디스크를 정기적으로 백업하기 위해 ddcount 매개 변수와 함께 사용합니다. BACKUP_FOLDER와 기기의 문자를 "X"로 바꾸십시오.

디스크의 마지막으로 사용 된 블록을 정의하십시오.

ct=$(fdisk -l | awk '$1 == "/dev/sdX" { print $3 }')

그런 다음 빈 공간을 제외하고 디스크를 복제하십시오.

dd if=/dev/sdX bs=512 count=$ct | gzip > BACKUP_FOLDER/sdX_$(date +"%Y-%m-%d").img.gz >>"$LOG"
4
Aloha D