1. linux裡面什麼是ext2fs
EXT2FS第二代擴展文件系統(英語:second extended filesystem,縮寫為 ext2),是LINUX內核所用的文件系統。它開始由Rémy Card設計,用以代替ext,於1993年1月加入linux核心支持之中。ext2 的經典實現為LINUX內核中的ext2fs文件系統驅動,最大可支持2TB的文件系統,至linux核心2.6版時,擴展到可支持32TB。其他的實現包括GNU Hurd,Mac OS X(第3方),Darwin(第3方),BSD。ext2為數個LINUX發行版的默認文件系統,如Debian、Red Hat Linux等 。
簡介
其單一文件大小與文件系統本身的容量上限與文件系統本身的簇大小有關,在一般常見的 x86電腦系統中,簇最大為 4KB, 則單一文件大小上限為 2048GB, 而文件系統的容量上限為 16384GB。
但由於目前核心 2.4 所能使用的單一分割區最大隻有 2048GB,實際上能使用的文件系統容量最多也只有 2048GB。
至於Ext3文件系統,它屬於一種日誌文件系統,是對ext2系統的擴展。它兼容ext2,並且從ext2轉換成ext3並不復雜。
Ext2文件系統具有以下一般特點:
1、當創建Ext2文件系統時,系統管理員可以根據預期的文件平均長度來選擇最佳的塊大小(從1024B——4096B)。例如,當文件的平均長度小於幾千位元組時,塊的大小為1024B是最佳的,因為這會產生較少的內部碎片——也就是文件長度與存放塊的磁碟分區有較少的不匹配。另一方面,大的塊對於 大於幾千位元組的文件通常比較合合適,因為這樣的磁碟傳送較少,因而減輕了系統的開銷[1]。
2、當創建Ext2文件系統時,系統管理員可以根據在給定大小的分區上預計存放的文件數來選擇給該分區分配多少個索引節點。這可以有效地利用磁碟的空間。
3、文件系統把磁碟塊分為組。每組包含存放在相鄰磁軌上的數據塊和索引節點。正是這種結構,使得可以用較少的磁碟平均尋道時間對存放在一個單獨塊組中的文件並行訪問。
4、在磁碟數據塊被實際使用之前,文件系統就把這些塊預分配給普通文件。因此當文件的大小增加時,因為物理上相鄰的幾個塊已被保留,這就減少了文件的碎片。
5、支持快速符號鏈接。如果符號鏈接表示一個短路徑名(小於或等於60個字元),就把它存放在索引節點中而不用通過由一個數據塊進行轉換。
Ext2還包含了一些使它既健壯又靈活的特點:
1、文件更新策略的謹慎實現將系統崩潰的影響減到最少。我們只舉一個例子來體現這個優點:例如,當給文件創建一個硬鏈接時,首先增加磁碟索引節點中 的硬鏈接計數器,然後把這個新的名字加到合適的目錄中。在這種方式下,如果在更新索引節點後而改變這個目錄之前出現一個硬體故障,這樣即使索引節點的計數 器產生錯誤,但目錄是一致的。因此,盡管刪除文件時無法自動收迴文件的數據塊,但並不導致災難性的後果。如果這種處理的順序相反(更新索引節點前改變目 錄),同樣的硬體故障將會導致危險的不一致,刪除原始的硬鏈接就會從磁碟刪除它的數據塊,但新的目錄項將指向一個不存在的索引節點。如果那個索引節點號以 後又被另外的文件所使用,那麼向這個舊目錄的寫操作將毀壞這個新的文件。
2、在啟動時支持對文件系統的狀態進行自動的一致性檢查。這種檢查是由外部程序e2fsck完成的,這個外部程序不僅可以在系統崩潰之後被激活,也 可以在一個預定義的文件系統安裝數(每次安裝操作之後對計數器加1)之後被激活,或者在自從最近檢查以來所花的預定義時間之後被激活。
3、支持不可變(immutable)的文件(不能修改、刪除和更名)和僅追加(append-only)的文件(只能把數據追加在文件尾)。
4、既與Unix System V Release 4(SVR4)相兼容,也與新文件的用戶組ID的BSD語義相兼容。在SVR4中,新文件採用創建它的進程的用戶組ID;而在BSD中,新文件繼承包含它 的目錄的用戶組ID。Ext2包含一個安裝選項,由你指定採用哪種語義。
即使Ext2文件系統是如此成熟、穩定的程序,也還要考慮引入另外幾個負面特性。目前,一些負面特性已新的文件系統或外部補丁避免了。另外一些還僅僅處於計劃階段,但在一些情況下,已經在Ext2的索引節點中為這些特性引入新的欄位。最重要的一些特點如下:
塊片(block fragmentation)
系統管理員對磁碟的訪問通常選擇較大的塊,因為計算機應用程序常常處理大文件。因此,在大塊上存放小文件就會浪費很多磁碟空間。這個問題可以通過把幾個文件存放在同一塊的不同片上來解決。
透明地處理壓縮和加密文件
這些新的選項(創建一個文件時必須指定)將允許用戶透明地在磁碟上存放壓縮和(或)加密的文件版本。
邏輯刪除
一個undelete選項將允許用戶在必要時很容易恢復以前已刪除的文件內容。
日誌
日誌避免文件系統在被突然卸載(例如,作為系統崩潰的後果)時對其自動進行的耗時檢查。
實際上,這些特點沒有一個正式地包含在Ext2文件系統中。有人可能說Ext2是這種成功的犧牲品;直到幾年前,它仍然是大多數Linux發布公司採用的首選文件系統,每天有成千上萬的用戶在使用它,這些用戶會對用其他文件系統來代替Ext2的任何企圖產生質疑。
Ext2中缺少的最突出的功能就是日誌,日誌是高可用伺服器必需的功能。為了平順過渡,日誌沒有引入到Ext2文件系統;但是,我們在後面 「Ext3文件系統」中會討論,完全與Ext2兼容的一種新文件系統已經創建,這種文件系統提供了日誌。不真正需要日誌的用戶可以繼續使用良好而老式的Ext2文件系統,而其他用戶可能採用這種新的文件系統。現在發行的大部分系統採用Ext3作為標準的文件系統。
Linux支持多種不同類型的文件系統:網路文件系統NFS,磁碟文件系統Extfs,特殊文件系統proc、tmpfs等。
Ext2fs文件系統基本概念
Inode
Ext2fs中,每個文件都用如下圖所示的inode結構來描述,用戶空間操作的對象是文件路徑和名稱,系統kernel把路徑名稱解析成inode,通過inode號來訪問它代表的文件。
Mode:包含兩個數據,文件類型(普通文件/目錄/字元設備/塊設備/符號鏈接/管道)和用戶訪問許可權信息(0660)。
Ownerinfo:文件屬組信息。
Size:文件長度,單位是byte。
Timestamps:文件訪問和修改的時間戳。
Linkscount:這個項在上圖中沒有體現,它記錄了這個inode存在多少個鏈接,創建新文件時,其inode的linkscount應該為1,文件被刪除後,這個inode的linkscount就變為0。
DataBlocks:指向真實的文件數據塊,因為大文件可能會分配很多的block,直接在inode中保存所有的數據塊指針將會比較困難,也會浪費掉很多空間,畢竟系統中大文件的數量是佔少數的,所以設計了間接塊指針(Indirectblocks)和二級塊指針(Doubleblocks)來指向真實數據塊。
實際上還應該包含了inode號。
目錄
在Ext2fs中,目錄被看做一種特殊文件,也用一個inode來描述,目錄的datablock中保存了目錄下的所有內容,每條內容叫做一個entry,結構如下:
每條entry都保存了inode號、entry的長度、文件名長度、文件類型,並且都是4位元組對齊。
特別地,每個目錄下有兩個特殊的子目錄,'.'和'..',分別代表當前目錄和上一級目錄,這兩個目錄文件其實是硬鏈接。其中'..'有一個重要的作用:FSchecker(可以把文件系統umount後手動執行e2fsck看看)在檢查文件系統的時候,就會使用』..『來檢查目錄是否可以追溯到掛載根目錄,如果檢查失敗,目錄便會被鏈接到掛載根目錄下面的lost+found。
鏈接
為了方便系統內文件共享,Linux支持了兩種基本的鏈接文件:硬鏈接和軟鏈接(也叫符號鏈接)。
硬鏈接並不是一個獨立的文件,不佔用inode,只是在目錄下創建了一條entry,其中inode號保存的是目標文件的inode號,訪問硬鏈接時,文件系統通過inode將訪問操作重定向到目標文件,實現了文件共享,所以硬鏈接就是多個文件名直接指向同一個inode,用stat命令也能看到其inode號就是目標文件的inode號,它的特點:
不能跨文件系統。
目標文件必須先存在(inode存在且linkcount不為0)。
只能對普通文件創建硬鏈接,目錄不行。
刪除一個硬鏈接文件並不影響其他有相同inode號的文件。
軟鏈接是一個獨立的文件,擁有自己的inode,其數據塊存放的是目標文件的名稱,訪問軟鏈接時,kernel先訪問軟鏈接的內容,拿到目標文件名,並重新啟動路徑解析,獲取到目標文件inode號再向文件系統發起訪問。軟鏈接的特點:
可以跨文件系統。
文件和目錄都可以。
可對不存在的文件或目標創建軟鏈接。
軟鏈接有自己文件屬性和許可權。
創建軟鏈接時,鏈接計數i_nlink不會增加;
刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接被稱為死鏈接(即danglinglink,若被指向路徑文件被重新創建,死鏈接可恢復為正常的軟鏈接)。
軟鏈接的目標文件也可以是軟鏈接,其解析過程是遞歸的。
注意:軟鏈接創建時目標文件的路徑指向使用絕對路徑比較好,使用相對路徑創建的軟鏈接被移動後該軟鏈接文件將成為一個死鏈接,因為鏈接數據塊中記錄的也是相對路徑指向。
下面這個圖清晰描述了硬鏈接和軟連接之間的區別:
Ext2fs基本結構
在創建文件系統的時候,Ext2fs將設備(磁碟或者分區)劃分成1K、2K或者4K的block,然後通過Blockgroup來管理,Ext2fs/Ext3fs/Ext4fs的結構差不多(Ext2fs主要是少了日誌功能相關的內容),大致如下圖所示:
SuperBlock
SuperBlock是文件系統最重要的數據,它從設備開始位置偏移1024位元組的地方開始存儲,佔用1個block。如果block的大小是1KB,那麼SuperBlock就存放在block-1。如果block的大小是4KB,那Superblock就存放在block-0。
在Ext2fs的第一個版本(reverson0),每個BlockGroup都會存儲一份SuperBlock的一份副本,因為對空間浪費比較嚴重,後來的版本就只在部分BlockGroup(0、1、3、5、7、9這幾個group)中保留了SuperBlock的副本,在這幾個Group,和SuperBlock一起備份的還有GroupDescriptor。當然,如果沒有這么多Group,副本數量自然更少,在後面的demo中也可以看出來。其中Group-0中的SuperBlock叫作PrimarySuperBlock,文件系統被mount時,VFS讀取的也正是這份。
SuperBlock裡面的具體數據包括:
inode和block的總數,以及還有多少未分配。
每個BlockGroup有多少個inode和block。
文件系統唯一身份標識符(UUID),每個設備上的文件系統UUID都不一樣。
...
GDT
GroupDescriptorTable,GDT在文件系統中的layout緊跟Superblock後面,是文件系統第二關鍵的數據,它主要用於存放所有BlockGroup的信息:
Ext2fs為GDT預留了一部分空間,用於文件系統擴容。
通過冗餘提高了文件系統可靠性:在多個group中保存了關鍵數據的冗餘副本,包括superblock、GDT,當這些關鍵數據損壞的時候,很容易從這些冗餘副本中恢復。
提升性能:分成group後,inodetable和datablock之間的」距離「變近了,在執行I/O時,可能會減少磁頭定址的時間。
註:實際上inodesize,每個group中的block數等參數都可以在創建文件系統的時候指定,具體命令參數參考manpage。
Ext2fs的性能優化
為了提升I/O性能,Ext2fs內核代碼也做了很多設計,其中有兩個關鍵的技術:
提前讀:當必須讀取一個塊時,內核代碼在幾個連續的塊上請求I/O。通過這種方式,它試圖確保要讀取的下一個塊已經載入到緩沖區緩存中。提前讀通常在文件的連續讀取期間執行,Ext2fs將它們擴展到目錄讀取,可以是顯式讀取(readdir(2)調用),也可以是隱式讀取(namei內核目錄查找)。
預分配:在將數據寫入文件時,Ext2fs在分配新塊時預先分配最多8個相鄰塊。具體預分配多少個塊取決於blocksize:blocksize=1KB,每次預分配2個block;blocksize=2KB,每次預分配4個block;blocksize=4KB,每次預分配8個block。當然,對於用touch創建的空文件是不會預分配block的。即使在非常滿的文件系統上,預分配命中率也只有75%左右。這種預分配在負載較大的情況下可以獲得良好的寫性能,同時它還允許將連續的塊分配給文件,從而加快未來的順序讀取。
下面是Ext2fs、Ext3fs和Ext4fs的一個簡單對比:
只有Ext2fs的Filesystemstate是notclean,Ext3fs和Ext4fs都是clean,Ext2fs剛被以讀寫模式mount時,這個state被設置成notclean,umount或者以只讀模式mount時,state被設置成clean,啟動時文件系統根據這個狀態來決定是否要執行檢查。
Ext3fs/Ext4fs的Superblock中多了關於日誌功能的信息。
Ext4fs的每個group多了校驗和(checksum)數據。
2. util-linux是什麼軟體
Util-linux的內容
Util-linux 軟體包包含許多工具。其中比較重要的是載入、卸載、格式化、分區和管理硬碟驅動器,打開 tty 埠和得到內核消息。
安裝下列程序: agetty, arch, blockdev, cal, cfdisk, chkpexe, col, colcrt, colrm, column, ctrlaltdel, cytune, ddate, dmesg, elvtune, fdformat, fdisk, fsck.cramfs, fsck.minix, getopt, hexmp, hwclock, ipcrm, ipcs, isosize, line, logger, look, losetup, mcookie, mkfs, mkfs.bfs, mkfs.cramfs, mkfs.minix, mkswap, more, mount, namei, parse.bash, parse.tcsh, pg, pivot_root, ramsize (link to rdev), raw, rdev, readprofile, rename, renice, rev, rootflags (link to rdev), script, setfdprm, setsid, setterm, sfdisk, swapoff (link to swapon), swapon, test.bash, test.tcsh, tunelp, ul, umount, vidmode (link to rdev), whereis 和 write
簡短說明
agetty打開一個TTY埠,顯示登錄提示,執行/bin/login命令。
arch 顯示機器的體系結構信息。
blockdev在命令行中調用塊設備的ioctl。
cal顯示一個簡單的日歷。
cfdisk 處理指定設備的分區表。
chkpexe 找出多餘的可執行文件。
col 過濾來自輸入的反向行饋送內容。
colcrt預覽nroff的輸出。
colrm 在某個文件中刪除列。
column 把輸出格式化為幾列。
ctrlaltdel設置CTRL+ALT+DEL組合鍵的功能,為硬重啟或軟重啟。
cytune 查詢和修改cyclade驅動器的中斷入口。
ddate 把陽歷日期轉換為Discordian日期。
dmesg 顯示內核的啟動信息。
elvtune 調整I/O埠平衡。
fdformat 低級格式化一張軟盤。
fdisk 磁碟分區管理程序。
fsck.cramfs對Cramfs文件系統的一致性進行檢查。
fsck.minix 對MINIX文件系統的一致性進行檢查。
getopt解析命令參數。
hexmp用用戶指定的方式(包括ASCII, 十進制, 十六進制, 八進制)顯示一個文件或者標准輸入的數據。
hwclock查詢和設置硬體時鍾。(也被稱為RTC或BIOS時鍾)
ipcrm刪除一個指定的資源。
ipcs 提供IPC機制的信息。
isosize輸出iso9660文件系統的長度。
line 單行拷貝。
logger 設置系統日誌的入口。
look 顯示以某個給定字元串為開頭的行。
losetup 啟動和控制回環(loop)設備。
mcookie為xauth產生magic cookie,128位隨機數。
mkfs 在一個設備(通常是一個硬碟分區)設備上建立文件系統。
mkfs.bfs 創建 SCO bfs 文件系統。
mkfs.cramfs創建cramfs文件系統。
mkfs.minix 創建 Minix 文件系統。
mkswap 初始化指定設備或文件,以用做交換分區。
more 分屏顯示文件,但less更好用。
mount把一個文件系統從一個設備掛載到一個目錄。
namei 顯示指定路徑的符號鏈接。
pg顯示文本文件內容,一次顯示一屏。
pivot_root 使某個文件系統成為當前進程的根文件系統。
ramsize 顯示或者改變內存虛擬盤的大小。
rdev 查詢和設置內核的根設備和其他信息。
readprofile顯示/proc/profile文件的信息。
rename對文件重命名。
renice修改正在運行進程的優先順序。
rev 顛倒一個文件每行字元的順序。
rootflags在掛載根設備時,查詢和設置額外的信息。
script 為終端會話過程建立一個typescipt文件,記錄會話過程中終端的輸出。
setfdprm設置軟盤參數。
setsid 在一個新的會話過程中運行程序。
setterm 設置終端屬性。
sfdisk磁碟分區表管理工具。
swapdev 能在啟動內核中設置交換分區設備。
swapoff取消對指定交換設備和交換文件的使用。
swapon 使指定的交換設備和交換文件生效。
tunelp設置列印設備的參數。
ul 加下劃線。
umount卸載一個被掛載的文件系統。
vidmode查詢和設置視頻模式。
whereis確定某命令二進制文件,源文件和手冊文檔的位置。
write發一個消息給另一個用戶,如果他開啟了writting的話。
Util-linux 安裝依賴關系
Util-linux 依賴於: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses, Sed, Zlib