5df509eaa2
always work and is no use anyway
472 lines
14 KiB
XML
472 lines
14 KiB
XML
<?xml version="1.0" encoding="gb2312"?>
|
||
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V4.5-Based Extension//EN"
|
||
"../../../share/xml/freebsd45.dtd">
|
||
|
||
<!--
|
||
The FreeBSD Documentation Project
|
||
The FreeBSD Chinese (Simplified) Documentation Project
|
||
|
||
Original Revision: 1.7
|
||
-->
|
||
|
||
<article lang='zh_cn'>
|
||
<articleinfo>
|
||
<title>NanoBSD 简介</title>
|
||
|
||
<authorgroup>
|
||
<author>
|
||
<firstname>Daniel</firstname>
|
||
<surname>Gerzo</surname>
|
||
<!-- 14 March 2006 -->
|
||
</author>
|
||
</authorgroup>
|
||
|
||
<copyright>
|
||
<year>2006</year>
|
||
<holder>The FreeBSD Documentation Project</holder>
|
||
</copyright>
|
||
|
||
<pubdate>$FreeBSD$</pubdate>
|
||
|
||
<releaseinfo>$FreeBSD$</releaseinfo>
|
||
|
||
<legalnotice id="trademarks" role="trademarks">
|
||
&tm-attrib.freebsd;
|
||
&tm-attrib.general;
|
||
</legalnotice>
|
||
|
||
<abstract>
|
||
<para>这篇文档提供了关于 <application>NanoBSD</application> 工具的介绍信息,
|
||
这一工具可以用来创建用于嵌入式应用的 &os; 系统映像,
|
||
以适应存放到袖珍闪存 (Compact Flash) 卡 (或其它大容量存储介质) 上的需要。</para>
|
||
</abstract>
|
||
</articleinfo>
|
||
|
||
<sect1 id="intro">
|
||
<title>NanoBSD 简介</title>
|
||
|
||
<indexterm><primary>NanoBSD</primary></indexterm>
|
||
|
||
<para><application>NanoBSD</application> 是 &a.phk; 目前正在开发的一项工具。
|
||
它可以用来创建用于嵌入式应用的 &os; 系统映像,
|
||
以便配合袖珍闪存 (Compact Flash) 卡 (或其他大容量存储介质) 使用。</para>
|
||
|
||
<para>这一工具也可以用来构建定制的安装映像,
|
||
以简化通常称为 <quote>计算设备 (computer appliances)</quote>
|
||
的系统的安装和维护工作。 计算设备通常在产品中将捆绑硬件和软件,
|
||
或者换言之, 所有的应用程序都是预先装好的。
|
||
这些设备可以直接插到暨存的网络中,
|
||
并 (几乎是) 立即投入使用。</para>
|
||
|
||
<para><application>NanoBSD</application> 提供的功能包括:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>可以和 &os; 一样使用 Ports 和预编译包—
|
||
所有的应用程序都可以在 <application>NanoBSD</application> 映像中直接使用,
|
||
而方式与 &os; 完全一样。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>不减少功能 — 能够使用 &os; 做的任何工作, 都可以在
|
||
<application>NanoBSD</application> 中使用,
|
||
除非您在创建 <application>NanoBSD</application> 映像时,
|
||
明确地删去它们。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>所有对象在运行时均是只读的 — 可以安全地拔掉电源插销。
|
||
在系统非正常关闭之后, 无需运行
|
||
&man.fsck.8;。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>便于联编和定制 — 只需使用一个 shell 脚本和一个配置文件,
|
||
您可以很容易地裁减和定制适于任意需求的映像。</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</sect1>
|
||
|
||
<sect1 id="howto">
|
||
<title>如何使用 NanoBSD</title>
|
||
|
||
<sect2 id="design">
|
||
<title>NanoBSD 的设计</title>
|
||
|
||
<para>一旦将映像存入介质, 就可以用它来引导 <application>NanoBSD</application>
|
||
了。 默认情况下, 大容量存储器会划分为三个区:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>两个映像区: <literal>code#1</literal>
|
||
和 <literal>code#2</literal>。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>一个配置文件区, 运行环境中,
|
||
可以将其挂接到 <filename class="directory">/cfg</filename> 目录下。</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>这些分区默认情况下以只读方式挂接。</para>
|
||
|
||
<para><filename class="directory">/etc</filename> 和
|
||
<filename class="directory">/var</filename> 目录均为
|
||
&man.md.4; (malloc) 盘。</para>
|
||
|
||
<para>配置文件分区保存在
|
||
<filename class="directory">/cfg</filename> 目录。
|
||
它包含了用于 <filename class="directory">/etc</filename>
|
||
目录的文件, 在启动之后暂时以只读方式挂接。 因此,
|
||
在需要从 <filename class="directory">/etc</filename> 向
|
||
<filename class="directory">/cfg</filename> 目录复制所进行的、
|
||
希望在重启时保持不变的配置时, 需要进行一些额外的操作。</para>
|
||
|
||
<example>
|
||
<title>在 <filename>/etc/resolv.conf</filename> 中进行需要保持的修改</title>
|
||
|
||
<screen>&prompt.root; <userinput>vi /etc/resolv.conf</userinput>
|
||
[...]
|
||
&prompt.root; <userinput>mount /cfg</userinput>
|
||
&prompt.root; <userinput>cp /etc/resolv.conf /cfg</userinput>
|
||
&prompt.root; <userinput>umount /cfg</userinput></screen>
|
||
</example>
|
||
|
||
<note>
|
||
<para>只有在系统启动过程中, 以及需要修改配置文件的场合, 才需要挂接包含
|
||
<filename class="directory">/cfg</filename> 的那个分区。</para>
|
||
|
||
<para>在任何时候都保持挂接 <filename class="directory">/cfg</filename>
|
||
不是一个好主意, 特别是当您把 <application>NanoBSD</application>
|
||
放在不适合进行大量写操作的分区时
|
||
(由于文件系统的同步进程会定期向系统盘写一些数据)。</para>
|
||
</note>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>构建 NanoBSD 映像</title>
|
||
|
||
<para><application>NanoBSD</application> 映像是通过使用非常简单的
|
||
<filename>nanobsd.sh</filename> shell 脚本来构建的, 这个脚本可以在
|
||
<filename class="directory"><replaceable>/usr</replaceable>/src/tools/tools/nanobsd</filename>
|
||
目录中找到。 这个脚本建立的映像文件, 可以用 &man.dd.1; 工具复制到存储介质上。</para>
|
||
|
||
<para>构建
|
||
<application>NanoBSD</application> 映像所需的命令是:</para>
|
||
|
||
<screen>&prompt.root; <userinput>cd /usr/src/tools/tools/nanobsd</userinput> <co id="nbsd-cd"/>
|
||
&prompt.root; <userinput>sh nanobsd.sh</userinput> <co id="nbsd-sh"/>
|
||
&prompt.root; <userinput>cd /usr/obj/nanobsd.full</userinput> <co id="nbsd-cd2"/>
|
||
&prompt.root; <userinput>dd if=_.disk.full of=/dev/da0 bs=64k</userinput> <co id="nbsd-dd"/></screen>
|
||
|
||
<calloutlist>
|
||
<callout arearefs="nbsd-cd">
|
||
<para>进入 <application>NanoBSD</application> 构建脚本的主目录。</para>
|
||
</callout>
|
||
|
||
<callout arearefs="nbsd-sh">
|
||
<para>开始构建过程。</para>
|
||
</callout>
|
||
|
||
<callout arearefs="nbsd-cd2">
|
||
<para>进入构建好的映像文件所在的目录。</para>
|
||
</callout>
|
||
|
||
<callout arearefs="nbsd-dd">
|
||
<para>在存储介质上安装 <application>NanoBSD</application>。</para>
|
||
</callout>
|
||
</calloutlist>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>定制 NanoBSD 映像</title>
|
||
|
||
<para>这可能是 <application>NanoBSD</application> 最为重要,
|
||
同时也是您最感兴趣的功能。 同时, 您在开发
|
||
<application>NanoBSD</application> 应用时,
|
||
这也是相当耗时的过程。</para>
|
||
|
||
<para>执行下面的命令将使
|
||
<filename>nanobsd.sh</filename> 从当前目录中的
|
||
<filename>myconf.nano</filename> 文件读取配置:</para>
|
||
|
||
<screen>&prompt.root; <userinput>sh nanobsd.sh -c myconf.nano</userinput></screen>
|
||
|
||
<para>定制过程包含两步:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>配置选项</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para>定制函数</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<sect3>
|
||
<title>配置选项</title>
|
||
|
||
<para>通过对配置进行设置, 可以配置用以传递给
|
||
<application>NanoBSD</application> 构建过程中
|
||
<maketarget>buildworld</maketarget>
|
||
和 <maketarget>installworld</maketarget> 阶段的联编和安装选项, 以及
|
||
<application>NanoBSD</application> 的主构建过程中的选项。
|
||
通过使用这些选项可以削减系统的尺寸, 使之能够放入
|
||
64MB 的存储。 您还可以进一步通过这些选项来削减 &os;,
|
||
直到它只包含内核以及两三个用户环境文件为止。</para>
|
||
|
||
<para>配置文件中包含用以代替默认值的配置选项。
|
||
最重要的语句包括:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><literal>NANO_NAME</literal> — 本次构建的名称
|
||
(用于创建工作目录的名字)。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>NANO_SRC</literal> — 用以联编和构建映像的源码树的位置。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>NANO_KERNEL</literal> — 用以联编内核的配置文件的名字。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>CONF_BUILD</literal> — 用于传递给
|
||
<maketarget>buildworld</maketarget> 构建阶段的选项。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>CONF_INSTALL</literal> — 用于传递给
|
||
<maketarget>installworld</maketarget> 构建阶段的选项。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>CONF_WORLD</literal> — 用以传递给
|
||
<maketarget>buildworld</maketarget> 和
|
||
<maketarget>installworld</maketarget> 这两个构建阶段的选项。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>FlashDevice</literal> — 定义所用的介质类型。
|
||
要了解进一步的细节, 请参考 <filename>FlashDevice.sub</filename>
|
||
文件。</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>定制函数</title>
|
||
|
||
<para>通过在配置文件中使用 shell 函数可以进一步微调
|
||
<application>NanoBSD</application>。 下面的例子展示了定制函数的基本模式:</para>
|
||
|
||
<programlisting>cust_foo () (
|
||
echo "bar=baz" > \
|
||
${NANO_WORLDDIR}/etc/foo
|
||
)
|
||
customize_cmd cust_foo</programlisting>
|
||
|
||
<para>下面是一个更贴近实际的例子, 它将默认的
|
||
<filename class="directory">/etc</filename> 目录尺寸,
|
||
从 5MB 调整为 30MB:</para>
|
||
|
||
<programlisting>cust_etc_size () (
|
||
cd ${NANO_WORLDDIR}/conf
|
||
echo 30000 > default/etc/md_size
|
||
)
|
||
customize_cmd cust_etc_size</programlisting>
|
||
|
||
<para>除此之外, 还有几个默认的预定义定制函数:</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para><literal>cust_comconsole</literal> — 在 VGA 设备上禁止
|
||
&man.getty.8;
|
||
(<filename>/dev/ttyv*</filename> 设备节点) 并启用串口 COM1
|
||
作为系统控制台。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>cust_allow_ssh_root</literal> — 允许
|
||
<username>root</username> 通过 &man.sshd.8; 登录。</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><literal>cust_install_files</literal> —
|
||
从 <filename class="directory">nanobsd/Files</filename>
|
||
目录中安装文件, 这包含一些实用的系统管理脚本。</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>安装预编译软件包</title>
|
||
|
||
<para>通过增加自定义的函数, 可以在 <application>NanoBSD</application>
|
||
增加预编译的软件包。 下面的函数会添加位于
|
||
<filename>/usr/src/tools/tools/nanobsd/packages</filename>
|
||
的全部预编译软件包:</para>
|
||
|
||
<programlisting>install_packages () (
|
||
mkdir -p ${NANO_WORLDDIR}/packages
|
||
cp /usr/src/tools/tools/nanobsd/packages/* ${NANO_WORLDDIR}/packages
|
||
chroot ${NANO_WORLDDIR} sh -c 'cd packages; pkg_add -v *;cd ..;'
|
||
rm -rf ${NANO_WORLDDIR}/packages
|
||
)
|
||
customize_cmd install_packages</programlisting>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>配置文件举例</title>
|
||
|
||
<para>下面是一个用于构建定制的 <application>NanoBSD</application> 映像的完整例子:</para>
|
||
|
||
<programlisting>NANO_NAME=custom
|
||
NANO_SRC=/usr/src
|
||
NANO_KERNEL=MYKERNEL
|
||
NANO_IMAGES=2
|
||
|
||
CONF_BUILD='
|
||
NO_KLDLOAD=YES
|
||
NO_NETGRAPH=YES
|
||
NO_PAM=YES
|
||
'
|
||
|
||
CONF_INSTALL='
|
||
NO_ACPI=YES
|
||
NO_BLUETOOTH=YES
|
||
NO_CVS=YES
|
||
NO_FORTRAN=YES
|
||
NO_HTML=YES
|
||
NO_LPR=YES
|
||
NO_MAN=YES
|
||
NO_SENDMAIL=YES
|
||
NO_SHAREDOCS=YES
|
||
NO_EXAMPLES=YES
|
||
NO_INSTALLLIB=YES
|
||
NO_CALENDAR=YES
|
||
NO_MISC=YES
|
||
NO_SHARE=YES
|
||
'
|
||
|
||
CONF_WORLD='
|
||
NO_BIND=YES
|
||
NO_MODULES=YES
|
||
NO_KERBEROS=YES
|
||
NO_GAMES=YES
|
||
NO_RESCUE=YES
|
||
NO_LOCALES=YES
|
||
NO_SYSCONS=YES
|
||
NO_INFO=YES
|
||
'
|
||
|
||
FlashDevice SanDisk 1G
|
||
|
||
cust_nobeastie() (
|
||
touch ${NANO_WORLDDIR}/boot/loader.conf
|
||
echo "beastie_disable=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
|
||
)
|
||
|
||
customize_cmd cust_comconsole
|
||
customize_cmd cust_install_files
|
||
customize_cmd cust_allow_ssh_root
|
||
customize_cmd cust_nobeastie</programlisting>
|
||
</sect3>
|
||
</sect2>
|
||
|
||
<sect2>
|
||
<title>更新 NanoBSD</title>
|
||
|
||
<para>更新 <application>NanoBSD</application> 相对而言较为简单:</para>
|
||
|
||
<procedure>
|
||
<step>
|
||
<para>和之前一样构建新的 <application>NanoBSD</application> 映像文件。</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>将新的映像放入正运行的
|
||
<application>NanoBSD</application> 设备中的一个未用的分区。</para>
|
||
|
||
<para>与之前最初安装 <application>NanoBSD</application> 的步骤相比,
|
||
这一步骤最重要的区别在于这次不应使用 <filename>_.disk.full</filename> 文件
|
||
(它包含整个盘的映像),
|
||
而应安装 <filename>_.disk.image</filename> 映像 (这个文件中,
|
||
只包含一个系统分区)。</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>重新启动, 并从新安装的分区中启动系统。</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>如果一切顺利的话, 升级工作就完成了。</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>如果发生了任何问题, 则可以从先前的分区启动
|
||
(其中包含了旧的、 可用的映像), 来尽可能快地恢复系统功能。
|
||
接下来可以修正新联编的版本中存在的问题, 并重复前述步骤。</para>
|
||
</step>
|
||
</procedure>
|
||
|
||
<para>要在正在运行的
|
||
<application>NanoBSD</application> 系统中安装新的映像, 可以使用位于
|
||
<filename class="directory">/root</filename> 目录的
|
||
<filename>updatep1</filename> 或
|
||
<filename>updatep2</filename> 脚本,
|
||
具体使用哪一个脚本, 取决于正在运行的系统位于那个分区。</para>
|
||
|
||
<para>随时提供新 <application>NanoBSD</application> 映像所提供的服务,
|
||
以及采用的传输方法的不同, 您可以参考并使用下列三种方式之一:</para>
|
||
|
||
<sect3>
|
||
<title>使用 &man.ftp.1;</title>
|
||
|
||
<para>如果传输速度是第一要务,
|
||
采用下面的例子:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ftp myhost
|
||
get _.disk.image "| sh updatep1"</userinput></screen>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>使用 &man.ssh.1;</title>
|
||
|
||
<para>如果更倾向于安全传输, 应参考下面的例子:</para>
|
||
|
||
<screen>&prompt.root; <userinput>ssh myhost cat _.disk.image.gz | zcat | sh updatep1</userinput></screen>
|
||
</sect3>
|
||
|
||
<sect3>
|
||
<title>使用 &man.nc.1;</title>
|
||
|
||
<para>如果远程主机既不提供
|
||
&man.ftp.1; 服务, 也不提供 &man.sshd.8; 服务:</para>
|
||
|
||
<procedure>
|
||
<step>
|
||
<para>开始时, 在提供映像的主机上开启 TCP 监听,
|
||
并令其将映像文件发给客户机:</para>
|
||
|
||
<screen>myhost&prompt.root; <userinput>nc -l <replaceable>2222</replaceable> < _.disk.image</userinput></screen>
|
||
|
||
<note>
|
||
<para>请确认您所使用的端口没有通过防火墙阻止来自
|
||
<application>NanoBSD</application> 客户机的联接请求。</para>
|
||
</note>
|
||
</step>
|
||
<step>
|
||
<para>连接到提供新映像服务的主机, 并执行
|
||
<filename>updatep1</filename> 脚本:</para>
|
||
|
||
<screen>&prompt.root; <userinput>nc myhost <replaceable>2222</replaceable> | sh updatep1</userinput></screen>
|
||
</step>
|
||
</procedure>
|
||
</sect3>
|
||
</sect2>
|
||
</sect1>
|
||
</article>
|