Linux下XFS、Ext2文件系統對比、文件管理、inode、文件名、標準I/O
Ext2、Fat、XFS文件系統
文件系統是對一個存儲設備上的數據和元數據進行組織的機制,文件系統的創建是在格式化分區的過程中完成的(一個分區就是一個系統),眾所周知Windows操作系統使用的文件系統是FAT與NTFS;Linux不同的發行版本使用的文件系統主要有Ext、XFS、Btrfs等。這里重點介紹Ext2文件系統,并列舉“拖油瓶”Fat文件系統和“高大上”XFS文件系統的特點。 | |
---|---|
Ext2 |
ext2文件系統是索引式文件系統,分區結構如下: 第一部分是引導扇區,負責加載內核;第二部分是superblock,存儲inode/block的總量、使用和剩余量及文件系統的信息;第三部分是inode,存儲文件的元數據和數據所在的block號;第四部分是block,存儲文件的數據。文件的元數據包括文件大小、擁有者、所屬組、時間戳等,但是不包括文件名,可用 由此計算可得block大小為4k時的單個文件的最大容量為4T,但是由于Ext2文件系統本身的限制,單個文件大小不能超過2T: 文件的inode信息可用 這是文件系統的block、inode、目錄項的指向情況:可以看到有兩個目錄項指向同一個inode,鏈接數會記錄在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
-frm
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
-minode 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 #合并到f3I/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:先刪除第一字符集較第二字符集多出的字符
練習
![]() |
---|
原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/27044