NFS内核文档翻译
通过 NFS 挂载根文件系统 (nfsroot)
作者
- 1996 年由 Gero Kuhlmann 编写,gero@gkminix.han.de
- 1997 年由 Martin Mares 更新,mj@atrey.karlin.mff.cuni.cz
- 2006 年由 Nico Schottelius 更新,nico-kernel-nfsroot@schottelius.org
- 2006 年由 Horms 更新,horms@verge.net.au
- 2018 年由 Chris Novakovic 更新,chris@chrisn.me.uk
为了使用无盘系统,例如 X 终端或打印机服务器等,需要将根文件系统放置在非磁盘设备上。这可以是一个 initramfs(参见
《Documentation/filesystems/ramfs-rootfs-initramfs.rst》),一个 ramdisk(参见
《Documentation/admin-guide/initrd.rst》),或者通过 NFS 挂载的文件系统。以下内容描述了如何使用 NFS 作为根文件系统。在本文中,“客户端”指的是无盘系统,“服务器”指的是 NFS 服务器。
启用 nfsroot 功能
要使用 nfsroot,需要在配置过程中将 NFS 客户端支持选为内置。选择后,nfsroot 选项将变为可用,也应将其选中。
在网络选项中,可以选择内核级别的自动配置,以及支持的自动配置类型。选择 DHCP、BOOTP 和 RARP 是安全的。
内核命令行
当内核被引导程序(见下文)加载后,需要告知内核使用哪个根文件系统设备。对于 nfsroot,还需要指定服务器的位置以及要在服务器上挂载为根目录的目录名称。可以通过以下内核命令行参数来实现:
-
root=/dev/nfs
这是必要的,用于启用伪 NFS 设备。请注意,它不是一个真实设备,而是告诉内核使用 NFS 而非真实设备的同义词。 -
nfsroot=[
:] [, ]
如果命令行中未给出nfsroot
参数,则默认使用"/tftpboot/%s"
。:指定 NFS 服务器的 IP 地址。默认地址由 ip 参数(见下文)确定。此参数允许使用不同的服务器进行 IP 自动配置和 NFS。 :服务器上要挂载为根目录的目录名称。如果字符串中包含 "%s",则会被替换为客户端 IP 地址的 ASCII 表示形式。 :标准的 NFS 选项。所有选项用逗号分隔。默认值如下: - port = 由服务器的 portmap 守护进程提供
- rsize = 4096
- wsize = 4096
- timeo = 7
- retrans = 3
- acregmin = 3
- acregmax = 60
- acdirmin = 30
- acdirmax = 60
- flags = hard, nointr, noposix, cto, ac
-
ip=
: : : : : : : : :
该参数告诉内核如何配置设备的 IP 地址,以及如何设置 IP 路由表。它最初被称为 nfsaddrs,但由于现在的引导时 IP 配置独立于 NFS,因此更名为 ip,而旧名称保留为兼容性别名。
如果该参数未出现在内核命令行中,则所有字段均假定为空,并应用以下默认值。通常这意味着内核将尝试使用自动配置来配置所有内容。:可以单独作为 ip 参数的值(无需前面的 ':' 字符)。如果值为 "ip=off" 或 "ip=none",则不进行自动配置,否则将进行自动配置。最常用的用法是 "ip=dhcp"。 :客户端的 IP 地址。默认值:通过自动配置确定。 :NFS 服务器的 IP 地址。如果使用 RARP 确定客户端地址且此参数不为空,则仅接受来自指定服务器的回复。仅在 NFS 根目录下需要。如果缺失且 NFS 根目录未运行,则不会触发自动配置。该值将导出到 /proc/net/pnp,前缀为 "bootserver "(见下文)。默认值:通过自动配置确定,使用自动配置服务器的地址。 :如果服务器位于不同子网,则为网关的 IP 地址。默认值:通过自动配置确定。 :本地网络接口的子网掩码。如果未指定,则根据客户端 IP 地址假设使用分类地址来推导子网掩码。默认值:通过自动配置确定。 :客户端的名称。如果存在 '.' 字符,则第一个 '.' 之前的内容作为客户端主机名,之后的内容作为其 NIS 域名。可以由自动配置提供,但其缺失不会触发自动配置。如果指定且使用 DHCP,则用户提供的主机名(以及 NIS 域名,如果存在)将包含在 DHCP 请求中;这可能会为客户机创建或更新 DNS 记录。默认值:使用客户端 IP 地址的 ASCII 表示形式。 :要使用的网络设备名称。默认值:如果主机只有一个设备,则使用该设备;否则通过自动配置确定。这是通过向所有设备发送自动配置请求,并使用第一个收到回复的设备来完成的。 :用于自动配置的方法。在指定多种自动配置协议的选项中,将使用所有协议发送请求,并使用第一个回复的协议。只有已编译到内核中的自动配置协议才会被使用,无论此选项的值如何: - off 或 none:不使用自动配置(改为使用静态 IP 分配)
- on 或 any:使用内核中可用的任何协议(默认)
- dhcp:使用 DHCP
- bootp:使用 BOOTP
- rarp:使用 RARP
- both:使用 BOOTP 和 RARP,但不使用 DHCP(为向后兼容保留的旧选项)
如果使用 dhcp,则可以通过以下格式使用客户端标识符:"ip=dhcp,client-id-type,client-id-value"。默认值:any。
:主域名服务器的 IP 地址。该值将导出到 /proc/net/pnp,前缀为 "nameserver "(见下文)。默认值:如果不使用自动配置,则为 None;如果使用自动配置,则自动确定。 :次域名服务器的 IP 地址。参见 。 :网络时间协议(NTP)服务器的 IP 地址。该值将导出到 /proc/net/ipconfig/ntp_servers,但除此之外未被使用(见下文)。默认值:如果不使用自动配置,则为 None;如果使用自动配置,则自动确定。
配置完成后(无论是手动还是自动),会以以下格式创建两个文件;如果配置后相应值为空,则省略行:- /proc/net/pnp:
-
PROTO: <DHCP|BOOTP|RARP|MANUAL>(取决于配置方法)
- domain
(如果自动配置,则为 DNS 域名) - nameserver
(主域名服务器 IP) - nameserver
(次域名服务器 IP) - nameserver
(第三域名服务器 IP) - bootserver
(NFS 服务器 IP)
-
- /proc/net/ipconfig/ntp_servers:
(NTP 服务器 IP) (NTP 服务器 IP) (NTP 服务器 IP)
和 (在 /proc/net/pnp 中)以及 和 (在 /proc/net/ipconfig/ntp_servers 中)在自动配置期间请求;它们不能作为 "ip=" 内核命令行参数的一部分指定。
由于 "domain" 和 "nameserver" 选项被 DNS 解析器识别,因此在使用 NFS 根文件系统的系统上,通常将 /etc/resolv.conf 链接到 /proc/net/pnp。
注意,内核不会与它发现的任何 NTP 服务器同步系统时间;这是用户空间进程的责任(例如,initrd/initramfs 脚本在挂载真实根文件系统之前,将 /proc/net/ipconfig/ntp_servers 中列出的 IP 地址传递给 NTP 客户端,如果真实根文件系统在 NFS 上)。
-
nfsrootdebug
该参数启用调试消息,使其在启动时出现在内核日志中,以便管理员可以验证是否将正确的 NFS 挂载选项、服务器地址和根路径传递给 NFS 客户端。 -
rdinit=<可执行文件>
管理员可以使用此命令行参数指定包含启动系统初始化程序的文件。该参数的默认值为 "/init"。如果指定的文件存在且内核可以执行它,则与根文件系统相关的内核命令行参数(包括 'nfsroot=')将被忽略。
关于挂载根文件系统的流程描述,可以在《Documentation/driver-api/early-userspace/early_userspace_support.rst》中找到。
引导加载程序
可以使用不同的方法将内核加载到内存中,这取决于可用的各种设施:
-
使用 syslinux 从软盘启动
在构建内核时,使用 zdisk 或 bzdisk 构建目标是一种简单的方法,它们分别使用 zimage 和 bzimage 镜像。这两个目标都接受 FDARGS 参数,可用于设置内核命令行。
例如:make bzdisk FDARGS="root=/dev/nfs"
注意,运行此命令的用户需要对软盘驱动器设备 /dev/fd0 有访问权限。
关于 syslinux 的更多信息,包括如何为预构建的内核创建启动磁盘,请参见 Syslinux Wiki。
注意:以前可以通过 dd 将内核直接写入软盘,使用 rdev 配置启动设备,并使用生成的软盘启动。Linux 不再支持这种启动方式。 -
使用 isolinux 从 CD-ROM 启动
在构建内核时,使用 isoimage 构建目标是一种简单的方法,它使用 bzimage 镜像。与 zdisk 和 bzdisk 类似,此目标也接受 FDARGS 参数,可用于设置内核命令行。
例如:make isoimage FDARGS="root=/dev/nfs"
生成的 ISO 镜像将位于 arch/
/boot/image.iso,可以使用 cdrecord 等多种工具将其写入 CD-ROM。
例如:cdrecord dev=ATAPI:1,0,0 arch/x86/boot/image.iso
关于 isolinux 的更多信息,包括如何为预构建的内核创建启动磁盘,请参见 Syslinux Wiki。
-
使用 LILO
使用 LILO 时,可以在 LILO 配置文件中使用 'append=' 指令指定所有必要的命令行参数。
但是,要使用 'root=' 指令,还需要创建一个虚拟根设备,该设备在运行 LILO 后可以删除。
例如:mknod /dev/boot255 c 0 255
有关配置 LILO 的信息,请参阅其文档。
-
使用 GRUB
使用 GRUB 时,只需在内核规范后附加内核参数:kernel。 -
使用 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 <相对于 /tftpboot 的相对路径>" 指定。通过将 nfsroot 参数添加到 "append" 行,将其传递给内核。通常会将串行控制台与 pxelinux 结合使用,更多信息请参见《Documentation/admin-guide/serial-console.rst》。
关于 isolinux 的更多信息,包括如何为预构建的内核创建启动磁盘,请参见 Syslinux Wiki。