
Ich möchte ein Root-Dateisystem erstellen, das mit einem UML-Kernel verwendet werden kann und das Internet nutzen kann. Ich habe es febootstrap
mit den Paketen , bash
, coreutils
, net-tools
, verwendet iputils
. Nach der Verwendung febootstrap-supermin-helper
habe ich meins bekommen rootfs
, aber beim Versuch, es mit UML zu booten, bekomme ich diese Fehler:
[ 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
Ich frage mich, welche Pakete dafür notwendig sind rootfs
und ob es sonst noch eine andere Möglichkeit gibt febootstrap
.
Antwort1
Vielleicht könnten Sie PRoot ausprobieren (http://proot.me) als Alternative zu UML. Beide basieren auf ptrace(2), wobei PRoot kein Setup benötigt, um vom Gastsystem aus auf das Internet zuzugreifen:
host$ proot -R ./fedora-18-x86_64/ bash
guest$ wget http://google.fr
...
wobei "./fedora-18-x86_64/" der Inhalt eines Root-Dateisystems ist, das heruntergeladen wurde vonhttp://download.openvz.org/template/precreated/
Antwort2
Buildroot
Die Defconfig hat fast funktioniert, außer dass ich hinzufügen qemu_x86_64_defconfig
musste . Ich denke, das liegt daran, dass Buildroot zum Erstellen auf angewiesen ist .::sysinit:/sbin/mdev -s
inittab
CONFIG_DEVTMPFS_MOUNT
/dev
Rootfs:
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
Dann zur Kernelquelle:
cd /path/to/linux
git checkout v4.9
make mrproper
make defconfig ARCH=um
make ARCH=um
./linux eth0=tuntap,,,192.168.0.254
Jetzt befinden Sie sich in der VM und können diese mit Folgendem verlassen:
poweroff
Das Dateisystem ist persistent, probieren Sie es aus mit:
date >f
und starten Sie neu.
TODO: Netzwerk zum Laufen bringen. Das aktuelle eth0=
ist nur ein Dummy, um zu verhindern, dass Buildroots Initialisierung beim Warten auf das Netzwerkgerät hängen bleibt.
Sie können den Kernel auch schrittweise debuggen, wie hier gezeigt:https://stackoverflow.com/questions/4943857/linux-kernel-live-debugging-how-its-done-and-what-tools-are-used/44669413#44669413
TODO Ich weiß nicht, wie ich mit Kernelmodulen umgehen soll, da sie gegen UML und nicht gegen x86 kompiliert werden müssen. Das erste Problem ist, dass dies insmod
fehlschlägt, weil UML keine SMP
Auswirkungen hat vermagic
, und wenn Sie Vermagic erzwingen, passieren seltsame Dinge, z. B. printk
wird nichts gedruckt. Verwandte Themen:https://stackoverflow.com/questions/2488625/user-mode-linux-installing-a-module-error
Sie können das Image bei Bedarf auch mit QEMU überprüfen:
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
Getestet auf Ubuntu 14.04, Kernel 3.13.0-Host.