从 Grub 引导 Knoppix ISO - 设备/uri 疯狂

从 Grub 引导 Knoppix ISO - 设备/uri 疯狂

我正在尝试从 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"

所讨论的分区的大小相当独特,所以我怀疑很快就会发生碰撞。

相关内容