syslinux 부트로더가 Docker 컨테이너를 통해 생성된 사용자 정의 부팅 가능 이미지의 initrd.img를 찾을 수 없습니다.

syslinux 부트로더가 Docker 컨테이너를 통해 생성된 사용자 정의 부팅 가능 이미지의 initrd.img를 찾을 수 없습니다.

설명하다

사이드 프로젝트로 사용하려고합니다Hashicorp 포장 기계와 함께루스트어바웃Docker 컨테이너에서 부팅 가능한 디스크 이미지를 만듭니다.

Hashicorp 포장 기계일반적으로 도커 컨테이너를 시작하고 그 안에서 작업을 수행한 다음 파일 시스템 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위의 스크립트는 마운트된 파티션에 복사할 수 있도록 컨테이너에 마운트된 압축이 풀린 tarball ubuntu입니다 .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

문제에 대한 해결책을 찾았습니다. 사실 저는 리눅스 커널을 설치했지만

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

initrd전체 권장 패키지를 설치할 때 일반적으로 발생하는 결과를 생성하지 못합니다 .

이 문제를 간단하게 해결할 수 있었습니다

apt-get install -y linux-image-virtual

Ubuntu 및 Debian용 부팅 가능한 이미지를 만들 수 있었습니다.

관련 정보