1. 程式人生 > 其它 >Linux 邏輯卷管理

Linux 邏輯卷管理

如果用標準分割槽在硬碟上建立了檔案系統,為已有的檔案系統新增額外的空間是一件十分痛苦的事情。只能在已有的硬碟上的可用空間範圍內調整分割槽大小,如果硬碟空間不夠的話,就只能換一個大容量的硬碟,然後手動將已有的檔案系統移動到新的硬碟上。

這個時候可以通過將另外一個硬碟上的分割槽加入已有的檔案系統,動態地新增儲存空間。Linux 可以通過 LVM(邏輯卷管理)來完成這項工作

邏輯卷管理佈局

邏輯卷管理的核心在於如何處理安裝在系統上的硬碟分割槽。在邏輯卷管理的世界中,硬碟分割槽被稱為 “物理卷”(physical volume PV),每個物理卷都會對映到硬碟上特定的物理分割槽

多個物理卷集中在一起可以形成一個卷組(volume group VG)。邏輯卷管理系統將卷組視為一個物理硬碟,但事實上卷組可能是由分佈在多個物理硬碟上的不同分割槽組成的。卷組提供了一個建立邏輯分割槽的平臺,而這些邏輯分割槽則包含了檔案系統

整個結構中的最後一層是邏輯卷(logical volume LV)。邏輯卷為 Linux 提供了建立檔案系統的分割槽環境,作用類似於 Linux 中的物理硬碟分割槽。Linux 系統將邏輯卷視為物理分割槽

可以使用任意一種標準的 Linux 檔案系統來格式化邏輯卷,然後再將他們加入 Linux 虛擬目錄中的某個掛載點

邏輯卷和物理分割槽之間的關係如下圖所示:

圖中一共包含了三個不同的物理硬碟,根據這三個硬碟的情況,得到了每個硬碟的分割槽,對應到不同的物理卷。這些物理卷共同組成了一個卷組,此時 Linux 的 LVM 將整個卷組看作是一個硬碟,然後在這個硬碟上建立邏輯卷。現在,Linux 就可以單獨對每個邏輯卷使用不同的檔案系統進行格式化(Unix 程式設計哲學之“加一層”)

可以注意到硬碟 \(3\) 有一部分的空間是沒有被使用的,通過邏輯卷可以輕鬆地管理這部分未使用的空間:將這部分空間加入到已有的卷組中,或者為它單獨建立一個邏輯卷

Linux 的 LVM

Linux 的 LVM 有兩個可用的版本:

  • LVM 1:最初 LVM 於 1998 年釋出,只能用於 Linux 2.4 版本,該 LVM 僅僅提供了基本的邏輯卷管理功能
  • LVM 2:LVM 的更新版本,它在標準的 LVM 功能外提供了一些額外的功能

一般情況下建議使用 LVM 2,LVM 2 提供了以下的一些新功能:

  • 快照

    Linux LVM允許你在邏輯卷線上的狀態下將其複製到另一個裝置,這個功能被稱為 “快照”。這個功能在備份資料時特別有用,比如:MySQL 的資料備份可以通過快照進行備份,而不需要顯式地加鎖。

    LVM 1 建立的快照在建立完成之後就不能再寫入資料,而 LVM 2 則允許建立可讀寫的快照,在這種情況下,如果某一個邏輯卷出現了問題,就可以直接將快照替換掉原來的邏輯卷,這個特性對於故障轉移來講特別有用

  • 條帶化

    當 Linux LVM 檔案寫入邏輯卷時,檔案中的資料塊會被分散到多個物理硬碟上

    條帶化這一特性可以提高 IO 的訪問速度,因為此時將資料的讀寫分散到了多個硬碟中。LVM 條帶化和 RAID 條帶化不同,LVM 條帶化不提供用來建立容錯環境的校驗資訊,這會增加檔案由於磁碟故障而丟失的概率,並且單個磁碟的故障將會導致整個邏輯卷都無法使用

  • 映象

    通過 LVM 安裝檔案系統不能確保檔案系統不再出現問題,一旦出現問題,就有可能再也無法恢復

    儘管 LVM 提供的快照功能提供了一些可能的幫助,但是對於某些情況快照功能並不能完全避免問題(比如涉及到大量資料的系統,自上次快照之後可能要儲存上千條記錄)。

    解決這種問題的一個方案就是使用 LVM 映象,映象是一個實時更新的邏輯卷的完整副本,當建立映象邏輯卷時,LVM 會將原始邏輯卷同步到映象副本中。一旦同步完成,LVM 會為檔案系統的每次寫入都執行兩次(一次寫入住主邏輯卷,一次寫入映象邏輯卷),儘管降低了寫入效能,但是提高了系統的可靠性

使用 Linux LVM

這裡使用 LVM 2,如果沒有安裝,可以使用相關的軟體安裝工具安裝 lvm2,對於 Ubuntu 來講,可以執行如下的安裝命令:

sudo apt install lvm2

定義物理卷

建立邏輯卷的第一步是定義物理卷,將硬碟上的物理分割槽轉換為 Linux LVM 使用的物理卷。在這個過程中,可以使用 fdisk 來管理安裝在系統上的任何儲存裝置上的分割槽。

首先,使用 fdisk 來檢視磁碟的分割槽情況:

fdisk -l

可能會看到類似下面的輸出:

…………………………

Disk /dev/sdc:8 GiB,8589934592 位元組,16777216 個扇區
單元:扇區 / 1 * 512 = 512 位元組
扇區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組

Disk /dev/mapper/cs-root:12.5 GiB,13417578496 位元組,26206208 個扇區
單元:扇區 / 1 * 512 = 512 位元組
扇區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組

Disk /dev/mapper/cs-swap:1.5 GiB,1610612736 位元組,3145728 個扇區
單元:扇區 / 1 * 512 = 512 位元組
扇區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組

…………………………

可以看到,當前系統中存在一個名為 ‘/dev/sdc’ 的分割槽,並且這個分割槽目前還沒有被格式化,現在,讓我們把這個分割槽建立為基本的 Linux 的分割槽,可以使用 fdisk 的互動式 n 命令來新增該分割槽:

至此將 ‘/dev/sdc’ 轉換為了基本的 Linux 分割槽,接下來將通過這個分割槽建立對應的物理卷,這個過程可以通過 pvcreate 命令來完成:

sudo pvcreate /dev/sdc

如果看到類似下面的輸出資訊,則說明已經建立了該分割槽對應的物理卷:

Physical volume "/dev/sdc" successfully created.

建立完成之後可以通過 pvdisplay 來檢視當前的建立情況,對於當前的分割槽,可以執行如下的命令檢視建立進度:

sudo pvdisplay /dev/sdc

建立卷組

建立物理卷之後,就需要將這些物理卷組合到一個卷組中,形成一個新的 “磁碟”。建立卷組可以使用 vgcreate 命令,如果希望建立一個名為 Vo11 的卷組,並將 /dev/sdc 新增到卷組中,可以執行如下的命令:

sudo vgcreate Vo11 /dev/sdc

在這個過程中會自動建立 Vo11 卷組,如果希望物理卷新增到已有的卷組中,可以使用 vgextend 命令,如下所示:

# 將 /dev/sdc 新增到 Vo10 卷組中
sudo vgextend Vo10 /dev/sdc

建立邏輯卷

Linux 使用邏輯捲來模擬物理分割槽,並在其中儲存檔案系統。Linux 會像處理物理分割槽一樣處理邏輯卷,允許自定義邏輯卷中的檔案系統,然後將檔案系統掛載到虛擬目錄上

要建立邏輯卷,可以使用 lvcreate 命令來完成,例如上文中已經建立的卷組,可以執行如下的命令建立一個邏輯卷:

# -l 指定邏輯卷佔用卷組的空間大小,-n 指定建立的邏輯卷的名稱
sudo lvcreate -l 100%FREE -n lvtest Vo11

建立完成之後,可以使用 lvdisplay 來檢視建立的邏輯卷的詳細情況:

sudo lvdisplay Vo11

建立檔案系統

執行完 lvcreate 命令之後,邏輯卷就已經建立完成了,但是此時的邏輯卷還沒有對應的檔案系統。在一般物理分割槽上建立檔案系統的命令在邏輯捲上同樣有效。例如,如果希望給建立的邏輯卷設定為 ext4 檔案系統,可以執行如下的命令:

sudo mkfs.ext4 /dev/Vo11/lvtest

建立了檔案系統之後,就可以將這個邏輯卷掛載到虛擬目錄中,和物理分割槽的使用一樣,唯一需要注意的是需要使用特殊的路徑來引用這個邏輯卷。如下所示:

# 將建立好的邏輯卷掛在到 /mnt/lxh_part,注意在掛載之前確保掛載點存在
# 即 /mnt/lxh_part 目錄必須存在
sudo mount /dev/Vo11/lvtest /mnt/lxh_part

掛載之後,就可以像使用物理分割槽一樣使用邏輯捲了

修改 fstab

為了避免每次啟動系統都要手動掛載,可以在 fstab 中進行配置,使得系統在啟動時自動掛載。如下所示:

#
# /etc/fstab
# Created by anaconda on Sun Jan 16 13:14:50 2022
#
# 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.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cs-root     /                       xfs     defaults        0 0
UUID=e36a4b91-186c-48f0-850d-e3c90ebfeb20 /boot                   xfs     defaults        0 0
/dev/mapper/cs-swap     none                    swap    defaults        0 0
# 邏輯卷的掛載配置
/dev/Vo11/lvtest	/mnt/lxh_part		ext4	defaults	0	0

有關 fstab 的配置可以參考:https://www.cnblogs.com/FatalFlower/p/15419794.html

修改 LVM

具體可以參考以下的相關命令:vgchangevgremovevgreducelvextendlvreduce

如果可以的話,使用 LVM 的 GUI 工具是一個有用的手段


參考:

[1]https://www.cnblogs.com/gaojun/archive/2012/08/22/2650229.html

[2] 《Linux 命令列和 Shell 指令碼程式設計大全》