archlinux efi netboot 核心“ip”不起作用?systemd ‘啟動 Switch Root 失敗。’
我正在嘗試使用指南Diskless system for archlinux (4.13.12-1-ARCH)中提供的說明設置無盤節點/工作站/系統。
問題
客戶端成功連接到 TFTP ( atftp ),傳輸所有文件並顯示 GRUB 選擇菜單(相關摘錄自
grub.cfg
):load_video set gfxpayload=keep insmod gzip insmod ext3 insmod net insmod tftp insmod efinet set root=(tftp,192.168.0.101) set prefix=(tftp,192.168.0.101)/netboot/grub linux /netboot/vmlinuz-linux add_efi_memmap root=/dev/nfs rootfstype=nfs nfsroot=192.168.0.101:/srv/[CLIENT OS] nfsrootdebug rw ip=dhcp initrd /netboot/initramfs-linux.img
我嘗試了
ip
(https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt)的各種任務ip=:::::efinet0:dhcp ip=:::::eno1s0:dhcp ip=:::::eth0:dhcp ip=[CLIENT IP]:[SERVER IP]:[GATEWAY IP]:[NETMASK]:[HOSTNAME]:[DEVICE]:dhcp
在同時載入
linux
和initrd
時,繼續導致[FAILED] "Failed to start Switch Root." See 'systemctl status initrd-switch-root.service' for details. You are in emergency mode. After logging in, type "journalctl -xb" to view system logs, "systemctl reboot" to reobot, "systemctl default or ^D to enter into default mode. Press Enter for maintenance (or press Control-D to continue):
故障排除
刪除 add_efi_mmap
而不是
Failed to start Switch Root.
,核心恐慌:[ 1.114386] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,255) [ 1.114458] CPU: 3 PID: 1 Comm: swapper/0 Not tainted 4.13.12-1-ARCH #1 [ 1.114509] Hardware name: ASUSTeK COMPUTER INC. UX51V2A/UX51VZA, BIOS UX51VZA.204 12/03/2012 [ 1.114573] Call Trace: [ 1.114604] dump_stack+0x63/0x8b [ 1.114637] panic+0xe4/0x23d [ 1.114667] mount_block_root+0x1f4/0x2ab [ 1.114703] ? set_debug_rodata+0x17/0x17 [ 1.114737] mount_root+0x6a/0x6d [ 1.114767] prepare_namespace+0x134/0x16c [ 1.114802] kernel_init_freeable+0x1ec/0x205 [ 1.114840] ? rest_init+0xe0/0xe0 [ 1.114872] kernel_init+0xc/0xfc [ 1.114904] ret_from_fork+0x25/0x30 [ 1.114957] Kernel Offset: 0x3000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff) [ 1.115040] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,255)
系統調試
我無法訪問 journalctl。未檢測到鍵盤或系統凍結,因為我既不能按
Enter
也不能^D
繼續。嘗試通過向核心 CLI 添加
systemd.unit=emergency.target
或直接引導進入緊急模式emergency
似乎不起作用。+(UPDATE 2)
mkinitcpio
參數break=premount
不會改變systemd
啟動。網路
使用 Wireshark,在初始 PXE 引導後沒有網路活動,也就是說,當
linux
和initrd
載入時,客戶端和伺服器之間沒有更多的通信。SERVER IP: 192.168.2.101/24 CLIENT IP: 192.168.2.102/24
格魯布
GRUB net_*命令和環境變數似乎表明一切正常;tftp 工作。
net_ls_cards efinet0 [CLIENT NETWORK DEVICE MAC] net_ls_addr efinet0 [CLIENT NETWORK DEVICE MAC] 192.168.2.102 net_ls_routes efinet0:local 192.168.2.0/24 efinet0 efinet0:default 0.0.0.0/0 gw 192.168.2.101 echo $net_default_ip 192.168.2.102 echo $net_default_mac [CLIENT NETWORK DEVICE MAC] echo $net_default_server 192.168.2.101 echo $net_efinet0_ip 192.168.2.102 echo $net_efinet0_mac [CLIENT NETWORK DEVICE MAC] echo $net_efinet0_hostname (empty) echo $net_efinet0_domain (empty) echo $net_efinet0_dhcp_server_name (empty echo $net_efinet0_next_server 192.168.0.101 echo $net_efinet0_root_path 102.168.0.101:/srv/[CLIENT OS] echo $net_efinet0_extensionpath (empty)
核心支持
nfsroot
和ip
鑑於沒有網路活動,我假設
ip
ornfsroot
沒有被執行。事實上,我遇到的問題在Build the kernel with NFS support but not getting /dev/nfs問題中有所描述。
該問題的答案指出(Andreas Wiese 2014 年 7 月 1 日 14:58)
…確保將 NFS 支持內置到您的核心二進製文件中,而不是作為一個模組(或有一個
initramfs
,它負責這個)。網路驅動程序也是如此:您很可能希望將乙太網 NIC 的驅動程序內置到核心映像中,否則您必須從initramfs
.簡而言之,有幾種可能性:
- 按照上面的連結告訴您:已
root=/dev/nfs
設置,提供正確的nfsroot
參數並通過參數告訴您的核心您的網路配置ip
(這將是確保它完全正常工作的最佳方法,即以排除配置錯誤的 DHCP 伺服器)。2.擁有
CONFIG_IP_PNP
和CONFIG_IP_PNP_DHCP
啟用並設置一個 DHCP 守護程序來告訴您的客戶端使用哪個 IP 地址以及在哪裡可以找到它的 NFS-root。
- 建構一個 initramfs,它可以進行正確的配置和 NFS 掛載。
研究archlinux核心
zgrep CONFIG_NFS_FS= /proc/config.gz -> CONFIG_NFS_FS=m zgrep DHCP /proc/config.gz -> (nothing) zgrep _IP_PNP_ /proc/config.gz -> CONFIG_IP_PNP is not set
表示archlinux不支持
ip
用核心編譯。在錯誤報告 (2006) FS#5056 的評論中 - 預設核心已禁用 NFS 根安裝
mkinitcpio 已經支持 netbooting 而無需更改核心
可以將其與對所引用問題中已接受答案的評論進行比較。
大約 10 年以來,核心並沒有直接引導 nfs,而是安裝了一個初始 ramdisk,它重新解釋了核心命令行並從您想要的位置引導。– 彼得 2016 年 6 月 17 日在 13:54
mkinitcpio
來自
lsinitcpio -a
... Created with mkinitcpio 24 Kernel: 4.13.12-1-ARCH Size: 55,63 MiB Compressed with: gzip ... Included modules: ... nfs ... nfsv3 nfsv4 [explicit] ... Included binaries: ... ipconfig ... mount.nsf4 ... nfsmount ... Early hook run order: udev Hook run order: udev net net_nsf4 nbd Cleanup hook order: udev
對網路設備的 mkinitcpio 支持(更新 #1)
雖然應該載入網卡的驅動程序,但我想在閱讀後確定$$ SOLVED $$無盤 - ipconfig:沒有要配置的設備。
將網路模組驅動器放在 /etc/mkinitcpio.conf 中。
MODULES=(atl1c nbd nfsv4)
無論是明確聲明模組還是在客戶端上建構整個模組都
initramfs.img
沒有改變。如果圖像應該在不同的機器上執行,不要使用自動檢測。自動檢測會刪除在目前執行的系統上啟動不需要的所有驅動程序。
從鉤子中移除
autodetect
會產生一個有趣的結果;之前觀察到的刪除add_efi_mmap
時發生的核心恐慌。add_efi_mmap
載入 no- 時刪除autodetect
initramfs
沒有進一步的影響。mkinitcpio 支持
nfs
Archlinux 可能支持也可能不支持 nsf4。
據我所知,這是次要問題;在嘗試掛載 nfs 之前,網路必須工作。
mkinitcpio 支持
ip
我剛剛發現
- mkinitcpio-nfs-utils (0.3-5)包括一個“ipconfig”,
- 有一個mkinitcpio-netconf 0.0.4-2。
附加資訊
這可能相關也可能不相關。
使用“UEFI PXE 引導”而不是“BIOS PXE 引導”的原因是因為 GRUB i386-pc 無法載入 grub.cfg。電腦要麼重新啟動,要麼凍結在“歡迎使用 GRUB!”。並且可能會用彩色像素使螢幕混亂;結果似乎是隨機的。Wireshark 日誌顯示
tftp
有時會載入所有 grub 模組,有時則不會。最後一個日誌條目通常是客戶端請求伺服器網路設備;ARP 60 Who has [SERVER IP]? Tell [CLIENT IP]?
根據 Arch Linux wiki 中關於無盤系統的說明
對於客戶端安裝
在伺服器的子目錄中創建完整的 Arch Linux 安裝。
然後
編輯 $root/etc/mkinitcpio.conf 並將 nfsv4 添加到 MODULES,將 net_nfs4 添加到 HOOKS,並將 /usr/bin/mount.nfs4 添加到 BINARIES
據我了解,只需添加
net_nfs4
到mkinitcpio.conf
. 在尋找答案時,我想不起任何關於必要的鉤子的事情,相反,我最終net
在閱讀其他可能用於 nfs3 的指南的混亂中添加了鉤子。最後我遇到了我們處理在網路 Roshalsky 22 марта 2015 в 16:14上傳入 ArchLinux 。
這篇文章有一個名為We prepare initramfs的部分,一開始是 Arch Linux wiki 熟悉的,
# sed s/nfsmount/mount.nfs4/ "$root/usr/lib/initcpio/hooks/net" > "$root/etc/initcpio/hooks/net_nfs4" # cp $root/usr/lib/initcpio/install/net $root/etc/initcpio/install/net_nfs4
但它在一些關鍵點上有所不同。
首先,編輯 net_nfs4 文件,在 Arch Linux 中是
nano $root/usr/lib/initcpio/install/net_nfs4 build() { add_checked_modules '/drivers/net/' add_module nfsv4? add_binary "/usr/lib/initcpio/ipconfig" "/bin/ipconfig" # Not sure if it is an Arch Linux specific, but nfsmount is correct; # mount.nsf4 causes mkinitcpio during build to throw an error like "file not found". # add_binary "/usr/bin/mount.nfs4" "/bin/mount.nfs4" add_binary "/usr/bin/nfsmount" "/bin/mount.nfs4" add_runscript }
第二,
我們通過更正 mkinitcpio.conf 文件中的行將處理器添加到 initramfs:
nano $root/etc/mkinitcpio.conf HOOKS="base udev net_nfs4"
更新 +(20171210)
試圖解決另一個問題,我在
/usr/lib/initcpio/hooks/net_nfs4
定義的函式nfs_mount_handler
中註意到以下行:mount.nfs4 ${nfs_option:+-o ${nfs_option}} "${nfs_server}:${nfs_path}" "$1"
根據
man mount.nfs4
:SYNOPSIS mount.nfs remotetarget dir [-rvVwfnsh ] [-o options] DESCRIPTION ... remotetarget is a server share usually in the form of servername:/path/to/share. dir is the directory on which the file system is to be mounted. ...
因此,我已將該行更改為:
mount.nfs4 "${nfs_server}:${nfs_path}" "$1" ${nfs_option:+-o ${nfs_option}}