透過NFS(nfsroot)掛載根檔案系統¶
- 作者:
由 Gero Kuhlmann <gero@gkminix.han.de> 於 1996 年編寫
由 Martin Mares <mj@atrey.karlin.mff.cuni.cz> 於 1997 年更新
由 Nico Schottelius <nico-kernel-nfsroot@schottelius.org> 於 2006 年更新
由 Horms <horms@verge.net.au> 於 2006 年更新
由 Chris Novakovic <chris@chrisn.me.uk> 於 2018 年更新
為了使用無盤系統,例如X終端或列印伺服器,根檔案系統必須存在於非磁碟裝置上。這可以是initramfs(參見Ramfs、rootfs和initramfs),ramdisk(參見使用初始RAM盤(initrd))或透過NFS掛載的檔案系統。以下文字描述瞭如何將NFS用於根檔案系統。在本文的其餘部分中,“客戶端”指無盤系統,“伺服器”指NFS伺服器。
啟用nfsroot功能¶
為了使用nfsroot,在配置過程中需要選擇將NFS客戶端支援作為內建功能。一旦選擇此項,nfsroot選項將可用,也應將其選中。
在網路選項中,可以選擇核心級別的自動配置,以及支援的自動配置型別。同時選擇DHCP、BOOTP和RARP是安全的。
核心命令列¶
當核心被引導載入程式(見下文)載入後,需要告知它使用哪個根檔案系統裝置。對於nfsroot,還需要告知伺服器位置以及伺服器上要掛載為根目錄的名稱。這可以透過使用以下核心命令列引數來建立:
- root=/dev/nfs
這是啟用偽NFS裝置所必需的。請注意,它不是一個真實的裝置,而只是一個告訴核心使用NFS而非真實裝置的同義詞。
- nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
如果命令列中未提供nfsroot引數,將使用預設值
"/tftpboot/%s"。- <server-ip> 指定NFS伺服器的IP地址。
預設地址由ip引數(見下文)決定。此引數允許為IP自動配置和NFS使用不同的伺服器。
- <root-dir> 伺服器上要掛載為根目錄的名稱。
如果字串中存在“%s”標記,它將被客戶端IP地址的ASCII表示替換。
- <nfs-options> 標準NFS選項。所有選項用逗號分隔。
使用以下預設值:
port = as given by server portmap daemon rsize = 4096 wsize = 4096 timeo = 7 retrans = 3 acregmin = 3 acregmax = 60 acdirmin = 30 acdirmax = 60 flags = hard, nointr, noposix, cto, ac
- ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>
此引數告訴核心如何配置裝置的IP地址以及如何設定IP路由表。它最初被稱為nfsaddrs,但現在啟動時的IP配置獨立於NFS工作,因此它被重新命名為ip,舊名稱保留作為相容性別名。
如果核心命令列中缺少此引數,則所有欄位都假定為空,並應用下面提到的預設值。通常這意味著核心會嘗試使用自動配置來配置所有內容。
<autoconf>引數可以單獨作為ip引數的值出現(前面不帶所有‘:’字元)。如果值為“ip=off”或“ip=none”,則不會進行自動配置,否則將進行自動配置。最常見的用法是“ip=dhcp”。- <client-ip> 客戶端的IP地址。
預設值:透過自動配置確定。
- <server-ip> NFS伺服器的IP地址。
如果使用RARP確定客戶端地址,並且此引數不為空,則只接受來自指定伺服器的回覆。
僅NFS根檔案系統需要。也就是說,如果缺少此引數且NFS根檔案系統未在執行,則不會觸發自動配置。
值將以“bootserver ”為字首匯出到 /proc/net/pnp(見下文)。
預設值:透過自動配置確定。使用自動配置伺服器的地址。
- <gw-ip> 如果伺服器在不同的子網,則為閘道器的IP地址。
預設值:透過自動配置確定。
- <netmask> 本地網路介面的子網掩碼。
如果未指定,則子網掩碼將根據客戶端IP地址(假設為有類地址)推導得出。
預設值:透過自動配置確定。
- <hostname> 客戶端名稱。
如果存在“.”字元,則第一個“.”之前的部分用作客戶端的主機名,之後的部分用作其NIS域名。它可以由自動配置提供,但其缺失不會觸發自動配置。如果指定且使用DHCP,則使用者提供的主機名(以及NIS域名,如果存在)將包含在DHCP請求中;這可能會導致為客戶端建立或更新DNS記錄。
預設值:客戶端IP地址以ASCII表示法使用。
- <device> 要使用的網路裝置名稱。
預設值:如果主機只有一個裝置,則使用該裝置。否則,裝置透過自動配置確定。這是透過向所有裝置傳送自動配置請求,並使用第一個收到回覆的裝置來完成的。
- <autoconf> 自動配置使用的方法。
對於指定多個自動配置協議的選項,將使用所有協議傳送請求,並使用第一個回覆的協議。
無論此選項的值如何,只會使用已編譯到核心中的自動配置協議。
off or none: don't use autoconfiguration (do static IP assignment instead) on or any: use any protocol available in the kernel (default) dhcp: use DHCP bootp: use BOOTP rarp: use RARP both: use both BOOTP and RARP but not DHCP (old option kept for backwards compatibility)如果使用dhcp,客戶端識別符號可以使用以下格式“ip=dhcp,client-id-type,client-id-value”
預設值:any
- <dns0-ip> 主域名伺服器的IP地址。
值將以“nameserver ”為字首匯出到 /proc/net/pnp(見下文)。
預設值:如果未使用自動配置則為無;如果使用自動配置則自動確定。
- <dns1-ip> 輔助域名伺服器的IP地址。
參見 <dns0-ip>。
- <ntp0-ip> 網路時間協議 (NTP) 伺服器的IP地址。
值將匯出到 /proc/net/ipconfig/ntp_servers,但除此之外未被使用(見下文)。
預設值:如果未使用自動配置則為無;如果使用自動配置則自動確定。
配置(無論是手動還是自動)完成後,將建立兩個檔案,格式如下;如果相應值在配置後為空,則省略該行
/proc/net/pnp
#PROTO: <DHCP|BOOTP|RARP|MANUAL> (取決於配置方法) domain <dns-domain> (如果自動配置,則為DNS域) nameserver <dns0-ip> (主域名伺服器IP) nameserver <dns1-ip> (輔助域名伺服器IP) nameserver <dns2-ip> (第三域名伺服器IP) bootserver <server-ip> (NFS伺服器IP)
/proc/net/ipconfig/ntp_servers
<ntp0-ip> (NTP伺服器IP) <ntp1-ip> (NTP伺服器IP) <ntp2-ip> (NTP伺服器IP)
<dns-domain> 和 <dns2-ip>(在 /proc/net/pnp 中)以及 <ntp1-ip> 和 <ntp2-ip>(在 /proc/net/ipconfig/ntp_servers 中)在自動配置期間被請求;它們不能作為“ip=”核心命令列引數的一部分指定。
由於“domain”和“nameserver”選項被DNS解析器識別,因此在使用NFS根檔案系統的系統上,/etc/resolv.conf 通常連結到 /proc/net/pnp。
請注意,核心不會將其發現的任何NTP伺服器同步系統時間;這是使用者空間程序的責任(例如,如果真實根檔案系統在NFS上,initrd/initramfs指令碼會在掛載真實根檔案系統之前將 /proc/net/ipconfig/ntp_servers 中列出的IP地址傳遞給NTP客戶端)。
- nfsrootdebug
此引數啟用在啟動時在核心日誌中顯示除錯訊息,以便管理員可以驗證正確的NFS掛載選項、伺服器地址和根路徑是否傳遞給了NFS客戶端。
- rdinit=<executable file>
為了指定哪個檔案包含啟動系統初始化的程式,管理員可以使用此命令列引數。此引數的預設值為“/init”。如果指定的檔案存在且核心可以執行它,則與根檔案系統相關的核心命令列引數(包括“nfsroot=”)將被忽略。
掛載根檔案系統的過程描述可以在早期使用者空間支援中找到。
引導載入程式¶
要將核心載入到記憶體中,可以使用不同的方法。它們取決於各種可用功能
使用syslinux從軟盤引導
構建核心時,建立使用syslinux的引導軟盤的簡單方法是使用zdisk或bzdisk make目標,它們分別使用zimage和bzimage映象。這兩個目標都接受FDARGS引數,可用於設定核心命令列。
例如
make bzdisk FDARGS="root=/dev/nfs"
請注意,執行此命令的使用者需要有權訪問軟盤驅動器裝置,即 /dev/fd0。
有關syslinux的更多資訊,包括如何為預構建的核心建立引導盤,請參見https://syslinux.zytor.com/
注意
以前,可以直接使用dd將核心寫入軟盤,使用rdev配置引導裝置,並使用生成的軟盤引導。Linux不再支援這種引導方法。
使用isolinux從光碟引導
構建核心時,建立使用isolinux的可引導光碟的簡單方法是使用isoimage目標,它使用bzimage映象。與zdisk和bzdisk類似,此目標接受FDARGS引數,可用於設定核心命令列。
例如
make isoimage FDARGS="root=/dev/nfs"
生成的ISO映象將是 arch/<ARCH>/boot/image.iso。可以使用包括cdrecord在內的各種工具將其寫入光碟。
例如
cdrecord dev=ATAPI:1,0,0 arch/x86/boot/image.iso
有關isolinux的更多資訊,包括如何為預構建的核心建立引導盤,請參見https://syslinux.zytor.com/
使用LILO
使用LILO時,所有必要的命令列引數都可以使用LILO配置檔案中的“append=”指令指定。
但是,要使用“root=”指令,您還需要建立一個虛擬根裝置,該裝置可以在LILO執行後刪除。
例如
mknod /dev/boot255 c 0 255
有關配置LILO的資訊,請參閱其文件。
使用GRUB
使用GRUB時,核心引數只需在核心規範後附加即可:kernel <kernel> <parameters>
使用loadlin
loadlin可用於從DOS命令列引導Linux,而無需將本地硬碟掛載為根目錄。本文作者尚未對此進行徹底測試,但一般來說,應該可以像配置LILO一樣配置核心命令列。
有關更多資訊,請參閱loadlin文件。
使用引導ROM
這可能是引導無盤客戶端最優雅的方式。使用引導ROM,核心透過TFTP協議載入。本文作者不知道有任何支援透過網路引導Linux的商業引導ROM。但是,有兩個免費的引導ROM實現:netboot-nfs和etherboot,它們都可以在sunsite.unc.edu上找到,並且都包含引導無盤Linux客戶端所需的一切。
使用pxelinux
Pxelinux可用於使用許多現代網絡卡上存在的PXE引導載入程式引導Linux。
使用pxelinux時,核心映象使用“kernel <relative-path-below /tftpboot>”指定。nfsroot引數透過新增到“append”行傳遞給核心。通常將序列埠控制檯與pxelinux結合使用,有關更多資訊,請參見Linux序列埠控制檯。
有關isolinux的更多資訊,包括如何為預構建的核心建立引導盤,請參見https://syslinux.zytor.com/
致謝¶
核心中的nfsroot程式碼和RARP支援由 Gero Kuhlmann <gero@gkminix.han.de> 編寫。
IP層自動配置程式碼的其餘部分由 Martin Mares <mj@atrey.karlin.mff.cuni.cz> 編寫。
為了編寫nfsroot的初始版本,我要感謝 Jens-Uwe Mager <jum@anubis.han.de> 的幫助。