接続前にデバイス USB に dd を適用すると /dev/sdX が破損し、動作しなくなります

接続前にデバイス USB に dd を適用すると /dev/sdX が破損し、動作しなくなります

私はUSBに約5MBのISOと小さなOS、そして独自のgrubを保存しています。デバイスを接続して確認するとsudo fdisk -l次のような結果になります:

...
Device     Boot Start   End Sectors  Size Id Type
/dev/sdb1  *        1  9551    9551  4.7M cd unknown

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

完璧に動作します。他の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

現在、/dev/sdb レジスタが破損しており、コピー速度 (770 MB/秒) は意味をなさず、再起動するまで dd を再度使用することはできません。

ddrescueで修復しようとしましたが、うまくいきませんでした

sudo ddrescue /dev/zero /dev/sdb conv=noerror,sync

私の質問は、正確に何が起こっているのか、そして可能であれば、再起動を回避して dd が再び動作し始めるように /dev/sdb を修復するにはどうすればよいのかということです。

ありがとう。

答え1

デバイスノードは/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 6月15日 08:54 /dev/sda
brw-rw---- 1 ルートディスク 8、16 6月 15 14:14 /dev/sdb
-rw-r--r-- 1 ルート ルート 724M 6月15日 15:06 /dev/sdc

つまり、実際には「破損」しているものはなく、「修復」や ddrescue を実行する意味もありません。 という名前の巨大なファイルがあるだけで/dev/sdb、このファイルが存在するため、カーネルはそこに実際のデバイス ノードを作成できません。

(書き込み速度は完全に理にかなっています。RAM/devに保存されるので、キャッシュされた RAM から /dev が存在する RAM にイメージをコピーしただけです。)

/dev/sdbデバイスを削除して再接続すると、本物デバイス ノードが再表示されます。

関連情報