基本介紹
Linux用戶安裝Linux 操作系統時遇到的一個最常見的難以決定的問題就是如何正確地給評估各分區大小,以分配合適的硬盤空間。隨着 Linux的邏輯盤卷管理功能的出現,這些問題都迎刃而解,
lvm是邏輯盤卷管理(Logical Volume Manager)的簡稱,它是 Linux環境下對磁盤分區進行管理的一種機制, LVM是建立在硬盤和分區之上的一個邏輯層,來提高磁盤分區管理的靈活性。
LVM基本術語
1)物理存儲介質:這里指系統的存儲設備:硬盤,如: /dev/hda、/dev/sda等等,是存儲系統最低層的存儲單元。
2)物理卷physical volume (PV )
物理卷就是指硬盤分區或從邏輯上與磁盤分區具有同樣功能的設備(如 RAID),是 LVM的基本存儲邏輯塊
3)卷組Volume Group (VG )
LVM卷組由一個或多個物理卷組成,但是更確切的說,它包含由這些物理卷提供的許多PE。
4)邏輯卷logical volume (LV )
這里是我們存儲信息的地方,在邏輯卷之上可以建立文件系統 (比如/home或者 /usr等)。
5)PE(physical extent )
每一個物理卷被划分為稱為 PE的基本單元,具有唯一編號的 PE是可以被 LVM尋址的最小單元。 PE的大小是可配置的,默認為 4MB。
具體操作
1)創建分區
[root@test-server ~]# fdisk -l #查看磁盤情況
[root@test-server ~]# fdisk /dev/sda #進入磁盤(可以依次按鍵p->n->e->回車->回車->w,即用此磁盤所有空閑空間創建分區)
Command (m for help): n #n 為添加一個分區, p查看分區
First cylinder (2898-10443, default 2898): #按Enter 鍵決定
Using default value 2898 #起始柱面選擇默認值
Last cylinder or +size or +sizeM or +sizeK (289810443, default 10443): +2G # 給2G的大小
Command (m for help): t #更改分區類型
Partition number (1-5): 5 # 選着分區
Hex code (type L to list codes): l #分區類型列表
Hex code (type L to list codes):8e #將新添加的分區標注成 lvm
Command (m for help): p #查看分區表
/dev/sda5 2756 2999 1959898+ 8e Linux LVM
Command (m for help): w #保存
[root@test-server ~]# partprobe /dev/sda #系統識別分區(代替重啟)
[root@test-server ~]# mkfs.ext4 /dev/sda5 #格式化新添加的分區
2)PV創建 ("yum install lvm2" 安裝lvm的操作命令,如pvcreate)
[root@test-server ~]# pvcreate /dev/sda5 #創建pv
Writing physical volume data to disk "/dev/sda5"
Physical volume "/dev/sda5" successfully created
[root@test-server ~]# pvs #或pvdisplay,查看當前pv的信息
PV VG Fmt Attr PSize PFree
/dev/sda5 lvm2 a-- 1.87G 1.87G
3)VG創建
[root@test-server ~]# vgcreate vg0 /dev/sda5 #vg0 為當前vg的名
Volume group "vg0" successfully created
[root@test-server ~]# vgs #或vgdispaly,查看vg詳細信息,會顯示PE數
VG #PV #LV #SN Attr VSize VFree
vg0 1 0 0 wz--n- 1.87G 1.87G
4)LV創建(使用vgdisplay查看"Free PE"中可用的空間來制作LVM。比如這里查看到Free PE空間為500M,則最大只能使用500M來制作lvm)
# lvcreate -L +大小 -n lv_name vg_name (指定邏輯卷的大小,單位為"kKmMgGtT"字節)
# lvcreate -l +PE數 -n lv_name vg_name (或"lvcreate -l +百分比FREE -n lv_name vg_name"命令,即使用卷組剩余所有空間的百分比)
[root@test-server ~]# lvcreate -L +500M -n lv01 vg0
Logical volume "lv01" created
[root@test-server ~]# lvs #或lvdispaly,查看lv 的信息
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv01 vg0 -wi-a- 500.00M
You have mail in /var/spool/mail/root
[root@test-server ~]# mkfs.ext4 /dev/vg0/lv01 #格式化
5)掛載使用LVM
[root@test-server ~]# mkdir /mnt/lv01 #建立掛載目錄
[root@test-server ~]# mount /dev/vg0/lv01 /mnt/lv01 #將制作的lvm掛載起來
[root@test-server ~]# df -h
[root@test-server ~]# touch /mnt/lv01/lv.file
[root@test-server ~]#ls /mnt/lv01
LVM的增大
比如原來lv大小500M ,現在要拉伸分區到 800M。
前提是vg0里面還有剩余空間(vgdispaly查看Free PE)。
先使用vgdisplay查看vg0組是否還有多余的空間.
[root@test-server ~]# vgdisplay
.......
Alloc PE / Size 1277 / 500M
Free PE / Size 490 / 300M
VG UUID hYScku-I097-bxMg-iUKq-WKnd-gEfQ-1wn5nU
...................
======================================================
如沒有剩余,需要vgextend擴建。比如創建一個分區/dev/sdb1
# pvcreate /dev/sdb1
# vgextend vg0 /dev/sdb1 擴容到vg0組里
# vgdisplay 查看vg0多余的空間
======================================================
[root@test-server ~]# lvextend -L +300M /dev/vg0/lv01 #使用 "-L +300M" 或是 "-l +490" 都可以
Logical volume lv01 successfully resized # 或者直接使用" lvextend -l +100%FREE /dev/vg0/lv0 "命令,即使用卷組剩余所有空間。
[root@test-server ~]# resize2fs /dev/vg0/lv01 #拉伸文件系統
[root@test-server ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv01 vg0 -wi-ao 800.00M #大小變成了 800M
LVM的減小
[root@test-server ~]# umount /dev/vg0/lv01 #卸載邏輯卷 /dev/vg0/lv01,或者卸載/mnt/lv01目錄也可以
[root@test-server ~]# df -h #查看
[root@test-server ~]# e2fsck -f /dev/vg0/lv01 #磁盤校驗
[root@test-server ~]# resize2fs /dev/vg0/lv01 500M #回縮文件系統到 500M
[root@test-server ~]# lvreduce -L 500M /dev/vg0/lv01 #回縮分區到 500M
WARNING: Reducing active logical volume to 500.00 MB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv01? [y/n]: y
[root@test-server ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv01 vg0 -wi-a- 500.00M #此時已變成500M大小
[root@test-server ~]# mount /dev/vg0/lv01 /mnt/lv01 #重新掛載分區
[root@test-server ~]# df -h #查看
[root@test-server ~]# ls /mnt/lv01 #查看文件
===========================================================
特別注意的是:
resize2fs命令 針對的是ext2、ext3、ext4文件系統。
xfs_growfs命令 針對的是xfs文件系統
===========================================================
LVM的系統快照
原理:系統快照(snapshot)是 lvm的另外一種重要的功能,快照就是將當時的數據記錄下來,就好像照相記錄一樣,以后數據有任何改動,原數據會被移動到快照區,沒有被改變的區域則由快照區與文件系統共享。
由於快照區和原本的 LV共享很多 PE,所以快照區與被快照的區域必須在同一個 VG上
操作:
以上面創建的 lv01為例
1)掛載lvm
[root@test-server ~]# mount /dev/vg0/lv01 /mnt/lv01
[root@test-server ~]# cd /mnt/lv01
[root@test-server lv01]# touch {a,b,c}{a,b,c}
[root@test-server lv01]# ls
aa ab ac ba bb bc ca cb cc lost+found lv.file restoresymtable
2)為lvm創建快照
[root@test-server lv01]# lvcreate -L 64M -s -n lv-backup /dev/vg0/lv01
Logical volume "lv-backup" created
3)掛載快照
[root@test-server lv01]# mkdir /mnt/lv-backup
[root@test-server mnt]# mount -o ro /dev/vg0/lv-backup /mnt/lv-backup/
4)備份快照
[root@test-server tmp]# dump -0u -f /tmp/lv-backup.dump /mnt/lv-backup/ #備份
DUMP: Date of this level 0 dump: Sun Nov 11 14:53:31 2012
DUMP: Dumping /dev/mapper/vg0-lv--backup (/mnt/lv-backup) to /tmp/lv-backup.dump
5)刪除快照
[root@test-server tmp]# umount /mnt/lv-backup/
[root@test-server tmp]# lvremove /dev/vg0/lv-backup
Do you really want to remove active logical volume lv-backup? [y/n]: y
Logical volume "lv-backup" successfully removed
6)清空/dev/vg0/lv01下內容
[root@test-server tmp]# umount /mnt/lv01
[root@test-server tmp]# mkfs.ext3 /dev/vg0/lv01
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
7)恢復數據
[root@test-server tmp]# mount /dev/vg0/lv01 /mnt/lv01
[root@test-server tmp]# cd /mnt/lv01
[root@test-server lv01]# ls
lost+found
[root@test-server lv01]# restore -rf /tmp/lv-backup.dump #恢復
restore: ./lost+found: File exists
[root@test-server lv01]# ls #由於之前都刪除了,所以這些都是改變的部分
aa ab ac ba bb bc ca cb cc lost+found lv.file restoresymtable
LVM的關閉 (刪除)
[root@test-server ~]# umount /mnt/lv01
[root@test-server ~]# lvremove /dev/vg0/lv01 #刪除lv
Do you really want to remove active logical volume lv01? [y/n]: y
Logical volume "lv01" successfully removed
[root@test-server ~]# vgchange -a n vg0 #使vg0不具有 active標志
0 logical volume(s) in volume group "vg0" now active
[root@test-server ~]# vgremove vg0 #刪除vg
Volume group "vg0" successfully removed
[root@test-server ~]# pvremove /dev/sda5 #刪除pv
Labels on physical volume "/dev/sda5" successfully wiped
#################### 貼一個虛擬機磁盤擴容實施記錄 #######################
Linux服務器硬盤在線熱擴容基本都是通過LVM方式實現的,所以服務器系統安裝時,磁盤掛載最好選擇LVM方式。我們目前采用的是XenServer虛擬化,隨着業務數據的不斷增加,發現部分虛擬機的/data分區空間不夠用了,更鬧心的是/data分區是獨立分區,並不是LVM分區(這是由於XenServer虛擬化系統安裝時沒有選擇LVM那一項,故虛機創建中選擇磁盤屬性時LVM選項無效)。
[root@uatdata-node01 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda2 99G 6.9G 87G 8% / tmpfs 7.8G 12K 7.8G 1% /dev/shm /dev/xvda1 380M 66M 294M 19% /boot /dev/xvda5 298G 258G 40G 88% /data 由上面可知,數據分區/data空間已經不多了,該服務器是hadoop數據節點,每天會產生大量的數據文件到/data下,故需要緊急擴容/data分區。 操作思路: 1)為這台虛擬機新添加一個磁盤,做成LVM邏輯卷/dev/vg0/lv0,掛載到/data_new 目錄下。 2)將/data目錄下的數據全部拷貝到/data_new目錄下,通過rsync拷貝(-avpgolr保持文件屬性不變) 3)umount卸載/data和/data_new。 4)重新掛載/dev/vg0/lv0到/data下(這樣做是為了保證磁盤擴容后,原來的業務程序的數據目錄結構不變),並刪除/data_new目錄。 5)將掛載到之前/data目錄下的/dev/xvda5格式化,並在線熱擴容到新的/dev/vg0/lv0邏輯卷內。 操作記錄: 為虛擬機添加一塊新的500G的磁盤 [root@uatdata-node01 ~]# fdisk -l ........ Disk /dev/xvdb: 536.9 GB, 536870912000 bytes 255 heads, 63 sectors/track, 65270 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x54c845dd 做成lvm邏輯卷 [root@uatdata-node01 ~]# fdisk /dev/xvdb ........ 分別輸入: p #查看分區情況 n #創建分區 p #創建邏輯分區 1 #選擇分區序列號,即盤符為/dev/xvdb1 回車 #默認從扇區起點開始 回車 #默認磁盤所有空間 w #保存 [root@uatdata-node01 ~]# partprobe /dev/xvdb1 #或直接執行"partprobe",這一步為更新分區表,也可以不執行,或執行有報錯可以忽略 [root@uatdata-node01 ~]# yum install -y lvm2 #安裝lvm的工具 安裝pv [root@uatdata-node01 ~]# pvcreate /dev/xvdb1 [root@uatdata-node01 ~]# pvs 安裝vg [root@uatdata-node01 ~]# vgcreate vg0 /dev/xvdb1 [root@uatdata-node01 ~]# vgs 安裝lv [root@uatdata-node01 ~]# vgdisplay ............. Free PE / Size 499876 / 499.99 GiB #先使用vgdisplay查看可以用以創建lvm的空間有多少,這里表示剩余空間為499.99G可用 [root@uatdata-node01 ~]# lvcreate -L +499.99G -n lv0 vg0 [root@uatdata-node01 ~]# lvs 格式化並掛載 [root@uatdata-node01 ~]# mkfs.ext4 /dev/vg0/lv0 [root@uatdata-node01 ~]# mkdir /data_new [root@uatdata-node01 ~]# mount /dev/vg0/lv0 /data_new 拷貝數據 [root@uatdata-node01 ~]# rsync -avpgolr /data/ /data_new 卸載並重新掛載新增磁盤到/data目錄下 [root@uatdata-node01 ~]# umount /data [root@uatdata-node01 ~]# umount /data_new [root@uatdata-node01 ~]# mount /dev/vg0/lv0 /data [root@uatdata-node01 ~]# rm -rf /data_new 把之前掛載到/data目錄下的/dev/xvda5分區格式化,並熱擴容到新的/dev/vg0/lv0分區 [root@uatdata-node01 ~]# mkfs.ext4 /dev/xvda5 [root@uatdata-node01 ~]# pvcreate /dev/xvda5 [root@uatdata-node01 ~]# vgextent vg0 /dev/xvda5 [root@uatdata-node01 ~]# vgdisplay .......... Free PE / Size 197898 / 198.5 GiB [root@uatdata-node01 ~]# lvextend -L +198.5G /dev/vg0/lv0 [root@uatdata-node01 ~]# resize2fs /dev/vg0/lv0 #拉伸文件系統 [root@uatdata-node01 ~]# lvs 最后查看下擴容后的/data盤的大小 [root@uatdata-node01 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda2 99G 6.9G 87G 8% / tmpfs 7.8G 12K 7.8G 1% /dev/shm /dev/xvda1 380M 66M 294M 19% /boot /dev/mapper/vg0-lv0 681G 138G 509G 22% /data