inode和block概述
文件數據包括元信息與實際數據
文件存儲在硬盤上,硬盤最小存儲單位是“扇區”,每個
扇區存儲512字節
block (塊)
連續的八個扇區組成一個block(4K)
是文件存取的最小單位
元信息——————inode
數據———————block
inode (索引節點)
中文譯名為“索引節點”,也叫i節點
用于存儲文件元信息
文件是存儲在硬盤上的,硬盤的最小存儲單位叫做“扇區"(sector),每個扇區存儲512字節。
一般連續八個扇區組成一個"塊"(block),一a個塊是4K大小,是文件存取的最小單位。操作系統讀取硬盤的時候,是一次性連續讀取多個扇區,即一個塊一個塊的讀取的。
文件數據包括實際數據與元信息(類似文件屬性)。文件數據存儲在“塊"中,存儲文件元信息(比如文件的創建者、創建日期、文件大小、文件權限等)的區域就叫做inode。 因此,一個文件必須占用一個inode, 并且至少占用一個block。
inode不包含文件名。文件名是存放在目錄當中的。Linux 系統中一切皆文件,因此目錄也是一種文件。
每個inode都有一個號碼,操作系統用inode號碼來識別不同的文件。Linux系統內部不使用文件名,而使用inode號碼來識別文件。對于系統來說,文件名只是inode號碼便于識別的別稱,文件名和inode號碼是一一對應關系,每個inode號碼對應一個文件名。
所以,當用戶在Linux系統中試圖訪問一個文件時,系統會先根據文件名去查找它對應的inode號碼;通過inode號碼,獲取inode信息; 根據inode信息,看該用戶是否具有訪問這個文件的權限:如果有,就指向相對應的數據block,并讀取數據。
查看文件名對應的inode號碼有兩種方式:
ls-i 文件名
stat 文件名
stat testfile 輸入命令
File:、 testfile
Size: 102 Blocks: 8 I0 Block: 4096 regular file
Device: 807h/2055d Inode: 1265161 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2014-08-13 14:07:20. 000000000 +0800
Modify: 2014-08-13 14:07: 07.000000000 +0800
Change: 2014-08-13 14:07 :07.000000000 +0800 ,
==該圖是用ls -i這個命令來來查看inode號。==
==該圖是用stat這個命令來查看文件的inode號。==
==該圖是ls -l命令,其用來查看文件的名稱。==
atime (accesstime) :
當使用這個文件的時候就會更新這個時間。
==該圖就是atime實驗的展示,圖中我對該文件進行使用,該文件的時間就會進行更新,如圖所示,圖一以及圖二的訪問時間有所變化。==
mtime (modification time) :
當修改文件的內容數據的時候,就會更新這個時間,而更改權限或者屬性,mtime不會改變,這就是和ctime的區別。
==如圖所示就是mtime實驗的內容,在圖中我使用echo對這個文件內容進行了修改,其時間就會發生改變,如圖最近更改,以及最近改動都發生了變化。==
ctime (status time):
當修改文件的權限或者屬性的時候,就會更新這個時間,ctime并不是createtime,更像是changetime,
只有當更新文件的屬性或者權限的時候才會更新這個時間,但是更改內容的話是不會更新這個時間。
==該圖是ctime實驗的展示,如圖我對這個文件的權限進行了修改,其時間就會發生改變,如圖最近改動這一欄發生了改變。==
inode也會消耗硬盤空間,所以格式化的時候,操作系統自動將硬盤分成兩個區域。一個是數據區,存放文件數據;另一個是inode區,存放inode 所包含的信息。每個inode 的大小,一般是128字節或256字節。
通常情況下不需要關注單個inode的大小,而是需要重點關注inode 總數。inode 的總數在格式化時就給定了,執行“df -i"
命令即可查看每個硬盤分區對應的的inode總數和已經使用的inode數量。
==該圖是使用了df -i這個命令,來查看inode號的使用情況。==
由于inode 號碼與文件名分離,導致Linux系統具備以下幾種特有的現象:
1.文件名包含特殊字符,可能無法正常刪除。這時直接刪除inode,能夠起到刪除文件的作用:
2.移動文件或重命名文件,只是改變文件名,不影響inode 號碼;
==在圖中我創建了一個以abc.txt命名的文件,然后我把這個文件移動,并且給他進行了重命名為123.txt但是其inode號并未發生改變。==
3.打開一個文件以后,系統就以inode 號碼來識別這個文件,不再考慮文件名。
4.使用vi編輯器修改文件數據保存后,會生成一個新的inode 號碼。
==在圖中我使用了vim編輯器對123.txt這個文件進行了修改,然后用ll -i這個命令來進行查看,發現它的inode號已經發生了改變。==
刪除文件方法:
find ./ -inum 52305140 -exec rm -i {} /;
find ./ -inum 50464299 -delete
==該圖就是使用find命令加上inode號來對文件進行刪除的兩種方法。==
inode的內容
inode包含文件的元信息
不包含文件名
文件的字節數
文件擁有者的User ID
文件的Group ID
文件的讀、寫、執行權限
文件的時間戳
..............................
用stat命令可以查看某個文件的inode信息
示例: stat aa.txt
inode的內容
目錄文件的結構
文件名1 ——————inode號碼1
文件名2 ————————inode號碼2
每一行稱為一個目錄項
目錄也是一種文件目錄文件的結構
每個inode都有一個號碼,操作系統用inode號碼來識
別不同的文件
Linux系統內部不使用文件名,而使用inode號碼來識
別文件
對于用戶,文件名只是inode號碼便于識別的別稱
inode的號碼
用戶通過文件名打開文件時,系統內部的過程
1.系統找到這 個文件名對應的inode號碼
2.通過inode號碼, 獲取inode信息
3.
根據inode信息,找到文件數據所在的block,讀出數據
查看inode號碼的方法
ls -i命令:查看文件名對應的inode號碼
Is -i aa.txt
stat命令:查看文件inode信息中的inode號碼
stat aa.txt
硬盤的分區后的結構
文件名————目錄項————目錄塊
元信息————inode————inode表區塊
數據—————block—————block數據區
block:八個扇區組成
inode的大小
inode也會消耗硬盤空間
每個inode的大小
一般是128字節或256寧節
格式化文件系統時確定inode的總數
使用df -i命令可以查看每個硬盤分區的inode總數和已
經使用的數量
鏈接文件
為文件或目錄建立鏈接文件
鏈接文件分類
軟連接 | 硬連接 | |
---|---|---|
刪除原始文件后 | 失效 | 仍舊可用 |
使用范圍 | 適用于文件或目錄 | 只可用于文件 |
保存位置 | 與原始文件可以位于不同的文件系統中 | 必須與原始文件在同一個文件系統(如一個linux分區)內 |
鏈接文件
為文件或目錄建立鏈接文件
鏈接文件分類
硬鏈接
In 源文件目標位置
軟鏈接
In -s 源文件或目錄...鏈接文件或目標位置
inode節點耗盡故障處理
使用fdisk創建分區/dev/sdb1,分區大小30M即可
fdisk /dev/ sdb
mkfs.ext4 /dev/sdb1
mkdir / test
mount /dev/sdb1 /創建的文件
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
==我們首先用fdisk -l這個命令,來對磁盤進行一個查看。==
==然后我們對磁盤進行分區的操作。==
==然后我們以ext4文件類型使用mkfs命令來進行格式化。==
==圖中我進行掛載,并且掛載到data目錄中。==
==然后我們使用for這個命令來模擬將inode號占滿的情況,該圖中就是data這個目錄的inode號。==
==如圖就是data這個目錄inode號被占滿的情況,如圖顯示,已經100%進行了使用。==
==如圖就是inode號被占滿,由于沒有了空間我們無法進行創建文件的操作。==
==我們使用rm -rf*來進行刪除后,便可以進行創建文件的操作。==
EXT類型文件恢復
extundelete是一個開源的Linux 數據恢復工具,支持ext3、 ext4文件 系統。(ext4 只能在centos6版本恢復)
使用fdisk創建分區/dev/sdc1,格式化ext3文件系統
fdisk /dev/sdc
partprobe /dev/sdc
mkfs.ext3 /dev/ sdc1
mkdir /test
mount /dev/sdc1 /test
df -hT
安裝依賴包
yum -y install e2fsprogs-devel e2fsprogs-libs
編譯安裝extundelete
cd /test
wget http: //nchc .dl.sourceforge. net/project/ extundelete/extundelete/0.2.4/extundelete-0.2.4. tar .bz2
tar jxvf extundelete-0.2.4. tar.bz2
cd extundelete-0.2.4/
. /configure --prefix=/usr/local /extundelete && make && make install
ln -s / usr /local/extundelete/bin/ * /usr/bin/
模擬刪除并執行恢復操作
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
umount /test
cd ~
umount / test
extundelete /dev/sdc1 --restore-all
恢復/dev/sdc1文件系統下的所有內容
在當前目錄下會出現一 個RECOVERED FILES/目錄, 里面保存了已經恢復的文件
ls RECOVERED FILES/
==該圖我們依舊是對磁盤進行一個創建分區的操作。==
==然后我們進行格式化,以ext3文件名來進行格式化。==
==然后便是進行掛載的操作,圖中我創建了一個新的目錄,名字為data1。==
==然后我們對extundelete這個軟件包進行編譯安裝。==
==然后我們進行安裝依賴包的操作。==
==該圖是對extundlete這個軟件包進行解壓的過程,我們可以使用tar命令來加上jxvf選項來進行解壓。==
==該圖中我們是寫入一些內容到這幾個文件當中。==
==該圖我們是進行了模擬刪除的操作,如圖要刪除a和b這兩個。==
==如圖所示,已經進行了刪除的操作,a,b已經刪除完畢。==
==圖中是我們進行解掛載的操作,然后我們在進行恢復數據的操作。==
案例:恢復XFS類型的文件
xfsdump命令格式
xfsdump -f 備份存放位置要備份的路徑或設備文件
xfsdump備份級別(默認為0)
0: 完全備份
1-9: 增量備份
xfsdump常用選項: -f、 -L、 -M、-s
xfsrestore命令格式
xfsrestore -f 恢復文件的位置存放恢復后文件的位置
模擬刪除并執行恢復操作
xfs類型文件備份和恢復
CentOS 7系統默認采用xfs類型的文件,xfs類型的文件可使用xfsdump 與xfsrestore 工具進行備份恢復。
xfsdump的備份級別有兩種: 0表示完全備份; 1-9表示增量備份。xfsdump的備份級別默認為0。
xfsdump的命令格式為:
xfsdump -f 備份存放位置 要備份的路徑或設備文件
xfsdump命令常用的選項:
-f: 指定備份文件目錄
-L: 指定標簽session label
-M: 指定設備標簽media label
-s: 備份單個文件,-s后面不能直接跟路徑
xf sdump使用限制:
1.只能備份已掛載的文件系統
2.必須使用root的權限才能操作
3.只能備份XFS文件系統
4.備份后的數據只能讓xfsrestore解析
5.不能備份兩個具有相同UUID的文件系統(可用blkid命令 查看)
使用fdisk創建分區/dev/sdb1,格式化xfs文件系統
fdisk /dev/ sdb
partprobe /dev/sdb
mkfs.xfs [-f] /dev/ sdb1
mkdir /data .
mount /dev/sdb1 /data/
cd /data
cp /etc/passwd ./
mkdir test
touch test/a
使用xfsdump 命令備份整個分區
rpm -qa| grep xfsdump
yum install -y xfsdump
xfsdump -f /opt/dump sdb1 /dev/sdb1 [-L dump sdb1 -M sdb1]
模擬數據丟失并使用xfsrestore 命令恢復文件
cd /data/
rm -rf ./*
ls
xfsrestore -f /opt/dump_ sdb1 /data/
==圖中我們依舊是對磁盤進行創建分區的操作。==
==該圖我們已xfs文件類型來進行格式化。==
==然后我們進行掛載的操作。==
然后我們進行復制一些文件以及目錄到我們創建的data2目錄當中,我這里復制的是兩個文件。==
==我們使用xfsdump這個命令來對整個分區進行備份的操作。==
==圖中我們來進行模擬數據的丟失,我們使用rm -rf *來將data2里面的內容都刪除。==
==我們使用xfsrestore這個命令來對我們刪除的文件進行一個恢復。==
==如圖所示,丟失的文件以及完成了恢復。==
日志文件
日志的功能;
用于記錄系統、程序運行中發生的各種事件
通過閱讀日志,有助于診斷和解決系統故障
日志文件的分類
內核及系統日志
由系統服務rsyslog統一進行管理, 日志格式基本相似
主配置文件/etc/rsyslog.conf
用戶日志.
記錄系統用戶登錄及退出系統的相關信息
程序日志
由各種應用程序獨立管理的日志文件,記錄格式不統一
日志文件
日志保存位置
默認位于: Ivar/log目錄下
主要日志文件介紹
內核及公共消息日志
/var/log/messages
計劃任務日志
Ivar/log/cron
系統引導日志
/var/log/dmesg
郵件系統日志
==該圖是linux常用的兩種郵件的安裝包。==
/var/log/maillog
用戶登錄日志
Ivarlog/lastlog
/var/log/secure
/var/log/wtmp
/var/run/btmp
常見的一些 日志文件:
內核及公共消息日志:
/var/log/messages:記錄Linux內 核消息及各種應用程序的公共日志信息,包括啟動、I0錯誤、網絡錯誤、程序故障等。對于未使用獨立日志文件的應用程序或服務,一般都可以從該日志文件中獲得相關的事件記錄信息。
計劃任務日志:
/var/log/cron: 記錄crond計劃任務產生的事件信息。
系統引導日志:
/var/log/dmesg:記錄Linux系統在引導過程中的各種事件信息。
郵件系統日志:
/var/log/maillog: 記錄進入或發出系統的電子郵件活動。
用戶登錄日志:
/var/log/secure: 記錄用戶認證相關的安全事件信息。
/var/log/lastlog: 記錄每個用戶最近的登錄事件。二進制格式。
/var/log/wtmp:記錄每個用戶登錄、注銷及系統啟動和停機事件。 二進制格式
/var/run/btmp:記錄失敗的、錯誤的登錄嘗試及驗證事件。二進制格式
內核及系統日志
由系統服務rsyslog統一管理
軟件包: rsys1og-7 .4.7-16.el7.x86_ 64
主要程序: /sbin/rsyslogd
配置文件: /etc/rsyslog.conf
vim /etc/ rsyslog. conf
查看rsyslog . conf配置文件,規則配置格式: [ 設備.級別
動作]
. info;mail . none; authpriv . none; cron . none
/var/ 1og/messages
. info 表示info等級及以.上的所有等級的信息都寫到對應的日志文件里
mail. none 表示某事件的信息不寫到日志文件里( 這里比如是郵件)
設備字段說明:
auth 用戶認證時產生的日志
authpriv ssh、ftp等登錄信息的驗證信息
daemon 一些守護進程產生的日志
ftp FTP產生的日志
lpr 打印相關活動
mark rsyslog服務內部的信息,時間標識;
news 網絡新聞傳輸協議(nntp)產生的消息。
syslog 系統日志
uucp Unix- -to-Unix Copy兩個unix之間的相關通信
console 針對系統控制臺的消息。
cron 執行定時任務產生的日志。
kern 系統內核日志
local0~loca17 自定義程序使用
mail 郵件日志
user 用戶進程
Linux系統內核日志消息的優先級別( 數字等級越小,優先級越高,消息越重要) :
0 EMERG(緊急):會導致主機系統不可用的情況。如系統崩潰
1 ALERT(警告):必須馬上采取措施解決的問題。如數據庫被破壞
2 CRIT(嚴重):比較嚴重的情況。如硬盤錯誤,可能會阻礙程序的部分功能
3 ERR (錯誤) :運行出現錯誤。不是非常緊急,盡快修復的
4 WARNING (提醒) :可能影響系統功能,需要提醒用戶的重要事件。不是錯誤,如磁盤用了85號等
5 NOTICE (注意) :不會影響正常功能,但是需要注意的事件。無需處理
6 INFO(信息):一般信息。正常的系統信息
7 DEBUG(調試):程序或系統調試信息等。包含詳細開發的信息,調試程序時使用
none: 沒有優先級,不記錄任何日志消息。
舉例:
mail. info /var/log/maillog :比指定級別更高的日志級別,包括指定級別自身,保存到/var/1og/maillog中
mail.=info /var/log/maillog :明確指定日志級別為info,保存至/var/ log/maillog
mail. !info /var/log/maillog :除了指定的日志級別(info)所有日志級別信息,保存至/var/log/maillog
. info /var/1og/maillog :所有facility的info級別,保存至/var/1og/maillog
mail. /var/1og/maillog : mai1的所有日志級別信息,都保存至/var/1og/maillog
mail. notice; news.info /var/log/maillog : mail的notice以 上記得日志級別和news的info以上的級別保存至/var/log/maillog
mail, news.crit -/var/log/maillog : mail和news的crit以上的日志級別保存/var/1og/maillog中: “-"代表異步模式
Jun 3 13:26:35:時間標簽
localhost vmusr[2439]: [critical] [GL ib-GObject]
程序日志分析
由相應的應用程序獨立進行管理
Web服務: /var/log/httpd/
accesslog //記錄客戶訪問事件
error log //記錄錯誤事件
代理服務: /var/log/squid/
access.log、cache.log
分析工具
文本查看、grep過濾檢索、Webmin管理套件中查看
awk、sed等文本過濾、格式化編輯工具
Webalizer、Awstats等專用 日志分析工具
日志管理策略
及時作好備份和歸檔 :命令/腳本/+crontab/
延長日志保存期限
控制日志訪問權限
日志中可能會包含各類敏感信息,如賬戶、口令等
集中管理日志
將服務器的日志文件發到統一的日志文件服務器
便于日志信息的統一收集、整理和分析
杜絕日志信息的意外丟失、惡意篡改或刪除
配置日志服務器收集日志
rsyslog是一個C/S架構,可以通過套接字來進行監聽記錄工作,可以基于TCP和UDP工作,默認的監聽端口是514,只需要在MODULES打開即可。
發送服務器: 客戶端192. 168.80.20
收集服務器: 服務端192. 168.80.30
//關閉服務端和客戶端防火墻、selinux
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
//修改客戶端配置文件,并啟動服務
vim /etc/rsyslog. conf
MODULES
將下面四行前的注釋取消掉
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$ InputTCPServerRun 514
RULES
添加下列內容
$template myFormat, "×tamp% %hostname% syslogseverity-text% %syslogtag% %msg號/n"
$ActionFileDefaultTemplate myFormat
*. info;mail . none; authpriv . none; cron. nonebr/>@@192.168.80.30:514
timestamp%: 時間戳
%fromhost-ip%:接收的信息來自于哪個節點的IP
%hostname% :主機名
%syslogseverity-text%:日志等級
%syslogtag% :服務進程br/>%msg%:日志內容
接收方IP前面一個@表示TCP傳輸,兩個@表示UDP傳輸
systemctl 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/log/ %fromhost- ip%/fromhost-ip%_ %$YEAR%- %$MONTH%-%$DAY%. log"
定義模板,接受日志文件路徑,區分了不同主機的日志
: fromhost-ip, ! isequal, "127.0.0.1" ?Remote
過濾掉server 本機的日志
systemctl restart rsyslog
//在服務端創建/data/log目錄,以接受大量日志信息,配置文件中的路徑應當與該路徑一致
mkdir -p /data/log
//驗證
#客戶端的終端命令行輸入或者重啟-一個服務.
logger "hello world"
#在服務端查看日志文件
tree /data/log/
journalctl 日志管理工具
日志管理工具journalctl是centos7上專有的日志管理工具,該工具是從message這 個文件里讀取信息。
Systemd統一管 理所有Unit的啟動日志。帶來的好處就是,可以只用journalctl一個命令,查看所有日志(內核日志和應用日志)。
日志的配置文件是/etc/ systemd/ journald. conf
查看所有日志(默認情況下,只保存本次啟動的日志)
journalctl
journalctl -r ==-r表示倒序,從尾部看(推薦)==
查看內核日志(不顯示應用日志)
journalctl -k
查看系統本次啟動的日志
journalctl -b [-0]
查看上一次啟動的日志( 需更改設置,如上次系統崩潰,需要查看日志時,就要看上一次的啟動日志)
journalctl -b -1
顯示尾部指定行數的日志查看的是/var/1og/messages的日志,但是格式上有所調整,如主機名格式不一樣而已journalctl -n 20 [-f]
查看某個服務的日志
journalctl -u nginx.service [-f]
查看指定進程的日志
journalctl_PID=1
查看指定用戶的日志
journalctl_UID=0 --since today
journalctl -xe
-x是目錄(catalog)的意思,在報錯的信息下會,附加解決問題的網址
-e pager-end 從末尾開始看