NFS /sbin/init 與 Qemu 沒有 initrd
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 客戶端
- 主機橋 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
- 在 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