Linux 操作系統原理 — 文件系統 — 存儲佈局

目錄

磁盤分區

Linux 的硬盤分區標識:

  • IDE 接口硬盤:/dev/hd[a-z]X
  • SCSI 接口的硬盤:/dev/sd[a-z]X

其中 [a-z] 代表硬盤號,X 代表硬盤內的分區號。

以 MBR 類型分區爲例,硬盤分區一共有三種:

  1. 主分區(Primary Partion):可以馬上被使用但不能再分區。
  2. 擴展分區(Extension Partion):必須再進行分區後才能使用,也就是說它必須還要進行二次分區。
  3. 邏輯分區(Logical Partion):由擴展分區建立起來的分區,邏輯分區沒有數量上限制。

如果分區標號 X 的值是 1 到 4,表示硬盤的主分區(包含擴展分區);邏輯分區從是從 5 開始的,比如:/dev/hda5。注意,主分區和擴展分區的數目之和不能大於四個。擴展分區只不過是邏輯分區的 “容器”,實際上只有主分區和邏輯分區進行數據存儲。

Linux 中磁盤分區和目錄結構的關係如下:

  • 根目錄是所有 Linux 文件和目錄所在的地方,需要掛載上一個磁盤分區。
  • 磁盤分區都必須掛載到目錄樹中的某個具體的目錄上才能進行讀寫操作。
  • 目錄是邏輯上的區分,分區是物理上的區分。

MBR 與分區表

磁盤的 0 號分區稱爲主引導記錄(Master Boot Record,MBR),用來引導(Boot)計算機。在 MBR 的結尾是分區表(Partition table)。每個分區表給出每個分區由開始到結束的地址。系統管理員使用一個稱爲分區編輯器的程序來創建,調整大小,刪除和操作分區。這種方式的一個缺點是很難適當調整分區的大小,導致一個分區具有很多可用空間,而另一個分區幾乎完全被分配。

MBR 可以用在 DOS 、Microsoft Windows 和 Linux 操作系統中。從 2010 年開始,大多數新計算機都改用 GUID 分區表(GPT)分區方案。

  • MBR 格式:兼容性好,一個磁盤最多有 4 個主分區、1 個擴展分區、若干個在擴展分區下的邏輯分區。
  • GPT 格式:容量大於 2TB,可以有 128 個主分區。

創建 MBR 分區

fdisk –l 顯示磁盤分區信息。
swapon –s 顯示 swap 分區的信息。

步驟

fdisk –cu /dev/sda:進入磁盤分區交互式操作。交互式控制檯輸入項:

  • p 查看分區表
  • n 新建分區
  • e 新建擴展分區
  • 選擇默認分區起始位置
  • 選擇分區的結束位置
  • 新建一個 512M 的邏輯分區:
  • n 新建分區
  • 回車 選擇分區默認起始位置
  • +512M 設定邏輯分區大小
  • p 查看分區表
  • t 進入分區類別選擇
  • 5 對 sda5 進行操作
  • 82 將 sda5 轉換成 Swap 交換分區
  • p 再次查看分區表
  • w 保存 sda5 分區類型

在退出交互式分區操作控制檯後執行:partx –a /dev/sda 刷新 sda 分區表,需要執行 2 次。

處理 Swap,還有以下分區類型以及各自的編號:

    type:   code:
    NTFS 
    xfs      83
    ext4
    ext3  
    swap     82 
    lvm      8e 
    raid     fd 
    extend   5

創建 GPT 分區

  • parted /dev/sdX
  • mkpart partName
  • 輸入起始 MB
  • 輸入結束 MB
  • parted 刷新生效
  • gdisk /dev/sdX

分區的格式化

磁盤分區完畢後還需要進行格式化(Format),之後操作系統才能夠使用這個分區。格式化的目的是能使操作系統可以使用的文件系統格式,即我們上面提到文件系統類型。可見,Linux 的每個分區都有獨立的文件系統,每塊分區的文件系統可以不同。

  • 格式化 Swap 分區:
partx –a /dev/sda		# 刷新磁盤 sda 的分區表
mkswap /dev/sda5		# 格式化 sda5 分區爲 Swap 分區
swapon /dev/sda5 		# 開啓使用 swap 分區
swapon –s 					# 顯示 swap 分區列表信息
  • 格式化 XFS 分區:
xfs_info  /dev/sdx							# 查看 xfs 分區的屬性,必須要掛載後才能查看。
mkfs.xfs -b size=1024 /dev/sdx       # 格式話爲 XFS 分區,-b 指定 data block Size;-i 指定 inode Size。
xfs_admin -u  /dev/sdx                    # 查看 UUID,UUID 每次格式化後都會變化。

# 爲已經格式化的分區修改 UUID
uuidgen
xfs_admin -U "0db55c77-5706-4b96-9573-fb9700185492" /dev/sdX
xfs_admin -L xxxxxx /dev/sdx  # 設置 xfs 分區的卷標
xfs_admin -l /dev/sdx

xfs_info /dev/sdaX 		 # 查看 XFS 文件系統

  • 格式化 Ext4 分區:
mkfs.ext4 /dev/myvg/mylv

tune2fs -l /dev/sdaX	 # 查看 EXT 文件系統

分區的特性

磁盤分區的佈局是隨着文件系統的不同而變化的。通常文件系統會包含一些屬性,如下:
在這裏插入圖片描述

每種操作系統能夠使用的文件系統並不相同,如:Windows 98 以前的微軟操作系統主要利用的文件系統是 FAT (或 FAT16),Windows 2000 以後的版本有所謂的 NTFS 文件系統,至於 Linux 的正統文件系統則爲 Ext2X(Linux second extended file system,ext2fs)這一個。此外,在默認的情況下,Windows 操作系統是不會認識 Linux 的 ExtX 的。

引導塊

MBR 做的第一件事就是確定活動分區,讀入它的第一個塊,稱爲引導塊(boot block)並執行。引導塊中的程序將加載分區中的操作系統。爲了一致性,每個分區都會從引導塊開始,即使引導塊不包含操作系統。引導塊佔據文件系統的前 4096 個字節,從磁盤上的字節偏移量 0 開始。引導塊可用於啓動操作系統。

在計算機中,引導就是啓動計算機的過程,它可以通過硬件(例如:按下電源按鈕)或者軟件命令的方式來啓動。開機後,電腦的 CPU 還不能執行指令,因爲此時沒有軟件在主存中,所以一些軟件必須先被加載到內存中,然後才能讓 CPU 開始執行。也就是計算機開機後,首先會進行軟件的裝載過程。

空閒空間塊

可以用位圖或者指針列表的形式標識。

  • 位圖(Bit Map)或位向量(Bit Vector):是一系列位或位的集合,其中每個位對應一個磁盤塊,該位可以採用兩個值 0 和 1:0 表示已分配該塊;而 1 表示一個空閒塊。下圖中的磁盤上給定的磁盤塊實例(分配了綠色塊)可以用 16 位的位圖表示爲:0000111000000110。
    在這裏插入圖片描述
  • 使用鏈表進行管理:在這種方法中,空閒磁盤塊鏈接在一起,即一個空閒塊包含指向下一個空閒塊的指針。第一個磁盤塊的塊號存儲在磁盤上的單獨位置,也緩存在內存中。
    在這裏插入圖片描述

inode 區塊、data block 區塊與超級塊

文件系統是如何運行的與操作系統的文件數據有關。較新的操作系統的文件數據除了文件的實際數據外,通常還包含了非常多的屬性,例如:Linux 操作系統的文件權限(rwx)與文件屬性(擁有者、羣組、時間參數等)。

Linux 的文件系統 ExtX 主要將硬盤分區劃分爲了超級塊、inode 區塊和 data block 區塊空間。權限與屬性放置到 inode 區塊中,至於實際數據則放置到 data block 區塊中。 另外,還有一個超級區塊(Super block)會記錄整個文件系統的整體信息,包括 inode 與 block 的總量、使用量、剩餘量等等。一個文件由一個超級塊、inode 和 data block 組成。當查看某個文件時,會先從inode table中查出文件屬性及數據存放點,再從數據塊中讀取數據。

在這裏插入圖片描述

  • 超級塊:這是整個文件系統的第一塊空間。緊跟在引導塊後面的是超級塊(Super Block),超級塊的大小爲 4096 字節,從磁盤上的字節偏移 4096 開始。超級塊包含了整個文件系統的所有關鍵參數,例如:文件系統的大小、inode、data block 區塊的總量、使用量、剩餘量,指向空間 inode 和數據塊的指針等相關信息。在計算機啓動或者文件系統首次使用時,超級塊會被讀入內存。

  • inode 塊:作爲文件系統中某個文件的索引節點,記錄了文件的屬性。它是文件系統的最基本單元,是文件系統連接任何子目錄、任何文件的橋樑。每個子目錄和文件只有唯一的一個 inode 塊,文件的屬性也存在 inode 記錄中。它包含了文件系統中文件的基本屬性,例如:模式/權限(保護)、所有者 ID、組 ID、文件大小、文件的硬鏈接數、上次訪問時間、最後修改時間、inode 上次修改時間。硬連接和源文件具有相同的 inode 。

ls -i fileName	# 查看文件的 inode 號
  • data block 塊:記錄文件的實際內容。每個 block 都有一個編號,大小爲 4k-16k,是在格式化時確定,由 inode 號來記錄 block 在磁盤中存儲的位置。若文件太大時,會佔用多個 block,爲了提高目錄訪問效率,Linux 還提供了表達路徑與 inode 對應關係的 Dentry(目錄項)結構,包括了各種目錄信息,還指向了 inode 和超級塊。

就像一本書有封面、目錄和正文一樣。在文件系統中,超級塊就相當於封面,從封面可以得知這本書的基本信息;inode 塊相當於目錄,從目錄可以得知各章節內容的位置;而數據塊則相當於書的正文,記錄着具體內容。

我們將 inode 與 data block 區塊用圖解來說明一下,如下圖所示,文件系統先格式化出 inode 與 data block 的區塊,假設某一個文件的屬性與權限數據是放置到 inode 4 號(下圖較小方格內),而這個 inode 記錄了文件數據的實際放置點爲 2, 7, 13, 15 這四個 data block 號碼,此時我們的操作系統就能夠據此來排列磁盤的閱讀順序,可以一口氣將四個 block 內容讀出來。那麼數據的讀取就如同下圖中的箭頭所指定的模樣了。

在這裏插入圖片描述
這種數據存取的方式稱爲索引式文件系統(Indexed Allocation)。區別於閃存,閃存使用的文件系統一般爲 FAT 格式。FAT 這種格式的文件系統並沒有 inode 存在,所以 FAT 沒有辦法將這個文件的所有 data block 在一開始就讀取出來。每個 data block 號碼都記錄在前一個 data block 當中, 其讀取方式有點像下圖所示:

在這裏插入圖片描述

可見,FAT 文件系統中,如果同一個文件數據寫入的 data block 分散的太過厲害,則磁盤讀取頭將無法在磁盤轉一圈就讀到所有的數據, 因此磁盤就會多轉好幾圈才能完整的讀取到這個文件的內容。

對比兩者常見的一種常見就是 “碎片整理”:需要碎片整理的原因就是文件寫入的 data block 太過於離散了,此時文件讀取的效能將會變的很差所致。這個時候可以透過碎片整理將同一個文件所屬的 data blocks 彙整在一起,這樣數據的讀取會比較容易啊。可見,FAT 的文件系統需要經常的碎片整理一下的。相對的,因爲 ExtX 是索引式文件系統,所以基本上不太需要常常進行碎片整理。但是如果文件系統使用太久了,常常刪除/編輯/新增文件時,那麼還是可能會造成文件數據太過於離散的問題,此時或許會需要進行重整一下的,但很少見。

LVM 與 RAID

在傳統的磁盤與文件系統的應用中,一個分區就是隻能夠被格式化成爲一中類型的文件系統,所以我們可以說一個 Filesystem 就是一個 Partition。但是隨着新技術的發展,例如:LVM 與軟件磁盤陣列(Software RAID), 這些技術可以將一個分區格式化爲多個相同或不同類型的文件系統(e.g. LVM),也能夠將多個分區合成一個文件系統(e.g. LVM、RAID)。所以說,目前我們在格式化時已經不再說:針對某個 Partition 來格式化了,而是稱呼一個可被掛載的數據盤設備爲一個文件系統。

LVM 邏輯卷管理

  1. 把物理分區初始化爲物理卷
pvcreate /dev/sdX1 /dev/sdb1
pvs  # 查看物理卷,還可以使用 pvdisplay、pvscan
  1. 創建卷組 :把物理卷分組,卷組的最小存儲單位是 PE,默認 PE 的大小爲 4M。
vgcreate 卷組名 /dev/sdX1 /dev/sdb1  
vgs		# 查看卷組vgdisplay、vgscan 
vgcreate -s xM 卷組名 /dev/sdX1 /dev/sdb1		# 創建VG並指定PE大小
  1. 建立邏輯卷
lvcreate -L 容量 卷組名 -n 邏輯卷名 
lvcreate -l PE的個數 卷組名 -n 邏輯卷名  
lvs  # 查看邏輯卷大小 lvdisplay、lvscan
  1. 格式化
mkfs.xfs /dev/卷組名/邏輯卷名
  1. 掛載
mount /dev/卷組名/邏輯卷名  /掛載點
  • vg 的擴展:
 vgextend  卷組名    物理卷
  • vg 的縮小
vgreduce     卷組名    物理卷
  • vg 的改名
 vgrename   老的卷組名  新的卷組名
  • vg 的遷移
 vgexport  #導出,vg 在導出前要停止 vg 的使用 
 vgchange -an 卷組名
 vgimport   #導入
  • lv 擴展
lvextend -L 5500M /dev/myvg1/mylv
xfs_growfs /dev/myvg1/mylv   

NOTE:XFS 格式的 LVM 卷都只能增大,不能縮小。而 Ext4 格式的 LVM 卷可以增大/縮小。

  • lv的縮小
umount  #卸載
resize2fs  /dev/extvg/extlv  500M   
lvreduce  -L 500M /dev/extvg/extlv
mount   # 重新掛載
  • LVM 的修復
vgcfgrestore -l  卷組名
vgcfgrestore -f 文件名  卷組名 
lvchange -an /dev/卷組名/邏輯卷名
lvchange -ay /dev/卷組名/邏輯卷名
  • LVM 的快照
lvcreate -L 10M -n mys1 -s /dev/extvg/extlv   #創建
lvconvert --merge  /dev/extvg/mys1   #還原,還原後快照消失

RAID 磁盤陣列

  • 軟 RAID:用操作系統實現的冗餘 消耗 CPU、內存

  • 硬 RAID:用服務器上的 RAID 卡實現的冗餘(有 CPU、內存)

RAID 類型:

  • RAID0 條帶化:至少 2 塊磁盤,優點:寫速度快;缺點:沒有冗餘。

  • RAID1 鏡像:至少 2 個磁盤,優點:提高了冗餘;缺點:寫的速度沒有提升,磁盤的使用率 1/N。

  • RAID5 條帶冗餘:至少 3 塊硬盤,優點:提高了冗餘性,同時提高了寫的速度。缺點:修改數據速度慢 磁盤的使用率 N-1/N。

建立 RAID

mdadm -C /dev/mdX -a yes -l 級別 -n 磁盤的數量  /dev/sdb1    /dev/sdc1   
mkfs.xfs  /dev/mdX  
mount /dev/mdX /123

停止 RAID

mdadm -S /dev/md1   

恢復 RAID

 mdadm -As /dev/md1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章