inode和block概述一:

1、文件數據包括源信息與實際數據

文件存儲在硬盤上,硬盤最小存儲單位是“扇區。每個扇區存儲512字節”

block (塊):

連續的八個扇區組成一個block(4k)

!是文件存取的最小單位,扇區是最小的存儲單位

2、inode:

(索引節點,也叫i節點)

用于存儲文件元信息

備注:一個文件必須占用一個inode,但是至少占用一個block(就是說只能同時擁有一個inode號,可以擁有多個block)

3、目錄文件的結構:

目錄也是一種文件,此外目錄文件的結構如下圖所示


4、重點:
每個文件都有一個inode號碼,操作系統使用inode號碼來識別不同的文件
linux系統內部不使用文件名,而是使用inode號進行識別文件
對于用戶,文件名只是inode號碼便于識別的別稱


inode和block概述二:

文件是存儲在硬盤上的,硬盤的最小存儲單位叫做扇區,每個扇區存儲512字節

一般連續八個扇區組成一個塊,一塊是4k大小,是文件存取的最小單位,操作系統讀取硬盤時候,是一次性連續讀取多個扇區,就是一個塊一個塊地讀取的。

文件數據包括實際數據與元信息,文件數據存儲在“塊中,存儲文件元信息的區域叫做inode。因此,一個文件必須占用一個inode,并且至少占用一個block

inode不包含文件名,文件名是存放在目錄當中的,linux系統中一切皆為文件,因此目錄也是一種文件

每個inode都有一個號碼,操作系統用inode號來識別不同的文件,linux系統內部不使用文件名去識別文件的(是使用inode號碼去識別文件的,每一個inode號碼一一對應一個文件名)。

所以,當用戶在linux系統中試圖訪問一個文件,系統會先根據文件名去查找它對應的inode號碼,通過inode號碼,獲取inode信息。根據inode信息,查看該用戶是否具有訪問該文件的權限,如果有就指向相應的數據block,并且讀取數據。如果沒有就拒絕


inode包含的元信息

文件的字節數

文件擁有者的USER ID

文件的GROUP ID

文件的讀、寫、執行權限

文件時間戳

用stat命令可以查看某個文件的inode信息

比如: stat 123.txt ;查看123.txt文件的inode號

實操:使用stat命令


備注:
1、以上兩圖是一份英文語言一份是中文語言對照
2、change time (ctime):最后一次改變文件或者目錄屬性的時間
3、access time (atime):最后一次訪問文件或者目錄的時間
4、modify time(mtime): 最后一次修改文件或者目錄內容的時間

inode號碼

用戶通過文件名打開文件時,系統內部的過程
1、系統找到這個文件名對應的inode號碼
2、通過inode號碼,獲取inode信息
3、根據inode信息,找到文件數據所在的block,并讀出數據
查看inode號碼的方法:
1、ls -i命令:查看文件對應的inode號碼
ls -i 文件名

2、stat命令:查看文件inode信息中的inode號碼
stat 文件名
inode的大小
inode也會消耗磁盤空間
每個inode的大小一般為128字節或者256字節
格式化文件系統時確定inode的總數
使用df -i命令可以查看每個硬盤分區的inode總數與已經使用的數量
補充:
1、inode也會消耗硬盤空間,所以格式化的時候,操作系統會自動將硬盤分成兩個區域,一個是數據區域,存放文件數據;另一個是inode區域,存放inode包含的信息。,每個inode的大小,一般是128字節或者256個字節。
通常情況下不需要關注單個inode的大小,而是需要重點關注inode的總數,inode的總字節在格式化的時候就給定了,執行“df -i”命令即可查看每個硬盤分區對應的inode總數和已經使用的inode數量。
2、由于inode號碼與文件名稱分離,導致linux系統具備以下幾特有的現象
a、文件名包含特殊字符,可能無法正常刪除,這時候直接刪除inode,能起到刪除文件的作用
b、移動文件或者重命名文件,只是改變文件名字,不影響inode號
c、開打一個文件后,系統以inode號來識別這個文件,且不再考慮文件名
4、文件數據被保存修改后,會生成一個新的inode號
刪除inode號的兩種方式
find ./ -inum (inode號) -exec rm -i {} /;
find ./ -inum (inode號) -delete

inode號的特殊作用

由于inode號碼與文件名分離,導致一些linux系統具有以下的現象:
1、當文件名包含特殊字符,可能無法正常刪除文件,直接刪除inode,也可以刪除文件
2、移動或者重命名文件時,只改變文件名,不影響inode號碼
3、打開一個文件后,系統通過inode號碼來識別文件,不再考慮文件名
4、使用vi編輯器修改文件數據保存后,會生成一個新的inode號碼。但是,如果使用ehco進行“>”的追加內容。則不會變更inode號。

小結

1、硬盤分區后的結構


注意:元信息和數據為文件數據的組成
2、linux系統中系統訪問文件的過程

鏈接文件

為文件或者目錄建立鏈接文件
鏈接文件的分類(下圖所示)

鏈接文件的命令:
1、硬鏈接
ln 源文件 目標位置; 用的很少
2、軟連接!
ln -s 源文件 目標位置; 實際工作環境經常使用!

實驗:inode號節點耗盡故障處理

使用fdisk創建分區sdb1,大小30M即可

fdisk /dev/sdb1

mkfs -t ext4 /dev/sdb1

mkdir /test

mount /dev/sdb1 /test

df -i

模擬inode節點耗盡

for ((i=1; i<=7680; i++)); do touch /test/file$i;done

或者 touch {1..7680}.txt

df -i

df -hT

刪除文件恢復

rm -rf /test/*

df -i

df -hT
實驗操作:




注備:實驗結束后,如果不是虛擬機的話,直接rm -rf /test/*全部刪除就行

實驗:EXT類型文件恢復

extundelete是一個開源的linux數據恢復工具,支持ext3、ext4文件系統。(備注:ext4只能運行在centos6版本恢復)
步驟:
1、使用fdisk創建分區/dev/sdc1,格式化成ext3系統文件
fdisk /dev/sdc
partprobe /dev/sdc ;此項命令是可以不重啟系統,直接添加磁盤
mkfs -t ext3 /dev/sdc1
mkdir /test
mount /dev/sdc1 /test
df -h

2、安裝依賴包
yum install -y e2fsprogs-devel e2fsprogs-libs
接著編譯安裝extundelete(網上先自己下壓縮包)

3、進行模擬刪除并恢復的操作
cd /test
echo a>a
echo a>b
echo a>c
echo a>d
ls
extundelete /dev/sdc1 --inode 2 ;查看文件系統/dev/sdc1下存放在哪些文件,此外i節點從2開始的,2代表該文件系統最開始的目錄
rm -rf a b
extundelete /dev/sdc1 --inode 2
cd ~
umount /test
extundelete /dev/sdc1 --restore-all ;恢復/dev/sdc1文件系統下的所有內容
#最后:在當前目錄下會出現一個RECOVERED_FILES/目錄,里面保存了已經恢復的文件
ls RECOVERED_FILES/ ;查看里面的目錄
操作:如上圖步驟所示 (注意:自己先網上下載好extundelete-0.2.4.tar.bz2
后再進行試驗)




實驗:恢復XFS類型的文件

Centos 7系統默認采用xfs類型文件,xfs類型的文件可以使用xfsdump、xfsdump工具進行備份恢復。
1、xfsdump命令格式
xfsdump -f 備份存放位置 要備份的路徑或者設備文件
xfsdump的備份等級(默認為0)
0 : 完全備份
1-9 :增量備份
xfsdump常用選項:
-f:指定備份文件目錄
-L:指定標簽session label
-M:指定設備標簽 media label
-s:備份單個文件,- s 后面不能直接跟路徑
xfsdump的使用限制:
a、只能備份已掛載的文件系統
b、必須使用root的權限才能操作
c、只能備份XFS文件系統
d、備份后的數據只能給xfsrestore解析
e、不能備份兩個具有相同UUID的文件系統
2、xfsrestore命令格式
xfsrestore -f 恢復文件位置 存放恢復后文件的位置

操作:
1、使用fdisk創建分區 /dev/sdb1,并格式化成xfs文件系統。最后掛載mount /dev/sdb1 /data/
cd /data
cp /etc/passwd ./
mkdir test
touch abc.txt /test
2、使用xfsdump備份整個分區
rpm -qa | grep xfsdump
yum install -y xfsdump
xfsdump -f /opt/dump_sdb1 /dev/sdb1 [-L dump_sdb1 -M sdb1]
3、模擬數據丟失并使用xfsrestore
cd /data/
rm -rf /data/*
ls ;此時發現數據全部消失
xfsrestore -f /opt_sdb1 /data/ ;對data目錄進行數據恢復

日志文件

日志的功能:

用于記錄系統、程序運行中發生的各種事件

通過閱讀日志,有助于診斷和解決系統故障

日志文件的分類

內核及系統日志

由系統服務rsyslog統一進行管理,日志格式基本相似

主配置文件/etc/rsyslog.conf

用戶日志

記錄系統用戶登錄與退出系統的相關信息

程序日志

由各種應用程序獨立管理的日志文件,記錄格式不統一

如何去書寫日志

日志保存的位置

默認位于:/var/log ;系統或者用戶日志

主要日志內容介紹

補充:系統服務rsyslog的安裝包與主程序

常見的一些日志

1、內核與公共消息日志(排障用)

/var/log/messages: 記錄linux內核消息的各種應用程序的公共日志信息,包括啟動、IO錯誤、網絡錯誤、程序故障等。對于未使用獨立日志文件的應用程序或者服務,一般都可以從該日志中獲得相關的日志記錄信息

2、極化任務日志

/var/log/cron :記錄crond極化任務產生的時間信息

3、系統引導日志

/var/log/dmesg :記錄linux系統在引導過程中的各種事件信息

4、郵件登錄日志

/var/log/maillog : 記錄進入或者發出系統電子郵箱活動

5、用戶登錄日志

/var/log/secure :記錄用戶認證相關的安全事件信息

/var/log/lastlog :記錄每個用戶最近的登錄事件(采用二進制,需要相關轉碼工具)

/var/log/wtmp :記錄每個用戶登錄、注銷與系統啟動和停機事件(采用二進制,需要相關轉碼工具)

/var/run/btmp :記錄失敗的、錯誤的登錄嘗試以及驗證事件、二進制格式

vim /etc/rsyslog.conf ;查看rsyslog.conf配置文件
之后開打后如下圖所示{設備.級別
動作}

設備字段的說明:
auth:用戶認證時產生的日志
authpriv:ssh、ftp等登錄信息的驗證日志
daemon:一些守護進程產生的日志
ftp:FTP產生的日志
lpr:打印相關活動
mark:rsyslog內部服務的信息,事件標識
news:網絡新聞傳輸協議(nntp)產生的消息
syslog:系統日志
uucp:兩個unix之間的相關通訊
console:針對系統控制臺的消息
cron:系統執行定時任務產生的日志
kern:系統內核日志
local0~local7:自定義程序使用
mail:郵件日志
user:用戶進程

linxu系統內核消息的優先級別

0 EMERG(緊急) 如系統崩潰
1 ALERT(警告) 如數據庫被破壞
2 CRIT (嚴重) 如硬盤錯誤
3 ERR (錯誤) 不是非常緊急的
4 WARNING (提醒) 需要提醒用戶的主要事件
5 NOTICE (注意) 需要注意的事件,無需處理
6 INFO (信息) 一般信息
7 DEBUG (調試) 調試程序時使用
none 沒有優先級,不記錄任何消息
日志的一般格式

公共日志 /var/log/messages文件的記錄格式
事件標簽:消息發出的日期和時間
主機名:生成消息的計算機名稱
子系統名稱:發出消息的應用程序
消息:消息的具體內容
此外:程序自己維護日志記錄,httpd網站服務程序使用兩個日志文件:
access_log ;記錄客戶訪問時間
erro_log ;記錄錯誤事件

用戶日志分析

保存了用戶登錄、退出系統等相關信息
/var/log/lastlog;最近的用戶登錄事件
/var/log/wtmp;用戶登錄、注銷與開關機的事件
/var/run/utmp:當前擋路的每一個用戶的詳細信息
/var/log/secure;與用戶驗證相關的安全事件
分析工具
users 、who、w、last、lastb
last命令用于查詢成功登錄系統的用戶記錄
lastb命令用于查詢登錄失敗的用戶記錄
由相應的應用程序獨立進行管理
awk、sed、vim 是三大主要使用的工具
日志管理策略
及時做好備份與歸檔
a、命令/腳本+crontab
b、rsyslog
c、ELK/EFK
延長日志保存期限
控制日志訪問權限:各類敏感信息如賬戶、口令等
集中管理日志:
1、將服務器的日志統一發送到日志文件服務器
2、便于日志信息的統一收集、整理和分析
3、杜絕日志信息的意外丟失、惡意篡改與刪除

實驗:配置日志服務器

rsyslog是一個C/S架構,可以通過套接字來進行監聽記錄工作??梢曰赥CP和UDP工作。默認的監聽端口時514,只需要在MODULES打開即可
發送服務器:客戶端 192.168.206.20
收集服務器:192.168.206.30

步驟:
1、先關閉服務端和客戶端防火墻、selinux
setenforce 0
systemctl stop firewalld
systemctl disable firewalld

2、修改客戶端配置文件,并啟動服務
vim /etc/rsyslog.conf
進入文本后將下面四行的注釋取消掉

接著添加以下內容

$template myFormat, "%timestamp% %hostname% %syslogseverity-text% %syslogtag% %msg%/n"
$ActionFileDefaultTemplate myFormat
*.info;mail.none;authpriv.none;cron.none @@192.168.80.30:514

#%timestamp% :時間戳
#%fromhost-ip告 : 接收的信息來自于哪個節點的IP
#hostname號: 主機名
#%syslogseverity-text% : 日志等級
#%syslogtag% :服務進程br/>#%msg%:日志內容
#接收方IP前面一個@表示TCP傳輸,兩個@表示UDP傳輸
systemcrl restart rsyslog

修改服務端配置文件,并啟動服務
vim /etc/rsyslog.conf
#將下面四行前的注釋取消掉
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
#添加以下內容
$AllowedSender tcp, 192.168. 80.0/24 #允許192.168.80.0網段內的主機以tcp協議來傳輸
$template Remote,"/data/1og/%romhost-ip%/&fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY8.1og"
#定義模板,接受日志文件路徑,區分了不同主機的日志
:fromhost-ip, !isequal, "127.0.0.1" ?Remote #過濾掉server 本機的日志
systemcrl restart rsyslog

//在服務端創建/data/log目錄,以接受大量日志信息,配置文件中的路徑應當與該路徑一致
mkdir -p /data/log
//驗證
客戶端的終端命令輸入或者重啟一個服務
logger "hello world"
在服務端查看日志文件
tree /data/log/
(如果是最小化安裝,請使用yum本地安裝tree)

Centos7 專有日志管理工具

1、查看內核日志(不顯示應用日志)
journalctl -k
2、查看系統本次啟動的日志
journalctl -b [-0] ;"0"指上上次啟動的日志
3、查看上一次啟動的日志
journalctl -b -1
4、顯示尾部指定行數的日志
journalctl -n 20 [-f]
備注:查看的是/var/log/messages的日志。但是格式上有所調整。如主機名格式不一樣而已
5、!查看某個服務的日志
journalctl -u httpd.service [-f]

6、查看指定進程的日志
journalctl _PID=1 ;此處的是查看init進程(詳情見我的開機引導那篇)
7、查看指定用戶的日志
journalctl _UID=0 --since today ;查今天的root用戶的日志,用戶UDP=0的就是root用戶
或者
journalctl -xe
-x :是目錄的意思,在報錯的信息下會附加解決問題的網址
-e:(pager-end)從末尾開始看
8、!查看所有日志(默認情況下,只保留本次啟動的日志)
journalctl
journalctl -r :r表示倒敘