私は過去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をインストールする
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
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
fromman mount :--bind
サブツリーを別の場所に再マウントします(その内容は両方の場所で利用可能です)。-t <type>
ファイルシステムのマウントtype、これにより、mount
は自動判別を試みます
編集/etc/default/grub
:
セットする GRUB_CMDLINE_LINUX=""
から:
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
コメント解除GRUB_TERMINAL=console
その下に次の行を追加します。
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --Word=8 --parity=no --stop=1"
GRUB構成を作成-これ[〜#〜]必須[〜#〜]非systemd-nspawn
シェル(つまりchroot
)
grub-mkconfig -o /boot/grub/grub.cfg
exit
umount /mnt/sys
umount /mnt/dev
umount /mnt/dev/pts
umount /mnt/proc
次のコマンドで追加のマウントを確認できます:mount | grep /mnt
次にアンマウントしますumount
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
If[〜#〜]何か[〜#〜]が返されたら、それらをアンマウントしますumount
何かを壊したり、再試行する必要がある場合は、既存の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
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でテストされ、ハードウェアで今実行しています。
systemdエラーなしの自動化されたDebian 9セットアップ
このセットアップにはsystemdのエラーや警告はなく、最後にインターネット接続とシェルが表示されます。
Debianカーネルを使用していないため、このセットアップは完全ではありません。後のセクションで説明しようとしたときにエラーが発生しました。それから私は、config Buildrootに基づいて を使用して、うそをついていたカーネルを試したところ、うまくいきました。構成はこのセットアップで提供されます。そのため、これまでエラーを確認していませんが、欠落しているカーネル構成に依存する一部のパッケージが失敗する可能性があります。
類似のセットアップはUbuntuカーネルでも完全に機能しました。 https://askubuntu.com/questions/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171 Debianカーネルと比較して、Ubuntuカーネルには欠落している構成が必要です。 Debianカーネルの障害は、私がUbuntuで行ったように、CONFIG_VIRTIO_BLK=y
などの追加オプションを使用してDebianカーネルをコンパイルすることで修正できる可能性があります。
#!/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 \
;
ターミナルから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
wget
およびcurl
はデフォルトではインストールされませんping
はデフォルトではQEMUから機能しません: QEMUゲストから外部URLにpingする方法?Ubuntu 18.04ホストでテスト済み。
Debianカーネルを使用しようとするとどうなりますか
TODOが理解して修正します。上記のLinuxカーネルのコンパイルをDebianパッケージのLinuxカーネルに置き換えた場合:
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
です)が生成されます)。
コメントはできませんが、あなたの「ガイド」はMinimal Ubuntu 16サムドライブを作成するのに驚異的でした。私が変更したのはdebootstrapだけで、ネットワークを手動で機能させる必要がありました(networkd
)。
私のdebootstrap行は:
#> Sudo debootstrap --components=main,contrib,nonfree --variant=minbase \
--include=linux-generic,grub-pc --Arch=i386 xenial /mnt