我想创建一个与 UML 内核一起使用的 rootfs,并且能够使用互联网。我正在使用febootstrap
包:bash
, coreutils
, net-tools
, iputils
。使用后,febootstrap-supermin-helper
我得到了我的rootfs
,但当尝试使用 UML 启动它时,我收到以下错误:
[ 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
构建根
defconfigqemu_x86_64_defconfig
几乎可以工作,除了我必须添加::sysinit:/sbin/mdev -s
到inittab
.我认为这是因为 Buildroot 依赖于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
现在您已进入虚拟机,您可以使用以下命令离开:
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 我不知道如何处理内核模块,因为它们必须针对 UML 而不是 x86 进行编译。第一个问题是insmod
会失败,因为 UML 没有SMP
影响vermagic
,如果你强制 vermagic,就会发生奇怪的事情,比如printk
不打印任何东西。有关的:https://stackoverflow.com/questions/2488625/user-mode-linux-installing-a-module-error
如果您愿意,还可以使用 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 主机上测试。