/ 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에있었습니다.
답변
당시에는 임베디드 Linux 배포판에서 비슷한 문제가 발생했습니다. 이미지를 압축하기 전에 모든 정크를 제거하십시오.
dd if=/dev/zero of=asdf.txt
. 죽을 때까지 기다리십시오. asdf.txt를 삭제하십시오.
장치의 모든 여유 공간에 0을 썼습니다.
이제 디스크 이미지를 가져 와서 gzip을 통해 실행하십시오. 짜잔 한 이미지.
아마도 확장 성이 떨어지고 실제로 디스크에 기록해야 할 경우 문제가 발생할 수 있습니다.
디스크의 rsync 스냅 샷을 다른 볼륨으로 가져 와서 0으로 만든 다음 해당 디스크 이미지를 만들 수 있습니다.
참고 : SSD에 위험 할 수 있으므로 커밋하기 전에이 작업을 고려해야합니다.
답변
저장하려는 가정 /dev/sdXN
에 /tgtfs/image.raw
당신이 루트입니다 :
-
mkdir /srcfs && mount /dev/sdXN /srcfs
-
zerofill 또는 just :
dd if=/dev/zero of=/srcfs/tmpzero.txt
를 사용하여 사용하지 않는 블록을 0으로 채우십시오 (파일 시스템이 완전히 채워질 때까지 기다리십시오rm /srcfs/tmpzero.txt
) -
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)에서는 좋지 않은 아이디어입니다
답변
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 씩 증가시킵니다.
답변
반면 /dev/zero
자유 디스크 공간 사용을 보내고 dd conv=sparse
/ gz -c
빈 공간이,의 GBS 100 단위에서 실행하는 거대한 디스크에 가능합니다 /dev/zero
천천히 고통스럽게 보내고있다 – 다른 답변이 언급 한 바와 같이, 그 말할 것도없고 /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
읽기 / 쓰기 오프셋을 통해 복사되면 위의 프로세스가 ‘파티션’을 복사하도록 조정할 수 있다고 생각합니다 skip
/ seek
옵션이 dd
각각 필요합니다.
답변
당신은 할 수 없습니다. dd
매우 낮은 수준의 도구이며 파일과 빈 공간을 구분할 방법이 없습니다.
반면에 빈 공간은 매우 잘 압축되므로 쓰기 시간이 아닌 저장 공간에만 관심이 있다면 gzip을 통해 파이프하십시오.
답변
드라이브의 나머지 부분이 비어 있다고 가정하면 (0까지) gzip을 통해 DD를 파이프하면 빈 공간이 상당히 잘 압축됩니다. zerofree 와 같은 도구를 사용 하여 빈 공간이 실제로 비어 있는지 확인하여 잘 압축하십시오.
partimage , clonezilla 또는 다른 Linux 복제 도구와 같은 도구를 사용하면 대부분 자동으로 처리됩니다.
답변
허용 된 답변이 맞지 않습니다. 위의 의견에 동의합니다. dd 를 count 매개 변수 와 함께 사용 하여 디스크를 정기적으로 백업합니다. 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"