AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 717507
Accepted
Shan-Desai
Shan-Desai
Asked: 2022-09-17 01:03:53 +0800 CST2022-09-17 01:03:53 +0800 CST 2022-09-17 01:03:53 +0800 CST

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

  • 772

描述

作为一个附带项目,我正在尝试使用Hashicorp Packer和Docker从 Docker 容器创建可启动磁盘映像。

Hashicorp Packer通常负责启动 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上面脚本中ubuntu的是ubuntu.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/bootreadlink -f /os/mnt/boot/initrd.img

来源

iximiuz blogpost on docker-to-bootable devices PockerISO

docker boot-loader
  • 1 1 个回答
  • 14 Views

1 个回答

  • Voted
  1. Best Answer
    Shan-Desai
    2022-09-17T04:09:57+08:002022-09-17T04:09:57+08:00

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

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

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

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

    apt-get install -y linux-image-virtual
    

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

    • 0

相关问题

  • 无法从私有注册表中提取 kubernetes 中的图像

  • 连接到 docker 主机!

  • Dockerfile 中 VOLUME 指令的目的是什么?

  • 如何在 RHEL 7 上离线安装 docker?

  • 我只需要运行这个脚本文件一次吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve