Créer une image Debian amorçable avec debootstrap


13

J'ai essayé de créer une image debian amorçable (jessie / 8.4) au cours des 2 derniers jours, et pour autant que je sache, j'ai la bonne procédure, mais je ne peux pas obtenir le bon système de fichiers. Je suis relativement sûr de faire quelque chose de mal ici, de manquer quelque chose avec le montage ou /etc/fstab( il n'y en a pas à mon image ). J'espérais que quelqu'un avec une certaine expérience pourrait m'aider / me montrer ce qui me manque.

Voici les erreurs que je vois lorsque je démarre dans qemu-system-x86:

En tant que texte, puis en tant que captures d'écran réelles:

Les erreurs:

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.

entrez la description de l'image ici entrez la description de l'image ici

Voici les instructions que j'ai rédigées pour moi-même / les étapes que j'ai suivies:

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

source d'informations sur l'utilisation de --components

  • Assurez-vous que le noyau est installé, il devrait apparaître /boot dans le chroot, c'est-à-dire /mnt/boot avec les fichiers suivants:

    • 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
  • installer grub

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

    • copier sur les sources apt

      cp /etc/apt/sources.list /mnt/etc/apt/sources.list
      
    • assurez-vous que la source du cdrom est mise en commentaire

    • ajoutez la ligne:

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

Configurer un 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 remontez un sous-arbre ailleurs (son contenu est disponible aux deux endroits).
-t <type>Le montage du type de système de fichiers , avec cela, mounttentera de déterminer automatiquement

configurer l'accès série / console

modifier /etc/default/grub:

  1. Réglez GRUB_CMDLINE_LINUX=""sur:

    GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
    
  2. Décommenter GRUB_TERMINAL=console

  3. Ci-dessous, ajoutez la ligne:

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

Faire la config grub - Cela DOIT être fait dans un non- systemd-nspawnshell (cela signifie chroot )

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

Quitter chroot

exit

Nettoyer pour chroot'ed

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

Peut rechercher des supports supplémentaires avec: mount | grep /mnt puis les démonter avec umount

Entrez systemd-nspawn

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

Définissez le mot de passe pour rootavecpasswd

En /etc/ssh/sshd_configcommentaire PermitRootLogin without-passwordpour lire #PermitRootLogin without-passwordet insérer en PermitRootLogin yesdessous

Activez maintenant ssh au démarrage

systemctl enable ssh

nettoyer

# 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

Vérifiez les montages supplémentaires avec: mount | grep /mnt Si TOUT est retourné, démontez-les avec umount

Récupérer (uniquement nécessaire dans ERREUR)

Si vous avez cassé quelque chose ou si vous devez réessayer, RE-MOUNT / SETUP CHROOT sur l'existant .img :

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

test img

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

Maintenant supprimé probablement le commentaire-réponse de @ 505e06b2: Votre "guide" a fait des merveilles pour faire une clé USB Minimal Ubuntu 16. Les seules choses que j'ai modifiées étaient le debootstrap et j'ai dû faire fonctionner le réseau manuellement (networkd). Ma ligne de debootstrap était: sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt.
peterh

Réponses:


4

Je ne peux pas commenter, mais votre "guide" a fait des merveilles pour faire une clé USB Minimal Ubuntu 16. Les seules choses que j'ai modifiées étaient le debootstrap et j'ai dû faire fonctionner le réseau manuellement ( networkd).

Ma ligne debootstrap était:

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

1
Si vous pouvez valider ce guide, puis écrivez 4-5 réponses dès que possible, obtenez votre représentant d'environ 50, et vous pourrez ensuite le commenter. Je ne signale pas votre message pour suppression, car il en vaut trop la peine, mais je devrais, car ce n'est vraiment pas une réponse. Ainsi, d'autres le feront probablement. Mais vous pouvez obtenir ces 50 répétitions très bientôt. Répondez à 3-4 questions triviales et demain vous aurez ...
Peter - Rétablissez Monica le

Nous avons beaucoup de Linuxers débutants ici, les aider est un moyen facile de booster les reps de type fusée. Les autres sites SE ne sont pas si faciles.
peterh

4

Je l'ai gardé et compris, relativement simple à partir d'ici, mais pas seulement une question d'installation /etc/fstab, voici le reste:

pas nécessaire mais une bonne idée pour nettoyer les choses

apt-get autoclean

configurer /etc/fstab- vérifiez avec mountpour vous assurer que vous êtes sur le bon type de système de fichiers

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

cela reconstruira les initramfs et lui permettra de démarrer propre

update-initramfs -u -k all

Faites cela et la machine démarre correctement, testée dans QEMU, puis je l'exécute en ce moment sur le matériel.


4

Configuration automatisée de Debian 9 sans aucune erreur systemd

Cette configuration n'a pas d'erreurs ou d'avertissements systemd, et je reçois la connexion Internet et un shell à la fin.

Cette configuration n'est tout simplement pas parfaite car je n'utilise pas le noyau Debian, erreurs lorsque j'ai essayé d'expliquer dans une section ultérieure. J'ai alors juste essayé un noyau que je traînais , avec une configuration basée sur Buildroot et cela a fonctionné. La configuration est fournie dans cette configuration. Par conséquent, il est possible que certains packages qui reposent sur des configurations de noyau manquantes échouent, même si je n'ai jusqu'à présent observé aucune erreur.

Une configuration analogue fonctionnait parfaitement avec le noyau Ubuntu cependant: /ubuntu/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171 Le noyau Ubuntu doit avoir les configurations manquantes par rapport à Debian. Les échecs du noyau Debian peuvent probablement être corrigés en compilant le noyau Debian avec des options supplémentaires comme CONFIG_VIRTIO_BLK=yje l'ai fait pour 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 en amont .

À partir du terminal, connectez-vous avec root/ root, puis vérifiez que Internet fonctionne avec les commandes suivantes:

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

Nous l'avons utilisé nccomme expliqué sur /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 car:

Testé sur un hôte Ubuntu 18.04.

Que se passe-t-il si j'essaie d'utiliser le noyau Debian

TODO comprendre et réparer. Si je remplace la compilation du noyau Linux ci-dessus par le noyau Linux empaqueté Debian:

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

puis le démarrage échoue avec:

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

et une liste vide pour:

List of all partitions:

donc le disque n'est pas du tout reconnu. J'ai également essayé d'utiliser exactement le même noyau que le programme d'installation Debian ISO installe comme fait ici mais pour Debian , et il échoue de la même manière, même si l'installation Debian ISO a bien fonctionné avec les mêmes options QEMU (il génère l'installation GRUB sur un disque à plusieurs partitions, la racine étant ext4).


Si quelqu'un le fait sur une nouvelle installation d'Ubuntu, vous devez également l'installer build-essentialsavant d'exécuter le script. Vous manquer git, make, bisonet flex être également conscient qu'il ya un lien ici pour config OP github, vous pouvez le lire à travers avant de l' exécuter aveuglément pour vous assurer qu'il n'a pas changé.
GPPK
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.