Ext2、Fat、XFS文件系統
Ext2:文件系統是對一個存儲設備上的數據和元數據進行組織的機制,文件系統的創建是在格式化分區的過程中完成的(一個分區就是一個系統),衆所周知Windows操作系統使用的文件系統是FAT與NTFS;Linux不同的發行版本使用的文件系統主要有Ext、XFS、Btrfs等。這裏重點介紹Ext2文件系統,並列舉“拖油瓶”Fat文件系統和“高大上”XFS文件系統的特點。
ext2文件系統是索引式文件系統,分區結構如下:
第一部分是引導扇區,負責加載內核;第二部分是superblock,存儲inode/block的總量、使用和剩餘量及文件系統的信息;第三部分是inode,存儲文件的元數據和數據所在的block號;第四部分是block,存儲文件的數據。文件的元數據包括文件大小、擁有者、所屬組、時間戳等,但是不包括文件名,可用ls -l命令查看文件的元數據。當Linux找到一個文件時,先從目錄項中找到文件名和inode,只要找到對應的inode,沿着指針並行把所有數據塊收集起來,就可以讀取一個完整的文件了,下面是inode的結構圖:
由此計算可得block大小爲4k時的單個文件的最大容量爲4T,但是由於Ext2文件系統本身的限制,單個文件大小不能超過2T:
文件的inode信息可用stat命令查看,如圖
這是文件系統的block、inode、目錄項的指向情況:可以看到有兩個目錄項指向同一個inode,鏈接數會記錄在inode中,只有當鏈接數爲0時該文件纔會被刪除,也就是隻有刪除所有指向這個inode的文件名時才能刪除文件,硬鏈接的原理就是多個文件名指向同一個inode,因此多個文件名共用一個inode號,達到共享與備份的目的。符號連接(軟鏈接)則是一個有inode號的文件,其原理則是在文件的內容(數據)存放了該符號鏈接指向的具體文件名,相當於windows的快捷方式。很明顯硬鏈接不能鏈接目錄,也不能跨設備(分區),原因是每個分區都有獨立的inode編號。符號鏈接則可以跨分區,也可以鏈接目錄。
FAT:早期的fat文件系統用在window98系統中,它沒有inode作爲block的索引,因此讀文件是是這樣的duang!duang!duang!讀完一個塊才才知曉下一個塊的位置,讀取時間較長,效率低。
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:先刪除第一字符集較第二字符集多出的字符