Linux應該這麼學第6章儲存結構與磁碟劃分

tjjingpan發表於2018-11-02

本章講解了如下內容:
➢ 一切從“/”開始;
➢ 物理裝置的命名規則;
➢ 檔案系統與資料資料;
➢ 掛載硬體裝置;
➢ 新增硬體裝置;
➢ 新增交換分割槽;
➢ 磁碟容量配額;
➢ 軟硬方式連結。
Linux 系統中頗具特色的檔案儲存結構常常搞得新手頭暈腦脹,本章將從 Linux 系統中的
檔案儲存結構開始,講述檔案系統層次化標準(FHS,Filesystem Hierarchy Standard)、udev 硬
件命名規則以及硬碟分割槽的規劃方法。
為了讓讀者更好地理解檔案系統的作用,劉遄老師將在本章中詳細地分析 Linux 系統中
最常見的 Ext3、Ext4 與 XFS 檔案系統的不同之處,並帶領各位讀者著重練習硬碟裝置分割槽、
格式化以及掛載等常用的硬碟管理操作,以便熟練掌握檔案系統的使用方法。
在打下堅實的理論基礎與完成一些相關的實踐練習後,我們將進一步完整地部署 SWAP
交換分割槽、配置 quota 磁碟配額服務,以及掌握 ln 命令帶來的軟硬連結。相信各位讀者在學
習完本章後,會對 Linux 系統以及 Windows 系統中的磁碟儲存以及檔案系統有深入的理解。

6.1 一切從“/”開始

Linux 系統中,目錄、字元裝置、塊裝置、套接字、印表機等都被抽象成了檔案,即劉遄
老師所一直強調的“Linux 系統中一切都是檔案”。既然平時我們打交道的都是檔案,那麼又應該
如何找到它們呢?在 Windows 作業系統中,想要找到一個檔案,我們要依次進入該檔案所在的磁
盤分割槽(假設這裡是 D 盤),然後在進入該分割槽下的具體目錄,最終找到這個檔案。但是在 Linux
系統中並不存在 C/D/E/F 等碟符,Linux 系統中的一切檔案都是從“根(/)”目錄開始的,並按照
檔案系統層次化標準(FHS)採用樹形結構來存放檔案,以及定義了常見目錄的用途。另外,Linux
系統中的檔案和目錄名稱是嚴格區分大小寫的。例如,root、rOOt、Root、rooT 均代表不同的目
錄,並且檔名稱中不得包含斜槓(/)。Linux 系統中的檔案儲存結構如圖 6-1 所示。

前文提到的 FHS 是根據以往無數 Linux 系統使用者和開發者的經驗而總結出來的,是使用者
在 Linux 系統中儲存檔案時需要遵守的規則,用於指導我們應該把檔案儲存到什麼位置,以
及告訴使用者應該在何處找到所需的檔案。但是,FHS 對於使用者來講只能算是一種道德上的約
束,有些使用者就是懶得遵守,依然會把檔案到處亂放,有些甚至從來沒有聽說過它。這裡並不
是號召各位讀者去譴責他們,而是建議大家要靈活運用所學的知識,千萬不要認準這個 FHS
協定只講死道理,不然吃虧的可就是自己了。在 Linux 系統中,最常見的目錄以及所對應的
存放內容如表 6-1 所示。

在 Linux 系統中另外還有一個重要的概念—路徑。路徑指的是如何定位到某個檔案,
分為絕對路徑與相對路徑。絕對路徑指的是從根目錄(/)開始寫起的檔案或目錄名稱,而相
對路徑則指的是相對於當前路徑的寫法。我們來看下面這個例子,以幫助大家理解。假如有

位外國遊客來到中國潘家園旅遊,當前內急但是找不到洗手間,特意向您問路,那麼您有兩
種正確的指路方法。

➢絕對路徑(absolute path) 首先坐飛機來到中國,到了北京出首都機場坐機場快軌到
三元橋,然後換乘 10 號線到潘家園站,出站後坐 34 路公交車到農光裡,下車後路口
左轉。
➢ 相對路徑(relative path)前面路口左轉。
這兩種方法都正確。如果您說的是絕對路徑,那麼任何一位外國遊客都可以按照
這個提示找到潘家園的洗手間,但是太繁瑣了。如果您說的是相對路徑,雖然表達很
簡練,但是這位外國遊客只能從當前位置(不見得是潘家園)出發找到洗手間,因此
並不能保證在前面的路口左轉後可以找到洗手間,由此可見,相對路徑不具備普適
性。
如果各位讀者現在還是不能理解相對路徑和絕對路徑的區別,也不要著急,以後通過實
踐練習肯定可以徹底搞明白。當前建議大家先記住 FHS 中規範的目錄作用,這將在以後派上
用場。 

6.2 物理裝置的命名規則

在 Linux 系統中一切都是檔案,硬體裝置也不例外。既然是檔案,就必須有檔名稱。
系統核心中的 udev 裝置管理器會自動把硬體名稱規範起來,目的是讓使用者通過裝置檔案的名
字可以猜出裝置大致的屬性以及分割槽資訊等;這對於陌生的裝置來說特別方便。另外,udev
裝置管理器的服務會一直以守護程式的形式執行並偵聽核心發出的訊號來管理/dev 目錄下的
裝置檔案。Linux 系統中常見的硬體裝置的檔名稱如表 6-2 所示。

由於現在的 IDE 裝置已經很少見了,所以一般的硬碟裝置都會是以“/dev/sd”開頭的。
而一臺主機上可以有多塊硬碟,因此係統採用 a~p 來代表 16 塊不同的硬碟(預設從 a 開始
分配),而且硬碟的分割槽編號也很有講究:
➢ 主分割槽或擴充套件分割槽的編號從 1 開始,到 4 結束;
➢ 邏輯分割槽從編號 5 開始。

國內很多 Linux 培訓講師以及很多知名 Linux 圖書在講到裝置和分割槽名稱時,總會講錯
兩個知識點。第一個知識點是裝置名稱的理解錯誤。很多培訓講師和 Linux 技術圖書中會提
到,比如/dev/sda 表示主機板上第一個插槽上的儲存裝置,學員或讀者在實踐操作的時候會發現
果然如此,因此也就對這條理論知識更加深信不疑。但真相不是這樣的,/dev 目錄中 sda 裝置
之所以是 a,並不是由插槽決定的,而是由系統核心的識別順序來決定的,而恰巧很多主機板的
插槽順序就是系統核心的識別順序,因此才會被命名為/dev/sda。大家以後在使用 iSCSI 網路
儲存裝置時就會發現,明明主機板上第二個插槽是空著的,但系統卻能識別到/dev/sdb 這個裝置
就是這個道理。
第二個知識點是對分割槽名稱的理解錯誤。很多 Linux 培訓講師會告訴學員,分割槽的編號
代表分割槽的個數。比如 sda3 表示這是裝置上的第三個分割槽,而學員在做實驗的時候確實也會
得出這樣的結果,但是這個理論知識是錯誤的,因為分割槽的數字編碼不一定是強制順延下來
的,也有可能是手工指定的。因此 sda3 只能表示是編號為 3 的分割槽,而不能判斷 sda 裝置上
已經存在了 3 個分割槽。
在填了這兩個“坑”之後,劉遄老師再來分析一下/dev/sda5 這個裝置檔名稱包含哪些
資訊,如圖 6-2 所示。

 首先,/dev/目錄中儲存的應當是硬體裝置檔案;其次,sd 表示是儲存裝置;然後,a 表示
系統中同類介面中第一個被識別到的裝置,最後,5 表示這個裝置是一個邏輯分割槽。一言以蔽
之,“/dev/sda5”表示的就是“這是系統中第一塊被識別到的硬體裝置中分割槽編號為 5 的邏輯
分割槽的裝置檔案”。考慮到我們的很多讀者完全沒有 Linux 基礎,不太容易理解前面所說的主
分割槽、擴充套件分割槽和邏輯分割槽的概念,因此接下來簡單科普一下硬碟相關的知識。
正是因為計算機有了硬碟裝置,我們才可以在玩遊戲的過程中或遊戲通關之後隨時存檔,
而不用每次重頭開始。硬碟裝置是由大量的扇區組成的,每個扇區的容量為 512 位元組。其中
第一個扇區最重要,它裡面儲存著主開機記錄與分割槽表資訊。就第一個扇區來講,主引導記
錄需要佔用 446 位元組,分割槽表為 64 位元組,結束符佔用 2 位元組;其中分割槽表中每記錄一個分割槽
資訊就需要 16 位元組,這樣一來最多隻有 4 個分割槽資訊可以寫到第一個扇區中,這 4 個分割槽就
是 4 個主分割槽。第一個扇區中的資料資訊如圖 6-3 所示。

現在,問題來了—第一個扇區最多隻能建立出 4 個分割槽?於是為了解決分割槽個數不夠
的問題,可以將第一個扇區的分割槽表中 16 位元組(原本要寫入主分割槽資訊)的空間(稱之為擴
展分割槽)拿出來指向另外一個分割槽。也就是說,擴充套件分割槽其實並不是一個真正的分割槽,而更像
是一個佔用 16 位元組分割槽表空間的指標—一個指向另外一個分割槽的指標。這樣一來,使用者一
般會選擇使用 3 個主分割槽加 1 個擴充套件分割槽的方法,然後在擴充套件分割槽中建立出數個邏輯分割槽,
從而來滿足多分割槽(大於 4 個)的需求。當然,就目前來講大家只要明白為什麼主分割槽不能
超過 4 個就足夠了。主分割槽、擴充套件分割槽、邏輯分割槽可以像圖 6-4 那樣來規劃。

 

6.3 檔案系統與資料資料 

使用者在硬體儲存裝置中執行的檔案建立、寫入、讀取、修改、轉存與控制等操作都是依
靠檔案系統來完成的。檔案系統的作用是合理規劃硬碟,以保證使用者正常的使用需求。Linux
系統支援數十種的檔案系統,而最常見的檔案系統如下所示。
➢EX3 :是一款日誌檔案系統,能夠在系統異常當機時避免檔案系統資料丟失,並能
自動修復資料的不一致與錯誤。然而,當硬碟容量較大時,所需的修復時間也會很
《Linux 就該這麼學》 - 必讀的 Linux 系統與紅帽 RHCE 認證免費自學書籍
138
長,而且也不能百分之百地保證資料不會丟失。它會把整個磁碟的每個寫入動作
的細節都預先記錄下來,以便在發生異常當機後能回溯追蹤到被中斷的部分,然
後嘗試進行修復。
➢EX4 :Ext3 的改進版本,作為 RHEL 6 系統中的預設檔案管理系統,它支援的儲存容
量高達 1EB(1EB=1,073,741,824GB),且能夠有無限多的子目錄。另外,Ext4 檔案系
統能夠批量分配 block 塊,從而極大地提高了讀寫效率。
➢ XFS:是一種高效能的日誌檔案系統,而且是 RHEL 7 中預設的檔案管理系統,它的
優勢在發生意外當機後尤其明顯,即可以快速地恢復可能被破壞的檔案,而且強大的
日誌功能只用花費極低的計算和儲存效能。並且它最大可支援的儲存容量為 18EB,
這幾乎滿足了所有需求。

RHEL 7 系統中一個比較大的變化就是使用了 XFS 作為檔案系統,這不同於 RHEL 6 使
用的 Ext4。從紅帽公司官方釋出的說明來看,這確實是一個不小的進步,但是劉遄老師在實
測中發現並不完全屬實。因為單純就測試一款檔案系統的“讀取”效能來說,到底要讀取多少
個檔案,每個檔案的大小是多少,讀取檔案時的 CPU、記憶體等系統資源的佔用率如何,以及
不同的硬體配置是否會有不同的影響,因此在充分考慮到這些不確定因素後,實在不敢直接
照抄紅帽官方的介紹。我個人認為 XFS 雖然在效能方面比 Ext4 有所提升,但絕不是壓倒性
的,因此 XFS 檔案系統最卓越的亮點應該當屬可支援高達 18EB 的儲存容量吧。
就像拿到了一張未裁切的完整紙張那樣,我們首先要進行裁切以方便使用,然後在裁切後
的紙張上畫格以便能書寫工整。在拿到了一塊新的硬碟儲存裝置後,也需要先分割槽,然後再格
式化檔案系統,最後才能掛載並正常使用。硬碟的分割槽操作取決於您的需求和硬碟大小;您也
可以選擇不進行分割槽,但是必須對硬碟進行格式化處理。接下來劉遄老師再向大家簡單地科普
一下硬碟在格式化後發生的事情。再次強調,不用刻意去記住,只要能看懂就行了。

日常在硬碟需要儲存的資料實在太多了,因此 Linux 系統中有一個名為 super block 的“硬
盤地圖”。Linux 並不是把檔案內容直接寫入到這個“硬碟地圖”裡面,而是在裡面記錄著整
個檔案系統的資訊。因為如果把所有的檔案內容都寫入到這裡面,它的體積將變得非常大,
而且檔案內容的查詢與寫入速度也會變得很慢。Linux 只是把每個檔案的許可權與屬性記錄在
inode 中,而且每個檔案佔用一個獨立的 inode 表格,該表格的大小預設為 128 位元組,裡面記
錄著如下資訊:
➢ 該檔案的訪問許可權(read、write、execute);
➢ 該檔案的所有者與所屬組(owner、group);
➢ 該檔案的大小(size);
➢ 該檔案的建立或內容修改時間(ctime);
➢ 該檔案的最後一次訪問時間(atime);
➢ 該檔案的修改時間(mtime);

➢ 檔案的特殊許可權(SUID、SGID、SBIT);
➢ 該檔案的真實資料地址(point)。
而檔案的實際內容則儲存在 block 塊中(大小可以是 1KB、2KB 或 4KB),一個 inode 的
預設大小僅為 128B(Ext3),記錄一個 block 則消耗 4B。當檔案的 inode 被寫滿後,Linux 系
統會自動分配出一個 block 塊,專門用於像 inode 那樣記錄其他 block 塊的資訊,這樣把各個
block 塊的內容串到一起,就能夠讓使用者讀到完整的檔案內容了。對於儲存檔案內容的 block
塊,有下面兩種常見情況(以 4KB 的 block 大小為例進行說明)。
➢ 情況 1:檔案很小(1KB),但依然會佔用一個 block,因此會潛在地浪費 3KB。
➢ 情況 2:檔案很大(5KB),那麼會佔用兩個 block(5KB-4KB 後剩下的 1KB 也要佔
用一個 block)。
計算機系統在發展過程中產生了眾多的檔案系統,為了使使用者在讀取或寫入檔案時不用
關心底層的硬碟結構,Linux 核心中的軟體層為使用者程式提供了一個 VFS(Virtual File System,
虛擬檔案系統)介面,這樣使用者實際上在操作檔案時就是統一對這個虛擬檔案系統進行操作
了。圖 6-5 所示為 VFS 的架構示意圖。從中可見,實際檔案系統在 VFS 下隱藏了自己的特性
和細節,這樣使用者在日常使用時會覺得“檔案系統都是一樣的”,也就可以隨意使用各種命令
在任何檔案系統中進行各種操作了(比如使用 cp 命令來複制檔案)。

6.4 掛載硬體裝置

我們在用慣了 Windows 系統後總覺得一切都是理所當然的,平時把 U 盤插入到電腦後
也從來沒有考慮過 Windows 系統做了哪些事情,才使得我們可以訪問這個 U 盤的。接下來
我們會逐一學習在 Linux 系統中掛載和解除安裝儲存裝置的方法,以便大家更好地瞭解 Linux 系
統新增硬體裝置的工作原理和流程。前面講到,在拿到一塊全新的硬碟儲存裝置後要先分割槽,
然後格式化,最後才能掛載並正常使用。“分割槽”和“格式化”大家以前經常聽到,但“掛
載”又是什麼呢?劉遄老師在這裡給您一個最簡單、最貼切的解釋—當使用者需要使用硬碟
裝置或分割槽中的資料時,需要先將其與一個已存在的目錄檔案進行關聯,而這個關聯動作就
是“掛載”。下文將向讀者逐步講解如何使用硬碟裝置,但是鑑於與掛載相關的理論知識比
較複雜,而且很重要,因此決定再拿出一個小節單獨講解,這次希望大家不僅要看懂,而且
還要記住。

6.4.1 mount 命令

mount 命令用於掛載檔案系統,格式為“mount 檔案系統 掛載目錄”。mount 命令中可用
的引數及作用如表 6-3 所示。掛載是在使用硬體裝置前所執行的最後一步操作。只需使用
mount 命令把硬碟裝置或分割槽與一個目錄檔案進行關聯,然後就能在這個目錄中看到硬體設
備中的資料了。對於比較新的 Linux 系統來講,一般不需要使用-t 引數來指定檔案系統的類
型,Linux 系統會自動進行判斷。而 mount 中的-a 引數則厲害了,它會在執行後自動檢查
/etc/fstab 檔案中有無疏漏被掛載的裝置檔案,如果有,則進行自動掛載操作。

[root@linuxprobe ~]# mount /dev/sdb2 /backup

雖然按照上面的方法執行 mount 命令後就能立即使用檔案系統了,但系統在重啟後掛
載就會失效,也就是說我們需要每次開機後都手動掛載一下。這肯定不是我們想要的效果,
如果想讓硬體裝置和目錄永久地進行自動關聯,就必須把掛載資訊按照指定的填寫格式
“裝置檔案 掛載目錄 格式型別 許可權選項 是否備份 是否自檢”(各欄位的意義見表 6-4)
寫入到/etc/fstab 檔案中。這個檔案中包含著掛載所需的諸多資訊專案,一旦配置好之後就
能一勞永逸了。

如果想將檔案系統為 ext4 的硬體裝置/dev/sdb2 在開機後自動掛載到/backup 目錄上,並
保持預設許可權且無需開機自檢,就需要在/etc/fstab 檔案中寫入下面的資訊,這樣在系統重啟
後也會成功掛載。

[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper /rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb2 /backup ext4 defaults 0 0

 6.4.2 umount 命令

mount 命令用於撤銷已經掛載的裝置檔案,格式為“umount [掛載點/裝置檔案]”。我們
掛載檔案系統的目的是為了使用硬體資源,而解除安裝檔案系統就意味不再使用硬體的裝置資源;
相對應地,掛載操作就是把硬體裝置與目錄進行關聯的動作,因此解除安裝操作只需要說明想要
取消關聯的裝置檔案或掛載目錄的其中一項即可,一般不需要加其他額外的引數。我們來嘗
試手動解除安裝掉/dev/sdb2 裝置檔案:

[root@linuxprobe ~]# umount /dev/sdb2

6.5 新增硬碟裝置

根據前文講解的與管理硬體裝置相關的理論知識,我們先來理清一下新增硬碟裝置的
操作思路:首先需要在虛擬機器中模擬新增入一塊新的硬碟儲存裝置,然後再進行分割槽、格
式化、掛載等操作,最後通過檢查系統的掛載狀態並真實地使用硬碟來驗證硬碟裝置是否
成功新增。
鑑於我們不需要為了做這個實驗而特意買一塊真實的硬碟,而是通過虛擬機器軟體進行硬
件模擬,因此這再次體現出了使用虛擬機器軟體的好處。具體的操作步驟如下。
首先把虛擬機器系統關機,稍等幾分鐘會自動返回到虛擬機器管理主介面,然後單擊“編
輯虛擬機器設定”選項,在彈出的介面中單擊“新增”按鈕,新增一塊硬體裝置,如圖 6-
6 所示。

選擇想要新增的硬體型別為“硬碟”,然後單擊“下一步”按鈕就可以了,這確實沒有什
麼需要進一步解釋的,如圖 6-7 所示。
選擇虛擬硬碟的型別為 SCSI(預設推薦),並單擊“下一步”按鈕,這樣虛擬機器中的裝置
名稱過一會兒後應該為/dev/sdb,如圖 6-8 所示。

 選中“建立新虛擬磁碟”單選按鈕,而不是其他選項,再次單擊“下一步”按鈕,如圖
6-9 所示。

將“最大磁碟大小”設定為預設的 20GB。這個數值是限制這臺虛擬機器所使用的最大硬碟
空間,而不是立即將其填滿,因此預設 20GB 就很合適了。單擊“下一步”按鈕,如圖 6-10
所示。

 設定磁碟檔案的檔名和儲存位置(這裡採用預設設定即可,無需修改),直接單擊“完
成”按鈕,如圖 6-11 所示。

將新硬碟新增好後就可以看到裝置資訊了。這裡不需要做任何修改,直接單擊“確認”
按鈕後就可以開啟虛擬機器了,如圖 6-12 所示。

 在虛擬機器中模擬新增了硬碟裝置後就應該能看到抽象成的硬碟裝置檔案了。按照前文講
解的 udev 服務命名規則,第二個被識別的 SCSI 裝置應該會被儲存為/dev/sdb,這個就是硬碟
裝置檔案了。但在開始使用該硬碟之前還需要進行分割槽操作,例如從中取出一個 2GB 的分割槽
裝置以供後面的操作使用。

6.5.1 fdisk 命令

在 Linux 系統中,管理硬碟裝置最常用的方法就當屬 fdisk 命令了。fdisk 命令用於管理磁碟
分割槽,格式為“fdisk [磁碟名稱]”,它提供了集新增、刪除、轉換分割槽等功能於一身的“一站式
分割槽服務”。不過與前面講解的直接寫到命令後面的引數不同,這條命令的引數(見表 6-5)是交
互式的,因此在管理硬碟裝置時特別方便,可以根據需求動態調整。

我們首先使用 fdisk 命令來嘗試管理/dev/sdb 硬碟裝置。在看到提示資訊後輸入引數 p 來
檢視硬碟裝置內已有的分割槽資訊,其中包括了硬碟的容量大小、扇區個數等資訊:

[root@localhost ~]# fdisk /dev/sdb
歡迎使用 fdisk (util-linux 2.23.2)。

更改將停留在記憶體中,直到您決定將更改寫入磁碟。
使用寫入命令前請三思。

Device does not contain a recognized partition table
使用磁碟識別符號 0x10d1c7f5 建立新的 DOS 磁碟標籤。

命令(輸入 m 獲取幫助):p

磁碟 /dev/sdb:21.5 GB, 21474836480 位元組,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組
磁碟標籤型別:dos
磁碟識別符號:0x10d1c7f5

   裝置 Boot      Start         End      Blocks   Id  System

命令(輸入 m 獲取幫助):

輸入引數 n 嘗試新增新的分割槽。系統會要求您是選擇繼續輸入引數 p 來建立主分割槽,還
是輸入引數 e 來建立擴充套件分割槽。這裡輸入引數 p 來建立一個主分割槽:

Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p

在確認建立一個主分割槽後,系統要求您先輸入主分割槽的編號。我們在前文得知,主分割槽的編
號範圍是 1~4,因此這裡輸入預設的 1 就可以了。接下來系統會提示定義起始的扇區位置,這不
需要改動,我們敲擊Enter鍵保留預設設定即可,系統會自動計算出最靠前的空閒扇區的位置。最
後,系統會要求定義分割槽的結束扇區位置,這其實就是要去定義整個分割槽的大小是多少。我們不
用去計算扇區的個數,只需要輸入+2G 即可建立出一個容量為 2GB 的硬碟分割槽。

Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
Partition 1 of type Linux and of size 2 GiB is set

再次使用引數 p 來檢視硬碟裝置中的分割槽資訊。果然就能看到一個名稱為/dev/sdb1、起
始扇區位置為 2048、結束扇區位置為 4196351 的主分割槽了。這時候千萬不要直接關閉視窗,
而應該敲擊引數 w 後回車,這樣分割槽資訊才是真正的寫入成功啦。

Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x47d24a34
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

在上述步驟執行完畢之後,Linux 系統會自動把這個硬碟主分割槽抽象成/dev/sdb1 裝置文
件。我們可以使用 file 命令檢視該檔案的屬性,但是劉遄老師在講課和工作中發現,有些時候
系統並沒有自動把分割槽資訊同步給 Linux 核心,而且這種情況似乎還比較常見(但不能算作
是嚴重的 bug)。我們可以輸入 partprobe 命令手動將分割槽資訊同步到核心,而且一般推薦連續
兩次執行該命令,效果會更好。如果使用這個命令都無法解決問題,那麼就重啟計算機吧,這
個殺手鐗百試百靈,一定會有用的。

[root@linuxprobe ]# file /dev/sdb1
/dev/sdb1: cannot open (No such file or directory)
[root@linuxprobe ]# partprobe
[root@linuxprobe ]# partprobe
[root@linuxprobe ]# file /dev/sdb1
/dev/sdb1: block special

如果硬體儲存裝置沒有進行格式化,則 Linux 系統無法得知怎麼在其上寫入資料。因此,
在對儲存裝置進行分割槽後還需要進行格式化操作。在 Linux 系統中用於格式化操作的命令是
mkfs。這條命令很有意思,因為在 Shell 終端中輸入 mkfs 名後再敲擊兩下用於補齊命令的 Tab
鍵,會有如下所示的效果:

[root@localhost ~]# mkfs
mkfs         mkfs.cramfs  mkfs.ext3    mkfs.fat     mkfs.msdos   mkfs.xfs     
mkfs.btrfs   mkfs.ext2    mkfs.ext4    mkfs.minix   mkfs.vfat  

對!這個 mkfs 命令很貼心地把常用的檔案系統名稱用字尾的方式儲存成了多個命令文
件,用起來也非常簡單—mkfs.檔案型別名稱。例如要格式分割槽為 XFS 的檔案系統,則命令
應為 mkfs.xfs /dev/sdb1。

[root@localhost ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=524288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

終於完成了儲存裝置的分割槽和格式化操作,接下來就是要來掛載並使用儲存裝置了。與
之相關的步驟也非常簡單:首先是建立一個用於掛載裝置的掛載點目錄;然後使用 mount 命
令將儲存裝置與掛載點進行關聯;最後使用 df -h 命令來檢視掛載狀態和硬碟使用量資訊。

[root@localhost ~]# mkdir /newFS
[root@localhost ~]# mount /dev/sdb1 /newFS
[root@localhost ~]# df -h
檔案系統             容量  已用  可用 已用% 掛載點
/dev/mapper/cl-root   50G  6.2G   44G   13% /
devtmpfs             897M     0  897M    0% /dev
tmpfs                912M   84K  912M    1% /dev/shm
tmpfs                912M  9.0M  903M    1% /run
tmpfs                912M     0  912M    0% /sys/fs/cgroup
/dev/sda1           1014M  174M  841M   18% /boot
/dev/mapper/cl-home   47G   37M   47G    1% /home
tmpfs                183M   16K  183M    1% /run/user/42
tmpfs                183M     0  183M    0% /run/user/0
/dev/sdb1            2.0G   33M  2.0G    2% /newFS

6.5.2 du 命令

既然儲存裝置已經順利掛載,接下來就可以嘗試通過掛載點目錄向儲存裝置中寫入檔案
了。在寫入檔案之前,先介紹一個用於檢視檔案資料佔用量的 du 命令,其格式為“du [選項] 
[檔案]”。簡單來說,該命令就是用來檢視一個或多個檔案佔用了多大的硬碟空間。我們還可
以使用 du -sh /*命令來檢視在 Linux 系統根目錄下所有一級目錄分別佔用的空間大小。下面,
我們先從某些目錄中複製過來一批檔案,然後檢視這些檔案總共佔用了多大的容量:

[root@linuxprobe ~]# cp -rf /etc/* /newFS/
[root@linuxprobe ~]# ls /newFS/
abrt hosts pulse
adjtime hosts.allow purple
aliases hosts.deny qemu-ga
aliases.db hp qemu-kvm
alsa idmapd.conf radvd.conf
alternatives init.d rc0.d
anacrontab inittab rc1.d
………………省略部分輸入資訊………………
[root@linuxprobe ~]# du -sh /newFS/
33M /newFS/

細心的讀者一定還記得,前面在講解 mount 命令時提到,使用 mount 命令掛載的裝置文
件會在系統下一次重啟的時候失效。如果想讓這個裝置檔案的掛載永久有效,則需要把掛載
的資訊寫入到配置檔案中:

[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper /rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0

6.6 新增交換分割槽

SWAP(交換)分割槽是一種通過在硬碟中預先劃分一定的空間,然後將把記憶體中暫時不常
用的資料臨時存放到硬碟中,以便騰出實體記憶體空間讓更活躍的程式服務來使用的技術,其設
計目的是為了解決真實實體記憶體不足的問題。但由於交換分割槽畢竟是通過硬碟裝置讀寫資料的,
速度肯定要比實體記憶體慢,所以只有當真實的實體記憶體耗盡後才會呼叫交換分割槽的資源。
交換分割槽的建立過程與前文講到的掛載並使用儲存裝置的過程非常相似。在對/dev/sdb 存
儲裝置進行分割槽操作前,有必要先說一下交換分割槽的劃分建議:在生產環境中,交換分割槽的
大小一般為真實實體記憶體的 1.5~2 倍,為了讓大家更明顯地感受交換分割槽空間的變化,這裡
取出一個大小為 5GB 的主分割槽作為交換分割槽資源。在分割槽建立完畢後儲存並退出即可:

[root@linuxprobe ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xb3d27ce1.
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extendedSelect (default p): p
Partition number (2-4, default 2):
First sector (4196352-41943039, default 4196352):
Using default value 4196352
Last sector, +sectors or +size{K,M,G} (4196352-41943039, default 41943039): +5G
Partition 2 of type Linux and of size 5 GiB is set
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xb0ced57f
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
/dev/sdb2 4196352 14682111 5242880 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks

使用 SWAP 分割槽專用的格式化命令 mkswap,對新建的主分割槽進行格式化操作:

[root@localhost ~]# mkswap /dev/sdb2
正在設定交換空間版本 1,大小 = 5242876 KiB
無標籤,UUID=957dcad9-c5f0-4edc-b8dc-201bb78d769b

使用 swapon 命令把準備好的 SWAP 分割槽裝置正式掛載到系統中。我們可以使用 free -m 命
令檢視交換分割槽的大小變化(由 2047MB 增加到 7167MB):

[root@localhost ~]#  free -m
              total        used        free      shared  buff/cache   available
Mem:           1823         319         814           9         689        1255
Swap:          2047           0        2047
[root@localhost ~]# swapo
swapoff  swapon   
[root@localhost ~]# swapon /dev/sdb2
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1823         323         811           9         689        1252
Swap:          7167           0        7167

為了能夠讓新的交換分割槽裝置在重啟後依然生效,需要按照下面的格式將相關資訊寫入
到配置檔案中,並記得儲存:

[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper /rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0

6.7 磁碟容量配額

本書在前面曾經講到,Linux 系統的設計初衷就是讓許多人一起使用並執行各自的任務,
從而成為多使用者、多工的作業系統。但是,硬體資源是固定且有限的,如果某些使用者不斷地
在 Linux 系統上建立檔案或者存放電影,硬碟空間總有一天會被佔滿。針對這種情況,root 管
理員就需要使用磁碟容量配額服務來限制某位使用者或某個使用者組針對特定資料夾可以使用的
最大硬碟空間或最大檔案個數,一旦達到這個最大值就不再允許繼續使用。可以使用 quota 命
令進行磁碟容量配額管理,從而限制使用者的硬碟可用容量或所能建立的最大檔案個數。quota
命令還有軟限制和硬限制的功能。
➢ 軟限制:當達到軟限制時會提示使用者,但仍允許使用者在限定的額度內繼續使用。
➢ 硬限制:當達到硬限制時會提示使用者,且強制終止使用者的操作。
RHEL 7 系統中已經安裝了 quota 磁碟容量配額服務程式包,但儲存裝置卻預設沒有開啟
對 quota 的支援,此時需要手動編輯配置檔案,讓 RHEL 7 系統中的/boot 目錄能夠支援 quota
磁碟配額技術。另外,對於學習過早期的 Linux 系統,或者具有 RHEL 6 系統使用經驗的讀者
來說,這裡需要特別注意。早期的 Linux 系統要想讓硬碟裝置支援 quota 磁碟容量配額服務,
使用的是 usrquota 引數,而 RHEL 7 系統使用的則是 uquota 引數。在重啟系統後使用 mount
命令檢視,即可發現/boot 目錄已經支援 quota 磁碟配額技術了:

[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b/boot xfs defaults,uquota 1 2
/dev/mapper /rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0
[root@linuxprobe ~]# reboot
[root@linuxprobe ~]# mount | grep boot
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)

接下來建立一個用於檢查 quota 磁碟容量配額效果的使用者 tom,並針對/boot 目錄增加其
他人的寫許可權,保證使用者能夠正常寫入資料:

[root@linuxprobe ~]# useradd tom
[root@linuxprobe ~]# chmod -Rf o+w /boot

6.7.1 xfs_quota 命令

xfs_quota命令是一個專門針對XFS檔案系統來管理quota磁碟容量配額服務而設計的命令,
格式為“xfs_quota [引數] 配額 檔案系統”。其中,-c 引數用於以引數的形式設定要執行的命令;
-x 引數是專家模式,讓運維人員能夠對 quota 服務進行更多複雜的配置。接下來我們使用 xfs_quota
命令來設定使用者 tom 對/boot 目錄的 quota 磁碟容量配額。具體的限額控制包括:硬碟使用量的軟
限制和硬限制分別為 3MB 和 6MB;建立檔案數量的軟限制和硬限制分別為 3 個和 6 個。

[root@localhost ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom'  /boot
[root@localhost ~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1)
                               Blocks                     
User ID          Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root           144696          0          0     00 [--------]
tom                 0       3072       6144     00 [--------]

當配置好上述的各種軟硬限制後,嘗試切換到這個普通使用者,然後分別嘗試建立一個體
積為 5MB 和 8MB 的檔案。可以發現,在建立 8MB 的檔案時受到了系統限制:

[root@localhost ~]# su - tom
Attempting to create directory /home/tom/perl5
[tom@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=5M count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
5242880位元組(5.2 MB)已複製,0.0266602 秒,197 MB/秒
[tom@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1 
dd: 寫入"/boot/tom" 出錯: 超出磁碟限額
記錄了1+0 的讀入
記錄了0+0 的寫出
6291456位元組(6.3 MB)已複製,0.110679 秒,56.8 MB/秒
[tom@localhost ~]$ ls /boot/

6.7.2 edquota 命令

edquota 命令用於編輯使用者的 quota 配額限制,格式為“edquota [引數] [使用者] ”。在為用
戶設定了 quota 磁碟容量配額限制後,可以使用 edquota 命令按需修改限額的數值。其中,-u
參數列示要針對哪個使用者進行設定;-g 參數列示要針對哪個使用者組進行設定。edquota 命令會
呼叫 Vi 或 Vim 編輯器來讓 root 管理員修改要限制的具體細節。下面把使用者 tom 的硬碟使用
量的硬限額從 5MB 提升到 8MB:

[root@localhost ~]# edquota -u tom
Disk quotas for user tom (uid 1001):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sda1                      6144       3072       8192          1        3        6                                                                                                      
"/tmp/EdP.aZbj4Nv" 3L, 215C written
[root@localhost ~]# su - tom
上一次登入:五 11月  2 14:39:15 CST 2018pts/0 上
[tom@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
8388608位元組(8.4 MB)已複製,0.106369 秒,78.9 MB/秒
[tom@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=10M count=1 
dd: 寫入"/boot/tom" 出錯: 超出磁碟限額
記錄了1+0 的讀入
記錄了0+0 的寫出
8388608位元組(8.4 MB)已複製,0.0727933 秒,115 MB/秒

6.8 軟硬方式連結

當引領大家學習完本章所有的硬碟管理知識之後,劉遄老師終於可以放心大膽地講解
Linux 系統中的“快捷方式”了。在 Windows 系統中,快捷方式就是指向原始檔案的一個鏈
接檔案,可以讓使用者從不同的位置來訪問原始的檔案;原檔案一旦被刪除或剪下到其他地方
後,會導致連結檔案失效。但是,這個看似簡單的東西在 Linux 系統中可不太一樣。
在 Linux 系統中存在硬連結和軟連線兩種檔案。
➢硬連結(hard link): 可以將它理解為一個“指向原始檔案 inode 的指標”,系統不為
它分配獨立的 inode 和檔案。所以,硬連結檔案與原始檔案其實是同一個檔案,只
是名字不同。我們每新增一個硬連結,該檔案的 inode 連線數就會增加 1;而且只
有當該檔案的 inode 連線數為 0 時,才算徹底將它刪除。換言之,由於硬連結實際
上是指向原檔案 inode 的指標,因此即便原始檔案被刪除,依然可以通過硬連結文
件來訪問。需要注意的是,由於技術的侷限性,我們不能跨分割槽對目錄檔案進行鏈
接。
➢ 軟連結(也稱符號連結 symbolic link):僅僅包含所連結檔案的路徑名,因此能鏈
接目錄檔案,也可以跨越檔案系統進行連結。但是,當原始檔案被刪除後,連結檔案
也將失效,從這一點上來說與 Windows 系統中的“快捷方式”具有一樣的性質。

ln 命令

ln 命令用於建立連結檔案,格式為“ln [選項] 目標”,其可用的引數以及作用如表 6-6 所示。
在使用 ln 命令時,是否新增-s 引數,將建立出性質不同的兩種“快捷方式”。因此如果沒有紮實
的理論知識和實踐經驗做鋪墊,儘管能夠成功完成實驗,但永遠不會明白為什麼會成功。

為了更好地理解軟連結、硬連結的不同性質,接下來建立一個類似於 Windows 系統中快
捷方式的軟連結。這樣,當原始檔案被刪除後,就無法讀取新建的連結檔案了。

接下來針對一個原始檔案建立一個硬連結,即相當於針對原始檔案的硬碟儲存位置建立
了一個指標,這樣一來,新建立的這個硬連結就不再依賴於原始檔案的名稱等資訊,也不會
因為原始檔案的刪除而導致無法讀取。同時可以看到建立硬連結後,原始檔案的硬碟連結數
量增加到了 2。

[tom@localhost ~]$ echo "Welcome to linuxprobe.com" > readme.txt
[tom@localhost ~]$ ln readme.txt readit.txt
ln: 無法建立硬連結"readit.txt": 檔案已存在
[tom@localhost ~]$ rm readit.txt 
[tom@localhost ~]$ ln readme.txt readit.txt
[tom@localhost ~]$ cat readme.txt 
Welcome to linuxprobe.com
[tom@localhost ~]$ cat readit.txt 
Welcome to linuxprobe.com
[tom@localhost ~]$ ls -l readme.txt 
-rw-rw-r-- 2 tom tom 26 11月  2 15:16 readme.txt
[tom@localhost ~]$ rm -f readme.txt 
[tom@localhost ~]$ cat readit.txt 
Welcome to linuxprobe.com
[tom@localhost ~]$ 

 

相關文章