Linux的基本学习(四)——磁盘与文件系统管理
前言:
承接Linux的基本學(xué)習(xí)(三)我們接著往下走
?
?
認(rèn)識Linux文件系統(tǒng):
整塊磁盤的組成主要有:
而碟片上的物理組成又是:
- 扇區(qū)(Sector)為最小的物理存儲單位,且依據(jù)磁盤設(shè)計的不同,目前主要有512B與4KB兩種格式
- 將扇區(qū)組成一個圓,那就是柱面(Cylinder)
- 早期的分區(qū)主要以柱面為最小分區(qū)單位,現(xiàn)在的分區(qū)通常使用扇區(qū)為最小分區(qū)單位(每個扇區(qū)都有其號碼)
- 磁盤分區(qū)表主要有兩種格式,MBR(限制較多)、GPT
- MBR分區(qū)表中,第一個扇區(qū)最重要,里面有:主引導(dǎo)記錄(Master boot record,MBR)——446B、分區(qū)表——64B。
- GPT分區(qū)表除了分區(qū)數(shù)量擴充較多之外,支持的磁盤容量也可以超過2TB
文件系統(tǒng)特性:
磁盤分區(qū)完畢后要進行格式化,這是因為每種操作系統(tǒng)所設(shè)置的文件屬性/權(quán)限不同,為了存放這些文件所需的數(shù)據(jù),因此就需要將分區(qū)進行格式化,以成為操作系統(tǒng)能夠利用的文件系統(tǒng)格式
在Linux的學(xué)習(xí)中,我們通常稱呼一個可被掛載的數(shù)據(jù)為一個文件系統(tǒng)而不是一個分區(qū)
我們知道,每個文件除了自身的數(shù)據(jù)還有非常多的屬性,,例如文件的權(quán)限(rwx)和文件屬性等,文件系統(tǒng)通常會將這兩部分的數(shù)據(jù)分別存放在不同的區(qū)塊,權(quán)限與屬性放置到inode中,至于實際數(shù)據(jù)則放到數(shù)據(jù)區(qū)塊中,另外,還有一個超級區(qū)塊。
- 超級區(qū)塊:記錄此文件系統(tǒng)的整體信息,包括inode與數(shù)據(jù)區(qū)塊的總量、使用量、剩余量,以及文件系統(tǒng)的格式與相關(guān)信息等
- inode:記錄文件的屬性,一個文件占用一個inode,同時記錄此文件的數(shù)據(jù)所在的區(qū)塊號碼
- 數(shù)據(jù)區(qū)塊:實際記錄文件的內(nèi)容。若文件太大時,會占用多個區(qū)塊
這種數(shù)據(jù)存儲的方式我們稱為索引式文件系統(tǒng)
與之對比的文件系統(tǒng)比如U盤的FAT格式,讀取了一個區(qū)塊,才能知道下一個區(qū)塊的位置,如此往復(fù)(所以常常需要碎片整理:同一個文件所屬的區(qū)塊集合在一起,使讀取容易)
Linux的ext2文件系統(tǒng)(inode):
標(biāo)準(zhǔn)的ext2就是使用這種inode為基礎(chǔ)的Linux文件系統(tǒng)
文件系統(tǒng)一開始就將inode與數(shù)據(jù)區(qū)塊規(guī)劃好了,除非重新格式化(或利用resize2fs等命令修改大小),否則inode與數(shù)據(jù)區(qū)塊固定后就不再變動。
但是,當(dāng)我們文件系統(tǒng)高達(dá)數(shù)百GB時,所有的inode與數(shù)據(jù)區(qū)塊通通放在一起就不太合適了,因此,ext2文件系統(tǒng)格式化的時候基本上時區(qū)分為多個區(qū)塊群組(block group),每個區(qū)塊群組都有獨立的inode、數(shù)據(jù)區(qū)塊、超級區(qū)塊系統(tǒng)。文件系統(tǒng)最前面有一個啟動扇區(qū)(boot sector),這個啟動扇區(qū)可以安裝啟動引導(dǎo)程序(這樣才能夠制作出多重引導(dǎo)環(huán)境)
每一個區(qū)塊群組的內(nèi)容如下:
數(shù)據(jù)區(qū)塊(data block):
ext2文件系統(tǒng)中所支持的區(qū)塊大小由1k、2k、4k(在格式化時各個區(qū)塊的大小就固定了)
| 最大單一文件限制 | 16GB | 256GB | 2TB |
| 最大文件系統(tǒng)總?cè)萘?/td> | 2TB | 8TB | 16TB |
?
雖然ext2已經(jīng)能夠支持大于2GB以上的單一文件容量,不過某些應(yīng)用程序依舊使用舊的限制
另外的基本限制如下:
- 原則上,區(qū)塊的大小與數(shù)量在格式化完就不能再修改(除非重新格式化)
- 每個區(qū)塊內(nèi)最多只能夠放置一個文件的數(shù)據(jù)
- 如果文件大于區(qū)塊的大小,則一個文件會占用多個區(qū)塊數(shù)量
- 若文件小于區(qū)塊,則該區(qū)塊內(nèi)剩余空間就不能再使用了
inode表(inode table):
inode會記錄如下數(shù)據(jù):
- 該文件的讀寫屬性(read、write、excute)
- 該文件的擁有者與用戶組(owner、group)
- 該文件的大小
- 改文件建立時間或狀態(tài)改變的時間(ctime)
- 最近一次讀取的時間(atime)
- 最近修改的時間(mtime)
- 定義文件特性的標(biāo)識(flag),如SetUID
- 該文件真正內(nèi)容的指向(pointer)
inode的數(shù)量與大小也是在格式化的時候就固定了,inode還有什么特色?
- 每個inode大小均固定為128B(新的ext4與xfs可設(shè)置到256B)
- 每個文件都僅會占用一個inode而已
- 文件系統(tǒng)能夠建立的文件數(shù)量與inode有關(guān)
- 系統(tǒng)讀取文件時需要先找到inode,并分析inode所記錄的權(quán)限與用戶是否符合,然后(符合)再讀取區(qū)塊內(nèi)容
在這個CSDN找到了鳥哥的這樣一張圖
上圖最左邊為inode本身(128bytes),里面有12個直接指向block號碼的對照,這12組記錄就能夠直接讀取block號碼啦!至于所謂的間接就是再拿一個block來當(dāng)作記錄block號碼的記錄區(qū),如過檔案太大的時候,就會使用間接的block來記錄編號。如上圖當(dāng)中間接只是拿一個block來記錄額外的號碼而已。同理,如果檔案持續(xù)增大,那么就會利用所謂的雙間接,第一個block僅指出下一個記錄編號的block在那里,實際記錄的在第二個block當(dāng)中。
這樣子inode能夠指定多少個block呢?我們以較小的1K block來說明好了,可以指定的情況下:
12個直接指向:12*1K=12K
間接 :256*1K = 256K;
雙間接 : 256*256*1K;
三間接:256*256*256*1K;
總額 : 12+256+256*256+256*256*256 = 16G;
故區(qū)塊格式化為1k大小時,可以容納的最大文件為16GB
超級區(qū)塊(Superblock):
超級區(qū)塊是記錄整個文件系統(tǒng)相關(guān)的地方,沒有超級區(qū)塊,就沒有整個文件系統(tǒng),它主要記錄的信息有:
- 數(shù)據(jù)區(qū)塊與inode的總量
- 未使用和已經(jīng)使用的inode與數(shù)據(jù)區(qū)塊、數(shù)量
- 數(shù)據(jù)區(qū)塊與inode的大小(block為1、2、4k,inode為128B或256B)
- 文件系統(tǒng)的掛載時間、最近一次寫入數(shù)據(jù)的時間、最近一次檢驗磁盤(fsck)的時間等文件系統(tǒng)的相關(guān)信息
- 一個有效位數(shù)值,若此文件系統(tǒng)已被記載,則有效位為0,若未被掛載,則有效位為1
如果超級區(qū)塊損壞,你的文件系統(tǒng)可能就需要花費很多時間去恢復(fù),一般來說,超級區(qū)塊的大小為1024B。此外,每個區(qū)塊群組都可能還要超級區(qū)塊。但是我們說一個文件系統(tǒng)應(yīng)該僅有一個超級區(qū)塊而已,那這是怎么回事?事實上除了第一個區(qū)塊群組內(nèi)會含有超級區(qū)塊外,后續(xù)的區(qū)塊群組不一定含有超級區(qū)塊,而若含有超級區(qū)塊則該超級區(qū)塊主要是作為第一個區(qū)塊群組內(nèi)超級區(qū)塊的備份,這樣可以進行超級區(qū)塊的恢復(fù)
文件系統(tǒng)描述說明(Filesystem Description):
這個區(qū)塊可以描述每個區(qū)塊群組的開始與結(jié)束的區(qū)塊,以及說明每個區(qū)段(超級區(qū)塊、對照表、inode對照表、數(shù)據(jù)區(qū)塊)分別介于哪一個區(qū)塊之間,這部分也能夠用dumpe2fs來觀察
區(qū)塊對照表(block bitmap):
新增文件時總會用到區(qū)塊,那你要使用哪個區(qū)塊來做記錄?當(dāng)然是選擇空區(qū)塊來記錄新文件的數(shù)據(jù),那你怎么知道哪個區(qū)塊是空的?這就要通過區(qū)塊對照表的輔助了。從區(qū)塊對照表當(dāng)中可以知道哪些區(qū)塊是空的,因此我們的系統(tǒng)就能夠很快速地找到可使用的空間來處理文件。
inode對照表(inode bitmap):
這個其實與區(qū)塊對照表的功能類似,只是區(qū)塊對照表記錄的是使用與未使用的區(qū)塊號碼,inode對照表則是記錄使用與未使用的inode號碼。
dumpe2fs(查詢ext系列超級區(qū)塊):
使用dumpe2fs可以查詢ext系列文件系統(tǒng)的超級區(qū)塊信息(僅對ext文件系統(tǒng)有效)
[root@www ~]# dumpe2fs [-bh] 裝置文件名 選項與參數(shù): -b :列出保留為壞軌的部分(一般用不到吧) -h :僅列出 superblock 的數(shù)據(jù),不會列出其他的區(qū)段內(nèi)容!利用 blkid 這個命令可以顯示出目前系統(tǒng)被格式化的設(shè)備,后面的TYPE就可以看出文件系統(tǒng)類型。[root@www ~]# dumpe2fs /dev/hdc2 dumpe2fs 1.39 (29-May-2006) Filesystem volume name: /1 <==這個是文件系統(tǒng)的名稱(Label) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file Default mount options: user_xattr acl <==默認(rèn)掛載的參數(shù) Filesystem state: clean <==這個文件系統(tǒng)是沒問題的(clean) Errors behavior: Continue Filesystem OS type: Linux Inode count: 2560864 <==inode的總數(shù) Block count: 2560359 <==block的總數(shù) Free blocks: 1524760 <==還有多少個 block 可用 Free inodes: 2411225 <==還有多少個 inode 可用 First block: 0 Block size: 4096 <==每個 block 的大小啦! Filesystem created: Fri Sep 5 01:49:20 2008 Last mount time: Mon Sep 22 12:09:30 2008 Last write time: Mon Sep 22 12:09:30 2008 Last checked: Fri Sep 5 01:49:20 2008 First inode: 11 Inode size: 128 <==每個 inode 的大小 Journal inode: 8 <==底下這三個與下一小節(jié)有關(guān) Journal backup: inode blocks Journal size: 128MGroup 0: (Blocks 0-32767) <==第一個 data group 內(nèi)容, 包含 block 的啟始/結(jié)束號碼Primary superblock at 0, Group descriptors at 1-1 <==超級區(qū)塊在 0 號 blockReserved GDT blocks at 2-626Block bitmap at 627 (+627), Inode bitmap at 628 (+628)Inode table at 629-1641 (+629) <==inode table 所在的 block0 free blocks, 32405 free inodes, 2 directories <==所有 block 都用完了!Free blocks:Free inodes: 12-32416 <==剩余未使用的 inode 號碼 Group 1: (Blocks 32768-65535) ....(底下省略).... # 由于數(shù)據(jù)量非常的龐大,因此鳥哥將一些信息省略輸出了!上表與你的屏幕會有點差異。 # 前半部在秀出 supberblock 的內(nèi)容,包括標(biāo)頭名稱(Label)以及inode/block的相關(guān)信息 # 后面則是每個 block group 的個別信息了!您可以看到各區(qū)段數(shù)據(jù)所在的號碼! # 也就是說,基本上所有的數(shù)據(jù)還是與 block 的號碼有關(guān)就是了!很重要!與目錄樹的關(guān)系:
目錄:
當(dāng)我們在Linux下的文件系統(tǒng)建立一個目錄時,文件系統(tǒng)會分配一個inode與至少一塊區(qū)塊給該目錄。inode記錄該目錄的相關(guān)屬性與權(quán)限,并可記錄分配到的那塊區(qū)塊號碼,而區(qū)塊則是在這個目錄下的文件名與該文件名占用的inode號碼數(shù)據(jù)。
如果想要實際觀察root根目錄內(nèi)的文件所占用的inode號碼時,可以使用ls -i這個選項來處理:
最左邊就是inode號碼
文件:
當(dāng)我們在Linux下的ext2建立一個一般文件時,ext2會分配一個inode與相對于改文件大小的區(qū)塊數(shù)量給該文件。例如:假設(shè)我的一個區(qū)塊為4KB,而我要建立一個100KB的文件,那么Linux將分配一個inode與25個區(qū)塊來存儲該文件。但同時請注意,由于inode僅有12個直接指向,因此還要需要一個區(qū)塊來記錄號碼。
目錄樹讀取:
由于目錄樹是由根目錄開始讀起,因此系統(tǒng)通過掛載的信息可以找到掛載點的 inode 號碼,此時就能夠得到根目錄的 inode 內(nèi)容,并依據(jù)該 inode 讀取根目錄的 block 內(nèi)的文件名數(shù)據(jù),
再一層一層的往下讀到正確的文件名。
如果我想要讀取 /etc/passwd 這個文件時,系統(tǒng)是如何讀取的?
[root@study ~]# ll -di / /etc /etc/passwd 128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 / 33595521 drwxr-xr-x. 131 root root 8192 Jun 17 00:20 /etc 36628004 -rw-r--r--. 1 root root 2092 Jun 17 00:20 /etc/passwd該文件的讀取流程為(假設(shè)讀取者身份為 dmtsai 這個一般身份使用者):
文件系統(tǒng)大小與磁盤讀取性能:
關(guān)于文件系統(tǒng)的使用效率上,當(dāng)你的一個文件系統(tǒng)規(guī)劃的很大時,例如 100GB 這么大時, 由于磁盤上面的數(shù)據(jù)總是來來去去的,所以,整個文件系統(tǒng)上面的文件通常無法連續(xù)寫在一起(區(qū)塊號碼不會連續(xù)的意思),
而是填入式的將數(shù)據(jù)填入沒有被使用的區(qū)塊當(dāng)中。如果文件寫入的區(qū)塊真的分的很散, 此時就會有所謂的文件數(shù)據(jù)離散的問題發(fā)生了。
雖然我們的 ext2 在 inode 處已經(jīng)將該文件所記錄的區(qū)塊號碼都記上了, 所以數(shù)據(jù)可以一次性讀取,但是如果文件真的太過離散,確實還是會發(fā)生讀取效率低落的問題。 因為磁頭還是得要在整個文件系統(tǒng)中來來去去的頻繁讀取。果真如此,那么可以將整個文件系統(tǒng)內(nèi)的數(shù)據(jù)全部復(fù)制出來,將該文件系統(tǒng)重新格式化, 再將數(shù)據(jù)給他復(fù)制回去即可解決這個問題。
此外,如果文件系統(tǒng)真的太大了,那么當(dāng)一個文件分別記錄在這個文件系統(tǒng)的最前面與最后面的區(qū)塊號碼中, 此時會造成磁盤的機械手臂移動幅度過大,也會造成數(shù)據(jù)讀取性能的低落。而且磁頭在搜尋整個文件系統(tǒng)時,
也會花費比較多的時間去搜尋!因此,磁盤分區(qū)的規(guī)劃并不是越大越好,而是真的要針對你的主機用途來進行規(guī)劃才行。
?
ext2/3/4文件的存取與日志式文件系統(tǒng)的功能:
假如我們想要新增一個文件,此時文件系統(tǒng)的操作是:
一般來說,我們將 inode對照表與數(shù)據(jù)區(qū)塊稱為數(shù)據(jù)存放區(qū)域,至于其他例如超級區(qū)塊、區(qū)塊對照表與inode對照表等區(qū)段就被稱為 metadata (元數(shù)據(jù)),因為他們經(jīng)常變動。
如果你的文件在寫入文件系統(tǒng)時,因為不知名原因?qū)е孪到y(tǒng)中斷(例如突然的停電啊、 系統(tǒng)核心發(fā)生錯誤啊~等等的怪事發(fā)生時),所以寫入的數(shù)據(jù)僅有 inode存儲表及數(shù)據(jù)區(qū)塊而已, 最后一個同步更新中介數(shù)據(jù)的步驟并沒有做完,此時就會發(fā)生元數(shù)據(jù)的內(nèi)容與實際數(shù)據(jù)存放區(qū)產(chǎn)生不一致 (Inconsistent) 的情況了。
為了解決這個問題,出現(xiàn)了日志式文件系統(tǒng)。
日志式文件系統(tǒng):
萬一數(shù)據(jù)的紀(jì)錄過程當(dāng)中發(fā)生了問題,那么我們的系統(tǒng)只要去檢查日志記錄區(qū)塊, 就可以知道哪個文件發(fā)生了問題,針對該問題來做一致性的檢查即可,而不必針對整塊文件系統(tǒng)去檢查。
Linux文件系統(tǒng)的運行:
我們知道,所有的數(shù)據(jù)都得要載入到內(nèi)存后 CPU 才能夠?qū)υ摂?shù)據(jù)進行處理。如果你常常編輯一個好大的文件,在編輯的過程中又頻繁的要系統(tǒng)來寫入到磁盤中,由于磁盤寫入的速度要比內(nèi)存慢很多,因此你會常常耗在等待磁盤的寫入/讀取上。
為了解決這個效率的問題,inux 使用的方式是通過一個稱為非同步處理(asynchronously)的方式。所謂的非同步處理是這樣的:
當(dāng)系統(tǒng)載入一個文件到內(nèi)存后,如果該文件沒有被更動過,則在內(nèi)存區(qū)段的文件數(shù)據(jù)會被設(shè)置為干凈(clean)的。 但如果內(nèi)存中的文件數(shù)據(jù)被更改過了(例如你用 nano 去編輯過這個文件),此時該內(nèi)存中的數(shù)據(jù)會被設(shè)置為臟的 (Dirty)。此時所有的動作都還在內(nèi)存中執(zhí)行,并沒有寫入到磁盤中! 系統(tǒng)會不定時的將內(nèi)存中設(shè)置為“Dirty”的數(shù)據(jù)寫回磁盤,以保持磁盤與內(nèi)存數(shù)據(jù)的一致性。
Linux 系統(tǒng)文件系統(tǒng)與內(nèi)存有非常大的關(guān)系:
- 系統(tǒng)會將常用的文件數(shù)據(jù)放置到內(nèi)存的緩沖區(qū),以加速文件系統(tǒng)的讀/寫;
- 承上,因此 Linux 的實體內(nèi)存最后都會被用光!這是正常的情況!可加速系統(tǒng)性能;
- 你可以手動使用sync來強迫內(nèi)存中設(shè)置為 Dirty 的文件回寫到磁盤中;
- 若正常關(guān)機時,關(guān)機指令會主動調(diào)用sync來將內(nèi)存的數(shù)據(jù)回寫入磁盤內(nèi);
- 但若不正常關(guān)機(如跳電、死機或其他不明原因),由于數(shù)據(jù)尚未回寫到磁盤內(nèi), 此重新開機后可能會花很多時間在進行磁盤檢驗,甚至可能導(dǎo)致文件系統(tǒng)的損毀(非磁盤損毀)。
掛載點的意義:
將文件系統(tǒng)與目錄樹結(jié)合的動作我們稱為“掛載”。掛載點一定是目錄,該目錄為進入該文件系統(tǒng)的入口。 因此并不是你有任何文件系統(tǒng)都能使用,必須要“掛載”到目錄樹的某個目錄后,
才能夠使用該文件系統(tǒng)的。
其他Linux支持的文件系統(tǒng)與VFS:
Linux還支持其他的文件格式:
- 傳統(tǒng)文件系統(tǒng):ext2 / minix / MS-DOS / FAT (用 vfat 模塊) / iso9660 (光盤)等等;
- 日志式文件系統(tǒng): ext3 /ext4 / ReiserFS / Windows’ NTFS / IBM’s JFS / SGI’s XFS / ZFS
- 網(wǎng)絡(luò)文件系統(tǒng): NFS / SMBFS
Linux VFS:
Linux系統(tǒng)都是通過一個叫Virtual Filesystem Switch的內(nèi)核功能區(qū)讀取文件系統(tǒng),也就是說,整個Linux識別的文件系統(tǒng)其實都是VFS在進行管理,我們用戶并不需要知道每個硬盤設(shè)備分區(qū)上面的文件系統(tǒng)是什么,VFS會主動幫助我們做好讀取的工作
XFS文件系統(tǒng)簡介:
CentOS 7開始,默認(rèn)的文件系統(tǒng)已經(jīng)由原本的ext4變成了xfs文件系統(tǒng),原因:
ext系列當(dāng)前較燒腦筋的地方:支持度最廣,但格式化最慢
ext 文件系統(tǒng)對于文件格式化的處理方面,采用的是預(yù)先規(guī)劃出所有的 inode、區(qū)塊、元數(shù)據(jù) 等數(shù)據(jù),未來系統(tǒng)可以直接取用,不需要再進行動態(tài)配置的作法。這個作法在早期磁盤容
量還不大的時候還算 OK,但時至今日,磁盤容量越來越大,連傳統(tǒng)的 MBR 都已經(jīng)被 GPT 所取代,現(xiàn)在都已經(jīng)說到 PB 或 EB 以上容量了!可以想像,當(dāng)你的 TB 以上等級的傳統(tǒng) ext 文件系統(tǒng)在格式化的時候,光是系統(tǒng)要預(yù)先分配 inode 與 區(qū)塊就消耗你好多好多的時間。
XFS文件系統(tǒng)的配置:
xfs 文件系統(tǒng)在數(shù)據(jù)的分布上,主要規(guī)劃為三個部份,一個數(shù)據(jù)區(qū) (data section)、一個文件系統(tǒng)活動登錄區(qū) (log section)以及一個實時運行區(qū) (realtime section)。
- 數(shù)據(jù)區(qū)(data section)
數(shù)據(jù)區(qū)就跟我們之前談到的 ext 家族一樣,包括 inode、數(shù)據(jù)區(qū)塊、超級區(qū)塊等數(shù)據(jù),都放置在這個區(qū)塊。這個數(shù)據(jù)區(qū)與 ext 家族的區(qū)塊群組類似,
也是分為多個儲存區(qū)群組(allocation groups)來分別放置文件系統(tǒng)所需要的數(shù)據(jù)。 每個儲存區(qū)群組都包含了
此外,inode與 block 都是系統(tǒng)需要用到時, 這才動態(tài)配置產(chǎn)生,所以格式化動作超級快。
- 文件系統(tǒng)活動登錄區(qū)(log section)
這個區(qū)域主要用來記錄文件系統(tǒng)的變化,有點像是日志區(qū)。文件的變化會在這里記錄下來,直到該變化完整地寫入到數(shù)據(jù)區(qū)后,該條記錄才會被結(jié)束。另外,xfs的設(shè)計很有趣,你可以指定外部的磁盤來作為xfs文件系統(tǒng)的日志區(qū)塊。
- 實時運行區(qū)(realtime section)
當(dāng)文件要被創(chuàng)建時,xfs 會在這個區(qū)段找到一個到數(shù)個 extent 區(qū)塊,將文件放置在這個區(qū)塊,等到分配完畢后,再寫入到 data section 的inode 和區(qū)塊中。
這個 extent 區(qū)塊的大小得要在格式化的時候就先指定,最小值是 4K 最大可到 1G。一般非磁盤陣列的磁盤默認(rèn)為64K的容量,而具有類似磁盤陣列的stripe情況下,則建議將extent設(shè)置為與stripe一樣大,這個extent最好不要亂動,因為可能會影響物理磁盤的性能
XFS文件系統(tǒng)的描述數(shù)據(jù)觀察:
有一個命令類似ext的系列的dumpe2fs觀察xfs文件系統(tǒng)
xfs_info 掛載點|設(shè)備文件名- 第一行里面的isize:指的是inode的容量,每個有512B,agcount是存儲區(qū)群組個數(shù)(allocation group),每個存儲區(qū)群組有agsize個區(qū)塊
- 第二行里面的sectsz指的是邏輯扇區(qū)(sector)的容量設(shè)置為512B這么大的意思
- 第四行里面的bsize指的是區(qū)塊的容量,每個區(qū)塊為4K的意思,共有blocks個區(qū)塊在文件系統(tǒng)內(nèi)
- 第七行里面的internal指的是這個登錄區(qū)的位置在文件系統(tǒng)內(nèi),而不是外部設(shè)備的意思
?
文件系統(tǒng)的簡單操作:
磁盤與目錄的容量:
磁盤的整體數(shù)據(jù)是在超級區(qū)塊中,但是每個文件的容量則在inode當(dāng)中記載,下面的命令叫我們方便查看:
df:
列出文件系統(tǒng)的整體磁盤使用量
df [-ahikHTm] [目錄或文件名] -a :列出所有的文件系統(tǒng),包括系統(tǒng)特有的 /proc 等文件系統(tǒng); -k :以 KBytes 的容量顯示各文件系統(tǒng); -m :以 MBytes 的容量顯示各文件系統(tǒng); -h :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示; -H :以 M=1000K 取代 M=1024K 的進位方式; -T :連同該硬盤分區(qū)的文件系統(tǒng)名稱 (例如 xfs) 也列出; -i :不用磁盤容量,而以 inode 的數(shù)量來顯示- Filesystem:代表該文件系統(tǒng)是在哪個硬盤分區(qū),所以列出設(shè)備名稱
- 1K-blocks:說明下面的數(shù)字單位是1KB,可以用-h或-m來改變?nèi)萘?/li>
- Used:使用掉的磁盤空間
- Available:剩下的磁盤空間大小
- Use%:磁盤使用率
- Mounted on:就是磁盤的掛載目錄(掛載點)
/proc的東西都是Linux系統(tǒng)所需要加載的系統(tǒng)數(shù)據(jù),而且是掛載在內(nèi)存中的。
/dev/shm/,其實是利用內(nèi)存虛擬出來的磁盤空間,通常是總物理內(nèi)存的一半
du:
du [-ahskm] 文件或目錄名稱 選項與參數(shù): -a :列出所有的文件與目錄容量,因為默認(rèn)僅統(tǒng)計目錄下面的文件量而已。 -h :以人們較易讀的容量格式 (G/M) 顯示; -s :列出總量而已,而不列出每個個別的目錄占用容量; -S :不包括子目錄下的總計,與 -s 有點差別。 -k :以 KBytes 列出容量顯示; -m :以 MBytes 列出容量顯示;容量默認(rèn)以kb為單位
?
硬鏈接與符號鏈接-ln:
硬鏈接(Hard Link,硬式鏈接或?qū)嶋H鏈接):
想要讀取一個文件,必須經(jīng)過目錄記錄的文件名來指向到正確的inode號碼才能讀取,也就是說,其實文件名只與目錄有關(guān),但是文件內(nèi)容則與inode有關(guān)。硬鏈接就是在某個目錄下新增一條文件名鏈接到某inode號碼的關(guān)聯(lián)記錄而已。
如圖,兩個文件的inode都是17678412,也就是說訪問這兩個文件訪問的是一個地方。
硬鏈接有這樣的性質(zhì):
- 不能跨文件系統(tǒng)
- 不能跨鏈接目錄
符號鏈接(Symbolic Link,即快捷方式):
符號鏈接就是建立一個獨立的文件,這個文件會讓數(shù)據(jù)的讀取指向它鏈接的那個文件的文件名。
只是指向操作,當(dāng)源文件被刪除,符號鏈接的文件就打不開了
鏈接文件的重要內(nèi)容就是它會寫上目標(biāo)文件的文件名
由符號鏈接創(chuàng)建的文件為一個獨立的新文件,所以會占用inode與區(qū)塊
?
使用ln命令去制作鏈接文件:
ln [-sf] 源文件 目標(biāo)文件 -s:如果不加任何參數(shù)就進行鏈接,就是硬鏈接,至于-s就是符號鏈接 -f:如果目標(biāo)文件存在時,就主動的將目標(biāo)文件直接刪除后再建立?
磁盤的分區(qū)、格式化、檢驗與掛載:
如果我們想要在系統(tǒng)里面新增一塊磁盤的話,應(yīng)該做哪些操作:
觀察磁盤分區(qū)狀態(tài):
liblk:
lsblk(可以看成是【list block device】的縮寫):列出系統(tǒng)上所有的磁盤列表
lsblk [-dfimpt] [device] 選項與參數(shù): -d :僅列出磁盤本身,并不會列出該磁盤的分區(qū)數(shù)據(jù) -f :同時列出該磁盤內(nèi)的文件系統(tǒng)名稱 -i :使用 ASCII 的線段輸出,不要使用復(fù)雜的編碼 (再某些環(huán)境下很有用) -m :同時輸出該設(shè)備在 /dev 下面的權(quán)限數(shù)據(jù) (rwx 的數(shù)據(jù)) -p :列出該設(shè)備的完整文件名!而不是僅列出最后的名字而已。 -t :列出該磁盤設(shè)備的詳細(xì)數(shù)據(jù),包括磁盤陣列機制、預(yù)讀寫的數(shù)據(jù)量大小等[root@study ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 8:0 0 200G 0 disk ├─vda1 8:1 0 2G 0 part /boot ├─vda2 8:2 0 58G 0 part │ ├─rhel-root 253:0 0 191G 0 lvm / │ └─rhel-swap 253:1 0 6G 0 lvm └─vda3 8:3 0 140G 0 part└─rhel-root 253:0 0 191G 0 lvm /從上面的輸出我們可以很清楚的看到,目前的系統(tǒng)主要有個 sr0 以及一個 vda 的設(shè)備,而 vda 的設(shè)備下面又有三個分區(qū), 其中 vda3 甚至還有因為 LVM 而產(chǎn)生的文件系統(tǒng)。
輸出的信息有:
- NAME:就是設(shè)備的文件名,會省略/dev等前導(dǎo)目錄!
- MAJ:MIN:其實核心識別的設(shè)備都是通過這兩個代碼來熟悉的!分別是主要:次要設(shè)備代碼!
- RM:是否為可卸載設(shè)備 (removable device),如光盤、USB 磁盤等等
- SIZE:容量
- RO:是否為只讀設(shè)備的意思
- TYPE:是磁盤 (disk)、分區(qū) (partition) 還是只讀存儲器 (rom) 等輸出
- MOUTPOINT:掛載點
blkid:
列出設(shè)備的 UUID(universally unique identifier) 等參數(shù)
UUID是全局唯一表示符,是Linux給與設(shè)備的獨一無二的標(biāo)識符,這個標(biāo)識符就可以拿來掛載或是使用這個設(shè)備或文件系統(tǒng)
?
parted:
parted:列出磁盤的分區(qū)表類型與分區(qū)信息
parted device_name printModel:磁盤的模塊名稱(廠商)
Disk:磁盤總?cè)萘?br /> Sector size (logical/physical):磁盤的每個邏輯/物理扇區(qū)容量
Partition:分區(qū)表格式
?
磁盤分區(qū):gdisk/fdisk:
磁盤分區(qū)要注意的是:MBR分區(qū)表請使用fdisk分區(qū),GPT請使用gdisk分區(qū),這個搞錯會導(dǎo)致分區(qū)失敗。
gdisk:
gdisk 設(shè)備名稱d:刪除一個分區(qū)
n:增加一個分區(qū)
p:打印出分區(qū)表
q:不保存分區(qū)直接離開gdisk
w:保存分區(qū)操作后離開gdisk
你可以隨便玩gdisk,只要最后按q離開就不會生效
現(xiàn)在分區(qū)主要以扇區(qū)為最小單位
上面的各項的意義是:
- Number:分區(qū)編號,1號指的就是/dev/sda1這樣計算
- Start:每一個分區(qū)的開始扇區(qū)號碼位置
- End:每一個分區(qū)的結(jié)束扇區(qū)號碼位置,與start之間可以算出分區(qū)的總?cè)萘?/li>
- Size:就是分區(qū)的容量
- Code:在分區(qū)內(nèi)的可能的文件系統(tǒng)類型,Linux為8300,swap為8200,這只是個提示
- Name:文件系統(tǒng)的名稱等
從上表我們可以發(fā)現(xiàn):
- 整個磁盤還可以進行額外的劃分,因為最大扇區(qū)為83886080,但只用到65026047號而已
- 分區(qū)的設(shè)計中,新分區(qū)通常選用上一個分區(qū)的結(jié)束扇區(qū)號碼加1作為起始扇區(qū)號碼
另外注意:
- 這個gdisk命令只有root可以執(zhí)行
- 使用的設(shè)備文件名請不要加上數(shù)字,因為磁盤分區(qū)是針對整個磁盤設(shè)備而不是某個分區(qū)(不能用/dev/sda1,要用磁盤/dev/sda)
?新增分區(qū)示例操作:
我們要來做如下分區(qū):
- 1GB的xfs文件系統(tǒng)(Linux)
- 1GB的vfat文件系統(tǒng)(Windows)
- 0.5GB的swap(Linux swap)? (這個分區(qū)等一下會被刪除)
在Last sector中絕對不要回車,否則就是把磁盤剩余所有扇區(qū)都使用了,這個我們僅要1G(輸入+1G系統(tǒng)會自動計算最接近你需要容量的扇區(qū)號碼)
按照上面的方法分出所需要求,最后就是這樣:
很nice,文件系統(tǒng)的ID一般來說,Linux大概就是8200、8300、8e00等三種格式,Windows幾乎都用0700
最后我們按w寫入新的分區(qū),會出現(xiàn)警告,這是因為這塊磁盤現(xiàn)在正在使用中,因此系統(tǒng)無法立即加載新的分區(qū)表
可以看到,還沒有sda4、sda5、sda6
這時我們可以通過兩種方式來處理,一種是重新啟動,一種是通過partprobe這個命令來處理
partprobe:更新Linux內(nèi)核信息
partprobe [-s] //不加-s,那屏幕不顯示信息接下來我們來刪除分區(qū),刪除sda6(Linux swap)
這個刪除很簡單,直接gdisk /dev/sda后,輸入d,然后輸入6,,最后w寫入即可,別忘了出來之后用partprobe更新內(nèi)核信息,然后lsblk一看,就會發(fā)現(xiàn)sda6消失了
千萬不要去處理正在使用中的分區(qū)
?磁盤格式化(創(chuàng)建文件系統(tǒng)):
分區(qū)完畢后自然就是去進行文件系統(tǒng)的格式化。格式化的命令非常簡單,那就是【make filesystem,mkfs】這個命令。這個命令是個綜合命令,他會去調(diào)用正確的文件系統(tǒng)格式化工具軟件。
“格式化”其實應(yīng)該稱為“創(chuàng)建文件系統(tǒng) (make filesystem)”才對,所以使用的指令是 mkfs。
創(chuàng)建的 xfs 文件系統(tǒng)-mkfs.xfs:
mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \[-r parms] 設(shè)備名稱 選項與參數(shù): 關(guān)于單位:下面只要談到“數(shù)值”時,沒有加單位則為 Bytes 值,#可以用 k,m,g,t,p (小寫)等來解釋#比較特殊的是 s 這個單位,它指的是 sector 的“個數(shù)”喔! -b :后面接的是區(qū)塊量,可由 512 到 64k,不過最大容量限制為 Linux 的 4k 喔! -d :后面接的是重要的 data section 的相關(guān)參數(shù)值,主要的值有:agcount=數(shù)值 :設(shè)置需要幾個儲存群組的意思(AG),通常與 CPU 有關(guān)agsize=數(shù)值 :每個 AG 設(shè)置為多少容量的意思,通常 agcount/agsize#只選一個設(shè)置即可file :指的是“格式化的設(shè)備是個文件而不是個設(shè)備”的意思!#(例如虛擬磁盤)size=數(shù)值 :data section 的容量,亦即你可以不將全部的設(shè)備容#量用完的意思su=數(shù)值 :當(dāng)有 RAID 時,那個stripe數(shù)值的意思,與下面的 w搭配使用sw=數(shù)值 :當(dāng)有 RAID 時,用于儲存數(shù)據(jù)的磁盤數(shù)量(須扣除備份碟與備用碟)sunit=數(shù)值 :與su相當(dāng),不過單位使用的是“幾個sector(512Bytes大小)”的意思swidth=數(shù)值 :就是 su*sw 的數(shù)值,但是以“幾個 sector(512Bytes大小)”來設(shè)置 -f :如果設(shè)備內(nèi)已經(jīng)有文件系統(tǒng),則需要使用這個 -f 來強制格式化才行! -i :與 inode 有較相關(guān)的設(shè)置,主要的設(shè)置值有:size=數(shù)值 :最小是 256Bytes 最大是 2k,一般保留 256 就足夠使用了!internal=[0|1]:log 設(shè)備是否為內(nèi)置?默認(rèn)為 1 內(nèi)置,如果要用外部設(shè)備#,使用下面設(shè)置logdev=device :log 設(shè)備為后面接的那個設(shè)備上面的意思,#需設(shè)置 internal=0 才可!size=數(shù)值 :指定這塊登錄區(qū)的容量,#通常最小得要有 512 個 block,大約 2M 以上才行! -L :后面接這個文件系統(tǒng)的標(biāo)頭名稱Label name的意思! -r :指定realtime section的相關(guān)設(shè)置值,常見的有:extsize=數(shù)值 :就是那個重要的 extent 數(shù)值,一般不須設(shè)置,但有 RAID 時,最好設(shè)置與 swidth 的數(shù)值相同較佳!最小為 4K 最大為 1G 。沒有特殊需求的話,直接mkfs.xfs /dev/sda4即可,非常快就會創(chuàng)建一個 xfs文件系統(tǒng)
XFS 文件系統(tǒng) for RAID 性能優(yōu)化 (Optional):
磁盤陣列是多顆磁盤組成一顆大磁盤的意思, 利用同步寫入到這些磁盤的技術(shù),不但可以加快讀寫速度,還可以讓某一顆磁盤壞掉時,整個文件系統(tǒng)還是可以持續(xù)運行的狀態(tài)!那就是所謂的容錯。
基本上,磁盤陣列 (RAID) 就是通過將文件先細(xì)分為數(shù)個小型的分區(qū)區(qū)塊 (stripe) 之后,然后將眾多的 stripes 分別放到磁盤陣列里面的所有磁盤, 所以一個文件是被同時寫入到多個磁盤去,當(dāng)然性能會好一些。為了文件的保全性,所以在這些磁盤里面,會保留數(shù)個(與磁盤陣列的規(guī)劃有關(guān)) 備份磁盤 (parity disk), 以及可能會保留一個以上的備用磁盤(spare disk),這些區(qū)塊基本上會占用掉磁盤陣列的總?cè)萘?#xff0c;不過對于數(shù)據(jù)的保全會比較有保障!
那個分區(qū)區(qū)塊 stripe 的數(shù)值大多介于 4K 到 1M 之間,這與你的磁盤陣列卡支持的項目有關(guān)。stripe 與你的文件數(shù)據(jù)容量以及性能相關(guān)性較高。 當(dāng)你的系統(tǒng)大多是大型文件時,一般建議stripe 可以設(shè)置大一些,這樣磁盤陣列讀/寫的頻率會降低,性能會提升。如果是用于系統(tǒng),那么小文件比較多的情況下, stripe 建議大約在 64K 左右可能會有較佳的性能。不過,還是都須要經(jīng)過測試?yán)?#xff01;完全是 case by case 的情況。
文件系統(tǒng)的讀寫要能夠有最優(yōu)化,最好能夠搭配磁盤陣列的參數(shù)來設(shè)計,這樣性能才能夠起來!也就是說,你可以先在文件系統(tǒng)就將 stripe 規(guī)劃好, 那交給 RAID 去存取時,它就無須重復(fù)進行文件的 stripe 過程,性能當(dāng)然會更好!那格式化時,最優(yōu)化性能與什么咚咚有關(guān)呢?我們來假設(shè)個環(huán)境好了:
我有兩個線程的 CPU 數(shù)量,所以 agcount 最好指定為 2
當(dāng)初設(shè)置 RAID 的 stripe 指定為 256K 這么大,因此 su 最好設(shè)置為 256k
設(shè)置的磁盤陣列有 8 顆,因為是 RAID5 的設(shè)置,所以有一個 parity (備份碟),因此指定 sw 為 7
由上述的數(shù)據(jù)中,我們可以發(fā)現(xiàn)數(shù)據(jù)寬度 (swidth) 應(yīng)該就是 256K*7 得到 1792K,可以指定 extsize 為 1792k
ext4文件系統(tǒng)mkfs.ext4:
如果想要格式化為ext4的傳統(tǒng)Linux文件系統(tǒng)的話,可以使用如下:
mkfs.ext4 [-b size] [-L label] 設(shè)備名稱 選項與參數(shù): -b :設(shè)置 block 的大小,有 1K, 2K, 4K 的容量, -L :后面接這個設(shè)備的標(biāo)頭名稱。其他文件系統(tǒng)mkfs:
mkfs其實是個綜合命令,使用mkfs -t xfs時,他就會去找mkfs.xfs的相關(guān)參數(shù)給我們使用。如果想要知道系統(tǒng)還支持哪種文件系統(tǒng)的格式化功能,輸入mkfs再按兩次Tab即可
文件系統(tǒng)檢驗:
xfs_repair處理XFS文件系統(tǒng)
xfs_repair [-fnd] 設(shè)備名稱 -f:后面的設(shè)備其實是個文件而不是實體設(shè)備 -n:單純檢查并不修改文件系統(tǒng)的任何數(shù)據(jù) -d:通常用在單人維護模式下面,針對根目錄(/)#進行檢查與修復(fù)的操作,很危險,不要隨便用xfs_repair可以檢查/修復(fù)文件系統(tǒng),不過,因為修復(fù)文件系統(tǒng)是個龐大的任務(wù),因此,修復(fù)時該文件系統(tǒng)不能被掛載。所以,檢查與修復(fù)/dev/sda4沒啥問題,但是修復(fù)已被掛載的文件系統(tǒng)時,就會出現(xiàn)問題,卸載后再處理即可。
而根目錄無法被卸載,那根目錄有問題怎么辦?進入單人維護模式,加入d參數(shù)即可
fsck.ext4處理ext4文件系統(tǒng)
fsck是個綜合命令,針對而ext4的話,用fsck.ext4處理即可
fsck.ext4 [-pf] [-b 超級區(qū)塊] 設(shè)備名稱 -p:當(dāng)文件系統(tǒng)在修復(fù)時,若要回復(fù)Y的操作時,自動回復(fù)Y -f:強制檢查,一般來說,如果fsck沒有發(fā)現(xiàn)任何unclean的標(biāo)識,#不會主動進入詳細(xì)檢查的,若您想要強制fsck詳細(xì)檢查,就要-f -D:針對文件系統(tǒng)下的目錄進行最佳化配置 -b:后面接超級區(qū)塊的位置,一般這個選項用不到,但是若果你#的超級區(qū)塊做損壞時,通過這個參數(shù)即可利用文件系統(tǒng)內(nèi)備#份的超級區(qū)塊來嘗試恢復(fù),一般來說,超級區(qū)塊備份在如下:#1K區(qū)塊放在8193,2K區(qū)塊放在16384,4K區(qū)塊放在32768我們可以利用dumpe2fs -h /dev/sda5找到Blocks per group的信息,即可知道超級區(qū)塊的位置,比如是32768,然后fsck.ext4 -b 32768 /dev/sda5即可檢查文件系統(tǒng)超級區(qū)塊問題
注意,通常只有root且你的文件系統(tǒng)有問題的時候才使用此命令,否則正常情況下使用此命令,可能會造成對系統(tǒng)的危害。
被檢查的硬盤分區(qū)務(wù)必是卸載狀態(tài)
文件系統(tǒng)的掛載與卸載:
每次進行掛載前,要確定幾件事情:
- 單一文件系統(tǒng)不應(yīng)該被重復(fù)掛載在不同的掛載點(目錄)上
- 單一目錄不應(yīng)該重復(fù)掛載多個文件系統(tǒng)
- 要作為掛載點的目錄,理論上應(yīng)該是空目錄才行
如果你要掛載的目錄里面并不是空的,那么掛載了文件系統(tǒng)之后,原目錄下的東西就會暫時消失
(卸載后才會再次現(xiàn)身)
centOS現(xiàn)在的版本基本上不需要-t,系統(tǒng)會自動分析最恰當(dāng)?shù)奈募到y(tǒng)來嘗試掛載你需要的設(shè)備,系統(tǒng)的一句就是分析超級區(qū)塊搭配Linux自己的驅(qū)動程序去測試掛載,測試成功,就立刻自動使用該類型的文件系統(tǒng)掛載起來。
- /etc/filesystems:系統(tǒng)指定的測試掛載文件系統(tǒng)類型的優(yōu)先級
- /proc/filesystems:Linux系統(tǒng)已經(jīng)加載的文件系統(tǒng)類型
Linux支持的文件系統(tǒng)驅(qū)動程序?qū)懺谌缦履夸?#xff1a;
- /lib/modules/$ (uname -r) /kernel/fs/
例如ext4的驅(qū)動程序就寫在【/lib/modules/$ (uname -r) /kernel/ext4/】目錄下
掛載 xfs/ext4/vfat 等文件系統(tǒng):
掛載CD或DVD光盤:
光盤一掛載之后就無法退出光盤了,除非你將它卸載才能夠退出
盡量使用UUID去進行掛載,因為它一般不會變動,而一塊磁盤到了別人的電腦就可能不是sda這個名字了
因為是光盤,所以磁盤使用率達(dá)到了100%,所以你無法直接寫入任何數(shù)據(jù)到光盤中。
此外,如果你使用的是圖形界面,那么系統(tǒng)會自動幫你掛載這個光盤到/media目錄。也可以不卸載就直接退出(但是命令行不能這樣
掛載vfat中文移動磁盤(USB磁盤):
我們來掛載vfat格式的磁盤
mount -o codepage=950,iocharset=utf8 UUID="35BC-6D6B" /data/usb因為是中文文件名的數(shù)據(jù),那么可以在掛載時指定掛載文件系統(tǒng)的所使用的的語系。在man mount找到vfat文件格式當(dāng)中可以使用codepage來處理,中文語系的代碼是950,另外,如果想要指定中文是Unicode還是Big5,就要指定iocharset二選一了。
重新掛載根目錄與掛載不特定目錄:
整個目錄樹最重要的地方就是根目錄,根目錄不可能被卸載,如果你的掛載參數(shù)要改變或是根目錄出現(xiàn)【只讀】狀態(tài),如何重新掛載,最可能的處理方式就是重新啟動(reboot),不過你也可以這樣:
#將/重新掛載,并加入?yún)?shù)為rw與auto mount -o remount,rw,auto /重點是那個-o remountde,xx的選項與參數(shù)。要重新掛載時,這是個非常重要的機制。尤其是當(dāng)你進入單人維護模式下的時候,你的根目錄常會被系統(tǒng)掛載為只讀。
另外,我們也可以利用mount來將某個目錄掛載到另外一個目錄。這并不是掛載文件系統(tǒng),而是額外掛載某個目錄的方法。雖然下面的方法也可以用符號鏈接來實現(xiàn),不過某些不支持符號鏈接的程序運行中,就用到這個方法了
兩個目錄鏈接在同一個inode,這就是mount --bind的功能,所以從此進入/data/var也就是進入/var
umount(將設(shè)備文件卸載):
-umount [-fn] 設(shè)備文件名或掛載點 -f:強制卸載,可用在類似網(wǎng)絡(luò)系統(tǒng)(NFS)無法讀取到的情況下 -l:立刻卸載文件系統(tǒng),比-f還強 -n:不更新/etc/mtab情況下卸載就是直接將已經(jīng)掛載的文件系統(tǒng)卸載,卸載之后,可以使用df或mount看看是否還存在于目錄中。卸載的方式,可以輸入設(shè)備文件名或掛載點,都行。
卸載的基本原則就是那塊磁盤不是正在被使用,你在那個磁盤目錄下,就不能卸載它,除非你離開目錄
磁盤/文件系統(tǒng)參數(shù)自定義:
mknod:
Linux里萬物皆文件,那么文件是如何代表設(shè)備的,就是靠major(主要)和minor(次要)數(shù)值來替代
上面的8就是主要設(shè)備代碼(major),而0~5就是次要設(shè)備代碼(minor)。我們的Linux內(nèi)核支持的設(shè)備文件數(shù)據(jù)就是通過這兩個數(shù)值來決定的。
一般我們不需要手動建立設(shè)備文件。不過某些情況下面我們可能還是要手動處理設(shè)備文件,例如在某些服務(wù)被chroot到特定目錄下時,就需要這樣做了
mknod 設(shè)備文件名 [bcp] [Major] [Minor] b:設(shè)置設(shè)備名稱成為一個外接存儲設(shè)備文件,例如磁盤等 c:設(shè)置設(shè)備名稱成為一個外接輸入設(shè)備文件,例如鼠標(biāo)等 p:設(shè)置設(shè)備名稱成為一個FIFO文件 Major:主要設(shè)備碼 Minor:次要設(shè)備碼xfs_admin修改XFS文件系統(tǒng)的UUID與Label name:
如果你當(dāng)初格式化的時候忘記加入了標(biāo)頭名稱,后來想再加入,無需格式化,直接使用xfs_admin即可,它還可以設(shè)置UUID
該命令只對xfs文件系統(tǒng)類型有效
xfs_admin [-lu] [-L label] [-U uuid] 設(shè)備名 -l:列出這個設(shè)備的label name -u:列出這個設(shè)備的UUID -L:設(shè)置這個設(shè)備的Label name -U:設(shè)置這個設(shè)備的UUIDtune2fs修改ext4的label name與UUID
tune2fs [-l] [-L Label] [-U uuid] 設(shè)備文件名 -l:類似dumpe2fs,將superblock內(nèi)的數(shù)據(jù)讀出來 -L:修改Label name -U:修改UUID設(shè)置啟動掛載(fstab與mtab):
可不可以在啟動時就將我要的文件系統(tǒng)掛載好呢?這樣我就不用每次進入Linux都要掛載一次。當(dāng)然可以,直接到/etc/fstab里面去修改就行,不過,系統(tǒng)掛載有一些限制:
- 根目錄/是必須掛載的,而且一定要先于其他掛載點被掛載進來
- 其他掛載點必須為已建立的目錄,可任意指定,但一定要遵循必須得系統(tǒng)目錄架構(gòu)原則(FHS)
- 所有掛載點在同一時間內(nèi),只能掛載一次
- 所有的硬盤在同一時間內(nèi),只能掛載一次
- 如若進行卸載,您必須將工作目錄轉(zhuǎn)移到掛載點之外
下面那6個字段分別是
[設(shè)備/UUID等] [掛載點] [文件系統(tǒng)] [文件系統(tǒng)參數(shù)] [dump] [fsck]設(shè)備/UUID等:
這個字段可以填寫的數(shù)據(jù)主要有三個項目:
- 文件系統(tǒng)或磁盤的設(shè)備文件名,如/dev/sda2等
- 文件系統(tǒng)的UUID名稱(UUID=?)
- 文件系統(tǒng)的LABEL名稱(LABEL=?)
自己編寫的時候?qū)懩膫€都行
掛載點:
一定是目錄
磁盤分區(qū)的文件系統(tǒng):
在手動掛載時可以讓系統(tǒng)自動測試掛載,但在這個文件當(dāng)中我們必須要手動寫入文件系統(tǒng)才行,包括:xfs、ext4、fab、reiserf、nfs等
文件系統(tǒng)參數(shù):
mount那里的那一幫子
| 參數(shù) | 內(nèi)容意義 |
| async/sync 異步/同步 | 配置磁盤是否以異步方式運行!默認(rèn)為 async(效能較佳) |
| auto/noauto 自動/非自動 | 當(dāng)下達(dá) mount -a 時,此文件系統(tǒng)是否會被主動測試掛載。默認(rèn)為 auto。 |
| rw/ro 可擦寫/只讀 | 讓該分割槽以可擦寫或者是只讀的型態(tài)掛載上來,如果你想要分享的數(shù)據(jù)是不給用戶隨意變更的, 這里也能夠配置為只讀。則不論在此文件系統(tǒng)的文件是否配置 w 權(quán)限,都無法寫入喔! |
| exec/noexec 可運行/不可運行 | 限制在此文件系統(tǒng)內(nèi)是否可以進行『運行』的工作?如果是純粹用來儲存數(shù)據(jù)的, 那么可以配置為 noexec 會比較安全,相對的,會比較麻煩! |
| user/nouser 允許/不允許使用者掛載 | 是否允許用戶使用 mount 命令來掛載呢?一般而言,我們當(dāng)然不希望一般身份的 user 能使用 mount 啰,因為太不安全了,因此這里應(yīng)該要配置為 nouser 啰! |
| suid/nosuid 具有/不具有 suid 權(quán)限 | 該文件系統(tǒng)是否允許 SUID 的存在?如果不是運行文件放置目錄,也可以配置為 nosuid 來取消這個功能! |
| defaults | 同時具有?rw, suid, dev, exec, auto, nouser, async?等參數(shù)。 基本上,默認(rèn)情況使用 defaults 配置即可! |
能否被dump備份使用:
dump是一個用來做備份的命令,不過現(xiàn)在有太多備份方案,這個項目可以不用理會,填0就好
是否以fsck檢驗扇區(qū)
早期啟動流程中,會有一段時間去檢驗本機的文件系統(tǒng),看看文件系統(tǒng)是否完整(clean),不過這個階段主要是通過fsck去完成,我們現(xiàn)在用的xfs文件系統(tǒng)就沒有辦法適用,因為xfs會自己自行檢驗,填0即可
?
?
/etc/fstab是啟動時的配置文件,不過,實際文件系統(tǒng)的掛載是記錄到 /etc/mtab 和 /proc/mounts 這兩個文件中的。每次我們在修改文件系統(tǒng)的掛載時,也會同時修改這兩個文件。但是,萬一發(fā)生你在/etc/fstab輸入的數(shù)據(jù)有誤,導(dǎo)致無法順利啟動成功,而進入單人模式中,那時候的/可是只讀的狀態(tài),當(dāng)然你無法修改/etc/fstab,也無法更新/etc/mtab,怎么辦?沒關(guān)系,可以用這招:
特殊設(shè)備loop掛載(鏡像文件不刻錄就掛載使用)
如果有光盤鏡像文件,或是使用文件作為磁盤的方式時,那就要使用特別的方法來將他掛載起來,不需要刻錄
掛載CD/DVD鏡像文件:
想像一下如果今天我們從中科大鏡像站下載了 Linux 或者是其他所需CD/DVD的鏡像文件后, 難道一定需要刻錄成為光盤才能夠使用該文件里面的數(shù)據(jù)嗎?當(dāng)然不是啦!我們可以通過 loop 設(shè)備來掛載的!
[root@study ~]# ll -h /tmp/CentOS-7.0-1406-x86_64-DVD.iso -rw-r--r--. 1 root root 3.9G Jul 7 2014 /tmp/CentOS-7.0-1406-x86_64-DVD.iso # 看到上面的結(jié)果吧!這個文件就是鏡像文件,文件非常的大吧! [root@study ~]# mkdir /data/centos_dvd [root@study ~]# mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd [root@study ~]# df /data/centos_dvd Filesystem 1K-blocks Used Available Use% Mounted on /dev/loop0 4050860 4050860 0 100% /data/centos_dvd # 就是這個項目! .iso 鏡像文件內(nèi)的所有數(shù)據(jù)可以在 /data/centos_dvd 看到! [root@study ~]# ll /data/centos_dvd total 607 -rw-r--r--. 1 500 502 14 Jul 5 2014 CentOS_BuildTag <==瞧!就是DVD的內(nèi)容啊! drwxr-xr-x. 3 500 502 2048 Jul 4 2014 EFI -rw-r--r--. 1 500 502 611 Jul 5 2014 EULA -rw-r--r--. 1 500 502 18009 Jul 5 2014 GPL drwxr-xr-x. 3 500 502 2048 Jul 4 2014 images .....(下面省略)..... [root@study ~]# umount /data/centos_dvd/ # 測試完成!記得將數(shù)據(jù)給他卸載!非常方便吧!如此一來我們不需要將這個文件刻錄成為光盤或者是 DVD 就能夠讀取內(nèi)部的數(shù)據(jù)了! 換句話說,你也可以在這個文件內(nèi)“動手腳”去修改文件的!這也是為什么很多鏡像文件提供后,還得要提供驗證碼 (MD5) 給使用者確認(rèn)該鏡像文件沒有問題!
建立大文件以制作loop設(shè)備文件:
想一想,既然能夠掛載 DVD 的鏡像文件,那么我能不能制作出一個大文件,然后將這個文件格式化后掛載呢? 好問題!這是個有趣的動作!而且還能夠幫助我們解決很多系統(tǒng)的分區(qū)不良的情況呢!舉例來說,如果當(dāng)初在分區(qū)時, 你只有分區(qū)出一個根目錄,假設(shè)你已經(jīng)沒有多余的容量可以進行額外的分區(qū)的!偏偏根目錄的容量還很大! 此時你就能夠制作出一個大文件,然后將這個文件掛載!如此一來感覺上你就多了一個分區(qū)啰!用途非常的廣泛啦!
下面我們在 /srv 下創(chuàng)建一個 512MB 左右的大文件,然后將這個大文件格式化并且實際掛載來玩一玩!
- 建立大型文件
dd 就好像在疊磚塊一樣,將 512 塊,每塊 1MB 的磚塊堆疊成為一個大文件 (/srv/loopdev)!
- 大型文件的格式化
默認(rèn) xfs 不能夠格式化文件的,所以要格式化文件得要加入特別的參數(shù)(-f:強制格式化)才行
[root@study ~]# mkfs.xfs -f /srv/loopdev [root@study ~]# blkid /srv/loopdev /srv/loopdev: UUID="7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee" TYPE="xfs"- 掛載
利用mount的-o參數(shù)來掛載
[root@study ~]# mount -o loop UUID="7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee" /mnt [root@study ~]# df /mnt Filesystem 1K-blocks Used Available Use% Mounted on /dev/loop0 520876 26372 494504 6% /mnt通過這個簡單的方法,感覺上你就可以在原本的分區(qū)在不更動原有的環(huán)境下制作出你想要的分區(qū)就是了! 這東西很好用的!尤其是想要玩 Linux 上面的“虛擬機”的話, 也就是以一部Linux 主機再切割成為數(shù)個獨立的主機系統(tǒng)時,類似 VMware 這類的軟件, 在 Linux 上使用xen 這個軟件,他就可以配合這種 loop device 的文件類型來進行根目錄的掛載,真的非常有用的喔! ^^
比較特別的是,CentOS 7.x 越來越聰明了,現(xiàn)在你不需要下達(dá) -o loop 這個選項與參數(shù),它同樣可以被系統(tǒng)掛上來! 連直接輸入 blkid 都會列出這個文件內(nèi)部的文件系統(tǒng)耶!相當(dāng)有趣!不過,為了考慮向下兼容性,鳥哥還是建議你加上 loop 比較妥當(dāng)喔! 現(xiàn)在,請將這個文件系統(tǒng)永遠(yuǎn)的自動掛載起來吧!
永久自動掛載:
[root@study ~]# nano /etc/fstab /srv/loopdev /data/file xfs defaults**,loop** 0 0 # 畢竟系統(tǒng)大多僅查詢 block device 去找出 UUID 而已,因此使用文件創(chuàng)建的 filesystem, # 最好還是使用原本的文件名來處理,應(yīng)該比較不容易出現(xiàn)錯誤訊息的! [root@study ~]# umount /mnt [root@study ~]# mkdir /data/file [root@study ~]# mount -a [root@study ~]# df /data/file Filesystem 1K-blocks Used Available Use% Mounted on /dev/loop0 520876 26372 494504 6% /data/file內(nèi)存交換分區(qū)(swap)之創(chuàng)建:
我們知道 CPU 所讀取的數(shù)據(jù)都來自于內(nèi)存, 那當(dāng)內(nèi)存不足的時候,為了讓后續(xù)的程序可以順利的運行,因此在內(nèi)存中暫不使用的程序與數(shù)據(jù)就會被挪到 swap 中了。 此時內(nèi)存就會空出來給需要執(zhí)行的程序載入。由于 swap 是用磁盤來暫時放置內(nèi)存中的信息,所以用到 swap 時,你的主機磁盤燈就會開始閃個不停啊!
使用物理分區(qū)創(chuàng)建內(nèi)存交換分區(qū):
1. 分區(qū):先使用 gdisk 在你的磁盤中分區(qū)出一個分區(qū)給系統(tǒng)作為 swap 。由于 Linux 的gdisk 默認(rèn)會將分區(qū)的 ID 設(shè)置為 Linux 的文件系統(tǒng),所以你可能還得要設(shè)置一下 system ID 就是了。
2. 格式化:利用創(chuàng)建 swap 格式的“mkswap 設(shè)備文件名”就能夠格式化該分區(qū)成為 swap 格式
3. 使用:最后將該 swap 設(shè)備啟動,方法為:“swapon 設(shè)備文件名”。
4. 觀察:最終通過 free 與 swapon -s 這個指令來觀察一下內(nèi)存的用量吧!
?
首先我們用gdisk進行分區(qū),Hex code寫8200
w退出保存后,用lsblk可以看見我們的新分區(qū)
用mkswap 格式化該分區(qū)為swap格式
開始觀察看看:
最后寫入配置文件,因為是swap,所以沒有掛載點
使用文件創(chuàng)建內(nèi)存交換文件:
如果是在實體分區(qū)無法支持的環(huán)境下,此時前一小節(jié)提到的 loop 設(shè)備創(chuàng)建方法就派的上用場啦! 與實體分區(qū)不一樣的,這個方法只是利用 dd 去創(chuàng)建一個大文件而已。多說無益,我們就再通過文件創(chuàng)建的方法創(chuàng)建一個 128 MB 的內(nèi)存交換空間吧
用dd新增大文件
使用mkswap將/tmp/swap格式化為內(nèi)存交換文件的文件格式
這個命令寫錯字符將可能導(dǎo)致您的文件系統(tǒng)掛掉
使用swapon來將/tmp/swap啟動
接下來寫入/etc/fstab,注意,這里是個大文件,系統(tǒng)僅會查詢區(qū)塊設(shè)備(block device)不會查詢文件,所以千萬不能用UUID,不然系統(tǒng)會查不到
接下來用swapoff /tmp/swap? /dev/sda6 來關(guān)閉示范的兩個swap分區(qū),再用swapon -a全部開啟,如果fstab設(shè)置無誤,這些就全部開啟
說實話,swap 在目前的桌面電腦來講,存在的意義已經(jīng)不大了!這是因為目前的 x86 主機所含的內(nèi)存實在都太大了 (一般入門級至少也都有 4GB 了),所以,我們的 Linux 系統(tǒng)大概都用不到 swap 這個玩意兒的。不過, 如果是針對服務(wù)器或者是工作站這些常年上線的系統(tǒng)來說的話,那么,無論如何,swap 還是需要創(chuàng)建的。
因為 swap 主要的功能是當(dāng)實體內(nèi)存不夠時,則某些在內(nèi)存當(dāng)中所占的程序會暫時被移動到swap 當(dāng)中,讓實體內(nèi)存可以被需要的程序來使用。另外,如果你的主機支持電源管理模式,也就是說,你的 Linux 主機系統(tǒng)可以進入“休眠”模式的話,那么, 運行當(dāng)中的程序狀態(tài)則會被紀(jì)錄到 swap 去,以作為“喚醒”主機的狀態(tài)依據(jù)! 另外,有某些程序在運行時,本來就會利用swap 的特性來存放一些數(shù)據(jù)段, 所以, swap 來是需要創(chuàng)建的!只是不需要太大!
文件系統(tǒng)的特殊觀察與操作:
磁盤空間浪費問題:
我們在前面的 EXT2 data block 介紹中談到了一個 block 只能放置一個文件, 因此太多小文件將會浪費非常多的磁盤容量。但你有沒有注意到,整個文件系統(tǒng)中包括 superblock, inodetable 與其他中介數(shù)據(jù)等其實都會浪費磁盤容量喔!所以當(dāng)我們在 /dev/vda4, /dev/vda5 創(chuàng)建起 xfs/ext4 文件系統(tǒng)時, 一掛載就立刻有很多容量被用掉了!
另外,不知道你有沒有發(fā)現(xiàn)到,當(dāng)你使用 ls -l 去查詢某個目錄下的數(shù)據(jù)時,第一行都會出現(xiàn)一個“total”的字樣! 那是啥東西?其實那就是該目錄下的所有數(shù)據(jù)所耗用的實際 block 數(shù)量 *block 大小的值。 我們可以通過 ll -s 來觀察看看上述的意義:
[root@study ~]# ll -sh total 12K 4.0K -rw-------. 1 root root 1.8K May 4 17:57 anaconda-ks.cfg 4.0K -rw-r--r--. 2 root root 451 Jun 10 2014 crontab 0 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 crontab2 -> /etc/crontab 4.0K -rw-r--r--. 1 root root 1.9K May 4 18:01 initial-setup-ks.cfg 0 -rw-r--r--. 1 root root 0 Jun 16 01:11 test1 0 drwxr-xr-x. 2 root root 6 Jun 16 01:11 test2 0 -rw-rw-r--. 1 root root 0 Jun 16 01:12 test3 0 drwxrwxr-x. 2 root root 6 Jun 16 01:12 test4從上面的特殊字體部分,那就是每個文件所使用掉 block 的容量!舉例來說,那個 crontab 雖然僅有 451Bytes , 不過他卻占用了整個 block (每個 block 為 4K),所以將所有的文件的所有的 block 加總就得到 12KBytes 那個數(shù)值了。 如果計算每個文件實際容量的加總結(jié)果,其實只有不到 5K 而已
利用GNU的parted進行分區(qū)操作:
雖然你可以使用 gdisk/fdisk 很快速的將你的分區(qū)切割妥當(dāng),不過 gdisk 主要針對 GPT 而fdisk 主要支持 MBR ,對 GPT 的支持還不夠! 所以使用不同的分區(qū)時,得要先查詢到正確的分區(qū)表才能用適合的指令,好麻煩!有沒有同時支持的指令呢?有的!那就是 parted 。
[root@study ~]# parted [設(shè)備] [指令 [參數(shù)]] 新增分區(qū):mkpart [primary|logical|Extended] [ext4|vfat|xfs] 開始 結(jié)束 顯示分區(qū):print 刪除分區(qū):rm [partition] [root@study ~]# parted /dev/sda print Model: Virtio Block Device (virtblk) <==磁盤接口與型號 Disk /dev/sda: 42.9GB <==磁盤文件名與容量 Sector size (logical/physical): 512B/512B <==每個扇區(qū)的大小 Partition Table: gpt <==是 GPT 還是 MBR 分區(qū) Disk Flags: pmbr_boot Number Start End Size File system Name Flags 1 1049kB 3146kB 2097kB bios_grub 2 3146kB 1077MB 1074MB xfs 3 1077MB 33.3GB 32.2GB lvm 4 33.3GB 34.4GB 1074MB xfs Linux filesystem 5 34.4GB 35.4GB 1074MB ext4 Microsoft basic data 6 35.4GB 36.0GB 537MB linux-swap(v1) Linux swap上面是最簡單的 parted 指令功能簡介,你可以使用“ man parted ”,或者是“ parted /dev/sda help mkpart ”去查詢更詳細(xì)的數(shù)據(jù)。比較有趣的地方在于分區(qū)表的輸出。我們將上述的分區(qū)表示意拆成六部分來說明:
1. Number:這個就是分區(qū)的號碼啦!舉例來說,1號代表的是 /dev/sda1 的意思;
2. Start:分區(qū)的起始位置在這顆磁盤的多少 MB 處?有趣吧!他以容量作為單位喔!
3. End:此分區(qū)的結(jié)束位置在這顆磁盤的多少 MB 處?
4. Size:由上述兩者的分析,得到這個分區(qū)有多少容量;
5. File system:分析可能的文件系統(tǒng)類型為何的意思!
6. Name:就如同 gdisk 的 System ID 之意。
不過 start 與 end 的單位竟然不一致!好煩~如果你想要固定單位,例如都用 MB 顯示的話,可以這樣做:
parted /dev/sda unit mb print如果你想要將原本的 MBR 改成 GPT 分區(qū)表,或原本的 GPT 分區(qū)表改成 MBR 分區(qū)表,也能使用 parted ! 但是請不要使用 sda 來測試!因為分區(qū)表格式不能轉(zhuǎn)換!因此進行下面的測試后,在該磁盤的系統(tǒng)應(yīng)該是會損毀的! 所以我拿一顆沒有使用的U盤來測試,所以文件名會變成 /dev/vda 喔!再講一次!不要惡搞喔!
下面操作危險,無法復(fù)原!
[root@study ~]# parted /dev/vda print Model: ATA QEMU HARDDISK (scsi) Disk /dev/vda: 2148MB Sector size (logical/physical): 512B/512B Partition Table: msdos # 確實顯示的是 MBR 的 msdos 格式喔! [root@study ~]# parted /dev/vda mklabel gpt Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue? Yes/No? y [root@study ~]# parted /dev/vda print # 你應(yīng)該就會看到變成 gpt 的模樣!只是...后續(xù)的分區(qū)就全部都死掉了!接下來我們嘗試來創(chuàng)建一個全新的分區(qū)吧!再次的創(chuàng)建一個 512MB 的分區(qū)來格式化為 vfat,且掛載于 /data/win 喔!
[root@study ~]# parted /dev/sda print .....(前面省略)..... Number Start End Size File system Name Flags 7 36.0GB 36.5GB 522MB primary [root@study ~]# partprobe [root@study ~]# lsblk /dev/sda7 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda7 252:7 0 498M 0 part # 要確定它是真的存在才行! [root@study ~]# mkfs -t vfat /dev/sda7 [root@study ~]# blkid /dev/sda7 /dev/sda7: SEC_TYPE="msdos" UUID="6032-BF38" TYPE="vfat" [root@study ~]# nano /etc/fstab UUID="6032-BF38" /data/win vfat defaults 0 0 [root@study ~]# mkdir /data/win [root@study ~]# mount -a [root@study ~]# df /data/win Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda7 509672 0 509672 0% /data/win事實上,你應(yīng)該使用 gdisk 來處理 GPT 分區(qū)就好了!不過,某些特殊時刻,例如你要自己寫一只腳本,讓你的分區(qū)全部一口氣創(chuàng)建, 不需要 gdisk 一條一條指令去進行時,那么 parted就非常有效果了!因為他可以直接進行 partition 而不需要跟用戶互動!這就是它的最大好處! 建議至少你要操作過幾次 parted ,知道這家伙的用途!未來有需要再回來查!或使用 man parted 去處理喔!
這一章終于過完了,博客都兩萬字了,呼~下回再見!
?
?
?
?
博客:is-hash.com
商業(yè)轉(zhuǎn)載 請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載 請標(biāo)明出處,謝謝
?
總結(jié)
以上是生活随笔為你收集整理的Linux的基本学习(四)——磁盘与文件系统管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LoadRunner-登陆web tou
- 下一篇: 【每日新闻】阿里云成中国唯一全面提供IP