FreeBSD 操作系统在无远程控制台下的远程安装
Daniel Gerzo
$FreeBSD:
head/zh_CN.GB2312/articles/remote-install/article.xml 39632 2012-10-01 11:56:00Z gabor $
版权? 2008 The FreeBSD Documentation Project
$FreeBSD:
head/zh_CN.GB2312/articles/remote-install/article.xml 39632 2012-10-01 11:56:00Z gabor $
FreeBSD 是 FreeBSD基金会的注册商标
许多制造商和经销商使用一些称为商标的图案或文字设计来彰显自己的产品。本文档中出现的,为 FreeBSD Project 所知晓的商标,后面将以'?' 或'?' 符号来标注。
本文归档了当远程控制台不可用的情况下 FreeBSD 操作系统的远程安装。文章背后的主要灵感归功于和 Martin Matuska
1 背景
世界上有很多的服务器主机供应商,但是他们中只有很少的一部分正式支持 FreeBSD,他们通常为他们提供的服务器上安装Linux? 发行版提供支持。
在某些情况下,如果你请求这些公司他们会安装一个你首选的Linux 发行版。有了这个选择,我们将试图安装 FreeBSD。在其他情况下,他们可能提供一个急救系统用于紧急情况。使用这个可能将有利于我们的目的更好的实现。
本文涵盖了引导一个包含 RAID-1 及ZFS性能的 FreeBSD 系统的远程安装的基本安装配置所必须的步骤。
2 简介
这一节会摘要本文的目的以及更好阐述这里所概括的东西。本文中的这些指令将有益于那些使用不支持 FreeBSD 的托管设施提供的服务的人。
1.如我们提到过的背景的那一节,许多的有声望的服务器主
机托管公司提供了各种的急救系统。可以从他们自己的局
域网启动并可以通过SSH访问。他们通常提供这种支持目
的用于帮助他们的顾客修正损坏的操作系统。如文章将说明
的,我们将能够通过这些急救系统的帮助来安装 FreeBSD。
2.文章的下一小节会描述如何配置,并在本地机器上构建最小
限度的 FreeBSD。该版本最终会从随机存储盘运行到远程机
器上面去。这将允许我们使用sysinstall实用程序从一个
FTP 镜像安装一套完整的 FreeBSD 操作系统。
3.文章的剩余内容除了描述ZFS文件系统的配置还将描述系
统本身的安装步骤。
2.1 需求
想要成功地做下去,你必须:
?拥有一个可通过SSH网络访问的操作系统。
?理解 FreeBSD 的安装过程
?熟悉sysinstall(8)实用程序
?拥有 FreeBSD 安张的 ISO 镜像文件或者易于使用的 CD
3 准备工作 - mfsBSD
在 FreeBSD 可能安装到目标系统上之前,需要先构建一个最小化的从磁盘启动的 FreeBSD 操作系统映像文件。此方法中新系统必须能够从网络访问,并且安装的其他过程能够在没有远程访问到系统控制台的情况下完成。
mfsBSD设置工具能够被用来构建一个微小的 FreeBSD 映像。如mfsBSD名字的含义(“mfs” 的意思是“memory file system” 内存文件系统),最后的映像全部从随机存储器运行。多亏了这个特性,磁盘的操作将不会有任何限制,因此它能够被用来安装一个完整的 FreeBSD 操作系统。mfsBSD的主页在
https://www.doczj.com/doc/185199395.html,/~mm/mfsbsd/,包含了指向最新释出的设置工具。
请注意关于mfsBSD内幕以及它所有的适用都超出了本文的内容,感兴趣的读者应该去查阅mfs的原始文档得到更多详细内容。
下载并解压出最新的mfsBSD版本,并改变自己的当前工作目录到存在mfsBSD脚本文件的目录:
# fetch
https://www.doczj.com/doc/185199395.html,/~mm/mfsbsd/mfsbsd-latest.tar.gz # tar xvzf mfsbsd-1.0-beta1.tar.gz
# cd mfsbsd-1.0-beta1/
3.1 mfsBSD 的配置
引导mfsBSD之前,必须设置一些重要的配置选项。最重要的是我们必须有正确地,自然地,网络配置。最适合的方法配置网络选项取决于我们是否事先知道我们会用到的网络接口,而且网络接口驱动程序应被系统为我们的硬件载入。我们将看到mfsBSD如何能够在任一种情况下被配置。
另外一件重要的事情是设置 root 的密码。这将通过编辑conf/rootpw.conf 文件来完成。请记住该文件将把你的密码保存在简单的文本中,所以在此我们不推荐你使用真实的密码。然而,这只是一个临时使用一次的密码,你可以在随后安装好的系统中更改它。
3.1.1 编辑 conf/interfaces.conf 的方法
如果我们安装好的网卡是未知类型的,我们可以使用mfsBSD 的自动探测功能。mfsBSD启动脚本能够探测到正确的驱动来使用,基于网络接口的 MAC 地址,我们假设在 conf/interfaces.conf 文件中设置如下选项:
initconf_interfaces="ext1"
initconf_mac_ext1="00:00:00:00:00:00"
initconf_ip_ext1="192.168.0.2"
initconf_netmask_ext1="255.255.255.0"
别忘了添加 defaultrouter 信息到 conf/rc.conf 文件中:
defaultrouter="192.168.0.1"
3.1.2 编辑 conf/rc.conf 的方法
当网络接口的驱动是已知类型的,使用 conf/rc.conf 文件添加联网选项会更加方便。该文件的语法跟 FreeBSD 中标准的
rc.conf(5)文件的语法相同。
例如,当你知道被使用的将是一个re(4)网络接口设备,你可以在 conf/rc.conf 文件中设置如下选项:
defaultrouter="192.168.0.1"
ifconfig_re0="inet 192.168.0.2 netmask 255.255.255.0"
3.2 构建一个 mfsBSD 映像
构建一个mfsBSD映像文件的过程是非常简单明了的。
第一步是挂载 FreeBSD 的安装 CD,或者挂载安装 ISO 文件到 /cdrom。因为例子的缘故,在文章中我们将假定你下载的是FreeBSD 7.0-RELEASE ISO 文件。使用mdconfig(8)实用程序挂载ISO 映像文件到 /cdrom 目录非常简单:
# mdconfig -a -t vnode -u 10 -f 7.0-RELEASE-amd64-disc1.iso # mount_cd9660 /dev/md10 /cdrom
紧接着,构建可启动的mfsBSD映像:
# make BASE=/cdrom/7.0-RELEASE
注意:上面的 make 命令必须在mfsBSD目录树的最高一层运行,也就是: ~/mfsbsd-1.0-beta1/。
3.3 启动 mfsBSD
现在mfsBSD映像已经准备好了,必须把它上传到远程的一个正在运行的急救系统上或者一个预安装了 Linux 发行版的系统上。最适合做这个工作的工具是scp:
# scp disk.img root@192.168.0.2:.
想要正确的引导mfsBSD映像,必须把它安放在机器的第一块(可启动)设备上。这可能会和使用的例子我们假定的一样,第一块可启动磁盘设备是 sda:
# dd if=/root/disk.img of=/dev/sda bs=1m
如果一切正常,该映像现在应该存在于第一块设备的 MBR(主引导区)而机器也应该能够被启动了。使用工具ping(8)来查看机器是否被正确启动。一旦它回复在线状态,就应该能够使用 root 用户和配置好的密码通过ssh(1)来访问它了。
4 FreeBSD 操作系统的安装
mfsBSD成功被引导后它就应该能够通过ssh(1)登入了。这一节会描述如何创建 slices 并标记 slices 的 label,为 RAID-1 配置gmirror,还有如何使用sysinstall来安装一个最小的FreeBSD操作系统版本。
4.1 准备磁盘
首要的任务是为 FreeBSD 分配磁盘空间,也就是,创建slices 和 partitions。很显然,当前运行的系统是全部被载入到系统内存中的因此操作磁盘将没有任何问题。要完成这个任务,可以是使用sysinstall或者fdisk(8)中的二者任一并结合工具bsdlabel(8)。
在开始时,将所有磁盘都标记成空的,在每个磁盘上重复如下命令:
# dd if=/dev/zero of=/dev/ad0 count=2
下面,使用你喜欢的工具创建 slices 并标记磁盘 label。比较简单的方法是使用sysinstall,强大也可能几乎没有漏洞方法是使用标准的基于文本的UNIX? 工具,类似于fdisk(8)和bsdlabel(8)这些工具的使用也会在这一节中包括。前者已经被包括在 FreeBSD 手册的安装FreeBSD一章中了。如本节中刚提到的,这篇文章会展示如何设置一个带有 RAID-1 和ZFS性能的系统。我们的设置由一个小工具gmirror(8)镜像为 / (root), /usr 和 /var 文件系统,并把剩余的磁盘空间被分配为zpool(8)镜像出的ZFS文件系统。请注意,ZFS文件系统将在 FreeBSD 操作系统成功安装并启动后才会被配置。
下面的例子会描述如何去创建 slices 和 labels,在每个partition 上初始化gmirror(8)并如何在每个被镜像过的partition 上创建UFS2文件系统:
# fdisk -BI /dev/ad0
# fdisk -BI /dev/ad1
# bsdlabel -wB /dev/ad0s1
# bsdlabel -wB /dev/ad1s1
# bsdlabel -e /dev/ad0s1
# bsdlabel /dev/ad0s1 > /tmp/bsdlabel.txt && bsdlabel -R
/dev/ad1s1 /tmp/bsdlabel.txt
# gmirror label root /dev/ad[01]s1a
# gmirror label var /dev/ad[01]s1d
# gmirror label usr /dev/ad[01]s1e
# gmirror label -F swap /dev/ad[01]s1b
# newfs /dev/mirror/root
# newfs /dev/mirror/var
# newfs /dev/mirror/usr
在整个磁盘上创建一个 slice 并初始化包含在磁盘第一个
扇区启动代码。重复在系统上全部的磁盘上执行此命令。
为每块磁盘写入一个包括启动代码的内容的标准 label。
现在,手动去编辑磁盘的 label。可以查阅bsdlabel(8)的
联机手册来找到如何建立 partitions 的方法。创建如下
partions,a 为 / (root) 文件系统, b 为 swap 交换空间,
d 为 /usr 还有最后 f 被用于ZFS。
引入你刚才创建的 label 到第二块磁盘,所以两块磁盘会
使用同样的 label。
在每个 partition 上初始化gmirror(8)。
注意 -F 选项被用在 swap 交换分区的 partition。
gmirror(8)这个指令认为设备处于可靠的状态除非电源系
统故障。
在每个被镜像的分区上创建一个UFS2的文件系统。
4.2 系统安装
这是最重要的一部分。此节将描述如何在我们上一小节已经准备好的磁盘上安装一个最小的 FreeBSD 版本。要达成这个目的,所有的文件安系统需要被挂载乃至于sysinstall可以把 FreeBSD 系统的内容写到磁盘上:
# mount /dev/mirror/root /mnt
# mkdir /mnt/var /mnt/usr
# mount /dev/mirror/var /mnt/var
# mount /dev/mirror/usr /mnt/usr
当你做完这些时,打开sysinstall(8)。从主菜单选择自定义Custom 安装。选中 Options 选项然后按回车确认。使用方向键获取帮助,移动鼠标指针到 Install Root 选项,按空格更改为/mnt。按回车提交你的更改并使用q退出 Options (选项)菜单。
警告:注意这一步骤非常重要,如果被跳过了,sysinstall将不能安装 FreeBSD。
到 Distributions(发行版)菜单选项,使用方向键移动鼠标指针到 Minimal(最小化)选项,并使用空格键选中该选项。本文使用了最小版本来保存网络联通信息,因为系统本身会通过ftp 来安装。使用 Exit(退出)选项退出这个菜单。
注意:Partition 和 Label 菜单将被跳过,这些没有多少价值了。
Media(媒介)菜单,选择 FTP 选项。选择一个距离你最近的镜像站点并交给sysinstall假定网络已经配置完好。你将再回到 Custom (自定义)菜单。
最后,选择最后的选项来执行系统的安装过程, Commit,当安装完成后退出sysinstall即可。
4.3 后期安装步骤
FreeBSD 操作系统现在应该安装完毕了;通常情况下,安装过程还没有结束。还需要进行一些安装后期的步骤使得容许 FreeBSD 在将来启动并能够登入系统。
你现在必须chroot(8)到刚安装的全新的系统中来完成安装。使用如下命令:
# chroot /mnt
要达到我们的目的,进行如下步骤:
?拷贝 GENERIC(通用)内核到 /boot/kernel 目录:
?# cp -Rp /boot/GENERIC/* /boot/kernel
?创建 /etc/rc.conf, /etc/resolv.conf 还有 /etc/fstab 文件。不要忘记正确地设置网络信息并在 /etc/rc.conf 文
件中启用sshd。 /etc/fstab 文件内容类似于下面的内容:?# Device Mountpoint FStype Options Dump Pass#
?/dev/mirror/swap none swap sw
0 0
?/dev/mirror/root / ufs rw
1 1
?/dev/mirror/usr /usr ufs rw
2 2
?/dev/mirror/var /var ufs rw
2 2
?/dev/cd0 /cdrom cd9660 ro,noauto 0 0
?创建 /boot/loader.conf 文件,并写入如下内容:
?geom_mirror_load="YES"
?zfs_load="YES"
?执行下面的命令,使得ZFS在下次启动后可用:
?# echo 'zfs_enable="YES"' >> /etc/rc.conf
?可以用adduser(8)工具来添加额外的用户。不要忘记添加一个用户到 wheel 组,这样你可以在重新启动后获得 root
权限。
?反复检验你的设置是否正确。
现在你的系统在下次启动后应该可用了。使用reboot(8)命令
重新启动你的系统。
5 ZFS
如果你的系统重新启动后还完好,现在应该能够登入了。欢迎来到崭新的 FreeBSD 安装,进行远程的不使用远程控制台的安装。
最后还剩下的步骤是配置zpool(8)并创建一些zfs(8)文件系统。建立并管理ZFS非常简单。首先,创建一个镜像的pool:
# zpool create tank mirror /dev/ad[01]s1f
再接着,创建一些文件系统:
# zfs create tank/ports
# zfs create tank/src
# zfs set compression=gzip tank/ports
# zfs set compression=on tank/src
# zfs set mountpoint=/usr/ports tank/ports
# zfs set mountpoint=/usr/src tank/src
这就是全部步骤了。如果你对 FreeBSD 上的ZFS感兴趣,请查阅 FreeBSD WIKI 中的ZFS一节。
本文档和其它文档可从这里下载:ftp://https://www.doczj.com/doc/185199395.html,/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系
关于本文档的问题请发信联系
BSD rc.d脚本编程实战
Yar Tikhiy
$FreeBSD:
head/zh_CN.GB2312/articles/rc-scripting/article.xml 39632 2012-10-01 11:56:00Z gabor $
版权? 2005, 2006, 2012 The FreeBSD Project
$FreeBSD:
head/zh_CN.GB2312/articles/rc-scripting/article.xml 39632 2012-10-01 11:56:00Z gabor $
FreeBSD 是 FreeBSD基金会的注册商标
NetBSD是 NetBSD Foundation的注册商标。
许多制造商和经销商使用一些称为商标的图案或文字设计来彰显自己的产品。本文档中出现的,为 FreeBSD Project 所知晓的商标,后面将以'?' 或'?' 符号来标注。
初学者可能会发现,难以通过正式的文档,基于 BSD 的 rc.d 框架,编写一些实际任务的 rc.d 脚本。本文中,我们采用了一些复杂性不断增加的典型案例,来展示适合每个案例的 rc.d 特性,并探讨其中的工作原理。这样的实验为大家进一步研究设计有效的rc.d 应用程序提供了一些参考点。
1 简介
历史上 BSD 曾有过一个单一的启动脚本, /etc/rc。该脚本在系统启动的时候被init(8)程序所引导,并执行所有多用户操作所需求的用户级任务:检查并挂载文件系统,设置网络,启动守护进程,等等。在每个系统中实际的任务清单也并不相同;管理员需要根据需求自定义这样的任务清单。在一些特殊的情况中,还不得不去修改 /etc/rc 文件,一些真正的黑客乐此不疲。
单一脚本启动方法的真正问题是它没有提供对从 /etc/rc 启动的单个组件的控制。拿一个例子来说吧,/etc/rc 不能够重新启动某个单独的守护进程。系统管理员不得不手动找出守护进程,并杀掉它,等待它真正退出后,再通过浏览 /etc/rc 得到该守护进程的标识,最终输入全部命令来再次启动守护进程。如果重新启动的服务包括不止一个守护进程或需要更多动作的话,该任务将变得更加困难以及容易出错。简而言之,单一脚本在实现我们这样的目的上是不成功的:让系统管理员的生活更轻松。
再后来,为了将最重要的一些子系统独立出来,便尝试将部分的内容从 /etc/rc 分离出来了。最广为人知的例子就是用来启动联网的 /etc/netstart 文件。它容许从单用户模式访问网络,但由于它的部分代码需要和一些与联网完全无关的动作交互,所以它并没有完美地结合到自启动的进程中。那便是为何 /etc/netstart 被演变成 /etc/https://www.doczj.com/doc/185199395.html,work 的原因了。后者不再是一个普通的脚本;它包括了庞大的,由 /etc/rc 在不同的系统启动级别中调用的凌乱的sh(1)函数。然而,当启动任务变得多样化以及久经更改,“类模块化” 方法变得比曾经的整体 /etc/rc 更缓慢费事。
由于没有一个干净和易于设计的框架,启动脚本不得不全力更改以满足飞速开发中基于 BSD 的操作系统的需求。它逐渐变得明朗并经过许多必要的步骤最终变成一个具有细密性和扩展性的 rc 系统。BSD rc.d 就这样诞生了。Luke Mewburn 和 NetBSD 社区是公认的 rc.d 之父。再之后它被引入到了 FreeBSD 中。它的名字
引用为系统单独的服务脚本的位置,也就是 /etc/rc.d下面的那些脚本。之后我们将学习到更多的 rc.d 系统的组件并看看单个脚本是如何被调用的。
BSD rc.d 背后的基本理念是良好的模块化和代码重用性。良好的模块化意味着每个基本“服务” 就象系统守护进程或原始启动任务那样,通过属于它们的可启动该服务的sh(1)脚本,来停止服务,重载服务,检查服务的状态。具体动作由脚本的命令行参数所决定。 /etc/rc 脚本仍然掌管着系统的启动,但现在它仅仅是使用 start 参数来一个个调用那些小的脚本。这便于用stop 来对运行中的同样的脚本很好地执行停止任务,这是被
/etc/rc.shutdown 脚本所完成的。看,这是多么好地体现了 Unix 的哲学:拥有一组小的专用的工具,每个工具尽可能好地完成自己的任务。代码重用意味着所有的通用操作由 /etc/rc.subr 中的一些sh(1)函数所实现。现在一个典型的脚本只需要寥寥几行的sh(1)代码。最终,rcorder(8)成为了 rc.d 框架中重要的一部分,它用来帮助 /etc/rc 处理小脚本之间的依赖关系并有次序地运行它们。它同样帮助 /etc/rc.shutdown 做类似的事情,因为正确的关闭次序是相对于启动的次序的。
BSD rc.d 的设计在Luke Mewburn 的原文中有记录,以及rc.d 组件也被充分详细地记录在各自的联机手册中。然而,它可能没能清晰展现给一个 rc.d 新手,如何将无数的块和片进行关联来为具体的任务创建一个好风格的脚本。因此本文将试着以不同的方式来讲述 rc.d。它将展示在某些典型情况中应该使用哪些特性,并阐述了为何如此。注意这并不是一篇 how-to 文档,我们的目的不是给出现成的配方,而是在展示一些简单的进入 rc.d 的范围的门路。本文也不是相关联机手册的替代品。阅读本文时记得同时参考联机手册以获取更完整正规的文档。
理解本文需要一些先决条件。首先,你需要熟悉sh(1)脚本编程语言以掌握 rc.d,还有,你需要知道系统是如何执行用户级的启动和停止任务,这些在rc(8)中都有说明。
本文关注的是 rc.d 的 FreeBSD 分支。不过,它可能对NetBSD 的开发者也同样有用,因为 BSD rc.d 的两个分支不只是共享了同样的设计,还保留了对脚本编写者都可见的类似观点。
2 任务描述
在开始打开 $EDITOR(编辑器)之前进行小小的思考不是坏事。为了给一个系统服务写一个“听话的” rc.d 脚本,我们首先应该能回答以下问题:
?该服务是必须性的还是可选性的?
?脚本将为单个程序服务,如一个守护进程,还是执行更复杂的动作?
?我们的服务依赖哪些服务?反过来哪些服务依赖我们的服务?
从下面的例子中我们将看到,为什么说知道这些问题的答案是很重要的。
3 虚拟的脚本
下面的脚本是用来在每次系统启动时发出一个信息:
#!/bin/sh
. /etc/rc.subr
name="dummy"
start_cmd="${name}_start"
stop_cmd=":"
dummy_start()
{
echo "Nothing started."
}
load_rc_config $name
run_rc_command "$1"
需要注意的是:
一个解释性的脚本应该以一行魔幻的“shebang” 行开头。
该行指定了脚本的解析程序。由于 shebang 行的作用,假
如再有可执行位的设置,脚本就能象一个二进制程序一样被
精确地调用执行。(请参考chmod(1)。)例如,一个系
统管理员可以从命令行手动运行我们的脚本:
# /etc/rc.d/dummy start
注意:为了使 rc.d 框架正确地管理脚本,它的脚本
需要用sh(1)语言编写。如果你的某个服务或 port
套件使用了二进制控制程序或是用其它语言编写的例
程,请将其组件安装到 /usr/sbin(相对于系统)或
/usr/local/sbin(相对于ports),然后从合适的
rc.d 目录的某个sh(1)脚本调用它。
提示:如果你想知道为什么 rc.d 脚本必须用sh(1)
语言编写的细节,先看下 /etc/rc 是如何依靠
run_rc_script 调用它们,然后再去学习
/etc/rc.subr 下 run_rc_script 的相关实现。
在 /etc/rc.subr 下,有许多定义过的sh(1)函数可供每个 rc.d 脚本使用。这些函数在rc.subr(8)中都有说明。尽管理论上可以完全不使用rc.subr(8)来编写一个 rc.d 脚本,但它的函数已经证明了它真的很方便,并且能使任务更加的简单。所以所有人在编写 rc.d 脚本时都会求助于rc.subr(8)也不足为奇了。当然我们也不例外。
一个 rc.d 脚本在其调用rc.subr(8)函数之前必须先“source” /etc/rc.subr(用“.”将其包含进去),而使sh(1)程序有机会来获悉那些函数。首选风格是在脚本的最开始 source /etc/rc.subr 文件。
注意:某些有用的与联网有关的函数由另一个被包含
进来的文件提供, /etc/network.subr 文件。
强制的变量 name 指定我们脚本的名字。这是rc.subr(8)所强调的。也就是,每个 rc.d 脚本在调用rc.subr(8)的函数之前必须设置 name 变量。
现在是时候来为我们的脚本一次性选择一个独一无二的名字了。在编写这个脚本的时我们将在许多地方用到它。在开始之前,我们来给脚本文件也取个相同的名字。
注意:当前的 rc.d 脚本风格是把值放在双引号中来
给变量赋值。请记住这只是个风格问题,可能并不总
是这样。你可以在只是简单的并不包括sh(1)元字
符的词句中放心地省略掉引号,而在某些情况下你将
需要使用单引号以防止sh(1)对任何的变量的解释。
程序员是可以灵巧地由风格惯例获悉其语法以及使用
的。
rc.subr(8)背后主要的构思是 rc.d 脚本提供处理程序,或者方法,来让rc.subr(8)调用。特别是,start, stop,以及其它的 rc.d 脚本参数都是这样被处理的。方法是存储在一个以argument_cmd形式命名的变量中的sh(1)表达式,该argument对应着脚本命令行中所特别指定的参数。我们稍后将看到rc.subr(8)是如何为标准参数提供默认方法的。
注意:为了让 rc.d 中的代码更加统一,常见的是在
任何适合的地方都使用 ${name} 形式。这样一来,
可以轻松地将一些代码从一个脚本拷贝到另一个中使
用。
我们应谨记rc.subr(8)为标准参数提供了默认的方法。因此,如果希望它什么都不做的话,我们必须使用无操作的
sh(1)表达式来改写标准的方法。
比较复杂的方法主体可以用函数来实现。在能够保证函数名有意义的情况下,这是个很不错的想法。
重要:强烈推荐给我们脚本中所定义的所有函数名都
添加类似 ${name} 这样的前缀,以使它们永远不会和
rc.subr(8)或其它公用包含文件中的函数冲突。
这是在请求rc.subr(8)载入rc.conf(5)变量。尽管我们
这个脚本中使用的变量并没有被其它地方使用,但由于
rc.subr(8)自身所控制着的rc.conf(5)变量存在的原因,
仍然推荐脚本去装载rc.conf(5)。
通常这是 rc.d 脚本的最后一个命令。它调用rc.subr(8)
体系使用我们脚本所提供的变量和方法来执行相应的请求动
作。
4 可配置的虚拟脚本
现在我们来给我们的虚拟脚本增加一些控制参数吧。正如你所知, rc.d 脚本是由rc.conf(5)所控制的。幸运的是,rc.subr(8)隐藏了所有复杂化的东西。下面这个脚本使用rc.conf(5)通过rc.subr(8)来查看它是否在第一个地方被启用,并获取一条信息在启动时显示。事实上这两个任务是相互独立的。一方面,rc.d 脚本要能够支持启动和禁用它的服务。另一方面, rc.d 脚本必须能具备配置信息变量。我们将通过下面同一脚本来演示这两方面的内容:
#!/bin/sh
. /etc/rc.subr
name=dummy