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

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

章節簡述:

在學習了第6章講解的硬盤設備分區、格式化、掛載等知識后,本章將深入講解各個常用RAID(Redundant Array of Independent Disks,獨立冗余磁盤陣列)技術方案的特性,并通過實際部署RAID 10、RAID 5+備份盤等方案來更直觀地查看RAID的強大效果,以便進一步滿足生產環境對硬盤設備的IO讀寫速度和數據冗余備份機制的需求。同時,考慮到用戶可能會動態調整存儲資源,本章還將介紹LVM(Logical Volume Manager,邏輯卷管理器)的部署、擴容、縮小、快照以及卸載刪除的相關知識。相信讀者在學完本章內容后,便可以在企業級生產環境中靈活運用RAID和LVM來滿足對存儲資源的高級管理需求了。

7.1 RAID磁盤冗余陣列

近年來, CPU的處理性能保持著高速增長,Intel公司在2017年最新發布的i9-7980XE處理器芯片更是達到了18核心36線程。但與此同時,硬盤設備的性能提升卻不是很大,因此逐漸成為當代計算機整體性能的瓶頸。而且,由于硬盤設備需要進行持續、頻繁、大量的IO操作,相較于其他設備,其損壞幾率也大幅增加,導致重要數據丟失的幾率也隨之增加。

1988年,加利福尼亞大學伯克利分校首次提出并定義了RAID技術的概念。RAID技術通過把多個硬盤設備組合成一個容量更大、安全性更好的磁盤陣列,并把數據切割成多個區段后分別存放在各個不同的物理硬盤設備上,然后利用分散讀寫技術來提升磁盤陣列整體的性能,同時把多個重要數據的副本同步到不同的物理硬盤設備上,從而起到了非常好的數據冗余備份效果。

任何事物都有它的兩面性。RAID技術確實具有非常好的數據冗余備份功能,但是它也相應地提高了成本支出。就像原本我們只有一個電話本,但是為了避免遺失,我們將聯系人號碼信息寫成了兩份,自然要為此多買一個電話本,這也就相應地提升了成本支出。RAID技術的設計初衷是減少因為采購硬盤設備帶來的費用支出,但是與數據本身的價值相比較,現代企業更看重的則是RAID技術所具備的冗余備份機制以及帶來的硬盤吞吐量的提升。也就是說,RAID不僅降低了硬盤設備損壞后丟失數據的幾率,還提升了硬盤設備的讀寫速度,所以它在絕大多數運營商或大中型企業中得以廣泛部署和應用。

出于成本和技術方面的考慮,需要針對不同的需求在數據可靠性及讀寫性能上作出權衡,制定出滿足各自需求的不同方案。目前已有的RAID磁盤陣列的方案至少有十幾種,而劉遄老師接下來會詳細講解RAID 0、RAID 1、RAID 5與RAID 10這4種最常見的方案。

1. RAID 0

RAID 0技術把多塊物理硬盤設備(至少兩塊)通過硬件或軟件的方式串聯在一起,組成一個大的卷組,并將數據依次寫入到各個物理硬盤中。這樣一來,在最理想的狀態下,硬盤設備的讀寫性能會提升數倍,但是若任意一塊硬盤發生故障將導致整個系統的數據都受到破壞。通俗來說,RAID 0技術能夠有效地提升硬盤數據的吞吐速度,但是不具備數據備份和錯誤修復能力。如圖7-1所示,數據被分別寫入到不同的硬盤設備中,即disk1和disk2硬盤設備會分別保存數據資料,最終實現提升讀取、寫入速度的效果。

圖7-1? RAID 0技術示意圖

2. RAID 1

盡管RAID 0技術提升了硬盤設備的讀寫速度,但是它是將數據依次寫入到各個物理硬盤中,也就是說,它的數據是分開存放的,其中任何一塊硬盤發生故障都會損壞整個系統的數據。因此,如果生產環境對硬盤設備的讀寫速度沒有要求,而是希望增加數據的安全性時,就需要用到RAID 1技術了。

在圖7-2所示的RAID 1技術示意圖中可以看到,它是把兩塊以上的硬盤設備進行綁定,在寫入數據時,是將數據同時寫入到多塊硬盤設備上(可以將其視為數據的鏡像或備份)。當其中某一塊硬盤發生故障后,一般會立即自動以熱交換的方式來恢復數據的正常使用。

圖7-2? RAID 1技術示意圖

RAID 1技術雖然十分注重數據的安全性,但是因為是在多塊硬盤設備中寫入了相同的數據,因此硬盤設備的利用率得以下降,從理論上來說,圖7-2所示的硬盤空間的真實可用率只有50%,由三塊硬盤設備組成的RAID 1磁盤陣列的可用率只有33%左右,以此類推。而且,由于需要把數據同時寫入到兩塊以上的硬盤設備,這無疑也在一定程度上增大了系統計算功能的負載。

那么,有沒有一種RAID方案既考慮到了硬盤設備的讀寫速度和數據安全性,還兼顧了成本問題呢?實際上,單從數據安全和成本問題上來講,就不可能在保持原有硬盤設備的利用率且還不增加新設備的情況下,能大幅提升數據的安全性。劉遄老師也沒有必要忽悠各位讀者,下面將要講解的RAID 5技術雖然在理論上兼顧了三者(讀寫速度、數據安全性、成本),但實際上更像是對這三者的“相互妥協”。

3. RAID 5

如圖7-3所示,RAID5技術是把硬盤設備的數據奇偶校驗信息保存到其他硬盤設備中。RAID 5磁盤陣列組中數據的奇偶校驗信息并不是單獨保存到某一塊硬盤設備中,而是存儲到除自身以外的其他每一塊硬盤設備上,這樣的好處是其中任何一設備損壞后不至于出現致命缺陷;圖7-3中parity部分存放的就是數據的奇偶校驗信息,換句話說,就是RAID 5技術實際上沒有備份硬盤中的真實數據信息,而是當硬盤設備出現問題后通過奇偶校驗信息來嘗試重建損壞的數據。RAID這樣的技術特性“妥協”地兼顧了硬盤設備的讀寫速度、數據安全性與存儲成本問題。

圖7-3? RAID5技術示意圖

4. ?RAID 10

鑒于RAID 5技術是因為硬盤設備的成本問題對讀寫速度和數據的安全性能而有了一定的妥協,但是大部分企業更在乎的是數據本身的價值而非硬盤價格,因此生產環境中主要使用RAID 10技術。

顧名思義,RAID 10技術是RAID 1+RAID 0技術的一個“組合體”。如圖7-4所示,RAID 10技術需要至少4塊硬盤來組建,其中先分別兩兩制作成RAID 1磁盤陣列,以保證數據的安全性;然后再對兩個RAID 1磁盤陣列實施RAID 0技術,進一步提高硬盤設備的讀寫速度。這樣從理論上來講,只要壞的不是同一組中的所有硬盤,那么最多可以損壞50%的硬盤設備而不丟失數據。由于RAID 10技術繼承了RAID 0的高讀寫速度和RAID 1的數據安全性,在不考慮成本的情況下RAID 10的性能都超過了RAID 5,因此當前成為廣泛使用的一種存儲技術。

圖7-4? RAID 10技術示意圖

7.1.1? 部署磁盤陣列

在具備了上一章的硬盤設備管理基礎之后,再來部署RAID和LVM就變得十分輕松了。首先,需要在虛擬機中添加4塊硬盤設備來制作一個RAID 10磁盤陣列,如圖7-5所示。

虛擬機添加硬盤

圖7-5? 為虛擬機系統模擬添加4塊硬盤設備

這幾塊硬盤設備是模擬出來的,不需要特意去買幾塊真實的物理硬盤插到電腦上。需要注意的是,一定要記得在關閉系統之后,再在虛擬機中添加硬盤設備,否則可能會因為計算機架構的不同而導致虛擬機系統無法識別添加的硬盤設備。

mdadm命令用于管理Linux系統中的軟件RAID硬盤陣列,格式為“mdadm [模式] <RAID設備名稱> [選項] [成員設備名稱]”。

當前,生產環境中用到的服務器一般都配備RAID陣列卡,盡管服務器的價格越來越便宜,但是我們沒有必要為了做一個實驗而去單獨購買一臺服務器,而是可以學會用mdadm命令在Linux系統中創建和管理軟件RAID磁盤陣列,而且它涉及的理論知識的操作過程與生產環境中的完全一致。mdadm命令的常用參數以及作用如表7-1所示。

表7-1??????????????????????????????????????????? mdadm命令的常用參數和作用

參數 作用
-a 檢測設備名稱
-n 指定設備數量
-l 指定RAID級別
-C 創建
-v 顯示過程
-f 模擬設備損壞
-r 移除設備
-Q 查看摘要信息
-D 查看詳細信息
-S 停止RAID磁盤陣列

接下來,使用mdadm命令創建RAID 10,名稱為“/dev/md0”。

第6章中講到,udev是Linux系統內核中用來給硬件命名的服務,其命名規則也非常簡單。我們可以通過命名規則猜測到第二個SCSI存儲設備的名稱會是/dev/sdb,然后依此類推。使用硬盤設備來部署RAID磁盤陣列很像是將幾位同學組成一個班級,但總不能將班級命名為/dev/sdbcde吧。盡管這樣可以一眼看出它是由哪些元素組成的,但是并不利于我們的記憶和閱讀。更何況如果我們是使用10、50、100個硬盤來部署RAID磁盤陣列呢?

此時,就需要使用mdadm中的參數了。其中,-C參數代表創建一個RAID陣列卡;-v參數顯示創建的過程,同時在后面追加一個設備名稱/dev/md0,這樣/dev/md0就是創建后的RAID磁盤陣列的名稱;-a yes參數代表自動創建設備文件;-n 4參數代表使用4塊硬盤來部署這個RAID磁盤陣列;而-l 10參數則代表RAID 10方案;最后再加上4塊硬盤設備的名稱就搞定了。

[[email protected] ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 20954624K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

其次,把制作好的RAID磁盤陣列格式化為ext4格式。

[[email protected] ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477312 blocks
523865 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2157969408
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

再次,創建掛載點然后把硬盤設備進行掛載操作。掛載成功后可看到可用空間為40GB。

[[email protected] ~]# mkdir /RAID
[[email protected] ~]# mount /dev/md0 /RAID
[[email protected] ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.0G 15G 17% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 84K 914M 1% /dev/shm
tmpfs 914M 8.9M 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/md0 40G 49M 38G 1% /RAID

最后,查看/dev/md0磁盤陣列的詳細信息,并把掛載信息寫入到配置文件中,使其永久生效。

[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue May 5 07:43:26 2017
Raid Level : raid10
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Tue May 5 07:46:59 2017
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : cc9a87d4:1e89e175:5383e1e8:a78ec62c
Events : 17
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
3 8 64 3 active sync /dev/sde
[[email protected] ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
7.1.2? 損壞磁盤陣列及修復

之所以在生產環境中部署RAID 10磁盤陣列,是為了提高硬盤存儲設備的讀寫速度及數據的安全性,但由于我們的硬盤設備是在虛擬機中模擬出來的,因此對讀寫速度的改善可能并不直觀,因此劉遄老師決定給各位讀者講解一下RAID磁盤陣列損壞后的處理方法,這樣大家在步入運維崗位后遇到類似問題時,也可以輕松解決。

在確認有一塊物理硬盤設備出現損壞而不能繼續正常使用后,應該使用mdadm命令將其移除,然后查看RAID磁盤陣列的狀態,可以發現狀態已經改變。

咱們在生產環境中部署RAID10磁盤陣列組目的就是為了提高存儲設備的IO讀寫速度及數據的安全性,但因為這次是在本機電腦上模擬出來的硬盤設備所以對于讀寫速度的改善可能并不直觀,因此劉遄老師決定給同學們講解下RAID磁盤陣列組損壞后的處理方法,這樣以后步入了運維崗位后不會因為突發事件而手忙腳亂。首先確認有一塊物理硬盤設備出現損壞不能再繼續正常使用后,應該使用mdadm命令來予以移除之后查看下RAID磁盤陣列組的狀態已經被改變:

[[email protected] ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri May 8 08:11:00 2017
Raid Level : raid10
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri May 8 08:27:18 2017
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : f2993bbd:99c1eb63:bd61d4d4:3f06c3b0
Events : 21
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
3 8 64 3 active sync /dev/sde
0 8 16 - faulty /dev/sdb

在RAID 10級別的磁盤陣列中,當RAID 1磁盤陣列中存在一個故障盤時并不影響RAID 10磁盤陣列的使用。當購買了新的硬盤設備后再使用mdadm命令來予以替換即可,在此期間我們可以在/RAID目錄中正常地創建或刪除文件。由于我們是在虛擬機中模擬硬盤,所以先重啟系統,然后再把新的硬盤添加到RAID磁盤陣列中。

[[email protected] ~]# umount /RAID
[[email protected] ~]# mdadm /dev/md0 -a /dev/sdb
[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
 Version : 1.2
 Creation Time : Mon Jan 30 00:08:56 2017
 Raid Level : raid10
 Array Size : 41909248 (39.97 GiB 42.92 GB)
 Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
 Raid Devices : 4
 Total Devices : 4
 Persistence : Superblock is persistent
 Update Time : Mon Jan 30 00:19:53 2017
 State : clean 
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
 Spare Devices : 0
 Layout : near=2
 Chunk Size : 512K
 Name : localhost.localdomain:0 (local to host localhost.localdomain)
 UUID : d3491c05:cfc81ca0:32489f04:716a2cf0
 Events : 56
 Number Major Minor RaidDevice State
 4 8 16 0 active sync /dev/sdb
 1 8 32 1 active sync /dev/sdc
 2 8 48 2 active sync /dev/sdd
 3 8 64 3 active sync /dev/sde
[[email protected] ~]# mount -a
7.1.3? 磁盤陣列+備份盤

RAID 10磁盤陣列中最多允許50%的硬盤設備發生故障,但是存在這樣一種極端情況,即同一RAID 1磁盤陣列中的硬盤設備若全部損壞,也會導致數據丟失。換句話說,在RAID 10磁盤陣列中,如果RAID 1中的某一塊硬盤出現了故障,而我們正在前往修復的路上,恰巧該RAID1磁盤陣列中的另一塊硬盤設備也出現故障,那么數據就被徹底丟失了。劉遄老師可真不是烏鴉嘴,這種RAID 1磁盤陣列中的硬盤設備同時損壞的情況還真被我的學生遇到過。

在這樣的情況下,該怎么辦呢?其實,我們完全可以使用RAID備份盤技術來預防這類事故。該技術的核心理念就是準備一塊足夠大的硬盤,這塊硬盤平時處于閑置狀態,一旦RAID磁盤陣列中有硬盤出現故障后則會馬上自動頂替上去。這樣很棒吧!

為了避免多個實驗之間相互發生沖突,我們需要保證每個實驗的相對獨立性,為此需要大家自行將虛擬機還原到初始狀態。另外,由于剛才已經演示了RAID 10磁盤陣列的部署方法,我們現在來看一下RAID 5的部署效果。部署RAID 5磁盤陣列時,至少需要用到3塊硬盤,還需要再加一塊備份硬盤,所以總計需要在虛擬機中模擬4塊硬盤設備,如圖7-6所示。

第7章 使用RAID與LVM磁盤陣列技術。第7章 使用RAID與LVM磁盤陣列技術。

圖7-6? 在虛擬機中模擬添加4塊硬盤設備

現在創建一個RAID 5磁盤陣列+備份盤。在下面的命令中,參數-n 3代表創建這個RAID 5磁盤陣列所需的硬盤數,參數-l 5代表RAID的級別,而參數-x 1則代表有一塊備份盤。當查看/dev/md0(即RAID 5磁盤陣列的名稱)磁盤陣列的時候就能看到有一塊備份盤在等待中了。

[[email protected] ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 20954624K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri May 8 09:20:35 2017
Raid Level : raid5
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri May 8 09:22:22 2017
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : 44b1a152:3f1809d3:1d234916:4ac70481
Events : 18
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
4 8 48 2 active sync /dev/sdd
3 8 64 - spare /dev/sde

現在將部署好的RAID 5磁盤陣列格式化為ext4文件格式,然后掛載到目錄上,之后就可以使用了。

[[email protected] ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477312 blocks
523865 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2157969408
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[[email protected] ~]# echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
[[email protected] ~]# mkdir /RAID
[[email protected] ~]# mount -a

最后是見證奇跡的時刻!我們再次把硬盤設備/dev/sdb移出磁盤陣列,然后迅速查看/dev/md0磁盤陣列的狀態,就會發現備份盤已經被自動頂替上去并開始了數據同步。RAID中的這種備份盤技術非常實用,可以在保證RAID磁盤陣列數據安全性的基礎上進一步提高數據可靠性,所以,如果公司不差錢的話還是再買上一塊備份盤以防萬一。

[[email protected] ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[[email protected] ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri May 8 09:20:35 2017
Raid Level : raid5
Array Size : 41909248 (39.97 GiB 42.92 GB)
Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri May 8 09:23:51 2017
State : active, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 1
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Rebuild Status : 0% complete
Name : linuxprobe.com:0 (local to host linuxprobe.com)
UUID : 44b1a152:3f1809d3:1d234916:4ac70481
Events : 21
Number Major Minor RaidDevice State
3 8 64 0 spare rebuilding /dev/sde
1 8 32 1 active sync /dev/sdc
4 8 48 2 active sync /dev/sdd
0 8 16 - faulty /dev/sdb

出現問題?大膽提問!

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

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

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

7.2 LVM邏輯卷管理器

前面學習的硬盤設備管理技術雖然能夠有效地提高硬盤設備的讀寫速度以及數據的安全性,但是在硬盤分好區或者部署為RAID磁盤陣列之后,再想修改硬盤分區大小就不容易了。換句話說,當用戶想要隨著實際需求的變化調整硬盤分區的大小時,會受到硬盤“靈活性”的限制。這時就需要用到另外一項非常普及的硬盤設備資源管理技術了—LVM(邏輯卷管理器)。LVM可以允許用戶對硬盤資源進行動態調整。

邏輯卷管理器是Linux系統用于對硬盤分區進行管理的一種機制,理論性較強,其創建初衷是為了解決硬盤設備在創建分區后不易修改分區大小的缺陷。盡管對傳統的硬盤分區進行強制擴容或縮容從理論上來講是可行的,但是卻可能造成數據的丟失。而LVM技術是在硬盤分區和文件系統之間添加了一個邏輯層,它提供了一個抽象的卷組,可以把多塊硬盤進行卷組合并。這樣一來,用戶不必關心物理硬盤設備的底層架構和布局,就可以實現對硬盤分區的動態調整。LVM的技術架構如圖7-7所示。

邏輯卷

圖7-7? 邏輯卷管理器的技術結構

為了幫助大家理解,劉遄老師來舉一個吃貨的例子。比如小明家里想吃饅頭但是面粉不夠了,于是媽媽從隔壁老王家、老李家、老張家分別借來一些面粉,準備蒸饅頭吃。首先需要把這些面粉(物理卷[PV,Physical Volume])揉成一個大面團(卷組[VG,Volume Group]),然后再把這個大面團分割成一個個小饅頭(邏輯卷[LV,Logical Volume]),而且每個小饅頭的重量必須是每勺面粉(基本單元[PE,Physical Extent])的倍數。

物理卷處于LVM中的最底層,可以將其理解為物理硬盤、硬盤分區或者RAID磁盤陣列,這都可以。卷組建立在物理卷之上,一個卷組可以包含多個物理卷,而且在卷組創建之后也可以繼續向其中添加新的物理卷。邏輯卷是用卷組中空閑的資源建立的,并且邏輯卷在建立后可以動態地擴展或縮小空間。這就是LVM的核心理念。

7.2.1 部署邏輯卷

一般而言,在生產環境中無法精確地評估每個硬盤分區在日后的使用情況,因此會導致原先分配的硬盤分區不夠用。比如,伴隨著業務量的增加,用于存放交易記錄的數據庫目錄的體積也隨之增加;因為分析并記錄用戶的行為從而導致日志目錄的體積不斷變大,這些都會導致原有的硬盤分區在使用上捉襟見肘。而且,還存在對較大的硬盤分區進行精簡縮容的情況。

我們可以通過部署LVM來解決上述問題。部署LVM時,需要逐個配置物理卷、卷組和邏輯卷。常用的部署命令如表7-2所示。

表7-2?????????????????????????????????????????????????? 常用的LVM部署命令

功能/命令 物理卷管理 卷組管理 邏輯卷管理
掃描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
顯示 pvdisplay vgdisplay lvdisplay
刪除 pvremove vgremove lvremove
擴展 vgextend lvextend
縮小 vgreduce lvreduce

為了避免多個實驗之間相互發生沖突,請大家自行將虛擬機還原到初始狀態,并在虛擬機中添加兩塊新硬盤設備,然后開機,如圖7-8所示。

在虛擬機中添加兩塊新硬盤設備的目的,是為了更好地演示LVM理念中用戶無需關心底層物理硬盤設備的特性。我們先對這兩塊新硬盤進行創建物理卷的操作,可以將該操作簡單理解成讓硬盤設備支持LVM技術,或者理解成是把硬盤設備加入到LVM技術可用的硬件資源池中,然后對這兩塊硬盤進行卷組合并,卷組的名稱可以由用戶來自定義。接下來,根據需求把合并后的卷組切割出一個約為150MB的邏輯卷設備,最后把這個邏輯卷設備格式化成EXT4文件系統后掛載使用。在下文中,劉遄老師將對每一個步驟再作一些簡單的描述。

第1步:讓新添加的兩塊硬盤設備支持LVM技術。

[[email protected] ~]# pvcreate /dev/sdb /dev/sdc
 Physical volume "/dev/sdb" successfully created
 Physical volume "/dev/sdc" successfully created

圖7-8? 在虛擬機中添加兩塊新的硬盤設備

第2步:把兩塊硬盤設備加入到storage卷組中,然后查看卷組的狀態。

[[email protected] ~]# vgcreate storage /dev/sdb /dev/sdc
 Volume group "storage" successfully created
[[email protected] ~]# vgdisplay
--- Volume group ---
 VG Name storage
 System ID 
 Format lvm2
 Metadata Areas 2
 Metadata Sequence No 1
 VG Access read/write
 VG Status resizable
 MAX LV 0
 Cur LV 0
 Open LV 0
 Max PV 0
 Cur PV 2
 Act PV 2
 VG Size 39.99 GiB
 PE Size 4.00 MiB
 Total PE 10238
 Alloc PE / Size 0 / 0  Free PE / Size 10238 / 39.99 GiB
 VG UUID KUeAMF-qMLh-XjQy-ArUo-LCQI-YF0o-pScxm1
………………省略部分輸出信息………………

第3步:切割出一個約為150MB的邏輯卷設備。

這里需要注意切割單位的問題。在對邏輯卷進行切割時有兩種計量單位。第一種是以容量為單位,所使用的參數為-L。例如,使用-L 150M生成一個大小為150MB的邏輯卷。另外一種是以基本單元的個數為單位,所使用的參數為-l。每個基本單元的大小默認為4MB。例如,使用-l 37可以生成一個大小為37×4MB=148MB的邏輯卷。

[[email protected] ~]# lvcreate -n vo -l 37 storage
 Logical volume "vo" created
[[email protected] ~]# lvdisplay 
 --- Logical volume ---
 LV Path /dev/storage/vo
 LV Name vo
 VG Name storage
 LV UUID D09HYI-BHBl-iXGr-X2n4-HEzo-FAQH-HRcM2I
 LV Write Access read/write
 LV Creation host, time localhost.localdomain, 2017-02-01 01:22:54 -0500
 LV Status available
 # open 0
 LV Size 148.00 MiB
 Current LE 37
 Segments 1
 Allocation inherit
 Read ahead sectors auto
 - currently set to 8192
 Block device 253:2
………………省略部分輸出信息………………

第4步:把生成好的邏輯卷進行格式化,然后掛載使用。

Linux系統會把LVM中的邏輯卷設備存放在/dev設備目錄中(實際上是做了一個符號鏈接),同時會以卷組的名稱來建立一個目錄,其中保存了邏輯卷的設備映射文件(即/dev/卷組名稱/邏輯卷名稱)。

[[email protected]?~]# mkfs.ext4 /dev/storage/vo 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
38000 inodes, 151552 blocks
7577 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33816576
19 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks: 
 8193, 24577, 40961, 57345, 73729
Allocating group tables: done 
Writing inode tables: done 
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 
[[email protected]?~]# mkdir /linuxprobe
[[email protected] ~]# mount /dev/storage/vo /linuxprobe

第5步:查看掛載狀態,并寫入到配置文件,使其永久生效。

[[email protected] ~]# df -h
 Filesystem Size Used Avail Use% Mounted on
 /dev/mapper/rhel-root 18G 3.0G 15G 17% /
 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/mapper/storage-vo 145M 7.6M 138M 6% /linuxprobe
 [[email protected] ~]# echo "/dev/storage/vo /linuxprobe ext4 defaults 0 0" >> /etc/fstab
7.2.2 擴容邏輯卷

在前面的實驗中,卷組是由兩塊硬盤設備共同組成的。用戶在使用存儲設備時感知不到設備底層的架構和布局,更不用關心底層是由多少塊硬盤組成的,只要卷組中有足夠的資源,就可以一直為邏輯卷擴容。擴展前請一定要記得卸載設備和掛載點的關聯。

[[email protected] ~]# umount /linuxprobe

第1步:把上一個實驗中的邏輯卷vo擴展至290MB。

[[email protected] ~]# lvextend -L 290M /dev/storage/vo
 Rounding size to boundary between physical extents: 292.00 MiB
 Extending logical volume vo to 292.00 MiB
 Logical volume vo successfully resized

第2步:檢查硬盤完整性,并重置硬盤容量。

[[email protected] ~]# e2fsck -f /dev/storage/vo
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo: 11/38000 files (0.0% non-contiguous), 10453/151552 blocks
[[email protected] ~]# resize2fs /dev/storage/vo
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 299008 (1k) blocks.
The filesystem on /dev/storage/vo is now 299008 blocks long.

第3步:重新掛載硬盤設備并查看掛載狀態。

[[email protected] ~]# mount -a
[[email protected] ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.0G 15G 17% /
devtmpfs 985M 0 985M 0% /dev
tmpfs 994M 80K 994M 1% /dev/shm
tmpfs 994M 8.8M 986M 1% /run
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/mapper/storage-vo 279M 2.1M 259M 1% /linuxprobe
7.2.3 縮小邏輯卷

相較于擴容邏輯卷,在對邏輯卷進行縮容操作時,其丟失數據的風險更大。所以在生產環境中執行相應操作時,一定要提前備份好數據。另外Linux系統規定,在對LVM邏輯卷進行縮容操作之前,要先檢查文件系統的完整性(當然這也是為了保證我們的數據安全)。在執行縮容操作前記得先把文件系統卸載掉。

[[email protected] ~]# umount /linuxprobe

第1步:檢查文件系統的完整性。

[[email protected] ~]# e2fsck -f /dev/storage/vo
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo: 11/74000 files (0.0% non-contiguous), 15507/299008 blocks

第2步:把邏輯卷vo的容量減小到120MB。

[[email protected] ~]# resize2fs /dev/storage/vo 120M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 122880 (1k) blocks.
The filesystem on /dev/storage/vo is now 122880 blocks long.
[[email protected] ~]# lvreduce -L 120M /dev/storage/vo
 WARNING: Reducing active logical volume to 120.00 MiB
 THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vo? [y/n]: y
 Reducing logical volume vo to 120.00 MiB
 Logical volume vo successfully resized

第3步:重新掛載文件系統并查看系統狀態。

[[email protected] ~]# mount -a
[[email protected] ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.0G 15G 17% /
devtmpfs 985M 0 985M 0% /dev
tmpfs 994M 80K 994M 1% /dev/shm
tmpfs 994M 8.8M 986M 1% /run
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/mapper/storage-vo 113M 1.6M 103M 2% /linuxprobe
7.2.4 邏輯卷快照

LVM還具備有“快照卷”功能,該功能類似于虛擬機軟件的還原時間點功能。例如,可以對某一個邏輯卷設備做一次快照,如果日后發現數據被改錯了,就可以利用之前做好的快照卷進行覆蓋還原。LVM的快照卷功能有兩個特點:

快照卷的容量必須等同于邏輯卷的容量;

快照卷僅一次有效,一旦執行還原操作后則會被立即自動刪除。

首先查看卷組的信息。

[[email protected] ~]# vgdisplay
 --- Volume group ---
 VG Name storage
 System ID 
 Format lvm2
 Metadata Areas 2
 Metadata Sequence No 4
 VG Access read/write
 VG Status resizable
 MAX LV 0
 Cur LV 1
 Open LV 1
 Max PV 0
 Cur PV 2
 Act PV 2
 VG Size 39.99 GiB
 PE Size 4.00 MiB
 Total PE 10238
 Alloc PE / Size 30 / 120.00 MiB Free PE / Size 10208 / 39.88 GiB
 VG UUID CTaHAK-0TQv-Abdb-R83O-RU6V-YYkx-8o2R0e
………………省略部分輸出信息………………

通過卷組的輸出信息可以清晰看到,卷組中已經使用了120MB的容量,空閑容量還有39.88GB。接下來用重定向往邏輯卷設備所掛載的目錄中寫入一個文件。

[[email protected] ~]# echo "Welcome to Linuxprobe.com" > /linuxprobe/readme.txt
[[email protected] ~]# ls -l /linuxprobe
total 14
drwx------. 2 root root 12288 Feb 1 07:18 lost+found
-rw-r--r--. 1 root root 26 Feb 1 07:38 readme.txt

第1步:使用-s參數生成一個快照卷,使用-L參數指定切割的大小。另外,還需要在命令后面寫上是針對哪個邏輯卷執行的快照操作。

[[email protected] ~]#  lvcreate -L 120M -s -n SNAP /dev/storage/vo
 Logical volume "SNAP" created
[[email protected] ~]# lvdisplay
--- Logical volume ---
 LV Path /dev/storage/SNAP
 LV Name SNAP
 VG Name storage
 LV UUID BC7WKg-fHoK-Pc7J-yhSd-vD7d-lUnl-TihKlt
 LV Write Access read/write
 LV Creation host, time localhost.localdomain, 2017-02-01 07:42:31 -0500
 LV snapshot status active destination for vo
 LV Status available
 # open 0
 LV Size 120.00 MiB
 Current LE 30
 COW-table size 120.00 MiB
 COW-table LE 30
 Allocated to snapshot 0.01%
 Snapshot chunk size 4.00 KiB
 Segments 1
 Allocation inherit
 Read ahead sectors auto
 - currently set to 8192
 Block device 253:3
………………省略部分輸出信息………………

第2步:在邏輯卷所掛載的目錄中創建一個100MB的垃圾文件,然后再查看快照卷的狀態。可以發現存儲空間占的用量上升了。

[[email protected] ~]# dd if=/dev/zero of=/linuxprobe/files count=1 bs=100M
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 3.35432 s, 31.3 MB/s
[[email protected] ~]# lvdisplay
 --- Logical volume ---
 LV Path /dev/storage/SNAP
 LV Name SNAP
 VG Name storage
 LV UUID BC7WKg-fHoK-Pc7J-yhSd-vD7d-lUnl-TihKlt
 LV Write Access read/write
 LV Creation host, time localhost.localdomain, 2017-02-01 07:42:31 -0500
 LV snapshot status active destination for vo
 LV Status available
 # open 0
 LV Size 120.00 MiB
 Current LE 30
 COW-table size 120.00 MiB
 COW-table LE 30
 Allocated to snapshot 83.71%
 Snapshot chunk size 4.00 KiB
 Segments 1
 Allocation inherit
 Read ahead sectors auto
 - currently set to 8192
 Block device 253:3

第3步:為了校驗SNAP快照卷的效果,需要對邏輯卷進行快照還原操作。在此之前記得先卸載掉邏輯卷設備與目錄的掛載。

[[email protected] ~]# umount /linuxprobe
[[email protected] ~]# lvconvert --merge /dev/storage/SNAP
 Merging of volume SNAP started.
 vo: Merged: 21.4%
 vo: Merged: 100.0%
 Merge of snapshot into logical volume vo has finished.
 Logical volume "SNAP" successfully removed

第4步:快照卷會被自動刪除掉,并且剛剛在邏輯卷設備被執行快照操作后再創建出來的100MB的垃圾文件也被清除了。

[[email protected] ~]# mount -a
[[email protected] ~]# ls /linuxprobe/
lost+found readme.txt
7.2.5 刪除邏輯卷

當生產環境中想要重新部署LVM或者不再需要使用LVM時,則需要執行LVM的刪除操作。為此,需要提前備份好重要的數據信息,然后依次刪除邏輯卷、卷組、物理卷設備,這個順序不可顛倒。

第1步:取消邏輯卷與目錄的掛載關聯,刪除配置文件中永久生效的設備參數。

[[email protected] ~]# umount /linuxprobe
[[email protected] ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Feb 19 22:08:59 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=50591e35-d47a-4aeb-a0ca-1b4e8336d9b1 /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0 
/dev/storage/vo /linuxprobe ext4 defaults 0 0

第2步:刪除邏輯卷設備,需要輸入y來確認操作。

[[email protected] ~]# lvremove /dev/storage/vo 
Do you really want to remove active logical volume vo? [y/n]: y
 Logical volume "vo" successfully removed

第3步:刪除卷組,此處只寫卷組名稱即可,不需要設備的絕對路徑。

[[email protected] ~]# vgremove storage
 Volume group "storage" successfully removed

第4步:刪除物理卷設備。

[[email protected] ~]# pvremove /dev/sdb /dev/sdc
 Labels on physical volume "/dev/sdb" successfully wiped
 Labels on physical volume "/dev/sdc" successfully wiped

在上述操作執行完畢之后,再執行lvdisplay、vgdisplay、pvdisplay命令來查看LVM的信息時就不會再看到信息了(前提是上述步驟的操作是正確的)。

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

1.?RAID技術主要是為了解決什么問題呢?

答:RAID技術可以解決存儲設備的讀寫速度問題及數據的冗余備份問題。

2.?RAID 0和RAID 5哪個更安全?

答:RAID 0沒有數據冗余功能,因此RAID 5更安全。

3.假設使用4塊硬盤來部署RAID 10方案,外加一塊備份盤,最多可以允許幾塊硬盤同時損壞呢?

答:最多允許5塊硬盤設備中的3塊設備同時損壞。

4.位于LVM最底層的是物理卷還是卷組?

答:最底層的是物理卷,然后在通過物理卷組成卷組。

5.?LVM對邏輯卷的擴容和縮容操作有何異同點呢?

答:擴容和縮容操作都需要先取消邏輯卷與目錄的掛載關聯;擴容操作是先擴容后檢查文件系統完整性,而縮容操作為了保證數據的安全,需要先檢查文件系統完整性再縮容。

6.?LVM的快照卷能使用幾次?

答:只可使用一次,而且使用后即自動刪除。

7.?LVM的刪除順序是怎么樣的?

答:依次移除邏輯卷、卷組和物理卷。

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