Короче, рабочий скрипт для запуска прыщеядра в qemu с рутфс через virtio-9p и консолью.
CMDLINE='root=/dev/root ro rootfstype=9p rootflags=trans=virtio console=ttyS0 earlyprintk=serial init=/bin/bash'
ROOTFS=~/tmp/rootfs
qemu-system-x86_64 -enable-kvm -M q35 -m 1G \
-kernel arch/x86/boot/bzImage \
-append "${CMDLINE}" \
-fsdev local,id=root,path="${ROOTFS}",security_model=none \
-device virtio-9p-pci,fsdev=root,mount_tag=/dev/root \
-chardev stdio,id=stdio,mux=on \
-serial chardev:stdio \
-mon chardev=stdio \
-display none
А теперь погружаемся в веселую архитектуру за авторством некого финского студента начала 90х и выливаем бочку говна в адрес прыщей: если рут не реальный девайс и не NFS, то им может быть только хуйня с названием "/dev/root" (в данном случае так назван virtio-9p channel). NFS сделана костылем и через пизду. Поправить это некостыльно и малой кровью невозможно, так как init/do_mounts.c представляет собой кашу из говна, легаси и СПЕЦИАЛЬНЫХ СЛУЧАЕВ вроде того же нфс. Судя по гуглу, когда-то оно работало иначе (нормально), но в свежих ядрах все вот так вот. Ресерчить, зачем так, лень.