linux入門系列13--磁盤管理之RAID、LVM技術

前一篇文章學習了磁盤分區、格式化、掛載等相關知識,本文將講解RAID和LVM技術。node

磁盤管理操做主要是運維人員用的較多,若是隻是單純的開發人員,能夠先略過本文。可是在不少小公司裏每每都是一人多用,運維、開發一般都是同一我的,所以對我的的技能要求更高。即使不是如此,多瞭解下相關概念也是有利而無害的。mysql

本文將先講解RAID技術方案相關理論知識並經過案例演示RAID操做,而後演示LVM技術以解決存儲資源動態調整問題。linux

1、獨立冗餘磁盤陣列(RAID)

RAID(Redundant Array of Independent Disk)技術把多個硬盤設備組合成一個容量更大、安全性更好的磁盤陣列,並把數據切割成多個區段後分別存放在各個不一樣的物理硬盤設備上,利用分散讀寫技術提高磁盤陣列總體的性能,同時把多個重要數據的副本同步到不一樣的物理硬盤設備上,從而起到了很是好的數據冗餘備份效果。sql

簡單說就是經過RAID技術能夠提高磁盤讀寫性能,同時能夠冗餘備份數據保證數據可靠性。可是性能和可靠性不可能同時知足的很是好,所以在兩者之間做出權衡就產生了不一樣的RAID方案。apache

1.1 RAID方案及特色

聽說目前RAID磁盤陣列的方案至少有十幾種,然而萬變不離其宗,都是在讀寫性能和可靠性之間權衡,所以只介紹幾種比較有表明性的方案。centos

方案 特色
RAID0 磁盤讀寫性能高,但數據可靠性低
RAID1 磁盤設備利用率低,但數據可靠性高
RAID5 兼顧成本、讀寫性能和數據安全的折中方案
RAID10 相對於成本,更看重數據安全可靠
1.1.1 RAID0

把多塊物理硬盤設備經過硬件或軟件的方式串聯在一塊兒,組成一個大的卷組,並將數據依次寫入到各個物理硬盤中。安全

最理想狀況下,磁盤讀寫性能將提升數倍,但若是其中任意一塊磁盤損壞將致使整個系統數據被破壞。也就是說雖然RAID0有效提升磁盤數據的吞吐速度,可是不具有數據備份和錯誤修復能力。bash

其示意圖以下:架構

file

1.1.2 RAID1

如上所述,雖然RAID0提高了磁盤讀寫速度,可是因爲它將數據依次寫入各個磁盤中,把數據分開存儲,若是其中一塊磁盤發生故障將會致使整個系統數據損壞。所以若是對數據要求性要求較高,但對磁盤讀寫速度沒有要求的話,這種方案就不合適,須要用到RAID1方案。app

RAID1示意圖以下:

file

RAID1是把多塊硬盤綁定,數據同時寫入多塊磁盤,這樣就會有多份數據副本,當其中某一塊硬盤發生故障後,當即自動以熱交換的方式來恢復數據的正常使用。

雖然經過副本的形式保證了數據的安全性,可是磁盤設備利用率不高,從示意圖能夠看出,若是是2塊磁盤則利用率只有50%,所以增長了成本開銷。

1.1.3 RAID5

前面兩種方案分別偏向於磁盤速度和數據安全,而RAID5則是在讀寫性能、數據安全和成本之間的一個相互妥協方案。

示意圖以下:

file

RAID5技術是把硬盤設備的數據奇偶校驗信息保存到其餘硬盤設備中。這樣的好處是其中任何一設備損壞後不至於出現致命缺陷,圖中的parity部分存放的就是數據的奇偶校驗信息。

簡單說就是RAID5方案實際上沒有備份硬盤中的真實數據信息(數據只有一份),而是當硬盤設備出現問題後經過奇偶校驗信息來嘗試重建損壞的數據。

這種方案兼顧了了硬盤設備的讀寫速度、數據安全性與存儲成本問題。

1.1.4 RAID10

雖然RAID5看起來在成本問題、磁盤讀寫以及數據安全性有了一個相互妥協的方案,但實際上不少企業,尤爲是金融企業數據自己的價值遠比磁盤價格高,所以成本並非第一考慮要素,在這種場景下,通常是採用RAID10技術。

RAID10方案實際就是把RAID0和RAID1兩種方案進行組合而來,示意圖以下:

file

如圖所示,須要至少4塊硬盤來組建RAID10,先兩兩組合製做爲RAID1確保數據有副原本保證安全性,而後在將組合後的兩個RAID1採用RAID0進行組合,進一步提升設備的讀寫速度。

從理論上講,只要同一組中的硬盤不全壞掉,那麼最多能夠損壞50%的硬盤設備而不丟失數據。

因爲RAID10方案繼承了RAID0的高讀寫速度和RAID1的數據安全性,在不考慮成本的狀況下RAID10的性能都超過了RAID5,所以當前成 爲普遍使用的一種存儲技術。

說明:因爲篇幅所限,其餘的方案就不一一列出,須要說明的是應該按照實際需求去考慮成本、磁盤性能、數據安全性等因素,按需選擇最合適需求場景的方案。

1.2 mdadm命令

經過上一篇文章「linux入門系列12--磁盤管理之分區、格式化與掛載」的講解,已經學會了磁盤設備管理以後,再來部署RAID就會很是簡單,所以若是還沒掌握的話,建議先返回去看上一篇文章。

在正式操做RAID以前,咱們先看一下在linux中RAID磁盤陣列的管理命令mdadm。

語法格式:

​ mdadm [模式參數] RAID名稱 [選項] [成員磁盤列表]

參數選項:

參數 做用
-a 檢查設備名稱
-n 指定設備數量
-l level,指定 RAID 級別
-C 建立RAID
-v 顯示詳細過程
-f 模擬設備損壞
-r remove,移除設備
-D 查看詳細信息

1.3 實例1-RAID10部署

1.3.1 環境準備

咱們直接在虛擬機中模擬添加多塊磁盤來演示RAID的操做,生產環境中採用的命令和步驟都是一致的。

爲了不實驗之間的干擾,咱們先克隆一臺新的Centos虛擬機進行演示

file

點擊「克隆」後,彈出虛擬機嚮導

file

點擊「下一步」

file

保存默認選擇「虛擬機中的當前狀態」,點擊「下一步」

file

選擇「建立完整的克隆」,點擊「下一步」

file

按需修改虛擬機名稱已經存放的位置,點擊「完成」按鈕

file

等待克隆完成(根據不一樣機器的性能,克隆時間不一樣)

file

這樣新的虛擬機就準備好了。

1.3.2 建立RAID10

如前所述,RAID10至少須要4塊磁盤,所以咱們先添加4塊磁盤。

(1)添加磁盤

選擇剛纔克隆的虛擬機,點擊「編輯虛擬機設置」

file

在彈出的「虛擬機設置」窗口中,點擊「添加」

file

在彈出的「添加硬件嚮導」中選擇「硬盤」,而後點擊「下一步」

file

磁盤類型保存默認「SCSI」,點擊「下一步」

file

磁盤類型保持默認的「建立新虛擬機磁盤」,點擊「下一步」

file

根據須要設置磁盤大小,此處設置爲1G,點擊「下一步」

file

選擇磁盤文件存放路徑,點擊「完成」按鈕

file

便可看到剛纔添加的一塊磁盤已經成功。

file

在上邊界面中點擊「添加」按鈕,用相同的方法再添加3塊磁盤,總共新添加4塊磁盤。

file

(2)建立RAID10磁盤陣列

啓動剛纔添加磁盤的虛擬機,並用以前講解的lsblk或fdisk查看磁盤設備

[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0    1G  0 disk 
sdc               8:32   0    1G  0 disk 
sdd               8:48   0    1G  0 disk 
sde               8:64   0    1G  0 disk 
sr0              11:0    1  3.9G  0 rom  /run/media/root/CentOS 7 x86_64
[root@origin ~]# fdisk -l
Disk /dev/sde: 1073 MB, 1073741824 bytes, 2097152 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 /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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 /dev/sdd: 1073 MB, 1073741824 bytes, 2097152 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 /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 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
...省略部份內容
[root@origin ~]# 
複製代碼

能夠看到剛纔添加的磁盤:sdb、sdc、sdd、sde,設備名稱名稱分別爲:/dev/sdb,/dev/sdc,/dev/sdd,/dev/sde

接下來用mdadm命令建立RAID10

[root@origin ~]# 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 1047552K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@origin ~]# 
複製代碼

C參數表明建立一個RAID陣列卡;-v參數顯示建立的過程,同時在後面追加一個設備名稱/dev/md0,這樣/dev/md0就是建立後的RAID 磁盤陣列的名稱;-a yes 參數表明自動建立設備文件;-n 4參數表明使用4塊硬盤來部署這個RAID磁盤陣列;而-l 10參數則表明RAID10方案。

建立磁盤陣列成功以後,下一步就是格式化

1.3.3 格式化RAID

用mkfs命令格式化RAID磁盤陣列

[root@origin ~]# 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
131072 inodes, 523776 blocks
26188 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]# 
複製代碼
1.3.4 掛載磁盤陣列

建立目錄並掛載磁盤陣列

[root@origin ~]# mkdir /raid
[root@origin ~]# mount /dev/md0 /raid
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# 
複製代碼

咦,細心的朋友可能就有疑問了,甚至開始懷疑是否是本身操做錯了,前面明明添加了4塊磁盤,每一個磁盤爲1G,總量應該爲4G,但此處卻看到/dev/md0大小爲2G?

是的,你沒看錯,根據前面講解的RAID10方案,容量會減小。此處能夠看到4塊磁盤的狀況下,可用容量會減小一半。

咱們還須要把掛載信息寫入到配置文件中,使其永久生效

[root@origin ~]# echo "/dev/md0 /raid ext4 defaults 0 0">>/etc/fstab
[root@origin ~]# cat /etc/fstab 
...省略部份內容
/dev/md0 /raid ext4 defaults 0 0
[root@origin ~]# 
複製代碼

這樣就把磁盤陣列掛載到了raid目錄。

1.3.5 查看磁盤陣列信息

查看磁盤陣列信息

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份內容
    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
[root@origin ~]#
複製代碼

能夠看到4塊磁盤陣列中的4塊磁盤均已正常工做。

至此,RAID10方案部署完成。因而可知,整個操做流程給添加硬盤一致,都是須要建立、格式化、掛載等步驟,很是簡單。

1.4 實例2-修復RAID10中壞掉的磁盤

此實驗模擬剛纔的磁盤陣列中某塊硬盤壞掉後的替換操做,所以在前邊的環境中繼續執行如下操做。

1.4.1 模擬設備損壞

使用mdadm命令的-f參數模擬設備損壞

[root@origin ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份內容
    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
[root@origin ~]#
複製代碼

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

在RAID10級別的磁盤陣列中,當RAID1磁盤陣列中存在一個故障盤時並不影響RAID10 磁盤陣列的使用。當購買了新的硬盤設備後再使用 mdadm 命令來予以替換便可,在此期間咱們能夠在/RAID目錄中正常地建立或刪除文件。

因爲咱們是在虛擬機中模擬的,爲了更真實,先重啓系統,以後再繼續後邊的操做。

重啓以後發現損壞的盤已經再也不磁盤陣列中了

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份內容
    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
[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINT
sda               8:0    0   20G  0 disk   
├─sda1            8:1    0  500M  0 part   /boot
└─sda2            8:2    0 19.5G  0 part   
  ├─centos-swap 253:0    0    2G  0 lvm    [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm    /
sdb               8:16   0    1G  0 disk   
sdc               8:32   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sdd               8:48   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sde               8:64   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sr0              11:0    1  3.9G  0 rom  
複製代碼
1.4.2 取消磁盤陣列目錄掛載
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
/dev/sda1                497M  134M  363M  27% /boot
[root@origin ~]# umount /raid/
[root@origin ~]# df -h 
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  134M  363M  27% /boot
[root@origin ~]# 
複製代碼

添加磁盤,須要先取消掛載

1.4.3 添加磁盤並加入磁盤陣列

取消掛載以後,咱們再用mdadm命令的-a參數添加磁盤

[root@origin ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份內容
    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
[root@origin ~]# 
複製代碼

能夠看到/dev/sdb設備加入磁盤陣列成功

1.4.4 從新掛載磁盤陣列
[root@origin ~]# mount -a
[root@origin ~]# df -h 
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
複製代碼

能夠看到磁盤陣列/dev/md0又成功掛載到/raid目錄了。

因爲以前/etc/fstab文件以及添加了記錄,所以此處就無須再添加了。

至此就模擬出設備壞掉以後,從新用新磁盤修復的過程。

1.5 實例3-RAID5+備份盤方案

按上邊的RAID10部署方案,最多容許 50%的硬盤設備發生故障。同一組中的磁盤只要不全壞均可以正常工做,可是在極端狀況下若是同一個RAID1中的磁盤設備所有損壞,也會致使數據丟失。這種狀況咱們採用採用多加一塊備份盤來解決,這塊硬盤平時處於閒置狀態,一旦RAID磁盤陣列中有硬盤出現故障後則會立刻自動頂替上去。

一樣爲了不干擾,從新克隆一個虛擬機,並採用RAID5方案來進行演示。

採用RAID5並無什麼特別之處,目的只是爲了演示下RAID5的用法,由於前面示例1和2都是用的RAID10。

因爲RAID5至少須要3塊磁盤,另外此方案還須要一塊備份盤,所以在虛擬機中克隆新機器後,添加4塊硬盤。

1.5.1 建立RAID5

採用mdadm命令建立RAID5

[root@origin ~]# 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 1047552K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@origin ~]# 
複製代碼

參數-n 3表明建立這個RAID5磁盤陣列所需的硬盤數,參數-l 5表明RAID的級別,而參數-x 1則表明有一塊備份盤。

[root@origin ~]# mdadm -D /dev/md0 
/dev/md0:
...省略部份內容
    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
複製代碼

查看/dev/md0磁盤陣列看到有一塊備份盤在等待中了(spare)。

1.5.2 格式RAID5磁盤陣列

用mkfs命令將磁盤陣列格式化爲ext4文件格式

[root@origin ~]# 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
131072 inodes, 523776 blocks
26188 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]# 

複製代碼
1.5.3 掛載磁盤陣列到目錄
[root@origin ~]# echo "/dev/md0 /raid ext4 defaults 0 0" >> /etc/fstab
[root@origin ~]# mkdir /raid
[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部份內容
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# 
複製代碼
1.5.4 模擬磁盤損壞

咱們再次模擬把硬盤設備/dev/sdb 移出磁盤陣列

[root@origin ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@origin ~]# mdadm -D /dev/md0 
/dev/md0:
...省略部份內容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
       0       8       16        -      faulty   /dev/sdb
[root@origin ~]# 
複製代碼

迅速查看/dev/md0 磁盤陣列的狀態,發現備份盤/dev/sde已經被自動頂替上去並開始了數據同步。

1.5.5 恢復損壞的磁盤

真實場景下,咱們要保證隨時有一塊空閒的備份盤以防不測,所以須要替換或修復剛纔壞掉的盤/dev/sdb,恢復後它又自動變爲空閒的備份盤,一旦有設備壞掉又會自動頂上去,從而保證數據的安全性。

因爲咱們上邊一個步驟是模擬的/dev/sdb設備壞點,雖然壞了可是仍是在佔用中,所以重啓虛擬機(重啓後發現/dev/sdb就沒有了,不重啓會提示/dev/sdd設備繁忙沒法成功執行如下步驟),而後執行如下操做:

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份內容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
[root@origin ~]# umount /raid/
[root@origin ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  134M  363M  27% /boot
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部份內容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       5       8       16        -      spare   /dev/sdb
[root@origin ~]# 
複製代碼

能夠看到,添加後/dev/sdb設備又自動變爲備份盤了。這樣就保證了數據的安全。

2、邏輯卷管理器(LVM)

前面講解的用RAID磁盤陣列技術來管理磁盤設備,雖然能有效提供磁盤設備的讀寫性能以及數據的安全性,可是硬盤設備分區或部署RAID磁盤陣列後,硬盤分區大小就難以調整,而LVM(邏輯卷管理器)技術能夠容許用戶對硬盤資源進行動態調整。

2.1 LVM概述

LVM(Logical Volume Manager)是Linux系統用於對硬盤分區進行管理的一種機制,建立初衷是爲了解決硬盤設備在建立分區後不易修改分區大小的缺陷。

儘管對傳統的硬盤分區進 行強制擴容或縮容從理論上來說是可行的,可是卻可能形成數據的丟失。

LVM架構圖以下:

LVM技術是在硬盤分區和文件系統之間添加了一個邏輯層,它提供了一個抽象的卷組,能夠把多塊硬盤進行卷組合並。這樣一來,用戶沒必要關心物理硬盤設備的底層架構和佈局,就能夠實現對硬盤分區的動態調整。

物理卷處於LVM中的最底層,能夠理解爲物理硬盤、硬盤分區或者RAID磁盤陣列。卷組創建在物理卷之上,一個卷組能夠包含多個物理卷,並且在卷組建立以後也能夠繼續向其中添加新的物理卷。邏輯卷是用卷組中空閒的資源創建的,而且邏輯卷在創建後能夠動態地擴展或縮小空間。

在生產環境中沒法精確地評估每一個硬盤分區在往後的使用狀況,所以會致使 原先分配的硬盤分區不夠用。隨着業務的增長磁盤不夠用了須要擴容,或者業務縮減咱們須要對磁盤分區進行精簡縮容等等,這些均可以經過LVM來解決。

部署LVM時,須要逐個配置物理卷、卷組和邏輯卷。經常使用命令以下:

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

2.2 案例實操

爲了不干擾,從新克隆一個虛擬機,並添加2塊磁盤(添加2塊的目的是爲了演示將磁盤添加到LVM的卷組中,實際狀況可能會有更多的磁盤)。

大概步驟爲:先對這兩塊新硬盤進行建立物理卷的操做,而後對這兩塊硬盤進行卷組合並,接下來根據需求把合併後的卷組切割出一個約爲 150MB 的邏輯卷設備,最後把這個邏輯卷設備格式化成 EXT4 文件系統後掛載使用。

2.2.1 部署LVM

(1)讓磁盤設備支持LVM

[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0    1G  0 disk 
sdc               8:32   0    1G  0 disk 
sr0              11:0    1  3.9G  0 rom  /run/media/root/CentOS 7 x86_64
[root@origin ~]# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created
[root@origin ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [19.51 GiB / 0    free]
  PV /dev/sdc                       lvm2 [1.00 GiB]
  PV /dev/sdb                       lvm2 [1.00 GiB]
  Total: 3 [21.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 2 [2.00 GiB]
[root@origin ~]#
複製代碼

查看剛纔新家的2塊設備爲:sdb、sdc。將其建立物理卷,並經過pvscan命令查看以建立物理卷。

(2)磁盤設備加入卷組

[root@origin ~]# vgcreate storage /dev/sdb /dev/sdc
  Volume group "storage" successfully created
[root@origin ~]# 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               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       0 / 0   
  Free  PE / Size       510 / 1.99 GiB
  VG UUID               EKcctk-C1nM-Y2W8-s7pS-1bq8-W9ie-UTJM8Z
...省略部份內容
[root@origin ~]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "storage" using metadata type lvm2
  Found volume group "centos" using metadata type lvm2
[root@origin ~]# 
複製代碼

用vgcreate建立名稱爲storage的卷組,並經過vgdisplay或vgscan能夠查看。

(3)建立邏輯卷

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

[root@origin ~]# lvcreate -n vo -l 37 storage
  Logical volume "vo" created
[root@origin ~]# lvscan 
  ACTIVE            '/dev/storage/vo' [148.00 MiB] inherit
  ACTIVE            '/dev/centos/root' [17.51 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  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
...省略部份內容
[root@origin ~]# 
複製代碼

經過lvcreate建立名稱爲vo的邏輯卷後,經過lvdisplay能夠查看/dev/storage/vo大小爲剛設置的148M(LV Size 148.00 MiB)。

(4)格式化邏輯卷並掛載

[root@origin ~]# 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 
[root@origin ~]# mkdir /lvm
[root@origin ~]# mount /dev/storage/vo /lvm
[root@origin ~]# echo "/dev/storage/vo /lvm ext4 defaults 0 0" >> /etc/fstab
[root@origin ~]#
複製代碼

格式化邏輯卷後掛載到lvm目錄,並把掛載信息寫入fstab文件使其開機自動生效。

(5)查看掛載狀態

[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo   140M  1.6M  128M   2% /lvm
[root@origin ~]# echo "test">/lvm/test.txt
[root@origin ~]# ls /lvm/
lost+found  test.txt
[root@origin ~]# 
複製代碼

經過df命令就能夠查看掛載成功,並能夠成功寫入文件到lvm目錄下。

2.2.2 LVM擴容

上一步建立的容量爲148M,下面將演示將其擴展到300M

(1)卸載設備與掛載點的關聯

[root@origin ~]# umount /lvm
[root@origin ~]#
複製代碼

(2)擴展邏輯卷

把上一個實驗中的邏輯卷 vo 擴展至 300MB

[root@origin ~]# lvextend -L 300M /dev/storage/vo
  Extending logical volume vo to 300.00 MiB
  Logical volume vo successfully resized
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV Status              available
  '#' open                 0
  LV Size                300.00 MiB
 ...省略部份內容
複製代碼

能夠看到擴展後/dev/storage/vo邏輯卷大小爲300M。

(3)檢查硬盤完整性並重置硬盤容量

[root@origin ~]# 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: 12/38000 files (0.0% non-contiguous), 10455/151552 blocks
[root@origin ~]# resize2fs /dev/storage/vo
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 307200 (1k) blocks.
The filesystem on /dev/storage/vo is now 307200 blocks long.
[root@origin ~]# 
複製代碼

(4)從新掛載設備

[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo   287M  2.1M  266M   1% /lvm
[root@origin ~]# 
複製代碼

能夠看到擴容後,lvm目錄的大小爲300M(上圖實際顯示爲287M)。

這樣就完成了邏輯卷的擴容。

2.2.3 LVM縮小容

相較於擴容邏輯卷,在對邏輯捲進行縮容操做時,其丟失數據的風險更大,因此在生產環境中必定要提早備份數據。

爲了保證數據安全性,Linux系統規定,在對LVM邏輯捲進行縮容操做以前,要先檢查文件系統的完整性。

上一步擴容後lvm容量爲300M,本次演示將其縮容到100M,步驟以下:

(1)卸載文件系統

[root@origin ~]# umount /lvm
[root@origin ~]# 
複製代碼

(2)檢查文件系統完整性

[root@origin ~]# 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: 12/76000 files (0.0% non-contiguous), 15761/307200 blocks
[root@origin ~]# 
複製代碼

(3)縮容邏輯卷

把邏輯卷 vo 的容量減少到 100MB

[root@origin ~]# resize2fs /dev/storage/vo 100M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 102400 (1k) blocks.
The filesystem on /dev/storage/vo is now 102400 blocks long.
[root@origin ~]# lvreduce -L 100M /dev/storage/vo
  WARNING: Reducing active logical volume to 100.00 MiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vo? [y/n]: y  
  Reducing logical volume vo to 100.00 MiB
  Logical volume vo successfully resized
[root@origin ~]# 
複製代碼

(4)從新掛載文件系統

[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo    93M  1.6M   85M   2% /lvm
[root@origin ~]# 
複製代碼

能夠看到lvm目錄已經縮小到93M,這樣就完成了邏輯卷的縮容操做。

2.2.4 LVM快照功能

邏輯卷快照功能就相似於還原操做系統,能夠將邏輯卷狀態還原到指定時間點。

LVM快照功能有2個特色:快照卷只能使用一次,一旦執行還原操做後當即自動刪除;快照卷的容量必須等同於邏輯卷的容量防止數據丟失。

(1)查看當前卷組信息

[root@origin ~]# 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               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       25 / 100.00 MiB
  Free  PE / Size       485 / 1.89 GiB
  ...省略部份內容
複製代碼

能夠看到卷組中已經使用了100M,空閒容量還有1.89G。(Alloc PE / Size 25 / 100.00 MiB, Free PE / Size 485 / 1.89 GiB)

(2)生成快照卷

[root@origin ~]# lvcreate -L 100M -s -n SNAP /dev/storage/vo
  Logical volume "SNAP" created
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV snapshot status     source of
                         SNAP [active]
  LV Status              available
  '#' open                 1
  LV Size                100.00 MiB
  Current LE             25
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
   
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                TVfDRL-LnYd-z76K-fOuS-AD3C-Sw49-7jPgPo
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:40:10 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  '#' open                 0
  LV Size                100.00 MiB
  Current LE             25
  COW-table size         100.00 MiB
  COW-table LE           25
  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
 ...省略部份內容
複製代碼

經過lvcreate命令生成一個名爲SNAP的快照邏輯卷。此時邏輯卷的存儲空間佔用量爲0.01%。(Allocated to snapshot 0.01%)

(3)邏輯卷中添加文件,查看快照卷空間使用量

[root@origin ~]# dd if=/dev/zero of=/lvm/files count=1 bs=50M
1+0 records in
1+0 records out
52428800 bytes (52 MB) copied, 0.289668 s, 181 MB/s
[root@origin ~]# ls /lvm/
files  lost+found  test.txt
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部份內容
/dev/mapper/storage-vo    93M   52M   35M  61% /lvm
[root@origin ~]# lvdisplay 
...省略部份內容
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                TVfDRL-LnYd-z76K-fOuS-AD3C-Sw49-7jPgPo
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:40:10 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  '#' open                 0
  LV Size                100.00 MiB
  Current LE             25
  COW-table size         100.00 MiB
  COW-table LE           25
  Allocated to snapshot  50.29%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
...省略部份內容
複製代碼

在邏輯卷所掛載的目錄中建立一個50MB 的垃圾文件,而後再查看快照卷/dev/storage/SNAP和邏輯卷/dev/storage/vo的狀態。能夠發現存儲空間的佔用量都上升了,快照卷佔用量爲:Allocated to snapshot 50.29%。

(4)經過快照卷還原邏輯卷

經過剛纔建立的/dev/storage/SNAP快照卷,還原邏輯卷/dev/storage/vo的狀態。

還原以前先取消目錄掛載

[root@origin ~]# umount /lvm/
[root@origin ~]# lvconvert --merge /dev/storage/SNAP 
  Merging of volume SNAP started.
  vo: Merged: 72.9%
  vo: Merged: 100.0%
  Merge of snapshot into logical volume vo has finished.
  Logical volume "SNAP" successfully removed
[root@origin ~]# 
複製代碼

能夠看到還原邏輯卷後,快照卷自動刪除了,經過lvdisplay命令查看也不會再有/dev/storage/SNAP 。

(5)從新掛載邏輯卷並查看文件

[root@origin ~]# mount -a
[root@origin ~]# ls /lvm/
lost+found  test.txt
[root@origin ~]# 
複製代碼

能夠看到,還原以後剛纔建立files文件不見了,這樣就把邏輯卷還原到了建立快照時的狀態。

2.2.5 刪除邏輯卷

當生產環境中想要從新部署LVM或者再也不須要使用 LVM 時,能夠刪除LVM。

須要提早備份好重要的數據信息,而後依次刪除邏輯卷、卷組、物理卷設備,順序不可顛倒。

(1)取消掛載

[root@origin ~]# umount /lvm/
複製代碼

取消邏輯卷與目錄的掛載關聯,刪除配置文件中永久生效的設備參數,找到以前添加在/etc/fstab文件中的一行「/dev/storage/vo /lvm ext4 defaults 0 0」並刪除。

(2)刪除邏輯卷

[root@origin ~]# lvremove /dev/storage/vo
Do you really want to remove active logical volume vo? [y/n]: y
  Logical volume "vo" successfully removed
[root@origin ~]#
複製代碼

(3)刪除卷組

[root@origin ~]# vgremove storage
  Volume group "storage" successfully removed
[root@origin ~]# 
複製代碼

只寫卷組名稱便可,不須要設備的絕對路徑。

(4)刪除物理卷

[root@origin ~]# pvremove /dev/sdb /dev/sdc
  Labels on physical volume "/dev/sdb" successfully wiped
  Labels on physical volume "/dev/sdc" successfully wiped
[root@origin ~]# 
複製代碼

在上述操做執行完畢以後,再執行 lvdisplay、vgdisplay、pvdisplay 命令來查看 LVM 的信 息時就不會再看到信息了,說明刪除成功。

經過上文和本文的演示,基本掌握了centos7下磁盤管理相關操做,若是非運維人員不必定要掌握的很是深入,理解便可。

本文講了不少磁盤相關的命令,須要多敲幾篇天然就熟悉了。下一篇文章再補充講解下SSH服務相關的知識,而後就開始講解應用服務的部署和使用了(如apache、郵件系統、mysql、動態網站部署等)。

相關文章
相關標籤/搜索