gdb调试命令是什么?

gdb调试命令是什么?,第1张

命令如下

1、对于在应用程序中加入参数进行调试的方法:

直接用 gdb app -p1 -p2 这样进行调试是不行的。

需要像以下这样使用:

#gdb app

(gdb) r -p1 -p2

或者在运行run命令前使用set args命令:

(gdb) set args p1 p2

可以用show args 命令来查看

2、加入断点:

break <linenumber>

break <funcName>

break +offset

break -offset

(在当前行号的前面或后面的offset行停住。)

break filename:linenum

在源文件filename的linenum行处停住。

break filename:function

在源文件filename的function函数的入口处停住。

gdb:UNIX及UNIX-like下的调试工具。如果在 UNIX平台下做软件,GDB调试工具相比于VC、z的优点是具有修复网络断点以及恢复链接等功能,比BCB的图形化调试器有更强大的功能。

2009年12月29日,程序调试工具 GDB 7.0.1 发布,新版本修正了7.0版本的一些严重的堆栈溢出bug,这些bug可能导致 GDB 调试进程中断,修正了在 FreeBSD 和 IRⅨ 系统下无法编译的问题,增加了对 Thumb2调试的支持,还有其他一些小bug的修复。

GMT/UTC/CST/etc/localtime,/usr/share/zoneinfo/*时区文件,/etc/profile加TZ变量硬件时间RTC,系统时间date,hwclock,tzselectntp relay serverrpm –ivh ntp-*ntpdate 0.uk.pool.ntp.org ntpq –p,watch ntpq –p/etc/ntp.conf/etc/init.d/ntpd startchkconfig --level 35 ntpd onservice ntpd status设置NTP服务器不难但是NTP本身是一个很复杂的协议.

1. 时间和时区

如果有人问你说现在几点? 你看了看表回答他说晚上8点了. 这样回答看上去没有什么问题,但是如果问你的这个人在欧洲的话那么你的回答就会让他很疑惑,因为他那里还太阳当空呢.

这里就有产生了一个如何定义时间的问题. 因为在地球环绕太阳旋转的24个小时中,世界各地日出日落的时间是不一样的.所以我们才有划分时区(timezone) 的必要,也就是把全球划分成24个不同的时区. 所以我们可以把时间的定义理解为一个时间的值加上所在地的时区(注意这个所在地可以精确到城市)

地理课上我们都学过格林威治时间(GMT), 它也就是0时区时间. 但是我们在计算机中经常看到的是UTC. 它是Coordinated Universal Time的简写. 虽然可以认为UTC和GMT的值相等(误差相当之小),但是UTC已经被认定为是国际标准,所以我们都应该遵守标准只使用UTC

那么假如现在中国当地的时间是晚上8点的话,我们可以有下面两种表示方式

20:00 CST

12:00 UTC

这里的CST是Chinese Standard Time,也就是我们通常所说的北京时间了. 因为中国处在UTC+8时区,依次类推那么也就是12:00 UTC了.

为什么要说这些呢?

第一,不管通过任何渠道我们想要同步系统的时间,通常提供方只会给出UTC+0的时间值而不会提供时区(因为它不知道你在哪里).所以当我们设置系统时间的时候,设置好时区是首先要做的工作

第二,很多国家都有夏令时(我记得小时候中国也实行过一次),那就是在一年当中的某一天时钟拨快一小时(比如从UTC+8一下变成UTC+9了),那么同理到时候还要再拨慢回来.如果我们设置了正确的时区,当需要改变时间的时候系统就会自动替我们调整

现在我们就来看一下如何在Linux下设置时区,也就是time zone

2. 如何设置Linux Time Zone

在Linux下glibc提供了事先编译好的许多timezone文件, 他们就放在/usr/share/zoneinfo这个目录下,这里基本涵盖了大部分的国家和城市 # ls -F /usr/share/zoneinfo/

Africa/ Chile/ FactoryIceland Mexico/ posix/ Universal

America/ CST6CDT GB Indian/ Mideast/ posixrules US/

Antarctica/ Cuba GB-EireIran MST PRC UTC

Arctic/ EET GMTiso3166.tab MST7MDT PST8PDT WET

Asia/EgyptGMT0 Israel Navajoright/ W-SU

Atlantic/Eire GMT-0 Jamaica NZROC zone.tab

Australia/ EST GMT+0 JapanNZ-CHAT ROK Zulu

Brazil/ EST5EDT Greenwich KwajaleinPacific/ Singapore

Canada/ Etc/ Hongkong LibyaPolandTurkey

CET Europe/ HSTMET Portugal UCT 在这里面我们就可以找到自己所在城市的time zone文件. 那么如果我们想查看对于每个time zone当前的时间我们可以用zdump命令 # zdump Hongkong

Hongkong Fri Jul 6 06:13:57 2007 HKT 那么我们又怎么来告诉系统我们所在time zone是哪个呢? 方法有很多,这里举出两种

第一个就是修改/etc/localtime这个文件,这个文件定义了我么所在的local time zone.

我们可以在/usr/share/zoneinfo下找到我们的time zone文件然后拷贝去到/etc/localtimezone(或者做个symbolic link)

假设我们现在的time zone是BST(也就是英国的夏令时间,UTC+1) # date

Thu Jul 5 23:33:40 BST 2007我们想把time zone换成上海所在的时区就可以这么做# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# date

Fri Jul 6 06:35:52 CST 2007这样时区就改过来了(注意时间也做了相应的调整)

第二种方法也就设置TZ环境变量的值. 许多程序和命令都会用到这个变量的值. TZ的值可以有多种格式,最简单的设置方法就是使用tzselect命令 # tzselect

... You can make this change permanent for yourself by appending the line

TZ='Asia/Hong_Kong'(permission denied?) export TZ

to the file '.profile' in your home directorythen log out and log in again. TZ变量的值会override /etc/localtime. 也就是说当TZ变量没有定义的时候系统才使用/etc/localtime来确定time zone. 所以你想永久修改time zone的话那么可以把TZ变量的设置写入/etc/profile里 3. Real Time Clock(RTC) and System Clock

说道设置时间这里还要明确另外一个概念就是在一台计算机上我们有两个时钟:一个称之为硬件时间时钟(RTC),还有一个称之为系统时钟(System Clock)

硬件时钟是指嵌在主板上的特殊的电路, 它的存在就是平时我们关机之后还可以计算时间的原因

系统时钟就是操作系统的kernel所用来计算时间的时钟. 它从1970年1月1日00:00:00 UTC时间到目前为止秒数总和的值 在Linux下系统时间在开机的时候会和硬件时间同步(synchronization),之后也就各自独立运行了

那么既然两个时钟独自运行,那么时间久了必然就会产生误差了,下面我们来看一个例子# date

Fri Jul 6 00:27:13 BST 2007 [root@rhe5 /]# hwclock --help

hwclock - query and set the hardware clock (RTC) Usage: hwclock [function] [options...]Functions:

--helpshow this help

--showread hardware clock and print result

--set set the rtc to the time given with --date

--hctosys set the system time from the hardware clock

--systohc set the hardware clock to the current system time

--adjust adjust the rtc to account for systematic drift since

the clock was last set or adjusted

--getepochprint out the kernel's hardware clock epoch value

--setepochset the kernel's hardware clock epoch value to the

value given with --epoch

--version print out the version of hwclock to stdoutOptions:

--utc the hardware clock is kept in coordinated universal time

--localtime the hardware clock is kept in local time

--directisa access the ISA bus directly instead of /dev/rtc

--badyear ignore rtc's year because the bios is broken

--datespecifies the time to which to set the hardware clock

--epoch=year specifies the year which is the beginning of the

hardware clock's epoch value

--noadjfile do not access /etc/adjtime. Requires the use of

either --utc or --localtime# hwclock --show

Fri 06 Jul 2007 12:27:17 AM BST -0.968931 seconds通过hwclock --show命令我们可以查看机器上的硬件时间(always in local time zone), 我们可以看到它和系统时间还是有一定的误差的, 那么我们就需要把他们同步

# hwclock –hctosys 把硬件时间设置成系统时间 # hwclock –systohc 把系统时间设置成硬件时间# hwclock --set --date="mm/dd/yy hh:mm:ss" 设置硬件时间我们可以开机的时候在BIOS里设定.也可以用hwclock命令# date -s "dd/mm/yyyy hh:mm:ss" 修改系统时间用date命令就最简单了现在我们知道了如何设置系统和硬件的时间. 但问题是如果这两个时间都不准确了怎么办? 那么我们就需要在互联网上找到一个可以提供我们准确时间的服务器然后通过一种协议来同步我们的系统时间,那么这个协议就是NTP了. 接下去我们所要说的同步就都是指系统时间和网络服务器之间的同步了 4. 设置NTP Server前的准备

其实这个标题应该改为设置"NTP Relay Server"前的准备更加合适. 因为不论我们的计算机配置多好运行时间久了都会产生误差,所以不足以给互联网上的其他服务器做NTP Server. 真正能够精确地测算时间的还是原子钟. 但由于原子钟十分的昂贵,只有少部分组织拥有, 他们连接到计算机之后就成了一台真正的NTP Server. 而我们所要做的就是连接到这些服务器上同步我们系统的时间,然后把我们自己的服务器做成NTP Relay Server再给互联网或者是局域网内的用户提供同步服务. 1). 架设一个NTP Relay Server其实非常简单,我们先把需要的RPM包装上 # rpm -ivh ntp-4.2.2p1-5.el5.rpm2).找到在互联网上给我们提供同步服务的NTP Server ,http://www.pool.ntp.org是NTP的官方网站,在这上面我们可以找到离我们城市最近的NTP Server. NTP建议我们为了保障时间的准确性,最少找两个个NTP Server

那么比如在英国的话就可以选择下面两个服务器

0.uk.pool.ntp.org

1.uk.pool.ntp.org

它的一般格式都是number.country.pool.ntp.org中国的ntp服务器地址:server 133.100.11.8 prefer

server 210.72.145.44

server 203.117.180.36

server 131.107.1.10

server time.asia.apple.com

server 64.236.96.53

server 130.149.17.21

server 66.92.68.246

server www.freebsd.org

server 18.145.0.30

server clock.via.net

server 137.92.140.80

server 133.100.9.2

server 128.118.46.3

server ntp.nasa.gov

server 129.7.1.66

server ntp-sop.inria.frserver (国家授时中心服务器IP地址)3).在打开NTP服务器之前先和这些服务器做一个同步,使得我们机器的时间尽量接近标准时间. 这里我们可以用ntpdate命令 # ntpdate 0.uk.pool.ntp.org

6 Jul 01:21:49 ntpdate[4528]: step time server 213.222.193.35 offset -38908.575181 sec

# ntpdate 0.pool.ntp.org

6 Jul 01:21:56 ntpdate[4530]: adjust time server 213.222.193.35 offset -0.000065 sec 假如你的时间差的很离谱的话第一次会看到调整的幅度比较大,所以保险起见可以运行两次. 那么为什么在打开NTP服务之前先要手动运行同步呢?

1. 因为根据NTP的设置,如果你的系统时间比正确时间要快的话那么NTP是不会帮你调整的,所以要么你把时间设置回去,要么先做一个手动同步

2. 当你的时间设置和NTP服务器的时间相差很大的时候,NTP会花上较长一段时间进行调整.所以手动同步可以减少这段时间5. 配置和运行NTP Server

现在我们就来创建NTP的配置文件了, 它就是/etc/ntp.conf. 我们只需要加入上面的NTP Server和一个driftfile就可以了 # vi /etc/ntp.conf

server 0.uk.pool.ntp.org

server 1.uk.pool.ntp.org

driftfile /var/lib/ntp/ntp.drift非常的简单. 接下来我们就启动NTP Server,并且设置其在开机后自动运行# /etc/init.d/ntpd start

# chkconfig --level 35 ntpd on6. 查看NTP服务的运行状况

现在我们已经启动了NTP的服务,但是我们的系统时间到底和服务器同步了没有呢? 为此NTP提供了一个很好的查看工具: ntpq (NTP query)

我建议大家在打开NTP服务器后就可以运行ntpq命令来监测服务器的运行.这里我们可以使用watch命令来查看一段时间内服务器各项数值的变化 # watch ntpq -p

Every 2.0s: ntpq -p Sat Jul 7 00:41:45 2007

remote refid st t when poll reach delay offset jitter

==============================================================================

+193.60.199.75 193.62.22.98 2 u 52 64 3778.578 10.203 289.032

*mozart.musicbox 192.5.41.41 2 u 54 64 377 19.301 -60.218 292.411 现在我就来解释一下其中的含义

remote: 它指的就是本地机器所连接的远程NTP服务器

refid: 它指的是给远程服务器(e.g. 193.60.199.75)提供时间同步的服务器

st: 远程服务器的级别. 由于NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端. 所以服务器从高到低级别可以设定为1-16. 为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的.

t: 这个.....我也不知道啥意思^_^

when: 我个人把它理解为一个计时器用来告诉我们还有多久本地机器就需要和远程服务器进行一次时间同步

poll: 本地机和远程服务器多少时间进行一次同步(单位为秒). 在一开始运行NTP的时候这个poll值会比较小,那样和服务器同步的频率也就增加了,可以尽快调整到正确的时间范围.之后poll值会逐渐增大,同步的频率也就会相应减小

reach: 这是一个八进制值,用来测试能否和服务器连接.每成功连接一次它的值就会增加

delay: 从本地机发送同步要求到服务器的round trip time

offset: 这是个最关键的值, 它告诉了我们本地机和服务器之间的时间差别. offset越接近于0,我们就和服务器的时间越接近

jitter: 这是一个用来做统计的值. 它统计了在特定个连续的连接数里offset的分布情况. 简单地说这个数值的绝对值越小我们和服务器的时间就越精确

那么大家细心的话就会发现两个问题: 第一我们连接的是0.uk.pool.ntp.org为什么和remote server不一样? 第二那个最前面的+和*都是什么意思呢?

第一个问题不难理解,因为NTP提供给我们的是一个cluster server所以每次连接的得到的服务器都有可能是不一样.同样这也告诉我们了在指定NTP Server的时候应该使用hostname而不是IP

第二个问题和第一个相关,既然有这么多的服务器就是为了在发生问题的时候其他的服务器还可以正常地给我们提供服务.那么如何知道这些服务器的状态呢? 这就是第一个记号会告诉我们的信息

*

它告诉我们远端的服务器已经被确认为我们的主NTP Server,我们系统的时间将由这台机器所提供

+

它将作为辅助的NTP Server和带有*号的服务器一起为我们提供同步服务. 当*号服务器不可用时它就可以接管

-

远程服务器被clustering algorithm认为是不合格的NTP Server

x

远程服务器不可用

了解这些之后我们就可以实时监测我们系统的时间同步状况了7. NTP安全设置

运行一个NTP Server不需要占用很多的系统资源,所以也不用专门配置独立的服务器,就可以给许多client提供时间同步服务, 但是一些基本的安全设置还是很有必要的

那么这里一个很简单的思路就是第一我们只允许局域网内一部分的用户连接到我们的服务器. 第二个就是这些client不能修改我们服务器上的时间

在/etc/ntp.conf文件中我们可以用restrict关键字来配置上面的要求

首先我们对于默认的client拒绝所有的操作 restrict default kod nomodify notrap nopeer noquery

然后允许本机地址一切的操作restrict 127.0.0.1

最后我们允许局域网内所有client连接到这台服务器同步时间.但是拒绝让他们修改服务器上的时间restrict 192.168.1.0 mask 255.255.255.0 nomodify

把这三条加入到/etc/ntp.conf中就完成了我们的简单配置. NTP还可以用key来做authenticaiton,这里就不详细介绍了8. NTP client的设置

做到这里我们已经有了一台自己的Relay Server.如果我们想让局域网内的其他client都进行时间同步的话那么我们就都应该照样再搭建一台Relay Server,然后把所有的client都指向这两台服务器(注意不要把所有的client都指向Internet上的服务器). 只要在client的ntp.conf加上这你自己的服务器就可以了 代码:

server ntp1.leonard.com

server ntp2.leonard.com

9. 一些补充和拾遗

1. 配置文件中的driftfile是什么?

我们每一个system clock的频率都有小小的误差,这个就是为什么机器运行一段时间后会不精确. NTP会自动来监测我们时钟的误差值并予以调整.但问题是这是一个冗长的过程,所以它会把记录下来的误差先写入driftfile.这样即使你重新开机以后之前的计算结果也就不会丢失了

2. 如何同步硬件时钟?

NTP一般只会同步system clock. 但是如果我们也要同步RTC的话那么只需要把下面的选项打开就可以了 可以通过ps –ef |grep ntp或者使用pgrep –lf ntp查看一下你的ntp服务是否启动了。然后可以通过snoop命令进行ntp的检测。

Snoop |grep –i ntp进行检测。

在建立好ntp服务以后,可以用2个工具命令对ntp服务进行管理。

一个是ntpq是一个交互式应用命令,在它的下面有很多的子命令可以供大家使用.使用peers可以查看同步进程。如果还需要其他的命令可以输入help 进行查看。还有一个工具命令是ntpdate这个命令一般用于ntp的客户端使用。可以在/var/adm/messages中看到ntp的同步信息的情况。如果需要更加详细的ntpq和ntpdate的信息可以使用man帮助进行查询。

我的FreeBSD5.3配置笔记(相同于5.4\6.0)

接触FreeBSD时间不长,我发现配置FreeBSD对于象我这样的新手还是很有些困难,经过几天的研究取得了一点进展,现在我的配置方法写出来希望新手能少走一些弯路。

1.安装完成配置xorg,命令如下:

#Xorg -configure

这时,当前目录下就多了一个xorg.conf.new的文件,把它cp到/etc/X11/下:

#cp xorg.conf.new /etc/X11/xorg.conf

然后,编辑xorgcfg -textmode,修改一下屏幕的分辨率.

2.启动gnome

在用户主目录下创建.xinitrc文件,加入以下内容:

exec gnome-session

#startx 即进入gnome

3.启动KDE

方法1:

在用户主目录下创建.xinitrc文件,加入以下内容:

exec startkde

方法2:

修改一下/usr/X11R6/1ib/X11/xinit/xinitrc文件

拉到文件最后...看到..twm了吗...从这里起..后最后前面都加#吧..

然后加上一句:

startkde

方法3:

直接输入

# echo "/usr/local/bin/startkde" >>~/.xinitrc 就行了

4.打开声音

修改/boot/defaults/loader.conf

将下面两项的NO改为YES

sound_load="NO"

snd_driver_load="NO"

5.汉化图形界面

1.安装kde-i18n-zh_CN:

#cd /usr/ports/chinese/kde3-i18n-zh_CN

#make install clean

2.安装字体

在/usr/X11R6/lib/X11/fonts/下建立TrueType目录

将windows下的SIMSUN.TTC复制到TrueType目录

双击SIMSUN.TTC,字体就安装好了

3.更改语言环境为中国,简体中文

4.在KDE的控制中心》外观和主题》字体 中修改字体为SIMSUN

6.安装fcitx输入法

1.通过ports安装fcitx

#cd /usr/ports/chinese/fcitx

#make install

2.修改~/.xinitrc,添加:

export LANG=zh_CN.eucCN

export LC_CTYPE=zh_CN.eucCN

export XMODIFIERS='@im=fcitx'

fcitx&

exec startkde

6.#qtconfig

然后选择-->Interface--->XIM Input Style 选Over the Spot(上面的复选框也选上)-->File--Save

7.挂载windows分区并支持中文文件名

1.建立挂载点,在/mnt/下建立文件夹C,D,E,F

2.修改/etc/fstab文件,加入windows分区,并把分区挂载到刚才建好的目录上,设置权限为读写,语言为中文并自动挂载

/dev/ad0s1 /mnt/C msdos rw,-L=zh_CN.eucCN,auto 0 0

/dev/ad0s5 /mnt/D msdos rw,-L=zh_CN.eucCN,auto 0 0

/dev/ad0s6 /mnt/E msdos rw,-L=zh_CN.eucCN,auto 0 0

/dev/ad0s7 /mnt/F msdos rw,-L=zh_CN.eucCN,auto 0 0

8.激活鼠标滚轮

修改/etc/xorg.conf

在"Mouse"中加入

Option "ZAxisMapping" "4 5"

保存推出,重启X。

9.调整屏幕偏移

开个终端窗口运行xvidtune,调整好之后现不要退出,点一下那个“Show”按钮,终端窗口中会显示几行类似于这样的信息:

hsync range 0: 31.50 - 48.50

vsync range 0: 40.00 - 70.00

"1024x768" 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync

打开/etc/X11/XF86Config或者xorg.conf文件,找到Section "Monitor"段,在EndSection前面加入一行:

# 这里填入上面显示的第3行信息,前面加上ModeLine

ModeLine "1024x768" 65.00 1024 1048 1184 1344 768 771 777 806 -hsync -vsync

保存退出,重启X。

FreeBSD配置:

更新FreeBSD

完成了安装、配置,FreeBSD基本上就算装完了。不过,目前为止没有哪个通用操作系统能够保证“bug-free”,FreeBSD也一样。在重新启动之后,我们需要做一些调整;并且,通过重新配置内核,我们可以得到一个更小、更快的操作系统。

第一步要做的是同步源代码。FreeBSD是一套开放源代码的操作系统,它的全部源代码都可以通过cvsup与中央cvsup服务器,或它的某个镜像同步。

cvsup是一个可选的package,同样的,它也可以从ports里面安装(/usr/ports/devel/cvsup和 /usr/ports/devel/cvsup-nogui)。考虑到许多应用程序都依赖X的库文件,在前面安装的部分我安装了它,并且直接安装了 cvsup的package。不过,如果你有足够的耐心去一个一个地make需要的ports,那么先安装ports collection,然后make cvsup-nogui也是一个不错的主意,尽管这需要比较长的时间。

创建一个用于cvsup(1)的supfile,命名为stable-supfile:

(default host中选定的cvsup服务器——ftp.bjpu.edu.cn对访问的IP进行了限制,笔者只在北京工业大学校内使用过,因此如果您无法连接这个服务器,请尝试www.cn.freebsd.org,或cvsup.freebsd.org)

*default host=ftp.bjpu.edu.cn

*default base=/usr

*default prefix=/usr

*default release=cvs tag=RELENG_4

*default delete use-rel-suffix

src-all

ports-all tag=.

随后执行

cvsup -g -L 2 stable-supfile

这里需要稍微解释一下FreeBSD的几种版本。

FreeBSD包括3类分支:-RELEASE,-STABLE和-CURRENT。FreeBSD 3.x、4.x和5.0是目前受到维护的版本,如果你期待稳定运行,那么,可以选择的最新版本将是FreeBSD 4.6-STABLE(如果你是在4.6.2-RELEASE发行之后更新的,那么它实际上比4.6.2-RELEASE新,并且,它正式的CVS tag是RELENG_4,即FreeBSD 4-STABLE)。

那么,三类分支有什么区别呢?

FreeBSD的开发是非常活跃的。系统中可能会随时引入一些新的特性。最新的代码是在-CURRENT分支中引入的。-CURRENT的修改非常频繁,每天都可能有数百处修改。使用-CURRENT分支的FreeBSD需要耐心和勇气,因为你的系统随时可能崩溃(随着FreeBSD 5.0开发尾声的接近,这种现象已经越来越少),make world也可能空手而归(没有人保证-CURRENT分支能够正常编译),此外,这个分支的性能也不好(因为调试的原因,这个分支引入了大量的调试选项,这意味着运行速度不会太快)。当然,正像它的名字那样,-CURRENT分支的版本也是最新的5.0,而且,一切FreeBSD的错误和漏洞的修正都是首先在-CURRENT分支引入的。目前,-CURRENT分支硕果仅存的只有FreeBSD 5-CURRENT(指定cvs tag时写“.”),这个分支包括了FreeBSD 5.0开发的最新进展。

FreeBSD 5中将引入大量的新特性,包括核心级线程(目前FreeBSD中的线程支持仅限于用户级线程,这在多处理器的环境下性能不够好,当然,目前使用fork ()来支持的多进程线程模拟能够提供类似核心级线程的功能,但并不是所有的程序员都知道如何使用fork)、完整的Soft Updates(这一变化将提供更好的文件系统性能,同时提供更好的稳定性),等等。如果你有快速的Internet连接,一台或一些空余的机器(当然,不是生产用的服务器),并且希望为FreeBSD的开发作贡献,或者你关心操作系统的最新发展,那么,-CURRENT分支是最好的选择。此外,

由于-CURRENT分支性能不好、稳定性不够等这些缺点,对于生产的服务器来说,通常运行的应该是FreeBSD-STABLE。如同它的名字那样, FreeBSD-STABLE的目的是“稳定地运行”。-CURRENT分支中的代码,在经过一段时间(通常是7到90天,但安全更新属于特例,通常会在几个小时)的验证之后,符合版本条件(有些新特性只能用于FreeBSD 5.0)的代码会被FreeBSD-STABLE吸收,这个操作称作MFC(Merge From -CURRENT,不是Microsoft Foundation Classes:P)。

由于FreeBSD 5.0的第一个RELEASE至今仍然没有发布,因此,目前还没有5.0-STABLE。目前,FreeBSD-STABLE有两个版本,FreeBSD 3-STABLE和FreeBSD 4-STABLE,分别对应3.x和4.x的最新稳定版代码(对应的cvs tag分别是RELENG_3和RELENG_4)。由于版本的更新换代,其中3.x的-STABLE正在逐渐消亡。FreeBSD-STABLE每天平均会修改10个左右的文件。

每隔一段时间,FreeBSD的发行工程组(Release Engineering Team)会对FreeBSD-STABLE的源代码树进行锁定。这段时间(目前的规定是30天,之前还有30天准备)内,所有的MFC操作都需要发行工程组的批准,因此,FreeBSD-STABLE在这个阶段基本不会引入任何新的特性。经过这段时间之后,发行工程组会在最后锁定ports树,并 build一份所有的package,之后,这份锁定的-STABLE,可能经过若干RC(Release Candidate),被命名为RELEASE,并制作光盘发行。

顾名思义,-RELEASE的设计目标是“发行”。一个版本一旦RELEASE,那么他的功能就不会再增加了。此后的所有维护的目标都只有一个,那就是绝对稳定。如果你和-RELEASE分支同步,那么绝不会出现make无法通过的情况,而且,通常这也可以保证你的系统“绝对”稳定,因为它不会引入任何新功能(例如,4.6就是4.6,如果你想要4.6.2的功能,必须明确地指定4.6.2)。

目前,FreeBSD有很多RELEASE版本,它们的cvs tag如下。我个人建议使用最新的4.6.2-RELEASE。

对于多数人来说,-RELEASE是一个比较极端的选择。无论何时出现版本升级,如果你想跟进,那都必须修改supfile,如果你选择不跟进,那么就可能造成ports工作异常。如果经常更新,-RELEASE可以保证操作系统本身的安全性,但同其他分支一样,如果ports出了问题,那么也得一块 make,而既然这样,还不如使用-STABLE。

如果你符合下面的条件,那么RELEASE分支可能比-STABLE分支更适合你

* 你使用的软件对于操作系统的变化非常敏感,比如,它只能FreeBSD 4.5,而无法在4.6上运行;同时,你不打算采用它的更新版本,或者它的作者拒绝更新

* 操作系统的更新对于你来说没有任何意义,比如,你打算把FreeBSD当作一个相对固定的嵌入式操作系统来使用,例如,作为防火墙的一部分

* 更新会对你造成困扰,操作系统的绝大多数新特性对于你来说除了增加烦恼之外,不能带来任何其他东西。

-并且,符合以下的全部条件-

* 你每天察看FreeBSD,以及使用的全部软件的安全公告

* 你的Internet连接比较通畅

目前我本人维护的所有主机,除了作为防火墙的那台之外,使用的都是FreeBSD-STABLE。

一旦同步完源代码,就应该对整个系统进行更新。如果你没有每天察看安全公告的习惯,那就应该关心一下cvsup到底更新了哪些代码。nectar是目前 FreeBSD的Security Officer。如果你发现他一下子更新了许多代码,那么对你来说立即make world和kernel很可能是必需的。

为了更新整个系统,在/usr/src中执行

make world

以及

make kernel KERNCONF=内核配置文件名

当然,也可以连起来执行:

make world kernel KERNCONF=内核配置文件名

如果你的计算机运行速度较慢,那么,对于基本系统的更新(相当于不包括库的一次world),可以用

make most

替代make world,但make world是一个不错的主意,因为它能够保证对C运行环境的改变应用到所有的程序中,如果修正的不是动态连接的C函数库,那么make world可以保证代码的一致性。

make kernel是一个需要重新启动的操作。如果你的make world修改了系统的关键服务,那么最好也重新启动一下。我很少有耐心看完make world和kernel的执行,根据系统的运行速度不同,这需要一个小时到一天的时间,而且,不是所有的SSH客户端都能够长时间正确的执行,例如, SecureCRT的多个版本都有内存泄漏问题。

为了解决这个问题,我用下面的命令来完成更新:

make world kernel KERNCONF=内核配置文件名 clean >/var/log/world,out &&reboot &

这个命令能够记录更新的全过程,如果在什么地方编译失败,你可以很快地找到原因。对于多数人来说,由于后面的&&,只需要察看uptime就能知道便以是否成功。

需要说明的是,FreeBSD的make world并不总能成功。有时需要修改一些环境变量才能成功完成make。为了保证make成功,在/usr/src中执行任何make操作之前,建议你看一眼UPDATING中是否有特殊的要求(这种要求并不是在FreeBSD Release的时候才会出现,很多时候他会在某个CURRENT中引入,然后随着MFC进入-STABLE分支),并且,在进行大的版本升级之前(跨 RELEASE,甚至主版本号),首先执行下面的命令

mergemaster -p

并在make world之后执行

mergemaster -i

运行mergemaster脚本需要一定的Unix配置知识,不过,由于配置文件中包含很多帮助信息,因此,只要master.passwd、group 这样的文件不出大问题(如果cvsup更新了master.passwd,那么就需要留神,因为master.passwd标准配置是root口令为空,这时需要用m来合并,而不是使用i安装),mergemaster并不会引入什么新的问题。

前一条命令是更新make的配置(/etc/defaults/make.conf和/etc/make.conf)。对于多数人来说,除非进行跨版本升级,否则一般情况下是不需要这样做的。后一条命令是同步全部配置,并安装以前不存在的配置文件,而不进行提示。

笔者曾经遇到过FreeBSD因为系统日期不正确而无法make的情况,因此,再次特别提醒大家,如果你的系统日期不正确,最好是用date命令修改一下,或者干脆用ntpdate或ntpd来同步时间。关于如何使用ntp,将在以后说明。

以后我们将讲解FreeBSD内核的配置,以及如何配置make.conf来优化FreeBSD的编译结果。

“简单的东西不容易出问题。”

至理名言!事实上,削减操作系统中那些对你没用的功能是一件非常重要的事情。这不仅仅意味着一个更小的操作系统,占用更少的磁盘空间(现在的硬盘少说也有几十GB,几兆的空间根本就是九牛一毛),而且意味着你被攻击的可能性也更低——简而言之,你不需要担心操作系统中没有安装的模块存在问题会对你造成影响。

这篇文章中,我们将一起对FreeBSD-i386的内核进行优化配置。这篇文章是针对FreeBSD4.7-STABLE写的,并且,FreeBSD 4.x的配置不会和这篇文章有太大出入。如果你要优化FreeBSD 5或FreeBSD 2/3的内核的话,则需要仔细参考它们的LINT文件了(后面将会提到)。

[注意:FreeBSD 5.0预定将于2002年11月20日发布。FreeBSD的开发组非常重视发行版本的质量,并认为这比发行版本的计划还重要,但由于同样的原因,我们往往会发现FreeBSD实际发行的版本比预定计划晚一些,通常在半个月之内。FreeBSD 5.0作为FreeBSD近期最为重要的发行版本,很可能也会延后发表,但笔者个人认为无论如何我们在今年年底之前肯定是可以看到最终的发行版本的。 FreeBSD 5.0对系统进行了大量的修改,这一系列的文章将在FreeBSD 5.0发布当天发表针对5.0的修订版本,而现有版本将保留,但进入维护阶段,不再引入新的内容。]

FreeBSD的源代码可以直接从中央cvsup服务器同步,也可以作为系统的一部分在安装的时候一兵装上。前面已经说过如何同步源代码,在此不再赘述。 FreeBSD的源代码(通常在/usr/src)包含建造基本系统的全部代码,而在/usr/src/sys中则有若干个目录,对应不同的计算机体系结构(4.x只支持i386和alpha)。i386是一个泛指的名字,包含了与Intel 80386兼容的所有机器,并不是特指80386。

简单介绍一下FreeBSD的内核文件。在4.x系统中,/kernel这个文件是默认的内核,通常正常启动使用的就是它。 /kernel.GENERIC这个文件是兼容性较强的内核,如果/kernel无法引导系统,就得靠这个文件来引导。/kernel.old是本次make kernel之前的内核,通常如果你的kernel坏掉,也可以考虑使用/kernel.old来引导系统。

/modules/是内核的模块,而/modules.old/是对应/kernel.old的模块。这些文件在每次替换kernel的时候都会同时替换。

在5.0中,内核以及内核的模块都被保存在/boot/kernel中。

在/usr/src/sys/i386/conf中有两个配置文件,GENERIC和LINT。其中GENERIC是make kernel的默认配置文件,直接make kernel生成的是GENERIC内核,但安装时命名为/kernel。系统在安装时会安装一个kernel.GENERIC,以后,这个文件不会跟随系统的make kernel更新,因此,如果你认为这个文件有必要更新的话,需要手工make kernel,并把/kernel改名为kernel.GENERIC。当然,通常并不需要这样做。

LINT是包括几乎所有内核编译配置详细信息的文件。这个配置并不是用来真正建立kernel的,他的主要用途是向用户展示可用的内核编译配置。在修改内核编译配置时,最好先参考这个文件。

为了配置自己的内核,应将GENERIC复制为一个另外的文件。习惯上这个文件和主机名相同。例如,我把自己的这台Web机器命名为apache.intranet.frontfree.net,就把配置文件命名为APACHE:

cd /usr/src/sys/i386/conf

cp GENERIC APACHE

随后,用ee APACHE编辑它。我们拿一个实际的GENERIC文件来说明。

为了节省篇幅,这个文件头上的注释被删掉了一部分。

machine i386 # 体系模型为i386

cpu I386_CPU # 支持80386

cpu I486_CPU # 支持80486

cpu I586_CPU # 支持Pentium

cpu I686_CPU # 支持Pentium Pro以及更高

ident GENERIC # 内核文件的名字

maxusers 0 # 自动检测同时允许的最大用户数

#makeoptions DEBUG=-g # 包含调试符号。通常只有current版本打开

options MATH_EMULATE #支持协处理器模拟

options INET #支持互联网

options INET6 #IPv6通讯协议

options FFS #伯克利快速文件系统

options FFS_ROOT#FFS作为根设备[必须保留]

options SOFTUPDATES #打开FFS soft updates支持

options UFS_DIRHASH #提高大型目录的支持

options MFS #内存文件系统

options MD_ROOT#MD作为根设备

options NFS #Network Filesystem

options NFS_ROOT#NFS作为根设备(需要NFS)

options MSDOSFS#MSDOS文件系统

options CD9660 #ISO 9660文件系统(光盘)

options CD9660_ROOT #CD-ROM作为根设备(需要CD9660)

options PROCFS #进程文件系统

options COMPAT_43 #兼容4.3BSD[必须保留]

options SCSI_DELAY=15000 #检测SCSI设备前的延时(ms)

options UCONSOLE#用户可以夺取控制台

options USERCONFIG #boot -c编辑器 editor

options VISUAL_USERCONFIG #菜单式boot -c编辑器

options KTRACE #ktrace(1)支持

options SYSVSHM#SYSV-风格的共享内存

options SYSVMSG#SYSV-风格的消息队列

options SYSVSEM#SYSV-风格的信号量(semaphores)

options P1003_1B#Posix P1003_1B实时扩展

options _KPOSIX_PRIORITY_SCHEDULING

options ICMP_BANDLIM #对恶意ICMP请求进行限制

options KBD_INSTALL_CDEV # 在/dev安装一个CDEV设备

# 下面两项在制作对称多处理器(SMP)内核时需要

#options SMP #对称多处理器内核

#options APIC_IO#对称(APIC) I/O

device isa

device eisa

device pci

# 软驱

device fdc0 at isa? port IO_FD1 irq 6 drq 2

device fd0 at fdc0 drive 0

device fd1 at fdc0 drive 1

#

# 如果使用东芝Libretto以及他的Y-E Y-E Data PCMCIA软驱

# 不要使用上面的fdc0,而应使用

#device fdc0

# ATA以及ATAPI设备

device ata0 at isa? port IO_WD1 irq 14

device ata1 at isa? port IO_WD2 irq 15

device ata

device atadisk # ATA 磁盘驱动器(IDE硬盘)

device atapicd # ATAPI 光驱

device atapifd # ATAPI 软驱

device atapist # ATAPI 磁带机

options ATA_STATIC_ID #静态设备编号

# SCSI控制器

device ahb # EISA AHA1742 family

device ahc # AHA2940 板载AIC7xxx设备

device amd # AMD 53C974 (Tekram DC-390(T))

device isp # Qlogic family

device ncr # NCR/Symbios Logic

device sym # NCR/Symbios Logic (较新的芯片组)

options SYM_SETUP_LP_PROBE_MAP=0x40

# 使用ncr可以在配置了sym和ncr的情况下挂接旧的NCR设备

device adv0 at isa?

device adw

device bt0 at isa?

device aha0 at isa?

device aic0 at isa?

device ncv # NCR 53C500

device nsp # Workbit Ninja SCSI-3

device stg # TMC 18C30/18C50

# SCSI 外设

device scbus # SCSI 总线(如果使用SCSI设备,必须有)

device da # Direct Access (硬盘)

device sa # Sequential Access (磁带,等等)

device cd # CD

device pass # Passthrough device (直接 SCSI 访问)

# 通过SCSI子系统接口的RAID控制器

device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID

device dpt # DPT Smartcache - See LINT for options!

device iir # Intel Integrated RAID

device mly # Mylex AcceleRAID/eXtremeRAID

device ciss # Compaq SmartRAID 5* series

# RAID控制器

device aac # Adaptec FSA RAID, Dell PERC2/PERC3

device aacp # SCSI passthrough for aac (requires CAM)

device ida # Compaq Smart RAID

device amr # AMI MegaRAID

device mlx # Mylex DAC960 family

device twe # 3ware Escalade

# atkbdc0 控制键盘和PS/2鼠标

device atkbdc0 at isa? port IO_KBD

device atkbd0 at atkbdc? irq 1 flags 0x1

device psm0 at atkbdc? irq 12

device vga0 at isa?

# 启动画面和屏幕保护程序

pseudo-device splash

# syscons 是默认的控制台驱动,类似SCO控制台

device sc0 at isa? flags 0x100

# 对于pcvt vt220控制台,启用这个和PCVT_FREEBSD

#device vt0 at isa?

#options XSERVER # 在vt控制台支持X服务器

#options FAT_CURSOR # 使用大光标

# 如果你是用ThinkPad,将下面的一行和其他PCVT相关设备的注释去掉

#options PCVT_SCANSET=2 # IBM使用非标准键盘

# 浮点运算支持 - 请勿禁用

device npx0 at nexus? port IO_NPX irq 13

# 电源管理支持

device apm0 at nexus? disable flags 0x20 # Advanced Power Management

# PCCARD (PCMCIA) 支持

device card

device pcic0 at isa? irq 0 port 0x3e0 iomem 0xd0000

device pcic1 at isa? irq 0 port 0x3e2 iomem 0xd4000 disable

# 串口(COM)

device sio0 at isa? port IO_COM1 flags 0x10 irq 4

device sio1 at isa? port IO_COM2 irq 3

device sio2 at isa? disable port IO_COM3 irq 5

device sio3 at isa? disable port IO_COM4 irq 9

# 并口

device ppc0 at isa? irq 7

device ppbus # 并口总线 (所有并口设备都需要)

device lpt # 打印机

device plip # 并口TCP/IP

device ppi # 并口接口设备

#device vpo # 需要scbus和da

# PCI 以太网适配器

device de # DEC/Intel DC21x4x (``Tulip'')

device em # Intel PRO/1000 adapter Gigabit Ethernet Card (``Wiseman'')

device txp # 3Com 3cR990 (``Typhoon'')

device vx # 3Com 3c590, 3c595 (``Vortex'')

# 使用公共的MII总线控制器代码的PCI以太网适配器

# 注意:一定要保留'device miibus'以确保可用

device miibus # MII总线支持

device dc # DEC/Intel 21143 and various workalikes

device fxp # Intel EtherExpress PRO/100B (82557, 82558)

device pcn # AMD Am79C97x PCI 10/100 NICs

device rl # RealTek 8129/8139

device sf # Adaptec AIC-6915 (``Starfire'')

device sis # Silicon Integrated Systems SiS 900/SiS 7016

device ste # Sundance ST201 (D-Link DFE-550TX)

device tl # Texas Instruments ThunderLAN

device tx # SMC EtherPower II (83c170 ``EPIC'')

device vr # VIA Rhine, Rhine II

device wb # Winbond W89C840F

device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')

device bge # Broadcom BCM570x (``Tigon III'')

# ISA以太网适配器

# 'device ed' 需要 'device miibus'

device ed0 at isa? port 0x280 irq 10 iomem 0xd8000

device ex

device ep

device fe0 at isa? port 0x300

# Xircom Ethernet

device xe

# PRISM I IEEE 802.11b wireless NIC.

device awi

# WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really

# exists only as a PCMCIA device, so there is no ISA attachment needed

# and resources will always be dynamically assigned by the pccard code.

device wi

# Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will

# work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP

# mode (the factory default). If you set the switches on your ISA

# card for a manually chosen I/O address and IRQ, you must specify

# those parameters here.

device an

# The probe order of these is presently determined by i386/isa/isa_compat.c.

device ie0 at isa? port 0x300 irq 10 iomem 0xd0000

#device le0 at isa? port 0x300 irq 5 iomem 0xd0000

device lnc0 at isa? port 0x280 irq 10 drq 0

device cs0 at isa? port 0x300

device sn0 at isa? port 0x300 irq 10

# 伪设备 - 数字表示分配多少个

pseudo-device loop # 环回网络

pseudo-de


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/61050.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-27
下一篇2023-02-27

发表评论

登录后才能评论

评论列表(0条)

    保存