Tạo hình ảnh Debian có thể khởi động với debootstrap


13

Tôi đã cố gắng tạo một hình ảnh debian có thể khởi động (jessie / 8.4) trong 2 ngày qua và theo như tôi có thể nói là tôi có quy trình đúng, nhưng tôi không thể hiểu đúng về hệ thống tập tin. Tôi tương đối chắc chắn rằng tôi đang làm gì đó sai ở đây, thiếu một cái gì đó với việc gắn hoặc /etc/fstab( không có cái nào trong hình ảnh của tôi ). Tôi đã hy vọng ai đó có một số kinh nghiệm sẽ có thể giúp tôi / chỉ cho tôi những gì tôi đang thiếu.

Dưới đây là các lỗi tôi thấy khi tôi khởi động vào qemu-system-x86:

Như văn bản và sau đó là ảnh chụp màn hình thực tế:

Lỗi:

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.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Dưới đây là các hướng dẫn tôi đã viết cho chính mình / các bước tôi đã thực hiện:

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

nguồn thông tin về việc sử dụng - thành phần

  • Đảm bảo rằng kernel đã được cài đặt, nó sẽ xuất hiện trong /boot chroot, /mnt/boot với các tệp sau:

    • 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
  • cài đặt grub

    grub-install --boot-directory=/mnt/boot --modules=part_msdos /dev/loop0
    
  • Thiết lập APT

    • sao chép qua các nguồn apt

      cp /etc/apt/sources.list /mnt/etc/apt/sources.list
      
    • đảm bảo nguồn cdrom được nhận xét

    • thêm dòng:

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

Cài đặt 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 từ man mount :
--bind Kể lại một cây con ở một nơi khác (nội dung của nó có sẵn ở cả hai nơi).
-t <type>Mount loại hệ thống tập tin , với điều này, mountsẽ cố gắng tự động xác định

thiết lập truy cập nối tiếp / bàn điều khiển

chỉnh sửa /etc/default/grub:

  1. Đặt GRUB_CMDLINE_LINUX=""thành:

    GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
    
  2. Thất bại GRUB_TERMINAL=console

  3. Bên dưới, thêm dòng:

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

Tạo cấu hình grub - Điều này PHẢI được thực hiện trong một systemd-nspawnvỏ không (có nghĩa là chroot )

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

Thoát khỏi chroot

exit

Dọn dẹp cho chroot'ed

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

Có thể kiểm tra các gắn kết bổ sung với: mount | grep /mnt và sau đó ngắt kết nối chúng với umount

Nhập systemd-nspawn

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

Đặt mật khẩu cho rootvớipasswd

Trong /etc/ssh/sshd_configbình luận ra PermitRootLogin without-passwordđể đọc #PermitRootLogin without-passwordvà chèn PermitRootLogin yesbên dưới nó

Bây giờ kích hoạt ssh khi khởi động

systemctl enable ssh

dọn dẹp

# 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

Kiểm tra các gắn kết bổ sung với: mount | grep /mnt Nếu BẤT K return việc nào được trả về, hãy ngắt kết nối chúng với umount

Phục hồi (chỉ cần thiết trong LRI)

Nếu bạn đã phá vỡ một cái gì đó, hoặc cần thử lại, RE-MOUNT / SETUP CHROOT hiện có .img :

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

kiểm tra img

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

Bây giờ có lẽ đã xóa câu trả lời-nhận xét của @ 505e06b2: "hướng dẫn" của bạn đã làm việc kỳ diệu để tạo ra một ngón tay cái tối thiểu Ubuntu 16. Điều duy nhất tôi thay đổi là debootstrap và tôi phải tự làm việc mạng (mạngd). Dòng debootstrap của tôi là : sudo debootstrap --components=main,contrib,nonfree --variant=minbase --include=linux-generic,grub-pc --arch=i386 xenial /mnt.
peterh - Phục hồi lại

Câu trả lời:


4

Không thể nhận xét, nhưng "hướng dẫn" của bạn đã làm việc kỳ diệu để tạo ra một ngón tay cái tối thiểu Ubuntu 16. Điều duy nhất tôi thay đổi là debootstrap và tôi phải tự kết nối mạng ( networkd).

Dòng debootstrap của tôi là:

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

1
Nếu bạn có thể xác thực hướng dẫn này, sau đó viết 4-5 câu trả lời càng sớm càng tốt, nhận khoảng 50 đại diện của bạn và sau đó bạn sẽ có thể nhận xét nó. Tôi không gắn cờ bài đăng của bạn để xóa, vì nó quá xứng đáng, nhưng tôi nên, bởi vì nó thực sự không phải là một câu trả lời. Vì vậy, những người khác có thể sẽ làm. Nhưng bạn có thể nhận được 50 rep đó rất sớm. Trả lời 3-4 câu hỏi tầm thường và ngày mai bạn sẽ có ...
peterh - Tái lập lại

Chúng tôi có rất nhiều Linux mới bắt đầu ở đây, giúp đỡ họ là một cách dễ dàng để tăng cường đại diện giống như tên lửa. Các trang web SE khác không quá dễ dàng.
peterh - Tái lập Monica

4

Giữ lấy nó và tìm ra nó, tương đối thẳng từ đây, nhưng không chỉ là vấn đề thiết lập /etc/fstab, đây là phần còn lại:

không cần thiết nhưng một ý tưởng tốt để dọn dẹp mọi thứ

apt-get autoclean

thiết lập /etc/fstab- kiểm tra mountđể đảm bảo bạn đang ở đúng loại hệ thống tập tin

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

điều này sẽ xây dựng lại các initramfs và cho phép nó khởi động sạch

update-initramfs -u -k all

Làm điều đó và máy khởi động sạch sẽ, được thử nghiệm trong QEMU và sau đó tôi đang chạy nó ngay trên phần cứng.


4

Thiết lập Debian 9 tự động mà không có bất kỳ lỗi systemd nào

Thiết lập này không có bất kỳ lỗi hệ thống hoặc cảnh báo nào và tôi nhận được kết nối Internet và vỏ ở cuối.

Thiết lập này không hoàn hảo vì tôi không sử dụng kernel Debian, lỗi khi tôi cố gắng giải thích trong phần sau. Sau đó tôi mới thử một kernel mà tôi đã nằm xung quanh, với cấu hình dựa trên Buildroot và nó đã hoạt động. Các cấu hình được cung cấp trong thiết lập này. Do đó, có thể một số gói dựa trên cấu hình kernel bị thiếu sẽ thất bại, mặc dù cho đến nay tôi chưa quan sát thấy bất kỳ lỗi nào.

Tuy nhiên, một thiết lập tương tự đã hoạt động hoàn hảo với kernel Ubuntu: https://askubfox.com/questions/281763/is-there-any-prebuilt-qemu-ubfox-image32bit-online/1081171#1081171 Hạt nhân Ubuntu phải có các cấu hình bị thiếu so với bản Debian. Lỗi kernel Debian có thể được khắc phục bằng cách biên dịch kernel Debian với các tùy chọn bổ sung CONFIG_VIRTIO_BLK=ynhư tôi đã làm cho 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 ngược dòng .

Bây giờ từ thiết bị đầu cuối, đăng nhập bằng root/ root, và sau đó kiểm tra xem Internet có hoạt động với các lệnh sau không:

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

Chúng tôi đã sử dụng ncnhư được giải thích tại /programming/32341518/how-to-make-an-http-get-request-manual-with-netcat/52662497#52662497 vì:

Đã thử nghiệm trên máy chủ Ubuntu 18.04.

Điều gì xảy ra nếu tôi cố gắng sử dụng kernel Debian

TODO hiểu và sửa chữa. Nếu tôi thay thế phần biên dịch kernel Linux ở trên bằng kernel Linux được đóng gói Debian:

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

sau đó khởi động thất bại với:

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

và một danh sách trống cho:

List of all partitions:

vì vậy đĩa không được công nhận Tôi cũng đã thử sử dụng chính xác hạt nhân mà trình cài đặt Debian Debian cài đặt như đã thực hiện ở đây nhưng đối với Debian , và nó không thành công theo cách tương tự, mặc dù cài đặt Debian ISO hoạt động tốt với cùng các tùy chọn QEMU (nó tạo ra cài đặt GRUB trong một đĩa có nhiều phân vùng, một bản gốc ext4).


Nếu bất cứ ai đang làm điều này trên một bản cài đặt Ubuntu mới, bạn cũng cần cài đặt build-essentialstrước khi chạy tập lệnh. Bạn sẽ bỏ lỡ git, make, bison& flex Cũng lưu ý có một liên kết tại đây để OP github cấu hình, bạn có thể muốn đọc nó thông qua trước khi chạy nó một cách mù quáng để chắc chắn rằng nó đã không thay đổi.
GPPK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.