从 Grub 启动 Knoppix ISO - 设备/uri 疯狂

J V*_*J V 5 boot grub2

我正在尝试从 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
Run Code Online (Sandbox Code Playgroud)

我的问题是bootfrom参数。如果我不包括双斜线系统将永远不会启动。它会抱怨KNOPPIX在驱动器上找不到文件夹(因为它在 ISO 内)。

它将搜索驱动器以尝试找到此文件夹 - 最终出现在/dev/from sda1to 中的驱动器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
Run Code Online (Sandbox Code Playgroud)

很难说发生了什么,因为 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} "
Run Code Online (Sandbox Code Playgroud)

真的吗?谁让错误消息使用与条件明确分开的变量?

好吧,至少我知道问题的确切行(591),但我从中看出的唯一方法是尝试弄乱这个 bash 并对其进行硬编码以让我通过......或者设置我的分区对 sda 有问题。当然,我也不知道该怎么做。好极了!所以。我该如何进行编辑init

J V*_*J V 2

原来 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"
Run Code Online (Sandbox Code Playgroud)

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