Como criar rootfs para modo de usuário Linux no Fedora 18?

Como criar rootfs para modo de usuário Linux no Fedora 18?

Quero criar um rootfs para ser usado com um kernel UML e poder usar a internet. Eu estava usando febootstrapcom pacotes: bash, coreutils, net-tools, iputils. Depois de usar, febootstrap-supermin-helperrecebi o meu rootfs, mas ao tentar inicializá-lo com UML, recebo estes erros:

[    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

Gostaria de saber quais pacotes são necessários rootfse se existe alguma outra maneira além do febootstrap.

Responder1

Talvez você possa tentar PRoot (http://root.me) como uma alternativa à UML. Ambos são baseados em ptrace(2), embora o PRoot não exija nenhuma configuração para obter acesso à Internet do sistema convidado:

host$ proot -R ./fedora-18-x86_64/ bash
guest$ wget http://google.fr
...

onde "./fedora-18-x86_64/" é o conteúdo de um rootfs baixado dehttp://download.openvz.org/template/precreated/

Responder2

Raiz de construção

O qemu_x86_64_defconfigdefconfig quase funcionou, exceto que tive que adicionar ::sysinit:/sbin/mdev -sao arquivo inittab. Acho que isso ocorre porque o Buildroot depende CONFIG_DEVTMPFS_MOUNTpara criar arquivos /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

Então na fonte do kernel:

cd /path/to/linux
git checkout v4.9
make mrproper
make defconfig ARCH=um
make ARCH=um
./linux eth0=tuntap,,,192.168.0.254

Agora você está dentro da VM e pode sair com:

poweroff

O sistema de arquivos é persistente, experimente com:

date >f

e reinicie.

TODO para fazer a rede funcionar. A corrente eth0=é apenas um modelo para evitar que o init do Buildroot pare de esperar pelo dispositivo de rede.

Você também pode depurar o kernel conforme mostrado em:https://stackoverflow.com/questions/4943857/linux-kernel-live-debugging-how-its-done-and-what-tools-are-used/44669413#44669413

TODO Não sei como lidar com módulos do kernel, pois eles devem ser compilados na UML, não no x86. O primeiro problema é que insmodvai falhar porque a UML não tem SMPo que afeta vermagic, e se você forçar o vermagic, coisas estranhas acontecem como printknão imprimir nada. Relacionado:https://stackoverflow.com/questions/2488625/user-mode-linux-installing-a-module-error

Você também pode inspecionar essa imagem com QEMU se preferir:

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

Testado no Ubuntu 14.04, host kernel 3.13.0.

informação relacionada