Mounting the root filesystem via NFS (nfsroot)

英文原文位于inux内核源代码中的"Documentation/filesystems/nfs/nfsroot.txt"。

1996年由Gero Kuhlmann <gero@gkminix.han.de>初次编写,

1997年经Martin Mares <mj@atrey.karlin.mff.cuni.cz>,

2006年经Nico Schottelius <nico-kernel-nfsroot@schottelius.org>和Horms <horms@verge.net.au>更新。

为了使用一个无磁盘的系统(例如一个X终端或打印机),将根文件系统存放在非磁盘设备是必要的。它可以是通过NFS挂载的一个initramfs文件(参考Documentation/filesystems/ramfs-rootfs-initramfs.txt),或者一个ramdisk文件(参考Documentation/initrd.txt)或者一个文件系统。以下内容描述了如何通过NFS获取linux的根文件系统来启动系统。下文的客户端('client')表示无磁盘系统,服务器端('server')表示NFS服务器。

1.)启动nfsroot功能

为了使用nfsroot功能,在编译配置时,NFS客户端必须被选择为内置(built-in, 非模块)文件系统。NFS客户端被设置为内置,nfsroot选项将变为可选项,选择后才支持nfsroot功能(译者注:在没有将NFS客户端设置为内置文件系统时,nfsroot选项是不可见的)。

对于网络配置选项,选择内核自动配置,以及相应的自动配置类型。将DHCP,BOOTP和RARP三种类型全部选择上是最靠谱的。

2.)内核命令行参数

当引导加载程序(bootloader)加载一个linux内核时,需要知道使用的是什么根文件设备(root fs device)。在使用nfsroot时,需要知道从哪儿获取服务器地址和可挂载为根文件的目录名。可以通过以下内核命令行参数来设置nfsroot:

root=/dev/nfs

启动虚拟NFS设备(pseudo-NFS-device)所必需的参数。需要注意,/dev/nfs不是一个真实的设备,它只是一个告诉内核使用NFS功能来替换真实设备的一个符号。

nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

如果在内核启动命令行中没有指定'nfsroot'参数,内核将使用默认的"/tftpboot/%s"参数。

<server-ip> 指定NFS服务器的IP地址。默认IP地址是从'ip'参数中获取的(参见下一个参数)。该参数允许IP自动配置与NFS使用不同的服务器。

<root-dir> 将挂载为根文件系统的服务器端目录名。如果有"%s"标记在配置字符串中,它将被ASCII表示的客户端IP地址所替代。

<nfs-options> 规范的NFS选项。所有选项通过逗号(',')来分隔。默认使用以下配置,

port

由服务器端的端口映射进程所给定

(centos7以前版本叫portmap,以后叫rpcbind)

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>

该行参数告诉内核如何配置设备的IP地址以及如何配置IP路由表。起初被叫做'nfsaddrs',但是现在启动时IP配置已经独立于NFS,所以被重命名为'ip'并且为了兼容性旧名称'nfsaddrs'将作为别名存在。

如果没有在内核命令行参数中设置该参数,所有项将被视为空处理,所有默认值将按后面具体项中说明。通常是内核尝试自动配置所有项。

其中<autoconf>项可以单独地存在于'ip'参数中(没有任何的':')。如果值被设置为"ip=off"或者"ip=none",将不会被替换成自动配置,否则会被替换为自动配置。使用得最多的设置是"ip=dhcp"。

<client-ip> 客户端的IP地址。默认:通过自动配置获取。

<server-ip> NFS服务器的IP地址。如果使用RARP来获取客户端地址,并且该参数不为空时所指定的服务器才会被接受。

只有NFS root需要该参数。如果没有设置该参数或者不是使用的NFS root,那么自动配置将不会被触发。

默认:通过自动配置获取。将使用用于自动配置的服务器地址。

<gw-ip> 如果服务器位于不同的网段,那么需要通向IP地址相应的网关。默认:通过自动配置获取。

<netmask> 本地网络设备的子网掩码。如果没有指定,设备的子网掩码将从客户端IP地址的派生地址获取。默认:通过自动配置获取。

<hostname> 客户端名。可以通过自动配置来支持,但是如果不指定将不会触发自动配置。如果指定了该参数并且是使用的DHCP方式,用户指定的hostname将被应用于DHCP请求中进行DNS记录的更新。默认:所使用客户端IP地址的ASCII形式。

<device> 所使用的网络设备名。默认:如果本地只有一个设备,那么将直接使用它。否则将通过自动配置决定。它将通过所有设备发送自动配置请求,然后使用最先收到回复的那个设备。

<autoconf> 使用自动配置。如果设备了多个自动配置协议(DHCP/BOOTP/RARP),将使用所有协议都发送自动配置请求,然后使用最先收到回复的那个协议。

该选项中设置的协议只有被编译进内核的才能够使用。

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

<dns0-ip> IP地址的第一个命名服务器。从/proc/net/pnp(在嵌入式系统中通常链接到/et/resolv.conf)中获取导出的值。

<dns1-ip> IP地址的第二个命名服务器。同上。

nfsrootdebug

该选项将开启内核输出调试信息。在启动时,管理员可以通过输出的信息来检查传入NFS客户端的NFS挂载选项,服务器地址和根路径等是否正确。

rdinit=<executable file>

管理员可以通过该参数指定包含有系统初始化程序的文件名。默认值是"/init"。如果指定的文件有效,并且内核可以运行,那么根文件系统相关的内核命令行参数(包括'nfsroot=')将被忽略。

[译者注] 该方法已经过时,dracut支持但不推荐使用。更多详情可参考man dracut.cmdline中关于NFS的描述。

关于处理挂载根文件系统的描述可以在该文件中获得:Documentation/early-userspace/README

3.) 引导程序

加载内核程序到内存有很多不同的方法。主要依赖于可供选择的设施:

3.1) 使用syslinux从软盘启动

在编译内核时,使用syslinux来创建一个可启动软盘的简单方式是,使用zdisk或者bzdisk来生成使用zimage或bzimage镜像的目标文件。两种目录文件都可以接收FDARGS参数,该参数可以用于指定内核命令行参数。例如:

make bzdisk FDARGS="root=/dev/nfs"

注意,运行该命令进需要访问磁盘设备/dev/fd0。

关于syslinux的更多详情以及如何创建基于磁盘的预先编译内核可参考http://syslinux.zytor.com/。

注意:以前可以通过dd命令将内核直接写入到软盘,通过rdev管理启动设备,然后使用生成的软盘启动系统。linux不再支持该方法的内核启动。

3.2) 使用isolinux从cdrom启动

当编译内核时,使用isolinux来创建一个可启动cdrom的简单方式是,使用bzimage镜像的isoimage目标文件。与zdisk和bzdisk类似,目录文件可接收FDARGS参数,该参数可以用于指定内核命令行参数。例如:

make isoimage FDARGS="root=/dev/nfs"

生成的iso镜像文件位于arch/<ARCH>/boot/image.iso。可以通过类似cdrecord的工具将iso文件写入到cdrom。例如:

cdrecord dev=ATAPI:1,0,0 arch/x86/boot/image.iso

关于isolinux的更多详细信息,以及如何创建基于磁盘的预先编译内核可参考http://syslinux.zytor.com/。

3.3) 使用LILO

当使用LILO时,所有需要的命令行参数可以通过位于LILO配置文件中的'append='项进行设置。

但是,为了使用'root='来指定内核命令行启动参数,仍然需要创建一个临时的root设备,它可以在LILO运行后被删除。

mknod /dev/boot255 c 0 255

关于配置LILO的详细信息可以参考其相关的文件。

3.4) 使用GRUB

当使用GRUB时,内核参数可以简单地添加到内核设置的后面:

kernel <kernel> <parameters>

3.5) 使用loadlin

loadin可以用于从一个DOS命令提示符启动Linux,而不需要挂载本地磁盘作为root。虽然该方法没有经过作者的确认,但是它的配置方式应该与LILO相类似。

更多详情请参考loadin的文档。

3.6) 使用启动ROM

这可能是无磁盘启动最优雅的方式。可以使用TFTP协议来加载基于启动ROM的内核。该文档作者不知道任何支持通过网络加载linux的非商业启动ROM。但是,有启动ROM的两种自由实现,netboot-nfs和etherboot,两者都位于sunsite.unc.edu并且两者都包含了无磁盘linux客户端启动的所有信息。

3.7) 使用pxelinux

Pxelinux可以通过PXE引导程序(众多现代网卡都包含该功能)启动linux。

当使用pxelinux时,内核镜像可以通过"kernel <relative-path-below /tftpboot>"进行指定。nfsroot参数将通过"append"项被添加到内核中。通常使用串行控制台与pxelinux进行连接,更多详情请参考Documentation/serial-console.txt。

关于pxelinux的更多详情以及如何创建基于磁盘的预先编译内核可参考http://syslinux.zytor.com/。

4.) 致谢

内核中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>的帮助。

转载于:https://www.cnblogs.com/kinglongmee/p/5043656.html

通过NFS(nfsroot)启动linux系统相关推荐

  1. 命令行启动ssh_如何在虚拟机中正确的第一次启动Linux系统

    在小编的上一篇文中,有介绍过如何在Virtualbox虚拟机中安装Linux CentOS系统,今天我们尝试第一次启动Linux系统,为保证虚拟机的流畅运行,建议将分辨率设置为 800x600. 1. ...

  2. 如何让原本的密码只执行一次_如何在虚拟机中正确的第一次启动Linux系统

    在小编的上一篇文中,有介绍过如何在Virtualbox虚拟机中安装Linux CentOS系统,今天我们尝试第一次启动Linux系统,为保证虚拟机的流畅运行,建议将分辨率设置为 800x600. 1. ...

  3. windows启动linux系统,windows 10 启动linux系统

    windows 10 启动linux系统 [2021-02-18 21:26:20]  简介: 系统运维 Windows中tocmat设置为服务开机启动一 安装Java,tomcat安装jdk,解压t ...

  4. 在grub命令行中启动linux系统

    在grub命令行中可以使用linux.initrd.boot命令启动linux操作系统.注意,以下命令可能仅适用于启动linux系统,想要启动其他操作系统(FreeBSD, NetBSDand Ope ...

  5. 龙芯可以运行linux吗,开源的龙芯主板可顺利启动Linux系统

    软件开源很常见,但是你见过硬件开源吗?国内也有.据了解,龙芯俱乐部和广州龙芯经过3个版本的研发,龙芯1C开源主板已经调试成功,可以顺利启动Linux系统了. 开源龙芯主板是一款以开源方式推广的龙芯嵌入 ...

  6. linux nfs挂载域名,Linux系统挂载NFS的方法

    NFS(网络文件系统),这是在 Linux 系统上常用的文件共享方式.也可以做为作为一个远程存储使用.下面是学习啦小编收集整理的Linux 系统挂载 NFS,希望对大家有帮助~~ Linux 系统挂载 ...

  7. linux arm. 快速启动,教你如何快速启动Linux 系统

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 一. 简介Linux 系统以其开源的特性得到了广泛的应用,在嵌入式系统编程中也占有越来越大的份量.Linux 系统安全可靠.内核可定制.源代码开放等这些都 ...

  8. 在U盘下安装ubuntu系统,从U盘启动Linux系统

    如果我们直接在我们的硬盘上安装Linux系统的话,那么Linux的GRUB就会覆盖window的启动引导项.并且不方便携带.所以我就想在U盘上安装一个ubuntu的系统,可以在任意电脑上启动. 准备工 ...

  9. win8u盘启动linux系统,在Mac系统下制作Windows启动U盘(失败案例)

    2018年12月月末有人叫我帮他装个win10,在windows系统下搞个启动U盘是真的方便各种方法都有,但是我手头就一个U盘.一个win10镜像文件和一个自己的IBP,而且倔强的我不愿意在自己电脑里 ...

最新文章

  1. 如何将json格式的string字符串转换为string数组
  2. 深度学习生态圈【详解深度学习工具Keras】
  3. 检索所有课程都选修的的学生的学号与姓名
  4. JavaScript-2(数组与字符串的方法)
  5. 455. Assign Cookies - LeetCode
  6. Java8 ThreadLocal 源码分析
  7. linux:date 命令
  8. Java 类在 Tomcat 中是如何加载的?
  9. vim 删除当前词_vim 可视话模式(即删除一列和多列)
  10. hive时间函数入门
  11. js控制input控件只能输入数字
  12. Git------GitHub官网
  13. 慕课网仿去哪儿项目笔记--(一)-初始化准备
  14. android 加密dex,App加固(dex加密)
  15. Nahimic应用程序初始化失败
  16. 个人任务五——事后诸葛亮项目回顾
  17. js 前端实现打印功能
  18. 一个IT从业者的课外读物___养生锻炼篇
  19. 陈表达VBA笔记---VBA一键删除空白行
  20. 异步赠书:12月《Go Web编程》领航

热门文章

  1. 脑机接口科普0003——Hans Berger
  2. 常见的海外广告投放平台,海外社交广告平台的开户流程与要求
  3. 大数据背后的神秘公式:贝叶斯公式
  4. 2018网站优化人员不同阶段在做哪些事
  5. springboot低版本整合knife4j
  6. 码农和CTO的差距到底在哪?
  7. linux下的iic驱动程序,实战经验吐血推荐:怎样在Linux环境下轻松实现基于I2C总线的EEPROM驱动程序...
  8. 在windows下安装docker并使用
  9. Windows下Openpose试运行环境配置流程
  10. 关于flask入门教程-ajax+echarts实现热力图