Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19009
  • 博文数量: 9
  • 博客积分: 310
  • 博客等级: 一等列兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-18 14:56
文章分类

全部博文(9)

文章存档

2011年(1)

2009年(7)

2008年(1)

我的朋友
最近访客

分类: BSD

2009-06-27 11:30:17

FreeBSD 阅读笔记

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
       512             # sectorsize
       40020664320     # mediasize in bytes (37G)
       78165360        # mediasize in sectors
       77545           # Cylinders according to firmware.
       16              # Heads according to firmware.
       63              # Sectors according to firmware.

Seek times:
       Full stroke:      250 iter in   5.199255 sec =   20.797 msec
       Half stroke:      250 iter in   4.011383 sec =   16.046 msec
       Quarter stroke:   500 iter in   6.797812 sec =   13.596 msec
       Short forward:    400 iter in   2.774055 sec =    6.935 msec
       Short backward:   400 iter in   3.257613 sec =    8.144 msec
       Seq outer:       2048 iter in   0.352483 sec =    0.172 msec
       Seq inner:       2048 iter in   0.369383 sec =    0.180 msec
Transfer rates:
       outside:       102400 kbytes in   4.511970 sec =    22695 kbytes/sec
       middle:        102400 kbytes in   4.770641 sec =    21465 kbytes/sec
       inside:        102400 kbytes in   4.174557 sec =    24530 kbytes/sec

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      FreeBSD 预设的档案系统。
ext2fs       Linux EXT2 档案格式。
msdosfs     FAT/FAT32,DOS 兼容的档案系统。
ntfs   Windows 的 NTFS。
cd9660   CD-ROM 的档案系统。
udf   DVD 数据光盘格式。
nfs   和 Sun Microsystems 相容的 "Network File System"。
smbfs   CIFS/SMB 档案格式,也就是 Windows 的网络芳邻,请参考 Samba 网络芳邻一章。
mfs   本地的 memory-based UNIX 档案系统。
swap   用来作 swapping 的档案系统。
procfs   用来存取执行程序(process)的档案系统。
kernfs   用来存取核心参数(kernel parameter)的档案系统。 。

您可以在 mount 指令的参数 -t 之后加入上述档案格式做为参数以挂入正确的档案系统。或者,您也可以依档案系统的不同使用 mount_xxxx 指令。例如,要挂入 msdos 档案系统时,可以使用 mount_msdosfs;要挂入 cd9660 时,可以使用指令 mount_cd9660。您可以在 /sbin 目录下看到这些 mount 的指令:

# ls /sbin/mount*
/sbin/mount*             /sbin/mount_mfs*        /sbin/mount_procfs*
/sbin/mount_cd9660*      /sbin/mount_msdosfs*    /sbin/mount_std*
/sbin/mount_devfs*       /sbin/mount_nfs*        /sbin/mount_udf*
/sbin/mount_ext2fs*      /sbin/mount_nfs4*       /sbin/mount_umapfs*
/sbin/mount_fdescfs*     /sbin/mount_ntfs*       /sbin/mount_unionfs*
/sbin/mount_linprocfs*   /sbin/mount_nullfs*

实际上,当您执行 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 Mountpoint FStype Options  Dump Pass#
/dev/ad0s1b none  swap sw  0
/dev/ad0s1a  ufs rw  1
/dev/ad0s1d /tmp  ufs rw  2
/dev/ad0s1f /usr  ufs rw  2
/dev/ad0s1e /var  ufs rw  2
/dev/acd0 /cdrom  cd9660 ro,noauto 0

 

我们可以看到最后一行挂入点 (Mount point) /cdrom 所对映的装置是 /dev/acd0,而档案系统格式的字段中 (FStype) 所指定的格式是 cd9660,所以我们可以不必打完整的指令就可以挂入光盘。

在系统开机时,FreeBSD 会参考 fstab 来决定要将哪些档案系统挂进来。在 fstab 各个字段所代表的意义如下:

Device:      装置名称,就是要挂入的来源,最常用的是 /dev/ 的档案,我们说过FreeBSD 将装置视为档案,所以这里填的是 /dev/*。装置也可以是NFS或是其它的虚拟装置,如 proc,linpro 等。
Mountpoint:  挂入点,就是你要将来源挂到什么地方,其中 swap 没有挂入点,所以是 none。
FStype:     档案系统就是要挂入的类型,必须在 kernel 中有定义。一般 FreeBSD 的档案是 ufs,硬盘要挂入的设定就是 ufs。如果是 cdrom 就是 cd9660。请参考上方的档案系统格式说明。
Options:    参数依各装置而有所不同,如果开机时不挂入的话(如 cdrom),就必须加入参数 noauto。defaults 设定为 rw、dev、exec、auto、nouser、async。可用的参数如下,加上no 则为相反,如 nouser、noauto:
 rw       可读可写。
ro        只可读不可写。
async     所有数据以异步方式完成。
atime     每次存取动作都更新档案时间。
auto      能被 mount -a 自动挂入系统。
dev       解译档案系统特性与储存装置规格。
exec      允许档案系统中的二进制元文件被执行。
user      允许一般user 挂入。
sync      所有数据以同步方式完成。
sw swap。
noauto       开机时不挂入。
userquota    使用者磁盘配额限制 (须 kernel 支持 quota)。
groupquota    群组磁盘配额限制 (须 kernel 支持 quota)。

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 新的档案。
-print 找到之后,列出档名。
-exec cmd {} \; 找到之后执行 cmd 指令,在 cmd 最后一定要加上 \; 指令才会执行。如果 cmd 后有加 {} 表示执行的目录在该档案的目录。
-user name 寻找拥有者为 name 的档案。
-group name 寻找群组为 name 的档案。
-nouser 寻找使用者名称不在 /etc/passwd 中的档案。
-nogroup 寻找群组不在 /etc/group 中的档案。
-type t 寻找档案类型为 t 的档案。t 可以是下列字符之一:
  • b:表示 block special,例如硬盘的装置文件 /dev/ad0 就是一个 block device。
  • c:character special,例如鼠标的装置文件 /dev/cuaa0。
  • d:表示目录。
  • f:表示一般档案。
  • l:表示 symbolic link。
  • p:表示 FIFO。
  • s:表示 socket。

 

例如,我们要从根目录开始,找出 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 的参数。

 

 grep

找寻某一个字符串。例如,我们要找 /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 的长度一样,这个封包应该没有破损。

最后,这个封包并没有包含其它的数据

阅读(1005) | 评论(0) | 转发(0) |
0

上一篇:Linux 内核编译

下一篇:LVM命令列表

给主人留下些什么吧!~~