0

TL;DR : I try to tell my kernel on a Qemu machine to start /sbin/init from an NFS server but I have a kernel panic (not syncing: VFS: Unable to mount root fs on unknown-block(2,0)). I used the following command for that :

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

A more detailed explanation :

I compiled a kernel (linux-4.8.6):

make defconfig
make -j8
cp arch/x86/boot/bzImage /tmp

I also have a disk mydisk.qcow2 create by qemu-img and which has one ext4 partition in which I only have /sbin/init. Where init is the result of gcc -static -o init init.c and where init.c is :

#include <stdio.h>
#include <unistd.h>
int main()
{
  printf("Hello init\n");
  while(1)
    sleep(100);
  return 0;
}

Then I run qemu (kvm) :

kvm \
  -kernel /tmp/bzImage \
  -append "root=/dev/sda1 rw" \
  -hda mydisk.qcow2 \
  -m 6G

and all is working as expected : the kernel start and start init.



Then I added a dhcp and nfs server on another VM :

qemu-DHCP-and-NFS-server ------- (tap0)[ host bridge (br0) ](tap1) --------- qemu client

  1. Host bridge br0 contains two interfaces : tap0 connected to qemu server and tap1 connected to the client. the bridge ip is 10.0.2.2/24 with mac=5e:50:67:79:96:f0 the qemu-DHCP-and-NFS-server ip is 10.0.2.3/24 with mac=52:54:00:12:34:56

  2. On qemu-DHCP-and-NFS-server the init binary is in /serverNFS/sbin/init and /etc/export looks like :

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

just for testing I run a ubuntu live cd on the qemu client :

  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

and try to mount the nfs partion :

# mkdir /tmp/nfs
# mount.nfs 10.0.2.3:/serverNFS /tmp/nfs
# ls /tmp/nfs/sbin
init

OK so DHCP and NFS works !!


Now I stop qemu client and start it again with :

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

On the boot, the kernel start and I can see things like:

...
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

...

But at the end I have a kernel panic - "not syncing : VFS: Unable to mount root fs

It look likes I have an issue with my nfs server but I can't find why. Do you have any idea?

Just one more precision : I don't want to add '-initrd' (or explain why it is absolutly necessary). All things in the kernel configuration in File systems -> Network File System are selected (not as module). Also CONFIG_ROOT_NFS, CONFIG_IP_PNP, CONFIG_IP_PNP_BOOTP, CONFIG_IP_PNP_RARP, CONFIG_IP_PNP_DHCP are all selected.

Please tell me if you want some other precisions.

1 Answers1

0

The issue is actually so simple to solve and I'm quite ashamed to not have thought about that before posting (sorry for that !)

A wireshark trace let me know that the kernel is using NFSv2 (even with NFSv3 and NFSv4 compiled in the kernel). (it use NFS with RPC over UDP) But my server only accept nfsv3 or nfsv4. So a solution is to accept nfsv2 :

Users needing to support clients using NFSv2 (for example U-Boot), should set RPCNFSDARGS="-V 2" in /etc/sysconfig/nfs. (from https://wiki.archlinux.org/index.php/NFS#NFSv2_compatibility)

By the way let me know if you know how to force NFSv3 or NFSv4