在我們的實際生產使用中,我們是無法准確的估計磁盤大小情況的。有可能我們現在規划了500G磁盤,但是兩三年之后發現不夠用了。那我們怎么辦呢?不管是換更大的盤還是換別的,都會影響我們的生產環境。那么有沒有別的更好的辦法呢?
LVM可以很好的解決這一個問題。LVM可以在線動態擴展磁盤。
LVM:Logical Volume Manager(邏輯卷管理)。Linux用戶安裝Linux操作系統時遇到的一個常見的難以決定的問題就是如何正確地評估各分區大小,以分配合適的硬盤空間。普通的磁盤分區管理方式在邏輯分區划分好之后就無法改變其大小,當一個邏輯分區存放不下某個文件時,這個文件因為受上層文件系統的限制,也不能跨越多個分區來存放,所以也不能同時放到別的磁盤上。而遇到出現某個分區空間耗盡時,解決的方法通常是使用符號鏈接,或者使用調整分區大小的工具,但這只是暫時解決辦法,沒有從根本上解決問題。隨着Linux的邏輯卷管理功能的出現,這些問題都迎刃而解,用戶在無需停機的情況下可以方便地調整各個分區大小。
總之一句話,LVM就是為了解決磁盤分區動態調整。
LVM一共分為四層,如下圖所示。
最底層是pp層,pp: physical partition。物理分區。這一層是我們的物理磁盤設備,它可以是裸設備(未格式化的磁盤)、也可以是分區(sdb2,sda1等)、也可以是LUN。這里我們假設有3個500G的裸設備。
往上一層是pv層,pv: physical volume。物理卷。這一層我們把pp中的每一個物理設備都做成一個物理卷。pv的最小單元是pe,pe默認大小是4M,相當於把500G的磁盤空間分成一個一個4M的空間作為存儲單元。
在往上一層是VG層,vg: volume grou。卷組。卷組的作用相當於是池化資源,即把底層的所有物理資源集合在一起,形成一個大池子。這個池子中包含所有PV中的PE。這里我們的卷組有1500G資源。
最上邊一層是LV層,LV:logic volume。 邏輯卷。邏輯卷就相當於我們的邏輯分區,是給到人具體使用的。比如我們有一個業務需要200G的空間,那么我們就從VG中划分出來一個200G 的邏輯卷(lv)給它使用。
如果有一天在划分lv時發現vg中的資源不夠用了,那么很簡單,我們只需要在pp層添加物理設備,在映射成pv,在加入到VG中,那么VG就又有資源了。
那么我們在創建LVM的時候具體怎么操作呢?
首先我們給虛擬機加一個新的20G的磁盤,fdisk -l 查看磁盤情況,我們可以看到20G的磁盤sdb已經有了,如下圖所示:
然后我們需要對sdb進行分區。執行 fdisk /dev/sdb命令,創建1個5G的分區,可以看到如下圖示所示:
然后我們在按p,看當前的分區列表,發現sdb1分區已經存在了,如下圖所示
但是如果我們想要使用LVM,那么我們必須使用LVM分區,但是我們在上圖看到,sdb1這個分區的id是83,它是一個默認的標准分區。所以我們需要先把這個分區改成lvm分區。所以我們需要輸入 t ,能更改分區ID。LVM對應的ID號是8e,所以這個時候我們要輸入8e,這個分區就改成了lvm分區,如下圖所示:
以此方法我們創建出連個lvm分區,分別是sdb1和sdb2,保存並退出。如下圖所示:
到這一步我們就把PP准備好了,我們准備了兩個分區。
下一步我們就要創建PV。執行命令:pvcreate 分區。這里我們執行命令:pvcreate /dev/sdb1 /dev/sdb2 。把這兩個分區同時創建成pv,如下圖所示:
我們可以使用 pvs 命令或者 pvdisplay命令來查看當前PV,如下圖所示:
下一步我們就要創建VG了。
我們執行命令: vgcreate 卷組名 pv設備。卷組名是我們要給這個卷組起的名字,pv設備是我們要將哪些PV添加到這個VG中。這里我們輸入命令: vgcreate vg0 /dev/sdb1 /dev/sdb2 。將sdb1和sdb2這兩個pv加入到卷組vg0中。 然后我們可以執行 vgdisplay 命令或者 vgs 查看當前都有哪些vg。 如下圖所示:
最后我們就要創建LV了。
執行命令: lvcreate -L +大小 -n 名字 vg名。這里L指我們划分的LV的大小,如果我們要划分100M的LV,那么這里就是 -L +100M; -n 指lv的名字,比如 -n lv3指這個lv的名字是lv3。最后的VG名是指我們從哪個VG中划分LV。這里我們執行命令: lvcreate -L +500M -n lv1 vg0 。它是指從卷組vg0中創建一個名字為lv1的500M的lv。然后這個邏輯卷就創建好了。我們也可以通過命令lvs 或者 命令 lvdisplay來查看當前的lv 。
LV創建好之后,還不能直接使用。它現在只是一個邏輯分區,也是一個分區。所以我么要先將他格式化創建文件系統。執行命令:mkfs.xfs /dev/vg0/lv1 。如下圖所示:
最后一步我們需要將lv掛載到對應的目錄下邊。這里執行命令: mount /dev/vg0/lv1/ /lvdir/。 將他掛載到lvdir這個文件夾下。如下圖所示:
當然,和物理分區一樣,這里的掛載也分為一次性掛載和永久性掛載。
我們可以再把這個寫入到 /etc/fstab文件中,進行永久性掛載。
我們使用LV的最主要目的是為了之后擴容方便,如果lv沒空間了可以在線擴展。如下圖所示。那么怎么擴展LV呢?
我們需要執行命令: lvextend -L +500M /dev/vg0/lv1 。這個命令中+500M是我們要給這個LV增加的大小,后邊是對應的lv。執行后,這個lv從500M變成了1000M,如下圖所示:
這個時候我們執行 df -Th命令,發現它竟然還是500M,竟然沒有刷新,如下圖所示,這是為什么呢?
因為我們需要刷新一下。執行命令:xfs_growfs 掛載目錄 這里我們執行:xfs_growfs /lvgir/ ,可以看到如下所示:
相當於通過這個命令,把這個文件系統刷新了一次,我么在執行df -Th,可以看到它已經變成了1000M了。
那么如果我們的VG里邊資源不夠了怎么辦呢?怎么擴充我們的VG呢。我們需要將新的PV加到VG中去。執行命令:vgextend 卷組 新PV。意思是把新的PV加入到卷組中去,以此來擴容VG。這里我們創建一個新的分區,然后做成PV,在執行命令:vgextend vg0 /dev/sdb3。