基本介紹node
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。app
具體操做
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 #分區類型列表ide
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.87Goop
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.87Gthis
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 #格式化spa
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
...................rest
======================================================
如沒有剩餘,須要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命令 針對的是ext二、ext三、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