NFS /sbin/init с Qemu без initrd
TL;DR: я пытаюсь указать моему ядру на компьютере Qemu запустить /sbin/init с сервера NFS, но у меня паника ядра (не синхронизируется: VFS: невозможно смонтировать root fs на unknown-block(2,0)). Для этого я использовал следующую команду:
kvm \
-netdev tap,id=totou,ifname=tap1 -device e1000,netdev=totou,mac=52:54:00:12:34:57 \
-kernel /tmp/bzImage \
-append "root=/dev/nfs rw nfsroot=10.0.2.3:/serverNFS ip=dhcp" \
-m 6G
Более подробное объяснение:
Я скомпилировал ядро (linux-4.8.6):
make defconfig
make -j8
cp arch/x86/boot/bzImage /tmp
У меня тоже есть диск mydisk.qcow2
создать по qemu-img
и который имеет один раздел ext4, в котором у меня есть только /sbin/init. Где init является результатом gcc -static -o init init.c
и где init.c находится:
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("Hello init\n");
while(1)
sleep(100);
return 0;
}
Затем я запускаю QEMU (KVM):
kvm \
-kernel /tmp/bzImage \
-append "root=/dev/sda1 rw" \
-hda mydisk.qcow2 \
-m 6G
и все работает как положено: ядро запускается и запускается init.
Затем я добавил сервер dhcp и nfs на другую виртуальную машину:
qemu-DHCP-и-NFS-сервер ------- (tap0)[мост узла (br0) ](tap1) --------- клиент qemu
Мост хоста br0 содержит два интерфейса: tap0 подключен к серверу qemu и tap1 подключен к клиенту. IP-адрес моста 10.0.2.2/24 с mac=5e:50:67:79:96:f0 IP-адрес qemu-DHCP-и-NFS-сервера равен 10.0.2.3/24 с mac=52:54:00:12:34:56
На qemu-DHCP-и-NFS-сервере
init
бинарный файл находится в /serverNFS/sbin/init и /etc/export выглядит так:/serverNFS *(rw,no_root_squash,async,insecure)
просто для тестирования я запускаю Ubuntu Live CD на клиенте QEMU:
kvm \
-netdev tap,id=totou,ifname=tap1 -device e1000,netdev=totou,mac=52:54:00:12:34:57 \
-cdrom ubuntu-16.04-desktop-amd64.iso \
-m 6G
и попробуйте смонтировать раздел nfs:
# mkdir /tmp/nfs
# mount.nfs 10.0.2.3:/serverNFS /tmp/nfs
# ls /tmp/nfs/sbin
init
Ок так DHCP и NFS работает!!
Теперь я останавливаю клиент qemu и запускаю его снова с:
kvm \
-netdev tap,id=totou,ifname=tap1 -device e1000,netdev=totou,mac=52:54:00:12:34:57 \
-kernel /tmp/bzImage \
-append "root=/dev/nfs rw nfsroot=10.0.2.3:/serverNFS ip=dhcp" \
-m 6G
При загрузке запускается ядро, и я вижу такие вещи, как:
...
Sending DHCP requests ;, OK
IP-Config : Got DHCP answer from 10.0.2.3, my address is 10.0.2.19
IP-Config : Complete:
device=eth0,hwaddr=52:54:00:12:34:57, ipaddr=10.0.2.19, mask=255.255.255.0, gw=10.0.2.2
host=10.0.2.19, domain=, nis-domain=(none)
bootserver=10.0.2.3, rootserver=10.0.2.3, rootpath=/serverNFS
...
Но в конце у меня паника ядра - "не синхронизируется: VFS: невозможно смонтировать root fs
Похоже, у меня проблема с моим сервером NFS, но я не могу найти, почему. Есть ли у вас какие-либо идеи?
Еще одна точность: я не хочу добавлять '-initrd' (или объяснять, почему это абсолютно необходимо). Все вещи в конфигурации ядра в Файловых системах -> Сетевая файловая система выбраны (не как модуль). Также выбраны CONFIG_ROOT_NFS, CONFIG_IP_PNP, CONFIG_IP_PNP_BOOTP, CONFIG_IP_PNP_RARP, CONFIG_IP_PNP_DHCP.
Пожалуйста, скажи мне, если ты хочешь другие точности.
1 ответ
Вопрос на самом деле так просто решить, и мне очень стыдно, что я не подумал об этом до публикации (извините за это!)
Трассировка Wireshark дала мне знать, что ядро использует NFSv2 (даже если NFSv3 и NFSv4 скомпилированы в ядре). (он использует NFS с RPC через UDP) Но мой сервер принимает только nfsv3 или nfsv4. Поэтому решение состоит в том, чтобы принять nfsv2:
Пользователи, которым требуется поддержка клиентов, использующих NFSv2 (например, U-Boot), должны установить RPCNFSDARGS="-V 2" в /etc/sysconfig/nfs. (из https://wiki.archlinux.org/index.php/NFS)
Кстати, дайте мне знать, если вы знаете, как заставить NFSv3 или NFSv4