我的 SD 卡有一个分区,但 Linux 没有为该分区创建设备条目

我的 SD 卡有一个分区,但 Linux 没有为该分区创建设备条目

好吧,我不知道这里发生了什么,一开始我以为这是我记得不久前遇到的一个问题,我无法挂载 vfat 分区,因为它设置了一些标志,表明它没有被彻底删除。我记得有一个方法可以解决这个问题,但现在找不到了。无论如何,我不认为这是这里的问题,我已经搜索了几天但没有运气。

这是一张 SDHC 卡 (32GB),我用于我的一台相机(我还有另一张用于另一台相机的 32GB 卡,具有相同的 USB 适配器,并且在 Linux 中工作正常),因此我可以从相机没问题,但是当我在 Linux 中插入适配器+卡时,Konqueror 中没有出现任何设备。所以我尝试这样做:

# mount /dev/sdd /d/try/2
mount: you must specify the filesystem type
# mount -t vfat /dev/sdd /media/sdcard
mount: wrong fs type, bad option, bad superblock on /dev/sdd,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

fdisk

fdisk -l /dev/sdd

Disk /dev/sdd: 31.9 GB, 31914983424 bytes
255 heads, 63 sectors/track, 3880 cylinders, total 62333952 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
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1            8192    62333951    31162880    c  W95 FAT32 (LBA)

# ls /dev/sdd*
/dev/sdd

所以没有列出 /dev/sddX 设备,尽管fdisk说它们存在! gparted显示 /dev/sdd1 分区没有问题(但之前有 4MB 的可用空间)。所以我怀疑这里发生了一些不同的事情。是否可能是这个可用空间导致了问题?为什么会这样?调整分区大小以用完那 4mb(这到底是怎么发生的?)是否可以解决所有这些问题?这是否会导致数据现在无法从相机中读取?或者更糟糕的是,无法挽回地损坏?我很确定我以前能够从 Linux 内部访问这张卡,因为我想我什至移动了一些文件(它有来自其他相机的一些照片)。所以奇怪的是我现在无法访问它。

基本上,我想知道如何解决这个问题(尽可能非破坏性地),以及导致问题的原因(以在将来避免它)。作为参考,我已经包含了dmesg输出。

# dmesg|tail -30
[3783978.490032] usb 1-5: new high-speed USB device number 44 using ehci_hcd
[3783978.608523] usb 1-5: New USB device found, idVendor=05e3, idProduct=0727
[3783978.608528] usb 1-5: New USB device strings: Mfr=3, Product=4, SerialNumber=2
[3783978.608530] usb 1-5: Product: USB Storage
[3783978.608531] usb 1-5: Manufacturer: Generic
[3783978.608533] usb 1-5: SerialNumber: 000000000207
[3783978.609406] scsi29 : usb-storage 1-5:1.0
[3783979.610445] scsi 29:0:0:0: Direct-Access     Generic  STORAGE DEVICE   0207 PQ: 0 ANSI: 0
[3783979.613096] sd 29:0:0:0: Attached scsi generic sg3 type 0
[3783979.773160] sd 29:0:0:0: [sdd] 62333952 512-byte logical blocks: (31.9 GB/29.7 GiB)
[3783979.774295] sd 29:0:0:0: [sdd] Write Protect is off
[3783979.774300] sd 29:0:0:0: [sdd] Mode Sense: 0b 00 00 08
[3783979.775406] sd 29:0:0:0: [sdd] No Caching mode page present
[3783979.775410] sd 29:0:0:0: [sdd] Assuming drive cache: write through
[3783979.779038] sd 29:0:0:0: [sdd] No Caching mode page present
[3783979.779048] sd 29:0:0:0: [sdd] Assuming drive cache: write through
[3783981.471143] sd 29:0:0:0: [sdd] Unhandled sense code
[3783981.471147] sd 29:0:0:0: [sdd]  Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[3783981.471150] sd 29:0:0:0: [sdd]  Sense Key : Medium Error [current] 
[3783981.471153] sd 29:0:0:0: [sdd]  Add. Sense: Data phase CRC error detected
[3783981.471157] sd 29:0:0:0: [sdd] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00
[3783981.471162] end_request: I/O error, dev sdd, sector 0
[3783981.471166] Buffer I/O error on device sdd, logical block 0
[3783981.482542] Dev sdd: unable to read RDB block 0
[3783981.482548]  sdd: unable to read partition table
[3783981.486264] sd 29:0:0:0: [sdd] No Caching mode page present
[3783981.486267] sd 29:0:0:0: [sdd] Assuming drive cache: write through
[3783981.486269] sd 29:0:0:0: [sdd] Attached SCSI removable disk

答案1

一些进展,(如果/当我找到合适的最终解决方案时,我将编辑这个答案)。使用 @INDIVIDUAL-IT 的命令对设备进行完整备份后dd(我认为使用 bs=1M 会使传输速度非常慢)。我无法安装备份文件,但是

# dd if=backup.img of=backup-skip.img bs=1M skip=4

确实创建了一个可安装文件(备份-跳过.img),据我所知,所有文件都在那里,并且可以访问。 (更新:将此剥离的图像写回 SD 卡会导致 Linux 自动检测到并安装它,但在相机中不起作用。)

我再次加载gparted,并尝试删除分区前面的4MB空白空间,但这是不可能的,它不允许我让分区用完所有空间,留下至少1MB无法删除那(尝试了所有选项对齐,但没有骰子)。

出于好奇,我取消了lbasdd1分区的选项。系统没有要求我确认此更改,也没有单击任何位置将更改提交到设备,但我看到适配器上的 LED 闪烁,突然在 konqueror 中出现了我的 SD 卡的条目。我卸载、拔掉 USB 设备,然后将其重新插入,但未自动检测到 SD 卡,我又回到了第一步。gparted设备上现在告诉我lba该设备上未激活。奇怪的。

检测到分区!

由于奇怪的间隔效应,迷雾从我的记忆中消散了一点,所以我跑了:

# partprobe

突然 /dev/sdd1 被创建,并且该设备出现在 konqueror 中!所以,还不是最终的解决方案(因为你每次都必须以 root 身份运行partprobe),但至少我可以访问我的文件。希望在我找到永久解决方案时对那里的人有所帮助。

答案2

对我来说,你的分区表似乎有点混乱。

  1. 使用 dd: 对卡进行完整备份dd if=/dev/sdd of=backup.img bs=1M。如果 dd 无法复制 SD 卡,则很可能是硬件损坏。你仍然可以试试你的运气解救
  2. 使用测试盘尝试恢复分区表。对 backup.img 文件进行恢复,甚至对备份文件进行备份。只是为了确保你不会让事情变得更糟。
  3. 摆脱第一个 4MB 使用dd if=backup.img of=backup_striped bs=1M skip=4
  4. 如果恢复为您提供了一个包含所有文件的可安装文件,并且 fsck 在测试时没有给您任何错误,您可以将该恢复的文件写回 SD 卡。dd if=backup_striped of=/dev/sdd bs=1M 确保您正在写入正确的驱动器
  5. 如果分区恢复失败可以使用TestDisk来一一恢复文件最重要或手术刀

您可以使用 TestDisk 来

答案3

根据日志,当内核在检测到卡后立即尝试读取分区表时,会从硬件中收到错误。然而,当您partprobe稍后调用时,内核能够很好地读取分区表。看起来可能是硬件错误或驱动程序错误导致初始读取失败。可能是 SD 卡或读卡器固件需要一些时间来完成初始化,并且驱动程序尝试过早读取。解决方案(无需更改硬件)是在驱动程序中引入延迟。

作为解决方法,您可以添加 udev 规则与您的设备匹配并运行脚本

#!/bin/sh
sleep 1
partprobe "$DEVNAME"

相关内容