我需要从 16GB Lexar 闪存驱动器中恢复文件。PCB 似乎没有任何损坏,所以我希望可以恢复。当我将 USB 插入 Windows 计算机时,它会将其识别为驱动器,但提示我插入磁盘。经过几天尝试让这个东西正常工作后,我决定在 Ubuntu 上试一试。
运行lsusb
命令:
Bus 002 Device 003: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 8086:0186 Intel Corp. WiMAX Connection 2400m
Bus 001 Device 003: ID 0bda:5801 Realtek Semiconductor Corp.
Bus 001 Device 007: ID 058f:1234 Alcor Micro Corp. Flash Drive
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
该闪存驱动器被识别为 Alcor Micro Corp。到目前为止一切顺利。但是,当我运行sudo fdisk -l
:
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 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: 0xb43778ae
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 3074047 1536000 27 Hidden NTFS WinRE
/dev/sda2 3074048 921657343 459291648 7 HPFS/NTFS/exFAT
/dev/sda3 954587136 976773119 11092992 17 Hidden HPFS/NTFS
/dev/sda4 921659390 954587135 16463873 5 Extended
/dev/sda5 921659392 954587135 16463872 83 Linux
Partition table entries are not in disk order
驱动器未被识别。最后,我运行tail -f
:
==> /var/log/syslog <==
Mar 24 08:55:10 danny-Satellite-E305 kernel: [ 6791.398762] usb 1-1.2: new high-speed USB device number 9 using ehci-pci
Mar 24 08:55:10 danny-Satellite-E305 kernel: [ 6791.644599] usb 1-1.2: New USB device found, idVendor=058f, idProduct=1234
Mar 24 08:55:10 danny-Satellite-E305 kernel: [ 6791.644610] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Mar 24 08:55:10 danny-Satellite-E305 kernel: [ 6791.644616] usb 1-1.2: Product: Mass Storage Device
Mar 24 08:55:10 danny-Satellite-E305 kernel: [ 6791.644621] usb 1-1.2: Manufacturer: Alcor Micro
Mar 24 08:55:10 danny-Satellite-E305 kernel: [ 6791.645100] usb-storage 1-1.2:1.0: USB Mass Storage device detected
Mar 24 08:55:10 danny-Satellite-E305 kernel: [ 6791.645183] scsi13 : usb-storage 1-1.2:1.0
Mar 24 08:55:11 danny-Satellite-E305 kernel: [ 6792.642812] scsi 13:0:0:0: Direct-Access Generic USB Flash Disk 7.76 PQ: 0 ANSI: 4
Mar 24 08:55:11 danny-Satellite-E305 kernel: [ 6792.643071] sd 13:0:0:0: Attached scsi generic sg2 type 0
Mar 24 08:55:11 danny-Satellite-E305 kernel: [ 6792.647022] sd 13:0:0:0: [sdb] Attached SCSI removable disk
有什么恢复数据的方法吗?提前谢谢!
答案1
使用以下命令制作有问题的设备的图像ddrescue
- 您将需要足够的存储空间来容纳整个驱动器,无论您在其上存储了多少数据(或曾经存储过多少数据),在这种情况下,您似乎需要 16GB 来存储 /dev/sdb 的克隆。
ddrescue 是执行该工作的程序,如果尚未安装,我们需要使用以下命令进行安装sudo apt-get install gddrescue
(注意,g 是 GNU 的缩写)
打开终端CtrlAltT并切换到要存储图像文件的目录,然后发出命令sudo ddrescue -d /dev/sdb sdb.img sdb.logfile
-d 直接访问驱动器(忽略缓存)/dev/sdb 是我们用于输入的设备 sdb.img 是我们用于输出的文件 sdb.logfile 正在跟踪我们的位置以及我们的结果是什么。
如果由于任何原因,该过程在完成之前停止,则日志文件允许我们从上次中断的地方继续进行。
成像将开始,你会看到类似这样的内容:
Rescued 表示成功读取的数据量,errsize 表示无法读取的数据量。随着过程的继续,我们希望看到前者增加,而后者趋近于零。我记得 ddrescue 使用一种称为数据雕刻的过程,其中失败的块被减半并重新尝试。
ddrescue 是一款非常强大的工具,您可以在手动的。 请密切关注第3章!!选择错误的文件或设备进行输出绝对会毁了你的一天。
获得生成的图像后,我们可以对其进行测试和恢复程序,而无需对出现故障或失败的设备施加任何进一步的压力。
最终,ddrescue 将在终端屏幕上输出“Finished”。如果 errsize 很高,并且您觉得可能需要尝试恢复更多数据,则可以重新运行该命令并应用开关来重试失败的块,甚至可以反向读取(在固态设备上可能没有用):sudo ddrescue -d --try-again --retrim --reverse /dev/sdb sdb.img sdb.logfile
或上述手册中您认为可能有用的任何其他开关组合。尝试恢复所有数据后,是时候看看我们有什么了。
发出命令fdisk -l sdb.img
或任何你为映像命名的名称。运气好的话,你会得到类似这样的输出,表明分区表完好无损。
Disk sdb.img: 4013 MB, 4013948928 bytes
1 heads, 24 sectors/track, 326656 cylinders, total 7839744 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: 0x000174fe
Device Boot Start End Blocks Id System
sdb.img1 * 2048 7839743 3918848 b W95 FAT32
注意“开始”数字,这意味着文件系统从扇区 2048 开始。
有了这些信息和一些基本的数学技能或计算器,我们就可以得出需要尝试我们的进程的偏移量。2048 个扇区 X 512 个字节 = 1048576
由于我们因故障而创建了此映像,因此我们将首先尝试修复文件系统
发出命令sudo losetup --offset 1048576 /dev/loop2 sdb.img
在循环设备上设置图像。
然后发出命令sudo fsck /dev/loop2
在我们尽力修复系统之后,我们将创建一个挂载点,sudo mkdir /mnt/loop
并挂载之前设置的循环设备sudo mount /dev/loop2 /mnt/loop
现在希望我们有一些可以复制到另一个驱动器的数据。让我们看看:
ls /mnt/loop
autorun.inf casper-rw ldlinux.sys pool smart-fail.txt
boot dists md5sum.txt preseed syslinux
casper install pics README.diskdefines wubi.exe
看起来我有一些。希望你也有!复制完文件后,我卸载了循环设备sudo umount /dev/loop2
如果这种方法不太成功,我还可以尝试使用命令“sudo testdisk sdb.img(或您为映像文件命名的任何名称)”进行 testdisk。按 Enter 选择映像,然后选择分区类型(如果检测到类型,它会提示您如何继续)。请注意,这通常是闪存驱动器上的英特尔。
您可以选择“分析”来搜索丢失的分区,或者直接进入“高级”以使用文件系统工具选择已知或已恢复的分区。选择分区后,您将看到一个文件列表,其中包含有关如何选择要复制的文件等的说明。这部分相当不言自明,可能在其他地方也有介绍,所以我就此打住,并承诺如果您有任何不清楚的地方,可以给我留言,我会回复您。