
UML カーネルで使用し、インターネットを使用できる rootfs を作成したいと考えています。febootstrap
パッケージ: bash
、、、を使用していました。 を使用した後、を取得しましたが、UML で起動しようとすると、次のエラーが発生しますcoreutils
。net-tools
iputils
febootstrap-supermin-helper
rootfs
[ 4.340000] systemd[1]: systemd-logind.service holdoff time over, scheduling restart.
[ 4.340000] systemd[1]: dbus.service start request repeated too quickly, refusing to start.
[ 4.340000] systemd-logind[638]: Failed to get system D-Bus connection: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
[ 4.340000] systemd-logind[638]: Failed to fully start up daemon: Connection refused
rootfs
にはどのパッケージが必要なのか、また、 以外に方法はあるのか疑問に思っていますfebootstrap
。
答え1
PRoot を試してみるのもいいかもしれません (http://proot.me) は UML の代替として使用できます。どちらも ptrace(2) に基づいていますが、PRoot ではゲスト システムからインターネットにアクセスするための設定は必要ありません。
host$ proot -R ./fedora-18-x86_64/ bash
guest$ wget http://google.fr
...
ここで「./fedora-18-x86_64/」は、以下からダウンロードしたrootfsの内容です。http://download.openvz.org/template/precreated/
答え2
ビルドルート
defconfigはほぼ機能しましたが、をqemu_x86_64_defconfig
追加する必要がありました。これは、Buildroot がを作成するために に依存しているためだと思います。::sysinit:/sbin/mdev -s
inittab
CONFIG_DEVTMPFS_MOUNT
/dev
ルート:
git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout 2017.02
make qemu_x86_64_defconfig
# Custom inittab.
echo 'BR2_ROOTFS_OVERLAY="rootfs_overlay"' >>.config
make olddefconfig
mkdir -p rootfs_overlay/etc
printf '
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -o remount,rw /
::sysinit:/bin/mkdir -p /dev/pts
::sysinit:/bin/mkdir -p /dev/shm
::sysinit:/bin/mount -a
::sysinit:/sbin/mdev -s
::sysinit:/bin/hostname -F /etc/hostname
::sysinit:/etc/init.d/rcS
console::respawn:/sbin/getty -n -L console 0 vt100
::ctrlaltdel:/sbin/reboot
::shutdown:/etc/init.d/rcK
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
' > rootfs_overlay/etc/inittab
# Build image.
make BR2_JLEVEL=$(($(nproc)-2))
cp output/images/rootfs.ext2 /path/to/linux
次にカーネルソースで:
cd /path/to/linux
git checkout v4.9
make mrproper
make defconfig ARCH=um
make ARCH=um
./linux eth0=tuntap,,,192.168.0.254
これで VM 内に入り、次のコマンドで終了できます。
poweroff
ファイルシステムは永続的です。次のように試してください。
date >f
再起動します。
TODO: ネットワークを動作させます。現在の状態eth0=
は、Buildroot の init がネットワーク デバイスを待機して停止するのを防ぐためのダミーです。
次のようにカーネルをステップ デバッグすることもできます。https://stackoverflow.com/questions/4943857/linux-kernel-live-debugging-how-its-done-and-what-tools-are-used/44669413#44669413
TODO カーネル モジュールは x86 ではなく UML に対してコンパイルする必要があるため、カーネル モジュールの扱い方がわかりません。最初の問題は、 UML には が影響しinsmod
ないため が失敗し、vermagic を強制すると、何も印刷されないなどの奇妙なことが起こることです。関連:SMP
vermagic
printk
https://stackoverflow.com/questions/2488625/user-mode-linux-モジュールのインストールエラー
必要に応じて、QEMU を使用してそのイメージを検査することもできます。
qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user
Ubuntu 14.04、カーネル 3.13.0 ホストでテスト済み。