Создание загрузочного образа Debian с помощью debootstrap

13

Я пытался создать загрузочный образ Debian (jessie / 8.4) в течение последних 2 дней, и, насколько я могу судить, у меня есть правильная процедура, но я не могу получить правильную файловую систему. Я относительно уверен, что я делаю что-то здесь не так, что-то упустил при монтировании или /etc/fstab( в моем образе такого нет ). Я надеялся, что кто-то с некоторым опытом сможет помочь мне / показать, что мне не хватает.

Вот ошибки, которые я вижу при загрузке qemu-system-x86:

Как текст, а затем как фактические скриншоты:

Ошибки:

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.

введите описание изображения здесь введите описание изображения здесь

Вот инструкции, которые я написал для себя / шаги, которые я предпринял:

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

источник информации об использовании --components

  • Убедитесь, что ядро ​​установлено, оно должно появиться /boot внутри chroot, то есть /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
  • установить личинку

    grub-install --boot-directory=/mnt/boot --modules=part_msdos /dev/loop0
    
  • Настройте APT

    • скопировать подходящие источники

      cp /etc/apt/sources.list /mnt/etc/apt/sources.list
      
    • убедитесь, что источник cdrom закомментирован

    • добавьте строку:

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

Настройте 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 перемонтировать поддерево в другое место (его содержимое доступно в обоих местах).
-t <type>Монтирование типа файловой системы , с этим, mountпопытается автоматически определить

настроить последовательный / консольный доступ

редактировать /etc/default/grub:

  1. Установите GRUB_CMDLINE_LINUX=""на:

    GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
    
  2. Раскоментируйте GRUB_TERMINAL=console

  3. Ниже добавьте строку:

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

Make grub config - это ДОЛЖНО быть сделано не в systemd-nspawnоболочке (это означает chroot )

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

Выход из chroot

exit

Очистка для chroot'ed

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

Можно проверить дополнительные крепления с помощью:, mount | grep /mnt а затем размонтировать их с помощью umount

Введите systemd-nspawn

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

Установите пароль для rootс помощьюpasswd

В /etc/ssh/sshd_configкомментариях, PermitRootLogin without-passwordчтобы прочитать #PermitRootLogin without-passwordи вставить PermitRootLogin yesпод ним

Теперь включите SSH при запуске

systemctl enable ssh

убирать

# 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

Проверьте наличие дополнительных креплений с помощью: mount | grep /mnt Если НИЧЕГО не возвращается, размонтируйте их с помощью umount

Восстановить (необходимо только в ОШИБКЕ)

Если вы что-то сломали или хотите повторить попытку, повторно установите / установите CHROOT на существующий .img :

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

тестирование img

qemu-system-x86_64 -hda 1445.img -m 1024 -vnc :0
ehiller
источник
Теперь, вероятно, удалили ответ-комментарий @ 505e06b2: Твое «руководство» творило чудеса, создавая миниатюрный Ubuntu 16. Единственное, что я изменил, это debootstrap, и мне пришлось вручную настроить работу сети (networkd). Моя Debootstrap линия: sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt.
peterh - Восстановить Монику

Ответы:

4

Не могу комментировать, но ваш «гид» творил чудеса, создавая минималистичный Ubuntu 16. Единственное, что я изменил, это debootstrap, и мне пришлось вручную настроить сеть ( networkd).

Моя строка debootstrap была:

#> sudo debootstrap --components=main,contrib,nonfree  --variant=minbase \
                    --include=linux-generic,grub-pc --arch=i386 xenial /mnt
505e06b2
источник
1
Если вы можете проверить это руководство, напишите 4-5 ответов КАК МОЖНО СКОРЕЕ, получите около 50 повторений, и тогда вы сможете его прокомментировать. Я не отмечаю ваше сообщение для удаления, потому что оно слишком достойно, но я должен, потому что это действительно не ответ. Таким образом, другие, вероятно, сделают. Но вы можете получить эти 50 повторений очень скоро. Ответьте на 3-4 тривиальных вопроса, и завтра у вас будет ...
Петер - Восстановите Монику
У нас много начинающих линуксеров, и помочь им - это легкий путь к повторению ракетоподобных повторений. Другие сайты SE не так просты.
peterh - Восстановить Монику
4

Сохранялось и выяснял это, относительно прямо отсюда, но не просто вопрос настройки /etc/fstab, вот и все остальное:

не обязательно но хорошая идея убирать вещи

apt-get autoclean

установить /etc/fstab- проверьте, mountчтобы убедиться, что вы используете правильный тип файловой системы

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

это восстановит initramfs и позволит ему загрузиться

update-initramfs -u -k all

Сделайте это, и машина загрузится без ошибок, протестирована в QEMU, а затем я запускаю ее прямо сейчас на оборудовании.

ehiller
источник
4

Автоматическая установка Debian 9 без каких-либо системных ошибок

Эта настройка не имеет никаких системных ошибок или предупреждений, и я получаю подключение к Интернету и оболочку в конце.

Эта настройка просто не идеальна, так как я не использую ядро ​​Debian, ошибки, когда я пытался объяснить, объясняются в следующем разделе. Затем я просто попробовал ядро, которое у меня лежало, с конфигурацией, основанной на Buildroot, и это сработало. Конфиг предоставляется в этой настройке. Поэтому, возможно, что некоторые пакеты, которые полагаются на отсутствующие конфигурации ядра, потерпят неудачу, хотя я до сих пор не обнаружил никаких ошибок.

Аналогичная установка отлично работала с ядром Ubuntu, однако: /ubuntu/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171 Ядро Ubuntu должно иметь отсутствующие конфигурации по сравнению с Debian. Сбои в ядре Debian, вероятно, можно исправить, скомпилировав ядро ​​Debian с дополнительными опциями, CONFIG_VIRTIO_BLK=yкак я делал для 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 вверх по течению .

Теперь из терминала войдите с помощью root/ rootи убедитесь, что Интернет работает с помощью следующих команд:

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

Мы использовали, ncкак описано в /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497, потому что:

Протестировано на хосте Ubuntu 18.04.

Что произойдет, если я попытаюсь использовать ядро ​​Debian

ТОДО понимаю и исправляю. Если я заменим вышеупомянутую компиляцию ядра Linux на упакованное ядро ​​Linux Debian:

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

тогда загрузка завершается неудачно с:

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

и пустой список для:

List of all partitions:

таким образом, диск не распознается вообще. Я также попытался использовать то же самое ядро, которое устанавливает установщик Debian ISO, как это сделано здесь, но для Debian , и оно завершается сбоем таким же образом, даже если установка Debian ISO работала нормально с теми же параметрами QEMU (он генерирует установку GRUB). на диске с несколькими разделами, корневым из которых является ext4).

Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
источник
Если кто-то делает это при новой установке Ubuntu, вам также необходимо установить его build-essentialsперед запуском скрипта. Вы будете пропускать git, make, bisonи flex также быть в курсе есть ссылка здесь , чтобы OP GitHub конфигурации, вы можете прочитать его перед запуском его вслепую , чтобы убедиться , что она не изменилась.
ГППК