Kvm-Virtualization

NFS /sbin/init 與 Qemu 沒有 initrd

  • November 4, 2016

TL;DR:我試圖告訴 Qemu 機器上的核心從 NFS 伺服器啟動 /sbin/init,但我有核心恐慌(不同​​步:VFS:無法在未知塊上掛載根 fs(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。



然後我在另一個 VM 上添加了 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 qemu-DHCP-and-NFS-server ip 是 10.0.2.3/24,mac=52:54:00:12 :34:56
  2. 在 qemu-DHCP-and-NFS-server 上,init二進製文件位於 /serverNFS/sbin/init 和 /etc/export 中,如下所示:
/serverNFS      *(rw,no_root_squash,async,insecure)

只是為了測試,我在 qemu 客戶端上執行了一個 ubuntu live cd:

 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。

如果您需要其他精度,請告訴我。

這個問題實際上很容易解決,我很慚愧在發布之前沒有考慮到這一點(對不起!)

一個wireshark 跟踪讓我知道核心正在使用NFSv2(即使在核心中編譯了NFSv3 和NFSv4)。(它使用 NFS 和 RPC over UDP)但我的伺服器只接受 nfsv3 或 nfsv4。所以一個解決方案是接受 nfsv2 :

需要支持使用 NFSv2 的客戶端(例如 U-Boot)的使用者,應在 /etc/sysconfig/nfs 中設置 RPCNFSDARGS="-V 2"。(來自https://wiki.archlinux.org/index.php/NFS#NFSv2_compatibility

順便告訴我你是否知道如何強制 NFSv3 或 NFSv4

引用自:https://serverfault.com/questions/812510