freebsd学习笔记(二)

发表于:2007-05-26来源:作者:点击数: 标签:
1.定制内核 建立并安装一个定制的内核 例子假定您使用 i386 架构的计算机。 如果您的情况不是这样,只需对目录名作相应的调整即可。 光盘安装 # mount /cdrom # mkdir -p /usr/src/sys # ln -s /usr/src/sys /sys # cat /cdrom/src/ssys.[a-d]* | tar -xzvf
1.定制内核
 建立并安装一个定制的内核
 例子假定您使用 i386 架构的计算机。 如果您的情况不是这样,只需对目录名作相应的调整即可。
光盘安装
# mount /cdrom
# mkdir -p /usr/src/sys
# ln -s /usr/src/sys /sys
# cat /cdrom/src/ssys.[a-d]* | tar -xzvf -
接下来, 进入 arch/conf 目录下面, 复制 GENERIC 配置文件,并给这个文件起一个容易辨认的名称, 它就是您的内核名称。例如:
# cd /usr/src/sys/i386/conf
# cp GENERIC FREEBSD5.3

通常,这个名称是大写的,如果您正维护着多台不同硬件的FreeBSD机器,以您机器的域名来命名是非常好的主意。我们把它命名为FREEBSD5.3
就是这个原因。提示: 将您的内核配置文件直接保存在 /usr/src 可能不是一个好主意。 如果您遇到问题, 删掉 /usr/src 并重新开始很
可能是一个诱人的选择。 一旦开始做这件事,您可能几秒钟之后才会意识到您同时会删除定制的内核配置文件。 另外, 也不要直接编辑 GENERIC, 因为
下次您 更新代码 时它会被覆盖, 而您的修改也就随之丢失了。
您也可以考虑把内核配置文件放到别的地方, 然后再到 i386 目录中创建一个指向它的符号链接。
例如:
# cd /usr/src/sys/i386/conf
# mkdir /root/kernels
# cp GENERIC /root/kernels/FREEBSD5.3  
# ln -s /root/kernels/FREEBSD5.3
注意: 必须以 root 身份执行这些和接下来命令,否则就会得到 permission denied 的错误提示。

如果您只安装内核源代码,使用方法1。
如果您正运行 FreeBSD 4.0 以前的版本, 而且您不是准备使用 make buildworld 来升级到 FreeBSD 4.0 或更高版本的话, 则应使用方法1。
如果您在没有升级源代码的情况下编译一个新内核(也许您只想为内核添加一个新的选项, 如IPFIREWALL),可以使用任何一种方法。
如果您打算把重新构建内核作为 make buildworld 过程的一部分来进行, 则应使用方法 2。
如果从上次成功地完成 buildworld-installworld 以来您还 没有 升级过代码 (也就是没有运行 CVSup、 CTM, 或使用 anoncvs), 则可以
放心使用 config、 make depend、 make、 make install。

方法1. 用“传统”方法建立一个内核
运行config(8)来产生内核源代码。
# /usr/sbin/config FREEBSD5.3
进入编译内核的目录。 config(8) 将在像上面一样显示执行它所在的目录的名字。
# cd ../compile/FREEBSD5.3
对于 FreeBSD 5.0 以及更早的版本, 使用下面的形式:
# cd ../../compile/FREEBSD5.3
编译内核。
# make depend
# make
安装新内核。
# make install

方法2. 用“新的”方法建立一个内核
切换到/usr/src 目录。
# cd /usr/src
编译内核。
# make buildkernel KERNCONF=FREEBSD5.3
安装新内核。
# make installkernel KERNCONF=FREEBSD5.3
注意: 在FreeBSD 4.2老版本里面您必须用KERNEL= 来替换KERNCONF=。
2001年2月2日以后生成的4.2-STABLE 就可以认出KERNCONF=。
新内核将会被复制到 /boot/kernel 目录中成为 /boot/kernel/kernel 而旧的则被移到 /boot/kernel.old/kernel。 现在关闭系统,
然后用新的内核启动计算机。如果出现问题, 后面的一些 故障排除方法 将帮您摆脱困境。 如果您的内核 无法启动, 请参考那一节。
注意: 在 FreeBSD 4.X 以及更早的版本中, 内核被安装到 /kernel 而模块则放到 /modules,旧的内核则被备份到 /kernel.old。 其他
与启动过程相关的文件, 如 loader(8) 以及配置则放在 /boot。 第三方或定制的模块也可以放在 /modules, 不过应该注意保持模块和
内核的同步时很重要的,否则会导致不稳定和错误。
注意: 如果添加了新设备 (例如声卡) 并在运行 FreeBSD 4.X 或更早的版本,则可能好需要在 /dev 目录中添加它们的设备节点之后才能使
用。欲了解详情,请参考本章稍后的 制作设备节点 一节。


2.Linux二进制兼容模式
 
  1. 让FREEBSD支持linux二进制程序,在我安装的FREEBSD5.3中安装后默认是自动加载该模块的
  如果您安装的系统默认没有加载该模块,请首先可以用以下命令查看是否加载到该模块
  #kldstat
   Id Refs Address    Size     Name
   1    7 0xc0400000 5cdab0   kernel
   2   14 0xc09ce000 537f0    acpi.ko
   3    1 0xc13e1000 17000    linux.ko
   如果您的系统默认没有加载,可以修改
   #vi /etc/rc.conf
   添加 linux_enable='Yes'  系统启动后自动加载。
  如果您不想或者无法将Linux KLD加载,您就需要在内核中静态链接进Linux二进制兼容模式。您必须在您的内核
  配置文件里面加入options COMPAT_LINUX,然后重新编译内核。
 
 2.安装Linux运行时库
       a.通过使用 linux_base Port 来安装
          这是最容易的安装方法,只需要像安装其他port一样从 Ports Collection来安装:
   # cd /usr/ports/emulators/linux_base
   # make install distclean
       b.手动安装
   如果您没有安装 Ports Collection,您也可以通过手动来安装Linux运行时库。您将需要这些程序依赖的Linux共享库,而且您
          需要创建一个“shadow root” 目录/compat/linux,我安装的是FREEBSD5.3版本的,默认加载了linux.ko库,目录默认存在,
     任何要被Linux程序打开的共享库都首先在这个目录里面查找。所以,如果
          一个Linux程序加载了,例如,/lib/libc.so,FreeBSD 会首先尝试打开 /compat/linux/lib/libc.so,如果不存在,它将尝试
          打开/lib/libc.so。 共享库应该安装在/compat/linux/lib而不是Linux ld.so报告的其他路径。
   通常,您需要寻找Linux程序依赖的共享库。 此后, 你的系统上就会有一组 Linux 共享库,这组共享库足以用来运行新安装的
   Linux 二进制程序。
         这些条件满足后就可以安装linux下的二进制软件包了。下载linux二进制包squid-2.5.STABLE9-20050225.tar.gz
     #tar -zxvf squid-2.5.STABLE9-20050225.tar.gz
         #cd squid-2.5.STABLE9-20050225  查看INSTALL文件,执行安装
  #./configure --prefix=/usr/local/squid  成功后
  #make all 编译没有产生错误后
         #make install
         OK安装成功,进行必要的配置后启动squid代理。
  #/usr/local/squid/sbin/squid
    如果在安装的过程中提示需要一些模块可以能过一台装有安装linux的机器,执行
  #cd /usr/local/apache/bin/
    #ldd httpd(linux二进制包,编译安装的)
 libcrypt.so.1 => /lib/libcrypt.so.1 (0x4001e000)
        libresolv.so.2 => /lib/libresolv.so.2 (0x4004b000)
        libm.so.6 => /lib/tls/libm.so.6 (0x4005d000)
        libdl.so.2 => /lib/libdl.so.2 (0x4007f000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x40082000)
        libexpat.so.0 => /usr/lib/libexpat.so.0 (0x40097000)
        libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
       能后把在FREEBSD中缺少的模块直接copy到FREEBSD下的/compat/linux/lib相应目录下既可重新安装了。

   安装Linux ELF程序
 ELF格式的程序需要一步额外的步骤“标记”。如果您尝试运行没有标记的ELF程序,您会得到像下面这样的错误信息:
 % ./my-linux-elf-binary
 ELF binary type not known Abort
 为了帮助FreeBSD内核分辨FreeBSD ELF程序和Linux程序,要使用brandelf(1)工具:
 % brandelf -t Linux my-linux-elf-binary
 GNU工具现在会自动把适当的标记信息放到ELF程序中,您以后遇到这个问题的机会越来越少。

3.配置主机名解析器
如果DNS不能正常工作或是您得到下列信息:
resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword
您就需要配置/compat/linux/etc/host.conf文件,此文件包含:
order hosts, bind
multi on
order这一行指出/etc/hosts先被搜索再接着搜索DNS。 如果/compat/linux/etc/host.conf没有被安装,Linux程序会读取
FreeBSD的 /etc/host.conf然后提示不兼容的FreeBSD语法。 如果您没有使用/etc/resolv.conf 文件设置DNS,应该删除bind。
待续

原文转自:http://www.ltesting.net