Erstellen eines bootfähigen Debian-Images mit Debootstrap

12

Ich habe in den letzten 2 Tagen versucht, ein bootfähiges Debian-Image (jessie / 8.4) zu erstellen, und soweit ich das beurteilen kann, habe ich die Prozedur richtig ausgeführt, kann aber das Dateisystem nicht richtig einrichten. Ich bin mir ziemlich sicher, dass ich hier etwas falsch mache, etwas mit Montage verpasse oder /etc/fstab( es ist keines in meinem Bild ). Ich hatte gehofft, jemand mit etwas Erfahrung könnte mir helfen, mir zu zeigen, was ich vermisse.

Hier sind die Fehler, die beim Booten von qemu-system-x86 auftreten:

Als Text und dann als eigentliche Screenshots:

Fehler:

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.

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Hier sind die Anweisungen, die ich für mich selbst geschrieben habe / Schritte, die ich unternommen habe:

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

Quelle für Informationen zur Verwendung von --components

  • Stellen Sie sicher, dass der Kernel installiert ist und in /boot der Chroot mit den folgenden Dateien angezeigt wird /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
  • installiere grub

    grub-install --boot-directory=/mnt/boot --modules=part_msdos /dev/loop0
    
  • Richten Sie APT ein

    • Kopieren Sie die entsprechenden Quellen

      cp /etc/apt/sources.list /mnt/etc/apt/sources.list
      
    • Stellen Sie sicher, dass die CD-ROM-Quelle auskommentiert ist

    • füge die Zeile hinzu:

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

Richten Sie eine Chroot ein

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 Hängen Sie einen Teilbaum an einer anderen Stelle wieder ein (sein Inhalt ist an beiden Stellen verfügbar).
-t <type>Montieren von Dateisystem - Typ , mit dieser, mountwird versuchen, automatisch festzustellen ,

Einrichten des seriellen / Konsolenzugriffs

bearbeiten /etc/default/grub:

  1. Setze GRUB_CMDLINE_LINUX=""auf:

    GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
    
  2. Kommentar entfernen GRUB_TERMINAL=console

  3. Fügen Sie unten die Zeile hinzu:

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

Make the grub config - Das MUSS in einer Non- systemd-nspawnShell gemacht werden (das heißt chroot )

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

Chroot verlassen

exit

Aufräumen für chroot'ed

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

Kann nach zusätzlichen Reitern suchen mit: mount | grep /mnt und sie dann mit aushängen umount

Geben Sie systemd-nspawn ein

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

Stellen Sie das Passwort für rootmit einpasswd

In /etc/ssh/sshd_configKommentar PermitRootLogin without-passwordauslesen #PermitRootLogin without-passwordund PermitRootLogin yesdarunter einfügen

Aktivieren Sie nun ssh beim Start

systemctl enable ssh

Aufräumen

# 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

Prüfen Sie, mount | grep /mnt ob weitere Halterungen vorhanden sind, mit: Wenn ALLES zurückgegeben wird, heben Sie die Halterung mit auf umount

Wiederherstellen (nur in ERROR erforderlich)

Wenn Sie etwas kaputt gemacht haben oder es erneut versuchen müssen, führen Sie einen RE-MOUNT / SETUP CHROOT für Folgendes aus .img :

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

Testen img

qemu-system-x86_64 -hda 1445.img -m 1024 -vnc :0
ehiller
quelle
Wahrscheinlich gelöschter Antwortkommentar von @ 505e06b2: Ihr "Leitfaden" hat Wunder gewirkt, als er ein Minimal Ubuntu 16-Thumbdrive erstellt hat. Die einzigen Dinge, die ich geändert habe, waren das Debootstrap und ich musste das Netzwerk manuell zum Laufen bringen (networkd). Meine Debootstrap Linie war: sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt.
peterh - Wiedereinsetzung von Monica

Antworten:

4

Kann nicht kommentieren, aber Ihr "Guide" hat Wunder gewirkt, um ein Minimal Ubuntu 16-Laufwerk zu erstellen. Die einzigen Dinge, die ich geändert habe, waren das Debootstrap und ich musste das Netzwerk manuell zum Laufen bringen ( networkd).

Meine Debootstrap-Linie war:

#> sudo debootstrap --components=main,contrib,nonfree  --variant=minbase \
                    --include=linux-generic,grub-pc --arch=i386 xenial /mnt
505e06b2
quelle
1
Wenn Sie diesen Leitfaden validieren können, schreiben Sie so schnell wie möglich 4-5 Antworten, erhalten Sie ungefähr 50 Wiederholungen und können ihn dann kommentieren. Ich melde deinen Beitrag nicht zum Löschen an, weil er zu würdig ist, aber ich sollte, weil er wirklich keine Antwort ist. So werden andere wahrscheinlich tun. Aber Sie können diese 50 Wiederholungen sehr bald bekommen. Beantworte 3-4 triviale Fragen und morgen hast du ...
peterh - Reinstate Monica
Wir haben viele Linux-Anfänger hier, die ihnen helfen, um einen raketenartigen Rep-Boost zu erzielen. Andere SE-Sites sind nicht so einfach.
peterh - Wiedereinsetzung von Monica
4

Ich habe mich daran gehalten und es herausgefunden, relativ direkt von hier aus, aber nicht nur eine Frage des Aufbaus /etc/fstab, hier ist der Rest:

Nicht nötig, aber eine gute Idee, um aufzuräumen

apt-get autoclean

Einrichten /etc/fstab- Überprüfen Sie mit mount, ob Sie den richtigen Dateisystemtyp haben

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

Dadurch wird das initramfs neu erstellt und es kann sauber gebootet werden

update-initramfs -u -k all

Tun Sie das und die Maschine bootet sauber, getestet in QEMU und dann starte ich es gerade auf Hardware.

ehiller
quelle
3

Automatisiertes Debian 9-Setup ohne Systemfehler

Dieses Setup enthält keine Systemfehler oder Warnungen, und ich erhalte am Ende die Internetverbindung und eine Shell.

Dieses Setup ist einfach nicht perfekt, da ich nicht den Debian-Kernel verwende, Fehler, die ich in einem späteren Abschnitt erklärt habe. Ich habe dann einfach einen Kernel ausprobiert, der auf Buildroot basiert und funktioniert. Die Konfiguration wird in diesem Setup bereitgestellt. Daher ist es möglich, dass einige Pakete, die auf fehlenden Kernel-Konfigurationen basieren, fehlschlagen, obwohl ich bisher keine Fehler festgestellt habe.

Ein analoges Setup funktionierte jedoch perfekt mit dem Ubuntu-Kernel: /ubuntu/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171 Der Ubuntu-Kernel muss die fehlenden Configs haben im Vergleich zu Debian. Die Fehler im Debian-Kernel können wahrscheinlich behoben werden, indem der Debian-Kernel mit zusätzlichen Optionen kompiliert wird, wie CONFIG_VIRTIO_BLK=yich es für Ubuntu getan habe.

#!/usr/bin/env bash

set -eux

debootstrap_dir=debootstrap
root_filesystem=img.ext2.qcow2

sudo apt-get install \
  debootstrap \
  libguestfs-tools \
  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 Upstream .

Melden Sie sich jetzt am Terminal mit root/ rootan und überprüfen Sie, ob das Internet mit den folgenden Befehlen funktioniert:

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

Wir haben ncwie unter /programming/32341518/how-to-make-an-http-get-request-manual-with-netcat/52662497#52662497 erklärt verwendet , weil:

Getestet auf einem Ubuntu 18.04 Host.

Was passiert, wenn ich versuche, den Debian-Kernel zu verwenden?

TODO verstehen und beheben. Wenn ich die obige Linux-Kernel-Kompilierung durch den Debian-Linux-Kernel ersetze:

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

dann schlägt der Start fehl mit:

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

und eine leere Liste für:

List of all partitions:

Die Festplatte wird also überhaupt nicht erkannt. Ich habe auch versucht, genau den gleichen Kernel zu verwenden, den das Debian-ISO-Installationsprogramm installiert, wie hier, aber für Debian , und es schlägt auf die gleiche Weise fehl, obwohl die Debian-ISO-Installation mit den gleichen QEMU-Optionen einwandfrei funktionierte (es generiert eine GRUB-Installation) auf einer Festplatte mit mehreren Partitionen (die Root-Partition ist ext4).

Ciro Santilli ist ein Schauspieler
quelle