4.Linux磁碟與檔案系統管理
目錄
1.硬碟的基礎知識
分割槽的概念:
分割槽從實質上說就是對硬碟的一種格式化。當我們建立分割槽時,就已經設定好了硬碟的各項物理引數,指定了硬碟主引導記錄(即 MasterBootRecord,一般簡稱為 MBR)和引導記錄備份的存放位置。而對於檔案系統以及其他作業系統管理硬碟所需要的資訊則是通過以後的高階格式化,即 Format 命令來實現。面、磁軌和扇區硬碟分割槽後,將會被劃分為面(Side)、磁軌(Track)和扇區(Sector)。需要注意的是,這些只是個虛擬的概念,並不是真正在硬碟上劃軌道
MBR簡介:
MBR(Main Boot Record 主引記錄)位於整個硬碟的 0 磁軌 0 柱面 1 扇區。不過,在總共 512 位元組的主引導扇區中, MBR 只佔用了其中的 446 個位元組,另外的 64 個位元組交給了DPT(Disk Partition Table 硬碟分割槽表),最後兩個位元組“55, AA”是分割槽的結束標誌。這個整體構成了硬碟的主引導扇區。
分割槽的原理:
主引導記錄由三部分組成:一部分是 446byte 的作業系統引導程式碼(MBR),還有一部分是 64byte 的主分割槽表(DPT)。
主分割槽表最多記錄四個主分割槽的分割槽資訊.每個分割槽佔用 16byte.分割槽就是修改分割槽表,它不影響硬碟上的存
儲的資料。最後的 2 位元組是結束標誌。
擴充套件技術:需要將一塊硬碟分成更多的分割槽,超過 5 個以上的分割槽,可以將最多四個主分割槽中的一個分
區型別改為擴充套件分割槽,然後在擴充套件分割槽中再建邏輯分割槽。邏輯分割槽的分割槽資訊儲存在擴充套件分割槽之中,叫做擴
展分割槽表。理論上邏輯分割槽沒有個數的限制。擴充套件分割槽不能被直接使用,必須將其劃分為若干個邏輯分割槽。
邏輯分割槽的起始位置的資訊都寫在擴充套件分割槽表裡面。邏輯分割槽的分割槽編號從 5 開始,如: /dev/hda5 是第一
塊硬碟的第一個邏輯分割槽。
格式化原理:
分好區的硬碟分割槽上面什麼資料也沒有,作業系統也不能讀寫,為了讓作業系統能夠識別必須向分割槽中預寫入一定格式的資料。這個過程就稱之為格式化。在 Linux 中稱為建立檔案系統。沒有分割槽的硬碟是不能格式化的,沒有格式化的分割槽是不能直接被使用的。所以分割槽和格式化往往都是同時進行的。
現在我們已經大概知道了一個硬碟的結構,當我們新買來一塊硬碟時,必須經過分割槽和格式化才能進行使用,下面用簡圖表示一下一個硬碟的結構:
superblock:記錄此 filesystem 的整體資訊,包括 inode/block 的總量、使用量、剩餘量, 以及檔案系統的格式與相關資訊等。
inode:記錄檔案的屬性,一個檔案佔用一個 inode,同時記錄此檔案的資料所在的 block 號碼。
block:實際記錄檔案的內容,若檔案太大時,會佔用多個 block。
注意:
1.inode 與 block 都有編號,而每個檔案都會佔用一個 inode ,inode 內則有檔案資料放置的block 號碼,如果能找到檔案的inode 就可以找到檔案。
2.在inode記錄一個檔案需要128位元組大小的記憶體
2.Linux的EXT2檔案系統(inode)
為什麼需要使用EXT2檔案系統?
如果我的檔案系統高達數百 GB 時, 那麼將所有的 inode 與 block 通通放置在一起將是不理智的決定,因為 inode 不 block 癿數量太龐大,不容易管理。
因此 Ext2 檔案系統在格式化的時候基本上是區分為多個區塊群組 (block group) 的,每個區塊群組都有獨立的 inode/block/superblock 系統。
簡圖如下:
Superblock (超級區塊):Superblock(大小為1024byte) 是記錄整個 filesystem 相關資訊的地方,它記錄的資訊有如下:
- block與inode的總量
- 未使用和已經使用的inode/block的數量
- block和inode的大小(inode 固定為128byte,block可選,1k,2k,4k)
- 記錄最近檔案系統建立時間,操作時間的詳細資訊
- 記錄此檔案系統書否被掛載,vaild bit數值為1表示未掛載,0表示掛載。
Filesystem Description (檔案系統描述說明)
- 記錄每個block group從開始到結束的block的號碼,以及說明每個區段 (superblock,bitmap, inodemap, data block) 分別位於哪一個 block 號碼之間。
block bitmap (區塊對照表):
- 就像是一張表記錄的是,使用和未使用的block,以便系統呼叫,如果一個檔案刪除,它所佔的block的區對照表也會被清除,這樣block就會空出來。
inode bitmap (inode 對照表):
- 記錄使用和未使用的inode號碼。
data block (資料區塊) :
data block 是用來放置檔案內容資料地方,在 Ext2 檔案系統中所支援癿 block 大小有 1K, 2K 及 4K三種而已。在格式化時 block 的大小就固定了,且每個 block 都有編號,以方便 inode的記錄。
需要解決的問題:單個檔案儲存資料大小的限制
按照這種邏輯方式,一個inode可以記錄最大的檔案就是為128k,但是實際情況卻不是這樣,在我們現在的系統中,有很多的檔案都是大於128k的,如何解決這個問題呢?
為此我們的系統聰明的將 inode 記錄 block 號碼的區域定義為 12 個直接,一個間接, 一個雙間接不一個三間接記錄區。
在EXT2檔案系統中,就把Inode區分如上圖所示:
直接記錄區:裡面有12個直接指向block的對照,儲存的是真正儲存檔案的block的編號,而儲存一個block需要的位元組數是4個位元組,共佔用這個Inode的12*8=48位元組。可以記錄的容量是:12*4kb=48k
間接記錄區:一個間接記錄區其實也就是4個位元組的大小,他不是真正存放檔案的地方,它存放的是真正資料存放的block,比如設定這個block是4kb大小的,那麼
雙間接記錄區:一個block的大小仍然設定為4k,那麼
三間接記錄區:可以存放當個檔案資料的最大容量是:1024*1024*1024*4=4T的大小
例子:
檢視一個檔案的inode編號:
使用命令:ls -i 檔名
檢視檔案處於哪些block之間:
使用命令:filefrag -v 檔名
查詢系統目前掛載的裝置:df
語法:
df [選項] [目錄或者檔案]
選項:
選項 | 含義 |
-a | 列出所有的檔案系統,包括系統特有的/proc |
-k | 以kByte的容量顯示各檔案系統 |
-m | 以Mbyte的容量顯示各檔案系統 |
-h | 以人類適合看的格式顯示 |
-H | 以M=1000k取代M=1024k的進位方式 |
-T | 連同partition的filesystem名稱也列出 |
-i | 不使用硬碟容量,而以inode的數量顯示 |
使用命令:df
檢視掛載點的詳細資訊:
使用命令: dumpe2fs [選項] 裝置檔名
選項:
選項 | 含義 |
-b | 列出保留為壞軌的部分 |
-h | 僅列出superblock的資料 |
例子:
檢視/dev/sda1裝置的詳細資訊:
Superblock的內容:
block group的資訊:
3.日誌檔案系統(Journaling filesystem)
該區塊與門在記錄寫入或修訂檔案時的步驟
1. 預備:當系統要寫入一個檔案時,會先在日誌記錄區塊中記錄某個檔案准備要寫入的資訊;
2. 實際寫入:開始寫入檔案的許可權與資料;開始更新 metadata 的資料;
3. 結束:完成資料與 metadata 的更新後,在日誌記錄區塊當中完成該檔案的記錄。
功能是什麼呢?
在這樣的程式當中,萬一資料的執行過程當中發生了問題,那麼我們的系統只要去檢查日誌記錄彔區塊,就可以知道哪個檔案發生了問題,針對該問題來做一致性的檢查即可,而不必針對整塊 filesystem 去檢查, 這樣就可以達到忚速修復 filesystem 的能力了.
注意:ext3檔案系統相比ext2檔案系統就多了一個日誌檔案系統的功能。
4.檔案系統管理
1.檢視資料夾大小
語法 :
du [選項] [檔案或目錄名稱]
選項:
選項 | 含義 |
-a | 列出所有de 檔案與目錄容量,因為預設僅統計目錄底下的檔案量而已。 |
-h | 以人們較易讀的容量格式 (G/M) 顯示; |
-s | 列出總量而已,而不列出每個各別癿目錄佔用容量 |
-S | 不包括子目錄下癿總計,與 -s 有點差別 |
-k | 以 KBytes 列出容量顯示 |
-m | 以 MBytes 列出容量顯示 |
2.實體連結與符號連結:ln
Symbolic Link (符號連結,亦即是快捷方式)
軟連結,就是window系統的快捷方式
在命令列建立一個軟連線的方式是,使用命令 ln:
語法:
ls [選項] 來原始檔 目標檔案
選項:
選項 | 含義 |
-s | 如果不加任何引數就進行連結,那就是 hard link(硬連結),至於 -s 就symbolic link(軟連結) |
-f | 如果 目標檔案 存在時,就主動的將目標檔案直接移除後再建立 |
例子:
建立一個檔案test,然後建立它的軟連結test01
Hard Link (實體連結, 硬式連結或實際連結)
在前面的磁碟管理中,我們已經知道,每個檔案會佔用一個inode來記錄,想要讀取該檔案,必項要經過目錄記錄的檔名來指向到正確的 inode 號碼才能讀取檔案。
例子:複製一個services資料夾到 /mnt然後檢視他的硬連結數
在 /mnt 下複製一個services檔案,命名為,copy01
現在把 copy01刪除,然後給services做一個硬連結:連結到copy02
小結:也就是說同一個檔案有幾個inode,也就是這個檔案有幾個名字。
注意事項,硬連結是不能誇分割槽使用的:
5.磁碟分割槽:
相關命令語法:
fdisk [選項] 裝置名稱
選項:
選項 | 含義 |
-l | 輸出後面接的裝置所有的 partition 內容。若僅有 fdisk -l 時,則系統將會把整個系統內能夠搜尋到的裝置的 partition 均列出來 |
例子:
檢視系統的硬碟以及分割槽資訊:
如果系統有多塊硬碟的話可以可以分開檢視,比如現在有一塊硬碟,裝置名為: /dev/sda
使用命令: fdisk -l /dev/sda ,看到的結果和上邊是一樣的,因為只有一塊硬碟。
對磁碟進行分割槽,分割槽之前先搞懂一個概念,當我們分割槽的時候不是對分割槽進行分割槽,而是對一塊硬碟進行分割槽,比如說上面的硬碟只有一塊,那就是 : /dev/sda 。
現在開始操作,對硬碟 /dev/sda 進行分割槽:
使用命令: fdisk /dev/sda
Command (m for help): m <== 輸入 m 後,就會看到底下這些指令介紹
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition <==刪除一個 partition(分割槽)
l list known partition types
m print this menu
n add a new partition <==新增一個 partition
o create a new empty DOS partition table
p print the partition table <==在螢幕上顯示分割表
q quit without saving changes <==不儲存離開 fdisk 程式
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit <==將剛剛得動作寫入分割表
x extra functionality (experts only)
列印一下分割槽的個數,用引數p
建立一個新的分割槽,用引數:n ,詢問建立一個是主分割槽還是擴充套件分割槽,通過前面的對磁碟的瞭解,知道主分割槽只能有4個主分割槽,如果分割槽的個數大於4個,那麼就需要使用擴充套件分割槽,然後使用擴充套件分割槽,然後再擴充套件分割槽內新建邏輯分割槽(邏輯分割槽的碟符號預設從5開始(比如: /dev/sda5 .....)):
因為現在只有三個主分割槽,所以還是可以新建一個主分割槽的,直接使用引數,p ,再建立一個主分割槽,系統型別是Linux
改變分割槽的系統型別,使用引數: t
刪除一個分割槽:使用引數 : d
新建一個擴充套件分割槽:先使用引數:n ,再使用引數 : e
現在磁碟劃分如下所示,而擴充套件分割槽還可以繼續劃分分割槽,稱為邏輯分割槽(編號從5開始):
建立邏輯分割槽:
儲存並退出,使用命令:w,直接退出不儲存更改:q。
現在我儲存這個更改,使用引數:w
注意儲存了之後,需要去更新分割槽表,只需去跟新修改的硬碟的分割槽表:
使用命令: partprobe + 裝置名稱,也就是 : partprobe /dev/sda
此時再去檢視這個硬碟,可以發現多了一個擴充套件分割槽和邏輯分割槽了:
在磁碟管理的時候提到過,單單是劃出一個分割槽是不能用的,但是想要這個分割槽,需要根據不同的檔案系統格式化後才能在檔案系統中使用這個分割槽(如EXT3檔案系統,會有superblock ,blockgroup,inode對照表,date block等東西):
6.格式化分割槽(磁碟格式化):
語法:
mkfs [選項 檔案系統格式] 裝置檔名
選項:
選項 | 含義 |
-t | 可以接檔案系統格式,例如 ext3, ext2, vfat 等(系統有支援才會生效) |
例子:
格式化:/dev/sda5分割槽,可以看到預設的block的大小是 1k=1024byte
注意:命令:mkfs -t ext3/dev/sda5 等同於 mkfs.ext3 /dev/sda
當然再格式化之前也是可以指明block的大小的,重新格式化一下:/dev/sda5分割槽
使用命令:mkfs -t ext3 -b 4096 /dev/sda5(mkfs.ext3 -b 4096 /dev/sda)
7.磁碟掛載與卸除(mount,umount)
當我們格式化了以後理論就能使用這個分割槽來儲存資料了,因為ext3檔案管理系統已經可以管理這個分割槽了,但是,必須把分割槽掛載(mount)起來才能用:
掛載點的意義:
掛載點是目錄,而這個目錄是進去磁碟分割槽槽(其實是檔案系統啦!)的入口。就比如一個房子的東西你全部建好了,但是沒有一個地方可以進去,那豈不是建的再好都是沒有意義了。
再者,在Linux的系統只有一個碟符可以使用(也就是斜槓 "/"),所以必須把分割槽掛載到這個碟符裡面才可以使用分割槽(window的碟符可以使用C-Z來表示碟符,但是當我們有很多分割槽的時候,這些碟符不夠用怎麼嗎?那就只能採用掛載的方式,把這個沒有分配碟符的分割槽掛載到已經分配碟符分割槽的目錄下(比如現在一個分割槽沒有碟符,你又想使用這個分割槽,那麼你可以掛載到:C:/mount 目錄下,那麼當你訪問mount 這個目錄的時候,其實訪問的就是這個沒有碟符的分割槽)),關鍵的一點是,Linux用於磁碟的碟符只有一個,那就是 反斜槓:"/"這個符號,所以你想使用多個分割槽,你是一定要掛在到:"/" 的目錄下才可以使用。
掛載注意事項:
- 單一檔案系統不應該被重複掛載在不同 的掛載點(目錄)中;
- 單一目錄不應該重複掛載多個檔案系統;
- 要作為掛載點的目彔,理諱上應該都是空目錄才行
7.1.掛載 :mount
語法:
mount [-t 檔案系統] [-L Label 名] [-o 額外選項] [-n] 裝置檔名 掛載點
簡單的命令: mount 外部裝置 目錄
選項引數:
選項引數 | 含義 |
-t | 與fsck相似,指定一個檔案系統型別,但是Linux可以自動分析Superblock的內容,從而分辨出檔案系統的型別,這個引數一般可以省略。 |
-a | 依照配置檔案 /etc/fatab 的資料將所有為掛載的磁碟全部掛載上來 |
-l | 單純輸入mount 會顯示目前的掛載資訊,加上 -l 可增加列Lable名稱 |
-n | 在預設情況下,系統會將實際掛載的情況實時寫入 、/etc/mtab 中,但是某些情況下不會自動寫入,比如單人維護模式,此時加上這個選項,就會寫入了。 |
-L | 系統除了利用裝置檔名(如:/dev/sda5)之外,還可以利用檔案系統的Labe進行掛載。 |
-o |
此引數後面可以接一些掛載時額外加上的引數,比如說賬號、密碼、讀取許可權等。 |
注意: -o引數的常用選項:
ro, rw: 掛載檔案系統成為叧讀(ro) 或可擦寫(rw)
async, sync: 此檔案系統是否使用同步寫入 (sync) 或非同步 (async) 的記憶體機制。
auto, noauto: 允許此 partition 被以 mount -a 自動掛載(auto)
dev, nodev: 是否允許此 partition 上,可建立裝置檔案, dev 為可允講
suid, nosuid: 是否允許此 partition含有 suid/sgid 的檔案格式
exec, noexec: 是否允許此 partition 上擁有可執行 binary(二進位制) 檔案的許可權。
user, nouser: 是否允許此 partition 讓任何使用者執行 mount 命令一般來說,mount 僅有 root 可以執行,但下達 user 引數,則可讓一般 user(使用者) 也能夠對此 partition 進行 mount 。
defaults: 預設值為:rw, suid, dev, exec, auto, nouser, and async
remount: 重新掛載,用於在系統出錯,或重新更新引數時。
例子:
按照前面的所述,我們掛載的分割槽,必須是在: "/" 目錄下的目錄才可以。
先檢視一下現在已經掛載的裝置(使用命令:df),發現 、/dev/sda5 這個分割槽還沒有掛載使用命令,把 /dev/sda5 這個裝置掛載到:/mnt/sda5 上:
例子 :
-o引數的作用
現在讓 :/dev/sda5 進行重新掛載,然後再把此分割槽設為只讀的許可權:
使用命令:mount -o remount,ro /mnt/sda5
例子:
我們知道我們所使用的,ls命令存在於 /bin/ls目錄下,執行它是顯示檔案的資訊,現在我們將它拷貝到 、/mnt/sda5這個資料夾,也就是此分割槽上,如果不加上特殊的許可權,是可以正常的執行 ls 這個檔案的,但是給它重新掛載,然後然他沒有可執行許可權,試一下結果是什麼:
7.2.卸除裝置:umount
語法:
umount [選項] 裝置檔名或掛載點
選項:
選項 | 含義 |
-f | 強制卸除!可用在類似網路檔案系統 (NFS) 無法讀取到的情況下 |
-n | 不更新 /etc/mtab 情況下卸除 |
例子:
現在將掛載在:/mnt/sda5 的裝置給卸除:
使用命令:umount /mnt/sda5
注意事項:
當你使用命令:mount /dev/sda5 /mnt/sda5 掛載裝置時,裝置已經是能夠正常使用了,但是當你重啟你的系統時,系統不會重新去掛載你的裝置,你需要在:/etc/fatab 這個檔案說明進行說明,每次開機後才會進行掛載的命令:
如上圖添加了之後,以後每次系統開機都回去自動掛載這個分割槽了。
8.特殊裝置 loop 掛載 (映象檔案不燒錄就掛載使用)
1.當你有下載了一個相對比加大的映象檔案,不一定需要刻錄到實體光碟才能使用,可以使用特殊的裝置 loop 來掛載。
注意,掛載映象檔案需要加上引數,-o loop
例如:把aa.iso映象檔案,掛載到 :/test 目錄下:使用命令:muount -o loop aa.iso /test
如果需要開機自動掛載這個映象檔案:在。 /etc/fatab 加上
/root/aa.iso /mnt iso9660 defaults,loop 0 0
2.建立大檔案以製作 loop 裝置檔案!
製作出一個大檔案,然後將這個檔案格式化後進行掛載,可以解決:很多系統的分割不良的情冴,比如,如果當初在分割時, 你叧有分割出一個根目彔,假設你已經沒有多餘的容量可以進行額外的分割,偏偏根目錄的容量還很大! 此時你就能夠製作出一個大檔案,然後將這個檔案掛載,這樣就像是多了一個分割槽了。
3.建立大型檔案,
使用命令:dd
例子:
在 : /test 建立一個檔案名為newdev,新建一個200M的大檔案,如何做呢?
看一下這個檔案的資訊,可以看到這個檔案的大小是200M:
現在檔案已經建立好了,想要使用的話,還需要格式化:
使用命令:mkfs -t ext3 /test/newdev
掛載分割槽,注意加上 : -o loop 引數
把這個分割槽掛載在:/mnt/loopdev 下面:
使用命令:mount -o loop /test/newdev /mnt/loopdev
同理,想要在每次開機的時候自動掛載,就必須把這分割槽在 :/etc/fstab 進行註冊。
9.記憶體置換空間(swap)的建立
swap 的功能就是在應付實體記憶體不足的情況下所造成癿記憶體延伸記錄的功能。一般來說,如果硬體的配備足夠的話,那麼 swap 應該不會被我們的系統所使用到, swap 會被利用到的時刻通常就是實體記憶體不足癿情況了。
8.1.使用實體分割槽建置 swap
檢視下當前系統的交換分割槽,有一個,/dev/sda3
使用分割槽的方式新增一個分割槽,然後給swap虛擬記憶體即可(詳細步驟看上面的第五點磁碟分割槽):
使用命令: fdisk /dev/sda
成功建立一個分割槽,但是檔案系統型別是Linux的:
使用引數 t 去改變系統型別:
新建一個swap分割槽成功:
儲存並退出
更新分割槽表,使用命令:partprobe 裝置名稱,即:partprobe /dev/sda
使用命令:mkswap 對 /dev/sda6 進行格式化,格式化成swap分割槽,即:mkswap /dev/sda6
啟用交換分割槽,使用命令:swapon 裝置名稱,即:swapon /dev/sda6
提示:如果想關閉這個swap分割槽的話,使用命令:swapoff 裝置名,就可以關閉這個swap分割槽了。
通過上面我們知道,如果我們不在 ,/etc/fatab 註冊一下這個分割槽的話,下次開機之後,它不會重新去掛載這個分割槽的,所以需要把這個swap分割槽新增進去:
2.使用檔案建置 swap
例子:
在 /test下建立一個大文件swapdev,作為swap的分割槽:
使用 mkswap 將 /test/swapdev 這個檔案格式化為 swap 的檔案格式:
使用命令:mkswap /test/swapdev
同理:需要在開機自動掛載,就需要在:/etc/fstab進行註冊。
注意:關閉這個swap分割槽,使用命令:swapoff 分割槽名