Centos7 邏輯卷管理(LVM)

Linux LVM

LVM 的全名是 Logical Volume Manager,中文可以翻譯作邏輯卷軸管理員。

LVM基本組成

  • LVM利用Linux內核的device-mapper來實現存儲系統的虛擬化(系統分區獨立於底層硬件)。 通過LVM,你可以實現存儲空間的抽象化並在上面建立虛擬分區(virtual partitions),可以更簡便地擴大和縮小分區,可以增刪分區時無需擔心某個硬盤上沒有足夠的連續空間
  • LVM是用來方便管理的,不會提供額外的安全保證。 However, it sits nicely with the other two technologies we are using.

LVM的基本組成塊(building blocks)如下:

1. 物理卷Physical volume(PV):

我們實際的 partition (或 Disk) 需要調整系統識別碼 (system ID) 成爲 8e (LVM 的識別碼),然後再經過 pvcreate 的指令將他轉成 LVM 最底層的實體卷軸 (PV) ,之後才能夠將這些 PV 加以利用! 調整 system ID 的方是就是通過 gdisk/fdisk !

2. 卷組Volume group (VG):

所謂的 LVM 大磁盤就是將許多 PV 整合成這個 VG 的東西就是啦!所以 VG 就是 LVM 組合起來的大磁盤!這麼想就好了。 那麼這個大磁盤最大可以到多少容量呢?這與下面要說明的 PE 以及 LVM 的格式版本有關喔~在默認的情況下, 使用 32位的 Linux 系統時,基本上 LV 最大僅能支持到 65534 個 PE 而已,若使用默認的 PE 爲 4MB 的情況下, 最大容量則僅能達到約 256GB 而已~不過,這個問題在 64位的 Linux 系統上面已經不存在了!LV 幾乎沒有啥容量限制了!

3. 物理區域Physical extent (PE):

LVM 默認使用 4MB 的 PE 區塊,而 LVM 的 LV 在 32 位系統上最多僅能含有 65534 個 PE (lvm1 的格式),因此默認的 LVM 的 LV 會有 4M*65534/(1024M/G)=256G(限於lvm1版本)。這個 PE 就有點像文件系統裏面的 block 的性質一樣。
在使用 lvm2 的版本中,以及系統轉爲 64 位,因此這個限制已經不存在了。

4. 邏輯卷Logical volume (LV):

虛擬分區,由物理區域(physical extents)組成。
最終的 VG 還會被切成 LV,這個 LV 就是最後可以被格式化使用的類似分區的東西了!那麼 LV 是否可以隨意指定大小呢? 當然不可以!既然 PE 是整個 LVM 的最小儲存單位,那麼 LV 的大小就與在此 LV 內的 PE 總數有關。 爲了方便使用者利用 LVM 來管理其系統,因此 LV 的設備文件名通常指定爲“ /dev/vgname/lvname ”的樣式!


LVM 的優點

比起正常的硬盤分區管理,LVM更富於彈性:

- 使用卷組(VG),使衆多硬盤空間看起來像一個大硬盤。
- 使用邏輯卷(LV),可以創建跨越衆多硬盤空間的分區。
- 可以創建小的邏輯卷(LV),在空間不足時再動態調整它的大小。
- 在調整邏輯卷(LV)大小時可以不用考慮邏輯卷在硬盤上的位置,不用擔心沒有可用的連續空間。
- 可以在線(online)對邏輯卷(LV)和卷組(VG)進行創建、刪除、調整大小等操作。
  LVM上的文件系統也需要重新調整大小,某些文件系統也支持這樣的在線操作。
- 無需重新啓動服務,就可以將服務中用到的邏輯卷(LV)在線(online)/動態(live)遷移至別的硬盤上。
- 允許創建快照,可以保存文件系統的備份,同時使服務的下線時間(downtime)降低到最小。

快速操作指導步驟:

  1. 創建物理卷(PV)所在的分區,設置分區格式爲'Linux LVM',對應的十六進制碼爲8e(MBR)或8e00(GPT)。

  2. 創建物理卷(PV)。如果你只有一個硬盤,那麼你最好只創建一個分區一個物理卷;如果你有多個硬盤,你可以創建多個分區,在每個分區上分別創建一個物理卷。

  3. 創建卷組(VG),並把所有物理卷加進卷組。

  4. 在卷組上創建邏輯卷(LV)。

  5. 格式化邏輯卷(LV)。

  6. 創建掛載點兒,並掛賬格式化後的 LV

具體實施:

磁盤階段(準備 PV)

PV 可以是整塊物理磁盤、物理磁盤的一個分區或者是迴環文件

檢查磁盤設備

可通過以下命令列出可被用作物理卷的設備:

$ sudo  lvmdiskscan

警告: 請確認你對正確的設備進行操作,否則會導致文件丟失!

使用分區工具把分區類型改爲 8e 或者 8e00,假如是整塊硬盤就不用了

PV 階段涉及到的命令

  • pvcreate :將實體 partition 創建成爲 PV ;
  • pvscan : 搜尋目前系統裏面任何具有 PV 的磁盤;
  • pvdisplay :顯示出目前系統上面的 PV 狀態;
  • pvremove :將 PV 屬性移除,讓該 partition 不具有 PV 屬性,變爲普通分區。

開始創建 PV

  $ sudo pvcreate /dev/sdd{1,2}   # 對磁盤的2個分區創建 PV 屬性
  Physical volume "/dev/sdd1" successfully created
  Physical volume "/dev/sdd2" successfully created
  $ sudo pvscan  # 查看信息
  PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
  PV /dev/sdd1                   lvm2 [1.01 GiB]
  PV /dev/sdd2                   lvm2 [1011.91 MiB]
  Total: 3 [21.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 2 [2.00 GiB]
  $ sudo pvcreate /dev/sdc      # 對一整塊磁盤創建 PV 屬性
  Physical volume "/dev/sdc" successfully created
  $ sudo pvscan
  PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
  PV /dev/sdc                    lvm2 [2.00 GiB]
  PV /dev/sdd1                   lvm2 [1.01 GiB]
  PV /dev/sdd2                   lvm2 [1011.91 MiB]
  Total: 4 [23.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 3 [4.00 GiB]
  • 這就分別顯示每個 PV 的信息與系統所有 PV 的信息。尤其最後一行,顯示的是:

    整體 PV 的量 / 已經被使用到 VG 的 PV 量 / 剩餘的 PV 量

顯示每個 PV 更詳細的信息

  # pvdisplay /dev/sdc
  "/dev/sdc" is a new physical volume of "2.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc   == 實際的磁盤設備名或者 分區 設備名
  VG Name                          == 邏輯卷組名 因爲尚未分配出去,所以空白!     
  PV Size               2.00 GiB   == 整個 PV 容量大小
  Allocatable           NO         == 是否已被分配出去(分配給某一個 VG)
  PE Size               0          == 在此 PV 內的 PE 大小
  Total PE              0          == 共分區出幾個 PE
  Free PE               0          == 沒被 LV 用掉的 PE
  Allocated PE          0          == 尚可分配出去的 PE 數量
  PV UUID               gHCfy1-DpBw-89co-Vtja-w3R5-jnt1-gnwsR5
  • 由於 PE 是在創建 VG 時纔給予的參數,因此在這裏看到的 PV 裏頭的 PE 都會是 0
  • 而且也沒有多餘的 PE 可供分配 (allocatable)

VG 階段

涉及到的命令

  • vgcreate :就是主要創建 VG 的指令!他的參數比較多,等一下介紹。
  • vgscan :搜尋系統上面是否有 VG 存在?
  • vgdisplay :顯示目前系統上面的 VG 狀態;
  • vgextend :在 VG 內增加額外的 PV ;
  • vgreduce :在 VG 內移除 PV;
  • vgchange :設置 VG 是否啓動 (active),通常於當多個節點共享一個 VG 時,節點之間切換使用 VG;
  • vgremove :刪除一個 VG !

創建 VG

# vgcreate [-s N[mgt]] VG名稱 PV名稱
選項與參數:
-s :後面接 PE 的大小 (size) ,N 是數字, 單位可以是 m, g, t (大小寫均可)
  • VG 名稱自定義,但不能太隨便

下面是將 PV /dev/sdd1 分配給名稱爲 sharkvg 的VG, 並且指定 PE 大小爲 16 M

 $ sudo vgcreate -s 16M sharkVG /dev/sdd1
   
   Volume group "sharkVG" successfully created

查看 VG

$ sudo vgscan
  
  Reading all physical volumes.  This may take a while...
  Found volume group "sharkVG" using metadata type lvm2    == 我們剛纔創建的
  Found volume group "vg_ansible" using metadata type lvm2 == 系統安裝是創建的
  
$ sudo pvscan
  PV /dev/sdd1   VG sharkVG      lvm2 [1.00 GiB / 1.00 GiB free]
  PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
  PV /dev/sdc                    lvm2 [2.00 GiB]
  PV /dev/sdd2                   lvm2 [1011.91 MiB]
  Total: 4 [23.50 GiB] / in use: 2 [20.51 GiB] / in no VG: 2 [2.99 GiB]
  == 總共 4 個 23.5 G     已用   2個 20.51G      沒有在用的 2 個 2.99 G
  
$ sudo vgdisplay
  
  --- Volume group ---
  VG Name               sharkVG         == VG 名稱 
  System ID
  Format                lvm2            == LVM 版本
  Metadata Areas        1
  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                1
  Act PV                1
  VG Size               1.00 GiB        == VG 總大小
  PE Size               16.00 MiB       == 當前 VG 中的 PE 大小
  Total PE              64              == 當前 VG 中 PE 的總數量
  Alloc PE / Size       0 / 0
  Free  PE / Size       64 / 1.00 GiB   == 可以分配給 LV 的 PE 數量/總容量
  VG UUID               9kqKy6-nA33-yznv-cRV9-2O0q-qZwi-jS2vmT

向 VG 增加 PV

把 PV /dev/sdd2 添加到 VG sharkVG 中

$ sudo vgextend sharkVG /dev/sdd2
  Volume group "sharkVG" successfully extended
$ sudo pvscan
  PV /dev/sdd1   VG sharkVG      lvm2 [1.00 GiB / 1.00 GiB free]
  PV /dev/sdd2   VG sharkVG      lvm2 [1008.00 MiB / 1008.00 MiB free]
  PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
  PV /dev/sdc                    lvm2 [2.00 GiB]
  Total: 4 [23.49 GiB] / in use: 3 [21.49 GiB] / in no VG: 1 [2.00 GiB]

可以再次查看 sharkVG 的詳細信息

$ sudo  vgdisplay sharkVG
--- Volume group ---
VG Name               sharkVG
System ID
Format                lvm2
Metadata Areas        2
Metadata Sequence No  4
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.98 GiB      == 容量有增加
PE Size               16.00 MiB     
Total PE              127           == PE 的數量也有增加
Alloc PE / Size       0 / 0
Free  PE / Size       127 / 1.98 GiB
VG UUID               9kqKy6-nA33-yznv-cRV9-2O0q-qZwi-jS2vmT

縮減 VG

也就是從 VG 內移除某PV一個或多個 PV

==要首先保證被移出的 PV 中沒有數據在使用,可以通過 pvs 查看 PV 的容量使用情況來判斷是否有數據使用==

==假如有需要使用 pvmove 命令把數據移動到其他的 PV中==

$ sudo vgreduce sharkVG /dev/sdd2
  Removed "/dev/sdd2" from volume group "sharkVG"
$ sudo pvscan
  PV /dev/sdd1   VG sharkVG      lvm2 [1.00 GiB / 1.00 GiB free]
  PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
  PV /dev/sdc                    lvm2 [2.00 GiB]
  PV /dev/sdd2                   lvm2 [1011.91 MiB]
  Total: 4 [23.50 GiB] / in use: 2 [20.51 GiB] / in no VG: 2 [2.99 GiB]

刪除 VG

$ sudo vgremove sharkVG
  Volume group "sharkVG" successfully removed
$ sudo vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vg_ansible" using metadata type lvm2 # 只剩餘系統安裝時創建的

$ sudo pvscan
  PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
  PV /dev/sdc                    lvm2 [2.00 GiB]
  PV /dev/sdd1                   lvm2 [1.01 GiB]
  PV /dev/sdd2                   lvm2 [1011.91 MiB]
  Total: 4 [23.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 3 [4.00 GiB]
  • 刪除 VG 時,即使 VG 有 PV 存在,只要此 VG 沒有在使用,就可以刪除,在此 VG 中的 PV 會自動恢復到沒有被分配的狀態。

LV 階段

就是從 VG 這個大的虛擬磁盤中劃邏輯卷軸 LV(也就是虛擬分區),對劃分出來的 LV 進行格式化後再掛載,就可以想使用普通分區一樣在上面存儲數據了

涉及到的命令:

  • lvcreate :創建 LV 啦!
  • lvscan :查詢系統上面的 LV ;
  • lvdisplay :顯示系統上面的 LV 狀態啊!
  • lvextend :在 LV 裏面增加容量!
  • lvreduce :在 LV 裏面減少容量;
  • lvremove :刪除一個 LV,就像刪除一個分區!
  • lvresize :對 LV 進行容量大小的調整!
  • lvchange : 改變某一個 LV 的狀態 (available/NOT available),通常用於多節點共享一個 LV 時,對 LV 的切換!
$ sudo lvcreate [-L N[mgt]] [-n LV名稱] VG名稱
$ sudo lvcreate [-l N] [-n LV名稱] VG名稱
選項與參數:
-L  :後面接容量,容量的單位可以是 M,G,T 等,要注意的是,最小單位爲一個 PE 的大小,
      因此這個數量必須要是一個 PE 大小 的倍數,若不相符,系統會自行計算最相近的容量。
-l  :後面可以接 PE 的“個數”,而不是容量。若要這麼做,得要自行計算 PE 數。
-n  :後面接的就是 LV 的名稱!
  • 由於我們剛從刪除了 VG,所以在創建 LV 之前,我們重新創建 VG, 並把 /dev/sdd1 和 /dev/sdd2 添加到 新創建的 VG 中
$ sudo vgcreate sharkVG /dev/sdd{1,2}
  Volume group "sharkVG" successfully created

創建 LV

  1. 以 LV 的容量來創建一個大小爲 500M 的 LV
$ sudo lvscan
  ACTIVE            '/dev/sharkVG/sharkLV1' [500.00 MiB] inherit
  1. 再以 LV 中 PE 的總個數來創建一個大小爲 300M 的 LV
    由於這次重新創建 VG 時,並沒有指定 PE 的大小,所以 PE 的大小是默認的 4M。 創建 300M 的 LV,需要利用 PE 的大小計算一下: 300 M / 4M = 75 個 PE
$ sudo lvcreate -l 75  -n sharkLV2 sharkVG
  Logical volume "sharkLV2" created
$ sudo lvscan
  ACTIVE            '/dev/sharkVG/sharkLV1' [500.00 MiB] inherit
  ACTIVE            '/dev/sharkVG/sharkLV2' [300.00 MiB] inherit  # 新增加的 300M 的 LV

查看其中一個 LV 的詳細信息


$ sudo lvscan
  ACTIVE            '/dev/sharkVG/sharkLV1' [500.00 MiB] inherit
  ACTIVE            '/dev/sharkVG/sharkLV2' [300.00 MiB] inherit
  ACTIVE            '/dev/vg_ansible/lv_root' [17.57 GiB] inherit
  ACTIVE            '/dev/vg_ansible/lv_swap' [1.94 GiB] inherit
$ sudo lvdisplay /dev/sharkVG/sharkLV1
  --- Logical volume ---
  LV Path                /dev/sharkVG/sharkLV1     == LV 的完整設備名
  LV Name                sharkLV1
  VG Name                sharkVG
  LV UUID                p1ViVB-EZ2w-7ELA-diU2-5RjP-xQjV-THAHQE
  LV Write Access        read/write
  LV Creation host, time ansible, 2017-09-23 23:34:02 +0800
  LV Status              available
  # open                 0
  LV Size                500.00 MiB                == 總容量
  Current LE             125
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2
  • 接下來就可以對 LV 進行進一步的操作了, 指定注意的是,以後對 LV 的任何操作,使用都是它的設備名

文件系統階段

  1. 先檢查 VG 的容量
$ sudo  vgdisplay sharkVG
  --- Volume group ---
  VG Name               sharkVG
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  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       200 / 800.00 MiB
  Free  PE / Size       310 / 1.21 GiB      == 剩餘 310 個 PE, 容量剩餘 1.21 G
  VG UUID               ohgPcA-lBiK-JPXK-HLwg-CKRE-7ZnF-lugxkw
  • 從上面信息看到 VG 中的容量已經本佔用了一部分了,可我們並沒有去使用。原因是,當在 VG 中劃分 LV 時,LVM 自身會使用一些空間來保存一下信息,用於記錄和管理這個 VG 和 它下面的 LV。
  1. 格式化、掛載、測試 LV
$ sudo mkfs.ext4 /dev/sharkVG/sharkLV1         == 注意是 LV 的設備名
$ sudo mkdir -p /src/lvm
$ sudo mount /dev/sharkVG/sharkLV1 /src/lvm    == 注意是 LV 的設備名
$ sudo df -Th /src/lvm
Filesystem           Type  Size  Used Avail Use% Mounted on
/dev/mapper/sharkVG-sharkLV1
                     ext4  477M  2.3M  449M   1% /src/lvm
$ sudo cp -a /etc  /src/lvm
$ sudo df -Th /src/lvm
Filesystem           Type  Size  Used Avail Use% Mounted on
/dev/mapper/sharkVG-sharkLV1
                     ext4  477M   31M  421M   7% /src/lvm
  1. 查看設備的文件類型
$ sudo blkid /dev/sharkVG/sharkLV1
/dev/sharkVG/sharkLV1: UUID="94f5b2a2-eb69-470e-9a1a-2a46fade8c71" TYPE="ext4"

blkid 命令可以查看一個設備的文件系統類型,不論是否掛載均可


LVM 的擴容

當需要更多的 LV,或是在一個 LV 中需要更多的容量時,就需要對 VG 或 LV 進行擴容

由於 LV 的容量是從 VG 中劃分出來的,所以不論是需要一個新的 LV, 還是需要對現有的 LV 進行擴容,都需要保證 VG 有總夠多的容量。

基本流程是:

  1. VG 階段:

    • VG 需要有剩餘的容量,
    • 如果 VG 容量不足, 最簡單的方法就是再加硬盤!然後將該硬盤使用上面講過的 pvcreate 及 vgextend 增加到該 VG 內即可!
  2. LV 階段

    • 向一個現有的 LV 中增加更多的可用容量:如果 VG 的剩餘容量足夠了, 此時就可以利用 lvresize 這個指令來將剩餘容量加入到所需要增加的 LV 設備內!
    • 新創建一個 LV:保證 VG 容量足夠,直接用 lvcreate 命令創建即可。
  3. 文件系統階段的放大:

    我們的 Linux 實際使用的其實不是 LV !而是 LV 這個設備內的文件系統!
    目前在 Linux 環境下,可以放大的文件系統有 XFS 以及 EXT 家族!
    至於縮小僅有 EXT 家族,目前 XFS 文件系統並不支持文件系統的容量縮小喔!要注意!要注意!XFS 放大文件系統通過簡單的 xfs_growfs 指令即可!

    • ==其中最後一個步驟最重要! 整個文件系統在最初格式化的時候就創建了 inode/block/superblock 等信息,要改變這些信息是很難的! 不過因爲文件系統格式化的時候創建的是多個 block group ,因此我們可以通過在文件系統當中增加 block group 的方式來增減文件系統的量!而增減 block group 就是利用 xfs_growfs 囉!所以最後一步是針對文件系統來處理的, 前面幾步則是針對 LVM 的實際容量大小!==
    • ==因此,嚴格說起來,放大文件系統並不是沒有進行“格式化”喔!放大文件系統時,格式化的位置在於該設備後來新增的部份,設備的前面已經存在的文件系統則沒有變化。 而新增的格式化過的數據,再反饋回原本的 supberblock 這樣而已!==

實操

現在目標是對現有的 LV /dev/sarkVG/sharkLV1 的容量增加 500M,使其總容量爲 1000M

  1. 檢查 LV,VG
$ sudo lvscan
  ACTIVE            '/dev/sharkVG/sharkLV1' [500.00 MiB] inherit  == 增加前共 500M
  ACTIVE            '/dev/sharkVG/sharkLV2' [300.00 MiB] inherit
  ACTIVE            '/dev/vg_ansible/lv_root' [17.57 GiB] inherit
  ACTIVE            '/dev/vg_ansible/lv_swap' [1.94 GiB] inherit
$ sudo vgdisplay sharkVG
  --- Volume group ---
  VG Name               sharkVG
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  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       200 / 800.00 MiB
  Free  PE / Size       310 / 1.21 GiB      == 目前 VG 的確還有可用的空間 1.21 G
  VG UUID               ohgPcA-lBiK-JPXK-HLwg-CKRE-7ZnF-lugxkw
  1. 增加現有 LV 的容量
$ sudo lvresize -L +-N[mgt] LV的設備名
$ sudo  lvresize -l   +-PE個數     LV的設備名
選項和參數:
lvresize 的語法很簡單,基本上 -l 或 -L 來增加,其他參數和 lvcreate 基本一樣!
若要增加則使用 + ,若要減少則使用 - !( + 是增加多少,不加 +/- 是結果爲多少)
詳細的選項請參考 man lvresize

開始擴容 LV

$ sudo lvresize -L +500m /dev/sharkVG/sharkLV1
  Size of logical volume sharkVG/sharkLV1 changed from 500.00 MiB (125 extents) to 1000.00 MiB (250 extents).
  Logical volume sharkLV1 successfully resized

$ sudo lvscan
  ACTIVE            '/dev/sharkVG/sharkLV1' [1000.00 MiB] inherit  == 總容量已增加
  ACTIVE            '/dev/sharkVG/sharkLV2' [300.00 MiB] inherit
  ACTIVE            '/dev/vg_ansible/lv_root' [17.57 GiB] inherit
  ACTIVE            '/dev/vg_ansible/lv_swap' [1.94 GiB] inherit
$ sudo lvs
  LV       VG         Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  sharkLV1 sharkVG    -wi-ao---- 1000.00m   # 已增加到 1000M
  sharkLV2 sharkVG    -wi-a-----  300.00m
  lv_root  vg_ansible -wi-ao----   17.57g
  lv_swap  vg_ansible -wi-ao----    1.94g

查看文件系統

$ sudo df -lhT /src/lvm
Filesystem           Type  Size  Used Avail Use% Mounted on
/dev/mapper/sharkVG-sharkLV1
                     ext4  477M   30M  423M   7% /src/lvm  # 注意這裏文件系統的容量並沒有增加
  1. 把擴容的 LV 容量增加到實際的文件系統中

EXT2,3,4

$ sudo blkid /dev/sharkVG/sharkLV1
/dev/sharkVG/sharkLV1: UUID="94f5b2a2-eb69-470e-9a1a-2a46fade8c71" TYPE="ext4"
$ sudo resize2fs   /dev/sharkVG/sharkLV1                      == 擴展文件系統 
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/sharkVG/sharkLV1 is mounted on /src/lvm; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 4
Performing an on-line resize of /dev/sharkVG/sharkLV1 to 1024000 (1k) blocks.
The filesystem on /dev/sharkVG/sharkLV1 is now 1024000 blocks long.

$ sudo df -lh /src/lvm
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/sharkVG-sharkLV1
                      961M   30M  882M   4% /src/lvm        == 擴展成功
$ sudo tail -5 /src/lvm/etc/inittab                           == 文件系統正常
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

XFS

# 之前已經創建好 LV
$ sudo mkfs.xfs /dev/sharkVG/sharkLV2                      == 格式化爲 xfs 文件系統
$ sudo blkid /dev/sharkVG/sharkLV2
/dev/sharkVG/sharkLV2: UUID="8210f6ae-9af6-4576-8a3b-e08f2fdf0f24" TYPE="xfs"
$ sudo mkdir /src/lvm/xfs
$ sudo mount /dev/mapper/sharkVG-sharkLV2 /src/lvm/xfs
$ sudo cp /etc/inittab /src/lvm/xfs
$ sudo tail -3 /src/lvm/xfs/inittab
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
$ sudo vgs
  VG         #PV #LV #SN Attr   VSize  VFree
  sharkVG      2   2   0 wz--n-  1.99g 740.00m
  vg_ansible   1   2   0 wz--n- 19.51g      0
$ sudo lvs
  LV       VG         Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  sharkLV1 sharkVG    -wi-ao---- 1000.00m
  sharkLV2 sharkVG    -wi-ao----  300.00m
  lv_root  vg_ansible -wi-ao----   17.57g
  lv_swap  vg_ansible -wi-ao----    1.94g
$ sudo lvextend -L 500M /dev/sharkVG/sharkLV2                    == 擴展 LV
  Size of logical volume sharkVG/sharkLV2 changed from 300.00 MiB (75 extents) to 500.00 MiB (125 extents).
  Logical volume sharkLV2 successfully resized
$ sudo lvs
  LV       VG         Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  sharkLV1 sharkVG    -wi-ao---- 1000.00m
  sharkLV2 sharkVG    -wi-ao----  500.00m                     == 擴展 LV 成功
  lv_root  vg_ansible -wi-ao----   17.57g
  lv_swap  vg_ansible -wi-ao----    1.94g
$ sudo df -lh /src/lvm/xfs
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/sharkVG-sharkLV2
                      296M   16M  281M   6% /src/lvm/xfs
$ sudo xfs_growfs /src/lvm/xfs                                    == 在線擴展文件系統
meta-data=/dev/mapper/sharkVG-sharkLV2 isize=256    agcount=4, agsize=19200 blks
         =                       sectsz=512   attr=2, projid32bit=0
data     =                       bsize=4096   blocks=76800, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal               bsize=4096   blocks=1200, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 76800 to 128000
$ sudo df -lh /src/lvm/xfs
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/sharkVG-sharkLV2
                      496M   16M  481M   4% /src/lvm/xfs        == 擴展成功
$ sudo tail -3 /src/lvm/xfs/inittab                               == 檢查文件正常
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:   

LVM 的縮減

  • 注意:

    對邏輯捲縮減,是有分險的,必須做的話,應遵循以下原則

    ==1. 不能在線縮減,先卸載文件系統==

    ==2. 確保縮減後的容量,仍能存儲下原有的所有數據==

    ==3. 在縮減之前需要先進行強制性文件系統檢查,以保證文件系統處於一致性狀態==

基本流程和擴展相反

1. 卸載文件系統
2. 強制性檢查文件系統
3. 縮減文件系統
4. 縮減 LV
5. 縮減 VG

實操

  • 把 /src/lvm 縮減到 200M
```sh

sudo df -lh Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_ansible-lv_root 18G 3.5G 13G 22% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 477M 29M 424M 7% /boot /dev/mapper/sharkVG-sharkLV1 961M 30M 882M 4% /src/lvm sudo umount /src/lvm
sudo e2fsck -f /dev/sharkVG/sharkLV1 e2fsck 1.41.12 (17-May-2010) 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/sharkVG/sharkLV1: 1895/254000 files (0.2% non-contiguous), 70365/1024000 blocks sudo lvreduce -L 200M /dev/sharkVG/sharkLV1
WARNING: Reducing active logical volume to 200.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce sharkLV1? [y/n]: y
Size of logical volume sharkVG/sharkLV1 changed from 252.00 MiB (63 extents) to 200.00 MiB (50 extents).
Logical volume sharkLV1 successfully resized
sudo lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert sharkLV1 sharkVG -wi-a----- 200.00m == 縮減容量爲 200M sharkLV2 sharkVG -wi-a----- 400.00m lv_root vg_ansible -wi-ao---- 17.57g lv_swap vg_ansible -wi-ao---- 1.94g sudo mount /dev/sharkVG/sharkLV1 /src/lvm
$ sudo tail -3 /src/lvm/etc/inittab == 檢查文件正常
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

```

LVM 構建自動擴展的文件系統 (thin pool)

最新的 LVM 版本支持寫時複製技術,就是可以建一個 LV, 可以隨意指定其容量的大小,但是並會不佔用實際的存儲空間,當程序向這個 LV 中寫數據時,纔會使用實際的存儲空間,寫入多少容量的數據,就佔用多少實際的存儲空間。也就是說可以創建一個比真實的磁盤空間要大的多的邏輯卷,就像網盤一樣,說是給你了 2T 空間,而實際一定不會一次性,就給你實際的 2T 空間。
這個 LV 被稱爲精簡卷,精簡卷是需要建立在一個存儲池中的,也稱爲精簡池。

精簡池在需要的時候可以動態的擴展其容量,在配置文件中定義相應的參數,可以實現相對應的閾值;比如可以定義精簡池的容量使用達到 75% 時,就自動增加目前精簡池容量的 20%。

集羣中的節點間不支持精簡卷。該精簡池及其所有精簡卷只能以獨佔方式在一個集羣節點中激活。

創建精簡池/精簡卷

現在從 VG 中創建一個精簡池

➜  ~ vgs sharkVG
  VG      #PV #LV #SN Attr   VSize VFree
  sharkVG   2   3   0 wz--n- 1.99g 1.11g
➜  ~ lvcreate -L 500M -T sharkVG/sharkpool
  Logical volume "lvol0" created
  Logical volume "sharkpool" created
➜  ~

==創建 thin pool 時,用 -T 選項,此選項後面不用跟任何參數,他會自動判斷你是要創建精簡池,還是要從精簡池中創建精簡卷==

觀察精簡池

➜  ~ lvdisplay   /dev/sharkVG/sharkpool
  --- Logical volume ---
  LV Name                sharkpool
  VG Name                sharkVG
  LV UUID                0T8vKJ-Ex3h-Rydx-Yd1W-VVYI-wMfQ-MHPhSa
  LV Write Access        read/write
  LV Creation host, time ansible, 2017-09-30 18:19:16 +0800
  LV Pool metadata       sharkpool_tmeta
  LV Pool data           sharkpool_tdata
  LV Status              available
  # open                 1
  LV Size                500.00 MiB                == 此 thin pool 總共可以分配的容量
  Allocated pool data    0.00%                     == 已經分配給精簡卷的百分比
  Allocated metadata     0.88%                     == 已經分配出去的元數據的百分比
  Current LE             125
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:10
➜  ~ lvs /dev/sharkVG/sharkpool
  LV        VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  sharkpool sharkVG twi-a-tz-- 500.00m             0.00   0.88  

在 精簡池中創建一個精簡卷,虛擬大小爲 10G

➜  ~ lvcreate -V 10G -T sharkVG/sharkpool  -n sharkthin1
  Logical volume "sharkthin1" created
➜  ~ lvs /dev/sharkVG/sharkpool   /dev/sharkVG/sharkthin1
  LV         VG      Attr       LSize   Pool      Origin Data%  Meta%  Move Log Cpy%Sync Convert
  sharkpool  sharkVG twi-a-tz-- 500.00m                  0.00   0.98
  sharkthin1 sharkVG Vwi-a-tz--  10.00g sharkpool        0.00
  

創建文件系統

➜  ~ mkfs.xfs /dev/sharkVG/sharkthin1
meta-data=/dev/sharkVG/sharkthin1 isize=256    agcount=16, agsize=163824 blks
         =                       sectsz=512   attr=2, projid32bit=0
data     =                       bsize=4096   blocks=2621184, imaxpct=25
         =                       sunit=16     swidth=16 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=16 blks, lazy-count=1
realtime =none
➜  ~ lvs /dev/sharkVG/sharkpool   /dev/sharkVG/sharkthin1
  LV         VG      Attr       LSize   Pool      Origin Data%  Meta%  Move Log Cpy%Sync Convert
  sharkpool  sharkVG twi-a-tz-- 500.00m                  2.25   0.98
  sharkthin1 sharkVG Vwi-a-tz--  10.00g sharkpool        0.11
➜  ~ df -ThP /src/lvm/thin
Filesystem                     Type  Size  Used Avail Use% Mounted on
/dev/mapper/sharkVG-sharkthin1 xfs    10G   33M   10G   1% /src/lvm/thin  

測試容量

創建一個 200MB 的文件,來測試觀察一下精簡池和精簡卷的容量使用變化。

➜  ~ df -ThP /src/lvm/thin
Filesystem                     Type  Size  Used Avail Use% Mounted on
/dev/mapper/sharkVG-sharkthin1 xfs    10G  233M  9.8G   3% /src/lvm/thin
➜  ~ lvs /dev/sharkVG/sharkpool   /dev/sharkVG/sharkthin1
  LV         VG      Attr       LSize   Pool      Origin Data%  Meta%  Move Log Cpy%Sync Convert
  sharkpool  sharkVG twi-a-tz-- 500.00m                  42.25  3.52
  sharkthin1 sharkVG Vwi-aotz--  10.00g sharkpool        2.06
  • 從上面的信息可以看出, 200M 是精簡卷 10G 容量的 2% 左右, 但卻是精簡池實際容量 500M 的 40% 左右。
  • 這就是實際用多少,就分配實際的容量多少。

當精簡池的實際容量被使用到一定程度時,我們可以設置讓其自動擴容,這樣自然就會把精簡卷的空間擴大。

設置自動擴展精簡池

==如何把有數據的一塊物理硬盤從 lv 中移除,並把它還原爲最初的狀態?==

[圖片上傳失敗...(image-4900e6-1564804080066)]

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