Arch-Linux

archlinux efi netboot 核心“ip”不起作用?systemd ‘啟動 Switch Root 失敗。’

  • December 10, 2017

我正在嘗試使用指南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

我嘗試了iphttps://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

在同時載入linuxinitrd時,繼續導致

[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 引導後沒有網路活動,也就是說,當linuxinitrd載入時,客戶端和伺服器之間沒有更多的通信。

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)

核心支持nfsrootip

鑑於沒有網路活動,我假設ipornfsroot沒有被執行。

事實上,我遇到的問題在Build the kernel with NFS support but not getting /dev/nfs問題中有所描述。

該問題的答案指出(Andreas Wiese 2014 年 7 月 1 日 14:58)

…確保將 NFS 支持內置到您的核心二進製文件中,而不是作為一個模組(或有一個initramfs,它負責這個)。網路驅動程序也是如此:您很可能希望將乙太網 NIC 的驅動程序內置到核心映像中,否則您必須從initramfs.

簡而言之,有幾種可能性:

  1. 按照上面的連結告訴您:已root=/dev/nfs設置,提供正確的nfsroot參數並通過參數告訴您的核心您的網路配置ip(這將是確保它完全正常工作的最佳方法,即以排除配置錯誤的 DHCP 伺服器)。

2.擁有CONFIG_IP_PNPCONFIG_IP_PNP_DHCP啟用並設置一個 DHCP 守護程序來告訴您的客戶端使用哪個 IP 地址以及在哪裡可以找到它的 NFS-root。

  1. 建構一個 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

我剛剛發現

附加資訊

這可能相關也可能不相關。

使用“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_nfs4mkinitcpio.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}}

引用自:https://unix.stackexchange.com/questions/408477