Debian

使用 debootstrap 創建可啟動的 Debian 映像

  • February 6, 2020

在過去的兩天裡,我一直在嘗試創建一個可啟動的 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

有關使用 –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

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

    • 複製 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"
  1. 取消註釋GRUB_TERMINAL=console
  2. 在下面,添加以下行:
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

進行 grub 配置 - 必須 在非systemd-nspawnshell 中完成(這意味著 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

恢復(僅在 ERROR 中需要)

如果您破壞了某些東西,或者需要重試,請在現有的 RE-MOUNT / SETUP 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

堅持下去並想通了,從這裡開始相對簡單,但不僅僅是設置的問題,/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 中測試,然後我現在在硬體上執行它。

引用自:https://unix.stackexchange.com/questions/275429