인접한 파티션을 덮어 쓸 수 있음


15

할 것이다

dd if=/dev/zero of=somepartition bs=512

또한 somepartition종료 후 파티션을 지우 거나 종료 somepartition합니까?


5
예를 들어 파티션을 나타내는 블록 장치는 /dev/sda1커널을 통해 인접 스토리지에 액세스 할 수없는 방식으로 생성됩니다 (커널이 마지막으로 읽은 후에 파티션 테이블이 변경되지 않은 경우). 그런 식으로 인접 스토리지에 액세스 할 수 있으면 큰 버그로 간주됩니다.
David Foerster

답변:


18

파티션을 덮어 쓰기 dd

dd매우 강력하지만 위험한 도구입니다. 질문없이 무엇을하라고 지시합니까? 따라서 가족 사진을 지우라고하면 사소한 타이핑 오류입니다.

그러나 확인하고 다시 확인하면 사용할 수 있습니다.

dd if=/dev/zero of=somepartition bs=512

또는 나는 제안 할 것이다

dd if=/dev/zero of=/dev/sdxn bs=4096

여기서 x드라이브 문자 n는 파티션 번호이며 블록 크기는 4096 바이트이며 쓰기 프로세스가 더 빠릅니다.

이 경우 파티션쓰는 것이 중요합니다 . 전체 드라이브 (드라이브 헤드 엔드) /dev/sdx에 쓰면 전체 드라이브를 덮어 씁니다. 그러나 파티션 쓰기는 파티션 끝에서 중단되며 그 뒤에있는 파티션은 보존됩니다. ( 지금 Lubuntu 16.04 LTS의 USB 펜 드라이브에서 테스트 했으므로 그 방식으로 작동합니다.)

확장 파티션에 대한 예외

확장 파티션 (MSDOS 파티션 테이블에 4 개 이상의 파티션을 갖기 위해 논리 파티션의 컨테이너)에 대한 예외가 있습니다. 이것은 다음 링크에 설명되어 있습니다.

dd를 사용하여 '확장'파티션 이미지를 만들 수 있습니까?

그러나 또 다른 문제가 있습니다. 테스트 환경에서 명령을 테스트했으며 확장 파티션의 이미지를 만들고 싶을 때 dd는 1 킬로바이트 (1024 바이트) 만 읽었습니다.

나는 이것을 Lubuntu 16.04 LTS의 USB pendrive에서 테스트했으며, 이는 글쓰기뿐만 아니라 읽기에도 적용됩니다. 첫 번째 키비 바이트 만 덮어 씁니다.

요약하면 기본 파티션 및 논리 파티션 덮어 쓰기는이 답변의 주요 설명에 따라 작동합니다. 그러나 첫 번째 kibibyte 만 겹쳐 쓰므로 확장 파티션을 겹쳐 쓰려면이 방법을 사용하지 마십시오. 확장 파티션의 논리 파티션은 더 이상 파티션 테이블을 통해 찾을 수 없지만 여기에 저장된 데이터는 여전히 존재합니다.


나는 이미 받아 들였지만 이것이 맞다면 이것이 정답이어야한다.
LogicBreaker

3
@LogicBreaker, 아마도 당신은 수용을 움직일 수 있습니다. 그러나 그것은 중요하지 않습니다. 사용 방법을 이해하고 사용 dd하는 것이 위험하므로 사용시 매우주의를 기울여야합니다. 행운을 빕니다 :-) 일반적으로, 당신은 항상 잃을 여유가없는 모든 파일을 백업 해야합니다 .
sudodus

1
베어 파티션에 쓸 때 많은 대안이 없습니다. 나는 움직이지 않으면 다른 사람들에게는 오도의 소지가 있습니다.
LogicBreaker

1
이것이 사용자가 보통 / dev / * "파일"에 액세스 할 수없는 이유입니다.
Thorbjørn Ravn Andersen

1
이것이 백업이없는 가족 사진 의 유일한 사본 인 경우 , 도난, 화재, 사고 또는 간단한 하드웨어 고장으로 언제든지 손실 될 수 있습니다. :-)
user334639

4

파티션 장치에 쓰면 해당 파티션 외부에 dd 또는 다른 어떤 것도 쓰지 않습니다. 단일 파티션 외부에서 영향을 미치려면 전체 디스크 장치를 사용해야합니다.

(주의 : 디스크에 파티션이 겹치는 파티션 테이블이 없으면 절대로 발생하지 않아야합니다.)


3
또 다른주의 사항 : LVM과 같은 것을 사용하는 경우 물리 볼륨에 쓰는 것은 물론 많은 논리 볼륨에 영향을 줄 수 있습니다.
Maxpm

4

귀하의 질문은 dd(그리고 일반적으로 Unix와 같은 운영 체제) 작동 방식에 대한 근본적인 오해에 기초하고 있다고 생각합니다 .

dd하지 덮어 쓰기 인접한 파티션, 단순히 때문에 수 dd수 없습니다 덮어 쓰기 파티션, 기간은 .

dd단순히 파일에 씁니다 . 그게 다야.

이제 경우에 당신이 통과 dd나타내는 파일 에 여러 파티션을 다음 dd덮어 쓰게됩니다 해당 파일을 . 그러나이 경우 dd파티션의 끝을 지나쳐 쓰지 않습니다 . dd파일의 끝까지, 그리고 파일 의 끝까지 쓸 것 입니다.

그러나 dd하나의 파티션 만 나타내는 파일을 전달 하면 dd이 파티션의 끝을 지나서 쓰지 않습니다. 다시, 이것은와 관련이 없습니다 dd. dd단순히 파일에 쓰도록 지시합니다. 이 파일이 단일 파티션을 나타내는 사실은 (이 경우) 커널의 블록 장치 드라이버에 의해 보장됩니다. dd그것과 관련이 없습니다.

즉, dd파일에 씁니다. 이 파일들이 나타내는 것은 dd걱정할 것이 없습니다 . dd파티션에 대해서는 아무것도 모른다.


음 ... 파일에 dd 만 쓰면 원시 파티션에 쓸 수 없습니다.
LogicBreaker

1
옳은. dd원시 파티션에 쓰는 데 사용할 수 없습니다 . 파일에만 쓸 수 있습니다. 당신은 할 수있는 블록 장치 파일에 코스 쓰기의 대표 파티션을 (예 /dev/sda1),하지만 당신은 원시 파티션에 쓸 수 없습니다. 그리고 파티션 을 나타내는 파일에만 쓸 수 있기 때문에 파일은 파티션과 끝을 지나는 비트가 아니라 파티션 만 나타내므로 파티션 끝을 지나쳐 쓸 수 없습니다.
Jörg W Mittag

3
조그 (Jorg)는 유닉스 철학의 주요 아이디어 중 하나 인 "모든 것이 파일"이라고 언급합니다. 이와 같이 커널은 파티션, 장치, 포트 등을 파일로 제공합니다. 결과적으로 파일에 쓸 수있는 모든 프로그램을 사용하여 파티션이나 장치에 쓸 수 있습니다. 파티션 경계를 적용하는 것이 커널의 역할입니다. /dev/sda텍스트 편집기에서 열고 데이터를 변경할 dd수 있으며 파티션에 액세스 할 수 있다는 점에서 다른 프로그램과 다릅니다. 아주 좋은 답변입니다!
Sergey

1

버그가없는 블록 장치 드라이버에서도 이러한 상황이 발생할 수 있지만 위험하지만 드문 특수 시나리오가 있습니다.

  • 디스크의 파티션 테이블은 파티션 x가 이전보다 낮은 경계에서 끝나도록 크기가 조정되는 방식으로 변경됩니다. 뒤에있는 파티션 y는 아래쪽 경계에서 시작 크기가 조정되거나 새 파티션 y가 공간에 추가됩니다.
  • 파티션 y는 파티션 테이블과 독립적 인 방법으로 관련 데이터로 채워집니다 (예 : 전체 디스크 블록 장치에서 건너 뛰기 / 카운트 옵션과 함께 dd 사용 (예 : / dev / sda)).
  • 커널에게 파티션 테이블을 다시 읽도록 지시하는 ioctl이 발행되지 않거나 사용중인 장치로 인해 실패
  • 파티션 x는 오류 조건에 도달 할 때까지 쓰기를 시도하는 모든 프로세스에 의해 기록됩니다.

0

실수를 한 것처럼 dd에주의해야합니다. dd를 사용하는 것보다 더 많은 것을 덮어 쓸 수 있으며 dd를 사용하는 대상에 따라 다릅니다 (OP는 dd를 사용하는 데있어 모호하고 dd의 정확한 구문에 대해 모호했습니다) 명령).

파티션 을 지정 하면 파티션이 가득 찰 때까지 해당 파티션에 씁니다.

실수로 전체 드라이브 (예 : = / dev / sda)를 넣으면 dd는 전체 드라이브 시작에 기록하여 파티션 테이블 무시 (및 덮어 쓰기)를 완료합니다.

또한 파티션에서 dd를 사용하여 삭제 된 파일을 덮어 쓸 수 있습니다 (삭제 된 파일은 파티션에 남아있을 수 있으며 파일을 덮어 쓸 때까지 여러 가지 성공률로 다양한 복구 도구에 의해 발견 될 수 있습니다.이 경우 dd를 사용하여 여유 공간을 채울 수 있음) 파일에 쓰기.

dd if=/dev/zero of=/path/to/mount_point/zero_file bs=4096
rm -f /path/to/mount_point/zero_file

그러나 수행중인 작업에 따라 대체 도구를 사용하여 파일을 안전하게 삭제할 수 있습니다. 안전한 방법으로 파일을 삭제하는 방법을 참조하십시오 . 옵션.


6
/ dev / sdcX에 쓸 수 있고 파티션 경계를 넘어 쓸 수 있다면, 파티션 테이블을 무시하는 것이 dd는 아닙니다. 커널에서 버그가 발생하고 파티션 테이블을 무시하는 것은 블록 장치 드라이버입니다.
rackandboneman

1
@sudodus dd는 그렇게 낮은 수준이 아닙니다. 실제로 사람들이 사용하는 대부분의 dd작업은와 동일하게 수행 될 수 있습니다 cat. 실제로 기본적으로 cat사용하는 것보다 더 큰 블록을 사용하기 때문에 약간 더 빠릅니다 dd. 모든 저수준 코드는 커널에 있습니다. 그리고 드라이버는 정말 당신이 사용하는 경우 상관하지 않는다 ddcat.
kasperd

1
@sudodus-혼란을 드려 죄송합니다. 의도했던 것만 큼 명확하지 않았습니다. dd는 계속 글을 쓸 수 있으며, 당신이하는 일에 달려 있습니다. dd if=/dev/zero of=/dev/sda bs=512 count=1또는 dd if=/dev/zero of=/dev/sda bs=512예입니다. 두 번째 명령을 사용하면 파티션 테이블을 무시하고 전체 디스크를 작성하고 채 웁니다. 파티션을 지정하면 파티션 dd if=/dev/zero of=/dev/sda1을 넘어 가지 않습니다. dd로 수행하려는 작업에 따라 다릅니다.
Panther

1
@Panther이 질문은 구체적 of=somepartition으로이므로 전체 디스크 장치에 쓰는 경우에는 적용되지 않습니다. dd장치 드라이버의 제한 사항을 해결할 수 없습니다.
Barmar

1
@Bamar는 이미 그것에 대해 언급했습니다. 나는 많은 사용자는 / dev / sda를위한 $ somepartition 혼란 보았다
팬더
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.