FreeBSD文档

作者: Jerry 最后更新时间: 2004年5月18日

本文可以随意转载, 无需通知作者, 但请注明:"本文最新文档可以从http://zhdotemacs.sourceforge.net上获得, E-mail: unidevel@hotpop.com".


Table of Contents
1 最近更新
1.1 2004年05月18日
1.2 2004年04月29日
1.3 2004年03月12日
2 FreeBSD下相关工具安装
2.1 FDP相关工具安装
2.1.1 FreeBSD下FDP工具的安装
2.1.2 Windows下FDP工具的安装
2.2 mtools
2.3 FreeBSD下QQ的安装方法
2.4 shlight -- 访问windows共享文件夹
3 FreeBSD下网络配置
3.1 安装配置DHCP
3.1.1 DHCP的安装
3.1.2 DHCP的配置
3.2 VPN的安装配置
3.2.1 mpd的安装
3.2.2 mpd的配置
3.3 NAT的安装配置
3.3.1 NAT的安装
3.3.2 NAT的配置
3.4 使用SOCKS代理上网
3.4.1 SOCKS的安装
3.4.2 SOCKS5的配置
4 FreeBSD系统管理和维护
4.1 FreeBSD系统备份恢复及迁移
4.1.1 系统迁移
4.2 FreeBSD下的系统监控工具
4.2.1 使用SNP Watch监控用户
4.2.2 使用smartmontools监视硬盘状态
5 IBM Thinkpad R40e 上安装配置FreeBSD 4-stable
5.1 基本安装
5.2 X-Window的配置
6 FreeBSD常见问题集合
6.1 FreeBSD常用命令及脚本
6.2 FreeBSD安装配置常见问题

Chapter 1 最近更新

Jerry

1.1 2004年05月18日

  1. 新增 Section 4.1.1FreeBSD系统迁移.

  2. 新增 Section 4.2.1使用SNP Watch监控用户.

  3. 新增 Section 4.2.2使用smartmontools监视硬盘状态.


1.2 2004年04月29日

  1. 新增 Chapter 5IBM Thinkpad R40e 上安装配置FreeBSD 4-stable.


1.3 2004年03月12日

  1. 新增 Section 3.4使用SOCKS代理上网.


Chapter 2 FreeBSD下相关工具安装

Jerry

本章简介FreeBSD下常见工具的安装


2.1 FDP相关工具安装

FreeBSD Document Project简称FDP, 是FreeBSD的文档标准, 同 LDP(Linux Document Project)一样, 都是使用sgml格式, 由相关工具生成 各种格式的文档


2.1.1 FreeBSD下FDP工具的安装

FreeBSD的ports为我们简化了整个安装的过程, 不过还是简单的说一 下吧, 首先安装textproc/ghostscript-gnu, 然后安装graphic/peps, 最 后到textproc/docproj下make -DJADETEX=no install进行安装, 基本上 应该可以一次搞定. 还是ports好


2.1.2 Windows下FDP工具的安装

也许用惯FreeBSD的会问为什么要用Windows, 它可以吗? 我一次出差 本来以为拿了硬盘, 找台机器用就可以了(没本本就是不爽), 结果别人给 了个本本, 因为不是自己的, 所以不能够装上我钟爱的FreeBSD, 只能用 瘟到死, 感觉实在不爽, 被迫想了些办法, 使得我使用FDP制作的文档在 Windows下可以使用了

我看了docproj安装的软件, 有一大把, 偷了下懒, 从FreeBSD系统下将 /usr/local/share/sgml和/usr/local/share/xml下的东西打包先拷贝出 来, 首先要安装的当然是cygwin, 除了FreeBSD我就喜欢它了, 把windows 变得和unix环境差不多, 安装时要装links, tidy和ghostscript, 然后把 从FreeBSD下抓来的那两个目录拷贝到cygwin对应的目录下, 比较难找的 是cygwin下的openjade和pmake, 这个可以从下载区内下到, 已经编译成 Windows的可执行程序, 忘记了还要从FreeBSD下把/usr/share/mk打包拷 贝出来, 这个东东也比较重要, 这就差不多了, 把文档源代码从FreeBSD 下拷贝出来, 使用pmake就可以编译了, 不知道能不能把ports搞过来, ports实在是太完美了.

windows的FDP可以通过 ftp://hhd.kingisme.com/incoming/FDP4cygwin 下载, 具体安装见README


2.2 mtools

mtools用于操作dos分区, 配置文件是${INSTDIR}/etc/mtools.conf, 在这个文件中设置各个盘符的信息, 例如设置a:和c:如下

drive a: file="/backup/pal/a.img"
drive c: file="/backup/pal/pal.img" partition=1
   

新建分区, 例如分112M的分区, 注意这里要配置c:为112.disk的全路径

# truncate -S 112M 112.disk
# mpartition -I -s 900 -t 17 -h 15 c:
# mpartition -cpv -s 900 -t 17 -h 15 c:
# mformat c:
   

2.3 FreeBSD下QQ的安装方法

  1. 首先, 下载gaim-0.58-1.i386.rpm

  2. 然后, 下载libqq-0.0.3-ft-0.58-gcc296.so.gz或者libqq-0.0.3-ft-0.58-gcc31.so.gz

  3. 下载gdk-pixbuf-0.14.0-0.7.2.i386.rpm

  4. kldstat检查一下是否调入了linux.ko, 我的环境是linux_base-8-8.0_1, linux-gtk-1.2_2, linux-gnomelibs-1.2.8_2, linux-esound-0.2.22_1.

  5. $ rpm2cpio gaim-0.58-1.i386.rpm > gaim.cpio
    $ rpm2cpio gdk-pixbuf-0.14.0-0.7.2.i386.rpm > gdk-pixbuf.cpio
    $ cpio -i -d < gaim.cpio
    $ cpio -i -d < gdk-pixbuf.cpio
    $ gunzip libqq*.gz
    # cp -r ./usr /usr/compat/linux/
    # cp libqq*.so /usr/compat/linux/lib/gaim
    
  6. 最后, 启动/usr/compat/linux/usr/bin/gaim, 然后调入libqq.so就可以了


2.4 shlight -- 访问windows共享文件夹

shlight对中文支持也很好, 我在FreeBSD 5.2上测试过

# cd /usr/ports/net/sharity-light/
# make all install clean
# mkdir /music
# echo "10.0.0.1 winhost" >> /etc/hosts
# shlight //winhost/music /music -U user -P password
# unshlight /music
   

Chapter 3 FreeBSD下网络配置

Jerry

本章介绍我的FreeBSD网络配置


3.1 安装配置DHCP

3.1.1 DHCP的安装

在FreeBSD上安装DHCP, 首先需要确定内核配置中有 `pseudo-device bpf'选项, 然后可以从ports下的 net/isc-dhcp3安装dhcp, 安装没什么好讲的, 直接安装就是了


3.1.2 DHCP的配置

我配置了一个简单的, 主要有下面的几个文件

/usr/local/etc/dhcpd.conf

option domain-name "unidevel.com";
option domain-name-servers 88.1.16.4;

default-lease-time 600;
max-lease-time 7200;

authoritative;

ddns-update-style none;

subnet 88.1.16.0 netmask 255.255.255.0 {
  range 88.1.16.150 88.1.16.200;
  option routers 88.1.16.4;
}
   

然后, 拷贝一个启动脚本

# cp /usr/local/etc/rc.d/isc-dhcpd.sh.sample /usr/local/etc/rc.d/isc-dhcpd.sh
# chmod a+x /usr/local/etc/rc.d/isc-dhcpd.sh
# /usr/local/etc/rc.d/isc-dhcpd.sh start
   

上面对88.1.16网段使用DHCP, 配置为主DHCP服务器, DHCP的网段为88.1.16.150 - 88.1.16.200, 缺省的路由器是88.1.16.4, 缺省的DNS为88.1.16.4


3.2 VPN的安装配置

目标: 达到使用Windows 2000/XP进行VPN拨号连接, 软件选用mpd


3.2.1 mpd的安装

通过ports安装mpd

# cd /usr/ports/net/mpd
# make all install clean
   

3.2.2 mpd的配置

VPN配置文件有mpd.conf, mpd.links, mpd.secret

/usr/local/etc/mpd/mpd.conf配置如下:

default:
    load vpn
vpn:
    new -i ng1 vpn vpn
    set iface disable on-demand
    set iface addrs 192.168.0.1
    set iface idle 0
    set iface route 192.168.0.0/24
    set bundle disable multilink
    set bundle authname "VpnLogin"
    set bundle password "VpnPassword"
    set link yes acfcomp protocomp
    set link no pap
    set link yes chap
    set link mtu 1460
# If remote machine is NT you need this..
#   set link enable no-orig-auth
    set link keep-alive 10 75
    set ipcp yes vjcomp
    set ipcp ranges 192.168.0.1/32 192.168.0.254/32
#
# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type.
#
    set bundle enable compression
    set ccp yes mppc
    set ccp yes mpp-e40
    set ccp yes mpp-e128
    set bundle enable crypt-reqd
    set ccp yes mpp-stateless
    open
   

/usr/local/etc/mpd/mpd.links配置如下:

vpn:
        set link type pptp
        set pptp self 192.168.0.1
#        set pptp peer 2.3.4.5
        set pptp enable originate incoming outcall
   

/usr/local/etc/mpd/mpd.secret是用户的帐号和密码:

jerry      "11111111"
emma            "88888888"
test        "test"      192.168.0.254      
   

/usr/local/etc/rc.d/mpd.sh

#! /bin/sh
case $1 in
start)
    [ -x /usr/local/sbin/mpd ] && \
        [ -f "/usr/local/etc/mpd/mpd.conf" ] && \
        /usr/local/sbin/mpd -b && \
        echo -n ' mpd'
    ;;
stop)
    killall mpd && echo -n ' mpd'
    ;;
*)
    echo "Usage: `basename $0` {start|stop}" <&2
    exit 64
    ;;
esac
exit 0
   

使用`mpd.sh start'启动, 在另一台WinXP上添加网络连接, 使用VPN, 输入用户和密码及主机地址就可以连上了


3.3 NAT的安装配置

3.3.1 NAT的安装

在 FreeBSD 5.X 上安装NAT, 首先需要确定内核配置中有下面的选项

options        IPDIVERT
options     IPFIREWALL
options     IPFIREWALL_VERBOSE
options     IPFIREWALL_VERBOSE_LIMIT=10
options     IPFIREWALL_DEFAULT_TO_ACCEPT
   

3.3.2 NAT的配置

根据Handbook上说的, 需要配置rc.conf

gateway_enable="YES"       # Set to YES if this host will be a gateway.
firewall_enable="YES"       # Set to YES to enable firewall functionality
firewall_script="/etc/rc.firewall" # Which script to run to set up the firewall
firewall_type="/etc/ipfw.conf"      # Firewall type (see /etc/rc.firewall)
natd_program="/sbin/natd"   # path to natd, if you want a different one.
natd_enable="YES"       # Enable natd (if firewall_enable == YES).
natd_interface="ed1"        # Public interface or IPaddress to use.
natd_flags="-config /etc/natd.conf"         # Additional flags for natd.
   

`/etc/ipfw.conf'中加入

add 50 divert natd all from any to any via any      
   

开始测试, 下图是测试用图

                    -+--------------------------------+-
         88.1.16.4   |                                | telnet 88.1.16.4 6666
             +---------------+                 +-------------+          
             | NATD MACHINE  |                 |  88.1.16.1  |
             +---------------+                 +-------------+
        192.168.0.1  |
         +-----------+------------+
        ...         ...          ...
        192.168.0.XXX 子网
        

`/etc/natd.conf'内容如下:

log yes
redirect_port tcp 192.168.0.1:22 88.1.16.4:6666
redirect_port tcp 192.168.0.1:23 88.1.16.4:6667
   

在88.1.16.1上使用telnet 88.1.16.4 6666测试成功

下面解决防火墙后的内网访问NATD配置的端口映射的问题

这个问题用ipfw将从192.168.0网段来的发送到目标地址88.1.16.4, 端口6666的包forward到192.168.0.1上的22端口上就可以了. `/etc/natd.conf'加入:

add 30000 forward 192.168.0.1,22 all from 192.168.0.0/24 to 88.1.16.4 via ed1
   

3.4 使用SOCKS代理上网

3.4.1 SOCKS的安装

socks5的ports需要手工下载socks5-v1.0r11.tar.gz, 将其放到/usr/ports/distfiles, 但从其官方站点很难下载到, 推荐一种方法, 使用google搜索"index of socks5-v1.0r11.tar.gz", 下载后需要校验一下MD5, 保证与distinfo中的相同就可以了.


3.4.2 SOCKS5的配置

简单的使用SOCKS5的客户端不需要配置文件, 只需要根据代理的类型设置环境变量SOCKS5_SERVER(当你的代理服务器类型是SOCKS5) 或者SOCKS4_SERVER(当你的代理服务器类型是SOCKS4) 或者SOCKS_SERVER(当你的代理服务器类型是SOCKS, 不知道是4还是5), 还有就是和SOCKS5认证相关的两个环境变量SOCKS5_USER和SOCKS5_PASSWD

当这些环境变量设置好后, 就可以使用runsocks 来运行那些需要通过代理来上网的软件了, 例如

#runsocks cvsup -Pm -gL 2 ports-supfile @M3novm
#runsocks mozilla
#runsocks wget ftp://60.138.164.3/movie.avi
   

一些软件如cvsup对runsocks需要加入一些特别的参数选项来运行, 这里的cvsup就加入了'-Pm'和行末的'@M3novm', 详见cvsup的手册

至此我们就可以使用runsocks运行大部分需要网络支持的软件了


Chapter 4 FreeBSD系统管理和维护

Jerry

本章介绍FreeBSD系统的一些管理和维护经验


4.1 FreeBSD系统备份恢复及迁移


4.1.1 系统迁移

下面的例子中, 我将FreeBSD从一块20G的硬盘迁移到另一个80G 的硬盘的最后一个主分区, 该分区大小基本上仍然在20G左右

原分区情况

Filesystem  1M-blocks Used Avail Capacity  Mounted on
/dev/ad0s1a       313   67   221    23%    /
devfs               0    0     0   100%    /dev
/dev/ad0s1e       495  342   114    75%    /tmp
/dev/ad0s1f      7096 5957   570    91%    /usr
/dev/ad0s1d       495  339   117    74%    /var
linprocfs           0    0     0   100%    /usr/compat/linux/proc
procfs              0    0     0   100%    /proc
   

新硬盘计划挂载在/dev/ad0上

  1. 对新的磁盘进行分区

    由于两块硬盘分区的大小不一致, 所以使用了一张FreeBSD的安装光盘进行Minimal的安装, 这时去掉原硬盘, 在ad0上挂载新硬盘, 安装时分区情况如下: /dev/ad0s4a分给`/', /dev/ad0s4b分给swap, /dev/ad0s4d分给`/var', /dev/ad0s4e分给`/tmp', /dev/ad0s4f分给`/usr', /dev/ad0s4g分给`/home'

  2. 迁移`/'数据

    重启进入单用户模式, 将新硬盘设置为从盘, 在ad0挂载原硬盘, ad1挂载新硬盘, 由于分区的情况不一致, 不能使用dump/restore进行恢复`/', 因为FreeBSD的分区表信息 位于/dev/ad0s4a, 也就是现在的/dev/ad1s4a上的前512字节中, 直接的dump/restore会 导致分区信息被覆盖, 因此对`/'采用pax进行备份和恢复, 最后修改fstab中各个挂载点的设备, 记得修改为ad0s4x, 因为最后新硬盘要挂载在ad0上, 命令如下:

    # /sbin/fsck -p 
    # /sbin/mount -a
    # /sbin/swapon -a
    # /sbin/adjkerntz -i
    # export HOME=/root
    # export TERM=vt200
    # csh -l
    # mkdir -p /mnt/new/root
    # mkdir -p /mnt/new/var
    # mkdir -p /mnt/new/tmp
    # mkdir -p /mnt/new/usr
    # newfs /dev/ad1s4a
    # mount /dev/ad1s4a /mnt/fs/root
    # cd /mnt/fs/root; pax -rw -pe -X / .
    # cd /mnt/fs/root/etc
    # vi fstab
       
    
  3. 恢复FreeBSD其他分区的数据

    这里由于不涉及对分区信息的操作, 可以使用dump/restore进行数据迁移, 同样也可以使用pax进行迁移, 这里使用dump/restore进行迁移

    # newfs /dev/ad1s4d
    # newfs /dev/ad1s4e
    # newfs /dev/ad1s4f
    # newfs /dev/ad1s4g
    # newfs /dev/ad1s4h
    # mount /dev/ad1s4d /mnt/new/var
    # mount /dev/ad1s4e /mnt/new/tmp
    # mount /dev/ad1s4f /mnt/new/usr
    # (dump -0b 512 -f - /usr) | (cd /mnt/new/usr; restore -rb 512 -f - )
    # (dump -0f - /var) | (cd /mnt/new/var; restore -rf - )
    # umount /mnt/new/var
    # umount /mnt/new/tmp
    # umount /mnt/new/usr
    # tunefs -n enable /dev/ad1s4d 
    # tunefs -n enable /dev/ad1s4e
    # tunefs -n enable /dev/ad1s4f
    # tunefs -n enable /dev/ad1s4g
    # tunefs -n enable /dev/ad1s4h
       
    
  4. 迁移其他数据

    其他数据可以通过cp, tar, cpio, pax等迁移

  5. 迁移完毕, 关机, 重新挂载新硬盘到ad0, 重启, :)


4.2 FreeBSD下的系统监控工具

本章介绍FreeBSD下的系统监控工具


4.2.1 使用SNP Watch监控用户

参考How to Monitor Users with SNP Watch.

watch命令使用snp设备来监视某个tty的数据的输入输出, 因此首先要保证内核调入snp模块, 所以, 在内核配置中加入

pseudo-device       snp 4
   

watch常用使用方式如下

  1. 监视用户的tty, 不需要使用任何参数, 只需要指定tty

    # who
    jerry            ttyv4     5 18 13:40  
    # watch ttyv4
       
    
  2. 监视并控制用户的tty, 需要加上参数`-W', 并指定tty

    # who
    jerry            ttyv4     5 18 13:40  
    # watch -W ttyv4
       
    

watch的快捷键如下

CTRL+G = 退出
CTRL+W = 清屏
CTRL+X = 选择需要监视tty
   

4.2.2 使用smartmontools监视硬盘状态

SMART(SFF-8035i)是硬盘生产商们建立的一个工业标准, SFF-8035i工业标准经过ATA-3, ATA-4, 到了ATA-5, 加入了一个错误信息日志(error log)和一系列硬盘自测SMART命令. 这个标准就是在硬盘上保存一些跟执行情况, 可靠程度, 读找错误率等属性的数据, 所有属性都有一个1字节(大小范围 1-253)的标准化值, 还包含另一个1字节的关键阶段值, 如果属性中某个数据接近小于或达到关键阶段值,那么硬盘就很可能会在不久出现严重的读写问题, 至少也是超过它的设计使用极限了, 这时应该做系统完全备份了.

SMART适用于IDE和SCSI硬盘, 如果硬盘支持SMART标准, 就可以使用smartmontools来 监视硬盘的状态, smartmontools的安装如下, 这里我使用的是IDE的硬盘, 设备是ad0

# cd /usr/ports/sysutils/smartmontools
# make all install clean
# echo 'smartd_enable="YES"' >> /etc/rc.conf
# echo '/dev/ad0 -H -m mymailbox@mymachine' > /usr/local/etc/smartd.conf
# /usr/local/etc/rc.d/smartd.sh start
   

上面我设置smartd在发现错误后发送邮件通知我, 此外还可以根据需要定期测试硬盘, 查看其是否有错误, 具体设置可以参见/usr/local/etc/smartd.conf.sample

还可以通过smartctl来查看和测试硬盘, 常用命令如下:

  1. 查看硬盘是否支持SMART标准

    # smartctl -i /dev/ad0
       
    
  2. 查看硬盘的健康状况

    # smartctl -H /dev/ad0
       
    
  3. 查看硬盘错误日志

    # smartctl -l error /dev/ad0
       
    
  4. 进行硬盘自检

    # smartctl -l selftest /dev/ad0
       
    
  5. 终止硬盘自检

    # smartctl -X /dev/ad0 
       
    

Chapter 5 IBM Thinkpad R40e 上安装配置FreeBSD 4-stable

Jerry

5.1 基本安装

需要准备FreeBSD 4.9的安装光盘, 并下载最新的src/sys源码包 (好象FreeBSD 4.9不支持R40e上的那块网卡). 如果你需要用到WinXP的话, 首先找个分区工具, 分好分区, 第一个分区给WinXP, 后面的分区也分好, 不然用IBM的系统恢复工具就会自动把后面未分区的与第一个分区合并, 先把WinXP恢复了(不过不恢复WinXP就没法继续后面的安装了), 并且, 进入WinXP 把最新的src/sys的tar包拷贝到C:\下

然后, 使用FreeBSD 4.9的安装光盘安装FreeBSD, 选个最小安装就可以了, 完成后启动进入FreeBSD, mount上WinXP的那个C:盘, 拷贝那个sys的源码包到/usr/src/下,解包, 重新编译内核, 安装重启, 就可以看到那个bge的网卡了

Kernel的加入的相关配置如下

options    CPU_ENABLE_SSE
options USER_LDT
options CPU_ENABLE_TCC
device  pcm
options VESA
   

5.2 X-Window的配置

使用FreeBSD 4.9自带的XFree86 4.3无法正常配置出R40e继承的ATI Radeon显卡, 因此, 进入ports安装x11-server/XFree86-4-Server-snap, 安装后就可以正常配置显卡了, 配置文件如下:

Section "Module"
    Load        "dbe"   # Double buffer extension
    SubSection  "extmod"
      Option    "omit xfree86-dga"   # don't initialise the DGA extension
    EndSubSection
    Load        "type1"
    Load        "speedo"
#    Load        "freetype"
    Load        "xtt"
    Load       "glx"
    Load       "dri"
EndSection

Section "Files"
    RgbPath "/usr/X11R6/lib/X11/rgb"
    FontPath   "/dtroot/local/share/fonts/TTF/"
    FontPath   "/usr/X11R6/lib/X11/fonts/local/"
    FontPath   "/usr/X11R6/lib/X11/fonts/misc/"
    FontPath   "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
    FontPath   "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
    FontPath   "/usr/X11R6/lib/X11/fonts/Speedo/"
    FontPath   "/usr/X11R6/lib/X11/fonts/Type1/"
#    FontPath   "/usr/X11R6/lib/X11/fonts/TrueType/"
#    FontPath   "/usr/X11R6/lib/X11/fonts/freefont/"
    FontPath   "/usr/X11R6/lib/X11/fonts/75dpi/"
    FontPath   "/usr/X11R6/lib/X11/fonts/100dpi/"
#    ModulePath "/usr/X11R6/lib/modules"
EndSection

Section "ServerFlags"

EndSection

Section "InputDevice"
    Identifier  "Thinkpad Keyboard"
    Driver  "Keyboard"
    Option      "CoreKeyboard"
    Option "AutoRepeat" "500 30"
    Option "XkbRules"   "xfree86"
    Option "XkbModel"   "pc101"
    Option "XkbLayout"  "us"

EndSection


# **********************************************************************
# Core Pointer's InputDevice section
# **********************************************************************

Section "InputDevice"
    Identifier  "USBMouse"
    Driver  "mouse"
    Option "Protocol"    "Auto"
    Option "Device"      "/dev/ums0"
    Option "Emulate3Buttons" "true"
    Option "ZAxisMapping" "4 5"
EndSection

Section "InputDevice" 
    Identifier  "Touchpad"
    Driver      "mouse"
    Option      "Protocol"      "Auto"
    Option      "Device"        "/dev/mouse"
    Option      "Emulate3Buttons" "true"
    Option      "ZAxisMapping" "4 5"
EndSection

Section "Monitor"
    Identifier  "My Monitor"
    Option      "DPMS"
#    HorizSync   31.5
#    HorizSync  30-64         # multisync
#    HorizSync  31.5, 35.2    # multiple fixed sync frequencies
#    HorizSync  15-25, 30-50  # multiple ranges of sync frequencies
#    VertRefresh 50-70
EndSection


Section "Device"
    Identifier  "ATI Radeon"
    Driver      "radeon"
    VideoRam    16384
    Option      "EnablePageFlip" "true"
EndSection

Section "Screen"
    Identifier  "Thinkpad LCD"
    Device      "ATI Radeon"
    Monitor     "My Monitor"
    DefaultDepth 24

    Subsection "Display"
        Depth       8
        Modes       "1280x1024" "1024x768" "800x600" "640x480"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       16
        Modes       "1280x1024" "1024x768" "800x600" "640x480"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       24
        Modes       "1024x768" "800x600"
        ViewPort    0 0
    EndSubsection
EndSection


Section "ServerLayout"
    Identifier  "Thinkpad X"
    Screen "Thinkpad LCD"
    InputDevice "Touchpad" "CorePointer"
    InputDevice "Thinkpad Keyboard" "CoreKeyboard"
EndSection

Section "DRI"
    Mode 0666
EndSection
   

Chapter 6 FreeBSD常见问题集合

Jerry

6.1 FreeBSD常用命令及脚本

6.1.1. 如何使用脚本获得PID
6.1.2. 将文件名从大写转换为小写
6.1.3. 子目录按大小排序
6.1.4. ls显示颜色
6.1.5. 快速安装package
6.1.6. 使用ISO镜像
6.1.7. tcsh, csh技巧

6.1.1. 如何使用脚本获得PID

参见脚本pid.sh, 如下:

$ cat pid.sh
#!/bin/sh
pid=`ps -aux | grep $1 | grep -v grep | awk '{print $2}'`
echo $pid < $1.pid
$./pid.sh sshd
   

6.1.2. 将文件名从大写转换为小写

参见脚本mklower.sh, 如下:

#!/bin/sh
for file in $1; 
do
newfile=`echo "$file" | tr "[:upper:]" "[:lower:]"`
mv "$file" "$newfile"
done
$ mklower.sh *.JPG
   

6.1.3. 子目录按大小排序

$du -s * | sort -n

6.1.4. ls显示颜色

$ls -G #显示属性颜色 $ls -F #显示属性字符 $ls -FG

6.1.5. 快速安装package

你可以先设定 PACKAGEROOT,指定用该站点的package,安装时自动寻找对应pakage,而且你不需要知道版本,只要知道package名称即可,会自动安装package的最新版,中文的部分只要加上 zh-,像是 zh-xcin。

# setenv PACKAGEROOT ftp://ftp.tw.freebsd.org
# pkg_add -r package_name
     

也可以直接指定 PACKAGESITE 指向特定的位置. 像是你希望安装的package是 最新的, 而不是 release 的版本.

# setenv PACKAGESITE ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/i386/packages-stable/Latest/
     

6.1.6. 使用ISO镜像

FreeBSD 4.X

#vnconfig /dev/vn0c ./IMAGE.ISO
#mount -t cd9660 /dev/vn0c MOUNT_DIR 
#umount MOUNT_DIR
#vnconfig -u /dev/vn0c
     

FreeBSD 5.X

#mdconfig -a -t vnode -f abc.iso -u 1 
#mount -t cd9660 /dev/md1 MOUNT_DIR 
#umount MOUNT_DIR
     

6.1.7. tcsh, csh技巧

  • 在tcsh中可以使用set autolist设置文件名和路径自动补齐

  • 在csh中可以设置limit coredumpsize 0来设置coredump的大小

  • 设置命令行提示符

    set prompt = '%n@%m%#'
             
    

6.2 FreeBSD安装配置常见问题

6.2.1. 系统启动反复出现timeout-resetting
6.2.2. 发现FreeBSD的交换空间被耗尽
6.2.3. 如何将系统迁移到新的大硬盘
6.2.4. 如何使用主板内置声卡, 如何使多个程序同时播放声音
6.2.5. 如何使用make world升级系统
6.2.6. Java运行awt程序经常core dumped
6.2.7. JDK1.4.2 使用JDBC无法连接远程数据库

6.2.1. 系统启动反复出现timeout-resetting

acd0:MODE_SENSE_BIG command timeout-resetting
ata1:resetting devices...done
acd0:MODE_SENSE_BIG command timeout-resetting
ata1:resetting devices...done
acd0:MODE_SENSE_BIG command timeout-resetting
ata1:resetting devices...done 
..........
Probing divice,please wait(this can take a few minutes
     

将光驱的master修改成slave来用

6.2.2. 发现FreeBSD的交换空间被耗尽

不追加分区, 可以通过增加交换文件的方式实现

Example 6-1. Creating a Swapfile on FreeBSD 4.X
1.   Be certain that your kernel configuration includes the vnode
driver. It is not in recent versions of GENERIC.
pseudo-device   vn 1   #Vnode driver (turns a file into a device)
2.   create a vn-device:
# cd /dev
# sh MAKEDEV vn0
3.   create a swapfile (/usr/swap0):
# dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
4.   set proper permissions on (/usr/swap0):
# chmod 0600 /usr/swap0
5.   enable the swap file in /etc/rc.conf:
swapfile="/usr/swap0"   # Set to name of swapfile if aux swapfile desired.
6.   Reboot the machine or to enable the swap file immediately, type:
# vnconfig -e /dev/vn0b /usr/swap0 swap

Example 6-2. Creating a Swapfile on FreeBSD 5.X
1.   Be certain that your kernel configuration includes the memory
disk driver ( md(4)). It is default in GENERIC kernel.
device   md   # Memory "disks"
2.   create a swapfile (/usr/swap0):
# dd if=/dev/zero of=/usr/swap0 bs=1024k count=64
3.   set proper permissions on (/usr/swap0):
# chmod 0600 /usr/swap0
4.   enable the swap file in /etc/rc.conf:
swapfile="/usr/swap0"   # Set to name of swapfile if aux swapfile desired.
5.   Reboot the machine or to enable the swap file immediately, type:
# mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0

     

6.2.3. 如何将系统迁移到新的大硬盘

建议重装系统,然后将数据迁移到新硬盘, 如果真的要直接将系统迁移到新硬盘一定要使用dump和restore,不要使用tar,cpio等, 它们对根目录的操作可能会出现问题, 步骤如下:

  1. 使用newfs新建一个分区.

  2. mount上该分区.

  3. cd到装载点.

  4. 使用dump备份旧的分区, 通过管道输出到新分区

例如, 假设要将根文件系统移动到/dev/ad1s1a, 使用/mnt作为临时装载点, 命令如下

# newfs /dev/ad1s1a
# mount /dev/ad1s1a /mnt
# cd /mnt
# dump 0af - / | restore xf -
     

要在新硬盘上重新安排分区稍微有点麻烦, 例如要把/var文件系统放在新硬盘分区的 根文件系统下, 首先按照上面的步骤移动根文件系统, 然后在移动/var文件系统, 命令如下:

# newfs /dev/ad1s1a
# mount /dev/ad1s1a /mnt
# cd /mnt
# dump 0af - / | restore xf -
# cd var
# dump 0af - /var | restore xf -
     

6.2.4. 如何使用主板内置声卡, 如何使多个程序同时播放声音

使用内置声卡需要添加如下内核配置

       options PNPBIOS
     

多声道配置使用sysctl进行设置, 如下:

# sysctl hw.snd.pcm0.vchans=4
# sysctl hw.snd.maxautovchans=4
     

6.2.5. 如何使用make world升级系统

参考FreeBSD升级指南

注意事项

  • 备份系统, 备份一下总不至于吃亏

  • 订阅对应邮件列表, 希望你的英文不至于太差, 在对应邮件列表上贴上你问题的描述, 描述清楚出现的问题及受影响的系统

       STABLE: freebsd-stable@FreeBSD.org
        CURRENT: freebsd-current@FreeBSD.org
     

升级步骤

  1. 使用cvsup将src同步到所要升级到的版本

  2. 读一下/usr/src/UPDATING, 上面由一些你可能需要注意的事项, 一定要读一下, 但并不代表这一定比从邮件列表上得到的信息有用, 所以推荐订阅邮件列表

  3. 检查/etc/make.conf, 查看/etc/make.conf和 /etc/default/make.conf的不同之处, /etc/default/make.conf中包含一些缺省定义, 不过大部分都被注释掉了, 可以考虑把它们加入到/etc/make.conf中, 不过要记得/etc/make.conf所有的make命令都起作用

  4. 更新/etc下的文件, /etc下存放配置和启动脚本, 有些文件在不同的版本中是不同的, 所以需要进行更新, 从FreeBSD 开始可以在编译前使用命令 mergemaster 加上 -p 选项. 它将检查为了正常运行buildworld和installworld而需要更新的文件, 示例如下:

    # cd /usr/src/usr.sbin/mergemaster
    # ./mergemaster.sh -p
             
    
  5. 进入单用户模式, 避免多用户系统带来的文件升级不成功问题, 还有一种方法就是在多用户模式下编译, 单用户下升级安装, 命令如下

    # shutdown now
             
    

    重启后使用boot -s 进入单用户模式

    # fsck -p
    # mount -u /
    # mount -a -t ufs
    # swapon -a
             
    

    加入升级前系统如果使用本地时间而没有使用GMT, 必须打入命令

    # adjkerntz -i
             
    

    来调整时区等设置, 保证系统的正常安装

  6. 移除/usr/obj

    # cd /usr/obj
    # chflags -R noschg *
    # rm -rf *
             
    
  7. 编译系统

    1. 保存编译输出, 注意不要存在/tmp目录下, /tmp下的文件可能在重启后被清除

      # script /var/tmp/mw.out
      Script started, output file is /var/tmp/mw.out   
      # make TARGET
      ... compile, compile, compile ...     
      # exit
      Script done, ...
               
      
    2. 编译系统

      # cd /usr/src
      # make -j4 -DNOPROFILE buildworld #或者在/etc/make.conf加上NOPROFILE=true
               
      

      FreeBSD 2.2.5后make world分成 make buildworld和make installworld, 注意这里只作make buildworld

      耗时: PIII500/128M RAM大约需要2个钟头左右

  8. 编译安装新内核, 注意这里不是make world

    # cd /usr/src
    # make buildkernel
    # make installkernel
             
    

    编译使用GENERIC配置的内核, 推荐编译一个, 以免以后编译内核后无法使用新内核启动 没有make installworld前定制编译新内核使用下面的命令

    # /usr/obj/usr/src/usr.sbin/config/config KERNELNAME
             
    
  9. 以新内核重启到单用户模式

  10. 升级系统, 注意要使用和make buildworld使用的-D选项, 并且绝对不能使用-j选项

    # cd /usr/src
    # make installworld
             
    

    假如编译时:

    # make -DNOPROFILE=true buildworld
             
    

    安装时就应该:

    # make -DNOPROFILE=true installworld
             
    
  11. 升级那些没有被make world升级的文件, 如/etc下的文件, 可以使用mergemaster或者手工升级, 这一点请参见mergemaster的手册, 在升级前建议备份/etc目录.

  12. 更新/dev

    通常使用mergemaster, 就会重建/dev, 或使用命令 sh MAKEDEV 建立

  13. 更新/stand

    # cd /usr/src/release/sysinstall
    # make all install
             
    
  14. 再次重启

    # fastboot
             
    
  15. 结束升级, 加入有些程序无法运行的话可以重新编译安装, 例如

    # cd /usr/src/usr.bin/file
    # make all install
             
    

6.2.6. Java运行awt程序经常core dumped

java与xim有些冲突, 可以设置java的环境变量到C, 避免调用输入法

或者这样就可以了, XIM与Motif有些冲突

# ln -sf aj /etc/malloc.conf
     

6.2.7. JDK1.4.2 使用JDBC无法连接远程数据库

对net.inet6.ip6.v6only进行设置, 或者取消安装INET6

# sysctl net.inet6.ip6.v6only=0 
     

可以将这句加到/etc/rc.local里, 启动后自动设置