Назад | Перейти на главную страницу

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-and-NFS-server ------- (tap0) [host bridge (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-and-NFS-сервере init двоичный файл находится в / serverNFS / sbin / init и / etc / export выглядит так:

    /serverNFS      *(rw,no_root_squash,async,insecure)
    

просто для тестирования я запускаю live cd ubuntu на клиенте 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.

Скажите, пожалуйста, если вам нужны другие уточнения.

На самом деле проблему так просто решить, и мне очень стыдно, что я не подумал об этом перед публикацией (извините за это!)

Трассировка wirehark сообщила мне, что ядро ​​использует 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#NFSv2_compatibility)

Кстати, дайте мне знать, знаете ли вы, как заставить NFSv3 или NFSv4