aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/articles/nanobsd/article.xml
blob: 6ad4ed1002c042fee34a9660a90e77d7b6eadc98 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
<?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 和预编译包&mdash;
	  所有的应用程序都可以在 <application>NanoBSD</application> 映像中直接使用,
	  而方式与 &os; 完全一样。</para>
      </listitem>

      <listitem>
	<para>不减少功能 &mdash; 能够使用 &os; 做的任何工作, 都可以在
	  <application>NanoBSD</application> 中使用,
	  除非您在创建 <application>NanoBSD</application> 映像时,
	  明确地删去它们。</para>
      </listitem>

      <listitem>
	<para>所有对象在运行时均是只读的 &mdash; 可以安全地拔掉电源插销。
	  在系统非正常关闭之后, 无需运行
	  &man.fsck.8;。</para>
      </listitem>

      <listitem>
	<para>便于联编和定制 &mdash; 只需使用一个 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> &mdash; 本次构建的名称
	      (用于创建工作目录的名字)。</para>
	  </listitem>

	  <listitem>
	    <para><literal>NANO_SRC</literal> &mdash; 用以联编和构建映像的源码树的位置。</para>
	  </listitem>

	  <listitem>
	    <para><literal>NANO_KERNEL</literal> &mdash; 用以联编内核的配置文件的名字。</para>
	  </listitem>

	  <listitem>
	    <para><literal>CONF_BUILD</literal> &mdash; 用于传递给
	      <maketarget>buildworld</maketarget> 构建阶段的选项。</para>
	  </listitem>

	  <listitem>
	    <para><literal>CONF_INSTALL</literal> &mdash; 用于传递给
	      <maketarget>installworld</maketarget> 构建阶段的选项。</para>
	  </listitem>

	  <listitem>
	    <para><literal>CONF_WORLD</literal> &mdash; 用以传递给
	      <maketarget>buildworld</maketarget><maketarget>installworld</maketarget> 这两个构建阶段的选项。</para>
	  </listitem>

	  <listitem>
	    <para><literal>FlashDevice</literal> &mdash; 定义所用的介质类型。
	      要了解进一步的细节, 请参考 <filename>FlashDevice.sub</filename>
	      文件。</para>
	  </listitem>
	</itemizedlist>
      </sect3>

      <sect3>
	<title>定制函数</title>

	<para>通过在配置文件中使用 shell 函数可以进一步微调
	  <application>NanoBSD</application>。 下面的例子展示了定制函数的基本模式:</para>

	  <programlisting>cust_foo () (
	echo "bar=baz" &gt; \
		&dollar;{NANO_WORLDDIR}/etc/foo
)
customize_cmd cust_foo</programlisting>

        <para>下面是一个更贴近实际的例子, 它将默认的
          <filename class="directory">/etc</filename> 目录尺寸,
          从 5MB 调整为 30MB:</para>

	<programlisting>cust_etc_size () (
	cd &dollar;{NANO_WORLDDIR}/conf
	echo 30000 &gt; default/etc/md_size
)
customize_cmd cust_etc_size</programlisting>

	<para>除此之外, 还有几个默认的预定义定制函数:</para>

	<itemizedlist>
	  <listitem>
	    <para><literal>cust_comconsole</literal> &mdash; 在 VGA 设备上禁止
	      &man.getty.8;
	      (<filename>/dev/ttyv*</filename> 设备节点) 并启用串口 COM1
	      作为系统控制台。</para>
	  </listitem>

	  <listitem>
	    <para><literal>cust_allow_ssh_root</literal> &mdash; 允许
	      <username>root</username> 通过 &man.sshd.8; 登录。</para>
	  </listitem>

	  <listitem>
	    <para><literal>cust_install_files</literal> &mdash;<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 &dollar;{NANO_WORLDDIR}/boot/loader.conf
	echo "beastie_disable=\"YES\"" &gt;&gt; &dollar;{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> &lt; _.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>