aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.UTF-8/books/handbook/linuxemu/chapter.xml
blob: 03d072e0f06c660764633fcd6c3b6e567a4a3241 (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
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
<?xml version="1.0" encoding="utf-8"?>
<!--
     The FreeBSD Documentation Project

     Original Revision: 1.142
     $FreeBSD$
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="linuxemu">
  <info><title>Linux二进制兼容模式</title>
    <authorgroup>
      <author><personname><firstname>Jim</firstname><surname>Mock</surname></personname><contrib>Restructured and parts updated by </contrib></author>
      <!-- 22 Mar 2000 -->
    </authorgroup>
    <authorgroup>
      <author><personname><firstname>Brian N.</firstname><surname>Handy</surname></personname><contrib>Originally contributed by </contrib></author>
      <author><personname><firstname>Rich</firstname><surname>Murphey</surname></personname></author>
    </authorgroup>
  </info>



  <sect1 xml:id="linuxemu-synopsis">
    <title>概述</title>
    <indexterm><primary>Linux二进制兼容模式</primary></indexterm>
    <indexterm>
      <primary>二进制兼容模式</primary>
      <secondary>Linux</secondary>
    </indexterm>

    <para>FreeBSD 提供了与其他几种类
      &unix; 操作系统, 包括 Linux, 的兼容性。 现在您可能会问, 为什么
      FreeBSD 需要能够运行 Linux 的可执行文件? 答案很简单。
      许多公司和开发人员只为 Linux 开发程序,
      因为这是目前计算机世界 <quote>最热门</quote> 的技术。
      这使得我们 FreeBSD 用户不得不去劝说这些公司和开发人员提供他们应用程序可以直接在
      FreeBSD 上运行的版本。 问题是, 许多这样的公司并不真的知道到底提供了
      FreeBSD 版本之后能带来多少用户, 因此许多仍然只开发 Linux
      的版本。 这时 FreeBSD 用户能做什么呢? 答案就是使用 FreeBSD
      所提供的 Linux 二进制兼容性。</para>

    <para>简而言之, 这种兼容性能够让 FreeBSD 用户不加修改地直接运行大约 90%
      的 Linux 应用程序。 这包括类似 <application>&staroffice;</application>,
      Linux 版本的 <application>&netscape;</application><application>&adobe;&nbsp;&acrobat;</application><application>&realplayer;</application><application>VMware</application><application>&oracle;</application><application>&wordperfect;</application><application>Doom</application><application>Quake</application>, 等等。 此外, 也有人说,
      某些情况下, 在 FreeBSD 上面运行的 Linux 程序的性能,
      甚至好于直接在 Linux 上面运行。</para>

    <para>然而, 仍然有一些只有 Linux 才有的操作系统特性在 FreeBSD 上并不被支持。
      如果 Linux 程序过分地使用只能在 &i386; 上使用的特性,
      例如启用虚拟 8086 模式, 则也有可能无法在 FreeBSD 上运行。</para>

    <para>读完这章,您将了解到:</para>
    <itemizedlist>
      <listitem>
         <para> 如何在您的系统中启用Linux兼容模式。</para>
      </listitem>

      <listitem>
	<para>如何安装额外的Linux共享库。</para>
	</listitem>

      <listitem>
        <para>如何在FreeBSD上安装Linux应用程序。</para>
      </listitem>

      <listitem>
	<para>在FreeBSD上,Linux兼容模式的执行细节。</para>
      </listitem>
    </itemizedlist>

    <para>阅读这章之前,您应该知道:</para>

    <itemizedlist>
      <listitem>
	<para>如何安装第三方软件(<xref linkend="ports"/>)。</para>
      </listitem>
    </itemizedlist>

  </sect1>

  <sect1 xml:id="linuxemu-lbc-install">
    <title>安装</title>

    <indexterm><primary>KLD (kernel loadable object)</primary></indexterm>

    <para>默认情况下, 并不开启 Linux 二进制兼容支持。
      启用这一功能最简单的方法是载入
      <literal>linux</literal> KLD 模块 (<quote>Kernel LoaDable
      object</quote>)。 以 <systemitem class="username">root</systemitem>
      的身份, 键入下列命令即可:</para>

    <screen>&prompt.root; <userinput>kldload linux</userinput></screen>

    <para>如果希望 Linux 兼容支持在系统初始化过程中自动启用, 则应在
      <filename>/etc/rc.conf</filename> 中增加:</para>

    <programlisting>linux_enable="YES"</programlisting>

    <para>&man.kldstat.8;可以用来检查KLD模块是否加载:</para>

    <screen>&prompt.user; <userinput>kldstat</userinput>
Id Refs Address    Size     Name
 1    2 0xc0100000 16bdb8   kernel
 7    1 0xc24db000 d000     linux.ko</screen>
    <indexterm>
      <primary>kernel options (内核选项)</primary>
      <secondary>COMPAT_LINUX</secondary>
    </indexterm>

    <para>如果您不想或者无法将Linux KLD加载,您就需要在内核中静态链接进Linux二进制兼容模式。您必须在
      您的内核配置文件里面加入<literal>options COMPAT_LINUX</literal>,然后按照<xref linkend="kernelconfig"/>重新编译内核。
      </para>

    <sect2>
      <title>安装Linux运行时库</title>
      <indexterm>
	<primary>Linux</primary>
	<secondary>安装Linux运行时库</secondary>
      </indexterm>

      <para>有两种方法来安装Linux运行时库,要么使用<link linkend="linuxemu-libs-port">linux_base</link> port,
      要么<link linkend="linuxemu-libs-manually">手动</link>安装。</para>

      <sect3 xml:id="linuxemu-libs-port">
	<title>通过使用 linux_base Port 来安装</title>
	<indexterm><primary>Ports Collection</primary></indexterm>

	<para>这是最容易的安装方法,只需要像安装其他port一样从
	<link xlink:href="file://localhost/usr/ports/">Ports Collection</link>来安装:</para>

	<screen>&prompt.root; <userinput>cd /usr/ports/emulators/linux_base-f10</userinput>
&prompt.root; <userinput>make install distclean</userinput></screen>

	<note>
          <para>对于 &os;&nbsp;8.0 之前的版本的 &os; 系统,
            你需要使用 <package>emulators/linux_base-fc4</package> port
            而不是 <package>emulators/linux_base-f10</package></para>
	</note>

	<para>
	您现在应当是工作在Linux兼容模式下了。一些程序可能会提示系统库的版本不正确。通常,这不是问题。</para>

	<note><para>有多个版本的<package>emulators/linux_base</package> port,针对不同的版本的Linux。
	  您应该选择最接近Linux应用程序需要的那个版本来安装。</para></note>

      </sect3>

      <sect3 xml:id="linuxemu-libs-manually">
	<title>手动安装</title>

	<para>如果您没有安装 Ports Collection,您也可以通过手动来安装Linux运行时库。
          您将需要这些程序依赖的Linux共享库,而且您需要创建一个<quote>shadow root</quote>
	  目录<filename>/compat/linux</filename>,任何要被Linux程序打开的共享库都首先在这个目录里面查找。
	  所以,如果一个Linux程序加载了,例如,<filename>/lib/libc.so</filename>,FreeBSD 会首先尝试打开
	  <filename>/compat/linux/lib/libc.so</filename>,如果不存在,它将尝试打开<filename>/lib/libc.so</filename>。
	  共享库应该安装在<filename>/compat/linux/lib</filename>而不是Linux <command>ld.so</command>报告的其他路径。</para>

	<para>通常,您需要寻找Linux程序依赖的共享库。 此后,
	  你的系统上就会有一组 Linux 共享库,
	  这组共享库足以用来运行新安装的 Linux 二进制程序。</para>
      </sect3>

      <sect3>
	<title>如何安装额外的共享库</title>
	<indexterm><primary>共享库</primary></indexterm>

	<para>如果您安装了<filename>linux_base</filename> port,但是您的
	  您的应用程序仍会报告丢失共享库的信息?您如何知道Linux程序需要哪个共享库?
	  基本上,有两种可能性(接下来的指令需要<systemitem class="username">root</systemitem>权限):</para>

	<para>如果您有可以访问的Linux系统, 看看应用程序需要什么共享库,
	把它们复制到您的FreeBSD系统。看下面的例子:</para>

	<informalexample>
	  <para>我们假设您通过FTP得到Linux程序<application>Doom</application>,
	  并把它放在您能访问的Linux系统上。然后您可以通过<command>ldd linuxdoom</command>来检查需要哪些共享库,
	  就像这样:</para>

	  <screen>&prompt.user; <userinput>ldd linuxdoom</userinput>
libXt.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>

	  <indexterm><primary>符号链接</primary></indexterm>
	  <para>您需要得到上面输出的右列的所有文件,并把它们复制到 <filename>/compat/linux</filename>,
	    第一列的名字用符号连接指向它们。这样您的FreeBSD系统上就有了这些文件:</para>

	  <screen>/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -&gt; libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -&gt; libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>

	  <blockquote>
	    <note>
	      <para>如果您已经有了一个与<command>ldd</command> 输出的第一列的主修订号相匹配的Linux共享库,
	      您就已经完成了工作, 而不需要把右列命名的文件复制到您的系统上了。
              如果有一个新的版本, 那无论如何都要复制一个共享库。
	      您可以删掉旧的, 您只要做一个符号连接到新的版本。
	      所以,如果有这些库在您的系统上:
	     </para>

	      <screen>/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.27</screen>

	      <para>如果您根据<command>ldd</command>输出的发现需要一个更新版本的库:</para>

	      <screen>libc.so.4 (DLL Jump 4.5pl26) -&gt; libc.so.4.6.29</screen>

	      <para>如果结尾的数字只有一到两个版本过期,那也不要担心复制 <filename>/lib/libc.so.4.6.29</filename>,
	      因为程序在稍微旧一些的版本上也能很好地工作。
	      然而,如果喜欢的话,您可以替换<filename>libc.so</filename>,变成这样:</para>

	      <screen>/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>
	    </note>
	  </blockquote>

	  <blockquote>
	    <note>
	      <para>符号链接机制 <emphasis>仅仅是</emphasis> Linux 程序需要的。
	      FreeBSD 的运行时连接器会自己寻找匹配的主修订号,您不需要为此担心。</para>
	    </note>
	  </blockquote>
	</informalexample>
      </sect3>
    </sect2>

    <sect2>
      <title>安装Linux ELF程序</title>
      <indexterm>
	<primary>Linux</primary>
	<secondary>ELF程序</secondary>
      </indexterm>

      <para>ELF格式的程序需要一步额外的步骤<quote>标记</quote>。如果您尝试运行没有标记的ELF程序,
      您会得到像下面这样的错误信息:</para>

      <screen>&prompt.user; <userinput>./my-linux-elf-binary</userinput>
ELF binary type not known
Abort</screen>

      <para>为帮助 FreeBSD 内核分辨 FreeBSD ELF
	执行文件和 Linux 执行文件, 需要使用 &man.brandelf.1;
	工具。</para>

      <screen>&prompt.user; <userinput>brandelf -t Linux my-linux-elf-binary</userinput></screen>

      <indexterm><primary>GNU工具</primary></indexterm>
      <para>GNU工具现在会自动把适当的标记信息放到ELF程序中,您以后遇到这个问题的机会越来越少。</para>
    </sect2>

    <sect2>
      <title>安装各种基于 RPM 的应用程序</title>

      <para>FreeBSD 使用自己的包数据库来跟踪所有的 ports (包括 &linux; ports)。
        所以无法使用(不支持) &linux; RPM 数据库。</para>

      <para>如果你需要安装任意的一个基于 RPM 的 &linux; 应用程序,
        可以通过一下的步骤完成:</para>

      <screen>&prompt.root; <userinput>cd /compat/linux</userinput>
&prompt.root; <userinput>rpm2cpio -q &lt; /path/to/linux.archive.rpm | cpio -id</userinput></screen>

      <para>然后对已安装的 ELF 二进制程序(不包括库)运行 brandelf。
        用此种方法安装的程序不能被完全卸载, 但是可能有助于做些测试。</para>
    </sect2>

    <sect2>
      <title>配置主机名解析器</title>

      <para>如果DNS不能正常工作或是您得到下列信息:</para>

      <screen>resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword</screen>

      <para>您就需要配置<filename>/compat/linux/etc/host.conf</filename>文件,此文件包含:</para>

      <programlisting>order hosts, bind
multi on</programlisting>

      <para>order这一行指出<filename>/etc/hosts</filename>先被搜索再接着搜索DNS。
	如果<filename>/compat/linux/etc/host.conf</filename>没有被安装,Linux程序会读取FreeBSD的
	<filename>/etc/host.conf</filename>然后提示不兼容的FreeBSD语法。
	如果您没有使用<filename>/etc/resolv.conf</filename> 文件设置DNS,应该删除<literal>bind</literal></para>
    </sect2>
  </sect1>

  <sect1 xml:id="linuxemu-mathematica">
    <info><title>安装&mathematica;</title>
      <authorgroup>
	<author><personname><firstname>Boris</firstname><surname>Hollas</surname></personname><contrib>Updated for Mathematica 5.X by </contrib></author>
      </authorgroup>
    </info>
    

    <indexterm>
      <primary>applications</primary>
      <secondary><application>Mathematica</application></secondary>
    </indexterm>

    <para>这份文档介绍了如何在 FreeBSD 系统中安装 Linux
      版本的 <application>&mathematica; 5.X</application></para>

    <para>Linux 版本的 <application>&mathematica;</application><application>&mathematica; for Students</application>
      可以直接从 Wolfram 的
      <uri xlink:href="http://www.wolfram.com/">http://www.wolfram.com/</uri> 订购。</para>

    <sect2>
      <title>运行 &mathematica; 安装程序</title>

      <para>首先您应告诉 &os;
	<application>&mathematica;</application> 的 Linux
	可执行文件需要使用 Linux ABI。 达到这一目的最简单的办法,
	是将未加标志的可执行文件的默认 ELF 标记为 Linux,
	输入下面的命令:</para>

      <screen>&prompt.root; <userinput>sysctl kern.fallback_elf_brand=3</userinput></screen>

      <para>这会让 &os; 假定所有未加标志的 ELF 可执行文件,
	都应使用 Linux ABI, 这样就可以直接从 CDROM 执行安装程序了。</para>

      <para>接下来, 需要将 <filename>MathInstaller</filename>
	复制到硬盘上:</para>

      <screen>&prompt.root; <userinput>mount /cdrom</userinput>
&prompt.root; <userinput>cp /cdrom/Unix/Installers/Linux/MathInstaller /localdir/</userinput></screen>

      <para>在这个文件的第一行中, 将 <literal>/bin/sh</literal>
	改为 <literal>/compat/linux/bin/sh</literal>。
	这样就能确保安装程序是使用 Linux
	版本的 &man.sh.1; 来运行的。 接下来, 使用文本编辑器或下面的脚本, 把所有的
	<literal>Linux)</literal> 替换为 <literal>FreeBSD)</literal>。
	由于 <application>&mathematica;</application>
	安装程序会调用 <command>uname -s</command> 来检测操作系统,
	这样做能够让它视 &os; 为一种 类-Linux 操作系统。
	现在执行 <command>MathInstaller</command>
	就能安装 <application>&mathematica;</application> 了。</para>
    </sect2>

    <sect2>
      <title>修改 &mathematica; 执行文件</title>

      <para>在安装
	<application>&mathematica;</application> 的过程中所创建的脚本,
	必须首先进行适当的修改才能使用。
	如果您选择将 <filename>/usr/local/bin</filename>
	作为
	<application>&mathematica;</application> 可执行文件的安装路径,
	则可以在这个目录中找到一些到名为
	<filename>math</filename><filename>mathematica</filename><filename>Mathematica</filename>, 以及
	<filename>MathKernel</filename> 的文件的符号连接。 您可以使用文本编辑器,
	或者下面的 shell 脚本来将这些文件中的
	<literal>Linux)</literal> 改为 <literal>FreeBSD)</literal></para>

      <programlisting>#!/bin/sh
cd /usr/local/bin
for i in math mathematica Mathematica MathKernel
  do sed 's/Linux)/FreeBSD)/g' $i &gt; $i.tmp
  sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp &gt; $i
  rm $i.tmp
  chmod a+x $i
done</programlisting>
    </sect2>

    <sect2>
      <title>获得您的&mathematica; 密码</title>

      <indexterm>
	<primary>以太网</primary>
	<secondary>MAC地址</secondary>
      </indexterm>

      <para>在首次启动 <application>&mathematica;</application>
	时, 您将被问及一个密码。 如果您还未从 Wolfram 获得密码, 则安装目录中的
	<command>mathinfo</command> 可以帮助您获得 <quote>machine ID</quote> (计算机 ID)。
	这个计算机 ID 取决于您第一块以太网卡的 MAC 地址,
	以确保您不在多台机器上运行
	<application>&mathematica;</application></para>

      <para>在通过电子邮件、 电话或传真向 Wolfram 注册时,
	您需要向他们提供 <quote>machine ID</quote>,
	探后它们会给您一个与之对应的由一组数字组成的密码。</para>
    </sect2>

    <sect2>
      <title>通过网络来运行&mathematica;</title>

      <para><application>&mathematica;</application> 使用一些特殊的字体来显示字符,
      与现在使用的标准字体不一样(integrals, sums, Greek letters,等等)。 X协议要求将这些字体安装在
      <emphasis>本地</emphasis>。
      这意味着您需要从<application>&mathematica;</application>的CDROM里面复制这些字体并安装到本地。
	这些字体一般在CDROM的<filename>/cdrom/Unix/Files/SystemFiles/Fonts</filename>里面,
	或本地硬盘的<filename>/usr/local/mathematica/SystemFiles/Fonts</filename>。
	实际的字体在<filename>Type1</filename><filename>X</filename>子目录。有很多种方法来使用它们。
	</para>

      <para>第一种方法是把字体复制到一个已存在的目录<filename>/usr/X11R6/lib/X11/fonts</filename>。
      这需要编辑<filename>fonts.dir</filename>文件。添加字体名字进去,并改变第一行的字体数目。
      另外,您也需要在复制字体的目录下执行&man.mkfontdir.1;。
      </para>

      <para>第二种方法是复制到 <filename>/usr/X11R6/lib/X11/fonts</filename> 目录:</para>

      <screen>&prompt.root; <userinput>cd /usr/X11R6/lib/X11/fonts</userinput>
&prompt.root; <userinput>mkdir X</userinput>
&prompt.root; <userinput>mkdir MathType1</userinput>
&prompt.root; <userinput>cd /cdrom/Unix/Files/SystemFiles/Fonts</userinput>
&prompt.root; <userinput>cp X/* /usr/X11R6/lib/X11/fonts/X</userinput>
&prompt.root; <userinput>cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1</userinput>
&prompt.root; <userinput>cd /usr/X11R6/lib/X11/fonts/X</userinput>
&prompt.root; <userinput>mkfontdir</userinput>
&prompt.root; <userinput>cd ../MathType1</userinput>
&prompt.root; <userinput>mkfontdir</userinput></screen>

      <para>现在,添加新的字体目录到您的字体目录:</para>

      <screen>&prompt.root; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/X</userinput>
&prompt.root; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/MathType1</userinput>
&prompt.root; <userinput>xset fp rehash</userinput></screen>

      <para>如果您正使用 <application>&xorg;</application> 服务器, 则可以通过修改
	<filename>xorg.conf</filename> 文件来自动加载它们。</para>

      <indexterm><primary>fonts</primary></indexterm>

      <para>如果您<emphasis>没有</emphasis>一个叫<filename>/usr/X11R6/lib/X11/fonts/Type1</filename>的目录,
      您可以把<filename>MathType1</filename>改成<filename>Type1</filename></para>
    </sect2>
  </sect1>

  <sect1 xml:id="linuxemu-maple">
    <info><title>安装&maple;</title>
      <authorgroup>
	<author><personname><firstname>Aaron</firstname><surname>Kaplan</surname></personname><contrib>Contributed by </contrib></author>
      </authorgroup>
      <authorgroup>
	<author><personname><firstname>Robert</firstname><surname>Getschmann</surname></personname><contrib>Thanks to </contrib></author>
      </authorgroup>
    </info>
    

    <indexterm>
      <primary>应用程序</primary>
      <secondary><application>Maple</application></secondary>
    </indexterm>

    <para><application>&maple;</application>是一个类似于<application>&mathematica;</application>的商业数学软件。
    您可以从<uri xlink:href="http://www.maplesoft.com/">http://www.maplesoft.com/</uri>买到这个软件并注册得到一个使用许可。
     要在FreeBSD上安装这个软件,请按照下面的步骤:</para>

      <procedure>
	<step><para>从软件的发行包执行<filename>INSTALL</filename> shell脚本。当进入安装程序的提示符时,
	选择<quote>RedHat</quote> 选项。典型的安装目录是<filename>/usr/local/maple</filename></para></step>

        <step><para>如果您不这样做,可以从Maple Waterloo Software (<uri xlink:href="http://register.maplesoft.com/">http://register.maplesoft.com/</uri>)
	为 <application>&maple;</application> 订购一个授权许可。
	然后把它复制到 <filename>/usr/local/maple/license/license.dat</filename></para></step>

        <step><para>通过运行<application>&maple;</application>中的<filename>INSTALL_LIC</filename>安装shell脚本来
	  安装<application>FLEXlm</application>许可管理器。  指定许可服务器为您的机器名。</para></step>

        <step><para>像下面这样Patch您的<filename>/usr/local/maple/bin/maple.system.type</filename>
          文件:</para>
<programlisting>   ----- snip ------------------
*** maple.system.type.orig      Sun Jul  8 16:35:33 2001
--- maple.system.type   Sun Jul  8 16:35:51 2001
***************
*** 72,77 ****
--- 72,78 ----
          # the IBM RS/6000 AIX case
          MAPLE_BIN="bin.IBM_RISC_UNIX"
          ;;
+     "FreeBSD"|\
      "Linux")
          # the Linux/x86 case
        # We have two Linux implementations, one for Red Hat and
   ----- snip end of patch -----</programlisting>

	<para>请注意<literal>"FreeBSD"|\</literal>后面没有空格。</para>

	<para>这个补丁指示<application>&maple;</application><quote>FreeBSD</quote>识别为一种Linux系统。
	 <filename>bin/maple</filename> shell脚本调用<filename>bin/maple.system.type</filename>
	 脚本执行<command>uname -a</command>来查找操作系统名,根据操作系统名,就知道该使用哪个程序。
	 </para></step>

      <step><para>启动许可服务器。</para>

	<para>下面的脚本,安装成<filename>/usr/local/etc/rc.d/lmgrd.sh</filename>,
	是很方便的启动<command>lmgrd</command>的方法:</para>

	<programlisting>   ----- snip ------------

#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin
PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX
export PATH

LICENSE_FILE=/usr/local/maple/license/license.dat
LOG=/var/log/lmgrd.log

case "$1" in
start)
	lmgrd -c ${LICENSE_FILE} 2&gt;&gt; ${LOG} 1&gt;&amp;2
	echo -n " lmgrd"
	;;
stop)
	lmgrd -c ${LICENSE_FILE} -x lmdown 2&gt;&gt; ${LOG} 1&gt;&amp;2
	;;
*)
	echo "Usage: `basename $0` {start|stop}" 1&gt;&amp;2
	exit 64
	;;
esac

exit 0
   ----- snip ------------</programlisting></step>


      <step><para>开始测试<application>&maple;</application></para>
	<screen>&prompt.user; <userinput>cd /usr/local/maple/bin</userinput>
&prompt.user; <userinput>./xmaple</userinput></screen>

<para>您应该成功启动起来了。记得写信告诉Maplesoft您想要一个本地FreeBSD版本!</para></step>
    </procedure>

    <sect2>
      <title>一些缺陷</title>

      <itemizedlist>
	<listitem><para><application>FLEXlm</application>许可管理器可能是一个使用比较困难的工具。
	关于它的额外的文档可以在<uri xlink:href="http://www.globetrotter.com/">http://www.globetrotter.com/</uri>找到。</para></listitem>

	<listitem><para><command>lmgrd</command>对许可文件非常挑剔,有一点问题就会core dump。
	正确的许可文件看起来像下面这样:
	</para>

<programlisting># =======================================================
# License File for UNIX Installations ("Pointer File")
# =======================================================
SERVER chillig ANY
#USE_SERVER
VENDOR maplelmg

FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
         PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \
         ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \
         SN=XXXXXXXXX</programlisting>

	  <note><para>序列号被'X'代替了。 <systemitem>chillig</systemitem>是主机名。</para></note>

  	  <para>只要不修改<quote>FEATURE</quote>行,编辑后一般都能工作。</para></listitem>
      </itemizedlist>
    </sect2>
  </sect1>

  <sect1 xml:id="linuxemu-matlab">
    <info><title>安装&matlab;</title>
      <authorgroup>
	<author><personname><firstname>Dan</firstname><surname>Pelleg</surname></personname><contrib>Contributed by </contrib></author>
	<!-- daniel+handbook@pelleg.org -->
      </authorgroup>
    </info>
    

    <indexterm>
      <primary>应用程序</primary>
      <secondary><application>MATLAB</application></secondary>
    </indexterm>

    <para>这一节描述在一个 &os; 上安装Linux版本的<application>&matlab; version 6.5</application>。
    它工作的很好,除了<application>&java.virtual.machine;</application>例外(参考
      <xref linkend="matlab-jre"/>)。</para>

    <para>Linux版本的<application>&matlab;</application>可以从MathWorks<uri xlink:href="http://www.mathworks.com">http://www.mathworks.com</uri>订购。请确定您也得到了许可文件或安装说明。
      等您成功后,让他们知道您想要一个本地&os;版本。</para>

    <sect2>
      <title>安装&matlab;</title>

      <para>请按照下面的步骤安装<application>&matlab;</application></para>

      <procedure>
	<step>
	  <para><systemitem class="username">root</systemitem>身份插入安装CD并挂载上。
	  推荐使用安装脚本,为了启动安装脚本,键入:</para>

	  <screen>&prompt.root; <userinput>/compat/linux/bin/sh /cdrom/install</userinput></screen>

	  <tip>
	    <para>安装程序是图形的。如果您得到不能打开显示的错误,可以键入
	      <command>setenv HOME ~USER</command><replaceable>USER</replaceable>是您&man.su.1;成的用户。</para>
	  </tip>
	</step>

	<step>
	  <para>
	    当问<application>&matlab;</application>的根目录时,键入:
	    <userinput>/compat/linux/usr/local/matlab</userinput></para>

	  <tip>
	    <para>为了下面的安装过程更方便,在shell提示符下键入
	    <command>set MATLAB=/compat/linux/usr/local/matlab</command></para>
	  </tip>
	</step>

	<step>
	  <para>根据获得<application>&matlab;</application>许可时的指示来编辑许可文件。</para>

	  <tip>
	    <para>您可以用您喜欢的编辑器提前准备这个文件,
	    并在安装程序要您编辑它之前复制到
	    <filename>$MATLAB/license.dat</filename>
	    </para>
	  </tip>
	</step>

	<step>
	  <para>完成安装过程</para>
	</step>
      </procedure>

      <para>到这里,您的<application>&matlab;</application>安装已经完成了。
      接下来的步骤是让它和您的&os; 系统<quote>胶合</quote>在一起。</para>
    </sect2>

    <sect2>
      <title>许可管理器的启动</title>
      <procedure>
	<step>
	  <para>为许可管理器建立符号链接的脚本:</para>

	  <screen>&prompt.root; <userinput>ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW</userinput>
&prompt.root; <userinput>ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW</userinput></screen>
	</step>

	<step>
	  <para>建立启动文件<filename>/usr/local/etc/rc.d/flexlm.sh</filename>。
	  下面的例子是一个<filename>$MATLAB/etc/rc.lm.glnx86</filename>的修改版本。
	  变化的是文件的位置,和模拟Linux下许可管理器的启动。 </para>

	  <programlisting>#!/bin/sh
case "$1" in
  start)
        if [ -f /usr/local/etc/lmboot_TMW ]; then
              /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u <replaceable>username</replaceable> &amp;&amp; echo 'MATLAB_lmgrd'
        fi
        ;;
  stop)
	if [ -f /usr/local/etc/lmdown_TMW ]; then
            /compat/linux/bin/sh /usr/local/etc/lmdown_TMW  &gt; /dev/null 2&gt;&amp;1
	fi
        ;;
  *)
	echo "Usage: $0 {start|stop}"
	exit 1
	;;
esac

exit 0</programlisting>

	  <important>
	    <para>必须使脚本文件可执行:</para>

	    <screen>&prompt.root; <userinput>chmod +x /usr/local/etc/rc.d/flexlm.sh</userinput></screen>

	    <para>您也必须替换<replaceable>username</replaceable>为机器上的一个用户(不要是<systemitem class="username">root</systemitem>)。
	    </para>
	  </important>
	</step>

	<step>
	  <para>用命令启动许可管理器:</para>

	  <screen>&prompt.root; <userinput>/usr/local/etc/rc.d/flexlm.sh start</userinput></screen>
	</step>
      </procedure>
    </sect2>

    <sect2 xml:id="matlab-jre">
      <title>链接&java;运行时环境</title>

      <para>改变<application>&java;</application>运行时环境(JRE),链接到一个可以工作的版本:
      </para>

      <screen>&prompt.root; <userinput>cd $MATLAB/sys/java/jre/glnx86/</userinput>
&prompt.root; <userinput>unlink jre; ln -s ./jre1.1.8 ./jre</userinput></screen>
    </sect2>

    <sect2>
      <title>创建&matlab;启动脚本</title>

      <procedure>
	<step>
	  <para>把下面的启动脚本放到<filename>/usr/local/bin/matlab</filename></para>

	  <programlisting>#!/bin/sh
/compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@"</programlisting>
	</step>

	<step>
	  <para>然后输入命令<command>chmod +x /usr/local/bin/matlab</command></para>
	</step>
      </procedure>

      <tip>
	<para>依赖于您的<package>emulators/linux_base</package>版本,
	您在运行这个脚本时可能会出错,为了避免错误,编辑<filename>/compat/linux/usr/local/matlab/bin/matlab</filename>,
	把这行:</para>

	<programlisting>if [ `expr "$lscmd" : '.*-&gt;.*'` -ne 0 ]; then</programlisting>

	<para>(在13.0.1版本是在第410行)改成:</para>

	<programlisting>if test -L $newbase; then</programlisting>
      </tip>
    </sect2>

    <sect2>
      <title>Creating a &matlab; Shutdown Script</title>

      <para>The following is needed to solve a problem with &matlab;
	not exiting correctly.</para>

      <procedure>
	<step>
	  <para>Create a file
	    <filename>$MATLAB/toolbox/local/finish.m</filename>, and
	    in it put the single line:</para>

	  <programlisting>! $MATLAB/bin/finish.sh</programlisting>

	  <note><para>The <literal>$MATLAB</literal> is
	    literal.</para></note>

	  <tip>
	    <para>In the same directory, you will find the files
	      <filename>finishsav.m</filename> and
	      <filename>finishdlg.m</filename>, which let you save
	      your workspace before quitting.  If you use either of
	      them, insert the line above immediately after the
	      <literal>save</literal> command.</para></tip>
	</step>

	<step>
	  <para>Create a file
	    <filename>$MATLAB/bin/finish.sh</filename>, which will
	    contain the following:</para>

	  <programlisting>#!/usr/compat/linux/bin/sh
(sleep 5; killall -1 matlab_helper) &amp;
exit 0</programlisting>
	</step>

	<step>
	  <para>Make the file executable:</para>

	  <screen>&prompt.root; <userinput>chmod +x $MATLAB/bin/finish.sh</userinput></screen>
	</step>
      </procedure>
    </sect2>

    <sect2 xml:id="matlab-using">
      <title>使用&matlab;</title>

      <para>现在您已经可以键入
	<command>matlab</command> 并开始使用它了。</para>
    </sect2>
  </sect1>

  <sect1 xml:id="linuxemu-oracle">
    <info><title>安装&oracle;</title>
      <authorgroup>
	<author><personname><firstname>Marcel</firstname><surname>Moolenaar</surname></personname><contrib>Contributed by </contrib></author>
	<!-- marcel@cup.hp.com -->
      </authorgroup>
    </info>
    

    <indexterm>
      <primary>应用程序</primary>
      <secondary><application>Oracle</application></secondary>
    </indexterm>

    <sect2>
      <title>前言</title>
      <para>这节描述在FreeBSD上安装Linux版的<application>&oracle; 8.0.5</application><application>&oracle; 8.0.5.1 Enterprise Edition</application></para>
    </sect2>

    <sect2>
      <title>安装Linux环境</title>

      <para>确信您已经从 Ports Collection 安装了 <package>emulators/linux_base</package><package>devel/linux_devtools</package>。 如果在使用这些 port
	时遇到困难, 您可能就不得不从 package, 或使用较早版本的 Ports Collection
	来安装。</para>

      <para>如果要运行智能代理, 您还需要安装 Red Hat Tcl 软件包:
	<filename>tcl-8.0.3-20.i386.rpm</filename>。
	用于安装官方的 <application>RPM</application>
	(<package>archivers/rpm</package>) 软件包的命令是:</para>

      <screen>&prompt.root; <userinput>rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package</userinput></screen>

      <para><replaceable></replaceable>的安装通常不会出错。 </para>
    </sect2>

    <sect2>
      <title>创建&oracle;环境</title>

      <para>安装<application>&oracle;</application>之前,您需要设置正确的环境。
      这节只描述了在FreeBSD下安装Linux版本<application>&oracle;</application>需要<emphasis>特别</emphasis>注意的地方。
      不像在<application>&oracle;</application>安装指南中所描述的那样。
   </para>

      <sect3 xml:id="linuxemu-kernel-tuning">
        <title>调整内核</title>
	<indexterm><primary>调整内核</primary></indexterm>

	<para>正如<application>&oracle;</application>安装指南描述的那样,您需要设置共享内存的最大值。
	不要在FreeBSD下使用<literal>SHMMAX</literal><literal>SHMMAX</literal>
	 只是用来计算<literal>SHMMAXPGS</literal><literal>PGSIZE</literal>的。
	 因此要使用<literal>SHMMAXPGS</literal>。所有其他要使用的选项可以参考指南,例如:</para>

	<programlisting>options SHMMAXPGS=10000
options SHMMNI=100
options SHMSEG=10
options SEMMNS=200
options SEMMNI=70
options SEMMSL=61</programlisting>

	<para>设置这些选项来适应 <application>&oracle;</application>的使用。</para>

	<para>当然,确信您的内核配置文件中有下面这些选项:</para>

<programlisting>options SYSVSHM #SysV shared memory
options SYSVSEM #SysV semaphores
options SYSVMSG #SysV interprocess communication</programlisting>
      </sect3>

      <sect3 xml:id="linuxemu-oracle-account">

        <title>&oracle;帐号</title>

	<para>创建一个<systemitem class="username">oracle</systemitem>帐号,正如您创建其他帐号一样。
	<systemitem class="username">oracle</systemitem> 帐号特殊的地方是您需要给它一个Linux shell。
	添加<literal>/compat/linux/bin/bash</literal><filename>/etc/shells</filename>,
	然后设置<systemitem class="username">oracle</systemitem>帐号的shell为<filename>/compat/linux/bin/bash</filename></para>
      </sect3>

      <sect3 xml:id="linuxemu-environment">
        <title>环境</title>

	<para>除了普通的<application>&oracle;</application>变量外,
	比如<envar>ORACLE_HOME</envar><envar>ORACLE_SID</envar>,您还必须设置下面的环境变量:</para>

	<informaltable frame="none" pgwide="1">
	  <tgroup cols="2">
          <colspec colwidth="1*"/>
          <colspec colwidth="2*"/>
	    <thead>
	      <row>
		<entry>变量</entry>

		<entry></entry>
	      </row>
	    </thead>
	    <tbody>
	      <row>
		<entry><envar>LD_LIBRARY_PATH</envar></entry>

		<entry><literal>$ORACLE_HOME/lib</literal></entry>
	      </row>

	      <row>
		<entry><envar>CLASSPATH</envar></entry>

		<entry><literal>$ORACLE_HOME/jdbc/lib/classes111.zip</literal></entry>
	      </row>

	      <row>
		<entry><envar>PATH</envar></entry>

		<entry><literal>/compat/linux/bin
/compat/linux/sbin
/compat/linux/usr/bin
/compat/linux/usr/sbin
/bin
/sbin
/usr/bin
/usr/sbin
/usr/local/bin
$ORACLE_HOME/bin</literal></entry>
	      </row>
	    </tbody>
	  </tgroup>
	</informaltable>

        <para>建议在<filename>.profile</filename>里面设置所有的环境变量。一个完整的例子是:
	</para>

<programlisting>ORACLE_BASE=/oracle; export ORACLE_BASE
ORACLE_HOME=/oracle; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH
ORACLE_SID=ORCL; export ORACLE_SID
ORACLE_TERM=386x; export ORACLE_TERM
CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
export CLASSPATH
PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin
PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin
PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin
export PATH</programlisting>
      </sect3>
    </sect2>

    <sect2>
      <title>安装&oracle;</title>

      <para>由于 Linux 模拟器的一处小小的差异, 您必须在 <filename>/var/tmp</filename>
	中创建一个名为 <filename>.oracle</filename> 的目录才能够启动安装程序。
	需要把它设置为属于 <systemitem class="username">oracle</systemitem> 用户。 接下来,
	您就可以毫无问题地安装 <application>&oracle;</application> 了。
	如果您遇到问题, 请首先检查 <application>&oracle;</application>
	软件包和/或配置文件!安装完 <application>&oracle;</application>
	之后, 使用下面两节中所说的补丁。</para>

      <para>一个比较常见的问题是 TCP 协议适配器安装不正确。
	其结果是将无法进行任何的 TCP 侦听。 下面的操作将帮助解决此问题:</para>

      <screen>&prompt.root; <userinput>cd $ORACLE_HOME/network/lib</userinput>
&prompt.root; <userinput>make -f ins_network.mk ntcontab.o</userinput>
&prompt.root; <userinput>cd $ORACLE_HOME/lib</userinput>
&prompt.root; <userinput>ar r libnetwork.a ntcontab.o</userinput>
&prompt.root; <userinput>cd $ORACLE_HOME/network/lib</userinput>
&prompt.root; <userinput>make -f ins_network.mk install</userinput></screen>

      <para>不要忘记了再运行一下<filename>root.sh</filename></para>

    <sect3 xml:id="linuxemu-patch-root">
      <title>修补root.sh</title>

	<para>从CD安装<application>&oracle;</application>时,一些工作需要在<systemitem class="username">root</systemitem>下执行,
	这些工作都被记录在一个叫<filename>root.sh</filename>的脚本里面。这个脚本被写在<filename>orainst</filename>目录。
	为了使用<filename>root.sh</filename>来正确定位<command>chown</command>或在Linux本地shell下执行脚本,
	应该对它进行修补。</para>

	<programlisting>*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998
--- orainst/root.sh Mon Dec 28 15:58:53 1998
***************
*** 31,37 ****
# This is the default value for CHOWN
# It will redefined later in this script for those ports
# which have it conditionally defined in ss_install.h
! CHOWN=/bin/chown
#
# Define variables to be used in this script
--- 31,37 ----
# This is the default value for CHOWN
# It will redefined later in this script for those ports
# which have it conditionally defined in ss_install.h
! CHOWN=/usr/sbin/chown
#
# Define variables to be used in this script</programlisting>

	<para>当您不从CD安装<application>&oracle;</application>时,
	您可以从源代码来修补<filename>root.sh</filename>。
	它叫做<filename>rthd.sh</filename>,定位在源代码树的<filename>orainst</filename>目录。
	</para>
      </sect3>

      <sect3 xml:id="linuxemu-patch-tcl">
	<title>修补genclntsh</title>

	<para><command>genclntsh</command>脚本用来创建一个简单的共享客户端库。在建立demos时被使用。
	完成补丁后就注释掉了下面的<envar>PATH</envar>变量:</para>

	<programlisting>*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998
--- bin/genclntsh Tue Dec 22 15:36:49 1998
***************
*** 32,38 ****
#
# Explicit path to ensure that we're using the correct commands
#PATH=/usr/bin:/usr/ccs/bin export PATH
! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
#
# each product MUST provide a $PRODUCT/admin/shrept.lst
--- 32,38 ----
#
# Explicit path to ensure that we're using the correct commands
#PATH=/usr/bin:/usr/ccs/bin export PATH
! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
#
# each product MUST provide a $PRODUCT/admin/shrept.lst</programlisting>
      </sect3>
    </sect2>

    <sect2>
      <title>运行&oracle;</title>

      <para>如果您已经按上面的指示去操作,您应该可以像在Linux下运行<application>&oracle;</application>了。 </para>
    </sect2>
  </sect1>

  <sect1 xml:id="linuxemu-advanced">
    <title>高级主题</title>

    <para>如果您对Linux兼容模式是如何工作的感到好奇,这节正是您所需要的。 下面的绝大部分内容是由
    Terry Lambert<email>tlambert@primenet.com</email> (Message ID:
      <literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>)发表在邮件列表&a.chat;上的内容组成的。
      </para>

    <sect2>
      <title>它是如何工作的?</title>
      <indexterm><primary>可执行类加载器</primary></indexterm>

      <para>FreeBSD有一个<quote>可执行类加载器</quote>。它主要是嵌入了&man.execve.2;系统调用。
</para>


      <para>碰巧的是FreeBSD有一个引导器(loader)的列表,而不是一个简单的返回一个
      符号 <literal>#!</literal>的引导器!</para>

      <para>从历史上来讲,只有&unix;平台的引导器会检查魔术(magic)数
      (通常是文件的前4个或8个字节)是否是二进制的,
      如果是,就调用二进制引导程序。</para>



      <para>如果它不是二进制类型的&man.execve.2;调用就会返回一个错误,shell就试图用shell命令执行它。
      </para>

      <para>缺省是使用<quote>当前设定的shell</quote></para>



      <para>随后,进行了一些hack, &man.sh.1;开始检查前两个字符,如果它们是<literal>:\n</literal>,
      那它就调用&man.csh.1;(我们相信是SCO最先做这个hack的)。</para>

      <para>FreeBSD现在所做的是用一个普通的<literal>#!</literal>引导器仔细检查引导器的列表,
      然后由解释程序一个接一个地解释,返回给<filename>/bin/sh</filename></para>
      <indexterm><primary>ELF</primary></indexterm>

      <para>为了支持Linux ABI,FreeBSD就把魔术数看作为一个二进制ELF程序。(
      这样一来,它就使得在FreeBSD, &solaris;,Linux和其他任何操作系统之间只要使用ELF格式就都可以顺利运行)。
      </para>
      <indexterm><primary>Solaris</primary></indexterm>

      <para>ELF引导器会寻找一个专门的<emphasis>标记</emphasis>,
       它是在ELF映像中的一个注释部分,但在SVR4/&solaris;的ELF中没有。
</para>

      <para>为了执行Linux程序,它们必须被打上<literal>Linux</literal>类型的<emphasis>标记</emphasis>;
      使用&man.brandelf.1;:</para>

      <screen>&prompt.root; <userinput>brandelf -t Linux file</userinput></screen>



      <para>做完之后,ELF引导器就会看到文件上的<literal>Linux</literal>的标记。
      </para>
      <indexterm>
        <primary>ELF</primary>
	<secondary>标记</secondary>
      </indexterm>

      <para>当ELF引导器看到<literal>Linux</literal>的标记,
      引导器就会在<literal>proc</literal>结构中替换一个指示器。
      所有的系统调用就会通过这个指示器来索引(在一个传统的 &unix;系统中,
      这就是<literal>sysent[]</literal>结构队列,包含系统调用)。
     此外,为了解决由于信号杂乱所造成的陷阱向量的问题,会造成线程的剧增,
     需要切断其他(或较小的)由Linux内核模块产生的修正。
      </para>



      <para>Linux系统调用向量包含一个<literal>sysent[]</literal>记录的列表,
      它的地址位于内核模块之中。</para>

      <para>当一个系统调用被Linux程序调用时,有缺陷的代码会把系统调用功能的指示器从<literal>proc</literal>结构中解除,
      然后获得Linux,而不是FreeBSD,系统调用入口点。</para>

      <para>另外,Linux模式动态地<emphasis>reroots</emphasis>查找;这和启动文件系统的<option>union</option>
      选项是等效的(即时不是<literal>unionfs</literal>文件系统)。
      首先会试图在<filename>/compat/linux/original-path</filename>
      目录查找文件,如果失败了,就会在<filename>/original-path</filename>
      目录下查找。这使得需要其它程序的程序可以运行(例如,Linux工具链都可以在Linux ABI的支持下工作)。
      也就是说Linux程序可以加载和执行FreeBSD程序,如果当前没有相应的Linux程序,
      那您可以在<filename>/compat/linux</filename>目录树中放置一个&man.uname.1;,使 Linux 程序不易察觉它们并没有运行在 Linux 系统上。
	</para>

      <para>在FreeBSD内核中有一个Linux内核;由内核提供的能够提供所有服务的各种潜在功能
      在FreeBSD系统调用表记录和Linux系统调用表记录之间是一样的:
      文件系统操作,虚拟内存操作,信号发送,System V IPC,&hellip;等等。
      唯一的不同是FreeBSD会得到FreeBSD的<emphasis>胶合</emphasis>功能,
      而Linux程序会得到Linux的<emphasis>胶合</emphasis>功能
      (大部分老的操作系统只有它们自己的<emphasis>胶合</emphasis>函数,
      函数地址在静态全局变量<literal>sysent[]</literal>结构数据里面,
      而不是动态的初始化到进程的<literal>proc</literal>结构)。
      </para>



      <para>哪一个是FreeBSD自己的ABI呢?这无关紧要。基本上,
      唯一的不同是FreeBSD的<emphasis>胶合</emphasis>功能是被静态连接到内核,
      而Linux的<emphasis>胶合</emphasis>功能可能是被静态连接到内核,
      也可能它们通过一个内核模块来访问。
      </para>



      <para>有一个真正的模拟器吗?没有,它只不过是一个ABI执行机制,不是一个模拟器。</para>

      <para>为什么有时它被叫做<quote>Linux模拟器</quote>?
      只是为了更容易地卖出FreeBSD罢了!
      实际上,历史上从来没有描述这样一种执行机制的名字,FreeBSD并不是真正地运行Linux程序,如果您不编译进代码,
      或加载一个模块。
      就需要有一个名字来描述这样一种加载功能--因此就想出了<quote>Linux模拟器</quote>这样一个名字。
      </para>
    </sect2>
  </sect1>
</chapter>