linux溫故知新四

Ext2、Fat、XFS文件系統

Ext2:文件系統是對一個存儲設備上的數據和元數據進行組織的機制,文件系統的創建是在格式化分區的過程中完成的(一個分區就是一個系統),衆所周知Windows操作系統使用的文件系統是FAT與NTFS;Linux不同的發行版本使用的文件系統主要有Ext、XFS、Btrfs等。這裏重點介紹Ext2文件系統,並列舉“拖油瓶”Fat文件系統和“高大上”XFS文件系統的特點。

ext2文件系統是索引式文件系統,分區結構如下:

wKiom1gZuBeyfXPBAABPm-udsC0036.jpg-wh_50

第一部分是引導扇區,負責加載內核;第二部分是superblock,存儲inode/block的總量、使用和剩餘量及文件系統的信息;第三部分是inode,存儲文件的元數據和數據所在的block號;第四部分是block,存儲文件的數據。文件的元數據包括文件大小、擁有者、所屬組、時間戳等,但是不包括文件名,可用ls -l命令查看文件的元數據。當Linux找到一個文件時,先從目錄項中找到文件名和inode,只要找到對應的inode,沿着指針並行把所有數據塊收集起來,就可以讀取一個完整的文件了,下面是inode的結構圖:

wKioL1gZuF-wmU6SAAJvy-Uh5es583.jpg-wh_50

由此計算可得block大小爲4k時的單個文件的最大容量爲4T,但是由於Ext2文件系統本身的限制,單個文件大小不能超過2T:

wKioL1gZuJaTp6axAADJLtJI3Dk964.jpg-wh_50

文件的inode信息可用stat命令查看,如圖

wKiom1gZuLvyj2kTAAEx5wzCIsc717.jpg-wh_50


這是文件系統的block、inode、目錄項的指向情況:可以看到有兩個目錄項指向同一個inode,鏈接數會記錄在inode中,只有當鏈接數爲0時該文件纔會被刪除,也就是隻有刪除所有指向這個inode的文件名時才能刪除文件,硬鏈接的原理就是多個文件名指向同一個inode,因此多個文件名共用一個inode號,達到共享與備份的目的。符號連接(軟鏈接)則是一個有inode號的文件,其原理則是在文件的內容(數據)存放了該符號鏈接指向的具體文件名,相當於windows的快捷方式。很明顯硬鏈接不能鏈接目錄,也不能跨設備(分區),原因是每個分區都有獨立的inode編號。符號鏈接則可以跨分區,也可以鏈接目錄。


FAT:早期的fat文件系統用在window98系統中,它沒有inode作爲block的索引,因此讀文件是是這樣的duang!duang!duang!讀完一個塊才才知曉下一個塊的位置,讀取時間較長,效率低。

wKioL1gZuQzBJ9FuAAEZnuJfX4k723.jpg-wh_50

XFS:在CentOS 7上xfs作爲缺省文件系統,目前最常見的文件系統Ext4已經非常優秀,但是隨着存儲需求越來越大,Ext4漸漸適應不了了,比如現在雖然Ext4 目錄索引採用了Hash Index Tree, 但是依然限制高度爲2.做過實際測試Ext4的單個目錄文件超過200W個,性能下降的就比較厲害了。由於歷史磁盤結構原因Ext4 的inode個數限制(32位數)最多只能有大概40多億文件。而且Ext4的單個文件大小最大隻能支持到16T(4K block size),而XFS使用64位管理空間,文件系統規模可以達到EB級別,可以說未來幾年XFS徹底取代Ext4是早晚的事情。另外,我看了一下XFS目前redhat至少投入了5個Kernel developer在上面,因爲XFS 是基於B+ Ttree管理元數據,即將支持reflink,dedupe等高級特性(Oracle 開發者已經開發了patch)。綜上所述,XFS 取代Ext4 已經成爲必然。



文件管理


root用戶下mv、rm、cp都定義了別名,加了-i提示的選項

touch 刷新時間(-),創建空文件 touch f? ?表示一個字符 

touch -m -t 201710100220 file

touch -c #如果文件存在,則不予創建

touch -m #僅改變mtime

touch -a #僅改變atime

cp – copy files and directories

cp -i #提示覆蓋或刪除的信息,root下alias cp=’cp -i’避免權限過大亂cp

cp #直接複製會丟失屬性

cp –preserve=ownership,timeship,mode或all #保留想要的屬性,號隔開

cp -f #刪除並從新複製,用戶在自己的家目錄可以-f覆蓋其他用戶的文件

cp -r #複製整個目錄(文件和目錄),可指定複製的目錄,如果目錄存在直接複製文件夾到存在的目錄,目錄不存在則複製目錄到的內容到新的文件夾

cp -a #歸檔,保留原來的屬性,鏈接還是鏈接

cp -d #不復制原文件,只複製鏈接名

cp -p #複製所有屬性,鏈接變源文件

alias 別名命令 存放在~.bashrc和/etc/bashrc中

alias name=’command -option argument’

unalias name

\command or ‘command’ or /path/command #執行原命令

mv 移動和重命名文件 

mv -i

mv -f

rm 

rm -i

rm -f

rm -r

rm –no-preserve-root #cent6增加的選項

rm -rf = \rm

rmdir 刪除空目錄

rmdir -p遞歸刪除空目錄

tree 

rpm -i /misc/cd/Packages/tree

tree -d

tree -L

tree -P

tree -p

mkdir

tree -p

tree -v

tree -m

inode index node 

在Linux中文件的鏈接方式有兩種,一種是類似Windows的快捷方式,可以鏈接文件或目錄,我們稱之爲軟鏈接或符號鏈接;另一種是直接鏈接到文件的inode併產生新的文件名,這種稱之爲硬鏈接(hard link)。文件由元數據和數據組成,其中元數據指的是文件的屬性(大小、擁有者、權限、時間戳等信息,不包括文件名),數據就是文件的內容。元數據存放在inode中,數據存放在inode指向的一個或多個數據塊(block)中。

軟鏈接

(1)軟鏈接有自己的inode號

(2)軟連接可以跨設備(分區)

(3)軟連接可以鏈接目錄與文件(軟連接)

(4)軟連接不會增加鏈接數

(5)文件大小爲鏈接地址的字符個數

(6)軟連接權限無關要緊

硬鏈接 (1)硬鏈接的inode相同

(2)硬鏈接不能跨設備(分區)

(3)硬鏈接不能應用於目錄

(4)每增加一個硬鏈接,該文件的鏈接數加一

文件引用根據inode號,一般inode會佔用文件系統磁盤空間的1%

 刪除文件:分配inode,增加該目錄的目錄項,分配數據塊

 增加文件:釋放inode,減少該目錄的目錄項,數據塊回收

 移動文件:創建新的目錄項,刪除舊目錄的目錄項,inode不變。但是不同分區間相當於先複製整個文件再刪除原文件

file 查看文件類型,確定文件內容file -c #詳細顯示指令執行的過程,便於排錯或分析程序執行

file -f #查看文件名的文件類型

file -F“—” #指定文件名後的分隔符

file -L file /zero告訴你這是一個軟連接,file -L /zero告訴你文件類型

file -i #輸出mime類型的字符串

file -b #列出文件的類型,但是不顯示文件名

不同分區的節點號可以不同,同一個分區用節點號唯一標識一個文件

df -i #顯示每個分區的inode大小和利用率

ln f1 f2 #f2硬鏈接到f1的inode相同(ls -li),鏈接數加1

ln f1 /boot/f2 #硬鏈接不能跨設備(分區),且硬鏈接的文件不能是目錄,軟連接能跨設備(分區)

目錄的鏈接數量至少是2,本身和 . 都指向該目錄,創建一個子目錄會增加一個鏈接數

centos6 /目錄下 -ai顯示inode爲2的表示一個分區的根

centos7 /目錄下 -ai顯示inode爲128表示一個分區的根

ln -s f1 /testdir/f2 #軟連接、符號鏈接,可以是文件或目錄,f1軟鏈接到f2(鏈接

不同目錄時f1用絕對路徑或f1的相對路徑,否則看到f2閃爍,centos中多用相對路徑),使用了不同的inode



標準I/O設備

程序=指令+數據 

讀入數據:input

輸出數據:output

文件描述符fd,存放在/proc/任一進程號/fd/中,用ll可看到標準I/O設備

Linux提供3種I/O設備,標準輸入、輸出、錯誤 

標準輸入(stdin)0,默認接收來自鍵盤的輸入。

標準輸出(stdout)1,默認輸出到終端窗口。

標準錯誤(stderr)2,默認輸出到終端窗口。

I/O重定向 —— 輸出:即改變默認位置 

ls > /dev/pts/2 #標準輸出重定向到設備或文件中

`在執行命令的時候,可把輸出信息重定向到到/dev/null中,乾乾淨淨

> f1 #stdout重定向,可創建一個空文件

2> #stderr重定向

&> #stdout與stderr重定向

&>> 2>> >> #追加,不覆蓋

> f1 2>&1 #stdout輸出到f1,把stderr變成stdout再輸出到f1

set -C #禁止覆蓋當前終端會話有效

set +C #允許覆蓋

cat f1 f2 > f3 #合併到f3

I/O重定向 —— 輸入:用文件代替鍵盤的輸入 

cat < f1 #把f1輸入到cat中

cat > f1 <<eof  #多行重定向,在標準輸時使用標準輸入,表示輸入eof就結束,此時才寫入文件,Ctrl d退出。還有一個好處是可以一行一行的輸入,不必放在一行

mail中默認是 . 表示結束,如 mail -s subject user <<eof 則表示以eof結

管道(pipe) 

默認只管傳遞正確地命令,即標準輸出,可使用 2>&1 或 |&實現標準錯誤的重定向

sjdgosgo 2>&1 |grep(舊寫法) = sdshdgo |& grep(新寫法) #把標準錯誤重定向到標準輸出,再通過管道傳遞

|tee #可實現在終端顯示並寫入文件,默認是覆蓋文件 |tee -a 追加文件

|less #一頁一頁地查看

tr – 轉換和刪除字符 

tr[OPTION]… SET1 [SET2]

tr ‘a-z’ ‘A-Z’ 或 tr ‘[:lower:]’ ‘[:upper:]’ #逐個字符替換,若後者小於前者,則其餘字符用最後一個字符替換

-c或–complerment:取字符集的補集,取字符集以外的所有字符

-d或–delete:刪除所有屬於第一字符集的字符;

-s或–squeeze-repeats:壓縮連續重複的字符用單獨一個字符表示,如刪除空行

-t或–truncate-set1:先刪除第一字符集較第二字符集多出的字符


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章