无法写入SD卡分区表

无法写入SD卡分区表

我无法在 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 个字节,但结果是这样的:

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 个磁头,以使 testdisk 满意。

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 卡。写入闪存需要擦除一页,然后重写整个页,并修改数据。
因为这只能完成有限的次数,所以通常在擦除页面时,抽象层只是选择一个不同的、已擦除的页面并将其映射到相同的地址来实现磨损均衡。相反,这意味着您的闪存在物理上比您的操作系统看到的要大 - 仅仅是因为物理内存上的地址与您的操作系统看到的地址无关,并且总是必须有一定比例的未使用块可以当以前使用的块被擦除时使用。

只有当页面被频繁擦除而不再可靠时,它们才会从可用页面池中删除。当这种情况发生得足够频繁时,内存就会变成“只读”,因为没有页面可以再被擦除,而不会有成为数据丢失者的风险。

由于您不会抱怨该设备在其他地方无法读取,因此这里的情况并非如此。

所以,我很确定这是一个固件保护(SD卡中的闪存控制器是一个运行固件的微控制器,你的读卡器也是如此)功能,可以锁定指向分区表的地址(从未见过,但这是可能的),或者您的操作系统阻止您这样做。

因此,假设这不是操作系统,看到您已经尝试了几个,我会认为是某些固件阻止了您。检查卡侧面是否有一个可能位置错误的特定小滑块!

我可以将分区表写入磁盘上的其他位置吗?

您可以在存储设备上的任何位置写入任何内容(它不是真正的磁盘;)!),但分区表只能在设备的最开始处充当分区表。所以,不,不是你这个问题的意思。

答案2

我会尝试使用 linux 是这样的

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 卡时导致错误,那么您会发生其他事情,就像另一个答案中提到的那样(这超出了我的理解)。你提到无法写入分区表但没有详细说明...有许多实用程序通常不起作用,并且可能会导致您得出错误的结论。执行该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进行磁盘分区。

然后尝试 partprobehwprobe查找有关分区的其他信息。

相关内容