syslinux 引导加载程序无法找到通过 Docker 容器制作的自定义可启动映像的 initrd.img

syslinux 引导加载程序无法找到通过 Docker 容器制作的自定义可启动映像的 initrd.img

描述

作为一个副项目,我正在尝试使用Hashicorp 包装机随着码头工人从 Docker 容器创建可启动磁盘映像。

Hashicorp 包装机通常负责启动 docker 容器并在其中执行任务,然后创建文件系统 tarball 或使用容器创建映像文件等。

怎么运行的

  1. 我使用ubuntu:focaldocker 容器

  2. 使用这个 docker 容器并在其上安装 Kernel / Systemd:

     apt-get update && apt-get install -y --no-install-recommends linux-image-virtual systemd-sysv
    
  3. 创建容器的 tarball,其中包含步骤 2 中的内核、initrd 和系统

  4. 在主机上解压 tarball,以便在创建映像文件时使用它

  5. 使用特权启动另一个ubuntu容器并将工作目录挂载到其中以创建可启动映像文件。

此时,我依靠下面的 bash 脚本来为我创建一个图像:

set -e
echo "[Install APT dependencies]"
DEBIAN_FRONTEND=noninteractive apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y extlinux fdisk qemu-utils

echo "[Create disk image of 1GB]"
dd if=/dev/zero of=/os/${DISTR}.img bs=$(expr 1024 \* 1024 \* 1024) count=1

blue "[Make partition]"
sfdisk /os/${DISTR}.img < /os/config/partition.txt

echo "\n[Format partition with ext4]"
losetup -D
LOOPDEVICE=$(losetup -f)
echo -e "\n[Using ${LOOPDEVICE} loop device]"
losetup -o $(expr 512 \* 2048) ${LOOPDEVICE} /os/${DISTR}.img
mkfs.ext4 ${LOOPDEVICE}

echo "[Copy ${DISTR} directory structure to partition]"
mkdir -p /os/mnt
mount -t auto ${LOOPDEVICE} /os/mnt/
cp -R /os/${DISTR}.dir/. /os/mnt/


echo "[Setup extlinux]"
extlinux --install /os/mnt/boot/
cp /os/config/syslinux.cfg /os/mnt/boot/syslinux.cfg

echo "[Unmount]"
umount /os/mnt
losetup -D

echo_blue "[Write syslinux MBR]"
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/os/${DISTR}.img bs=440 count=1 conv=notrunc

DISTR上面脚本中的 是,ubuntuubuntu.dir未打包的 tarball 球,它安装到容器中以便能够将其复制到安装的分区。

进步

目前我已经成功地为ubuntu.可以找到创建的存储库这里

但是,在尝试使用以下命令启动映像时qemu-system-x86_64

sudo qemu-system-x86_64 -drive file=ubuntu.img,index=0,media=disk,format=raw 

我收到以下错误: 初始化错误1

引导加载程序的相应内容syslinux.cfg是:

DEFAULT linux
  SAY Now booting the kernel from SYSLINUX...
 LABEL linux
  KERNEL /boot/vmlinuz
  INITRD /boot/initrd.img-5.4.0-125-generic
  APPEND ro root=/dev/sda1

额外的变化

我尝试更新syslinux.cfg

DEFAULT linux
  SAY Now booting the kernel from SYSLINUX...
 LABEL linux
  KERNEL /boot/vmlinuz
  APPEND ro root=/dev/sda1 initrd=/boot/initrd.img

但是我得到了同样的错误,尽管/boot/initrd.img没有找到错误消息。

我目前缺少什么才能使initrd.img引导加载程序可发现。

我尝试cp -dR /os/ubuntu.dir/. /os/mnt在 bash 脚本中使用来确保复制时保留符号链接。

我还确保查看符号链接initrd.img文件是否存在于已安装的分区中/os/mnt/boot,符号链接文件的源也是如此,例如readlink -f /os/mnt/boot/initrd.img

来源

关于 docker-to-bootable devices 的 iximiuz 博客文章 波克ISO

答案1

我找到了问题的解决方案。事实上,虽然我是通过安装linux内核

apt-get install -y --no-install-recommends linux-image-virtual

它无法生成initrd当我安装完整的推荐软件包时通常会发生的情况。

我能够简单地解决这个问题

apt-get install -y linux-image-virtual

我能够为 Ubuntu 和 Debian 创建可启动映像

相关内容