CPU及硬盘使用查看:
监看系统效能
在进行调校之前,我们可以先使用一些系统内附的工具来查看目前系统效能。我们之前已经介绍过 top 这个指令,它可以让我们看目前系统中所有行程的状况、CPU、内存、及虚拟内存的使用情形。这里我们介绍另一个好用的工具 systat。systat 可以用来显示网络使用情形、硬盘 I/O、CPU 等信息,可以说是最完整的系统监看工具。它的使用方法如下:
systat [-display] [refresh-interval]
其中 display 为我们所要显示的信息项目,我们也可以在进入 systat 后变更显示项目,而 refresh-interval 为多久要更新一次屏幕,单位是秒。以下为可用的 display 参数:
显示模式 意义
pigs 显示目前系统中使用 CPU 最多的行程名称。如果所有行程的 CPU 使用量未满 100%,则多出来的部份显示为 IDLE。
icmp 统计目前 ICMP 封包的进出情形。
icmp6 显示 IPv6 的 ICMP 封包进出情形。
ip 显示 IP 层的封包统计及 UDP 封包信息。
ip6 和 IP 一样,但只显示 IPv6 的封包。
tcp 显示 TCP 的封包统计。
iostat 显示 I/O 状况统计,并分类为各种模式显示。
swap 显示目前各个储存空间上的虚拟内存的使用情形。
mbufs 显示 mbufs 被使用的状态。
vmstat 这是我们最常用的显示模式,它显示了最多的信息,包含 I/O、虚拟内存、mbufs、网络等信息。
netstat 显示网络的使用情形。
ifstat 显示各个网络适配卡的使用情形。
进行 systat 之后,我们可以先按冒号「:」再打上述各种显示模式来变更显示的信息,如果要离开,则先按冒号,再按 quit 即可,或者也可以直接打「:q」。
systat
用来监看系统资源使用情形。它有几个常用的参数:
参数 | 说明 |
-iostat | 显示目前磁盘使用情形,以了解其存取的负荷。 |
-swap | 显示所有 swap 装置的使用情形。 |
-netstat | 显示目前网络联机情形。 |
-vm | 显示所有系统信息。 |
在上述各参数之后,我们还可以指定画面的更新时间,例如:
$ systat -vm 1
硬件传输速度查看;
# diskinfo -v -t ad0
ad0
Seek times:
Transfer rates:
diskinfo 指令的 -r 参数会先印出一些分割区的基本信息,包含 sector size、分割区大小、磁柱数量等。接下来的测试会花一点时间,测试结果包含了「Seek times」及「Transfer rates」。「Seek times」指的是硬盘的搜寻速度,而「Transfer rates」是数据找到后从硬盘传到系统的速度。
mount挂载系统:
mount 指令除了可以让我们挂入 FreeBSD 的预设的档案系统 UFS 外,我们还可以用它来挂入其它 FreeBSD 支持的档案系统格式。例如,FreeBSD 安装光盘是一般标准的数据光盘,它的档案系统格式是 CD9660,我们将该 CD 挂入系统目录中。首先,请先将光盘放入光驱中,接着请使用下列指令来挂入光盘片:
# mount -t cd9660 /dev/acd0 /cdrom
在使用 mount 指令时,我们加上参数 -t cd9660 以指定档案系统格式为 cd9660。我们可以看到在挂入之前,/cdrom 这个目录是空的,而挂入后就出现了许多资料。光驱挂入后,您会发现光驱的退片键将失去作用,我们必须先卸载它才可以取出光盘片。
如果您要卸载它,可以使用 umount 指令。如果您在卸载时发生错误,请注意您的所在目录是不是在 /cdrom 下,如果是,必须先离开才可以顺利 umount:
# cd /
# umount /cdrom
我们说过,挂入点和磁盘分割区之间并没有必然的关系,您也可以将光盘挂入 /mnt 中,不一定要挂入 /cdrom,将 CDROM 挂入 /cdrom 只是习惯用法而已。
除了一般数据光盘的 cd9660 档案格式外,FreeBSD 还支持下列常用的档案格式:
档案系统格式 说明
ufs
ext2fs
msdosfs
ntfs
cd9660
udf
nfs
smbfs
mfs
swap
procfs
kernfs
您可以在 mount 指令的参数 -t 之后加入上述档案格式做为参数以挂入正确的档案系统。或者,您也可以依档案系统的不同使用 mount_xxxx 指令。例如,要挂入 msdos 档案系统时,可以使用 mount_msdosfs;要挂入 cd9660 时,可以使用指令 mount_cd9660。您可以在 /sbin 目录下看到这些 mount 的指令:
# ls /sbin/mount*
/sbin/mount*
/sbin/mount_cd9660*
/sbin/mount_devfs*
/sbin/mount_ext2fs*
/sbin/mount_fdescfs*
/sbin/mount_linprocfs*
实际上,当您执行 mount 加参数 -t 时,mount 就是会依据 -t 所给的档案系统去执行相对映的 mount_xxx。
必须注意的是,在 Windows/DOS 操作系统中,有所谓的延伸扇区 (Extended Partitions)。延伸扇区有点像是 FreeBSD 的 slice,在延伸扇区下,会在细分成多个逻辑扇区 (Logical Partitions),当 FreeBSD 遇到这种扇区时,会将各个逻辑扇区编号从第五个 slice 开始 (跳过最多 4 个 slice 的限制)。所以,DOS 中第一个逻辑扇区在 FreeBSD 中的编号就是 ad0s5,第二个逻辑扇区就是 ad0s6,依此类推。
另外,有些档案系统在 FreeBSD 中只有只读的能力。例如 NTFS,我们只能够读取该扇区的数据,而无法进行任何写入的动作
开机时的自动挂载:
如果您在安装 FreeBSD 时是以光盘安装,您也许会发现只要以下列二个指令其中一个就可以挂入光驱:
# mount /cdrom
# mount /dev/acd0
我们之所以可以这么做是因为在 /etc/fstab 中已经记录了 /cdrom 应该要挂入另一个装置。让我们来看一下这个档:
# Device
/dev/ad0s1b
/dev/ad0s1a
/dev/ad0s1d
/dev/ad0s1f
/dev/ad0s1e
/dev/acd0
我们可以看到最后一行挂入点 (Mount point) /cdrom 所对映的装置是 /dev/acd0,而档案系统格式的字段中 (FStype) 所指定的格式是 cd9660,所以我们可以不必打完整的指令就可以挂入光盘。
在系统开机时,FreeBSD 会参考 fstab 来决定要将哪些档案系统挂进来。在 fstab 各个字段所代表的意义如下:
Device:
Mountpoint:
FStype:
Options:
ro
async
atime
auto
dev
exec
user
sync
sw swap。
noauto
userquota
groupquota
dump:表示使用指令 dump 时要备份的档案系统,0表示不要、1表示要。
pass:这个字段是给指令 fsck 用的,是检查的顺序。/ 的数字应该是1而其它的档案系统为2。不需检查的就是0(如 cdrom,swap 等)。
如果您新增一个分割区,并且希望在开机时自动加载,可以编辑 fstab,并加入您所要挂入的扇区。
当安装完 ports 后,我们可以再下指令 make clean 来清除编译过程产生的档案,建议最好这么做,否则有的过程中产生大量档案可是很惊人的。如果您安装了一堆软件之后,才想到之前没有 make clean,没关系,在安装 ports 时,编译过程的档案都存在于该软件目录下的 work 目录中。我们可以使用下列指令来找出所有未 make clean 的软件,并将暂存数据删除:
# find /usr/ports -depth -name work -exec rm -rf {} \;
#kill
kill 指令会送出一个讯号 (Signal) 给指定的程序,程序在收到讯号之后,会依其要求来动作。我们常用的讯号如下:
SIG 名称 | 代码 | 意义 |
HUP | 1 | hang up,通常用来叫程序重新加载设定。 |
INT | 2 | interrup,通知程序中止。 |
QUIT | 3 | quit,通知程序离开。 |
ABRT | 6 | abort,中断程序。 |
KILL | 9 | non-catchable, non-ignorable kill,直接通知 kernel 把该程序移除。 |
ALRM | 14 | alarm clock。 |
TERM | 15 | software termination signal,通知程序结束。 |
#chflags
在 FreeBSD 还有一种特别的权限控制,称之为「flags」,这些 flags 的设定可以让我们用来保护特殊的档案。例如 /kernel 就是一个有设定 flag 的档案,我们可以使用 ls 加参数 -o 来显示:
# ls -ol /kernel -r-xr-xr-x 1 root wheel schg 2208222 2/26 02:09 kernel
flags 的设定凌驾于一般的权限设定,我们可以设定的主要 flags 及其所代表的意义如下:
flags | 意义 |
nodump | 档案不可以被 dump。(只有档案拥有者和 root 可以设定) |
sappnd | 档案只可以往后附加,不能删除。(只有 root 可以设定) |
schg | 档案不可以被更动,连 root 都不能删除。(只有 root 可以设定) |
uappnd | 档案只可以往后附加,不能删除。(档案拥有者和 root 才可设定) |
uchg | 档案不可以被更动。(档案拥有者和 root 才可设定) |
如果我们要解除所设定的 flags 只要在上述的 flgs 之前加上 no 即可,例如 nouchg。
用法:
chflags flags file
flags 的设定只有在 kernel security level 为 -1 或 0 时才可以被更改。如果 security level 为 1 或 2 时就不能更动 flags 了。
whereis
找寻程序的所在。whereis 预设会去寻找标准的二进制文件、说明文件、及原始程序代码档名符合的档案。所以我们不能用它来找一般文字文件。
$ whereis netstat netstat: /usr/bin/netstat /usr/share/man/man1/netstat.1.gz
which
在使用者的路径设定中寻找该程序。
$ which perl /usr/bin/perl
find
在指定目录下寻找档案。find 可以用的参数很多:
参数 | 说明 |
-name file | 寻找档名为 file 的档案。 |
-perm mode | 寻找权限为 mode 的档案。 |
-size n[c] | 寻找档案大小为 n block 的档案。c 表示字符数。 |
-atime n | 寻找在 n 天之前曾被存取的档案。 |
-mtime n | 寻找在 n 天之前曾被更改时间的档案。 |
-ctime n | 寻找在 n 天之前曾被更改内容的档案。 |
-newer file | 寻找修改时间比 file 新的档案。 |
找到之后,列出档名。 | |
-exec cmd {} \; | 找到之后执行 cmd 指令,在 cmd 最后一定要加上 \; 指令才会执行。如果 cmd 后有加 {} 表示执行的目录在该档案的目录。 |
-user name | 寻找拥有者为 name 的档案。 |
-group name | 寻找群组为 name 的档案。 |
-nouser | 寻找使用者名称不在 /etc/passwd 中的档案。 |
-nogroup | 寻找群组不在 /etc/group 中的档案。 |
-type t | 寻找档案类型为 t 的档案。t 可以是下列字符之一:
|
例如,我们要从根目录开始,找出 services 这个档案所在位置:
$ find / -name service -print
如果我们要找出档案大小大于 10M 的档案:
$ find / -size +10485760c -print
如果我们要从所在目录开始,找出所有扩展名为 bak 的档案,并将它删除:
$ find . -name '*.bak' -exec rm {} \;
另外,-name 后面可以使用 pattern match,就是用一些名称规则。例如,我们要找扩展名为 .c、.h、或 .x 或是 .tgz 的档案:
$ find . -name "*.[chx]" -o -name "*.tgz"
我们可以使用参数 -o 来代表 or 而连接多个 -name 的参数。
找寻某一个字符串。例如,我们要找 /etc/ 下所有档案内容有 192.168 这个字符串的档案:
$ grep '192.168' /etc/*
我们也可以将 grep 和其它指令一起使用,例如要找出现在执行的程序中 inetd 的 PID:
$ ps -aux | grep inetd
tar
tape archiver。可以用来压缩备份文件。tar 的用法很多,我们仅介绍简单的压缩与解压缩。旧版的 tar 并不具有压缩功能,只是把档案包装成一个磁带文件。现在的 tar 都可以加上参数 -z 来顺便将档案压缩。
参数 | 说明 |
z | 压缩档案。 |
x | 取出档案。 |
c | 建立档案。 |
f file | 指定要处理的档案。 |
v | 观看过程。 |
u | 更新档案,新的档案会取代较旧的档案。 |
r | 将档案附加在原本的 tar 档之后。 |
t | 列出 tar 档的内容,但不真的解开。 |
例如,我们要将目录 temp 包装并压缩成 temp.tgz 这个档案:
$ tar zcvf temp.tgz temp
要解开 temp.tgz:
$ tar zxvf temp.tgz
fsck
检查并修复档案系统。我们可以指定要修复的档案系统,或不加任何参数来检查所有档案系统。fsck 当检查发现有问题时,预设会询问使用者是否要修复,我们也可以加参数 -y 来对于所有问题都回答 y。
# fsck /dev/ad0s1e
sockstat
列出开启中的 socket。
每个字段所代表的意义如下:
- USER:哪个使用者开启的 socket。
- COMMAND:经由哪一个指令。
- PID:该指令的 process ID 是多少。
- DF:socket 的 file descriptor number。
- PROTO:哪一种协定。
- LOCAL ADDRESS:本地的地址及 port (Internet sockets only)。
- FOREIGN ADDRESS:来源的地址及 port (Internet sockets only)。
- ADDRESS:socket 开启的档案或目标程序(UNIX sockets only)。
ftp
档案传输程序。如果要登入的主机允许昵名登入,我们使用参数 -a 来自动登入。
$ ftp -a freebsd.csie.nctu.edu.tw
进入 ftp 之后,会出现命令的提示列。我们可以输入以下的指令:
指令 | 说明 |
help 或 ? | 显示可以使用的指令。 |
ls | 列出远程所在目录的档案。 |
pwd | 显示远程所目录位置。 |
cd dir | 进入远程的 dir 目录。 |
get file | 从远程取回 file 档案。 |
put file | 将本地端的 file 档案上传到远程机器。 |
acsii | 使用文字模式传送档案。 |
binary | 使用二进制模式传送档案。 |
bye | 结束 ftp。 |
mget *.tgz | 取回远程所有名称为 *.tgz 的档案。 |
mput *.tgz | 上传本地所有 *.tgz 的档案。 |
!ls | 显示本地所在目录下的档案。 |
lpwd 或 !pwd | 显示本地所在目录。 |
lcd [dir] | 切换本地所在目录。 |
dig
是另一个功能强大的主机名称查询工具。简单的用法如下:
$ dig -x 216.136.204.21 $ dig
tcpdump
显示或记录网络封包。如果要使用 tcpdump,在核心中必须要有 Berkeley packet filter,而且有 /dev/bpf*。如果没有请在核心设定中加入下面这一行,并重新编辑核心:
pseudo-device bpf |
执行 tcpdump 后,它会打开指定接口的 promiscuous mode (接口必须支持才有用)。所谓的 promiscuous mode(杂乱模式) 是指不管是否和本机有关的封包都接收进来,要达到这样的效果,必须藉由 bpf 的支持。
我们可以使用 tcpdump 来观察到达某一个网络接口的封包。例如我们要监看接口 vr0 的封包:
# tcpdump -i vr0
如果要结束直接按 Ctrl+C 即可。 如果限制封包数量,可以使用参数 -c。我们也可以使用参数 -w 来将捕捉到的封包存成档案,在这里我们存成 dump 这个档案:
# tcpdump -c 20 -i vr0 -w dump
使用参数 -r 可以读取储存的封包数据:
# tcpdump -r dump
为了控制 tcpdump 能 dump 我们想要的封包,我们还可以在指令最后加上一些 expression 来控制封包的记录。关于 expression 的用法请 man tcpdump。
另外介绍一个好用的分析工具 tcpshow, 我们可以使用 ports 来安装。
# cd /usr/ports/net/tcpshow # make install clean
接着就可以使用 tcpshow 来分析我们储存的封包内容:
# tcpshow--------------------------------------------------------------- Packet 8 TIME: 04:53:10.938750 (0.011744) LINK: 00:80:2D:BB:65:38 -> 00:50:AA:00:DC:DD type=IP IP: tw -> 189 hlen=20 TOS=00 dgramlen=44 id=4353 MF/DF=0/1 frag=0 TTL=52 proto=TCP cksum=C56B TCP: port http -> 2451 seq=3298970558 ack=2899053999 hlen=24 (data=0) UAPRSF=010010 wnd=65535 cksum=8549 urg=0 DATA: ---------------------------------------------------------------
我们简单的说明一下这个封包的内容。第一部份是时间 TIME。
第二行是 LINK,显示了来源 -> 目的地的网络卡号,另外经由 type=IP,我们知道这是一个 Ethernet_II 的 frame。
第三部份 IP,tw -> 189 是来源及目的地的地址。hlen 是 header length 大小是 20 bytes,而整个 IP 封包 (dgramlen) 的大小是 44 bytes。
第四部份是 TCP,来源是的 port 是 http (内定是 80),而目的地的 port 是 2451。接下来是 TCP 封包的 sequence number 及 acknowledgement 编号。TCP 的 header length 是 24,加上 IP 的 header 20 长度刚好是 44,和 dgramlen 的长度一样,这个封包应该没有破损。
最后,这个封包并没有包含其它的数据