【目标】 作为系统管理员,我们会遇到一些奇怪的问题,如网络无法连通、PPP不能用了、X
Window无法启动等。这时候通常需要到日志文件中去寻找一些蛛丝马迹来帮助我们解决问题。为了保证系统正常运行,处理每一天可能遇到的各种问题,认真地读取和分析日志文件是系统管理员的一项非常重要的任务。通过对本章的学习,我们应该掌握Linux日志系统运行的原理、熟悉常见日志的格式,能够借助日志对各种情况进行处理。 【重点内容】
日志子系统类别
重要的日志文件
日志文件的后台进程
logrotate
日志文件的分析工具 15.1 Linux日志概述
系统日志是对特定事件的记录。一个系统日志中所记录的事件的类型是由特定的日志的性质以及控制这些被记录事件的任何配置决定的。一般情况下,系统日志是用户可以直接阅读的文本文件,其中包含了一个时间戳和这个消息或者子系统所特有的其他信息。 日志对于系统安全来说尤其重要,由于日志记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志可以帮助我们审计和监测,还可以实时地监测系统状态,监测和追踪侵入者等。 15.2 日志子系统类别
在Linux系统中,有三个主要的日志子系统:
连接时间日志子系统
进程统计日志子系统
错误日志子系统
|
chyang pts/0 Aug 18 ynguo pts/2 Aug 18 ynguo pts/3 Aug 18 lewis pts/4 Aug 18 ynguo pts/7 Aug 18 ylou pts/8 Aug 18 |
如果指明了wtmp文件名,则who命令查询所有以前的纪录。命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。
w:w命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。例如:w可以显示
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
chyang pts/0 202.38.68.242 ynguo pts/2 202.38.79.47 lewis pts/3 202.38.64.233 lewis pts/4 202.38.64.233 ynguo pts/7 simba.nic.ustc.e ylou pts/8 202.38.64.235 |
users:users用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。例如:users(回车)显示:chyang lewis lewis ylou ynguo ynguo
last:last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。例如:
chyang pts/9 202.38.68.242 Tue Aug 1 cfan pts/6 202.38.64.224 Tue Aug 1 chyang pts/4 202.38.68.242 Tue Aug 1 lewis pts/3 202.38.64.233 Tue Aug 1 lewis pts/2 202.38.64.233 Tue Aug 1 |
如果指明了用户,那么last只报告该用户的近期活动,例如:last ynguo(回车)显示:
ynguo pts/4 simba.nic.ustc.e Fri Aug 4 ynguo pts/4 simba.nic.ustc.e Thu Aug 3 ynguo pts/11 simba.nic.ustc.e Thu Aug 3 ynguo pts/0 simba.nic.ustc.e Thu Aug 3 ynguo pts/0 simba.nic.ustc.e Wed Aug 2 ynguo pts/0 simba.nic.ustc.e ynguo pts/9 simba.nic.ustc.e Thu Aug 1 |
ac:ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连结的时间(小时),如果不使用标志,则报告总的时间。例如:ac(回车)显示:total 5177.47
ac -d(回车)显示每天的总的连结时间
Aug 12 total 261.87
Aug 13 total 351.39
Aug 14 total 396.09
Aug 15 total 462.63
Aug 16 total 270.45
Aug 17 total 104.29
Today total 179.02
|
ac -p (回车)显示每个用户的总的连接时间
ynguo 193.23
yucao 3.35
rong 133.40
hdai 10.52
zjzhu 52.87
zqzhou 13.14
liangliu 24.34
total 5178.24 |
lastlog:lastlog文件在每次有用户登录时被查询。可以使用lastlog命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示"**Never logged**。注意需要以root运行该命令,例如:
rong 5 202.38.64.187 Fri Aug 18 dbb **Never logged in**
xinchen **Never logged in**
pb9511 **Never logged in**
xchen 0 202.38.64.190 Sun Aug 13 |
另外,可以加一些参数,例如,last -u 102将报告UID为102的用户;last -t 7表示限制上一周的报告。
由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。
Linux可以跟踪每个用户运行的每条命令,如果想知道昨晚弄乱了哪些重要的文件,进程统计子系统可以告诉你。它对还跟踪一个侵入者有帮助。与连接时间日志不同,进程统计子系统缺省不激活,它必须启动。在Linux系统中启动进程统计使用accton命令,必须用root身份来运行。Accton命令的形式accton file,file必须先存在。先使用touch命令来创建pacct文件:touch /var/log/pacct,然后运行accton: accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何参数的accton命令。
lastcomm命令报告以前执行的文件。不带参数时,lastcomm命令显示当前统计文件生命周期内纪录的所有命令的有关信息。包括命令名、用户、tty、命令花费的CPU时间和一个时间戳。如果系统有许多用户,输入则可能很长。下面的例子:
crond F root ?? 0.00 secs promisc_check root ?? 0.01 secs sh root ?? 0.01 secs ping S root ?? 0.02 secs ping6.pl F root ?? 0.02 secs sh root 0.02 secs ping S root 1.34 secs locate root ttyp0 1.34 secs accton S root ttyp0 0.00 secs |
进程统计的一个问题是pacct文件可能增长的十分迅速。这时需要交互式的或经过cron机制运行sa命令来保持日志数据在系统控制内。sa命令报告、清理并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct和/var/log/usracct中。这些摘要包含按命令名和用户名分类的系统统计数据。sa缺省情况下先读它们,然后读pacct文件,使报告能包含所有的可用信息。sa的输出有下面一些标记项:
avio——每次执行的平均I/O操作次数
cp——用户和系统时间总和,以分钟计
cpu——和cp一样
k——内核使用的平均CPU时间,以1k为单位
k*sec——CPU存储完整性,以1k-core秒
re——实时时间,以分钟计
s——系统时间,以分钟计
tio——I/O操作的总数
u——用户时间,以分钟计
例如:
842 173.26re 4.30cp 0avio 358k
2 10.98re 4.06cp 0avio 299k find
9 24.80re 0.05cp 0avio 291k ***other
105 30.44re 0.03cp 0avio 302k ping
104 30.55re 0.03cp 0avio 394k sh
162 0.11re 0.03cp 0avio 413k security.sh*
154 0.03re 0.02cp 0avio 273k ls
56 31.61re 0.02cp 0avio 823k ping6.pl*
2 3.23re 0.02cp 0avio 822k ping6.pl
35 0.02re 0.01cp 0avio 257k md5sum
97 0.02re 0.01cp 0avio 263k initlog
12 0.19re 0.01cp 0avio 399k promisc_check.s
15 0.09re 0.00cp 0avio 288k grep
11 0.08re 0.00cp 0avio 332k awk
|
用户还可以根据用户而不是命令来提供一个摘要报告。例如sa -m显示如下:
885 173.28re 4.31cp 0avk
root 879 173.23re 4.31cp 0avk
alias 3 0.05re 0.00cp 0avk
qmailp 3 0.01re 0.00cp 0avk |
由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。另外有许多Linux程序也会创建日志,如HTTP和FTP这样提供网络服务的服务器也保持详细的日志。
syslog已被许多日志函数采纳,它用在许多保护措施中——任何程序都可以通过syslog 纪录事件。syslog可以纪录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能纪录本地事件或通过网络纪录另一个主机上的事件。
syslog设备依据两个重要的文件:/etc/syslogd(守护进程)和/etc/syslog.conf配置文件,习惯上,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日志中出现)。
每个syslog消息被赋予下面的主要设备之一:
LOG_AUTH——认证系统:login、su、getty等
LOG_AUTHPRIV——同LOG_AUTH,但只登录到所选择的单个用户可读的文件中
LOG_CRON——cron守护进程
LOG_DAEMON——其他系统守护进程,如routed
LOG_FTP——文件传输协议:ftpd、tftpd
LOG_KERN——内核产生的消息
LOG_LPR——系统打印机缓冲池:lpr、lpd
LOG_MAIL——电子邮件系统
LOG_NEWS——网络新闻系统
LOG_SYSLOG——由syslogd(8)产生的内部消息
LOG_USER——随机用户进程产生的消息
LOG_UUCP——UUCP子系统
LOG_LOCAL0~LOG_LOCAL7——为本地使用保留
syslog为每个事件赋予几个不同的优先级:
LOG_EMERG——紧急情况
LOG_ALERT——应该被立即改正的问题,如系统数据库破坏
LOG_CRIT——重要情况,如硬盘错误
LOG_ERR——错误
LOG_WARNING——警告信息
LOG_NOTICE——不是错误情况,但是可能需要处理
LOG_INFO——情报信息
LOG_DEBUG——包含情报的信息,通常旨在调试一个程序时使用
syslog.conf文件指明syslogd程序纪录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab隔开:选择域指明消息的类型和优先级;动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,syslogd将纪录一个拥有相同或更高优先级的消息。所以如果指明"crit",那所有标为crit、alert和emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。例如,如果想把所有邮件消息纪录到一个文件中,如下:
#Log all the mail messages in one place
mail.* /var/log/maillog |
其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为"err"或更高。例如:
# Save mail and news errors of level err and higher in aspecial file.
uucp,news.crit /var/log/spooler |
当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。
#Everybody gets emergency messages, plus log them on anther machine
*.emerg * *.emerg @linuxaid.com.cn |
alert消息应该写到root和tiger的个人账号中:
#Root and Tiger get alert and higher messages
*.alert root,tiger |
有时syslogd将产生大量的消息。例如内核(“kern”设备)可能很冗长。用户可能想把内核消息纪录到/dev/console中。下面的例子表明内核日志纪录被注释掉了:
#Log all kernel messages to the console
#Logging much else clutters up the screen
#kern.* /dev/console
|
用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别“none”禁止一个设备:
#Log anything(except mail)of level info or higher
#Don't log private authentication messages!
*.info:mail.none;authpriv.none /var/log/messages
|
在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都没有用了。通常要广泛纪录日志。syslog设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。
以上提到的三个日志子系统是Linux日志系统的基础,利用这些日志的常用方式就是查看阅读日志文件。日志文件一般者是纯文本的文件,每一行就是一个消息。只要是在Linux下能够处理纯文本的工具都能用来查看日志文件。如简单地用cat命名就能把“/var/log/messages”文件中的消息显示到屏幕上,但是如果这个文件不只一页,那么就会因为显示滚动得太快看不清文件的内容。
日志文件总是很大的,因为从你第一次启动Linux开始,消息都累积在日志文件中。请注意最好不要用cat显示日志文件的内容,最好也不要用文本编辑器打开日志文件,这是因为一方面很耗费内存,另一方面不允许随意改动日志文件。看日志文件的一个比较好的方法是用象more或less那样的分页显示程序,或者用grep查找特定的消息。我们先用less显示“/var/log/messages”。在图表二可以看到从日志文件中取出来的一些消息。每一行表示一个消息,而且都由四个域的固定格式组成:
时间标签(timestamp),表示消息发出的日期和时间
主机名(hostname)(在我们的例子中主机名为rd002),表示生成消息的计算机的名字。如果只有一台计算机,主机名就可能没有必要了。但是,如果在网络环境中使用syslog,那么就可能要把不同主机的消息发送到一台服务器上集中处理。
生成消息的子系统的名字。可以是“kernel”,表示消息来自内核,或者是进程的名字,表示发出消息的程序的名字。在方括号里的是进程的PID。
消息(message),剩下的部分就是消息的内容了。
Sep 12 Sep 12 Sep 12 Sep 12 Sep 18 Sep 18 Sep 18 Sep 18 Sep 18 Figure
2: Some logs extracted from /var/log/messages |
上面的例子中,第一行是sendmail发出的消息,sendmail守护进程(daemon)负责管理收到和发出的消息。这一行是守护进程正常启动的消息。第二行是来自passwd的消息,提醒我们用户“progs”的口令被“root”改变过。以后其它的消息,报告我们系统的运行情况。实际上在“/var/log/message”文件中的消息都不是特别重要或紧急的。有一个特殊的消息是“MARK”消息,在默认情况下每隔20分钟就会生成一次表示系统还在正常运行。“MARK”消息很象“心跳信号”(heartbeat),例如:“心跳信号”经常用来确认远程主机是否还在运行。“MARK”消息另外的一个用处是用作事后分析,能够帮助系统管理员确定系统死机发生的时间。
access-log 纪录HTTP/web的传输
acct/pacct 纪录用户命令
aculog 纪录MODEM的活动
btmp 纪录失败的纪录
dmesg
lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录
messages 从syslog中记录信息(有的链接到syslog文件)
sudolog 纪录使用sudo发出的命令
sulog 纪录使用su命令的使用
syslog 从syslog中记录信息(通常链接到messages文件)
utmp 纪录当前登录的每个用户
wtmp 一个用户每次登录进入和退出时间的永久纪录
xferlog 纪录FTP会话
我们在本节向大家介绍一下Linux中两个重要的和功能全面的日志文件/var/log/dmesg和
/var/log/messages。
/var/log/dmesg文件保存内核启动的信息,在这个文件里,用户可以看到内核和各种驱动程序的加载,加载硬件驱动时系统也会显示出相应的信息。我们一般可以通过/var/log/dmesg查看某个硬件设备是否已经被系统识别,或是看它是否正常运行。如果某个驱动由于配置错误或硬件本身有问题时,用户就可以使用/var/log/dmesg文件来找原因。这个文件可以用文本编辑器来查看,也可以通过dmesg命令显示出来。
下面我们列出一个dmesg文件的例子:
1 Linux
version 2 Detected
300683434 Hz processor. 3 Console:
colour VGA+ 80x25 4 Calibrating
delay loop... 599.65 BogoMIPS 5 Memory:
63008k/65536k available (1084k kernel code, 412k reserved, 968k data, 64k init, 0k bigmem) 6 Dentry
hash table entries: 262144 (order 9, 2048k) 7 Buffer
cache hash table entries: 65536 (order 6, 256k) 8 Page
cache hash table entries: 16384 (order 4, 64k) 9 VFS:
Diskquotas version dquot_ 10 CPU:
AMD AMD-K6(tm) 3D processor stepping 00 11 Checking
386/387 coupling... OK, FPU using exception 16 error reporting. 12 Checking
'hlt' instruction... OK. 13 POSIX
conformance testing by UNIFIX 14 PCI:
PCI BIOS revision 2.10 entry at 0xfb490 15 PCI:
Using configuration type 1 16 PCI:
Probing PCI hardware 17 PCI:
18 Activating
ISA DMA hang workarounds. 19 Linux
NET4.0 for Linux 2.2 20 Based
upon 21 NET4:
Unix domain sockets 1.0 for Linux NET4.0. 22 NET4:
Linux TCP/IP 1.0 for NET4.0 23 IP
Protocols: ICMP, UDP, TCP, IGMP 24 TCP:
Hash tables configured (ehash 65536 bhash 65536) 25 Initializing
RT netlink socket 26 Starting
kswapd v 1.5 27 Detected
PS/2 28 Serial
driver version 4.27 with MANY_PORTS MULTIPORT SHARE_IRQ enabled 29 ttyS00
at 0x 30 ttyS01
at 0x 31 pty:
256 Unix98 ptys configured 32 apm:
BIOS version 1.2 Flags 0x07 (Driver version 1.9) 33 Real
Time Clock Driver v1.09 34 RAM
disk driver initialized: 16 RAM disks of 4096K size 35 VP_IDE:
IDE controller on PCI bus 00 dev 39 36 VP_IDE:
not 100% native mode: will probe irqs later 37 ide0:
BM-DMA at 0xe000-0xe007, BIOS settings: hda:DMA, hdb:DMA 38 ide1:
BM-DMA at 0xe008-0xe 39 hda:
Maxtor 51369U3, ATA DISK drive 40 hdb:
IDE/ATAPI CD-ROM 32X, ATAPI CDROM drive 41 ide0
at 0x 42 hda:
Maxtor 51369U3, 12949MB w/2048kB Cache, CHS=6577/64/63 43 hdb:
ATAPI 16X CD-ROM drive, 128kB Cache 44 Uniform
CDROM driver Revision: 2.56 45 Floppy
drive(s): fd0 is 46 FDC
0 is a post-1991 82077 47 md
driver 0.90.0 MAX_MD_DEVS=256, MAX_REAL=12 48 raid5:
measuring checksumming speed 49 raid5:
MMX detected, trying high-speed MMX checksum routines 50 pII_mmx
: 761.238 MB/sec 51 p5_mmx
: 726.567 MB/sec 52 8regs
: 447.675 MB/sec 53 32regs
: 308.610 MB/sec 54 using
fastest function: pII_mmx (761.238 MB/sec) 55 scsi
: 0 hosts. 56 scsi
: detected total. 57 md.c:
sizeof(mdp_super_t) = 4096 58 Partition
check: 59 hda:
hda1 hda2 < hda5 hda6 > 60 autodetecting
RAID arrays 61 autorun
... 62 ...
autorun DONE. 63 VFS:
Mounted root (ext2 filesystem) readonly. 64 Freeing
unused kernel memory: 64k freed 65 Adding
Swap: 66488k swap-space (priority -1) 66 ne2k-pci.c:vpre-1.00e
67 ne2k-pci.c:
PCI NE2000 clone 'RealTek RTL-8029' at I/O 0xe800, IRQ 11. 68 eth0:
RealTek RTL-8029 found at 0xe800, IRQ 11, 00:80:AD:41:22:10. 69 VFS:
Disk change detected on device fd(2,0) |
下面我们对一些重要的信息进行解释:
Linux version |
首先显示的是内核的版本,
Detected 1700.327 MHz processor |
CPU是P4
Console: colour VGA+ 80x25 |
监视器是标准的PC监视器。
Calibrating delay loop... 3374.09 BogoMIPS |
BogoMIPS的benchmark数值。也是衡量CPU性能的一个参数。
Memory: 503332k/516032k available (1326k kernel code, 10140k reserved,
999k data, 212k init, 0k highmem) |
物理内存的大小,这里的内存是512MB。
Buffer cache hash table entries: 65536 (order 6, 256k) |
缓冲区表的数目。缓冲区的作用是在把数据写入块设备之前进行缓存,后来又用来对文件系统的元数据进行缓存,如inode的信息。
VFS: Diskquotas version dquot_ |
内核支持磁盘限额。
CPU: Intel(R) Celeron(R) CPU 1.70GHz stepping 03 |
CPU的信息,这是Intel赛扬
PCI: PCI BIOS revision 2.10 entry at 0xfb490 PCI: Using configuration type 1 PCI: Probing PCI hardware PCI: |
这个信息显示系统正在进行PCI并行设备的探测。
Linux NET4.0 for Linux 2.2 Based upon NET4: Unix domain sockets 1.0 for Linux NET4.0. NET4: Linux TCP/IP 1.0 for NET4.0 |
当前的内核支持net4网络编码库。
IP Protocols: ICMP, UDP, TCP, IGMP |
支持的IP协议有ICMP,
UDP, TCP, IGMP。
Detected PS/2 |
找到了PS/2鼠标口一个。
Serial driver version 4.27 with MANY_PORTS MULTIPORT SHARE_IRQ enabled ttyS00 at 0x03f8 (irq = 4) is a 16550A ttyS01 at 0x02f8 (irq = 3) is a 16550A |
这里显示了串口的信息。
pty: 256 Unix98 ptys configured apm: BIOS version 1.2 Flags 0x07 (Driver version 1.9) |
计算机主板支持APM标准模式的休眠。
Real Time Clock Driver v1.09 |
时钟的驱动程序版本。
RAM disk driver initialized: 16 RAM disks of 4096K size |
内核支持带RAM缓存的硬盘。
VP_IDE: IDE controller on PCI bus 00 dev 39 VP_IDE: not 100% native mode: will probe irqs later ide0: BM-DMA at 0xe000-0xe007, BIOS settings: hda:DMA, hdb:DMA ide1: BM-DMA at 0xe008-0xe00f, BIOS settings: hdc:DMA, hdd:DMA |
显示计算机IDE硬盘控制器的情况。
hda: Maxtor 51369U3, ATA DISK drive |
第一块物理硬盘的情况,是迈拓的牌子。
hdb: IDE/ATAPI CD-ROM 32X, ATAPI CDROM drive |
光驱的情况,这是一个32倍速的光驱。
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 hda: Maxtor 51369U3, 12949MB w/2048kB Cache, CHS=6577/64/63 hdb: ATAPI 16X CD-ROM drive, 128kB Cache |
硬盘和光驱的信息。
Uniform CDROM driver Revision: 2.56 Floppy drive(s): fd0 is 1.44M FDC 0 is a post-1991 82077 |
软盘控制器的信息。
md driver 0.90.0 MAX_MD_DEVS=256, MAX_REAL=12 raid5: measuring checksumming speed raid5: MMX detected, trying high-speed MMX checksum routines pII_mmx : 761.238 MB/sec p5_mmx : 726.567 MB/sec 8regs : 447.675 MB/sec 32regs : 308.610 MB/sec using fastest function: pII_mmx (761.238 MB/sec) |
有关RAID和MD(多设备)的信息,在本机没有采用。
scsi : 0 hosts. scsi : detected total |
内核支持SCSI设备。在本机没有采用。
md.c: sizeof(mdp_super_t) = 4096 Partition check: hda: hda1 hda2 < hda5 hda6 > |
硬盘分区的情况,可以看出第一个分区hda2是扩展分区,其中的空间又分给了2个逻辑分区hda5和hda6。
autodetecting RAID arrays autorun ... ... autorun DONE. |
正在自动检测RAID磁盘阵列,本机没有采用。
VFS: Mounted root (ext2 filesystem) readonly. |
虚拟文件系统已经把根分区挂接好。在这个时候内核已经基本上准备好来启动系统了。
Freeing unused kernel memory: 125k freed |
释放掉没有用的内存,有125K。
Adding Swap: 1020116k swap-space (priority -1) |
加载swap分区。
ne2k-pci.c:vpre-1.00e ne2k-pci.c: PCI NE2000 clone 'RealTek RTL-8029' at I/O 0xe800, IRQ 11. eth0: RealTek RTL-8029 found at 0xe800, IRQ 11, 00:80:AD:41:22:10. |
网卡是PCI
NE2000系列芯片的网卡,很多计算机都使用这种网卡。
到这一步,内核已经完成启动,/sbin/init马上会运行。系统会启动rc.sysinit命令,进行通常的启动。
/var/log/messages文件是Linux系统中最全面的log文件,它记录了内核和应用程序发生错误时的信息和系统运行的一般信息。如果用户在/var/log/messages里面没有找到想要的信息,或者需要某些程序更为详细的信息,用户可以到/var/log目录下查找看是否有以此程序命名的文件。
下面是一个/var/log/messages文件的例子:
Sep 12 Sep 12 Sep 12 Sep 12 Sep 18 Sep 18 Sep 18 Sep 18 |
可以看到从/var/log/messages文件中取出来的一些消息。每一行表示一个消息,而且都由四个域的固定格式组成:
时间戳(timestamp),表示消息发出的日期和时间
主机名(hostname)(在我们的例子中主机名为rd002),表示生成消息的计算机的名字。如果只有一台计算机,主机名就可能没有必要了。但是,如果在网络环境中使用syslog,那么就可能把不同主机的消息发送到一台服务器上集中处理。
生成消息的子系统的名字。可以是“kernel”,表示消息来自内核,或者是进程的名字,表示发出消息的程序的名字。在方括号里的是进程的PID。
消息(message),剩下的部分就是消息的内容了,说明了。
在我们的例子中,
第一行是sendmail发出的消息,sendmail守护进程负责管理收到和发出的消息。这一行是守护进程正常启动的消息。
第二行是来自passwd的消息,提醒我们用户“progs”的口令被“root”改变过。
第四行是说明root用户在终端tty2上面登录上来了。
以后其它的消息,报告我们系统的运行情况,如连接的情况。实际上在messages文件中的消息都不是特别重要或紧急的。有一个特殊的消息是“MARK”消息,在默认情况下每隔20分钟就会生成一次表示系统还在正常运行。“MARK”消息很象“心跳信号”(heartbeat),例如:“心跳信号”经常用来确认远程主机是否还在运行。“MARK”消息另外的一个用处是用作事后分析,能够帮助系统管理员确定系统死机发生的时间。
我们在使用/var/log/messages文件的时候,注意该文件是不断变大的,而且在繁忙的系统中更是以非常快的速度增大。这为查看带来很多不便,我们在这里给出一些查看大日志文件的技巧。新的消息是加在日志文件的末尾的,因此最新的消息总是在文件的末尾出现。显示一个长文件末尾几行的一个方便的方法是使用带“-n”参数的tail命令。例如,为了显示messages日志文件的最后25行,可以用
# tail –n 25 /var/log/messages |
或者
# tail –25 /var/log/messages |
还有一个比较方便的方法是使用less,用“G”命令可以到达文件的末尾
# less /var/log/messages |
在退出程序之前按下“G”。用less最大的好处就是可以很方便地上下滚动文件和查找特定的字符串。
为了等待某个程序的某个特定的消息,可能要不断地查看日志文件。如果用不断地敲tail命令的方法直到消息出现为止,岂不是太麻烦了。在Linux系统中有一个很方便的方法,就是使用“tail –f /var/log/messages”命令。
# tail –f /var/log/messages |
这个“tail”命令会显示日志文件的最后几行,但是不会马上退出。它会一直等到其它程序在指定的日志文件中加入消息行,并且马上就会把这些消息显示出来。“less”命令一个可以用一个参数实现类似的功能,运行
# less +F /var/log/messages |
这样就可以让less象“tail –f”那样运行。而且,less更容易交互使用,因为你可以在任何时候按“CTRL-C”退出等待消息并回到less的正常模式,然后滚动文件,查找字符串。
在保存日志文件的时候,我们同样会遇到Linux文件格式与Windows不兼容的问题,已经在第四章《Linux编辑器》中说明。日志文件的处理同样可以采用unix2dos命令转换,生成Windows平台可以阅读的格式。
例如:
# cp /var/log/dmesg /root/log/dmesg/dmesg.040322 # unix2dos /root/log/dmesg/dmesg.040322 |
# unix2dos -n /var/log/messages /root/log/messages/messages.040322 |
或者保存到文件。以上的命令都可以编制成脚本,利用crond定期执行,如每天运行一次,将最新的日志保存以Windows格式保存起来。
在任何一台服务器中,通常都会有多个用户帐户的存在。每个用户在系统中的行为就记录在这些帐户在系统中的日志中,在处理问题的时候(如www服务异常,smtp进程停止响应)对用户的行为进行分析是有效的方法之一。日志对用户行为的审计可以分为连接记录和进程记录两类。
连接记录是跟踪当前用户当前对话、用户登录和退出的活动。我们可以使用前面提到的utmp和 wtmp工具来完成这一记录过程。Wtmp 工具同时维护重新引导和系统状态变化信息。各种程序对这些工具进行刷新和维护,因此无须进行特殊的后台进程或程序。然而,utmp 和 wtmp 输出结果文件必须存在,如果这些文件不存在会关闭连接记录。与 utmp 和 wtmp 有关的所有数据将分别保存在 /var/run/utmp 和 /var/log/wtmp 中。这些文件归root用户所有。dump-utmp 可以转换连接记录数据为可读的 ASCII 格式数据。
ac
命令提供了有关用户连接的大概统计,我们可以使用带有标志 d 和 p 的
ac 命令。标志 d 显示了一天的总连接统计,标志 p 显示了每一个用户的连接时间。这种统计信息的方式对了解与探测入侵有关的用户情况及其他活动很有帮助。Last 和 who 是出于安全角度定期使用的最常用命令。
last
命令提供每一个用户的登录时间,退出登录时间,登录位置,重新引导系统及运行级别变化的信息。last -10 表示 last 的最多输出结果为最近的 10 条信息。缺省时 last 将列出在 /var/log/wtmp 中记录的每一连接和运行级别的变化。从安全角度考虑,last 命令提供了迅速查看特定系统连接活动的一种方式。观察每天的输出结果是个好习惯,从中可以捕获异常输入项。Last 命令的 -x 选项可以通知系统运行级别的变化。
who
命令主要作用是报告目前正在登录的用户、登录设备、远程登录主机名或使用的 Xwindows 的 X 显示值、会话闲置时间以及会话是否接受 write 或 talk 信息。
例如: who -iwH 的输出结果:
USER MESG LINE LOGIN-TIME IDLE FROM
Sam - tty1
Feb 18
这就表示用户 Sam 不能接受 write 或 talk 信息,2月18日8:42
从 tty1 登录。该命令的安全值提供了用户连接的大致情况,这也为监视可疑活动提供了条件。 其他的有关命令有 lastlog 命令,该命令报告了有关
/var/log/lastlog 中记录的最后一次登录的数据信息。
进程记录是对进程活动的记录。原数据保存在 /var/log/pacct 文件中,其许可权限为 600。该文件的存在是进程记录有效的保障。与连接记录不同,进程记录必须处于打开状态,使用下面的命令设置打开状态.
# accton /var/log/pacct
可以使用自选文件代替 /var/log/pacct,但必须记住这一文件并且设置适当的许可权限。必须在每次引导的时候执行该命令,可以在 /etc/rc.d/rc.local 中输入以下脚本:
# initiate process account
if [ -x /sbin/accton ]
then
/sbin/accton /var/log/pacct
echo "process accounting initiated"
fi
一旦在系统中配置进程记录后,将使用 3 个命令解释在 /var/log/pacct 中的非用户可读的原数据。这些命令分别为 dump-acct,该命令与 dump-utmp 完全相似,sa 命令用于统计系统进程记录的大致情况,最后一个是 lastcomm 命令列出了系统执行的命令。
Linux有多种方法把日志信息写到log文件中,有些程序只是简单地把信息写到对应的log文件,而大多数程序是使用内核提供的标准API接口程序syslog写的。syslogd后台进程从内核收取信息并处理信息。内核本身也有日志,后台进程klogd从内核中得到日志后,再传送给syslogd进程。logger命令能调用这种API发送信息。
syslogd是Linux的标准调用,用来管理应用程序向系统发送信息,应用程序使用的系统库已经加入了syslog功能,这样程序在运行时就会受系统的管理。syslogd后台进程监听这类信息,处理后放在/etc/syslog.conf文件所指定的目录或文件中。syslogd可以在很多Linux版本中自动启动、运行,缺省情况下就能使用,但是用户也能对它做一些改动。
syslogd从系统中获取新的消息,并把消息发送到合适的地方。每一个子系统发出日志消息的时候都会给消息指定一个类型,一个消息可以分成两个部分:“设备”和“优先级”。“设备”标识发出消息的子系统,“优先级”表示消息的重要性,其范围从7(最不重要)到0(最重要)。
klogd 守护进程获得并记录 Linux 内核产生的各种信息。通常,syslogd 会记录 klogd 传来的所有信息,然而,如果调用带有 -f filename 变量的 klogd 时,klogd 就在 filename 中记录所有信息,而不是传给 syslogd。当指定另外一个文件进行日志记录时,klogd 就向该文件中写入所有级别或优先权。Klogd 中没有和 /etc/syslog.conf 类似的配置文件。使用 klogd 而避免使用 syslogd 的好处在于可以查找大量错误。如果有人入侵了内核,使用 klogd 可以修改错误。
内核信息生成顺序如下:
1.
内核的某些模块产生一个系统调用,来创建一个log记录
2.
klogd守护进程从/proc/kmsg中取得该调用信息。/proc/kmsg文件可以从外部程序中获取信息。
3.
信息的优先级域做一次格式转换(内核中定义的是0-7数字),以便于syslogd进行下一步的处理。
4.
信息送给ssyslogd,经过组织、处理后就形成了系统的log。
logger命令可以为syslog(3)系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。用法:logger 例如:logger This is a test!
它将产生一个如下的syslog纪录:Aug 19
logger程序把带有时间的信息写入/var/log/messages文件。
系统管理员可以使用logrotate 程序用来管理系统中的最新的事件。logrotate 还可以用来备份日志文件。它把旧的日志文件删除,并创建新的日志文件,我们把这种操作叫做“转储”。我们可以根据日志文件的大小和天数来转储,这个过程一般通过 crond程序来执行。logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail。
15.5.1.1 logrotate 的配置文件
logrotate的配置文件是
/etc/logrotate.conf。主要参数如下表:
参数 功能 |
compress 通过gzip 压缩转储以后的日志 |
nocompress 不需要压缩时,用这个参数 |
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断 |
nocopytruncate 备份日志文件但是不截断 |
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件 |
nocreate 不建立新的日志文件 |
delaycompress 和
compress 一起使用时,转储的日志文件到下一次转 储时才压缩 |
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。 |
errors address 转储时的错误信息发送到指定的Email 地址 |
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。 |
notifempty 如果是空文件的话,不转储 |
mail address 把转储的日志文件发送到指定的E-mail 地址 |
nomail 转储时不发送日志文件 |
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文 件在同一个文件系统 |
noolddir 转储后的日志文件和当前日志文件放在同一个目录下 |
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关 键字必须单独成行 |
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字 必须单独成行 |
daily 指定转储周期为每天 |
weekly 指定转储周期为每周 |
monthly 指定转储周期为每月 |
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保 留5
个备份 |
tabootext [+] list 让logrotate
不转储指定扩展名的文件,缺省的扩展名 是:.rpm-orig, .rpmsave, v, 和 ~ |
size SIZE 当日志文件到达指定的大小时才转储,Size 可以指定bytes (缺省)以及KB (sizek)或者MB (sizem). |
二、缺省配置
我们以一个logrotate 缺省的配置文件来举例说明/etc/logrotate.conf。
# see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # send errors to root errors root # create new (empty) log files after rotating old
ones create # uncomment this if you want your log files compressed #compress 1 # RPM packages drop log rotation information into
this directory include /etc/logrotate.d # no packages own lastlog or wtmp --we'll rotate
them here /var/log/wtmp { monthly create 0664 root utmp rotate 1 } /var/log/lastlog { monthly rotate 1 } # system-specific logs may be configured here |
缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面12行。
第3行weekly 指定所有的日志文件每周转储一次。
第5行 rotate 4 指定转储文件的保留 4份。
第7行 errors root 指定错误信息发送给root。
第9行create 指定
logrotate 自动建立新的日志文件,新的日志文件具有和原来的文件一样的权限。
第11行 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。
三、使用include 选项读取其他配置文件
include
选项允许系统管理员把分散到几个文件的转储信息,集中到一个主要的配置文件。当 logrotate 从logrotate.conf 读到include
选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。
include
选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d 。
典型的应用有:apache, linuxconf, samba, cron 以及syslog。
这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了。
四、使用include 选项覆盖缺省配置
当 /etc/logrotate.conf 读入文件时,include 指定的文件中的转储参数将覆盖缺省的参数,如下例:
# linuxconf 的参数 /var/log/htmlaccess.log { errors jim notifempty nocompress weekly prerotate /usr/bin/chattr -a
/var/log/htmlaccess.log endscript postrotate /usr/bin/chattr +a
/var/log/htmlaccess.log endscript } /var/log/netconf.log { nocompress monthly } |
在这个例子中,当 /etc/logrotate.d/linuxconf 文件被读入时,下面的参数将覆盖/etc/logrotate.conf中缺省的参数。
Notifempty
errors
jim
五、为指定的文件配置转储参数
经常需要为指定文件配置参数,一个常见的例子就是每月转储/var/log/wtmp。为特定文件而使用的参数格式是:
# 注释 /full/path/to/file { option(s) } |
下面的例子就是每月转储 /var/log/wtmp 一次:
#Use
logrotate to rotate wtmp /var/log/wtmp { monthly rotate 1 } |
用肉眼去一行一行地读系统日志文件是一件枯燥而且容易出错的事情,看累了之后,很可能忽略一些重要的信息。管理员需要一个好的工具来筛选出重要的系统日志信息。下面列举了一些日志管理工具,大家可以根据自己的需要来选用。
swatch是在实践中产生的,对计算机管理非常有用。它能浏览log文件,对找到的关键信息进行处理。
swatch使用perl在log文件中寻找某种表达式,它有三个组成部分:一个控制程序,一个启动的库文件和一个配置文件。配置文件由以下的数据格式组成:
匹配模式
处理方式
时间间隔
时间戳域
时间间隔用于指明信息的出现频度,如果磁盘受到物理性的损坏,每隔数秒显示出一条坏扇区的记录,这些内容一样的记录用户不用详细地逐条来看,swatch会忽略这种内容相同的记录,直到时间到期为止。时间戳域与时间间隔一起使用,在存储log信息时去除其时间标记。
swatch有7种预定义的处理方式:
echo 把信息显示在控制台
bell 向控制台发送control+g
ignore 不做任何处理
write 给用户发送信息
mail 给用户发送电子邮件
pipe 给某些命令传送数据
exec 提供参数运行某个命令
配置文件写好之后,swatch就根据它来创建一个perl脚本,启动一个守护进程,持续地监控log。swatch能对标准信号作出反应,一个SIGHUP信号可以终止已启动的守护进程,并从配置文件重新产生一个进程。这样在修改配置文件的时候,仍能持续地监控系统。swatch能根据不同的配置文件为任何指定的用户启动很多个守护进程,每个用户在其根目录下都有一个.swatch文件,可以用swatch来得到一些系统事件,例如,某个文件被拷贝到某个目录下了。
15.6.2.1 colorlogs
这个软件增加了ANSI escape字符,可以把log信息变成彩色的,便于查看。
15.6.2.2 pppsum
pppsum可以分析pppdlog,输出使用时间、接收和发送的字节数。
slogs可以从一个脚本文件中记录下suid、连接、su、httpd和系统日志。
space
watcher可以自动监控磁盘空间的使用情况,一旦发现情况立即发出警告。
weblog是一个基于python的分析工具,分析web server和防火墙记录。
|