[root@xueshen65 ~]# stat /etc/passwd
? 文件:"/etc/passwd"
? 大小:2360? ? ? 塊:8? ? ? ? ? IO 塊:4096? 普通文件
設備:802h/2050d Inode:8793084? ? 硬鏈接:1
權限:(0644/-rw-r--r--)? Uid:(? ? 0/? ? root)? Gid:(? ? 0/? ? root)
環(huán)境:system_u:object_r:passwd_file_t:s0
最近訪問:2020-04-02 10:04:21.725000250 +0800
最近更改:2020-03-19 12:00:24.027730760 +0800
最近改動:2020-03-19 12:00:24.028730760 +0800
第13章-Linux文件系統(tǒng)結構
本節(jié)所講內容:
13.1 ?硬盤結構
13.2 ?文件系統(tǒng)結構
13.2 ?硬鏈接和軟鏈接
13.4 ?實戰(zhàn):解決磁盤有空間但創(chuàng)建不了文件-修復服務器文件系統(tǒng)
?
13.1 ?硬盤結構
13.1.1 ?硬盤結構
文件系統(tǒng)結構慕匠,理解文件系統(tǒng)科阎,要從文件儲存說起。
硬盤結構:
?
互動:磁盤內部是真空的嗎?是:1 ?瘤礁,不是:2
?
磁盤內部不是真空谓娃,只不過里面的空氣很干凈。如果是真空替劈,還不利于散熱
磁盤相關專業(yè)術語:
硬盤的內部是金屬盤片寄雀,將圓形的盤片劃分成若干個扇形區(qū)域,這就是扇區(qū)陨献。若干個扇區(qū)就組成整個盤片盒犹。為什么要分扇區(qū)?是邏輯化數(shù)據(jù)的需要,能更好的管理硬盤空間急膀。以盤片中心為圓心沮协,把盤片分成若干個同心圓,那每一個劃分圓的“線條”卓嫂,就稱為磁道慷暂。
硬盤內的盤片有兩個面,都可以儲存數(shù)據(jù)命黔,而硬盤內的盤片往往不止一張呜呐,常見的有兩張,那么悍募,兩張盤片中相同位置的磁道蘑辑,就組成一個“柱面”,盤片中有多少個磁道坠宴,就有多少個柱面洋魂。盤片兩面都能存數(shù)據(jù),要讀取它喜鼓,必須有磁頭副砍,所以,每一個面庄岖,都有一個磁頭豁翎,一張盤片就有兩個磁頭。
硬盤的存儲容量=磁頭數(shù)×磁道(柱面)數(shù)×每道扇區(qū)數(shù)×每道扇區(qū)字節(jié)數(shù)隅忿。
磁道從外向內自0開始順序進行編號心剥,各個磁道上的扇區(qū)數(shù)是在硬盤格式化時確定的。?
?
文件儲存在硬盤上背桐,硬盤的最小存儲單位叫做"扇區(qū)"(Sector)优烧。每個扇區(qū)儲存512字節(jié)(相當于0.5KB)。
比較古老的CHS (Cylinder/Head/Sector :磁頭(Heads)链峭、柱面(Cylinder)畦娄、扇區(qū)(Sector))結構體系. 因為很久以前,在硬盤的容量還非常小的時候弊仪,人們采用與軟盤類似的結構生產(chǎn)硬盤熙卡。也就是硬盤盤片的每一條磁道都具有相同的扇區(qū)數(shù),由此產(chǎn)生了所謂的3D參數(shù)励饵,即是磁頭數(shù)(Heads)再膳、柱面數(shù)(Cylinders)、扇區(qū)數(shù)(Sectors)以及相應的3D尋址方式曲横。?
?
互動:如上的磁盤結構有沒有問題??禾嫉?
這種結構有問題:
以前老式的磁盤灾杰,每個磁道的扇區(qū)都一樣,這樣外磁道整個弧長要大于內部的扇區(qū)弧長熙参,因而其磁記錄密度就要比內部磁道的密度要小艳吠。最終,導致了外部磁道的空間浪費孽椰。
?
如查你磁盤設計工程師昭娩,你打算怎么解決?你選擇下面哪種方法黍匾?
方法1:每個磁道的寬度不一樣栏渺,從而讓每個扇區(qū)面積盡量一樣
方法2:不再一刀切,讓磁道中的扇區(qū)數(shù)量可以不一樣
?
13.2 ?文件系統(tǒng)結構
Linux文件系統(tǒng)由三部分組成 : 文件名锐涯,inode磕诊,block
Linux文件系統(tǒng): ext3,ext4,xfs
windows文件系統(tǒng): FAT32纹腌,NTFS
13.2.1 ?文件名:
[root@xuegod63 ~]# cp /etc/passwd a.txt
[root@xuegod63 ~]# ls?a.txt ?# a.txt 就是文件名
?
13.2.2 ?inode的內容
inode包含文件的元信息霎终,具體來說有以下內容:
* 文件的字節(jié)數(shù)
* 文件擁有者的User ID
* 文件的Group ID
* 文件的讀、寫升薯、執(zhí)行權限
* 文件的時間戳莱褒,共有三個:ctime指inode上一次變動的時間,mtime指文件內容上一次變動的時間涎劈,atime指文件上一次打開的時間广凸。
* 鏈接數(shù),即有多少文件名指向這個inode
* 文件數(shù)據(jù)block的位置
?
可以用stat命令责语,查看某個文件的inode信息:
[root@xuegod63 ~]# stat a.txt
??File: ‘a(chǎn).txt’
??Size: 2053 ????? Blocks: 8 ?????????IO Block: 4096 ??regular file
Device: 803h/2051d Inode: 18521833 ???Links: 1
Access: (0644/-rw-r--r--) ?Uid: ( ???0/ ???root) ??Gid: ( ???0/ ???root)Access最近訪問時間: 2018-05-16 14:55:36.061095050 +0800
Modify最近更改時間: 2018-05-16 14:55:36.062095050 +0800
Change最近改動時間: 2018-05-16 14:55:36.062095050 +0800
?Birth創(chuàng)建時間: -
[root@xuegod63 ~]# ?ll /etc/passwd ?#ll 其實就是查看passwd的inode信息
-rw-r--r--. 1 root root 2053 Sep 19 ?2017?/etc/passwd??#ll查看到時間是ctime時間
?
互動:
ctime是什么炮障? ?是創(chuàng)建時間嗎? 不會:1
mtime:modify time ?修改文件內容的時間
atime ?: access time ??訪問文件內容的時間
ctime指inode上一次文件屬性變動的時間坤候,change time 胁赢。 比如: chmod +x ?a.sh
mtime指文件內容上一次變動的時間,modify?time? 白筹。如:echo aa >> a.sh 或vim ?a.sh 修改內容
atime指文件上一次查看文件的時間智末,access time 。 如: ?cat ?a.sh
例2:測試mtime時間徒河,黑客先修改時間系馆,再植入木馬程序,防止 find / -mtime 查看木馬文件
[root@xuegod63 ~]# stat a.txt ?#查看時間
[root@xuegod63 ~]# date -s '13:42'
[root@xuegod63 ~]# vim a.txt ??#寫入aaaa顽照,vim會修改mtime和atime時間
[root@xuegod63 ~]# stat a.txt ?#查看時間
[root@xuegod63 ~]# chmod +x a.txt ?#修改ctime由蘑,有時黑客忘記修改ctime時間了闽寡,所以你可以find / -ctime 查看木馬文件
[root@xuegod63 ~]# stat a.txt ?#查看時間
這個一招學到手:1
?
13.2.3 ?inode的大小
inode也會消耗硬盤空間,所以硬盤格式化的時候尼酿,操作系統(tǒng)自動將硬盤分成兩個區(qū)域爷狈。一個是數(shù)據(jù)區(qū),存放文件數(shù)據(jù)裳擎;另一個是inode區(qū)(inode table)涎永,存放inode所包含的信息。
每個inode節(jié)點的大小鹿响,一般是128字節(jié)或256字節(jié)羡微。inode節(jié)點的總數(shù),在格式化時就給定惶我,假定在一塊1GB的硬盤中妈倔,每個inode節(jié)點的大小為128字節(jié),每1KB就設置一個inode指孤,那么inode table的大小就會達到128MB启涯,占整塊硬盤的12.8%。
?
inode號碼
每個inode都有一個號碼恃轩,操作系統(tǒng)用inode號碼來識別不同的文件结洼。
?Unix/Linux系統(tǒng)內部不使用文件名,而使用inode號碼來識別文件叉跛。對于系統(tǒng)來說松忍,文件名只是inode號碼便于識別的別稱或者綽號。表面上筷厘,用戶通過文件名鸣峭,打開文件。實際上酥艳,系統(tǒng)內部這個過程分成三步:首先摊溶,系統(tǒng)找到這個文件名對應的inode號碼;其次充石,通過inode號碼莫换,獲取inode信息;最后骤铃,根據(jù)inode信息拉岁,找到文件數(shù)據(jù)所在的block,讀出數(shù)據(jù)惰爬。
?
例1:?使用ls -i命令喊暖,可以看到文件名對應的inode號碼
[root@xuegod63 ~]# ls -i a.txt
440269 a.txt
例2:查看每個硬盤分區(qū)的inode總數(shù)和已經(jīng)使用的數(shù)量,可以使用df命令撕瞧。
[root@localhost ~]# df -i
Filesystem ???????????Inodes ??IUsed ??IFree IUse% Mounted on
/dev/sda2 ????????????640848 ?151010 ?489838 ??24% /
tmpfs ????????????????145579 ??????1 ?145578 ???1% /dev/shm
/dev/sda1 ?????????????51200 ?????38 ??51162 ???1% /boot
注:由于每個文件都必須有一個inode陵叽,因此有可能發(fā)生inode已經(jīng)用光狞尔,但是硬盤還未存滿的情況。這時咨跌,就無法在硬盤上創(chuàng)建新文件沪么。
?
13.2.4 ?目錄文件
Unix/Linux系統(tǒng)中,目錄(directory)也是一種文件锌半。打開目錄,實際上就是打開目錄文件寇漫。?
目錄文件的結構非常簡單刊殉,就是一系列目錄項的列表。每個目錄項州胳,由兩部分組成:所包含文件的文件名记焊,以及該文件名對應的inode號碼。
[root@xuegod63 ~]# ls -id /etc
8388673 /etc
?例:ls -i命令列出整個目錄文件栓撞,即文件名和inode號碼:
[root@xuegod63 ~]# ls -i /etc
?
13.2.5 ?block塊大小
block 是真正存儲數(shù)據(jù)的地方遍膜。??
block是文件系統(tǒng)中最小的存儲單位
扇區(qū)是磁盤中最小的存儲單位
?
互動:為什么要有block,直接使用扇區(qū)可以嗎瓤湘?
?
操作系統(tǒng)讀取硬盤的時候瓢颅,不會一個個扇區(qū)(512字節(jié))地讀取,這樣效率太低弛说,而是一次性連續(xù)讀取多個扇區(qū)挽懦,即一次性讀取一個"塊"(block)。這種由多個扇區(qū)組成的"塊"木人,是文件存取的最小單位信柿。"塊"的大小,最常見的是1KB醒第,即連2個sector扇區(qū)組成一個block渔嚷。或4K。
?
情景:如果沒有block稠曼? 會怎么樣形病?
夜深人靜,下了3.6G ?cang.avi 的電影蒲列,一次讀512B 窒朋, 尋址次太多,太慢了蝗岖。侥猩。。
結果抵赢。欺劳。唧取。你懂得。划提。枫弟。?
結果:??avi看成了 jpg
例1:格式化修改磁盤鹏往,修改簇大小
簇和block調大:
優(yōu)點:速度快淡诗,節(jié)約尋址時間,缺點:空間浪費
比如:2T硬盤, 前1.5T伊履,使用4K韩容, 把剩下的500G格式化成64K簇。用空間換時間
?
例2:查看Linux系統(tǒng)塊大小
[root@xuegod63 ~]# stat /etc/passwd | grep IO
大刑破佟:2053 塊:8 ?????????IO 塊:4096 普通文件
#block到是4K
總結:
硬盤的結構:ZBR 區(qū)位記錄
inode(inode表中主要看inode號)
inode號唯一標識一個文件(一個文件系統(tǒng)里面)
inode用完了群凶,文件就不能創(chuàng)建了。
inode數(shù)據(jù)量設置大一些:可以創(chuàng)建多個文件哄辣。占用空間比較大
inode數(shù)據(jù)量設置小一些:可以創(chuàng)建很少文件请梢。占用空間比較小
?
block
block設置大:效率高,利用率低力穗。
block設置幸慊 :效率低,利用率高睛廊。
?
13.3 ?文件的硬鏈接和軟鏈接
13.3.1 ?Linux鏈接概念Linux鏈接分兩種形真,一種被稱為硬鏈接(Hard Link),另一種被稱為軟鏈接超全,即符號鏈接(Symbolic Link)咆霜。默認情況下,ln命令產(chǎn)生硬鏈接嘶朱。
【硬連接】:硬連接指通過索引節(jié)點號來進行連接蛾坯。inode是可以對應多個文件名的
在Linux的文件系統(tǒng)中,保存在磁盤分區(qū)中的文件不管是什么類型都給它分配一個編號疏遏,稱為索引節(jié)點號(Inode Index)脉课。
在Linux中,多個文件名可以指向同一索引節(jié)點财异。一般這種連接就是硬連接倘零。
硬連接的作用是允許一個文件擁有多個有效路徑名,這樣用戶就可以建立硬連接到重要文件戳寸,以防止“誤刪”的功能呈驶。
只刪除一個連接并不影響索引節(jié)點本身和其它的連接,只有當最后一個連接被刪除后疫鹊,文件的數(shù)據(jù)塊及目錄的連接才會被釋放袖瞻。也就是說司致,文件真正刪除的條件是與之相關的所有硬連接文件均被刪除。
【軟連接】:另外一種連接稱之為符號連接(Symbolic Link)聋迎,也叫軟連接脂矫。軟鏈接文件有類似于Windows的快捷方式。它實際上是一個特殊的文件霉晕。在符號連接中庭再,文件實際上是一個文本文件,其中包含的有另一文件的位置信息
?
13.3.2 ?實戰(zhàn)-1: ln命令創(chuàng)建硬鏈接
語法格式:ln 源文件 目標文件
[root@xuegod63 ~]# echo 1111 > a.txt
硬鏈接的特點: 無法針對目錄,跨分區(qū)無法實現(xiàn)牺堰。因為每個分區(qū)都有自己獨立的INDOE編號
互動:為什么剛創(chuàng)建的一個目錄佩微,鏈接數(shù)就是2?
[root@xuegod63 ~]# mkdir test
[root@xuegod63 ~]# ll -d test/
drwxr-xr-x 2 root root 6 5月 ?16 15:55 test/
默認新一個空目錄萌焰,此目錄的第二字段就是2(包含兩個隱藏目錄,因為每一個目錄都有一個指向它本身的子目錄"." 和指向它上級目錄的子目錄"..")谷浅,所以test是一個鏈接扒俯, 隱藏目錄. 是第二個鏈接
[root@xuegod63 ~]# ll -id test/????#兩個inode號是一樣的
2453723 drwxr-xr-x 2 root root 6 5月 ?16 15:55 test/
[root@xuegod63 ~]# ll -id test/.
2453723?drwxr-xr-x 2 root root 6 5月 ?16 15:55 test/.
13.3.3 ?ln -s 創(chuàng)建軟連接
軟鏈接:相當于windows中的快捷方式
語法:ln ?-s ?源文件 ?軟鏈接的名字
例:
[root@xuegod63 ~]# cp /etc/passwd a.txt
[root@xuegod63 ~]# ln -s a.txt a-link.txt
[root@xuegod63 ~]# ll a-link.txt
lrwxrwxrwx 1 root root 5 5月 ?16 16:10 a-link.txt -> a.txt
[root@xuegod63 ~]# rm -rf a.txt
[root@xuegod63 ~]# ll a-link.txt
lrwxrwxrwx 1 root root 5 5月 ?16 16:10 a-link.txt -> a.txt
注:源文件被刪除,鏈接文件失效
?
例2:能針對目錄和跨分區(qū)創(chuàng)建軟鏈接
[root@xuegod63 ~]# ln -s /boot/grub grub-link
能跨分區(qū)創(chuàng)建(源文件必須寫絕對路徑)
[root@xuegod63 ~]# cd /boot/
[root@xuegod63 boot]# ln -s ./grub /root/aaa
[root@xuegod63 boot]# ll /root/aaa
lrwxrwxrwx 1 root root 6 5月 ?16 16:21 /root/aaa -> ./grub ?#報錯了
?
13.3.4 ?inode的特殊作用
由于inode號碼與文件名分離一疯,這種機制導致了一些Unix/Linux系統(tǒng)特有的現(xiàn)象撼玄。
1. 有時,文件名包含特殊字符墩邀,無法正常刪除掌猛。這時,直接刪除inode節(jié)點眉睹,就能起到刪除文件的作用荔茬。
2. 移動文件或重命名文件,只是改變文件名竹海,不影響inode號碼慕蔚。
3. 打開一個文件以后,系統(tǒng)就以inode號碼來識別這個文件斋配,不再考慮文件名孔飒。因此,通常來說艰争,系統(tǒng)無法從inode號碼得知文件名坏瞄。
互動:為什么每次修改完服務器配置文件后,都需要重新加載一下配置文件甩卓?
因為vim每次修改完后鸠匀,Inode號都會變。
[root@xuegod63 ~]# cp /etc/passwd passwd
[root@localhost ~]# ls -i passwd
393418?passwd
[root@localhost ~]# vim passwd ????#添加一些內容
[root@localhost ~]# ll -i passwd
440252?-rw-r--r-- 1 root root 1813 Dec 29 12:04 passwd
就是為什么每次修改完服務器的配置文件猛频,都要重啟服務狮崩,重新讀一下配置文件蛛勉。
?
13.4 ?實戰(zhàn):解決磁盤有空間但創(chuàng)建不了文件-修復服務器文件系統(tǒng)
13.4.1 ?解決磁盤有空間但創(chuàng)建不了文件
實戰(zhàn)場景:在一臺配置較低的Linux服務器(內存、硬盤比較心啦瘛)的/data分區(qū)內創(chuàng)建文件時诽凌,系統(tǒng)提示磁盤空間不足丢胚,用df -h命令查看了一下磁盤使用情況衷佃,發(fā)現(xiàn)/data分區(qū)只使用了80%,還有1.9G的剩余空間边苹,但是無法創(chuàng)建新的文件狱窘。當時使用的是root用戶杜顺。服務器沒有被黑。
[root@xuegod63 ~]# df -h
文件系統(tǒng)容量已用可用已用% ?掛載點
/dev/sda3 ???????10G ??8.0G ?1.9G ??80%????/
?
常識:只要權限夠蘸炸,磁盤上有空間一定可以創(chuàng)建文件躬络。這個是錯的。
排查:
[root@xuegod63 ~]# df -i ?
文件系統(tǒng)Inode ????已用(I) ????可用(I) ????????已用(I)% ??掛載點
/dev/sda3 ?????5242880 ??5242880 ???0??????????????100%????????/
#后來用df -i查看了一下/data所在的分區(qū)的索引節(jié)點(inode)搭儒,發(fā)現(xiàn)已經(jīng)用滿(IUsed=100%)穷当,導致系統(tǒng)無法創(chuàng)建新目錄和文件。
查找原因:
/data/cache目錄中存在數(shù)量非常多的小字節(jié)緩存文件淹禾,占用的Block不多馁菜,但是占用了大量的inode。
?
解決方案1:刪除/data/cache目錄中的部分文件铃岔,釋放出/data分區(qū)的一部分inode汪疮。
解決方案2 : 在/data備份好一些文件,然后刪除這些文件毁习,釋放一些inode智嚷,然后創(chuàng)建一個文件夾/data/cache2。在cache2下掛載一個新分區(qū): sda4 ?蜓洪,下次寫數(shù)據(jù)需要寫到新分區(qū)cache2目錄下纤勒。
?
inode分區(qū)完后,可以增加嗎隆檀? 不可以摇天。 ?inode總數(shù)是在格式化時定下來。
[root@xuegod63 ~]# mkfs.ext4?-I ??500000000000 ?/dev/sda1 ?#可以指定大小
參數(shù):
[-i bytes-per-inode] [-I inode-size]
13.4.2 ?實戰(zhàn):修復服務器文件系統(tǒng)
實戰(zhàn)場景:公司服務器突然斷電后恐仑,再次啟動后泉坐,報如下錯誤。
?
解決方法:
輸入root 密碼
fsck?-f -y ?/dev/sda1 ??#把引導分區(qū)文件系統(tǒng)修復一下 ?# 慎用裳仆,給領導說一聲
fsck?-f -y ?/dev/sda3 ??#把根分區(qū)文件系統(tǒng)修復一下 ???# 慎用腕让,給領導說一聲
reboot ?重啟
fsck參數(shù):
-y 對所有問題都回答 "yes"
-f 即使文件系統(tǒng)標記為 clean 也強制進行檢查
?
總結:
13.1 ?硬盤結構
13.2 ?文件系統(tǒng)結構
13.2 ?硬鏈接和軟鏈接
13.4 ?實戰(zhàn):解決磁盤有空間但創(chuàng)建不了文件-修復服務器文件系統(tǒng)