描述
作为一个附带项目,我正在尝试使用Hashicorp Packer和Docker从 Docker 容器创建可启动磁盘映像。
Hashicorp Packer通常负责启动 docker 容器并在其中执行任务,然后创建文件系统 tarball 或使用容器创建图像文件等。
这个怎么运作
我使用
ubuntu:focal
docker 容器使用这个 docker 容器并在其上安装一个 Kernel / Systemd:
apt-get update && apt-get install -y --no-install-recommends linux-image-virtual systemd-sysv
创建容器的 tarball,其中现在包含步骤 2 中的内核、initrd 和系统
在主机上解压缩 tarball 以便在创建映像文件时使用它
启动另一个
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
上面脚本中ubuntu
的是ubuntu.dir
解压后的 tarball 球,它被安装到容器中,以便能够将其复制到安装的分区。
进步
目前我已经成功地为ubuntu
. 创建的存储库可以在这里找到
但是,在尝试使用以下命令启动映像时qemu-system-x86_64
:
sudo qemu-system-x86_64 -drive file=ubuntu.img,index=0,media=disk,format=raw
引导加载程序的相应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