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:,, arch/x86/boot/image.iso

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

3.3) 使用LILO

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

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

mknod /dev/boot255 c  

关于配置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>的帮助。

通过NFS(nfsroot)启动linux系统的更多相关文章

  1. 虚拟机启动linux系统报错,此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态

    在使用虚拟机启动linux的时候报错,如下: 已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. 此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态. ...

  2. 启动LINUX系统后,进入图形化界面的命令

    1.进入xWindow的命令 $startx回车 或者修改/etc/inittab文件 cd /etc vi inittab 寻找: id:3:initdefault: 改为: id:5:initde ...

  3. 『学了就忘』Linux启动引导与修复 — 72、Linux系统的修复模式(单用户模式)

    目录 1.单用户模式常见的错误修复 2.通过单用户模式修改系统密码 (1)进入grub启动引导程序中 (2)编辑相应的系统启动内容 (3)编辑grub配置文件内容 (4)启动系统 (5)修改root用 ...

  4. 虚拟机安装Linux系统图文教程

    虚拟机安装Linux系统图文教程 | 浏览:523 | 更新:2014-09-16 15:31 1 2 3 4 5 6 7 分步阅读 Linux系统的安装 工具/原料 VMware 9.0 虚拟机 L ...

  5. uboot启动linux的过程

    一.概述 linux内核镜像常见到的有两种形式,zImage和uImage.这两种文件的格式稍有差别,所以启动这两种格式的内核镜像也会有所不同.目前,uboot只支持启动uImage类型的镜像,对zI ...

  6. 手机装linux系统

    第一步: 首先 , 你的手机需要获取root权限. 如果不知道如何获取, 可以到电脑上搜索一下安卓手机root教程. 不同品牌的手机root的方法不同. 也可以到机锋论坛上寻找root的具体方法. 第 ...

  7. 怎样从外网访问内网Linux系统?

    本地安装了一个Linux系统,只能在局域网内访问到,怎样从外网也能访问到本地的Linux系统呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 启动Linux系统 默认Linux系统ssh服务端端 ...

  8. CentOS(五)--Linux系统的分区概念

    一.系统分区 首先先普及一下有关系统分区的一些知识: 硬盘分区有三种,主磁盘分区.扩展磁盘分区.逻辑分区. 一个硬盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个.且主分区+扩展分区总共不能超 ...

  9. linux系统故障分析与排查

    在处理Linux系统出现的各种故障时,故障的症状是最先发现的,而导致这以故障的原因才是最终排除故障的关键.熟悉Linux系统的日志管理,了解常见故障的分析与解决办法,将有助于管理员快速定位故障点.“对 ...

随机推荐

  1. CGAffineTransform

    这个是CoreGraphics框架中的CGAffineTransform类,可用于设定UIView的transform属性.控制视图的缩放.旋转和平移操作.另称仿射变换矩阵. Quartz转换实现原理 ...

  2. Python3.5之TuShare

    这部分是直接搬运过来的,官方网站http://tushare.waditu.com/ TuShare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工 到 数据 ...

  3. redirect问题

    场景如下: 在后台写了一个filter,拦截*.wx的请求,filter内逻辑忽略,最后response.sendRedirect(url)(这个url是相对地址),重定向到另一个页面. 问题来了:一 ...

  4. vue-resource

    代替ajax操作 在mian.js里面引入 import vueResource from 'vue-resource' mian.js会 加载全局js 下面介绍的是基于Vue实例的方式,一般项目只需 ...

  5. C#做上位机软件——绘图并传输给下位机

    拿到任务之后首先分成了几个部分: 1.绘图.学习了GDI+ 2.图片保存. 3.将图片转换成byte[].由于使用Socket通信,只能传输byte[]数据,所以这一步是向下位机传输的关键. 相应地, ...

  6. Particle System(粒子系统)

    粒子系统应用:Unity的粒子系统可以制作烟雾,气流,火焰和各种大气效果.   粒子系统模块介绍:         大部分的属性可以通过曲线控制(见曲线编辑器),颜色属性可以被定义了颜色动画的渐变器控 ...

  7. SQL Server架构 -- 数据库文件和文件组

    在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,也是在特定文件夹下创建不同的文件,然后经过文件存储系统去抓取数据信息.理解文件和文件组的概念可以帮 ...

  8. Centos 下编译安装Redis

    安装环境说明: 操作系统:Centos 6.5 -64bit 安装路径:/usr/local/redis 开始编译redis tar -zxvf redis-2.8.19.tar.gz cd redi ...

  9. 如何托管ASP.NET Core应用到Windows Service中

    (此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:正在构思一个中间件的设计,考虑是否既可以使用最新的技术,也可以兼顾传统的部署模式.所以有 ...

  10. 第三十三篇:使用uiresImporter生成uires.idx及skin.xml

    在SOUI中,使用uires.idx这个文件来记录程序中使用的所有资源文件. 此外绘制对象(ISkinObj)则一般放在skin.xml中描述. 要向一个界面中增加一个新的图片,在没有uiresImp ...