壹 Linux文件屬性描述:
在Linux裏一切皆文件
Linux系統中的文件或目錄的屬性主要包括:索引節點(inode)、文件類型、權限屬性、連接數、所歸屬的用戶和用戶組、最近修改時間等內容。node
例子:
[root@localhost etc]# ls -lhi
total 1.4M
50752632 drwxr-xr-x. 3 root root 101 Apr 23 14:59 abrt
17631870 -rw-r--r--. 1 root root 16 Apr 23 15:16 adjtime
16778352 -rw-r--r--. 1 root root 1.5K Jun 7 2013 aliases
18018101 -rw-r--r--. 1 root root 12K Apr 23 15:20 aliases.db
17779594 drwxr-xr-x. 2 root root 51 Apr 23 15:00 alsa
50456080 drwxr-xr-x. 2 root root 4.0K Apr 23 15:13 alternatives
17631850 -rw-------. 1 root root 541 Aug 3 2017 anacrontab
17037763 -rw-r--r--. 1 root root 55 Mar 1 2017 asound.conf
18040415 -rw-r--r--. 1 root root 1 Nov 6 2016 at.deny
1216969 drwxr-x---. 3 root root 43 Apr 23 15:00 audisp
34216454 drwxr-x---. 3 root root 83 Apr 23 15:20 audit
18150015 drwxr-xr-x. 4 root root 71 Apr 23 15:05 avahilinux
如上10列所表明的Linux文件屬性:
第①列:#inode索引節點編號
(至關於身份證,在Linux系統裏是惟一的)
(系統讀取文件時首先經過文件名找到inode,而後才能讀取到文件內容)
第②列:#文件類型及權限
(共10個字符,第一個字符爲類型,後9個字符爲文件權限,最後一個字符.和selinux相關的標識)
第③列:#硬連接個數 (門的做用:1訪問入口。2備份做用)
第④列:#文件或目錄所屬的用戶(屬主,擁有者)
(Linux裏面文件和程序的存在必需要有用戶組和組,知足相應的存在需求)
(組和擁有者能夠不是一個)
第⑤列:#文件或目錄所屬的組
第⑥列:#文件大小 (在Linux裏一切皆文件)
第⑦⑧⑨列:#最近修改時間 (月 日 時 分)
(find -mtime -ctime -atime:modify change access)
第⑩列:#實際的文件或目錄名(嚴格的說文件名不算文件的屬性)文件名不在inode裏,而是在上級目錄的block裏。ios
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
貳 查看文件系統inode總量以及剩餘量:面試
![](http://static.javashuo.com/static/loading.gif)
叄 查看磁盤的使用量:apache
![](http://static.javashuo.com/static/loading.gif)
PS:對於運維人員來講「磁盤滿了」,一個是block滿了,一個是inode滿了。centos
磁盤空間是否滿了,是由兩項參數決定的:
一、inode是否滿了。
二、block是否滿了。
任何一項滿了,你都沒法放你最喜歡的片了。bash
磁盤滿了的一個特徵:
(no space on device left)服務器
肆 有關inode的小結:(學會給階段性的知識做小結是學好Linux的好習慣)
1)磁盤被分區並格式化爲ext4文件系統後會生成必定數量的inode和block。運維
2)inode成爲索引節點,它的做用是存放文件的屬性信息以及做爲文件的索引(指向文件的實體)。ide
3)ext4/ext4文件系統的block存放的是文件的實際內容。
4)inode是磁盤上的一塊存儲空間,C6非啓動分區inode默認大小256字節,C5是128字節。
5)inode的表現形式是一串數字,不一樣的爲了見對應的inode(一串數字)在文件系統裏是惟一的。
6)inode節點號相同的文件,互爲硬連接文件,能夠認爲是一個文件的不一樣入口。
7)ext3/ext4文件系統下,一個文件被建立後至少要佔用一個inode和一個block。
8)ext3/ext4文件系統下,正常狀況下一個文件佔用且只能佔用一個inode(像人和身份證),硬連接文件不算。
9)block是用來存儲實際數據的,它的大小通常有1K,2K,4K幾種。其中引導分區等爲1K,其餘普通分區多爲4K(C6)。
10)若是一個文件很大(高清大片4G),須要佔多個block,若是文件很小(0.01K),至少佔一個block,而且這個block的剩餘空間就浪費了,即沒法在存儲其餘數據了。
11)inode大小和總量查看:(下面的i是不區分大小寫)
[root@localhost etc]# dumpe2fs /dev/sda3|egrep -i "block size|lnode size"
[root@localhost etc]# dumpe2fs /dev/sda3|egrep -i "block count|lnode count"
默認block count通常會大於lnode count的數量。
12)查看inode的總量和使用量:
[root@localhost etc]# df -i
13)查看文件的inode信息方法:
[root@localhost etc]# ls -li
[root@localhost /]# stat /etc/hosts
14)如何生成及指定inode大小:
格式化命令:mkfs.ext4-b 2048-l 256 /dev/sdb
伍 有關block的知識小結:
1)磁盤讀取數據是按block爲單位讀取的。
2)一個文件可能佔用多個block,可是每讀取一個block就會消耗一次磁盤I/O。
3)若是要提高磁盤IO性能,那麼就要儘量一次性讀取數據儘可能的多。
4)一個block只能存放一個文件的內容,不管內容有多少,若是block默認是4K大小,那麼存放一個1K的文件,剩餘3K就不能存放別的文件,只能浪費了。
5)block並不是越大越好。太大對於存放小文件就會浪費磁盤空間(好比1000K的文件,block大小爲4K和1K,則分別佔用250和1000個block,消耗IO分別爲250次和1000次)。
6)根據業務需求,肯定默認的block大小:1K>文件>16K==block小一點、大一點。
7)block太大例如4K,文件都是0.1K的,大量浪費磁盤空間,可是訪問性能高。
8)block過小例如1K,文件都是1000K的,消耗大量IO。
9)block大小設置也是格式化分區時候肯定的,命令:mkfs.ext4-b 2048-l 256 /dev/sdb。
10)企業裏文件都會比較大通常>4K,block大一點會提高磁盤訪問效率。
11)ext3/ext4文件系統(centos5/centos6),通常都設置爲4K。
總的小結:
1)磁盤被分區格式化文件系統後,會分爲inode和block倆部份內容。
2)inode存放文件的屬性以及指向文件實體的指針,文件名再也不inode裏,通常上級目錄的block裏。
3)訪問文件原理:經過文件名==inode==blocks。
4)inode通常狀況默認大小256B,block大小1,2,4K,默認是4K。注意,引導分區等特殊分區除外。
5)經過df-i查看inode的數量及使用狀況,dumpe2fs /dev/sda3查看inode及block的大小及數量。
6)一個文件至少要佔用一個inode及一個block,等多個文件能夠佔用同一個inode(硬連接),相同文件。
7)一個block只能被一個文件使用,若文件很小block很大其剩餘空間浪費,沒法繼續被其餘文件使用。
8)block不是越大越好,要根絕業務的文件大小進行選擇,通常centos6就是默認4K。
9)能夠在格式化的時候改變inode及block的大小。命令:mkfs.ext4-b 2048-l 256 /dev/sdb。
文件刪除恢復:ext3grep,應該養成好習慣,先備份再操做,要能快速還原,不容易還原的,先經過多套測試環境測試,而後再操做。
企業面試題:一個100M(100000K)的磁盤分區,分別寫入1K的文件或寫入1M的文件,分別能夠寫多少。
錯誤解答:很容易計算1K的個數:100*1000=10000個,1M文件的個數:100、1=100個。
以上題考察的知識點:不要直接給答案。
1 上面的題目考察文件系統inode和block的知識。
2 inode是存放文件屬性信息的(也包含指向文件實體的指針),默認大小128byte(C58),256byte(C64).
3 block是存放文件實際內容的,默認大小1K(boot)或4K(非系統分區默認給4K)通常企業用4K的。
4 一個文件至少要佔用一個inode及一個block。
5 默認較大分區常規企業真實場景狀況下,inode數量是足夠的,而block數量消耗的會更快。
假設B 4K 寫入1K文件的數量,基本上就是block的數量。
假設B 4K 寫入1M文件的數量:總block數量/250block=存放1M的數量。
企業面試題:若是向磁盤寫入數據提示No space left on device,經過df -h查看磁盤空間,發現沒滿,緣由。企業場景什麼狀況下會致使這個問題呢?
解答:
1 多是inode數量被耗盡了。
2 企業工做中郵件臨時隊列/var/spool/clientmquene這裏很容易被大量小文件佔滿致使No space left on device的錯誤。clientmquene目錄只有安裝了sendmail服務,纔會有,是sendmail郵件的臨時隊列。centos5.8默認就會裝sendmail,centos6.6默認沒有sendmail,可是有postfix。
Linux服務器 /var/spool/clientmqueue 目錄下產生大量文件的解決辦法
今天收到nagios報警郵件,其中一臺server中的磁盤分區空間超過95%,登陸到服務器查看
[root@hadoop-node-29 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 19G 16G 2.8G 95% /var
到目錄/var查看哪一個目錄中的文件最大
[root@hadoop-node-29 var]# du -sh *
找到是/var/spool目錄佔了很大空間,進入spool目錄繼續查看 找到是clientmqueue目錄中的文件不少佔了大部分空間。
刪除全部文件
[root@hadoop-node-29 clientmqueue]# rm -rf *
結果返回-bash: /bin/rm: Argument list too long
換用命令find . -print|xargs rm 過了一段時間終於刪除了全部文件
不過這種方法只是治標不治本的方法。
爲何var/spool/clientmqueue會產生大量的文件呢,查資料是由於cron執行時會將相關結果以mail方式發送到執行用戶的賬號,但是當sendmail 沒有啓動 那麼全部信件就會暫存在這個目錄中,此時就會出現這種狀況。
治本的方法是在cron 任務中的後面加上 > /dev/null 2>&1
例如
* * * * * /etc/init.d/snmp_cron.sh > /dev/null 2>&1
有關inode的小結:(學會給階段性的知識做小結是學好Linux的好習慣)
1)磁盤被分區並格式化爲ext4文件系統後會生成必定數量的inode和block。
2)inode成爲索引節點,它的做用是存放文件的屬性信息以及做爲文件的索引(指向文件的實體)。
3)ext4/ext4文件系統的block存放的是文件的實際內容。
4)inode是磁盤上的一塊存儲空間,C6非啓動分區inode默認大小256字節,C5是128字節。
5)inode的表現形式是一串數字,不一樣的爲了見對應的inode(一串數字)在文件系統裏是惟一的。
6)inode節點號相同的文件,互爲硬連接文件,能夠認爲是一個文件的不一樣入口。
7)ext3/ext4文件系統下,一個文件被建立後至少要佔用一個inode和一個block。
8)ext3/ext4文件系統下,正常狀況下一個文件佔用且只能佔用一個inode(像人和身份證),硬連接文件不算。
9)block是用來存儲實際數據的,它的大小通常有1K,2K,4K幾種。其中引導分區等爲1K,其餘普通分區多爲4K(C6)。
10)若是一個文件很大(高清大片4G),須要佔多個block,若是文件很小(0.01K),至少佔一個block,而且這個block的剩餘空間就浪費了,即沒法在存儲其餘數據了。
11)inode大小和總量查看:(下面的i是不區分大小寫)
[root@localhost etc]# dumpe2fs /dev/sda3|egrep -i "block size|lnode size"
[root@localhost etc]# dumpe2fs /dev/sda3|egrep -i "block count|lnode count"
默認block count通常會大於lnode count的數量。
12)查看inode的總量和使用量:
[root@localhost etc]# df -i
13)查看文件的inode信息方法:
[root@localhost etc]# ls -li
[root@localhost /]# stat /etc/hosts
14)如何生成及指定inode大小:
格式化命令:mkfs.ext4-b 2048-l 256 /dev/sdb
inode總結
什麼是inode?
理解inode,要從文件儲存提及。文件儲存在硬盤上,硬盤的最小存儲單位叫扇區(Sector)。每一個扇區儲存512字節(至關於0.5KB)。操做系統讀取硬盤的時候,不會一個個扇區地讀取,這樣效率過低,而是一次性連續讀取多個扇區,即一次性讀取一個塊(block)。這種由多個扇區組成的塊是文件存取的最小單位,塊的大小,最多見的是4KB,即連續八個sector組成一個block,文件數據都儲存在塊中,那麼很明顯,咱們還必須找到一個地方儲存文件的元信息,好比文件的建立者、文件的創年日期、文件的大小等等。這種儲存元信息的區域叫作inode,中文譯名爲」索引節點」。inode (index node) 表中包含文件系統的全部文件列表。
![](http://static.javashuo.com/static/loading.gif)
inode包含文件的信息(元數據)
Inode編號
用來識別文件類型,以及用於stat C函數的模式信息
文件權限
文件的擁有者的UID
文件所屬組的GID
連接數(指向這個文件名路徑名稱個數)
文件的大小
文件的間戳(ctime指inode上一次變更的時間,mtime是指文件內容上一次變更的時間,atime指文件上一次打開的時間)
指向磁盤文件的數據塊指針
有關文件的其它數據
注意:要想查看文件的inode信息可使用stat命令查看
inode表結構
![1522294130887366.png inode表結構.png](http://static.javashuo.com/static/loading.gif)
直接塊指針:
前12個直接指針,直接指向存儲數據的區域。如Blocks大小爲4*1024KB,前12個直接指針就能夠保存48KB的文件
間接塊指針:
設每一個指針佔用4個字節,則以及指針指向的Blocks能夠保存(4*1024)/4KB,可指向1024個Blocks,一級指針可存儲文件數據大小爲1024*(4*1024)KB=4MB
雙重間接塊指針:
一樣Blocks大小爲4*1024,則二級指針可保存Blocks指針數量爲((4*1024)/4)*((4*1024)/4),則二級指針保存文件數據大小爲(1024*1024)*(4*1024)=4GB
三重間接塊指針:
以次類推三級指針能夠儲存文件數據大小爲(1024*4*1024*1024)*(4*1024)=4TB
inode的大小:
每一個inode都有一個編號,操做系統用inode號來識別不一樣文件。Unix/Linux系統不使用文件名,而使用inode號來識別文件,對於系統來講,文件名只是inode號碼便於識別的別稱或綽號。表面上,經過文件名打開文件;實際上,系統內部這個過程分紅三步:首先,系統找到這個文件名對應的inode號;其次,經過inode號,獲取inode信息;最後,根據inode信息,找到文件數據所在的block,讀出數據。
注意:inode號並非無限的,若是一個分區的節點數被使用完了,那麼即便磁盤空間還有剩餘也不能再存聽任何數據。可使用df -i命令查看節點使用狀況
注:1節點總數、2使用過節點數、3剩餘節點數、4節點使用率
目錄文件:
Unix/Linux系統中,目錄(directory)也是一種文件。打開目錄,實際上就是打開目錄文件目錄文件的結果很是簡單,就是一系列目錄項(direct)的列表。每一個目錄項,由兩部分組成:所包含文件的文件名,以及該文件名對應的inode號。
ls命令只列出目錄文件中的全部文件名:
![1522294158153248.png ls-1.png](http://static.javashuo.com/static/loading.gif)
ls -i命令列出整個目錄文件,即文件名和inode號(箭頭標的即爲inode號):
![1522294173319561.png ls-i.png](http://static.javashuo.com/static/loading.gif)
若是要查看文件的詳細信息,就必須根據inode號,訪問inode節點,讀取信息。ls -i -l 目錄文件 列出整個目錄文件,即文件名和inode號(箭頭標註的列即爲inode號)
![1522294181282435.png ls-i-l.png](http://static.javashuo.com/static/loading.gif)
理解了上面的知識,就能理解目錄的權限,文件的讀權限(r)和寫權限(w),都是針對目錄文件自己。因爲目錄文件內只有文件名和inode號,因此只有讀權,只能獲取文件名,沒法獲取其餘信息,由於其餘信息都儲存在inode節點中,而讀取inode節點內的信息須要目錄文件的執行權限(x)。
Linux中cp、rm、mv 、ln對inode的影響:
cp命令
rm命令
mv命令
1.若是mv命令的目標文件和源文件所在額文件系統相同:
使用新文件名創建目錄項;
刪除帶有原來文件名的目錄項;
注意:該操做對inode表沒有影響(除時間戳),對數據的位置也沒有影響,不移動任何數據。(即便是mv到一個已經存在的目標文件,新目錄項指源文件inode,會先刪除目標文件的目錄項,因此若是對運行中的apache的共享模塊so文件進行這種操做的話不會有問題,新的so文件inode號變了)
2.若是目標和源文件所在的問價系統不相同,就是cp和rm;
ln命令
符號(軟)連接:
符號連接的內容是它引用文件的名稱,能夠是任意文件或目錄,也能夠連接不一樣問價系統的文件,甚至能夠連接不存在的文件,這就產生通常稱爲斷裂的問題,還能夠不斷的循環連接源文,可是其大小爲指向的路徑字符串的長度;不增長或減小目標文件inode 的引用計數。
使用ln -s source_file softlink_file (注意:源文件(source_file)的路徑是相對路徑(也能夠是絕對路徑,一般使用的是相對路徑),必定是相對於軟連接文件的路徑,而非相對於當前工做目錄的路徑)建立符號連接,在對符號連接進行讀寫操做的時候,系統會自動把該操做轉換爲對源文件的操做,可是刪除鏈接文件時,系統僅僅刪除符號連接文件,而不是刪除源文件自己。
硬連接:
不容許給目錄建立硬連接,建立硬連接會正價額外的記錄項以引用文(不能跨驅動或分區建立硬連接),硬連接件對應於同一文件系統上的一個物理文件,硬連接節點編號是相同的,建立硬連接連接數遞增,刪除文件時:rm命令遞減計數的連接,文件若是存在,至少有一個連接數,當連接數爲0時,該文件被刪除。
使用ln existfile newfile 命令建立硬連接
硬連接於軟鏈接的區別:
一、本質不一樣:硬連接是指向同一個文件,軟連接指向的不是同一個文件
二、刪除時:硬連接不受影響,軟連接失效
三、建立連接時:建立硬連接連接數加1,建立軟連接鏈接數不變
四、是否能夠跨分區:硬連接不能夠跨分區,軟連接能夠跨分區
五、目錄是否能夠建立連接:硬連接不能夠對目錄建立,軟連接能夠對目錄建立
六、硬連接的inode號相同,軟連接inode號不一樣
![](http://static.javashuo.com/static/loading.gif)