Membuat gambar Debian yang dapat di-boot dengan debootstrap


13

Saya telah mencoba untuk membuat image bootable debian (jessie / 8.4) selama 2 hari terakhir, dan sejauh yang saya tahu saya memiliki prosedur yang benar, tetapi saya tidak bisa mendapatkan filesystem dengan benar. Saya relatif yakin bahwa saya melakukan sesuatu yang salah di sini, melewatkan sesuatu dengan pemasangan atau /etc/fstab( tidak ada satu di gambar saya ). Saya berharap seseorang dengan pengalaman akan dapat membantu saya / menunjukkan kepada saya apa yang saya lewatkan.

Berikut adalah kesalahan yang saya lihat saat saya boot ke qemu-system-x86:

Sebagai teks dan kemudian sebagai tangkapan layar yang sebenarnya:

Kesalahan:

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.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Berikut adalah instruksi yang telah saya tulis untuk diri saya sendiri / langkah-langkah yang telah saya ambil:

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

sumber untuk informasi tentang cara menggunakan --komponen

  • Pastikan bahwa kernel terinstal, harus muncul di /boot dalam chroot, yaitu /mnt/boot dengan file-file berikut:

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

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

    • menyalin melalui sumber apt

      cp /etc/apt/sources.list /mnt/etc/apt/sources.list
      
    • memastikan sumber cdrom dikomentari

    • tambahkan baris:

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

Siapkan 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 Remount subtree di tempat lain (isinya tersedia di kedua tempat).
-t <type>Mount tipe filesystem , dengan ini, mountakan berusaha untuk menentukan secara otomatis

pengaturan akses serial / konsol

edit /etc/default/grub:

  1. Setel GRUB_CMDLINE_LINUX=""ke:

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

  3. Di bawah, tambahkan baris:

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

Make the grub config - Ini HARUS dilakukan dalam bentuk non- systemd-nspawnshell (artinya chroot )

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

Keluar dari chroot

exit

Bersihkan untuk chroot'ed

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

Dapat memeriksa tunggangan tambahan dengan: mount | grep /mnt dan kemudian melepasnya dengan umount

Masukkan systemd-nspawn

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

Setel kata sandi untuk rootdenganpasswd

Dalam /etc/ssh/sshd_configkomentar keluar PermitRootLogin without-passworduntuk membaca #PermitRootLogin without-passworddan memasukkan di PermitRootLogin yesbawahnya

Sekarang aktifkan ssh saat startup

systemctl enable ssh

membersihkan

# 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

Periksa tunggangan tambahan dengan: mount | grep /mnt Jika APA SAJA dikembalikan, lepaskan dengan umount

Pulihkan (hanya perlu di ERROR)

Jika Anda memecahkan sesuatu, atau perlu mencoba lagi, RE-MOUNT / SETUP CHROOT pada yang sudah ada .img :

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

pengujian img

qemu-system-x86_64 -hda 1445.img -m 1024 -vnc :0

Sekarang mungkin dihapus jawaban-komentar @ 505e06b2: "Panduan" Anda bekerja sangat baik untuk membuat Minimal Ubuntu 16 thumbdrive. Satu-satunya hal yang saya ubah adalah debootstrap dan saya harus secara manual membuat jaringan berfungsi (networkd). Baris debootstrap saya adalah: sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt.
peterh

Jawaban:


4

Tidak dapat berkomentar, tetapi "panduan" Anda bekerja sangat baik untuk membuat thumbdrive Minimal 16 Ubuntu. Satu-satunya hal yang saya ubah adalah debootstrap dan saya harus mengaktifkan jaringan secara manual ( networkd).

Baris debootstrap saya adalah:

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

1
Jika Anda dapat memvalidasi panduan ini, maka tulis 4-5 jawaban ASAP, dapatkan sekitar 50 rep, dan Anda akan dapat berkomentar. Saya tidak menandai pos Anda untuk dihapus, karena terlalu layak, tetapi saya harus, karena ini benar-benar bukan jawaban. Dengan demikian, orang lain mungkin akan melakukannya. Tetapi Anda bisa mendapatkan 50 rep itu segera. Jawab 3-4 pertanyaan sepele dan besok Anda akan memiliki ...
peterh - Reinstate Monica

Kami memiliki banyak pemula Linux di sini, membantu mereka adalah cara mudah untuk meningkatkan perwakilan seperti roket. Situs SE lainnya tidak mudah.
peterh

4

Teruskan dan sadari, relatif lurus ke depan dari sini, tetapi bukan hanya masalah pengaturan /etc/fstab, berikut adalah sisanya:

tidak perlu tetapi ide yang baik untuk membereskan semuanya

apt-get autoclean

pengaturan /etc/fstab- tanyakan mountuntuk memastikan Anda berada pada tipe sistem file yang tepat

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

ini akan membangun kembali initramfs dan memungkinkannya untuk boot bersih

update-initramfs -u -k all

Lakukan itu dan mesin boot bersih, diuji dalam QEMU dan kemudian saya menjalankannya sekarang pada perangkat keras.


4

Pengaturan Debian 9 otomatis tanpa kesalahan sistem

Pengaturan ini tidak memiliki kesalahan atau peringatan systemd, dan saya mendapatkan koneksi Internet dan sebuah shell di akhir.

Pengaturan ini tidak sempurna karena saya tidak menggunakan kernel Debian, kesalahan ketika saya mencoba menjelaskan di bagian selanjutnya. Saya kemudian baru saja mencoba kernel yang saya gunakan , dengan konfigurasi berbasis Buildroot dan berhasil. Konfigurasi disediakan dalam pengaturan ini. Oleh karena itu, ada kemungkinan bahwa beberapa paket yang bergantung pada konfigurasi kernel yang hilang akan gagal, meskipun sejauh ini saya tidak melihat kesalahan.

Pengaturan analog bekerja dengan sempurna dengan kernel Ubuntu: /ubuntu/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171 Kernel Ubuntu harus memiliki konfigurasi yang hilang. dibandingkan dengan yang Debian. Kegagalan kernel Debian kemungkinan dapat diperbaiki dengan mengkompilasi kernel Debian dengan opsi tambahan seperti yang CONFIG_VIRTIO_BLK=ytelah saya lakukan untuk 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 hulu .

Sekarang dari terminal, login dengan root/ root, dan kemudian periksa apakah Internet berfungsi dengan perintah berikut:

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

Kami menggunakan ncsebagaimana dijelaskan di /programming/32341518/how-to-make-an-http-get-request-manually-with-netcat/52662497#52662497 karena:

Diuji pada host Ubuntu 18.04.

Apa yang terjadi jika saya mencoba menggunakan kernel Debian

TODO mengerti dan memperbaikinya. Jika saya mengganti kompilasi kernel Linux di atas dengan kernel Linux paket Debian:

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

lalu boot gagal dengan:

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

dan daftar kosong untuk:

List of all partitions:

jadi disk tidak dikenali sama sekali. Saya juga mencoba menggunakan kernel yang sama persis dengan instal installer ISO Debian seperti yang dilakukan di sini tetapi untuk Debian , dan gagal dengan cara yang sama, meskipun instalasi ISO Debian bekerja dengan baik dengan opsi QEMU yang sama (ini menghasilkan instalasi GRUB dalam disk dengan banyak partisi, yang root adalah ext4).


Jika ada yang melakukan ini pada instalasi Ubuntu baru, Anda juga perlu menginstal build-essentialssebelum menjalankan skrip. Anda akan hilang git, make, bison& flex Juga sadar ada link di sini untuk OP github config, Anda mungkin ingin membaca melalui sebelum menjalankan itu membabi buta untuk memastikan itu tidak berubah.
GPPK
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.