dd를 사용하여 깨끗한 MBR 코드를 얻으면 pfSense에서 작동하지 않습니다.

dd를 사용하여 깨끗한 MBR 코드를 얻으면 pfSense에서 작동하지 않습니다.

쉘 명령에서 pfsense 2.7.0 라이브 디스크(pfsense는 freebsd 기반)를 사용하여 디스크의 MBR 코드 부분을 정리해보세요.

존재하다/dev/da0내 드라이브는 권장 정리 코드를 따르며 파티션의 mbr 코드만 남겨두고 명령은 다음과 같아야 합니다.

dd if=/dev/zero of=/dev/da0 bs=446 count=1

그런데...결과는 이렇습니다.

dd: /dev/da0: Invalid argument
1+0 records in
0+0 records out
0 bytes transferred in 0.000089 secs (0 bytes/sec)

대신... 그냥 코드로 사용하면 dd if=/dev/zero of=/dev/da0오류 없이 모든 것이 삭제됩니다. :(

이 텍스트를 테스트하기 위해 HD를 여러 번 복원할 수 있도록 가상 머신에서 테스트하고 있는데... 이게 머리가 아프네요...

편집하다:사용하면 bs=512오류 bs=1M가 발생하지 않는 것 같습니다. 하지만 이렇게 하면 파티션 테이블 부분도 삭제됩니다...

편집 2:해당 명령을 사용해 보았 dd if=/dev/da0 of=/tmp/mbr_file bs=512 count=1더니 mbr이 포함된 파일이 생성되었습니다. 바이너리 모드에서 파일을 편집하는 데 사용할 수 있는 명령이 무엇인지 알고 싶습니다. 처음 446바이트를 0으로 채운 다음 이를 사용하여 dd if=/tmp/mbr_file of=/dev/da0 bs=512 count=1복원합니다.

무엇을 사용할 수 있나요? 육?

답변1

BSD 시스템을 마지막으로 사용한 지 꽤 오랜 시간이 지났고, 디스크 장치에 관한 내 기억에는 전체 블록(또는 블록)을 기록해야 한다는 것이 있었습니다. 특히 /dev/da0.

일반적인 접근 방식은 블록을 읽고 관련 부분을 업데이트한 다음 전체 블록을 다시 쓰는 것입니다. 여기서는 아래와 같이 원본 블록의 백업도 유지합니다 block0.backup.

dd if=/dev/da0 bs=512 count=1 | tee block0.backup >block0
dd if=/dev/zero bs=446 count=1 conv=notrunc of=block0
dd if=block0 bs=512 of=/dev/da0

(이것은 실제로 필요 dd하지만 그렇지 않은 드문 경우 중 하나입니다 cat.)

백업으로 복원해야 하는 경우

dd if=block0.backup bs=512 of=/dev/da0

답변2

글쎄요, 여러번 테스트를 해보고 내린 결론은..

pfsense는 freebsd의 간단한 버전이고 많은 도구가 부족하기 때문에 디스크의 처음 446바이트를 지우고 파티션 테이블을 첫 번째 512바이트 블록의 최신 66바이트로 유지하려면 이 작업을 수행해야 합니다.

dd if=/dev/da0 of=/tmp/mbr_file_original bs=512 count=1
dd if=/dev/zero of=/tmp/mbr_file_zerofilled bs=446 count=1
cat /tmp/mbr_file_original | ( dd of=/dev/null bs=446 count=1; dd bs=66 count=1 ) > /tmp/mbr_file_partitions_table
cat /tmp/mbr_file_partitions_table >> /tmp/mbr_file_zerofilled
mv /tmp/mbr_file_zerofilled /tmp/mbr_file_new
dd if=/tmp/mbr_file_new of=/dev/da0 bs=512 count=1

그런 다음 복사된 MBR 콘텐츠를 테스트합니다.

dd if=/dev/da0 of=/tmp/mbr_file_test bs=512 count=1
hexdump /tmp/mbr_file_test | less

간단히 말해서 내가 하는 일은 다음과 같다.

  • Mbr을 mbr_file_original에 복사
  • mbr_file_zerofilled라는 0으로 채워진 446바이트 파일을 생성했습니다.
  • 그런 다음 누군가 예, 내가 당신을보고 있기 때문에 거의 모든 유용한 도구, 심지어 16진수 편집기까지 제거하고 이 해킹만 사용할 수 있게 남겨두고 이 줄을 사용하여 cat mbr_file | ( dd of=/dev/null bs=446 count=1; dd bs=66 count=1 ) > mbr_file_partition_table원본 mbr_file에서 마지막 66바이트를 추출합니다.
  • 이 시점에서는 명확성을 위해 cat을 사용하여 2개의 파일을 연결하고 이름을 mbr_file_new로 바꾼 다음 dd를 사용하여 mbr을 da0 장치에 다시 저장했습니다.

이번에는 한 번에 512바이트를 사용했기 때문에 오류가 발생하지 않았습니다.

답변3

몇몇 답변에서는 문자가 문자 장치에 기록되고 블록이 블록 장치에 기록된다는 것이 올바르게 명시되어 있습니다.

pfSense에 어떤 도구가 포함되어 있고 어떤 도구가 생략되어 있는지는 모르지만 완전한 기능을 갖춘 FreeBSD 시스템에서는 다음이 작동합니다.

/boot/pmbr테스트 디스크에 샘플 이미지를 작성 하고 /dev/md0이를 시작점으로 사용하겠습니다.

# gpart bootcode -b /boot/pmbr md0
bootcode written to md0

이렇게 하면 첫 번째 부분이 다음 md0과 같이 보입니다.

# dd if=/dev/md0 count=1 | hexdump -v
1+0 records in
1+0 records out
512 bytes transferred in 0.000053 secs (9723673 bytes/sec)
0000000 31fc 8ec0 8ec0 8ed8 bcd0 0e00 1abe bf7c
0000010 061a e6b9 f301 e9a4 8a00 fa80 7280 8a0b
0000020 7536 8004 80c6 f238 0272 80b2 d1e8 b600
0000030 bb01 0e00 91be e807 00ac 8166 003e 450e
0000040 4946 7520 660d 3e81 0e04 4150 5452 0275
...
00001a0 be11 000b 6015 4fb8 900f 9090 9090 9090
00001b0 9090 9090 9090 9090 0000 0000 0000 0000
00001c0 0000 0000 0000 0000 0000 0000 0000 0000
00001d0 0000 0000 0000 0000 0000 0000 0000 0000
00001e0 0000 0000 0000 0000 0000 0000 0000 0000
00001f0 0000 0000 0000 0000 0000 0000 0000 aa55
0000200

제로화된 MBR 부트 레코드를 생성하기 위해 이미지를 복사하겠습니다 pmbr.

# cp -vp /boot/pmbr mbr.zeroed
/boot/pmbr -> mbr.zeroed

hexedit오프셋 0x0-0x1b7에 0을 배치하는 데 사용됩니다 .
Ctrl-X Y저장 및 종료.

마지막으로 gpart파일을 MBR에 다시 쓰라고 말씀드리겠습니다.

# gpart bootcode -b mbr.zeroed md0
bootcode written to md0

이제 우리는:

# dd if=/dev/md0 count=1 | hexdump -v
1+0 records in
1+0 records out
512 bytes transferred in 0.000106 secs (4847613 bytes/sec)
0000000 0000 0000 0000 0000 0000 0000 0000 0000
0000010 0000 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
0000030 0000 0000 0000 0000 0000 0000 0000 0000
0000040 0000 0000 0000 0000 0000 0000 0000 0000
...
00001a0 0000 0000 0000 0000 0000 0000 0000 0000
00001b0 0000 0000 0000 0000 0000 0000 0000 0000
00001c0 0000 0000 0000 0000 0000 0000 0000 0000
00001d0 0000 0000 0000 0000 0000 0000 0000 0000
00001e0 0000 0000 0000 0000 0000 0000 0000 0000
00001f0 0000 0000 0000 0000 0000 0000 0000 aa55
0000200

관련 정보