dd 在连接损坏的 /dev/sdX 之前应用到开发 USB 并且不工作

vgo*_*anz 1 linux usb dd dev

我有一个 USB,我正在用一个带有自己的 grub 的小型操作系统处理 5 Mb 的 ISO。如果我连接设备并检查它sudo fdisk -l我得到:

...
Device     Boot Start   End Sectors  Size Id Type
/dev/sdb1  *        1  9551    9551  4.7M cd unknown
Run Code Online (Sandbox Code Playgroud)

如果我用 dd 复制 ISO sudo dd if=my_os.iso of=/dev/sdb

14852+0 records in
14852+0 records out
7604224 bytes (7.6 MB) copied, 0.538487 s, 14.1 MB/s
Run Code Online (Sandbox Code Playgroud)

它完美地工作。从其他 PC 中的 BIOS 启动。

问题是,有时我在更新 BIOS 后忘记连接 USB,所以我在没有连接 USB 的情况下执行 ff,输出为:

14852+0 records in
14852+0 records out
7604224 bytes (7.6 MB) copied, 0.00987684 s, 770 MB/s
Run Code Online (Sandbox Code Playgroud)

现在,/dev/sdb 寄存器已损坏,复制速度 (770 MB/s) 没有意义,并且在重新启动之前无法再次使用 dd。

我试图用 ddrescue 修复它,但它不起作用

sudo ddrescue /dev/zero /dev/sdb conv=noerror,sync
Run Code Online (Sandbox Code Playgroud)

我的问题是,到底发生了什么,如果可能的话,如何修复 /dev/sdb 以避免重启和 dd 再次开始工作?

谢谢。

use*_*686 6

设备节点/dev/sd*在设备连接后才会出现在 /dev 中,而不是之前。(此外,它们不被称为“寄存器”。)因此,当您运行dd of=/dev/sdb它时,它实际上并没有触及任何设备——相反,由于输出文件不存在,因此dd 创建了一个具有该名称的新文件。

$ sudo dd if=archlinux-2016.04.01-dual.iso of=/dev/sdc
1482752+0 条记录
1482752+0 条记录
已复制 759169024 字节(759 MB,724 MiB),0.941926 秒,806 MB/秒

$ ls -l /dev/sd*
brw-rw---- 1 个根磁盘 8, 0 Jun 15 08:54 /dev/sda
brw-rw---- 1 个根磁盘 8, 16 Jun 15 14:14 /dev/sdb
-rw-r--r-- 1 根 root 724M Jun 15 15:06 /dev/sdc

所以真的没有什么东西可以“损坏”,也没有什么东西可以“修复”或ddrescue。您只有一个名为 的大文件/dev/sdb,而且由于它存在,内核无法在那里创建真正的设备节点。

(写入速度非常合理 -/dev存储在 RAM 中,因此您只需将图像从缓存的 RAM 复制回 /dev 所在的 RAM。)

删除/dev/sdb并重新连接设备,真正的设备节点应该会重新出现。