使用debootstrap创建可启动的Debian映像


13

在过去的两天里,我一直在尝试创建可引导的debian(jessie / 8.4)映像,据我所知,我拥有正确的过程,但无法获得正确的文件系统。我相对确定我在这里做错了什么,因为安装或丢失了一些/etc/fstab((我的图像中没有)。我希望有经验的人能够帮助我/向我展示我所缺少的东西。

这是我启动qemu-system-x86时看到的错误:

作为文本,然后作为实际的屏幕截图:

错误:

fsck: error 2 (No such file or directory) while executing fsck.ext2 for /dev/sda1
fsck exited with status code 8
[FAILED] Failed to start Load/Save Random Seed
See `systemctl status systemd-random-seed.service` for details.
[FAILED] Failed to start Various fixups to make systemd work better on Debian.
See `systemctl status debian-fixup.service` for details.
...
[FAILED] Failed to start Update UTMP about System Boot/Shutdown.
See `systemctl status systemd-update-utmp.service` for details.
[DEPEND] Dependency failed for Update UTMP about System Runlevel Changes.

在此处输入图片说明 在此处输入图片说明

以下是我为自己写的说明/已采取的步骤:

cd ~
mkdir debootstrap
cd debootstrap/
# get newest
wget http://ftp.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.80_all.deb
ar -x debootstrap_1.0.80_all.deb
zcat /root/debootstrap/data.tar.gz | tar xv

apt-get install parted


# 1.5Gbytes
dd if=/dev/zero of=1445.img bs=1024 count=1 seek=1536k

parted -s 1445.img -- mklabel msdos mkpart primary 1m 1.5g toggle 1 boot
losetup --show -f 1445.img
# prints out `/dev/loopX`, enter this on the next lin
partprobe /dev/loop0
# only have to make the filesytem once --> if you are troubleshooting steps, do not redo this line
mkfs -t ext2 /dev/loop0p1
mount /dev/loop0p1 /mnt

debootstrap --verbose --components=main,contrib,non-free \
--include=firmware-realtek,linux-image-amd64,grub-pc,ssh,vim \
--exclude=nano \
--arch amd64 jessie /mnt http://ftp.us.debian.org/debian

有关使用--components的信息的来源

  • 确保已安装内核,该内核应 与以下文件一起显示在/boot chroot中 /mnt/boot

    • initrd.img-3.16.0-4-amd64
    • vmlinuz-3.16.0-4-amd64
    • config-3.16.0-4-amd64
    • System.map-3.16.0-4-amd64
  • 安装grub

    grub-install --boot-directory=/mnt/boot --modules=part_msdos /dev/loop0
    
  • 设置APT

    • 复制适当的来源

      cp /etc/apt/sources.list /mnt/etc/apt/sources.list
      
    • 确保将cdrom源注释掉

    • 添加行:

      deb http://ftp.debian.org/debian stable-backports main contrib non-free
      

设置一个chroot

mount --bind /dev/pts /mnt/dev/pts
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /dev /mnt/dev

# if you want your pushprofilesettings
cp ~/.bashrc /mnt/root/
cp ~/.vimrc /mnt/root/

# chroot -- enter the system as if it were thy own
chroot /mnt /bin/bash
export HOME=/root
export LC_ALL=C
export LANG=C.UTF-8
export TERM=xterm-256color

mount from man mount
--bind 在其他地方重新安装子树(其内容在两个地方都可用)。
-t <type>挂载文件系统类型mount将尝试自动确定

设置串行/控制台访问

编辑/etc/default/grub

  1. 设置GRUB_CMDLINE_LINUX=""为:

    GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
    
  2. 取消评论 GRUB_TERMINAL=console

  3. 在下面,添加以下行:

    GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
    

使grub配置- 必须 在非做systemd-nspawn外壳(这意味着 chroot

grub-mkconfig -o /boot/grub/grub.cfg

退出chroot

exit

清理chroot的

umount /mnt/sys
umount /mnt/dev
umount /mnt/dev/pts
umount /mnt/proc

可以检查额外的坐骑: mount | grep /mnt 然后卸载它们与 umount

输入systemd-nspawn

systemd-nspawn -D /mnt
# not you are in a special container

设置密码rootpasswd

/etc/ssh/sshd_config出评论PermitRootLogin without-password阅读#PermitRootLogin without-password并插入PermitRootLogin yes其下方

现在在启动时启用ssh

systemctl enable ssh

清理

# this is needed to clean up both chroot and systemd-nspawn -D /mnt
# once this is run you can not do systemd-nspawn either so wait until you are entirely done
exit
umount /mnt
losetup -d /dev/loop0

使用以下命令检查是否有其他安装: mount | grep /mnt 如果 返回了ANYTHING ,请使用卸载它们 umount

恢复(仅在ERROR中是必需的)

如果分手的东西,或者需要重试,重新mount /对现有设置chroot的 .img

losetup --show -f 1445.img
# prints out `/dev/loopX`, enter this on the next lin
partprobe /dev/loop0
mount /dev/loop0p1 /mnt

测试img

qemu-system-x86_64 -hda 1445.img -m 1024 -vnc :0

现在可能已删除@ 505e06b2的答案:您的“指南”为制作最小的Ubuntu 16拇指驱动器创造了奇迹。我唯一更改的是debootstrap,我必须手动使网络工作(联网)。我的debootstrap行是:sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt
彼得-恢复莫妮卡

Answers:


4

无法发表评论,但是您的“指南”为制作最小的Ubuntu 16拇指驱动器带来了奇迹。我唯一更改的是debootstrap,我不得不手动使网络正常工作(networkd)。

我的debootstrap行是:

#> sudo debootstrap --components=main,contrib,nonfree  --variant=minbase \
                    --include=linux-generic,grub-pc --arch=i386 xenial /mnt

1
如果您可以验证本指南,请尽快编写4-5个答案,获得大约50个代表,然后您就可以发表评论了。我不会将您的帖子标记为删除,因为它太值得了,但是我应该这么做,因为它实际上不是答案。因此,其他人可能会这样做。但是您很快就会获得那50个代表。回答3-4个琐碎的问题,明天您将有...
彼得-恢复莫妮卡

我们这里有很多初学者Linuxer,帮助他们是像火箭一样的代表提升的简便方法。其他SE网站并不是那么容易。
peterh-恢复莫妮卡

4

保留并解决了这个问题,从这里开始比较直截了当,但不仅仅是建立问题,/etc/fstab剩下的就是:

没必要,但是整理一下是个好主意

apt-get autoclean

设置/etc/fstab-检查mount以确保您使用的文件系统类型正确

echo "/dev/sda1 / ext4 defaults,errors=remount-ro 0 1" > /etc/fstab

这将重建initramfs并使其干净启动

update-initramfs -u -k all

这样做,机器启动干净,在QEMU中测试,然后我现在在硬件上运行它。


4

自动化的Debian 9设置,没有任何systemd错误

此安装程序没有任何systemd错误或警告,最后我获得了Internet连接和外壳。

因为我没有使用Debian内核,所以这种设置并不完美,我尝试在后面的部分中解释的错误。然后,我只是尝试使用基于Buildroot的 config进行配置的内核,它起作用了。此设置中提供了配置。因此,尽管到目前为止我还没有观察到任何错误,但是某些依赖丢失的内核配置的软件包可能会失败。

一个类似的设置可与Ubuntu内核完美配合,但是:https ://askubuntu.com/questions/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171 Ubuntu内核必须具有缺少的配置与Debian相比 Debian内核故障很可能可以通过使用其他选项编译Debian内核来解决,就像CONFIG_VIRTIO_BLK=y我对Ubuntu所做的那样。

#!/usr/bin/env bash

set -eux

debootstrap_dir=debootstrap
root_filesystem=img.ext2.qcow2

sudo apt-get install \
  debootstrap \
  libguestfs-tools \
  git \
  qemu-system-x86 \
;

if [ ! -d "$debootstrap_dir" ]; then
  # Create debootstrap directory.
  # - linux-image-amd64: downloads the kernel image
  sudo debootstrap \
    --include linux-image-amd64 \
    stretch \
    "$debootstrap_dir" \
    http://deb.debian.org/debian/ \
  ;
  sudo rm -f "$root_filesystem"
fi

if [ ! -f "$root_filesystem" ]; then
  # Set root password.
  echo 'root:root' | sudo chroot "$debootstrap_dir" chpasswd

  # Remount root filesystem as rw.
  # Otherwise, systemd shows:
  #     [FAILED] Failed to start Create Volatile Files and Directories.
  # and then this leads to further failures in the network setup.
  cat << EOF | sudo tee "${debootstrap_dir}/etc/fstab"
/dev/sda / ext4 errors=remount-ro,acl 0 1
EOF

  # Network.
  # We use enp0s3 because the kernel boot prints:
  #     8139cp 0000:00:03.0 enp0s3: renamed from eth0
  # This can also be observed with:
  #     ip link show
  # Without this, systemd shows many network errors, the first of which is:
  #     [FAILED] Failed to start Network Time Synchronization.
  cat << EOF | sudo tee "${debootstrap_dir}/etc/network/interfaces.d/00mytest"
auto lo
iface lo inet loopback
auto enp0s3
iface enp0s3 inet dhcp
EOF

  # Generate image file from debootstrap directory.
  # Leave 1Gb extra empty space in the image.
  sudo virt-make-fs \
    --format qcow2 \
    --size +1G \
    --type ext2 \
    "$debootstrap_dir" \
    "$root_filesystem" \
  ;
  sudo chmod 666 "$root_filesystem"
fi

# linux_image="$(printf "${debootstrap_dir}/boot/vmlinuz-"*)"

linux_img=linux/arch/x86_64/boot/bzImage
if [ ! -f "$linux_img" ]; then
  # Build the Linux kernel.
  git clone --depth 1 --branch v4.18 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
  cd linux
  wget https://gist.githubusercontent.com/cirosantilli/6e2f4975c1929162a86be09f839874ca/raw/6d151d231a233408a6e1b541bf4a92fd55bf5338/.config
  make olddefconfig
  make -j`nproc`
  cd -
fi

qemu-system-x86_64 \
  -append 'console=ttyS0 root=/dev/sda' \
  -drive "file=${root_filesystem},format=qcow2" \
  -enable-kvm \
  -serial mon:stdio \
  -m 2G \
  -kernel "$linux_img" \
  -device rtl8139,netdev=net0 \
  -netdev user,id=net0 \
;

GitHub上游

现在从终端上,使用root/ 登录root,然后检查Internet是否可以使用以下命令:

printf 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n' | nc example.com 80
apt-get update
apt-get install hello
hello

我们nc按照/programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497的说明进行了使用:

在Ubuntu 18.04主机上测试。

如果我尝试使用Debian内核会怎样?

TODO了解并解决。如果我用Debian打包的Linux内核替换了上面的Linux内核编译:

linux_img="${debootstrap_dir}/boot/vmlinuz-"*

然后启动失败并显示:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

和一个空列表,用于:

List of all partitions:

因此根本无法识别该磁盘。我还尝试过使用与Debian ISO安装程序安装时完全相同的内核,但对于Debian而言,它以相同的方式失败,即使Debian ISO安装在相同的QEMU选项下也可以正常工作(它生成GRUB安装)在具有多个分区的磁盘中,根目录为ext4


如果有人在全新的Ubuntu安装上执行此操作,则还需要build-essentials在运行脚本之前进行安装。你会被丢失gitmakebisonflex 另外要注意有在这里OP github上配置一个链接,你可能想通过运行它一味以确保它没有改变之前,阅读它。
GPPK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.