Linux就該這么學》最新正式版已出版上市,同學們可在線上京東網當當網淘寶網亞馬遜等電商平臺購買。

*亦可就近在新華書店購買*

章節簡述:

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所示。

Linux存儲架構

圖6-1? Linux系統中的文件存儲結構

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

表6-1????????????????????????????????? Linux系統中常見的目錄名稱以及相應內容

目錄名稱 應放置文件的內容
/boot 開機所需文件—內核、開機菜單以及所需配置文件等
/dev 以文件形式存放任何設備與接口
/etc 配置文件
/home 用戶主目錄
/bin 存放單用戶模式下還可以操作的命令
/lib 開機時用到的函數庫,以及/bin與/sbin下面的命令要調用的函數
/sbin 開機過程中需要的命令
/media 用于掛載設備文件的目錄
/opt 放置第三方的軟件
/root 系統管理員的家目錄
/srv 一些網絡服務的數據文件目錄
/tmp 任何人均可使用的“共享”臨時目錄
/proc 虛擬文件系統,例如系統內核、進程、外部設備及網絡狀態等
/usr/local 用戶自行安裝的軟件
/usr/sbin Linux系統開機時不會使用到的軟件/命令/腳本
/usr/share 幫助與說明文件,也可放置共享文件
/var 主要存放經常變化的文件,如日志
/lost+found 當文件系統發生錯誤時,將一些丟失的文件片段存放在這里

在Linux系統中另外還有一個重要的概念—路徑。路徑指的是如何定位到某個文件,分為絕對路徑與相對路徑。絕對路徑指的是從根目錄(/)開始寫起的文件或目錄名稱,而相對路徑則指的是相對于當前路徑的寫法。我們來看下面這個例子,以幫助大家理解。假如有位外國游客來到中國潘家園旅游,當前內急但是找不到洗手間,特意向您問路,那么您有兩種正確的指路方法。

絕對路徑(absolute path):首先坐飛機來到中國,到了北京出首都機場坐機場快軌到三元橋,然后換乘10號線到潘家園站,出站后坐34路公交車到農光里,下車后路口左轉。

相對路徑(relative path):前面路口左轉。

這兩種方法都正確。如果您說的是絕對路徑,那么任何一位外國游客都可以按照這個提示找到潘家園的洗手間,但是太繁瑣了。如果您說的是相對路徑,雖然表達很簡練,但是這位外國游客只能從當前位置(不見得是潘家園)出發找到洗手間,因此并不能保證在前面的路口左轉后可以找到洗手間,由此可見,相對路徑不具備普適性。

如果各位讀者現在還是不能理解相對路徑和絕對路徑的區別,也不要著急,以后通過實踐練習肯定可以徹底搞明白。當前建議大家先記住FHS中規范的目錄作用,這將在以后派上用場。

6.2?物理設備的命名規則

在Linux系統中一切都是文件,硬件設備也不例外。既然是文件,就必須有文件名稱。系統內核中的udev設備管理器會自動把硬件名稱規范起來,目的是讓用戶通過設備文件的名字可以猜出設備大致的屬性以及分區信息等;這對于陌生的設備來說特別方便。另外,udev設備管理器的服務會一直以守護進程的形式運行并偵聽內核發出的信號來管理/dev目錄下的設備文件。Linux系統中常見的硬件設備的文件名稱如表6-2所示。

表6-2???????????????????????????????????????????? 常見的硬件設備及其文件名稱

硬件設備 文件名稱
IDE設備 /dev/hd[a-d]
SCSI/SATA/U盤 /dev/sd[a-p]
軟驅 /dev/fd[0-1]
打印機 /dev/lp[0-15]
光驅 /dev/cdrom
鼠標 /dev/mouse
磁帶機 /dev/st0或/dev/ht0

由于現在的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所示。

硬盤命名規則

圖6-2 設備文件名稱

首先,/dev/目錄中保存的應當是硬件設備文件;其次,sd表示是存儲設備;然后,a表示系統中同類接口中第一個被識別到的設備,最后,5表示這個設備是一個邏輯分區。一言以蔽之,“/dev/sda5”表示的就是“這是系統中第一塊被識別到的硬件設備中分區編號為5的邏輯分區的設備文件”。考慮到我們的很多讀者完全沒有Linux基礎,不太容易理解前面所說的主分區、擴展分區和邏輯分區的概念,因此接下來簡單科普一下硬盤相關的知識。

正是因為計算機有了硬盤設備,我們才可以在玩游戲的過程中或游戲通關之后隨時存檔,而不用每次重頭開始。硬盤設備是由大量的扇區組成的,每個扇區的容量為512字節。其中第一個扇區最重要,它里面保存著主引導記錄與分區表信息。就第一個扇區來講,主引導記錄需要占用446字節,分區表為64字節,結束符占用2字節;其中分區表中每記錄一個分區信息就需要16字節,這樣一來最多只有4個分區信息可以寫到第一個扇區中,這4個分區就是4個主分區。第一個扇區中的數據信息如圖6-3所示。

硬盤的扇區

圖6-3? 第一個扇區中的數據信息

現在,問題來了—第一個扇區最多只能創建出4個分區?于是為了解決分區個數不夠的問題,可以將第一個扇區的分區表中16字節(原本要寫入主分區信息)的空間(稱之為擴展分區)拿出來指向另外一個分區。也就是說,擴展分區其實并不是一個真正的分區,而更像是一個占用16字節分區表空間的指針—一個指向另外一個分區的指針。這樣一來,用戶一般會選擇使用3個主分區加1個擴展分區的方法,然后在擴展分區中創建出數個邏輯分區,從而來滿足多分區(大于4個)的需求。當然,就目前來講大家只要明白為什么主分區不能超過4個就足夠了。主分區、擴展分區、邏輯分區可以像圖6-4那樣來規劃。

所謂擴展分區,嚴格地講它不是一個實際意義的分區,它僅僅是一個指向下一個分區的指針,這種指針結構將形成一個單向鏈表。

邏輯分區

圖6-4 硬盤分區的規劃

讀者們來試著解讀下/dev/hdc8代表著什么?答案模式

答案:這是第三塊IDE設備(比較少見了)中的編號為8的邏輯分區。

6.3 文件系統與數據資料

用戶在硬件存儲設備中執行的文件建立、寫入、讀取、修改、轉存與控制等操作都是依靠文件系統來完成的。文件系統的作用是合理規劃硬盤,以保證用戶正常的使用需求。Linux系統支持數十種的文件系統,而最常見的文件系統如下所示。

Ext3:是一款日志文件系統,能夠在系統異常宕機時避免文件系統資料丟失,并能自動修復數據的不一致與錯誤。然而,當硬盤容量較大時,所需的修復時間也會很長,而且也不能百分之百地保證資料不會丟失。它會把整個磁盤的每個寫入動作的細節都預先記錄下來,以便在發生異常宕機后能回溯追蹤到被中斷的部分,然后嘗試進行修復。

Ext4: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命令來復制文件)。

虛擬文件系統VFS

圖6-5? VFS的架構示意圖

6.4?掛載硬件設備

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

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

表6-3???????????????????????????????????????????? mount命令中的參數以及作用

參數 作用
-a 掛載所有在/etc/fstab中定義的文件系統
-t 指定文件系統的類型

例如,要把設備/dev/sdb2掛載到/backup目錄,只需要在mount命令中填寫設備與掛載目錄參數就行,系統會自動去判斷要掛載文件的類型,因此只需要執行下述命令即可:

[[email protected]?~]#?mount?/dev/sdb2?/backup

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

表6-4??????????????????????? 用于掛載信息的指定填寫格式中,各字段所表示的意義

字段 意義
設備文件 一般為設備的路徑+設備名稱,也可以寫唯一識別碼(UUID,Universally Unique Identifier)
掛載目錄 指定要掛載到的目錄,需在掛載前創建好
格式類型 指定文件系統的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此為光盤設備)等
權限選項 若設置為defaults,則默認權限為:rw, suid, dev, exec, auto, nouser, async
是否備份 若為1則開機后使用dump進行磁盤備份,為0則不備份
是否自檢 若為1則開機后自動進行磁盤自檢,為0則不自檢

如果想將文件系統為ext4的硬件設備/dev/sdb2在開機后自動掛載到/backup目錄上,并保持默認權限且無需開機自檢,就需要在/etc/fstab文件中寫入下面的信息,這樣在系統重啟后也會成功掛載。

[[email protected] ~]# 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

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

[[email protected] ~]# umount /dev/sdb2

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

6.5 添加硬盤設備

根據前文講解的與管理硬件設備相關的理論知識,我們先來理清一下添加硬盤設備的操作思路:首先需要在虛擬機中模擬添加入一塊新的硬盤存儲設備,然后再進行分區、格式化、掛載等操作,最后通過檢查系統的掛載狀態并真實地使用硬盤來驗證硬盤設備是否成功添加。

鑒于我們不需要為了做這個實驗而特意買一塊真實的硬盤,而是通過虛擬機軟件進行硬件模擬,因此這再次體現出了使用虛擬機軟件的好處。具體的操作步驟如下。

第1步:首先把虛擬機系統關機,稍等幾分鐘會自動返回到虛擬機管理主界面,然后單擊“編輯虛擬機設置”選項,在彈出的界面中單擊“添加”按鈕,新增一塊硬件設備,如圖6-6所示。

在虛擬機中添加硬盤

圖6-6? 在虛擬機系統中添加硬件設備

第2步:選擇想要添加的硬件類型為“硬盤”,然后單擊“下一步”按鈕就可以了,這確實沒有什么需要進一步解釋的,如圖6-7所示。

圖6-7? 選擇添加硬件類型

第3步:選擇虛擬硬盤的類型為SCSI(默認推薦),并單擊“下一步”按鈕,這樣虛擬機中的設備名稱過一會兒后應該為/dev/sdb,如圖6-8所示。

圖6-8? 選擇硬盤設備類型

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

圖6-9? 選擇“創建新虛擬磁盤”選項

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

圖6-10? 設置硬盤的最大使用空間

第6步:設置磁盤文件的文件名和保存位置(這里采用默認設置即可,無需修改),直接單擊“完成”按鈕,如圖6-11所示。

圖6-11? 設置磁盤文件的文件名和保存位置

第7步:將新硬盤添加好后就可以看到設備信息了。這里不需要做任何修改,直接單擊“確認”按鈕后就可以開啟虛擬機了,如圖6-12所示。

圖6-12? 查看虛擬機硬件設置信息

在虛擬機中模擬添加了硬盤設備后就應該能看到抽象成的硬盤設備文件了。按照前文講解的udev服務命名規則,第二個被識別的SCSI設備應該會被保存為/dev/sdb,這個就是硬盤設備文件了。但在開始使用該硬盤之前還需要進行分區操作,例如從中取出一個2GB的分區設備以供后面的操作使用。

1. ?fdisk命令

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

表6-5????????????????????????????????????????????? fdisk命令中的參數以及作用

參數 作用
m 查看全部可用的參數
n 添加新的分區
d 刪除某個分區信息
l 列出所有可用的分區類型
t 改變某個分區的類型
p 查看分區表信息
w 保存并退出
q 不保存直接退出

第1步:我們首先使用fdisk命令來嘗試管理/dev/sdb硬盤設備。在看到提示信息后輸入參數p來查看硬盤設備內已有的分區信息,其中包括了硬盤的容量大小、扇區個數等信息:

[[email protected] ~]# 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 0x47d24a34.
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

第2步:輸入參數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

第3步:在確認創建一個主分區后,系統要求您先輸入主分區的編號。我們在前文得知,主分區的編號范圍是1~4,因此這里輸入默認的1就可以了。接下來系統會提示定義起始的扇區位置,這不需要改動,我們敲擊回車鍵保留默認設置即可,系統會自動計算出最靠前的空閑扇區的位置。最后,系統會要求定義分區的結束扇區位置,這其實就是要去定義整個分區的大小是多少。我們不用去計算扇區的個數,只需要輸入+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

第4步:再次使用參數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.

第5步:在上述步驟執行完畢之后,Linux系統會自動把這個硬盤主分區抽象成/dev/sdb1設備文件。我們可以使用file命令查看該文件的屬性,但是劉遄老師在講課和工作中發現,有些時候系統并沒有自動把分區信息同步給Linux內核,而且這種情況似乎還比較常見(但不能算作是嚴重的bug)。我們可以輸入partprobe命令手動將分區信息同步到內核,而且一般推薦連續兩次執行該命令,效果會更好。如果使用這個命令都無法解決問題,那么就重啟計算機吧,這個殺手锏百試百靈,一定會有用的。

[[email protected] ]# file /dev/sdb1
/dev/sdb1: cannot open (No such file or directory)
[[email protected] ]# partprobe
[[email protected] ]# partprobe
[[email protected]?]# file /dev/sdb1
/dev/sdb1: block special

如果硬件存儲設備沒有進行格式化,則Linux系統無法得知怎么在其上寫入數據。因此,在對存儲設備進行分區后還需要進行格式化操作。在Linux系統中用于格式化操作的命令是mkfs。這條命令很有意思,因為在Shell終端中輸入mkfs名后再敲擊兩下用于補齊命令的Tab鍵,會有如下所示的效果:

[[email protected] ~]# 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。

[[email protected] ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=256 agcount=4, agsize=131072 blks
 = sectsz=512 attr=2, projid32bit=1
 = crc=0
data = bsize=4096 blocks=524288, imaxpct=25
 = sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
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命令來查看掛載狀態和硬盤使用量信息。

[[email protected] ~]# mkdir /newFS
[[email protected] ~]# mount /dev/sdb1 /newFS/
[[email protected] ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.5G 15G 20% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 140K 914M 1% /dev/shm
tmpfs 914M 8.8M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/sdb1 2.0G 33M 2.0G 2% /newFS

2. ?du命令

既然存儲設備已經順利掛載,接下來就可以嘗試通過掛載點目錄向存儲設備中寫入文件了。在寫入文件之前,先介紹一個用于查看文件數據占用量的du命令,其格式為“du [選項] [文件]”。簡單來說,該命令就是用來查看一個或多個文件占用了多大的硬盤空間。我們還可以使用du -sh /*命令來查看在Linux系統根目錄下所有一級目錄分別占用的空間大小。下面,我們先從某些目錄中復制過來一批文件,然后查看這些文件總共占用了多大的容量:

[[email protected] ~]# cp -rf /etc/* /newFS/
[[email protected] ~]# 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
………………省略部分輸入信息………………
[[email protected] ~]# du -sh /newFS/
33M /newFS/

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

[[email protected] ~]# 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的主分區作為交換分區資源。在分區創建完畢后保存并退出即可:

[[email protected] ~]# 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,對新建的主分區進行格式化操作:

[[email protected] ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 5242876 KiB
no label, UUID=2972f9cb-17f0-4113-84c6-c64b97c40c75

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

[[email protected] ~]# free -m
total used free shared buffers cached
Mem: 1483 782 701 9 0 254
-/+ buffers/cache: 526 957
Swap: 2047 0 2047
[[email protected] ~]# swapon /dev/sdb2
[[email protected] ~]# free -m
total used free shared buffers cached
Mem: 1483 785 697 9 0 254
-/+ buffers/cache: 530 953
Swap: 7167 0 7167

為了能夠讓新的交換分區設備在重啟后依然生效,需要按照下面的格式將相關信息寫入到配置文件中,并記得保存:

[[email protected] ~]# 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磁盤配額技術了:

[[email protected] ~]# 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 
[[email protected] ~]# reboot
[[email protected] ~]# mount | grep boot
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)

接下來創建一個用于檢查quota磁盤容量配額效果的用戶tom,并針對/boot目錄增加其他人的寫權限,保證用戶能夠正常寫入數據:

[[email protected] ~]# useradd tom
[[email protected] ~]# chmod -Rf o+w /boot

1. ?xfs_quota命令

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

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

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

[[email protected] ~]# su - tom
[[email protected] ~]$ dd if=/dev/zero of=/boot/tom bs=5M count=1
1+0 records in
1+0 records out
5242880 bytes (5.2 MB) copied, 0.123966 s, 42.3 MB/s
[[email protected] ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
dd: error writing ‘/boot/tom’: Disk quota exceeded
1+0 records in
0+0 records out
6291456 bytes (6.3 MB) copied, 0.0201593 s, 312 MB/s

2. ?edquota命令

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

[[email protected] ~]# 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
[[email protected] ~]# su - tom
Last login: Mon Sep 7 16:43:12 CST 2017 on pts/0
[[email protected] ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB) copied, 0.0268044 s, 313 MB/s
[[email protected] ~]$ dd if=/dev/zero of=/boot/tom bs=10M count=1
dd: error writing ‘/boot/tom’: Disk quota exceeded
1+0 records in
0+0 records out
8388608 bytes (8.4 MB) copied, 0.167529 s, 50.1 MB/s
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參數,將創建出性質不同的兩種“快捷方式”。因此如果沒有扎實的理論知識和實踐經驗做鋪墊,盡管能夠成功完成實驗,但永遠不會明白為什么會成功。

表6-6???????????????????????????????????????????? ln命令中可用的參數以及作用

參數 作用
-s 創建“符號鏈接”(如果不帶-s參數,則默認創建硬鏈接)
-f 強制創建文件或目錄的鏈接
-i 覆蓋前先詢問
-v 顯示創建鏈接的過程

為了更好地理解軟鏈接、硬鏈接的不同性質,接下來創建一個類似于Windows系統中快捷方式的軟鏈接。這樣,當原始文件被刪除后,就無法讀取新建的鏈接文件了。

[[email protected]?~]# echo "Welcome to linuxprobe.com" > readme.txt
[[email protected]?~]# ln -s readme.txt readit.txt
[[email protected]?~]# cat readme.txt 
Welcome to linuxprobe.com
[[email protected]?~]# cat readit.txt 
Welcome to linuxprobe.com
[[email protected]?~]# ls -l readme.txt 
-rw-r--r-- 1 root root 26 Jan 11 00:08 readme.txt
[[email protected]?~]# rm -f readme.txt 
[[email protected]?~]# cat readit.txt 
cat: readit.txt: No such file or directory

接下來針對一個原始文件創建一個硬鏈接,即相當于針對原始文件的硬盤存儲位置創建了一個指針,這樣一來,新創建的這個硬鏈接就不再依賴于原始文件的名稱等信息,也不會因為原始文件的刪除而導致無法讀取。同時可以看到創建硬鏈接后,原始文件的硬盤鏈接數量增加到了2。

[[email protected] ~]# echo "Welcome to linuxprobe.com" > readme.txt
[[email protected]?~]# ln readme.txt readit.txt
[[email protected]?~]# cat readme.txt 
Welcome to linuxprobe.com
[[email protected]?~]# cat readit.txt 
Welcome to linuxprobe.com
[[email protected]?~]# ls -l readme.txt 
-rw-r--r-- 2 root root 26 Jan 11 00:13 readme.txt
[[email protected]?~]# rm -f readme.txt 
[[email protected]?~]# cat readit.txt 
Welcome to linuxprobe.com

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

本章節的復習作業(答案就在問題的下一行哦,用鼠標選中即可看到的~)

1./home目錄與/root目錄內存放的文件有何相同點以及不同點?

答:這兩個目錄都是用來存放用戶的家目錄數據的,但是,/root目錄存放的是root管理員的家目錄數據。

2.假如一個設備的文件名稱為/dev/sdb,可以確認它是主板第二個插槽上的設備嗎?

答:不一定,因為設備的文件名稱是由系統的識別順序來決定的。

3.如果硬盤中需要5個分區,至少需要幾個邏輯分區?

答:可以選用創建3個主分區+1個擴展分區的方法,然后把擴展分區再分成2個邏輯分區,即有了5個分區。

4./dev/sda5是主分區還是邏輯分區?

答:邏輯分區。

5.哪個服務決定了設備在/dev目錄中的名稱?

答:udev設備管理器服務。

6.用一句話來描述掛載操作。

答:當用戶需要使用硬盤設備或分區中的數據時,需要先將其與一個已存在的目錄文件進行關聯,而這個關聯動作就是“掛載”。

7.在配置quota磁盤容量配額服務時,軟限制數值必須小于硬限制數值么?

答:不一定,軟限制數值可以小于等于硬限制數值。

8.若原始文件被改名,那么之前創建的硬鏈接還能訪問到這個原始文件么?

答:可以。

本文原創地址:http://www.52437949.com/chapter-06.html編輯:劉遄,審核員:暫無