Створення завантажувального зображення Debian за допомогою debootstrap


13

Останні 2 дні я намагаюся створити завантажувальний образ debian (jessie / 8.4), і, наскільки я можу сказати, я маю правильну процедуру, але я не можу отримати правильну файлову систему. Я відносно впевнений, що я роблю щось не так, пропускаючи щось із монтажем або /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

джерело інформації про використання --компонентів

  • Переконайтесь, що ядро ​​встановлене, воно повинно з’являтися в /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
      
    • переконайтеся, що джерело компакт-диска коментується

    • додайте рядок:

      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 від 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"
    

Зробити потаємну конфігурацію - Це ПОВИННО бути зроблено в НЕ systemd-nspawnоболонці (це означає , що chroot )

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

Вихід із хроту

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

Відновлення (необхідне лише в помилці)

Якщо ви щось зламали або вам потрібно повторити спробу, повторно встановіть налаштування на існуючі .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

Тепер, ймовірно, видалено відповідь-коментар @ 505e06b2: Ваш "посібник" творив чудеса для створення мінімального Ubuntu 16 thumbdrive. Єдине, що я змінив - це debootstrap, і мені довелося вручну налагодити роботу з мережею (networkd). Моя Debootstrap лінія: sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt.
петерх

Відповіді:


4

Не можу коментувати, але ваш "путівник" творив чудеса для створення мінімального Ubuntu 16 thumbdrive. Єдине, що я змінив - це debootstrap, і мені довелося вручну налагоджувати роботу мережі ( networkd).

Мій рядок для завантаження:

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

1
Якщо ви зможете підтвердити цей посібник, тоді якнайшвидше напишіть 4-5 відповідей, отримайте близько 50 повторень, і тоді ви зможете прокоментувати його. Я не позначаю вашу публікацію для видалення, тому що вона занадто гідна, але я повинна, тому що це дійсно не відповідь. Таким чином, ймовірно, будуть і інші. Але ви можете отримати ці 50 повторів дуже скоро. Дайте відповідь на 3-4 тривіальні запитання, і завтра у вас буде ...
peterh - Відновіть Моніку

У нас є багато початківців Linuxers тут, допомогти їм - це простий спосіб до ракетного прискорення реп. Інші сайти SE не так просто.
петерх

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, а потім я зараз запускаю його на апаратному забезпеченні.


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

TODO зрозуміти та виправити. Якщо я заміню компіляцію ядра 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 конфігурації, ви можете прочитати його перед запуском його наосліп , щоб переконатися , що вона не змінилася.
GPPK
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.