Linux--檔案系統與日誌分析

實在不知道怎麼寫部落格發表於2020-10-22

一、深入理解Linux檔案系統

1.inode和block概述

檔案資料包括元資訊與實際資料
檔案儲存在硬碟上,硬碟最小儲存單位是“扇區”,每個扇區儲存512位元組
block(塊)

連續的八個扇區組成一個block
是檔案存取的最小單位

inode(索引節點)

中文譯名為“索引節點”,也叫i節點
用於儲存檔案元資訊
在這裡插入圖片描述

2.inode的內容

inode 包含很多的檔案元資訊,但不包含檔名,例如:
檔案的位元組數
檔案擁有者的 UserID
檔案的 GroupID
檔案的讀、寫、執行許可權
檔案的時間戳

使用 stat 命令即可檢視某個檔案的 inode 資訊

stat anaconda-ks.cfg

Linux 系統檔案有三個主要的時間屬性
ctime(change time)
最後一次改變檔案或目錄(屬性)的時間
atime(access time)
最後一次訪問檔案或目錄的時間
mtime(modify time)
最後一次修改檔案或目錄(內容)的時間
目錄檔案的結構
目錄也是一種檔案
目錄檔案的結構如下圖:
在這裡插入圖片描述
每個inode都有一個號碼,作業系統用inode號碼來識別不同的檔案 Linux系統內部不使用檔名,而使用inode號碼來識別檔案對於使用者,檔名只是inode號碼便於識別的別稱

inode的號碼

使用者在訪問檔案時,表面上是使用者通過檔名來開啟檔案,而實際系統內部的過程分成以下三步:

系統找到這個檔名對應的 inode 號碼
通過 inode 號碼,獲取 inode 資訊
根據 inode 資訊,找到檔案資料所在的 block,並讀出資料

常見的檢視 inode 號碼的方式有兩種:

  1. ls -i 命令:直接檢視檔名所對應的 inode 號碼
  2. stat 命令:通過檢視檔案 inode 資訊而檢視到 inode 號碼
[root@localhost ~]# stat anaconda-ks.cfg
或者
[root@localhost ~]# ls -i anaconda-ks.cfg 

所以,當使用者在 Linux 系統中試圖訪問一個檔案時,系統會先根據檔名去查詢它對應的 inode,看該使用者是否具有訪問這個檔案的許可權。如果有,就指向相對應的資料 block, 如果沒有,就返回 Permission denied。

一塊硬碟分割槽後的結構則是如下圖所示:
在這裡插入圖片描述

檔案儲存小結

在這裡插入圖片描述

inode的大小

inode 也會消耗硬碟空間,所以格式化的時候,作業系統自動將硬碟分成兩個區域。一個是資料區,存放檔案資料;另一個是 inode 區,存放inode 所包含的資訊。每個 inode 的大小,一般是 128 位元組或 256 位元組。通常情況下不需要關注單個 inode的大小,而是需要重點關注 inode 總數。inode 的總數在格式化時就給定了,執行“df -i”命令即可檢視每個硬碟分割槽對應的的inode 總數和已經使用的 inode 數量。

[root@localhost ~]# df -i

由於 inode 號碼與檔名分離,導致一些Unix/Linux 系統具備以下幾種特有的現象:

檔名包含特殊字元,可能無法正常刪除。這時直接刪除 inode,能夠起到刪除檔案的作用
移動檔案或重新命名檔案,只是改變檔名,不影響 inode 號碼
開啟一個檔案以後,系統就以 inode 號碼來識別這個檔案,不再考慮檔名

這種情況使得軟體更新變得簡單,可以在不關閉軟體的情況下進行更新,不需要重啟。 因為系統通過 inode號碼,識別執行中的檔案,不通過檔名。更新的時候,新版檔案以同樣的檔名,生成一個新的inode,不會影響到執行中的檔案。等到下一次執行這個軟體的時候,檔名就自動指向新版檔案,舊版檔案的 inode 則被回收。

3.連結檔案

在 Linux 系統下的連結檔案有兩種,一種類似於 Windows的快捷方式功能的檔案,可以快速連線到目標檔案或目錄,稱之為軟連結;另一種則是通過檔案系統的 inode連結來產生的新檔名,而不是產生新檔案,稱之為硬連結。
在這裡插入圖片描述

硬連結

一般情況下,檔名和 inode 號碼是一一對應關係,每個 inode 號碼對應一個檔名。但是 Linux 系統允許多個檔名指向同一個inode 號碼。這意味著,可以用不同的檔名訪問同樣的內容。
硬連結的建立命令的基本格式為:

In 原始檔  目標位置

執行該命令以後,原始檔與目標檔案的 inode 號碼相同,都指向同一個 inode。inode資訊中的“連結數”這時就會增加 1 。

當一個檔案擁有多個硬連結時,對檔案內容修改,會影響到所有檔名;但是刪除一個檔名,不影響另一個檔名的訪問。刪除一個檔名,只會使得inode 中的"連結數"減 1。需要注意的是不能對目錄做硬連結。

通過 mkdir 命令建立一個新目錄/app/kgc,其硬連結數應該有 2 個,因為常見的目錄本身為 1 個硬連結,而目錄 kgc下面的隱藏目錄.(點號)是該目錄的又一個硬連結,也算是1 個連線數。

軟連線

軟連結就是再建立一個獨立的檔案,而這個檔案會讓資料的讀取指向它連線的那個檔案 的檔名。例如,檔案 A 和檔案 B 的 inode 號碼雖然不一樣,但是檔案 A 的,內容是檔案B 的路徑。讀取檔案 A 時,系統會自動將訪問者導向檔案 B。這時,檔案 A 就稱為檔案 B 的“軟連結”(soft link)或者“符號連結(symbolic link)。
這意味著,檔案 A 依賴於檔案 B 而存在,如果刪除了檔案 B,開啟檔案 A 就會報錯。這是軟連結與硬連結最大的不同:檔案 A 指向檔案 B 的檔名,而不是檔案 B 的 inode 號碼,檔案 B 的 inode“連結數”不會因此發生變化。

軟連結的建立命令的基本格式為:

In [-s] 原始檔或目錄...   連結檔案或目標位置

4.EXT 型別檔案恢復

刪除一個檔案,實際上並不清除 inode 節點和 block 的資料,只是在這個檔案的父目錄裡面的 block 中,刪除這個檔案的名字。Linux 是通過 Link 的數量來控制檔案刪除的,只有當一個檔案不存在任何 Link 的時候,這個檔案才會被刪除。

在 Linux 系統運維工作中,經常會遇到因操作不慎、操作錯誤等導致檔案資料丟失的情況,尤其對於客戶企業中一些新手。當然,這裡所指的是徹底刪除,即已經不能通過“回收站”找回的情況,比如使用“rm
-rf”來刪除資料。針對 Linux 下的 EXT 檔案系統,可用的恢復工具有 debugfs、ext3grep、extundelete 等。 其中 extundelete 是一個開源的 Linux 資料恢復工具,支援 ext3、ext4 檔案系統。

在資料被誤刪除後,第一時間要做的就是解除安裝被刪除資料所在的分割槽,如果是根分割槽的資料遭到誤刪,就需要將系統進入單使用者模式,並且將根分割槽以只讀模式掛載。這樣做的原 因很簡單,因為將檔案刪除後,僅僅是將檔案的 inode 節點中的扇區指標清零,實際檔案還儲存在磁碟上,如果磁碟繼續以讀寫模式掛載,這些已刪除的檔案的資料塊就可能被作業系統重新分配出去,在這些資料庫被新的資料覆蓋後,這些資料就真的丟失了,恢復工具也回 天無力。所以以只讀模式掛載磁碟可以儘量降低資料庫中資料被覆蓋的風險,以提高恢復數 據成功的比例。

[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs
[root@localhost	~]#	wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar. bz2
[root@localhost ~]# tar -jxvf extundelete-0.2.4.tar.bz2
[root@localhost ~]# cd extundelete-0.2.4
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete&& make && make install
[root@localhost extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/
[root@localhost ~]# fdisk -l
[root@localhost ~]# fdisk /dev/sdb                      ###進入並建立硬碟分割槽
[root@localhost ~]# mkfs.ext3 /dev/sdb1
[root@localhost ~]# mkdir /data/
[root@localhost ~]# mount /dev/sdb1 /data/ 
[root@localhost ~]# cd /data/ 
[root@localhost test]# echo a > a 
[root@localhost test]# echo b > b 
[root@localhost test]# echo c > c 
[root@localhost test]# echo d > d 
[root@localhost test]# ls
[root@localhost test]# rm -rf a b                      ###模擬故障
[root@localhost ~]# umount /data/                      ###開始恢復
[root@localhost ~]# extundelete /dev/sdb1 --restore-all
[root@localhost ~]# ls
[root@localhost ~]# cd RECOVERED_FILES/
[root@localhost RECOVERED_FILES]# ls                   ###可以檢視到被刪除的a和b

5.xfs 型別檔案備份和恢復

extundelete 工具僅可以恢復 EXT 型別的檔案,無法恢復 CentOS 7 系統預設採用 xfs 型別的檔案。針對 xfs 檔案系統目前也沒有比較成熟的檔案恢復工具,所以建議提前做好資料備份,以避免資料丟失。

xfs 型別的檔案可使用 xfsdump 與 xfsrestore 工具進行備份恢復。若系統中未安裝xfsdump 與xfsrestore 工具,可以通過yum install -y xfsdump 命令安裝。xfsdump 按照inode 順序備份一個 xfs 檔案系統。xfsdump 的備份級別有兩種:0 表示完全備份;1-9 表示增量備份。xfsdump 的備份級別預設為 0。xfsdump 的命令格式為:xfsdump -f備份存放位置

常用的備份引數包括以下幾種:
f:指定備份檔案目錄;
L:指定標籤 session label;
M:指定裝置標籤 media label;
s:備份單個檔案,-s 後面不能直接跟路徑。

實驗

[root@localhost ~]# fdisk /dev/sdb                                 ###進入並建立硬碟分割槽
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# mkfs.xfs /dev/sdb1
[root@localhost ~]# mkdir /date
[root@localhost ~]# mount /dev/sdb1 /date/
[root@localhost ~]# cd /date 
[root@localhost date]# cp /etc/passwd ./ 
[root@localhost date]# mkdir test 
[root@localhost date]# touch test/a 
[root@localhost date]# tree /date
[root@localhost ~]# xfsdump -f /opt/dump_sdb1 /dev/sdb1            ###使用 xfsdump 命令備份整個分割槽
please enter label for this dump session (timeout in 300 sec)
-> dump_sdb1	                                                   ###指定備份會話標籤
please enter label for media in drive 0 (timeout in 300 sec)
-> sdb1	                                                           ###指定裝置標籤,就是對要備份的裝置做一個描述
[root@localhost ~]# xfsdump   -I	                               ###檢視備份資訊與內容
[root@localhost ~]# cd /date/                                      ###開始刪除之前建立的內容,模擬資料丟失
[root@localhost date]# ls passwd test
[root@localhost date]# rm -rf ./* 
[root@localhost date]# ls 
[root@localhost ~]# xfsrestore -f /opt/dump_sdb1 /date/            ###開始恢復
[root@localhost ~]# ls /date/

使用 xfsdump 時,需要注意以下的幾個限制:
xfsdump 不支援沒有掛載的檔案系統備份,所以只能備份已掛載的;
xfsdump 必須使用 root 的許可權才能操作(涉及檔案系統的關係);
xfsdump 只能備份 XFS 檔案系統;
xfsdump 備份下來的資料(檔案或儲存媒體)只能讓 xfsrestore 解析;
xfsdump 是透過檔案系統的 UUID 來分辨各個備份檔的,因此不能備份兩個具有相同
UUID 的檔案系統。

在這裡插入圖片描述

二、分析日誌檔案

1.日誌檔案

在這裡插入圖片描述

2.核心及系統日誌

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

3.使用者日誌

在這裡插入圖片描述

4.程式日誌

在這裡插入圖片描述

5.日誌管理策略

在這裡插入圖片描述

相關文章