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

  1. Мост хоста 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

  2. На 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

Другие вопросы по тегам