Crear una imagen de Debian de arranque con debootstrap

13

He intentado crear una imagen de arranque de Debian (jessie / 8.4) durante los últimos 2 días, y por lo que puedo decir, tengo el procedimiento correcto, pero no puedo obtener el sistema de archivos correcto. Estoy relativamente seguro de que estoy haciendo algo mal aquí, perdiendo algo con el montaje o /etc/fstab( no hay ninguno en mi imagen ). Esperaba que alguien con algo de experiencia pudiera ayudarme / mostrarme lo que me faltaba.

Aquí están los errores que veo cuando inicio en qemu-system-x86:

Como texto y luego como las capturas de pantalla reales:

Errores:

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.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Aquí están las instrucciones que he escrito para mí / los pasos que he tomado:

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

fuente de información sobre el uso de --componentes

  • Asegúrese de que el kernel esté instalado, debe aparecer /boot dentro del chroot, es decir, /mnt/boot con los siguientes archivos:

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

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

    • copiar sobre las fuentes aptas

      cp /etc/apt/sources.list /mnt/etc/apt/sources.list
      
    • asegúrese de que la fuente de cdrom esté comentada

    • agrega la línea:

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

Configurar 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 desde man mount :
--bind Vuelva a montar un subárbol en otro lugar (su contenido está disponible en ambos lugares).
-t <type>El montaje del tipo de sistema de archivos , con esto, mountintentará determinar automáticamente

configurar el acceso en serie / consola

editar /etc/default/grub:

  1. Establecer GRUB_CMDLINE_LINUX=""en:

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

  3. Debajo, agregue la línea:

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

Hacer la configuración de grub: esto DEBE hacerse en un sistema que no sea systemd-nspawnshell (eso significa chroot )

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

Salir chroot

exit

Limpiar para chroot'ed

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

Puede buscar montajes adicionales con: mount | grep /mnt y luego desmontarlos con umount

Ingrese systemd-nspawn

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

Establezca la contraseña para rootconpasswd

En /etc/ssh/sshd_configcomentario PermitRootLogin without-passwordpara leer #PermitRootLogin without-passworde insertar PermitRootLogin yesdebajo de él

Ahora habilite ssh al inicio

systemctl enable ssh

limpiar

# 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

Compruebe si hay montajes adicionales con: mount | grep /mnt Si se devuelve CUALQUIER COSA , desmóntelos con umount

Recuperar (solo necesario en ERROR)

Si rompió algo, o necesita volver a intentarlo, VUELVA A MONTAR / CONFIGURAR CHROOT en los existentes .img :

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

prueba de img

qemu-system-x86_64 -hda 1445.img -m 1024 -vnc :0
ehiller
fuente
Ahora probablemente eliminé el comentario de respuesta de @ 505e06b2: Su "guía" funcionó de maravilla para hacer una memoria USB mínima de Ubuntu 16. Lo único que cambié fue el debootstrap y tuve que hacer que la red funcionara manualmente (networkd). Mi línea debootstrap fue: sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt.
peterh - Restablece a Monica

Respuestas:

4

No puedo comentar, pero su "guía" funcionó de maravilla para hacer una memoria USB mínima de Ubuntu 16. Las únicas cosas que cambié fueron el debootstrap y tuve que hacer que la red funcionara manualmente ( networkd).

Mi línea debootstrap fue:

#> sudo debootstrap --components=main,contrib,nonfree  --variant=minbase \
                    --include=linux-generic,grub-pc --arch=i386 xenial /mnt
505e06b2
fuente
1
Si puede validar esta guía, escriba 4-5 respuestas lo antes posible, obtenga alrededor de 50 repeticiones, y luego podrá comentarla. No marco su publicación para eliminarla, porque es demasiado digna, pero debería, porque realmente no es una respuesta. Por lo tanto, otros probablemente lo harán. Pero puede obtener ese 50 rep muy pronto. Responda 3-4 preguntas triviales y mañana tendrá ...
peterh - Restablezca a Monica
Tenemos muchos Linuxers principiantes aquí, ayudarlos es una forma fácil de aumentar el rendimiento de los representantes. Otros sitios de SE no son tan fáciles.
peterh - Restablece a Monica
4

Lo mantuve y lo descubrí, relativamente sencillo desde aquí, pero no solo una cuestión de configuración /etc/fstab, aquí está el resto:

no es necesario pero es una buena idea limpiar las cosas

apt-get autoclean

configurar /etc/fstab- verifique mountpara asegurarse de que está en el tipo de sistema de archivos correcto

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

esto reconstruirá initramfs y le permitirá arrancar limpiamente

update-initramfs -u -k all

Haga eso y la máquina arranca limpiamente, probada en QEMU y luego la estoy ejecutando ahora en hardware.

ehiller
fuente
4

Configuración automática de Debian 9 sin errores de systemd

Esta configuración no tiene ningún error o advertencia del sistema, y ​​obtengo la conexión a Internet y un shell al final.

Esta configuración simplemente no es perfecta ya que no estoy usando el núcleo de Debian, los errores cuando lo intenté se explicaron en una sección posterior. Luego probé un kernel que tenía por ahí, con una configuración basada en Buildroot y funcionó. La configuración se proporciona en esta configuración. Por lo tanto, es posible que algunos paquetes que dependen de la falta de configuraciones del kernel fallen, aunque hasta ahora no he observado ningún error.

Sin embargo, una configuración análoga funcionó perfectamente con el kernel de Ubuntu: /ubuntu/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171 El kernel de Ubuntu debe tener las configuraciones faltantes comparado con el de Debian. Es probable que las fallas del núcleo de Debian se puedan solucionar compilando el núcleo de Debian con opciones adicionales CONFIG_VIRTIO_BLK=ycomo lo hice para 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 aguas arriba .

Ahora desde la terminal, inicie sesión con root/ rooty luego verifique que Internet funcione con los siguientes comandos:

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

Usamos nccomo se explica en /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 porque:

Probado en un host Ubuntu 18.04.

¿Qué sucede si intento usar el núcleo de Debian?

TODO entender y arreglar. Si reemplazo la compilación del núcleo de Linux anterior con el núcleo de Linux empaquetado de Debian:

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

entonces el arranque falla con:

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

y una lista vacía para:

List of all partitions:

entonces el disco no se reconoce en absoluto. También he tratado de usar exactamente el mismo núcleo que el instalador ISO de Debian que instala aquí, pero para Debian , y falla de la misma manera, a pesar de que la instalación ISO de Debian funcionó bien con las mismas opciones QEMU (genera la instalación de GRUB en un disco con múltiples particiones, siendo la raíz ext4).

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
Si alguien está haciendo esto en una nueva instalación de Ubuntu, también debe instalar build-essentialsantes de ejecutar el script. Se le echa en falta git, make, bisony flex también ser conscientes de que hay un enlace en la configuración aquí para OP github, es posible que desee leerlo a través antes de ejecutar a ciegas para asegurarse de que no ha cambiado.
GPPK