深入理解linux文件系統與日志分析
linux文件系統:
文件是存儲在硬盤上的,硬盤上的最小存儲單位是扇區,每個扇區的大小是512字節。
inode:元信息(文件的屬性 權限,創建者,創建日期等等)
block:塊,連續的八個扇區組成一個塊,一個塊的大小是4k,創建一個文件,最小也要占4k。
操作系統讀取硬盤,是一次性讀取多個扇區,一個塊一個塊的讀取數據。
創建文件:第一個是實際空間大小的要占,第二個就是元信息。元信息和實際數據都保存在硬盤上。元信息(inode)占128字節或者256字節。
一個文件必須占用一個inode(只要創建文件必須有一個inode號)
至少占用一個block(空文件,也要一個塊。)
時間戳:
atime:只要讀取文件就會更新這個時間
mtime:修改文件數據,更改文件的屬性,都會更新這個時間
ctime:修改文件的權限也會更新這個時間。
inode的內容:
inode號:linux系統都是識別文件的inode號
元信息發生了變化,inode號也會隨之改變
inode號的總數?
磁盤大小 磁盤越大inode號越多,磁盤越小inode號越少。
inode號和文件名分離,二者只是映射關系,linux系統的特有現象:
1、文件名包含特殊字符,rm可能無法正常刪除,可以直接刪除inode號
2、移動文件,重命名,inode是不變的
3、一旦開始對文件操作,后續所有的認證和識別都是通過inode來的,不再考慮文件名
4、元信息發生變化,inode也會發生變化
實驗:
1、exit4
2、xfs 要有結論 20M 模擬把inode號耗盡,看看還能不能繼續寫入?能寫入的話,能寫入多少呢?
可以繼續寫入,第一次能多寫61個,第二次能行134個
如果inode號滿了,exit4和xfs之間有什么區別?
exit4不能繼續創建文件了,但xfs還可以繼續創建文件
xfs文件系統,如何能夠實現備份和恢復?
centos7默認使用的文件系統就是xfs。
xfsdump 備份
xfsrestore 恢復
xfsdump 命令的選項:
-f 指定需要備份的硬盤分區(硬件設備的掛載點也可以)
-L 指定標簽
-M 指定設備標簽
-s 備份單個文件,-s后面不能之間跟路徑
xfsdump使用限制:
1、只能備份xfs文件系統
2、只能備份已經掛載的文件系統
3、只有root權限才能進行操作
4、備份之后的數據要恢復,只能使用xfsrestore解析恢復
5、如果兩個設備的uuid相同,不能備份(這種情況幾乎不會有)
備份完之后,恢復文件,inode號是否會發生變化?
[root@localhost ~]# xfsdump -f /opt/backup /dev/sdb2 [-L backup -M sdb2]
-f 執行文件
/opt/backup 必須是個文件,必須是個不存在的文件。不能是目錄。如果已經存在,必須是個空文件。
/dev/sdb2 設備
[-L 文件標簽(備份文件的標簽)]
[-M 設備標簽(要備份的硬盤分區)]
備份的級別:全量備份和增量備份
0也是默認 也就是全量備份
1-9是增量備份,一般不用
xfsrestore -f /opt/backup /data1/
前一個是備份的問價
后一個是恢復到指定的目錄。
具體操作:
[root@localhost opt]# xfsdump -f /opt/backup /dev/sdb3 [-L backup -M sdb3] #將data3目錄下的內容進行備份 [root@localhost opt]# cd /data3 #進入data3目錄下 [root@localhost data3]# ls #查看現有的文件 123.txt qwe.txt [root@localhost data3]# ls -i #查看現有文件的inode號 68 123.txt 69 qwe.txt [root@localhost data3]# rm -rf * #刪除現有文件 [root@localhost /]# xfsrestore -f /opt/backup /data3/ #將文件恢復 [root@localhost /]# cd /data3 [root@localhost data3]# ls #被刪的文件恢復了 123.txt qwe.txt [root@localhost data3]# ls -i #inode號改變了 74 123.txt 75 qwe.txt ?
EXT類型備份和恢復:
ext4只能在centos6
ext3格式:需要extundelete進行恢復
日志分析:
系統的日志類型以及日志如何分析
linux系統本身的日志和大部分的服務器程序的日志都在/var/log/
/var/log/massages 記錄了linux的內核消息,各種應用程序的公共日志消息。
應用程序公共日志:開、關、重啟、網絡錯誤、程序故障這些都屬于公共日志。
訪問日志和一些自由業務日志不包含其中。
/var/log/cron: 記錄的是定時任務的日志
/var/log/dmesg: 引導過程中的日志信息
/var/log/maillog: 記錄進入或者發出的系統電子郵件信息
/var/log/secure: 用戶認證的相關消息
linux的日志級別:
日志消息的級別:數字越小,優先級越高,消息越重要。
級號 | 消息 | 級別 | 說明 |
---|---|---|---|
0 | EMERG | 緊急 | 會導致主機系統不可用,系統崩潰。磁盤滿了(EMERG) |
1 | ALERT | 警告 | 必須要馬上采取措施解決的問題,密碼到期,數據庫崩潰。 |
2 | CRIT | 嚴重 | 比較嚴重的情況,磁盤讀寫出了故障,有些程序的功能無法啟動。 |
3 | ERR error | 錯誤 | 運行出現錯誤,程序啟動失敗,端口被占用等等,見的最多的情況,出現了也是要盡快解決的。 |
4 | WARNING | 提醒 | 可能會影響功能,需要提醒用戶的重要事件,但是不是報錯。磁盤使用率到了85%。 |
5 | NOTICE | 注意 | 也是需要用戶注意的,無需處理。 |
6 | INFO | 信息 | 一般信息,系統或者應用程序在工作中產生的正常消息 |
7 | DEBUG | 調試 | 程序在開發階段,調試程序時的信息。 |
NONE | 沒有優先級,不記錄任何日志信息 |
日志級別怎么定義:
*.info *:表示所有,表示系統當中的設備,或者程序。
info:包含info以及info級別以上的日志。
auth 用戶認證產生的體制
authpriv: SSh,FTP登錄驗證的信息
news: 網絡傳輸產生的消息
syslog:系統的相關日志
kern:系統的內核日志
user:用戶進程日志
local-local7:自定義程序的日志
uucp:unix-to-unix copy 兩個linux系統之間的通信
mail.info /var/log/mail.log:記錄郵件的信息,包含info和info以上的,記錄到/var/log/mail.log
mail.=info /var/log/mail.log: 只記錄日志級別是info的
mail.!info /var/log/mail.log: 除了info的不記錄,其他的都記
May 31 13:46:02 test1 systemd: Starting The Apache HTTp Server...
May 31 13:46:02:表示當前日志發生的時間
test1:表示發生的主機名
systemd:哪個系統產生了這個日志
Starting The Apache HTTp Server...:日志的具體內容
第一個實驗:
ssh的日志單獨的列出來,作為一個獨立的日志文件。
1、關閉防火墻和安全機制
[root@test2 opt]# systemctl stop firewalld [root@test2 opt]# setenforce 0
2、打開系統管理日志
[root@test2 opt]# vim /etc/rsyslog.conf 73 local7.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /var/log/boot.log 74 local6.* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /var/log/ssh.log #在74行加一個自定義的日志
3、配置sshd_config文件
[root@test2 etc]# vim /etc/ssh/sshd_config #進入sshd_config文件內32 #SyslogFacility AUTHPRIV #將32行注釋掉33 SyslogFacility LOCAL6 #將ssh日志保存到我們之前自定義的日志中去
4、將兩個服務重啟一下
[root@test2 etc]# systemctl restart rsyslog.service [root@test2 etc]# systemctl restart sshd
5、打開ssh.log的日志
[root@test2 log]# tail -f ssh.log May 31 16:11:03 localhost sshd[15025]: Server listening on 0.0.0.0 port 22. May 31 16:11:03 localhost sshd[15025]: Server listening on :: port 22. May 31 16:11:47 localhost sshd[15037]: Accepted password for root from 192.168.60.1 port 49991 ssh2
6、用另一個主機test3訪問主機test2
[root@test3 ~]# ssh root@192.168.60.20 The authenticity of host '192.168.60.20 (192.168.60.20)' can't be established. ECDSA key fingerprint is SHA256:exDKRdJYt8I/epk5vy8tx4NIWpdeTgKktVBWDTq1jmU. ECDSA key fingerprint is MD5:ae:80:df:32:41:cb:64:3b:6c:ad:1d:92:e1:77:40:04. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.60.20' (ECDSA) to the list of known hosts. root@192.168.60.20's password: Last login: Fri May 31 16:18:20 2024
7、主機test2顯示test3訪問test2的ssh日志
[root@test2 log]# tail -f ssh.log May 31 16:11:03 localhost sshd[15025]: Server listening on 0.0.0.0 port 22. May 31 16:11:03 localhost sshd[15025]: Server listening on :: port 22. May 31 16:11:47 localhost sshd[15037]: Accepted password for root from 192.168.60.1 port 49991 ssh2 May 31 16:15:54 localhost sshd[15130]: Accepted password for root from 192.168.60.30 port 44106 ssh2
第二個實驗:
配置一個日志服務器,來進行日志收集。
test2 192.168.60.20 日志收集服務器
test3 192.168.60.30 20上面產生的日志,都會發到20上,30自己不再記錄日志
操作:
1、在主機test3里更改rsyslog.conf文件
[root@test3 ~]# vim /etc/rsyslog.conf 19 $ModLoad imtcp #將19行和20行的注釋去掉20 $InputTCPServerRun 51454 #*.info;mail.none;authpriv.none;cron.none ? ? ? ? ? ? ? /var/log/messages #將54行注釋55 *.info;mail.none;authpriv.none;cron.none ? ? ? ? ? ? ? @@192.168.60.20 #加一個55行,將test3的系統日志放到test2內的系統日志
2、在主機test2里更改rsyslog.conf文件
[root@test3 ~]# vim /etc/rsyslog.conf 19 $ModLoad imtcp #將19行和20行的注釋去掉20 $InputTCPServerRun 514
3、在test3里重啟一下rsyslog.service文件
[root@test3 ~]# systemctl restart rsyslog.service #重啟rsyslog.service文件 [root@test3 ~]# netstat -antp | grep 514 tcp ? ? ? 0 ? ? 0 0.0.0.0:514 ? ? ? ? ? ? 0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? 16771/rsyslogd ? ? ? tcp6 ? ? ? 0 ? ? 0 :::514 ? ? ? ? ? ? ? ? :::* ? ? ? ? ? ? ? ? ? LISTEN ? ? 16771/rsyslogd ? ? ?
4、在test2里重啟一下rsyslog.service文件
[root@test2 log]# systemctl restart rsyslog.service #重啟rsyslog.service文件
5、在test2里打開系統日志
[root@test2 log]# tail -f /var/log/messages May 31 16:50:01 localhost systemd: Started Session 60 of user root. May 31 17:00:01 localhost systemd: Started Session 61 of user root. May 31 17:01:01 localhost systemd: Started Session 62 of user root. May 31 17:10:01 localhost systemd: Started Session 63 of user root. May 31 17:10:54 test2 systemd: Stopping System Logging Service... May 31 17:10:54 test2 rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-34.el7" x-pid="14958" x-info="http://www.rsyslog.com"] exiting on signal 15. May 31 17:10:54 test2 systemd: Stopped System Logging Service. May 31 17:10:54 test2 systemd: Starting System Logging Service... May 31 17:10:54 test2 rsyslogd: [origin software="rsyslogd" swVersion="8.24.0-34.el7" x-pid="16198" x-info="http://www.rsyslog.com"] start May 31 17:10:54 test2 systemd: Started System Logging Service.
6、在test3里模擬一下
[root@test3 ~]# logger "this is xy102"
7、在test2的系統日志里顯示
[root@test2 log]# tail -f /var/log/messages May 31 17:14:07 test2 systemd-logind: Removed session 56. May 31 17:15:02 test3 root: this is xy102
8、在test3的系統日志里不顯示
[root@test3 ~]# tail -f /var/log/messages May 31 17:07:05 localhost systemd: [/usr/lib/systemd/system/firstboot-graphical.service:14] Support for option SysVStartPriority= has been removed and it is ignored
@@192.168.233.10
@@表示tcp協議進行數據傳輸
@表示使用UDP協議進行傳輸
LISTEN:監聽,端口是否開啟。端口是否正常傳輸數據
ESTABLISHED:表示端口之間已經建立連接而且正在傳輸數據。