syslinuxブートローダはDockerコンテナを介して作成されたカスタムブータブルイメージのinitrd.imgを見つけることができません。

syslinuxブートローダはDockerコンテナを介して作成されたカスタムブータブルイメージのinitrd.imgを見つけることができません。

説明する

サイドプロジェクトとして使用しようとしていますHashicorp包装機とともにルーストアバウトDockerコンテナから起動可能なディスクイメージを作成します。

Hashicorp包装機通常、Dockerコンテナを起動し、その中で作業を実行し、ファイルシステムのtarballを作成したり、コンテナを使用して画像ファイルを生成するなどの作業を担当します。

どのように動作しますか?

  1. 私はubuntu:focalドッカーコンテナを使用しています

  2. このdockerコンテナを使用してKernel / Systemdをインストールします。

     apt-get update && apt-get install -y --no-install-recommends linux-image-virtual systemd-sysv
    
  3. ステップ2のカーネル、initrd、およびシステムを含むコンテナのtarballを作成します。

  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上記のスクリプトは、マウントされたパーティションにコピーできるようにコンテナにマウントされた解凍されたtarballubuntuです。ubuntu.dir

進展

現在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

源泉

docker-to-bootable デバイスの iximiuz ブログ投稿 フォークISO

答え1

問題の解決策を見つけました。実際、私はLinuxカーネルをインストールしましたが、

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

initrd完全な推奨パッケージをインストールすると、通常発生する結果は生成されません。

この問題を簡単に解決できました

apt-get install -y linux-image-virtual

UbuntuとDebian用の起動可能なイメージを作成できました。

関連情報