首頁 > 軟體

Linux下從零開始建立LVM虛擬磁碟陣列+指令碼化解決方案

2020-06-16 16:32:52

前言

邏輯卷管理器(英語:Logical Volume Manager,縮寫為LVM),又譯為邏輯卷宗管理器、邏輯磁區管理器、邏輯磁碟管理器,是Linux核心所提供的邏輯卷管理(Logical volume management)功能。它在硬碟的硬碟分割區之上,又建立一個邏輯層,以方便系統管理硬碟分割系統。

最先由IBM開發,在AIX系統上實現,OS/2 作業系統與 HP-UX也支援這個功能。在1998年,Heinz Mauelshagen 根據在 HP-UX 上的邏輯卷管理器,寫作出第一個 Linux 版本的邏輯卷管理器。

LVM基本術語:

  • PV:物理卷,PV處於LVM系統最低層,它可以是整個硬碟,或者與磁碟分割區具有相同功能的裝置(如RAID),但和基本的物理儲存媒介相比較,多了與LVM相關管理引數
  • VG:捲組,建立在PV之上,由一個或多個PV組成,可以在VG上建立一個或多個“LVM分割區”(邏輯卷),功能類似非LVM系統的物理硬碟
  • LV:邏輯卷,從VG中分割出的一塊空間,建立之後其大小可以伸縮,在LV上可以建立檔案系統(如/var,/home)
  • PE:物理區域,每一個PV被劃分為基本單元(也被稱為PE),具有唯一編號的PE是可以被LVM定址的最小儲存單元,預設為4MB

我們可以通過LVM靈活便捷的管理系統中的磁碟,並且根據需求快速、無感得擴容目標磁碟,並且幾乎不會影響效能。

過程

建立lvm分割區的方法其實非常的簡單,主要分為以下幾個步驟:

1、建立磁碟分割區part

目前做LVM分割區比較推薦的工具還是fdisk,不是說parted不能做,而是fdisk可能更加方便一點。流程如下:

# fdisk /dev/nvme0n1
Command (m for help): n ## 新建
Command action
   e   extended
   p   primary partition (1-4)
p ## 主分割區

Partition number (1-4): 1 ## 分割區號
First cylinder (2048-543352123, default 2048):  ## 回車用預設的1
Last cylinder, +cylinders or +size{K,M,G} (2048-543352123, default 543352123): ## 迴車預設大小大小

Command (m for help): t ## 改變toggle型別
Selected partition 1
Hex code (type L to list codes): 8e ## LVM 的分割區程式碼8e
Changed system type of partition 1 to 8e (Linux LVM)

2、建立物理卷PV

在分割區完成之後需要做的就是建立物理卷,直接將剛才建立的分割區進行
pvcreate:

# pvcreate /dev/nvme0n1p1

3、建立虛擬捲VG

在建立玩物理卷之後,需要對該磁碟進行虛擬捲的建立。需要注意的是一個虛擬卷可以由多個物理卷構成。例如:

# vgcreate nvme /dev/nvme0n1p1 /dev/nvme1n1p1 /dev/nvme2n1p1

該命令的意義就在於建立一個叫做nvme的虛擬卷,由/dev/nvme0n1p1、 /dev/nvme1n1p1、 /dev/nvme2n1p1三個做了pv的分割區構成

4、建立邏輯卷LG

到了這一步,基本上LVM的建立已經到了尾聲了,最後一步就是從虛擬卷中建立一個邏輯卷。如下:

# lvcreate -L 2.91T -n data nvme

這條命令的意思為從虛擬捲nvme中建立一個2.91T的邏輯卷作為lvm分割區並命名為data,如果想一次性全部用完所有的容量,也可以這樣:

# lvcreate -l -n data nvme

此時在linux的/dev/資料夾下面我們可以看到有/nvme/data的檔案結構。

5、掛載並更新檔案

在建立完lvm分割區後,我們需要將分割區掛在到系統中的路徑中。假設需要掛載的路徑是/data。

# mkdir /data ##建立該路徑
# mount /dev/mapper/nvme-data /data ##需要注意的時候這裡推薦使用/dev/mapper/nvme-data作為掛載的裝置路徑,而不是/dev/nvme/data

之後通過blkid命令獲取這個新的lvm分割區的UUID,然後更新到/etc/fstab中就可以了

指令碼化

上述的LVM實現過程可以直接通過shell指令碼進行實現:

#!/bin/bash

##本案例中以伺服器的/dev/nvme0n1這塊nvme磁碟為例進行操作
OPTS="noatime,nobarrier,errors=remount-ro,nofail"   ##部分寫入/etc/fstab的固定變數
umount /data/ && parted /dev/nvme0n1 rm 1   ## 首先確保目標磁碟沒有殘留的分割區資訊。
echo "n
p
1


t
8e
w
" | fdisk /dev/nvme0n1  ##通過fdisk工具建立一個分割區
echo "y
" | pvcreate /dev/nvme0n1p1     ##建立一個物理卷
echo "y
y
y
" | vgcreate nvme /dev/nvme0n1      ##建立一個虛擬卷
echo "y
" | lvcreate -L 2.91T -n data nvme && mkfs.ext4 /dev/nvme/data && mount /dev/mapper/nvme-data /data/
##建立一個邏輯卷並進行格式化,然後掛載到目標路徑
sed -i '$d' /etc/fstab      ##將UUID等相關資訊更新到/etc/fstab中
#do
    if [ $? -eq 0 ]; then
        UUID=$(blkid /dev/mapper/nvme-data | sed -e 's/.*(UUID=.*) TYPE.*/1/')
        echo -e "${UUID}tt/datattext4tt${OPTS}tt0 0" >> /etc/fstab
    fi
    seq=$(($seq+1))
#done

IT145.com E-mail:sddin#qq.com