Creare un'immagine Debian avviabile con debootstrap


13

Ho cercato di creare un'immagine debian (jessie / 8.4) avviabile negli ultimi 2 giorni e, per quanto ne so, ho la procedura giusta, ma non riesco a ottenere il file system giusto. Sono relativamente sicuro che sto facendo qualcosa di sbagliato qui, mancando qualcosa con il montaggio o /etc/fstab( non ce n'è uno nella mia immagine ). Speravo che qualcuno con qualche esperienza potesse aiutarmi / mostrarmi cosa mi sto perdendo.

Ecco gli errori che vedo mentre eseguo l'avvio in qemu-system-x86:

Come testo e quindi come schermate effettive:

Errori:

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.

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Ecco le istruzioni che ho scritto per me stesso / i passaggi che ho preso:

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

fonte di informazioni sull'uso di --components

  • Assicurarsi che il kernel sia installato, dovrebbe apparire /boot all'interno del chroot, ovvero /mnt/boot con i seguenti file:

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

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

    • copia sulle fonti apt

      cp /etc/apt/sources.list /mnt/etc/apt/sources.list
      
    • assicurarsi che la fonte cdrom sia commentata

    • aggiungi la riga:

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

Installa 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 da man mount :
--bind rimonta una sottostruttura altrove (i suoi contenuti sono disponibili in entrambi i posti).
-t <type>Il montaggio del tipo di filesystem , con questo, mounttenterà di determinare automaticamente

imposta l'accesso seriale / console

modifica /etc/default/grub:

  1. Imposta GRUB_CMDLINE_LINUX=""su:

    GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
    
  2. Rimuovere il commento GRUB_TERMINAL=console

  3. Sotto, aggiungi la riga:

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

Effettuare la configurazione di GRUB - Questo deve essere fatto in un non- systemd-nspawnshell (che significa chroot )

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

Esci da chroot

exit

Pulisci per chroot

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

Puoi verificare eventuali supporti aggiuntivi con: mount | grep /mnt e quindi smontarli con umount

Inserisci systemd-nspawn

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

Imposta la password per rootconpasswd

Nel /etc/ssh/sshd_configcommento fuori PermitRootLogin without-passwordper leggere #PermitRootLogin without-passworde inserire PermitRootLogin yessotto di esso

Ora abilita ssh all'avvio

systemctl enable ssh

pulire

# 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

Verificare eventuali supporti aggiuntivi con: mount | grep /mnt Se viene restituito QUALSIASI COSA , smontarli con umount

Ripristina (necessario solo in ERRORE)

Se hai rotto qualcosa o hai bisogno di riprovare, RE-MOUNT / SETUP CHROOT su esistente .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

Ora, probabilmente, è stato eliminato il commento-risposta di @ 505e06b2: la tua "guida" ha funzionato a meraviglia nel creare una chiavetta Minimal Ubuntu 16. Le uniche cose che ho cambiato erano il debootstrap e ho dovuto far funzionare manualmente il networking (networkd). La mia linea debootstrap era: sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt.
Peter - Ripristina Monica il

Risposte:


4

Non posso commentare, ma la tua "guida" ha fatto miracoli per creare una chiavetta Minimal Ubuntu 16. Le uniche cose che ho cambiato erano il debootstrap e ho dovuto far funzionare manualmente la rete ( networkd).

La mia linea debootstrap era:

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

1
Se riesci a convalidare questa guida, scrivi 4-5 risposte al più presto, ottieni circa 50 rappresentanti e sarai in grado di commentarlo. Non contrassegno il tuo post per la cancellazione, perché è troppo degno, ma dovrei, perché in realtà non è una risposta. Pertanto, altri probabilmente lo faranno. Ma puoi ottenere quel 50 rappresentante molto presto. Rispondi a 3-4 domande banali e domani avrai ...
Peter - Ripristina Monica il

Abbiamo molti Linuxer principianti qui, aiutarli è un modo semplice per dare una spinta rep a un missile. Altri siti SE non sono così facili.
Peter - Ripristina Monica il

4

L'ho tenuto e capito, relativamente semplice da qui, ma non solo una questione di installazione /etc/fstab, ecco il resto:

non necessario ma una buona idea per ripulire le cose

apt-get autoclean

imposta /etc/fstab- controlla con mountper assicurarti di avere il giusto tipo di filesystem

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

questo ricostruirà initramfs e consentirà l'avvio pulito

update-initramfs -u -k all

Fallo e la macchina si avvia pulita, testata in QEMU e poi la sto eseguendo proprio ora sull'hardware.


4

Installazione automatica di Debian 9 senza errori di sistema

Questa configurazione non ha alcun errore o avviso di systemd e alla fine ottengo la connessione Internet e una shell.

Questa installazione non è perfetta poiché non sto usando il kernel Debian, errori quando ho provato spiegati in una sezione successiva. Ho quindi provato un kernel che avevo in giro, con la configurazione basata su Buildroot e ha funzionato. La configurazione è fornita in questa configurazione. Pertanto, è possibile che alcuni pacchetti che si basano su configurazioni del kernel mancanti falliscano, anche se finora non ho riscontrato errori.

Una configurazione analoga ha funzionato perfettamente con il kernel Ubuntu: /ubuntu/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171 Il kernel Ubuntu deve avere le configurazioni mancanti rispetto a quello Debian. Gli errori del kernel Debian possono probabilmente essere risolti compilando il kernel Debian con opzioni extra come CONFIG_VIRTIO_BLK=yho fatto per 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 a monte .

Ora dal terminale, accedi con root/ root, quindi controlla che Internet funzioni con i seguenti comandi:

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

Abbiamo usato nccome spiegato in /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 perché:

Testato su un host Ubuntu 18.04.

Cosa succede se provo ad usare il kernel Debian

TODO capisce e risolve. Se sostituisco la compilazione del kernel Linux sopra con il kernel Linux Debian in pacchetto:

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

quindi l'avvio non riesce con:

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

e un elenco vuoto per:

List of all partitions:

quindi il disco non viene riconosciuto affatto. Ho anche provato ad usare lo stesso kernel esatto che il programma di installazione ISO Debian installa come fatto qui ma per Debian , e fallisce allo stesso modo, anche se l'installazione ISO Debian ha funzionato bene con le stesse opzioni QEMU (genera l'installazione di GRUB in un disco con più partizioni, quella principale è ext4).


Se qualcuno lo sta eseguendo su una nuova installazione di Ubuntu, è necessario installare anche build-essentialsprima di eseguire lo script. Ti mancherà git, make, bisone flex essere consapevoli c'è un link qui a OP GitHub config Inoltre, si potrebbe desiderare di leggere attraverso prima di eseguirlo alla cieca per assicurarsi che non è cambiato.
GPPK
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.