我正在尝试从 Grub 启动 Knoppix ISO,如下所示:
loopback loop /boot/iso/knoppix.iso
linux (loop)/boot/isolinux/linux lang=en bootfrom=/mnt-iso//boot/iso/knoppix.iso
initrd (loop)/boot/isolinux/minirt.gz
我的问题是bootfrom
参数。如果我不包含双斜杠,系统将永远不会启动。它会抱怨在驱动器上找不到该KNOPPIX
文件夹(因为它位于 ISO 内部)。
它将搜索驱动器以尝试找到此文件夹 - 到该文件夹的末尾已出现在/dev/
fromsda1
到 中sdz15
。
如果我在参数中包含双斜杠,
bootfrom
它将搜索驱动器几次,然后(大概是在安装之后/mnt-iso
)它会胜利地声明“耶!我在中找到了它/dev/sdd5/boot/iso/knoppix.iso
”
当然,此时sda1
已经sdh15
生成了,/dev/
所以这可以不是什么好事。如果我使用
bootfrom=/dev/sdd5/boot/iso/knoppix.iso
它,它会立即工作,但我不能保证它在所有系统上都是这个设备。我可以使用UUID吗?
我读到在 Fedora 15 中你可以使用root=live:UUID={uuid}:{isofile}
但是这个似乎不再是这样了如果我只有一个斜杠,为什么它的行为会有所不同?
这很令人困惑。
编辑:进步!
通过以下菜单项,我设法让 knoppix 声称可以打开并检查 ISO 文件,但结果却声称它找不到其中的 KNOPPIX 文件夹。
在 iso 映像中找不到 KNOPPIX 目录:
loopback loop /boot/iso/knoppix.iso
linux (loop)/boot/isolinux/linux lang=en bootfrom=UUID=<uuid>/boot/iso/knoppix.iso
initrd (loop)/boot/isolinux/minirt.gz
很难判断发生了什么,因为 TTY 很小并且文本不会换行。
编辑:还有更多进步。在认真浏览了一半的 knoppix 存储库后,grep
我决定看看问题是否出在内核中,因为显然系统的其余部分无论如何都没有被加载。
strings linux | grep "Cannot find"
- 没有结果
那么 initrd.gz 呢? (请注意,我不知道这里有什么,我在某处听说它是一块实际的内存)
哦,那里还有另一个档案...哦,那里有一个文件系统!这个名为 init 的大文件里有什么?...
if [ ! -r "$BOOTSYS/$knoppix_dir/KNOPPIX" ]; then
message "${CRE}${RED}Cannot find $knoppix_dir dir in ISO image ${MAGENTA}${BOOTDEV}${YELLOW}/${BOOTFILE}${NORMAL} "
真的吗?究竟是谁让错误消息使用与条件明显分开的变量?
好吧,至少我知道问题的确切行(591),但我看到的唯一方法是一种极其黑客的尝试,扰乱这个 bash 并对其进行硬编码以让我通过......或者设置我的分区向 sda 提出问题。当然,我也不知道该怎么做。耶!所以。我该如何进行编辑init
?
答案1
原来 knoppix 的 initramfs 中的 init 脚本是意大利面条代码。
特别是它被硬编码为仅真正接受该格式的设备,/dev/sdxy
从而导致较长路径名和 UUID 等问题。
我刚刚创建了一个新的 initrd,删除了整个部分并将我的 UUID 硬编码到其中。当然,这并不那么容易。 knoppix initrd 非常小,它没有诸如 之类的东西blkid
,也没有通过 挂载的能力UUID=
。
我最终用 fdisk 和 grep 找到了设备文件:
message "${CRE}${RED}This minitrt has been hacked by Jonathan Vollebregt due to the horrific state of the knoppix init. You are about to see a very dirty hack.${NORMAL} "
echo "Hardcoded identifier awaits: Using fdisk and partition details to match device"
echo "grepping '/dev/sd.5.+4096.+57935871.+28965888.+83.+Linux'"
BOOTDEV=`fdisk -lu`
BOOTDEV=`echo "$BOOTDEV" | grep -E "^/dev/sd.5.+4096.+57935871.+28965888.+83.+Linux$"`
BOOTDEV=`echo "$BOOTDEV" | grep -o "^/dev/sd.5"`
if [ -z "$BOOTDEV" ]; then
echo "Well shit..."
sleep 1m
fi
echo "Device file: $BOOTDEV"
echo "mkdir -p /mnt-hack"
mkdir -p "/mnt-hack"
echo "mount -t ext4 -o ro $BOOTDEV /mnt-hack"
mount -t ext4 -o ro "$BOOTDEV" "/mnt-hack"
BOOTFILE="/${BOOTFROM#*/}"
echo "Stripping also reveals: /$BOOTFILE"
echo "mount -t iso9660 -o ro /mnt-hack/$BOOTFILE $BOOTSYS"
mount -t iso9660 -o ro "/mnt-hack/$BOOTFILE" "$BOOTSYS"
echo "knoppix_dir=$knoppix_dir"
echo "BOOTSYS=$BOOTSYS"
所讨论的分区的大小相当独特,所以我怀疑很快就会发生碰撞。