基本介紹
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 的資訊
VG #PV #LV #SN Attr VSize VFree
vg0 1 0 0 wz--n- 1.87G 1.87G
4)lvm的建立(使用vgdisplay檢視"Free PE"中可用的空間來製作lvm。比如這裡檢視到Free PE空間為500M,則最大隻能使用500M來製作lvm)
#lvcreate -L 大小 -n 名字 隸屬哪一個巻組
#lvcreate -l PE個數 -n 名字 隸屬哪一個巻組
[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 //使用"+300M" 或是 "+490"都可以
Logical volume lv01 successfully resized
[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