운영 체제(Raspberry Pi OS Buster)가 설치된 32Gb SD 카드가 있고 표준을 사용하여 백업을 만들고 싶습니다 dd
.sudo dd if=/dev/sdb of=/mnt/toshiba2tb/pi20211217.img bs=1M
소스 SD 카드는 아래에서 완벽하게 괜찮아 보입니다.lsblk --fs
db
├─sdb1 vfat RECOVERY 796F-5014
├─sdb2
├─sdb5 ext4 SETTINGS 3b129a7c-44fe-4062-8819-2be9ec66edea
├─sdb6 vfat boot 3830-AECC
└─sdb7 ext4 root 92847503-3b1f-4e22-9fa0-f6794b8fed0c
dd
이미지가 완성되면 새 카드에 복사하고 sudo dd if=/mnt/toshiba2tb/pi20211217.img of=/dev/sdb bs=1M
다른 파티션 테이블을 얻었으며 RPi를 부팅할 수도 없었습니다.
sdb
├─sdb1 vfat RECOVERY 796F-5014
└─sdb2
fdisk
확인하고 신고하고 말도 안되는 2T
구역 설정...무슨 일이 있었던 걸까요?
$ sudo fdisk -l /dev/sdb
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Invalid flag 0xffff of EBR (for partition 5) will be corrected by w(rite).
Disk /dev/sdb: 29.7 GiB, 31914983424 bytes, 62333952 sectors
Disk model: LRWM04U
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000edc50
Device Boot Start End Sectors Size Id Type
/dev/sdb1 8192 3781250 3773059 1.8G e W95 FAT16 (LBA)
/dev/sdb2 3781251 60751871 56970621 27.2G 5 Extended
/dev/sdb5 4298748546 8593715840 4294967295 2T ff BBT
자세한 내용은sudo /sbin/fdisk -l /mnt/toshiba2tb/pi20211217.img
$ sudo /sbin/fdisk -l /mnt/toshiba2tb/pi20211217.img
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Invalid flag 0xffff of EBR (for partition 5) will be corrected by w(rite).
Disk /mnt/toshiba2tb/pi20211217.img: 29 GiB, 31104958464 bytes, 60751872 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000edc50
Device Boot Start End Sectors Size Id Type
/mnt/toshiba2tb/pi20211217.img1 8192 3781250 3773059 1.8G e W95 FAT16 (LBA)
/mnt/toshiba2tb/pi20211217.img2 3781251 60751871 56970621 27.2G 5 Extended
/mnt/toshiba2tb/pi20211217.img5 4298748546 8593715840 4294967295 2T ff BBT
저도 dd_rescue
새로운 이미지 파일을 시도해 보았는데 끝까지 오류가 없는 것 같았습니다.
$ sudo dd_rescue /dev/sdb /mnt/toshiba2tb/pi20211217.rescue.img
dd_rescue: (info) expect to copy 30375936kB from /dev/sdb
dd_rescue: (info): ipos: 30375936.0k, opos: 30375936.0k, xferd: 30375936.0k
errs: 0, errxfer: 0.0k, succxfer: 30375936.0k
+curr.rate: 10374kB/s, avg.rate: 20375kB/s, avg.load: 21.2%
>----------------------------------------.< 99% ETA: 0:00:00
dd_rescue: (info): read /dev/sdb (30375936.0k): EOF
dd_rescue: (info): Summary for /dev/sdb -> /mnt/toshiba2tb/pi20211217.rescue.img:
dd_rescue: (info): ipos: 30375936.0k, opos: 30375936.0k, xferd: 30375936.0k
errs: 0, errxfer: 0.0k, succxfer: 30375936.0k
+curr.rate: 0kB/s, avg.rate: 20312kB/s, avg.load: 21.1%
>----------------------------------------.< 99% ETA: 0:00:00
불행하게도 획득한 파일에는 여전히 손상 징후가 나타납니다.
$ sudo /sbin/fdisk -l /mnt/toshiba2tb/pi20211217.rescue.img
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Invalid flag 0xffff of EBR (for partition 5) will be corrected by w(rite).
Disk /mnt/toshiba2tb/pi20211217.rescue.img: 29 GiB, 31104958464 bytes, 60751872 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000edc50
Device Boot Start End Sectors Size Id Type
/mnt/toshiba2tb/pi20211217.rescue.img1 8192 3781250 3773059 1.8G e W95 FAT16 (LBA)
/mnt/toshiba2tb/pi20211217.rescue.img2 3781251 60751871 56970621 27.2G 5 Extended
/mnt/toshiba2tb/pi20211217.rescue.img5 4298748546 8593715840 4294967295 2T ff BBT
확인하기 위해 이 이미지를 플래시했는데 다른 모든 이미지와 동일한 문제가 있습니다. 부팅할 때 "설정" 파티션을 찾을 수 없어 거기서 영원히 멈춥니다...
이것이 파티션 테이블 문제일 수 있다고 가정하고 sfdisk -d /dev/sdb > pi.partitiontable
.
$ cat pi.partitiontable
label: dos
label-id: 0x000edc50
device: /dev/sdb
unit: sectors
/dev/sdb1 : start= 8192, size= 3773059, type=e
/dev/sdb2 : start= 3781251, size= 56970621, type=5
/dev/sdb5 : start= 3784704, size= 65534, type=83
/dev/sdb6 : start= 3850240, size= 147454, type=c
/dev/sdb7 : start= 3997696, size= 56754176, type=83
그런 다음 이 파티션 테이블을 새로 복사된 SD 카드에 복사했습니다
$ sudo sfdisk /dev/sdb < pi.partitiontable
.
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Ignoring extra data in partition table 5.
Invalid flag 0xffff of EBR (for partition 5) will be corrected by w(rite).
Checking that no-one is using this disk right now ... OK
Disk /dev/sdb: 29.7 GiB, 31914983424 bytes, 62333952 sectors
Disk model: LRWM04U
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000edc50
Old situation:
Device Boot Start End Sectors Size Id Type
/dev/sdb1 8192 3781250 3773059 1.8G e W95 FAT16 (LBA)
/dev/sdb2 3781251 60751871 56970621 27.2G 5 Extended
/dev/sdb5 4298748546 8593715840 4294967295 2T ff BBT
>>> Script header accepted. >>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Created a new DOS disklabel with disk identifier 0x000edc50.
/dev/sdb1: Created a new partition 1 of type 'W95 FAT16 (LBA)' and of size 1.8 GiB.
Partition #1 contains a vfat signature.
/dev/sdb2: Created a new partition 2 of type 'Extended' and of size 27.2 GiB.
/dev/sdb3: Created a new partition 5 of type 'Linux' and of size 32 MiB.
/dev/sdb6: Sector 3850240 is already allocated.
Created a new partition 6 of type 'W95 FAT32 (LBA)' and of size 72 MiB.
/dev/sdb7: Sector 3997696 is already allocated.
Created a new partition 7 of type 'Linux' and of size 27.1 GiB.
/dev/sdb8: Done.
New situation:
Disklabel type: dos
Disk identifier: 0x000edc50
Device Boot Start End Sectors Size Id Type
/dev/sdb1 8192 3781250 3773059 1.8G e W95 FAT16 (LBA)
/dev/sdb2 3781251 60751871 56970621 27.2G 5 Extended
/dev/sdb5 3784704 3850237 65534 32M 83 Linux
/dev/sdb6 3852286 3999739 147454 72M c W95 FAT32 (LBA)
/dev/sdb7 4001788 60751871 56750084 27.1G 83 Linux
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
이 카드를 사용하면 부팅 시 설정 파티션이 손상되었다는 메시지가 표시되므로 운영 체제를 다시 설치해야 합니다. 이는 이전 오류와 다르며 이전 카드에서 가져오고 새 카드에 복사한 파티션 테이블의 정렬이 잘못되었거나 약간의 비호환성 때문일 수 있습니다. 파티션 테이블을 약간 조정하여 이 접근 방식이 가능한지 알고 싶습니다.
답변1
fdisk -l
이미지의 출력은 이미지가 좋지 않음을 나타냅니다. 카드 리더기를 사용하여 원하는 수의 SD 카드에 쓸 수 있지만 항상 나쁜 결과를 얻게 됩니다.
카드를 올바르게 읽을 수 없는 경우를 명시적으로 알려주는 도구를 사용하여 이미지를 다시 읽어야 합니다.
ddrescue /dev/sdb /mnt/toshiba2tb/pi20211217.img
답변2
섹터 수는 sdb5
4294967295 = 0xffffffff이고 파티션 유형 ID도 0xff입니다. Invalid flag 0xffff of EBR (for partition 5) will be corrected by w(rite)
오류 메시지 도 있습니다 .
이것은 SD 카드의 쓰기 오류처럼 보입니다. 어떻게든 거기에 있어야 했던 실제 데이터 바이트가 모두 1바이트로 대체되었습니다.
두 번째 카드의 크기는 다음과 같습니다.
Disk /dev/sdb: 29.7 GiB, 31914983424 bytes, 62333952 sectors
당신은 사용하고 싶을 수도 있습니다Fight Flash Fraud 프로젝트를 위한 f3 도구두 번째 카드의 실제 용량을 확인합니다.
카드가 가짜인 경우 확장 파티션 테이블이 카드 플래시 칩의 실제 용량을 벗어나 실제로 플래시 칩으로 덮이지 않는 빈 주소 공간에 있으므로 실제로 저장에 유용하지 않기 때문에 오류가 발생할 수 있습니다. . 모든 데이터. 이러한 주소 공간에서 읽으려고 하면 일반적으로 전체 1바이트만 생성됩니다. 이러한 주소 공간에 기록된 모든 데이터는 즉시 손실됩니다.
위조 메모리 카드는 종종 실제 용량보다 훨씬 더 많은 저장 용량을 갖고 있다고 주장합니다. 카드 시작 부분의 저장은 잘 작동하며 카드가 일반 테스트를 위한 준비가 된 것 같습니다. 그러나 더 많은 용량을 사용하려고 하면 카드에서 오류가 발생하기 시작하거나 더 교묘하게 오류를 무시하고 의미 없는 데이터를 반환합니다.
귀하의 경우, 블록 #3781251(즉, 카드 시작 부분에서 약 1.9GB)의 확장 파티션 테이블이 손상되었다는 사실은 가짜 카드가 주장하는 대로 실제 저장 용량이 2GiB 미만임을 의미할 수 있습니다. 29.7 GiB를 갖습니다.
답변3
예를 들어 지정된 공칭 크기의 SD 카드 및 USB 플래시 드라이브
32 GB = 10^9 * 32 / 2^30 GiB approx= 29.8 GiB
공칭 크기에 가까운 다양한 크기가 있습니다. 일부 드라이브는 약간 더 크고 일부는 약간 작습니다(예, 작은 크기이지만 너무 작지는 않습니다).
불행하게도 공칭 크기보다 훨씬 작은 드라이브를 사용하는 사기도 있습니다.
복제 시 심각한 문제는 전체 드라이브를 사용하는 파티션이 있는 드라이브를 약간 더 작은 드라이브에 복제할 수 없다는 것입니다. 대상 드라이브는 바이트 수준에서 최소한 동일한 크기여야 합니다.
lsblk -b
드라이브의 크기가 정확히 같으면 복제가 간단합니다.
MSDOS 파티션 테이블(MBR이라고도 함)이 있으면 더 큰 드라이브로 복제하는 것이 간단합니다. 이 경우 "마지막" 파티션의 크기를 늘려 할당되지 않은 드라이브 공간을 사용할 수 있습니다.
더 큰 드라이브에 복제할 때 GPT(GUID 파티션 테이블)가 있으면 추가 작업이 필요합니다. 드라이브 끝에 백업 파티션 테이블이 있어야 하며 다음 명령을 사용하여 복구할 수 있습니다.
gdisk
. 쉘스크립트를 통해 자동화할 수 있습니다.gpt-fix
. 이 수정 사항은 다음과 같습니다.mkusbu이미지 파일을 복제할 때. 복구 후에는 "마지막" 파티션의 크기를 늘려 할당되지 않은 드라이브 공간을 사용할 수 있습니다.
따라서 대상 드라이브를 버리기 전에 크기를 확인하고 가능하면 원래 드라이브보다 작지 않은 대상 드라이브를 구하십시오. 또 다른 방법은 원본 드라이브의 마지막 파티션을 축소하여 대상 드라이브의 크기에 맞추는 것입니다. gparted
이런 목적 으로 사용할 수 있습니다 .
GPT인 경우 백업 파티션 테이블을 복구하세요.