설명하다
사이드 프로젝트로 사용하려고합니다Hashicorp 포장 기계와 함께루스트어바웃Docker 컨테이너에서 부팅 가능한 디스크 이미지를 만듭니다.
Hashicorp 포장 기계일반적으로 도커 컨테이너를 시작하고 그 안에서 작업을 수행한 다음 파일 시스템 tarball을 생성하거나 컨테이너를 사용하여 이미지 파일을 생성하는 등의 작업을 담당합니다.
어떻게 작동하나요?
나는
ubuntu:focal
도커 컨테이너를 사용한다이 docker 컨테이너를 사용하여 Kernel/Systemd를 설치하세요.
apt-get update && apt-get install -y --no-install-recommends linux-image-virtual systemd-sysv
2단계의 커널, initrd 및 시스템을 포함하는 컨테이너의 tarball을 만듭니다.
이미지 파일을 생성할 때 사용할 수 있도록 호스트에서 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
위의 스크립트는 마운트된 파티션에 복사할 수 있도록 컨테이너에 마운트된 압축이 풀린 tarball ubuntu
입니다 .ubuntu.dir
진전
현재 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
원천
답변1
문제에 대한 해결책을 찾았습니다. 사실 저는 리눅스 커널을 설치했지만
apt-get install -y --no-install-recommends linux-image-virtual
initrd
전체 권장 패키지를 설치할 때 일반적으로 발생하는 결과를 생성하지 못합니다 .
이 문제를 간단하게 해결할 수 있었습니다
apt-get install -y linux-image-virtual
Ubuntu 및 Debian용 부팅 가능한 이미지를 만들 수 있었습니다.