破損したUSBフラッシュドライブにライブ画像を焼くことはできますか?

破損したUSBフラッシュドライブにライブ画像を焼くことはできますか?

不良ブロックを備えた16Gフラッシュドライブがあります。

# f3read /media/morfik/224e0447-1b26-4c3e-a691-5bf1db650d21
                  SECTORS      ok/corrupted/changed/overwritten
Validating file 1.h2w ... 2097112/       40/      0/      0
Validating file 2.h2w ... 2097120/       32/      0/      0
Validating file 3.h2w ... 2097098/       54/      0/      0
Validating file 4.h2w ... 2097148/        4/      0/      0
Validating file 5.h2w ... 2097114/       38/      0/      0
Validating file 6.h2w ... 2097152/        0/      0/      0
Validating file 7.h2w ... 2097152/        0/      0/      0
Validating file 8.h2w ... 2097152/        0/      0/      0
Validating file 9.h2w ... 2097152/        0/      0/      0
Validating file 10.h2w ... 2097152/        0/      0/      0
Validating file 11.h2w ... 2097152/        0/      0/      0
Validating file 12.h2w ... 2097152/        0/      0/      0
Validating file 13.h2w ... 2097152/        0/      0/      0
Validating file 14.h2w ... 2097152/        0/      0/      0
Validating file 15.h2w ...   90664/        0/      0/      0

  Data OK: 14.05 GB (29450624 sectors)
Data LOST: 84.00 KB (168 sectors)
             Corrupted: 84.00 KB (168 sectors)
      Slightly changed: 0.00 Byte (0 sectors)
           Overwritten: 0.00 Byte (0 sectors)
Average reading speed: 18.77 MB/s

ご覧のとおり、最初の5つのショーにのみ破損したセクターがあります。残りは大丈夫です。問題は、このペンドライブにライブ画像を書き込もうとすると、50MiBが送信された後にジョブが停止することです。

最初から5Gをスキップし、破損したスペースの後ろにミラーを入れて正常に起動する方法はありますか?

答え1

ドライブの先頭にGRUB(または他のブートローダ)をインストールするのに十分なスペースがあり、LiveCDがループマウントISOをサポートしている場合は、不良ブロックがマップされたファイルシステムを作成するか、パーティションを分割して問題を回避できます。まず、不良ブロックが発生します。

grub.cfgUbuntu Live CDの起動エントリの例:

menuentry "Ubuntu 15.04 Desktop amd64" {
    set isofile="ubuntu-15.04-desktop-amd64.iso"
    loopback loop (hd0,msdos3)/$isofile
    linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/$isofile noprompt noeject
    initrd (loop)/casper/initrd.lz
}

そのため、GRUB2は奇妙なので、ISOファイルから直接カーネルとinitramfsを抽出することもあります。ただし、ISOに加えて直接ループマウントしてカーネルファイルとinitramfsファイルを独立してコピーすると、この機能は完全に重複します。したがって、システムには/bootカーネル、initramfs、およびisoファイルという3つのファイルがあります。

これにより、必要なブートローダを使用できるため、他のブートローダでは次のようになります。

linux vmlinuz.efi boot=casper iso-scan/filename=ubuntu-15.04-desktop-amd64.iso noprompt noeject
initrd initrd.lz

ループのインストールとisoファイルの検索はLive CDのinitramfs自体で処理されるため、パラメータはCDスタイルによって異なります。

通常、この技術は単一のUSBメモリースティックに多数のLive CDを挿入するために使用されます。また、不良ブロック領域を防ぐために発生します(正しく分割/フォーマットされている場合)。

答え2

私はこの問題をうまく解決しましたが、より良いシンプルな解決策があるかどうか疑問に思っています。

とにかく、デバイスに最初に不良ブロックがあり、ライブイメージを書き込むことができない場合は、2つのパーティションを作成する必要があります。

ここに画像の説明を入力してください。

その後、イメージをダウンロードし、最初のパーティションのオフセットを確認します。

# parted  /home/morfik/Desktop/debian-live-8.1.0-amd64-mate-desktop.iso
(parted) unit s

(parted) print
Model:  (file)
Disk /home/morfik/Desktop/debian-live-8.1.0-amd64-mate-desktop.iso: 2015232s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start  End       Size      Type     File system  Flags
 1      64s    2015231s  2015168s  primary               boot, hidden

つまり、64セクタ、つまり64 * 512 = 32768バイトを意味します。これで画像をマウントできます。

# mount -o loop,offset=32768 /home/morfik/Desktop/debian-live-8.1.0-amd64-mate-desktop.iso /mnt
 mount: /dev/loop0 is write-protected, mounting read-only

# ls -al /mnt
total 593K
dr-xr-xr-x  1 root root 2.0K 2015-06-06 16:09:57 ./
drwxr-xr-x 24 root root 4.0K 2015-06-08 20:54:43 ../
dr-xr-xr-x  1 root root 2.0K 2015-06-06 16:08:34 .disk/
dr-xr-xr-x  1 root root 2.0K 2015-06-06 15:59:10 dists/
dr-xr-xr-x  1 root root 2.0K 2015-06-06 16:09:41 install/
dr-xr-xr-x  1 root root 2.0K 2015-06-06 16:08:29 isolinux/
dr-xr-xr-x  1 root root 2.0K 2015-06-06 16:08:29 live/
dr-xr-xr-x  1 root root 2.0K 2015-06-06 15:59:00 pool/
dr-xr-xr-x  1 root root 2.0K 2015-06-06 16:09:37 tools/
-r--r--r--  1 root root  133 2015-06-06 16:09:44 autorun.inf
lr-xr-xr-x  1 root root    1 2015-06-06 15:59:10 debian -> ./
-r--r--r--  1 root root 177K 2015-06-06 16:09:44 g2ldr
-r--r--r--  1 root root 8.0K 2015-06-06 16:09:44 g2ldr.mbr
-r--r--r--  1 root root  28K 2015-06-06 16:09:57 md5sum.txt
-r--r--r--  1 root root 360K 2015-06-06 16:09:44 setup.exe
-r--r--r--  1 root root  228 2015-06-06 16:09:44 win32-loader.ini

これらのファイルにアクセスできるので、prendrive の 2 番目のパーティションにコピーできます。

# cp -a /mnt/* /media/morfik/good

次のコマンドは、ブート用に2番目のパーティションをMBRにハードコードします。

printf '\x2' | cat /usr/lib/SYSLINUX/altmbr.bin - | dd bs=440 count=1 iflag=fullblock conv=notrunc of=/dev/sdb

2番目のパーティションではext4ファイルシステムを使用しているため、extlinuxを使用する必要がありますが、イメージにはisolinuxがあります。このフォルダを削除する必要はなく、名前を変更できます。

# mv isolinux extlinux

このフォルダー内の構成ファイルに対して同じことを行う必要があります。

# mv isolinux.cfg extlinux.conf

この手順が必要かどうかはわかりませんが、常にすべてのファイルをコピーします。

# cp /usr/lib/syslinux/modules/bios/* /media/morfik/good/extlinux/

最後に、2番目のパーティションにextlinux用のVBRをインストールすることです。

# extlinux -i /media/morfik/good/extlinux/
/media/morfik/good/extlinux/ is device /dev/sdb2 

ほぼその程度です。画像をテストしましたが起動し、ライブシステムが正常に実行されます。このソリューションは、あらゆる種類のライブ画像で動作します。

関連情報