我有一个 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
正如您所看到的,只有前五场演出有损坏的扇区。其余的都很好。问题是,当我尝试将实时图像刻录到此随身碟时,该操作在传输 50MiB 后停止。
有没有办法从一开始就跳过5G,将镜像放在损坏的空间后面,这样就可以正常启动了?
答案1
如果驱动器开头有足够的空间来安装 GRUB(或任何其他引导加载程序),并且 LiveCD 支持循环安装 ISO,则可以创建一个映射了坏块的文件系统,或者可以对其进行分区以避免首先是坏块。
grub.cfg
Ubuntu 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 文件。
这样您就可以使用您选择的任何引导加载程序,因此在另一个引导加载程序中它可能如下所示:
linux vmlinuz.efi boot=casper iso-scan/filename=ubuntu-15.04-desktop-amd64.iso noprompt noeject
initrd initrd.lz
每种 CD 风格的参数都不同,因为循环安装和 iso 文件搜索是由 Live CD 的 initramfs 本身处理的。
通常,此技术用于将大量 Live CD 放入单个 USB 记忆棒中。它恰好也可以避免坏块区域(如果分区/格式化正确)。
答案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=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
差不多就是这样了。我测试了该映像,它可以启动并且实时系统运行良好。该解决方案应该适用于所有类型的实时图像。