Tworzenie bootowalnego obrazu Debiana za pomocą debootstrap

13

Próbowałem utworzyć bootowalny obraz Debiana (jessie / 8.4) przez ostatnie 2 dni i, o ile wiem, mam prawidłową procedurę, ale nie mogę poprawnie ustawić systemu plików. Jestem względnie pewien, że robię tutaj coś złego, brakuje czegoś z montażem lub /etc/fstab( nie ma tego na moim obrazie ). Miałem nadzieję, że ktoś z pewnym doświadczeniem będzie w stanie mi pomóc / pokazać mi, czego mi brakuje.

Oto błędy, które widzę podczas uruchamiania systemu qemu-system-x86:

Jako tekst, a następnie jako zrzuty ekranu:

Błędy:

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.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Oto instrukcje, które napisałem dla siebie / kroki, które podjąłem:

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

źródło informacji o korzystaniu z --components

  • Upewnij się, że jądro jest zainstalowane, powinno pojawić się w /boot chroot, czyli /mnt/boot z następującymi plikami:

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

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

    • skopiuj na apt apt

      cp /etc/apt/sources.list /mnt/etc/apt/sources.list
      
    • upewnij się, że źródło cdrom jest skomentowane

    • dodaj linię:

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

Skonfiguruj chroota

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 Zamontuj poddrzewa w innym miejscu (jego zawartość jest dostępna w obu miejscach).
-t <type>Podłączenie typu systemu plików , przy tym, mountspróbuje automatycznie ustalić

skonfigurować dostęp szeregowy / konsolowy

edycja /etc/default/grub:

  1. Ustaw GRUB_CMDLINE_LINUX=""na:

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

  3. Poniżej dodaj wiersz:

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

Dokonać config grub - To musi być zrobione w niebędącego systemd-nspawnskorupy (czyli chroot )

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

Wyjdź z chroot

exit

Posprzątaj dla chroot'ed

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

Może sprawdzić dodatkowe mocowania za pomocą: mount | grep /mnt a następnie odmontować je za pomocą umount

Wpisz systemd-nspawn

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

Ustaw hasło dla za rootpomocąpasswd

W /etc/ssh/sshd_configWykomentuj PermitRootLogin without-passwordczytać #PermitRootLogin without-passwordi włóż PermitRootLogin yespod nią

Teraz włącz ssh podczas uruchamiania

systemctl enable ssh

sprzątać

# 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

Sprawdź dodatkowe uchwyty z: mount | grep /mnt Jeżeli cokolwiek jest zwracany odłącz je umount

Odzyskaj (konieczne tylko w przypadku BŁĘDU)

Jeśli coś zepsułeś lub musisz spróbować ponownie, ZMONTUJ / USTAWIENIA CHROOT na istniejących .img :

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

testowanie img

qemu-system-x86_64 -hda 1445.img -m 1024 -vnc :0
ehiller
źródło
Prawdopodobnie usunięto odpowiedź-komentarz @ 505e06b2: Twój „przewodnik” działał cuda, tworząc minimalny dysk Ubuntu 16. Jedyne, co zmieniłem, to debootstrap i musiałem ręcznie uruchomić sieć (Networkd). Moja linia debootstrap było: sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt.
peterh - Przywróć Monikę

Odpowiedzi:

4

Nie mogę komentować, ale twój „przewodnik” działał cuda, tworząc minimalny dysk Ubuntu 16. Jedyne, co zmieniłem, to debootstrap i musiałem ręcznie uruchomić sieć ( networkd).

Moja linia debootstrap to:

#> sudo debootstrap --components=main,contrib,nonfree  --variant=minbase \
                    --include=linux-generic,grub-pc --arch=i386 xenial /mnt
505e06b2
źródło
1
Jeśli możesz zweryfikować ten przewodnik, napisz 4-5 odpowiedzi JAK NAJSZYBCIEJ, uzyskaj około 50 powtórzeń, a następnie będziesz mógł je skomentować. Nie oznaczam twojego wpisu do usunięcia, ponieważ jest on zbyt godny, ale powinienem, ponieważ to naprawdę nie jest odpowiedź. Dlatego inni prawdopodobnie to zrobią. Ale możesz szybko uzyskać 50 powtórzeń. Odpowiedz na 3-4 trywialne pytania, a jutro będziesz miał ...
Peter - Przywróć Monikę
Mamy tutaj wielu początkujących Linuxerów, którzy pomagają im w szybkim zwiększeniu liczby powtórzeń. Inne strony SE nie są tak łatwe.
peterh - Przywróć Monikę
4

Zachowałem to i wymyśliłem, stosunkowo prosto stąd, ale nie tylko kwestia przygotowania /etc/fstab, oto reszta:

nie konieczne, ale dobry pomysł, aby posprzątać

apt-get autoclean

skonfiguruj /etc/fstab- sprawdź za pomocą, mountaby upewnić się, że masz właściwy typ systemu plików

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

spowoduje to przebudowanie initramfs i pozwoli na czysty rozruch

update-initramfs -u -k all

Zrób to, a maszyna uruchomi się czysta, przetestowana w QEMU, a następnie uruchomię ją teraz na sprzęcie.

ehiller
źródło
4

Zautomatyzowana konfiguracja Debiana 9 bez błędów systemowych

Ta konfiguracja nie zawiera błędów systemowych ani ostrzeżeń, a na końcu otrzymuję połączenie internetowe i powłokę.

Ta konfiguracja po prostu nie jest idealna, ponieważ nie używam jądra Debiana. Błędy, które próbowałem wyjaśnić w dalszej części. Właśnie wtedy wypróbowałem jądro, które miałem, z konfiguracją opartą na Buildroot i działało. Konfiguracja jest dostępna w tej konfiguracji. Dlatego możliwe jest, że niektóre pakiety, które polegają na brakujących konfiguracjach jądra, zawiodą, chociaż do tej pory nie zauważyłem żadnych błędów.

Analogiczna konfiguracja działała idealnie z jądrem Ubuntu: /ubuntu/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171 Jądro Ubuntu musi mieć brakujące konfiguracje w porównaniu do Debiana. Błędy jądra Debiana można prawdopodobnie naprawić, kompilując jądro Debiana z dodatkowymi opcjami, takimi CONFIG_VIRTIO_BLK=yjak zrobiłem dla 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 w górę .

Teraz z poziomu terminala zaloguj się za pomocą root/ root, a następnie sprawdź, czy Internet działa z następującymi poleceniami:

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

Użyliśmy ncjak wyjaśniono na /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497, ponieważ:

Testowany na hoście Ubuntu 18.04.

Co się stanie, jeśli spróbuję użyć jądra Debiana

DO ZROBIENIA zrozumieć i naprawić. Jeśli zastąpię powyższą kompilację jądra Linuksa jądrem Linuksa spakowanym w Debianie:

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

następnie rozruch kończy się niepowodzeniem:

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

i pusta lista dla:

List of all partitions:

więc dysk w ogóle nie jest rozpoznawany. Próbowałem również użyć dokładnie tego samego jądra, które instaluje instalator Debian ISO, tak jak tutaj, ale w przypadku Debiana , i to kończy się niepowodzeniem w ten sam sposób, mimo że instalacja ISO Debiana działała dobrze z tymi samymi opcjami QEMU (generuje instalację GRUB na dysku z wieloma partycjami (główną jest ext4).

Ciro Santilli
źródło
Jeśli ktoś robi to podczas nowej instalacji Ubuntu, musisz także zainstalować build-essentialsprzed uruchomieniem skryptu. Będziesz brakuje git, make, bisoni flex także mieć świadomość, że istnieje związek tu do OP github config, warto ją przeczytać przed uruchomieniem przez to ślepo, aby upewnić się, że nie uległa zmianie.
GPPK