SD 카드에 파티션 테이블을 쓸 수 없습니다. IOCTL 오류. Linux에서 parted, cfdisk 또는 fdisk를 사용하거나 Windows에서는 형식이 작동하지 않는다는 메시지만 표시되어 제거할 수 없습니다. 파티션 테이블은 사라지지 않으므로 디스크의 해당 섹터가 쓰기에 실패했지만 어떻게든 읽을 수 있다고 확신합니다.
디스크의 다른 위치에 파티션 테이블을 쓸 수 있나요?
SD 카드는 32GB Sandisk이고 k3os를 사용하여 플래시했습니다.
추가 정보:
TestDisk 7.1, Data Recovery Utility, July 2019
Christophe GRENIER <[email protected]>
https://www.cgsecurity.org
Disk /dev/sdd - 31 GB / 29 GiB - CHS 30437 64 32
Analyse cylinder 1084/30436: 03%
Read error at 1083/1/1 (lba=2218016)
check_FAT: Unusual number of reserved sectors 4 (FAT), should be 1.
FAT16 >32M 1 0 1 56 63 32 114688 [NO NAME]
Linux 58 0 1 1010 63 32 1951744 [root]
처음 512바이트에 0을 쓰려고 했지만 결과는 다음과 같습니다.
root@amnesia:~# dd if=/dev/sdd bs=512 count=1|hexdump
1+0 records in
1+0 records out
0000000 b8fa 1000 d08e 00bc b8b0 0000 d88e c08e
0000010 befb 7c00 00bf b906 0200 a4f3 21ea 0006
0000020 be00 07be 0438 0b75 c683 8110 fefe 7507
0000030 ebf3 b416 b002 bb01 7c00 80b2 748a 8b01
512 bytes copied, 0.0029971 s, 171 kB/s
0000040 024c 13cd 00ea 007c eb00 00fe 0000 0000
0000050 0000 0000 0000 0000 0000 0000 0000 0000
*
00001b0 0000 0000 0000 0000 e765 fb8c 0000 0080
00001c0 1001 030c 8fe0 0800 0000 c000 0001 0000
00001d0 a0c1 0383 ffe0 d000 0001 c800 001d 0000
00001e0 0000 0000 0000 0000 0000 0000 0000 0000
00001f0 0000 0000 0000 0000 0000 0000 0000 aa55
0000200
정말 첫 번째 섹터에 쓸 수 없는 것 같습니다. 또한 이 카드에서 testdisk를 사용할 때마다 실린더 1083의 읽기 오류가 일관됩니다. 그런데 테스트디스크를 만족시키기 위해 디스크 구조를 4개 헤드에서 64개 헤드로 변경했습니다.
Smartctl 오류, 유용한 정보가 없습니다. lsblk는 다음을 보여줍니다.
root@amnesia:~# lsblk2 /dev/sdd
SIZE FSTYPE MODEL NAME SERIAL UUID
29.7G SD_Card_Reader sdd 000000000820
56M vfat ├─sdd1 D013-2C4C
953M ext4 └─sdd2 a3198349-8ae7-47cd-8ed7-26e09ba8146b
sdtool이라는 도구는 "쓰기 방지 상태: 꺼짐"을 표시합니다.
이것은 단지 저장할 수 없는 불량 SD 카드인가요?
답변1
나는 디스크의 이러한 섹터가 쓰기에 실패했지만 어떻게든 읽을 수 있다고 확신합니다.
이는 SD 카드와 같은 플래시 추상화 계층이 있는 플래시 메모리의 실패 모드가 아닙니다. 플래시 메모리에 쓰려면 한 페이지를 지운 다음 전체 페이지를 다시 쓰고 데이터를 수정해야 합니다.
이 작업은 제한된 횟수만 수행할 수 있기 때문에 일반적으로 페이지가 지워질 때 추상화 계층은 단순히 다른 지워진 페이지를 선택하여 동일한 주소에 매핑합니다.웨어 레벨링. 오히려 이는 플래시 메모리가 OS가 보는 것보다 물리적으로 더 크다는 것을 의미합니다. 단순히 실제 메모리의 주소는 OS가 보는 주소와 아무 관련이 없으며 항상 사용된 블록이 아닌 특정 비율이 있어야 하기 때문입니다. 이전에 사용된 블록을 지울 때 사용할 수 있습니다.
페이지는 자주 지워지고 더 이상 신뢰할 수 없는 경우에만 사용 가능한 페이지 풀에서 제거됩니다. 이런 일이 자주 발생하면 데이터 손실 위험 없이 페이지를 다시 지울 수 없으므로 메모리는 "읽기 전용"이 됩니다.
다른 곳에서는 장치를 읽을 수 없다고 불평하지 않을 것이기 때문에 여기서는 그렇지 않습니다.
그래서 저는 이것이 파티션 테이블을 가리키는 주소를 잠그는 펌웨어 보호(SD 카드의 플래시 컨트롤러는 카드 리더와 마찬가지로 펌웨어를 실행하는 마이크로컨트롤러입니다)라고 확신합니다. 가능) 또는 운영 체제에서 그렇게 할 수 없도록 차단합니다.
따라서 OS가 아니라고 가정하고 몇 가지를 시도한 것을 보면 일부 펌웨어가 사용자를 차단하고 있다고 가정합니다. 잘못된 위치에 있을 수 있는 특정 작은 슬라이더가 있는지 카드 측면을 확인하세요!
디스크의 다른 위치에 파티션 테이블을 쓸 수 있나요?
저장 장치의 어느 곳에나 무엇이든 쓸 수 있습니다(실제 디스크가 아닙니다;)! ), 그러나 파티션 테이블은 장치의 맨 처음 부분에서만 파티션 테이블 역할을 할 수 있습니다. 그래서, 아니, 그것은 당신의 질문이 의미하는 바가 아닙니다.
답변2
나는 이런 리눅스를 사용해 볼 것이다
lsblk
# identify the sd card, be sure it is what u think it is by removing then running
# lsblk again and seeing that not there, then reconnecting.
# also
alias lsblk2='lsblk -o size,fstype,model,name,serial,uuid'
lsblk2
# that will print out more useful info
# then, for example, if your sd card is /dev/sdb
dd if=/dev/zero of=/dev/sdb bs=512 count=1
해당 dd
명령이 작동하지 않고 SD 카드에 간단한 0을 쓸 때 오류가 발생하는 경우 다른 답변에서 언급한 것처럼 다른 문제가 발생하는 것입니다(이는 이해할 수 없습니다). 당신이 언급한파티션 테이블에 쓸 수 없습니다.하지만 자세히 설명하지 않으면... 종종 작동하지 않고 잘못된 결론을 내릴 수 있는 유틸리티가 많이 있습니다. 이 dd
명령을 실행하면 SD 카드의 기존 파티션 테이블도 효과적으로 지워집니다.
# to create a partition table it would be this command,
# again assuming /dev/sdb is your sd card for example
parted /dev/sdb mklabel gpt
# I have never had this parted command fail on me
또 다른 진단 방법은 smartctl --xall /dev/sdb
SD 카드의 상태를 보여주는 값에 액세스하는 것입니다. 이는 특히 SD 카드에 실제로 문제가 있는지 이해하는 데 도움이 될 수 있습니다.내마모성 등급.
https://superuser.com/questions/1064119/usb-flash-drives-or-sd-cards-with-smart
답변3
이 명령을 사용하여 lsblk
SD 카드가 있는 블록을 찾으세요.
다음 fdisk
으로 디스크 파티셔닝을 진행합니다.
그런 다음 파티션에 대한 추가 정보를 찾아보십시오 partprobe
. hwprobe