Usb-Drive

是否可以將實時圖像刻錄到損壞的隨身碟?

  • June 10, 2015

我有一個有一些壞塊的 16G pendrive:

# 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

如您所見,只有前五場演出損壞了扇區。其餘的都很好。問題是當我嘗試將實時圖像刻錄到此筆式驅動器時,傳輸 50MiB 後操作停止。

有沒有辦法從一開始就跳過 5G 並將圖像放在損壞的空間之後,這樣它就可以毫無問題地啟動?

我已經設法解決了這個問題,但我仍然想知道是否有更好更簡單的解決方案。

無論如何,如果您在設備的開頭有壞塊並且您無法刻錄實時映像,您應該製作兩個分區:

在此處輸入圖像描述

然後你下載一個圖像並檢查它的第一個分區的偏移量:

# 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=32768bytes 。現在我們可以掛載這個鏡像了:

# 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 的第二個分區:

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

以下命令會將第二個分區硬編碼到 MBR 中以便從中引導:

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

我在第二個分區上使用 ext4 文件系統,所以我必須使用 extlinux,但映像有 isolinux。我不必刪除此文件夾,我可以更改其名稱:

# mv isolinux extlinux

我必須與該文件夾內的配置文件做同樣的事情:

# mv isolinux.cfg extlinux.conf

我不確定這一步是否必要,但我總是複制所有文件:

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

最後就是在第二個分區上安裝extlinux的VBR:

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

差不多就是這樣。我測試了圖像,它啟動並且實時系統執行良好。該解決方案適用於所有類型的實時圖像。

如果驅動器的開頭有足夠的空間來安裝 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的 .

這樣您就可以使用您選擇的任何引導載入程序,因此在另一個引導載入程序中它可能如下所示:

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

由於循環安裝和 iso 文件搜尋由 Live CD 的 initramfs 本身處理,因此每種類型的 CD 的參數都不同。

通常,這種技術用於將大量 Live CD 放入單個 USB 記憶棒中。它恰好也可以避免壞塊區域(如果分區/格式化正確)。

引用自:https://unix.stackexchange.com/questions/208803