分析和排查系統故障
一、日誌系統
1、概念
日誌文件:系統中各個運行消息的文件,不同的日誌文件記錄了不同類型的信息,如內核消息、錯誤消息等
syslog服務:syslogd: 系統,非內核產生的信息
klogd:內核,專門負責記錄內核產生的日誌信息
2、分類
1、內核及系統日誌:數據由系統服務rsyslog統一管理,可以根據主配文件/etc/rsyslog.conf中的設置決定內核消息及其各種系統消息的記錄位置
示例
[root@node2 ~]# tailf /var/log/messages
May 19 21:01:01 node2 systemd: Started Session 5 of user root.
消息 | 說明 |
---|---|
May 19 21:01:01 | 時間:消息發出的時間和日期 |
node2 | 主機名:生成消息的計算機的名稱 |
systemd | 子系統的名稱:發出消息的應用程序的名稱 |
Started Session 5 of user root. | 消息內容:消息的具體內容 |
2、用戶日誌:數據用於記錄系統用戶登錄及其退出系統的相關信息,包括用戶名、登錄終端、登錄時間、來源、使用的進程等等
查詢當前登錄的用戶情況
[root@node1 ~]# users
root root
[root@node1 ~]# who
root tty1 2020-05-19 19:42
root pts/0 2020-05-19 19:51 (192.168.1.10)
[root@node1 ~]# w
21:38:40 up 1:48, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 19:42 1:54m 0.05s 0.05s -bash
root pts/0 192.168.1.10 19:51 0.00s 0.13s 0.00s w
查詢用戶登錄的歷史記錄
[root@node1 ~]# last //查詢成功登錄到系統的用戶記錄,最近的登錄情況將顯示在最前面
root pts/0 192.168.1.10 Tue May 19 19:51 still logged in
root tty1 Tue May 19 19:42 still logged in
reboot system boot 3.10.0-957.el7.x Tue May 19 19:42 - 21:39 (01:56)
root tty1 Wed Apr 22 04:04 - 04:05 (00:00)
reboot system boot 3.10.0-957.el7.x Wed Apr 22 04:04 - 21:39 (27+17:34)
wtmp begins Tue Apr 14 23:57:26 2020
[root@node1 ~]# lastb //查詢登錄失敗的用戶記錄,如登錄的用戶名錯誤、密碼不正確等情況
root tty1 Thu Apr 16 19:08 - 19:08 (00:00)
查看安全日誌文件
[root@node1 ~]# tailf /var/log/secure //查看/var/log/secure安全日誌文件
May 19 20:07:38 localhost polkitd[5973]: Registered Authentication Agent for unix-process:8012:105101 (system bus name :1.56 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
May 19 20:07:38 localhost polkitd[5973]: Unregistered Authentication Agent for unix-process:8012:105101 (system bus name :1.56, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
3、 程序日誌:應用程序自己獨立管理的一個日誌,記錄程序本身運行過程中的各種事件信息
httpd 服務的日誌文件access_log和error_log分別記錄客戶訪問事件和錯誤信息
[root@base httpd]# pwd
/var/log/httpd
[root@base httpd]# ls
access_log error_log
二、分析日誌文件
1、主要日誌文件
常見的一些日誌文件
目錄 | 說明 |
---|---|
/var/log/messages | 記錄Linux操作系統常見的系統和服務錯誤信息 |
/var/log/cron | 記錄crond計劃任務產生的事件信息 |
/var/log/dmesg | 記錄Linux操作系統在引導過程中的各種事件信息 |
/var/log/maillog | 記錄進入或發出系統的電子郵件活動 |
/var/log/lastlog | 記錄每個用戶最近的登錄事件 |
/var/log/secure | 記錄用戶認證相關的安全事件信息 |
/var/log/wtmp | 記錄每個用戶登錄、註銷及系統啓動和停機事件,使用last命令查看 |
/var/log/btmp | 記錄失敗的、錯誤的登錄嘗試及驗證事件,lastb命令查看 |
/var/log/boot.log | 記錄了系統在引導過程中發生的事件,就是Linux系統開機自檢過程顯示的信息 |
/var/log/syslog | 只記錄警告信息,常常是系統出問題的信息,使用lastlog查看 |
/var/run/utmp | 該日誌文件記錄有關當前登錄的每個用戶的信息 |
2、日誌文件分析
1、日誌消息級別
數字 | 優先級別 | 說明 |
---|---|---|
0 | EMERG (緊急) | 會導致主機系統不可用的情況 |
1 | ALERT (警告) | 必須馬上採取措施解決的問題 |
2 | CRIT (嚴重) | 比較嚴重的情況 |
3 | ERR (錯誤) | 運行出現錯誤 |
4 | WARNING (提醒) | 可能影響系統功能,需要提醒用戶的重要事件 |
5 | NOTICE (注意) | 不會影響正常功能,但是需要注意的事件 |
6 | INFO (信息) | 一般信息 |
7 | DEBUG (調試) | 程序或系統調試信息等 |
2、rsyslog.conf文件分析
加載模塊、轉發端口等基本配置
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
查看系統默認的日誌設置
[root@localhost ~]# grep -v "^$" /etc/rsyslog.conf | grep -v "^#"
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
服務名稱
服務 | 說明 | 服務 | 說明 |
---|---|---|---|
auth | 認證相關的 | authpriv | 權限,授權相關的 |
cron | 任務計劃相關的 | daemon | 守護進程相關的 |
kern | 內核相關的 | lpr | 打印相關的 |
郵件相關的 | mark | 標記相關的 | |
news | 新聞相關的 | security | 安全相關的 |
syslog | syslog本身的 | user | 用戶相關的 |
uucp | unix to unix cp 相關的 | local0 到 local7 | 用戶自定義使用 |
* | 表示所有的facility |
3、action(動作)日誌記錄的位置
更改系統安全日誌secure的記錄位置
[root@localhost ~]# vim /etc/rsyslog.conf
authpriv.* /usr/local/secure //原位置爲/var/log/secure
[root@localhost ~]# setenforce 0 //臨時禁用selinux
[root@localhost ~]# systemctl restart rsyslog.service //重啓服務
[root@localhost ~]# ls /usr/local/ //觸發日誌
bin etc games include lib lib64 libexec sbin secure share src
[root@localhost ~]# chattr +a /usr/local/secure //增加特殊權限,防止有其他人把記錄給刪除掉
[root@localhost ~]# lsattr /usr/local/secure
-----a---------- /usr/local/secure
[root@localhost ~]# cat /usr/local/secure //查看驗證
May 19 23:33:20 localhost polkitd[5973]: Unregistered Authentication Agent for unix-process:17873:586822 (system bus name :1.55, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
三、日誌的採集
1、一般日誌採集
發送方設置
[root@node1 ~]# vim /etc/rsyslog.conf
......
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
......
*.* @192.168.1.61 //所有級別的所有信息通過UDP端口發送到192.168.1.61(@:UDP端口;@@:TCP端口)
[root@node1 ~]# systemctl restart rsyslog.service
[root@node1 ~]# systemctl start firewalld.service
[root@node1 ~]# systemctl enable firewalld.service
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
[root@node1 ~]# firewall-cmd --add-port=514/tcp --add-port=514/udp --permanent
success
[root@node1 ~]# firewall-cmd --reload
success
[root@node1 ~]# firewall-cmd --list-ports
514/tcp 514/udp
接收方設置
[root@node2 ~]# vim /etc/rsyslog.conf
......
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
......
[root@node2 ~]# systemctl restart rsyslog.service
[root@node2 ~]# firewall-cmd --add-port=514/tcp --add-port=514/udp --permanent
success
[root@node2 ~]# firewall-cmd --reload
success
[root@node2 ~]# firewall-cmd --list-ports
514/tcp 514/udp
當node1產生變化時,node2自動採集
[root@node1 ~]# su - test1
[root@node1 ~]# yum -y install elinks
[root@node2 ~]# tailf /var/log/messages
May 19 23:52:02 node1 su: (to test1) root on pts/0
May 19 23:53:10 node1 yum[18401]: Installed: nss_compat_ossl-0.9.6-8.el7.x86_64
May 19 23:53:10 node1 yum[18401]: Installed: 1:js-1.8.5-20.el7.x86_64
May 19 23:53:10 node1 yum[18401]: Installed: elinks-0.12-0.37.pre6.el7.0.1.x86_64
2、Nginx日誌採集
nginx主機設置
[root@node1 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@node1 ~]# yum makecache fast
[root@node1 ~]# yum -y install nginx
[root@node1 ~]# systemctl start nginx
[root@node1 ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@node1 ~]# systemctl status nginx
[root@node1 ~]# vim /etc/rsyslog.conf
......
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
......
*.* @192.168.1.61
$ModeLoad imfile
$InputFilePollInterval 1 //間隔多久採集1次。默認單位是秒
$InputFileName /var/log/nginx/access.log //
$InputFileTag nginx-info-access; //採集的日誌的名稱
$InputFilestateFile state-nginx-info-accesslog //給對應的日誌打一個標籤
$InputRunFileMonitor
$InputFileName /var/log/nginx/error.log
$InputFileTag nginx-info-error;
$InputFilestateFile state-nginx-info-errorlog //給這個日誌命名
$InputRunFileMonitor //啓動監控
$InputFilePollInterval 10
if $programname == 'nginx-info-access' then @192.168.1.61:514
if $programname == 'nginx-info-access' then ~
if $programname == 'nginx-info-error' then @192.168.1.61:514
if $programname == 'nginx-info-error' then ~
[root@node1 ~]# systemctl restart rsyslog.service
接收方設置同上
[root@node2 ~]# tailf /var/log/messages
May 20 00:25:14 node1 rsyslogd: invalid or yet-unknown config file command 'InputFilePollInterval' - have you forgotten to load a module? [v8.24.0-34.el7 try http://www.rsyslog.com/e/3003 ]
3、日誌切割
[root@node1 ~]# grep -v '^$' /etc/logrotate.conf | grep -v '^#'
weekly //切割週期,默認每週
rotate 4 //保留多少個日誌文件,那麼一週一個,也就是能看到一個月的日誌。如果是0就表示不作備份,僅做了一個切割,表示每週清空一下日誌。
create //舊日誌切割後,源文件是否生成新的日誌
dateext //切割後,日誌的文件類型是什麼樣(log日期的格式:xxx.log-20190705)
include /etc/logrotate.d //還需要讀取這個地方的內容 ,目錄裏都是其他地方的日誌
/var/log/wtmp { //特指某個文件的切割方式
monthly //每月切割
create 0664 root utmp //切割完成之後,這個文件的權限,以及屬主和屬組是誰
minsize 1M //文件超過1M之後才切割,這表示即便過了1個月,大小沒到1M,也不切割
rotate 1 //保留1個
}
/var/log/btmp {
missingok //丟了也沒關係,熱日誌會出現中斷
monthly
create 0600 root utmp
rotate 1
}
參數 | 說明 | 參數 | 說明 |
---|---|---|---|
compress | 壓縮,gzip | delaycompress | 延遲壓縮 |
nocompress | 不壓縮 | copytruncate | 先拷貝,再清空 |
ifemty | 即使日誌文件爲空,到日期也切割 | notifempty | 爲空者不切割 |
mail Email | 切割後的日誌文件,不在本地保存,發送郵件到其他地方 | nomail | 生成的日誌不發送,在本地使用 |
olddir Directory | 另存爲的地址,如果不寫則默認是在同一個目錄下邊 | noolddir | 轉存文件都保存在本地 |
sharedscripts | 運行腳本 | postrotate | 切割之後,執行腳本 |
prefotate | 切割之前,執行腳本 | daily | 每天 |
weekly | 每週 | mounthly | 每月 |
yearly | 每年 | rotate count | 保存幾份 |
dateexxt | 使用當前日期 | size (minisize) | 達到多少才切割,默認單位是M,sizeksizem默認單位是kb |
切割安全日誌
[root@node1 ~]# vim /etc/rsyslog.conf
authpriv.* /var/log/secure
[root@node1 ~]# cd /etc/logrotate.d/
[root@node1 logrotate.d]# vim secure
/var/log/secure {
missingok
notifemty
daily
create
rotate 4
compress
}
[root@node1 ~]# vim /etc/rsyslog.conf
[root@node1 ~]# cd /etc/logrotate.d/
[root@node1 logrotate.d]# vim secure
[root@node1 logrotate.d]# useradd zhangsan //添加用戶,切換用戶觸發日誌
[root@node1 logrotate.d]# echo 123.com | passwd --stdin zhangsan
Changing password for user zhangsan.
passwd: all authentication tokens updated successfully.
[root@node1 logrotate.d]# su - zhangsan
[zhangsan@node1 ~]$ echo hello logrotate > testfile
[zhangsan@node1 ~]$ cat testfile
hello logrotate
[zhangsan@node1 ~]$ exit
logout
[root@node1 logrotate.d]# tail /var/log/secure
May 19 19:43:06 localhost polkitd[5973]: Registered Authentication Agent for unix-process:7289:3323 (system bus name :1.21 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
May 19 19:43:06 localhost polkitd[5973]: Unregistered Authentication Agent for unix-process:7289:3323 (system bus name :1.21, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
May 19 19:43:16 localhost polkitd[5973]: Registered Authentication Agent for unix-process:7337:4364 (system bus name :1.22 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
May 19 19:43:16 localhost polkitd[5973]: Unregistered Authentication Agent for unix-process:7337:4364 (system bus name :1.22, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
May 19 21:57:02 localhost sshd[7796]: Accepted password for root from 192.168.1.10 port 60637 ssh2
May 19 21:57:02 localhost sshd[7796]: pam_unix(sshd:session): session opened for user root by (uid=0)
May 19 22:16:02 localhost sshd[7796]: pam_unix(sshd:session): session closed for user root
May 19 23:13:20 localhost sshd[17818]: Accepted password for root from 192.168.1.10 port 61197 ssh2
May 19 23:13:20 localhost sshd[17818]: pam_unix(sshd:session): session opened for user root by (uid=0)
May 19 23:33:20 localhost polkitd[5973]: Registered Authentication Agent for unix-process:17873:586822 (system bus name :1.55 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
[root@node1 logrotate.d]# logrotate -vf /etc/logrotate.d/secure //手動切割日誌(-f :強制, -v: 顯示過程)
[root@node1 logrotate.d]# tail /var/log/secure //源文件已被切割,爲空
tail: cannot open ‘/var/log/secure’ for reading: No such file or directory
[root@node1 logrotate.d]# ls /var/log/
anaconda dmesg maillog tallylog vmware-network.4.log vmware-vmsvc.log
audit dmesg.old messages tuned vmware-network.5.log wtmp
boot.log firewalld nginx vmware-network.1.log vmware-network.6.log yum.log
btmp grubby_prune_debug rhsm vmware-network.2.log vmware-network.log
cron lastlog spooler vmware-network.3.log vmware-vgauthsvc.log.0
如果有特殊權限,而每次切割完成之後,都需要重新啓動一下我們rsyslog服務,所以這個時候就需要我們自己來寫腳本支持
[root@node1 logrotate.d]# vim secure
/var/log/secure {
sharedscripts
prerotate
/usr/bin/chattr -a /var/log/secure
endscript
missingok
notifemty
daily
create
rotate 4
compress
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null
/usr/bin/chattr +a /var/log/secure
endscript
}
四、排除系統啓動類故障
1、MBR扇區故障
1、備份MBR扇區數據
將第一塊硬盤(sda) 的MBR扇區備份到第二塊硬盤的sdb1分區中(掛載到/backup目錄)
2、模擬MBR扇區故障
當出現“Operating system not found”的提示信息,表示無法找到可用的操作系統,因此無法啓動主機
3、從備份文件中恢復MBR扇區數據
選擇"Rescue a CentOS Linux system"選項
2、GRUB引導故障
在提示符後輸入對應的引導命令,然後執行"boot”命令即可正常引導Linux操作系統
grub> insmod xfs
grub> linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro crash kernel=autord.Ivm.lv=cl/root rd.lvm.1v=cl/swap rhgb quiet LANG=en_US.UTF-8
grub> initrd16 /initramfs-3.10.0-514.e17.x86_64.img
grub> boot
3、遺忘root用戶的密碼
進入急救模式重設root用戶密碼
sh-4.2# chroot /mnt/sysimage
bash-4.1# passwd root
三、排除文件系統類故障
1、修復文件系統
修復一般的文件系統錯誤
2、磁盤資源耗盡故障
修復i結點耗盡故障:將該分區中佔用大量i結點的細小文件,進行轉移或者刪除即可
3、檢測硬盤壞道
現象
讀取磁盤中的數據時,磁盤設備發出異常聲響。
訪問磁盤中的某個文件時,反覆讀取且出錯,提示文件損壞。
對於新建立的分區無法完成格式化。
系統使用該磁盤時頻繁死機。
查看硬盤設備/dev/sdb中的壞道情況