การสร้างอิมเมจ 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

แหล่งข้อมูลสำหรับการใช้ - ส่วนประกอบ

  • ตรวจสอบให้แน่ใจว่ามีการติดตั้งเคอร์เนลและควรปรากฏใน /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 จาก man mount :
--bind remount ทรีย่อยที่อื่น (เนื้อหาของมันมีอยู่ในทั้งสองแห่ง)
-t <type>การเมานต์ของประเภทระบบไฟล์ด้วยสิ่งนี้mountจะพยายามกำหนดอัตโนมัติ

ตั้งค่าการเข้าถึงแบบอนุกรม / คอนโซล

แก้ไข/etc/default/grub:

  1. ตั้งค่าGRUB_CMDLINE_LINUX=""เป็น:

    GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
    
  2. uncomment 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

ออกจาก 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

ตอนนี้อาจถูกลบคำตอบความคิดเห็นของ @ 505e06b2: "คู่มือ" ของคุณทำงานสิ่งมหัศจรรย์สำหรับการทำ Ubuntu 16 thumbdrive น้อยที่สุด สิ่งเดียวที่ฉันเปลี่ยนคือ debootstrap และฉันต้องทำงานเครือข่ายด้วยตนเอง (networkd) สาย debootstrap sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mntของฉันคือ:
peterh - Reinstate Monica

คำตอบ:


4

ไม่สามารถออกความเห็นได้ แต่ "ไกด์" ของคุณทำงานอย่างมหัศจรรย์ในการสร้างขั้นต่ำของ Ubuntu 16 thumbdrive สิ่งเดียวที่ฉันเปลี่ยนคือ debootstrap และฉันต้องทำงานเครือข่ายด้วยตนเอง ( networkd)

บรรทัด deboot ของฉันคือ:

#> 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 - Reinstate Monica

เรามีผู้เริ่มต้นลีนุกซ์จำนวนมากที่นี่, การช่วยเหลือพวกเขาเป็นวิธีง่ายๆในการเพิ่มประสิทธิภาพตัวแทนจรวด ไซต์ SE อื่น ๆ นั้นไม่ใช่เรื่องง่าย
peterh - Reinstate Monica

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 อัตโนมัติโดยไม่มีข้อผิดพลาด systemd

การตั้งค่านี้ไม่มีข้อผิดพลาดหรือคำเตือนของ systemd และฉันได้รับการเชื่อมต่ออินเทอร์เน็ตและเชลล์ในตอนท้าย

การตั้งค่านี้ไม่สมบูรณ์แบบเนื่องจากฉันไม่ได้ใช้เคอร์เนล Debian ข้อผิดพลาดเมื่อฉันลองอธิบายในส่วนต่อมา จากนั้นฉันก็ลองใช้เคอร์เนลที่ฉันนอนอยู่โดยใช้ config จาก 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 kernel

สิ่งที่ต้องทำเข้าใจและแก้ไข ถ้าฉันแทนที่การรวบรวมเคอร์เนล 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 config ของคุณอาจต้องการที่จะอ่านมันผ่านก่อนที่จะใช้มันสุ่มสี่สุ่มห้าเพื่อให้แน่ใจว่ามันไม่ได้เปลี่ยน
GPPK
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.