5.1 根文件系統(tǒng)
眾所周知,在一塊新的硬盤中安裝系統(tǒng)前必須要先分區(qū)并且格式化,然后才能裝系統(tǒng)。
對于windows來說,分區(qū)完成以后,每個分區(qū)都是一個獨立的文件系統(tǒng)。也就意味著C盤和D盤是毫無關系的。訪問時也是各自獨立的。
對于linux來說,所有的文件在linux主機上,若想使其能夠被訪問到,站在邏輯結構視角上看,它必須從一個稱為根文件系統(tǒng)的位置開始,但是并不是說所有文件必須從根開始就不需要分區(qū)了,并非如此。為了能夠實現(xiàn)多個文件系統(tǒng)獨立管理必須要進行分區(qū)。但是任何一個分區(qū)在分區(qū)完以后,不可以被獨立訪問,而是只能夠與現(xiàn)有的根一起被訪問。
當內核被啟動加載完成以后,其不提供任何多余的可供用戶訪問的文件,同時其也不是可供用戶直接使用的有用的進程。所以內核必須要能夠啟動很多外部命令,包括shell程序、各種GUI或者CLI接口等等。而這些命令通常一般都是放在某一分區(qū)之上。但是系統(tǒng)中有那么多分區(qū),內核應該識別哪一個呢?為了避免這種選擇上的困難,一般來說,無論分成多少個分區(qū),一定有一個作為系統(tǒng)盤的分區(qū)存在,而這個系統(tǒng)盤分區(qū)通常是內核啟動完以后第一個要加載的分區(qū)。
如上圖所示,假設A分區(qū)是系統(tǒng)盤分區(qū),內核認為A分區(qū)是其必須第一個要加載的分區(qū),于是當內核啟動完以后,為了能夠幫助啟動各種外圍的其他程序,內核會自行在自己的工作空間中設置一個路徑,把它稱作根。然后把A(系統(tǒng)盤)分區(qū)上的所有內容直接關聯(lián)到根上。這也就意味著,如果要通過根路徑來訪問的任何文件其實都是在A分區(qū)上的文件。
對于Linux來說,內核所能識別的第一個且必須第一個加載的文件系統(tǒng)就稱作根文件系統(tǒng)(rootfs)。
一旦A分區(qū)被內核認為是第一個要加載的分區(qū),那么B分區(qū)、C分區(qū)、D分區(qū)如何被訪問到?在windows中,A分區(qū)、B分區(qū)、C分區(qū)、D分區(qū)都是獨立的,想訪問哪個分區(qū)就直接去訪問。而在linux中,除A(系統(tǒng)盤)分區(qū)以外的任何分區(qū)要想被訪問到,必須與現(xiàn)有的根文件系統(tǒng)建立關聯(lián)關系。
5.2 常見的文件系統(tǒng)
常見的文件系統(tǒng)有以下這些:
Linux文件系統(tǒng):ext2、ext3、ext4、xfs、btrfs、reiserfs、jfs、swap
swap:交換分區(qū)
iso9660:光盤文件系統(tǒng)
ext4:centos6主流的文件系統(tǒng)
btrfs:centos7自帶的文件系統(tǒng)
xfs:centos7上推薦使用的文件系統(tǒng)
Windows文件系統(tǒng):fat32、ntfs
Unix文件系統(tǒng):FFS、UFS、JFS2
網絡文件系統(tǒng):NFS、CIFS
集群文件系統(tǒng):GFS2、OCFS2
分布式文件系統(tǒng):ceph、moosefs、mogilefs、Glusterfs、Lustre
根據(jù)其是否支持“Journal”功能又分為以下2種文件系統(tǒng):
日志型文件系統(tǒng):ext3、ext4、xfs、...
日志型文件系統(tǒng)存儲時先在日志區(qū)寫元數(shù)據(jù),如果發(fā)生斷電,可以通過日志進行恢復
非日志型文件系統(tǒng):ext2、vfat
非日志型文件系統(tǒng)存儲時直接在元數(shù)據(jù)區(qū)寫元數(shù)據(jù),一旦斷電,沒寫完的數(shù)據(jù)將損壞且無法恢復
文件系統(tǒng)的組成部分:
內核中的模塊:ext4、xfs、vfat等;
用戶空間的管理工具:mkfs.ext4、mkfs.xfs、mkfs.vfat等
從上面的信息就可以看出來,Linux支持眾多的文件系統(tǒng),而每一個文件系統(tǒng)的調用接口又是不一樣的,這對程序員來說就頭疼了,如此多的文件系統(tǒng),若想針對某文件系統(tǒng)進行編程,就必須了解眾多文件系統(tǒng)的調用接口,這樣一來就使得編程的難度大大增加。而事實上,程序員面對的并不是ext2等這類文件系統(tǒng) ,而是虛擬文件系統(tǒng)(VFS)。VFS把所有文件系統(tǒng)不同的各種調用機制統(tǒng)一在同一個調用接口上了。所以程序員不管系統(tǒng)被格式化成什么格式的,只要支持VFS,就可以直接調用VFS接口,由VFS去轉換成對特定類型的文件系統(tǒng)接口的調用。Linux眾多的文件系統(tǒng)中,只要遵循POSIX文件系統(tǒng)規(guī)范的一般都能夠被VFS所兼容。
/proc/filesystems:當前內核支持的文件系統(tǒng)類型有哪些
文件前面沒有nodev的表示是正在使用的文件系統(tǒng)
文件系統(tǒng)的配置文件/etc/fstab:
OS在初始時,會自動掛載此文件中定義的每個文件系統(tǒng)。這個文件的內容格式為:
要掛載的設備 掛載點 文件系統(tǒng)類型 掛載選項 轉儲頻率 文件系統(tǒng)檢測次序(只有根可以為1)
要掛載的設備可以有以下幾類:
設備文件:/dev/sda5
卷標:LABEL=""
UUID:UUID=""
偽文件系統(tǒng)名稱:proc、sysfs、devtmpfs、configfs
掛載點的要求:
a) 此目錄沒有被其它進程使用
b) 目錄必須事先存在
c) 目錄中原有的文件將會暫時隱藏,卸載后可見
轉儲頻率:每多少天做一次完全備份,0表示不備份,1表示每天備份,2表示每2天備份1次
注意:swap分區(qū)的掛載點和文件系統(tǒng)類型都是swap。如果要讓文件系統(tǒng)自動掛載的同時啟用某功能,比如要啟用acl功能,只需要在掛載選項defaults后面加上,acl即可,如defaults,acl
5.3 ext文件系統(tǒng)的布局結構
5.3.1 數(shù)據(jù)區(qū)布局結構
任何一個文件系統(tǒng)都由數(shù)據(jù)和元數(shù)據(jù)組成,這里以ext系統(tǒng)文件系統(tǒng)為例。
如上圖,數(shù)據(jù)區(qū)(數(shù)據(jù)空間)會被劃分為一個個的塊組,而每個塊組當中又包含了超級塊、塊組描述符(GDT)、塊位圖(block bitmap)、Inode位圖(inode bitmap)、Inode表(inode table)和數(shù)據(jù)塊(data blocks)。
每個塊組有多少個塊取決于塊的大小,為了方便定位塊組中的塊于是定義了一個超級塊
超級塊可以有多個備份,其內容如下:
當前文件系統(tǒng)類型;
當前文件系統(tǒng)包含多少個inode;
當前文件系統(tǒng)共有多少個塊;
當前文件系統(tǒng)每個塊的大小;
空閑磁盤塊、引用磁盤塊、空閑inode、引用inode
使用tune2fs -l /dev/sda1命令可以看/dev/sda1的超級塊信息。
塊組描述符表(GDT)可以有多個備份,其內容如下:
當前系統(tǒng)一共有多少個塊組
每個塊組從第幾個塊開始到第幾個塊結束
使用dumpe2fs /dev/sda1命令不僅可以看到/dev/sda1文件系統(tǒng)的超級塊信息,還可以看到塊組描述符的信息。
5.3.2 元數(shù)據(jù)區(qū)
元數(shù)據(jù)區(qū)包含以下內容:
Inode表(存儲inode)
Inode bitmap(索引位圖)
Block bitmap(塊位圖)
能夠存儲單個文件所有屬性信息并以特定格式組織的存儲空間就稱為Inode。
Inode就是索引節(jié)點(Index node)。Inode包含以下內容:
文件/目錄的大小;
時間戳;
權限;
屬主、屬組;
地址指針:文件使用了哪些塊存儲數(shù)據(jù),用指針指向對應的數(shù)據(jù)塊的編號
直接指針(直接指向數(shù)據(jù)塊)
間接指針(指向另一個位置,另外一片連續(xù)的區(qū)域,象擴展分區(qū)一樣)
三級指針
訪問任何一個文件都要先找到其對應的inode,通過inode知道該文件的數(shù)據(jù)存儲在哪些塊中,然后找到對應的塊。
硬盤中的大多數(shù)塊必須有其編號,并能夠被inode引用,才可以正常使用。
為了實現(xiàn)inode的快速存儲,元數(shù)據(jù)區(qū)在格式化完成以后就已經把inode整個區(qū)間分好了,每個inode塊的大小是固定的,只不過這些inode是空閑的,沒被使用的。
假設一個文件系統(tǒng)有100萬個inode,那么如何區(qū)分inode是否空閑呢?
我們假設每一個inode的前面有一個標志位,1表示已經使用,0表示空閑。當要使用時就必須全局掃描,找到第一個空閑的inode,然后把要存儲inode信息填充其中。
再假設數(shù)據(jù)區(qū)的每一個block塊的前面也有一個標志位,1表示已經使用,0表示空閑。當要使用時也必須全局掃描,找到第一個空閑的block塊,然后把數(shù)據(jù)填充其中并建立與對應inode的映射關系。
假設一個文件很大,可能需要多個block塊存儲其數(shù)據(jù),就必須為其分配多個連續(xù)的空閑塊來存儲,并將已使用的block的標志位設為1;
假設一個文件很小,可能1個block塊就可以存儲其數(shù)據(jù),就把其余多余的block標志位設為0
5.3.4 位圖索引
想一個問題,如果硬盤有100G,為了找一個空閑塊就要全盤掃描一遍,這樣的方式太低效了,為了解決這個問題于是就有了二級索引。
由于inode的量很大,從中找一個空閑的inode會很慢,這時候可以找一個連續(xù)的存儲空間,對inode做一個對位標識索引,第0位對應編號為0的inode編號,第1位對應編號為1的inode編號,以此類推。有N個二進制位,如果這個位為1表示這個對應的inode已被使用,這個位為0表示其對應的Inode空閑。當要創(chuàng)建inode時,就不用再全盤掃描了,只需要掃描這個二級索引(對位標識索引),如此一來,效率就大大提高了。而這個二級索引就是inode位圖索引(inode bitmap)。數(shù)據(jù)區(qū)以同樣的原理就有了塊位圖(block bitmap)
inode bitmap:對位標識每個inode空閑與否的狀態(tài)信息
如果整盤進行管理,假設整盤有100萬個塊,100萬個塊掃描一遍也挺耗時間的。所以無論是inode位圖還是block位圖,都不是全文件系統(tǒng)管理的,而是塊組管理的。
5.3.5 文件訪問過程
a) 查索引節(jié)點(Inode)
b) 在索引節(jié)點中找到磁盤塊的編號
c) 在數(shù)據(jù)區(qū)找到對應的磁盤塊
5.3.6 目錄
文件訪問時要先查inode,但是inode表中包含很多的inode,如何確定文件對應的Inode是哪個呢?這就是目錄的作用。
目錄也是一個文件,存在數(shù)據(jù)區(qū)的一個塊中,目錄實質上就是一個路徑映射。
目錄中存儲著以下內容:
a) 一級目錄下所有的文件名列表
b) 一級目錄下所有文件對應的inode編號
5.3.7 文件創(chuàng)建
a) 在元數(shù)據(jù)區(qū)找一個空閑的inode塊存儲inode信息
b) 在數(shù)據(jù)區(qū)找一個或一些空閑的block塊,并將其與inode建立映射關系
c) 把數(shù)據(jù)填充至這些block塊中
d) 把標志位設為1(正在使用中的狀態(tài))
5.3.8 硬鏈接
多個文件指向同一個inode,稱之為硬鏈接。這些文件名稱可相同也可不同,不能鏈接不同文件系統(tǒng)的文件。
硬鏈接特點:
a) 只能對文件創(chuàng)建,不能應用于目錄;
b) 不能跨文件系統(tǒng);
c) 創(chuàng)建硬鏈接會增加文件被鏈接的次數(shù)
5.3.9 軟鏈接
軟鏈接又叫符號鏈接,這個文件包含了另一個文件的路徑名。可以是任意文件或目錄,可以鏈接不同文件系統(tǒng)的文件。
軟鏈接特點:
a) 可應用于目錄;
b) 可以跨文件系統(tǒng);
c) 不會增加被鏈接文件的鏈接次數(shù);
d) 其大小為指定的路徑所包含的字符個數(shù)
創(chuàng)建軟鏈接:
ln [-s -v] SRC DEST
5.4 btrfs文件系統(tǒng)
5.4.1 btrfs文件系統(tǒng)介紹
btrfs文件系統(tǒng)自centos7后開始支持。
Btrfs(B-tree,Butter FS,Better FS),遵循GPL規(guī)范,由Oracle自2007年開始研發(fā)。
Btrfs文件系統(tǒng)的核心特性:
a) 支持寫時復制機制(CoW):復制、更新及替換指針,而非傳統(tǒng)的“就地”更新
假設要修改一個文件,寫時復制機制就是先把這個文件復制一個副本出來,然后對這個副本進行修改,修改完以后將文件名的指針由指向原文件改為指向這個副本。
如此一來,原文件還在內存中,若副本修改有誤還可以通過恢復指針指向的方法還原成原文件
b) 多物理卷支持
btrfs可由多個底層物理卷組成,支持RAID,以聯(lián)機“添加”、“移除”、“修改”
c) 支持數(shù)據(jù)及元數(shù)據(jù)校驗碼機制(CheckSum)
存儲文件時,會將元數(shù)據(jù)的校驗碼和數(shù)據(jù)的校驗碼通過文件某些屬性擴展給保存下來。因此文件讀取時可以很方便、快速的去檢測文件是否受損,一旦受損還會自動嘗試進行修復
d) 支持子卷(sub_volume,相當于ext系列文件系統(tǒng)的lvm/lvm2)
可以將多個底層的物理設備(硬盤)組織成btrfs文件系統(tǒng),這個btrfs文件系統(tǒng)可以直接掛載使用,也可以在內部創(chuàng)建子卷(就像在VG中創(chuàng)建LV一樣)
e) 支持快照(快照是子卷的一個非完全副本,基于CoW機制實現(xiàn)的另外一個存儲空間剛開始為0的一個卷)
btrfs文件系統(tǒng)直接支持快照,而ext3/ext4要想支持快照必須使用lvm2來實現(xiàn)
可以針對單個文件做快照,也可以針對卷做快照
還支持對做好的快照再做一次快照,做累積性快照。類似于實現(xiàn)增量備份
f) 支持透明壓縮機制
當要存儲一個很大的文件,但又想節(jié)約空間的時候,可以把任何數(shù)據(jù)流發(fā)往btrfs文件系統(tǒng)時,自動能夠通過占據(jù)CPU時鐘周期完成數(shù)據(jù)壓縮以后存放,對用戶來說這個過程是透明的。在讀取這些壓縮后存放的文件時,能夠自動解壓縮。
有一個缺陷:壓縮和解壓縮會占據(jù)更多的時鐘周期
Btrfs主要設計目標是取代Linux早期一直使用的ext3、ext4,但事實上在ext3、ext4的缺陷暴露之后,在centos6上就提供了另外一種可用的文件系統(tǒng)(xfs)。
5.4.2 btrfs文件系統(tǒng)的實現(xiàn)
mkfs.btrfs:創(chuàng)建btrfs文件系統(tǒng)
-L|--label <name>:指定卷標
-m|--metadata <profile>:指明元數(shù)據(jù)如何存放
Valid values are raid0,raid1,raid5,raid6,raid10,single or dup
-d|--data <type>:指明數(shù)據(jù)如何存放
Valid values are raid0,raid1,raid5,raid6,raid10 or single
-O|--features <feature1>[,<feature2>...]:在格式化時直接開啟指定的功能
A list of filesystem features turned on at mkfs time.Not all features are supported by old kernels.
To see all features run
mkfs.btrfs -O list-all
常用的btrfs文件系統(tǒng)的命令:
btrfs:管理btrfs文件系統(tǒng)
btrfs filesystem show [--mounted|--all-devices|<uuid>] #顯示btrfs文件系統(tǒng)信息 btrfs filesystem sync <path> #強制把指定btrfs文件系統(tǒng)緩存在內存中的數(shù)據(jù)同步到硬盤中 btrfs filesystem df <path> [<path>...] #查看已掛載的btrfs文件系統(tǒng)空間使用率 btrfs filesystem defragment [options] <file>|<dir> [<file>|<dir>...] #消除磁盤碎片 btrfs filesystem resize [devid:][+/-]<size>[gkm]|[devid:]max <path> #修改文件系統(tǒng)大小 btrfs filesystem label [<device>|<mount_point>] [<newlabel>] #顯示或更新btrfs文件系統(tǒng)卷標
掛載btrfs文件系統(tǒng):
mount -t btrfs /dev/sdb MOUNT_POINT #/dev/sdb這個位置只要是btrfs文件系統(tǒng)的底層物理卷之一,隨便寫哪個物理卷名均可
透明壓縮機制:
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT
btrfs-convert:實現(xiàn)無損地將ext系列的文件系統(tǒng)動態(tài)轉換成btrfs文件系統(tǒng)或將btrfs文件系統(tǒng)降級為ext系列的文件系統(tǒng)
btrfsck:實現(xiàn)文件系統(tǒng)的檢測
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
本文題目:第五章文件系統(tǒng)-創(chuàng)新互聯(lián)
本文地址:http://www.chinadenli.net/article38/dijipp.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站排名、定制開發(fā)、網站內鏈、手機網站建設、微信小程序、App開發(fā)
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容