基本介紹
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 ~]# 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
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
*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************