天天看點

LVM常用操作

一、LVM是什麼

LVM是 Logical Volume Manager(邏輯卷管理)的簡寫,簡單的說LVM可以跨分區存儲資料,并且LVM可以在無需停機的狀态下動态調整分區的大小。

二、基本術語

*實體存儲媒體(PhysicalStorageMedia)

指系統的實體儲存設備:磁盤,如:/dev/hda、/dev/sda等,是存儲系統最底層的存儲單元。

*實體卷(Physical Volume,PV)

指磁盤分區或從邏輯上與磁盤分區具有同樣功能的裝置(如RAID),是LVM的基本存儲邏輯塊,但和基本的實體存儲媒體(如分區、磁盤等)比較,卻包含有與LVM相關的管理參數。

*卷組(Volume Group,VG)

類似于非LVM系統中的實體磁盤,其由一個或多個實體卷PV組成。可以在卷組上建立一個或多個LV(邏輯卷)。

*邏輯卷(Logical Volume,LV)

類似于非LVM系統中的磁盤分區,邏輯卷建立在卷組VG之上。在邏輯卷LV之上可以建立檔案系統(比如/home或者/usr等)。

*實體塊(Physical Extent,PE)

每一個實體卷PV被劃分為稱為PE(Physical Extents)的基本單元,具有唯一編号的PE是可以被LVM尋址的最小單元。PE的大小是可配置的,預設為4MB。是以實體卷(PV)由大小等同的基本單元PE組成。

*邏輯塊(Logical Extent,LE)

邏輯卷LV也被劃分為可被尋址的基本機關,稱為LE。在同一個卷組中,LE的大小和PE是相同的,并且一一對應。如圖(1)

<a href="http://s3.51cto.com/wyfs02/M01/74/DB/wKioL1YszQ-waZYfAADJu_DtOl0189.jpg" target="_blank"></a>

三、建立管理

常用管理指令如下:

管理lv:

pv: pvcreate, pvdisplay, pvs, pvscan, pvremove, pvmove

vg: vgcreate, vgdisplay, vgs, vgscan, vgremove, vgextend, vgreduce

lv: lvcreate, lvdisplay, lvs, lvresize, lvextend, lvreduce, lvremove

1、PV相關操作

建立pv

1.1、如圖(2) 使用fdisk建立實體磁盤分區

<a href="http://s3.51cto.com/wyfs02/M00/74/DF/wKiom1YszO-iQAipAAO3w90tMvQ216.jpg" target="_blank"></a>

<code>[root@www ~]# fdisk -l /dev/sdb</code>

<code>Disk /dev/sdb: 21.5 GB, 21474836480 bytes</code>

<code>255 heads, 63 sectors/track, 2610 cylinders</code>

<code>Units = cylinders of 16065 * 512 = 8225280 bytes</code>

<code>Sector size (logical/physical): 512 bytes / 512 bytes</code>

<code>I/O size (minimum/optimal): 512 bytes / 512 bytes</code>

<code>Disk identifier: 0xd9180e6e</code>

<code>   </code><code>Device Boot      Start         </code><code>End</code>      <code>Blocks   Id  System</code>

<code>/dev/sdb1               1         262     2104483+  8e  Linux LVM</code>

<code>/dev/sdb2             263         655     3156772+  8e  Linux LVM</code>

<code>[root@www ~]#</code>

建立實體卷

pvcreate

<code>[root@www ~]# pvcreate /dev/sdb1 /dev/sdb2</code><code>//建立PV </code>

<code>  </code><code>Physical volume </code><code>"/dev/sdb1"</code> <code>successfully created</code>

<code>  </code><code>Physical volume </code><code>"/dev/sdb2"</code> <code>successfully created</code>

檢視PV

<code>[root@www ~]# pvs</code><code>//檢視PV</code>

<code>  </code><code>PV         VG   Fmt  Attr PSize  PFree</code>

<code>  </code><code>/dev/sda2  vg0  lvm2 a--  59.99g 7.99g</code>

<code>  </code><code>/dev/sdb1       lvm2 ---   2.01g 2.01g</code>

<code>  </code><code>/dev/sdb2       lvm2 ---   3.01g 3.01g</code>

<code>[root@www ~]# pvdisplay /dev/sdb[0-9]</code><code>//可以看到詳細資訊</code>

<code>  </code><code>--- Physical volume ---</code>

<code>  </code><code>PV Name               /dev/sdb1</code>

<code>  </code><code>VG Name               myvg</code>

<code>  </code><code>PV Size               2.01 GiB / not usable 3.16 MiB</code>

<code>  </code><code>Allocatable           yes </code>

<code>  </code><code>PE Size               4.00 MiB</code>

<code>  </code><code>Total PE              513</code>

<code>  </code><code>Free PE               513</code>

<code>  </code><code>Allocated PE          0</code>

<code>  </code><code>PV UUID               rA5Vdy-j2rr-b9Vf-zo8I-sjFD-1z23-VhHAgI</code>

<code>   </code> 

<code>  </code><code>PV Name               /dev/sdb2</code>

<code>  </code><code>PV Size               3.01 GiB / not usable 2.79 MiB</code>

<code>  </code><code>Total PE              770</code>

<code>  </code><code>Free PE               770</code>

<code>  </code><code>PV UUID               GVtLyK-Ugd1-DKHo-3wHS-oia1-lbpz-PA4oma</code>

删除pv

<code>[root@www ~]# pvcreate /dev/sdb3   </code><code>//建立pv</code>

<code>  </code><code>Physical volume </code><code>"/dev/sdb3"</code> <code>successfully created</code>

<code>[root@www ~]# pvs   </code><code>//檢視pv</code>

<code>  </code><code>/dev/sdb1  myvg lvm2 a--   2.00g    0 </code>

<code>  </code><code>/dev/sdb2  myvg lvm2 a--   3.01g 2.01g</code>

<code>  </code><code>/dev/sdb3       lvm2 ---   3.01g 3.01g</code>

<code>[root@www ~]# pvremove /dev/sdb3   </code><code>//删除pv /dev/sdb3</code>

<code>  </code><code>Labels on physical volume </code><code>"/dev/sdb3"</code> <code>successfully wiped</code>

<code>[root@www ~]# pvs</code>

2、VG相關操作

建立VG

vgcreate

# vgcreate VGNAME /dev/PV1...

[-s|--physicalextentsize PhysicalExtentSize[bBsSkKmMgGtTpPeE]]   //指定PE大小

      [-t|--test] //測試,不真正建立

       [-v|--verbose]//顯示建立過程

<code>[root@www ~]# vgcreate myvg /dev/sdb{1,2}</code>

<code>  </code><code>Volume group </code><code>"myvg"</code> <code>successfully created</code>

檢視VG 

<code>[root@www ~]# vgs</code>

<code>  </code><code>VG   #PV #LV #SN Attr   VSize  VFree</code>

<code>  </code><code>myvg   2   0   0 wz--n-  5.01g 5.01g</code>

<code>  </code><code>vg0    1   4   0 wz--n- 59.99g 7.99g</code>

<code>[root@www ~]# vgdisplay </code>

<code>  </code><code>--- Volume group ---</code>

<code>  </code><code>System ID             </code>

<code>  </code><code>Format                lvm2</code>

<code>  </code><code>Metadata Areas        2</code>

<code>  </code><code>Metadata Sequence No  1</code>

<code>  </code><code>VG Access             read/write</code>

<code>  </code><code>VG Status             resizable</code>

<code>  </code><code>MAX LV                0</code>

<code>  </code><code>Cur LV                0</code>

<code>  </code><code>Open LV               0</code>

<code>  </code><code>Max PV                0</code>

<code>  </code><code>Cur PV                2</code>

<code>  </code><code>Act PV                2</code>

<code>  </code><code>VG Size               5.01 GiB</code>

<code>  </code><code>PE Size               4.00 MiB  </code><code>//PE 塊大小</code>

<code>  </code><code>Total PE              1283</code>

<code>  </code><code>Alloc PE / Size       0 / 0   </code>

<code>  </code><code>Free  PE / Size       1283 / 5.01 GiB</code>

<code>  </code><code>VG UUID               llSGpO-Bk51-KVBB-llAZ-AA9E-aBYq-sUrnPL</code>

删除vg

# vgremove VGNAME...

<code>[root@www ~]# vgremove myvg</code><code>//删除vg</code>

<code>  </code><code>Volume group </code><code>"myvg"</code> <code>successfully removed</code>

縮減VG:通過從vg中移除pv實作

     注意:計劃移除的pv不能包含已經存儲資料的pe;如果有需要先使用pvmove移動到同vg内其它pv上;

<code>  </code><code>VG Size               5.01 GiB</code><code>//大小為5G</code>

<code>  </code><code>VG UUID               Iz9bc0-Sw38-H916-TAg3-abNh-iUJW-hjuRoB</code>

------------------------------------------------------------------------------

我們要在myvg中移除/dev/sdb2   【縮減vg要保證縮減後的vg大小能夠存儲原來的資料】

<code>[root@www ~]# pvmove /dev/sdb2  </code><code>// 将/sdb2中的資料移動到其他pv上</code>

<code>  </code><code>No data to move </code><code>for</code> <code>myvg</code>

<code>[root@www ~]# vgreduce myvg /dev/sdb2</code><code>//移除/dev/sdb2</code>

<code>  </code><code>Removed </code><code>"/dev/sdb2"</code> <code>from volume group </code><code>"myvg"</code>

<code>[root@www ~]# vgdisplay myvg</code>

<code>  </code><code>Metadata Areas        1</code>

<code>  </code><code>Metadata Sequence No  2</code>

<code>  </code><code>Cur PV                1</code>

<code>  </code><code>Act PV                1</code>

<code>  </code><code>VG Size               2.00 GiB</code><code>// 大小變為2G</code>

<code>  </code><code>Free  PE / Size       513 / 2.00 GiB</code>

-----------------------

擴充VG: 向VG中添加更多的PV來實作

vgextend

<code>  </code><code>myvg   1   0   0 wz--n-  2.00g 2.00g</code><code>//擴充前大小為2G</code>

<code>[root@www ~]# vgextend myvg /dev/sdb2</code><code>//向myvg中添加/dev/sdb2</code>

<code>  </code><code>Volume group </code><code>"myvg"</code> <code>successfully extended</code>

<code>  </code><code>myvg   2   0   0 wz--n-  5.01g 5.01g</code><code>//大小變為5G</code>

3、LV相關操作

建立LV Logical Volume

    建立lv:

    lvcreate -L #[bBsSkKmMgGtTpPeE] [-n|--name  LogicalVolume{Name|Path}]  VG_NAME

    LV裝置路徑:

    (1) /dev/VGNAME/LVNAME

    (2) /dev/mapper/VGNAME-LVNAME

    實際路徑:/dev/dm-#

注意:lv的大小必須為pe的整數倍

<code>[root@www ~]# lvcreate -L 4G -n mylv myvg</code><code>//建立大小為4G的LV 名字為mylv</code>

<code>  </code><code>Logical volume </code><code>"mylv"</code> <code>created</code>

<code>[root@www ~]# lvs</code><code>//檢視LV</code>

<code>  </code><code>LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert</code>

<code>  </code><code>mylv myvg -wi-a-----  4.00g           </code><code>//大小為4G                                         </code>

<code>  </code><code>root vg0  -wi-ao---- 20.00g                                                    </code>

<code>  </code><code>swap vg0  -wi-ao----  2.00g                                                    </code>

<code>  </code><code>usr  vg0  -wi-ao---- 10.00g                                                    </code>

<code>  </code><code>var</code>  <code>vg0  -wi-ao---- 20.00g                                                    </code>

<code>[root@www ~]# lvdisplay </code>

<code>  </code><code>--- Logical volume ---</code>

<code>  </code><code>LV Path                /dev/myvg/mylv</code>

<code>  </code><code>LV Name                mylv</code>

<code>  </code><code>VG Name                myvg</code>

<code>  </code><code>LV UUID                i3tDAL-GdB4-TVIf-Efun-vVmg-Ig00-cSCdKk</code>

<code>  </code><code>LV Write Access        read/write</code>

<code>  </code><code>LV Creation host, time www.w1.com, 2015-08-16 05:05:40 +0800</code>

<code>  </code><code>LV Status              available</code>

<code>  </code><code># open                 0</code>

<code>  </code><code>LV Size                4.00 GiB</code>

<code>  </code><code>Current LE             1024</code>

<code>  </code><code>Segments               2</code>

<code>  </code><code>Allocation             inherit</code>

<code>  </code><code>Read ahead sectors     auto</code>

<code>  </code><code>- currently set to     256</code>

<code>  </code><code>Block device           253:4</code>

移除LV 

lvremove LV_PATH

<code>[root@www ~]# lvs</code>

<code>  </code><code>mylv myvg -wi-a-----  4.00g          </code><code>//檢視lv                                          </code>

<code>[root@www ~]# lvremove /dev/myvg/mylv</code><code>//移除mylv</code>

<code>Do you really want to remove active logical volume mylv? [y/n]: y</code>

<code>  </code><code>Logical volume </code><code>"mylv"</code> <code>successfully removed</code>

<code>  </code><code>root vg0  -wi-ao---- 20.00g             </code><code>//已經不存在mylv                                       </code>

擴充LV 

    儲存設備有:實體邊界

    檔案系統有:邏輯邊界

    擴充:先擴充實體邊界,而後拉伸邏輯邊界

    lvextend, lvresize

    resize2fs

擴充LV步驟

1、先确定目标大小:要確定此lv所在vg中有足夠的空閑可用;

2G --&gt; 4G

            4G

            +2G

2、擴充實體邊界

        lvextend -L [+]#[bBsSkKmMgGtTpPeE] /dev/VGNAME/LVNAME

3、拉伸邏輯邊界

        resize2fs /dev/VGNAME/LVNAME 

例:先建立大小為2G的LV然後在擴充為4G

<code>[root@www ~]# lvcreate -L 2G -n mylv myvg</code>

<code>[root@www ~]# lvdisplay /dev/myvg/mylv</code>

<code>  </code><code>LV UUID                yZE2SK-G9J9-dFdH-uJvK-Lln6-AS2G-UqHMjU</code>

<code>  </code><code>LV Creation host, time www.w1.com, 2015-08-16 05:12:04 +0800</code>

<code>  </code><code>LV Size                2.00 GiB</code>

<code>  </code><code>Current LE             512</code>

<code>  </code><code>Segments               1</code>

格式化/myvg/mylv

<code>[root@www ~]# mke2fs -t ext4 /dev/myvg/mylv</code>

<code>mke2fs 1.41.12 (17-May-2010)</code>

<code>Filesystem label=</code>

<code>OS type: Linux</code>

<code>Block size=4096 (log=2)</code>

<code>Fragment size=4096 (log=2)</code>

<code>Stride=0 blocks, Stripe width=0 blocks</code>

<code>131072 inodes, 524288 blocks</code>

<code>26214 blocks (5.00%) reserved </code><code>for</code> <code>the super user</code>

<code>First data block=0</code>

<code>Maximum filesystem blocks=536870912</code>

<code>16 block groups</code>

<code>32768 blocks per group, 32768 fragments per group</code>

<code>8192 inodes per group</code>

<code>Superblock backups stored on blocks: </code>

<code>32768, 98304, 163840, 229376, 294912</code>

<code>Writing inode tables: done                            </code>

<code>Creating journal (16384 blocks): done</code>

<code>Writing superblocks </code><code>and</code> <code>filesystem accounting information: done</code>

<code>This filesystem will be automatically checked every 38 mounts </code><code>or</code>

<code>180 days, whichever comes first.  Use tune2fs -c </code><code>or</code> <code>-i to override.</code>

<code>[root@www ~]# </code><code>mkdir</code> <code>/nyist</code><code>//建立挂載點</code>

<code>[root@www ~]# mount /dev/myvg/mylv /nyist</code><code>//挂載</code>

<code>[root@www ~]# df -h</code><code>//檢視大小</code>

<code>Filesystem            Size  Used Avail Use% Mounted on</code>

<code>/dev/mapper/vg0-root   20G   18G  908M  96% /</code>

<code>tmpfs                 565M     0  565M   0% /dev/shm</code>

<code>/dev/sda1             190M   33M  148M  18% /boot</code>

<code>/dev/mapper/vg0-usr   9.8G  2.4G  6.9G  26% /usr</code>

<code>/dev/mapper/vg0-</code><code>var</code>    <code>20G  294M   19G   2% /</code><code>var</code>

<code>/dev/sda3              59G  4.7G   52G   9% /usr/soc</code>

<code>/dev/mapper/myvg-mylv</code>

<code>                      </code><code>2.0G  3.0M  1.9G   1% /nyist</code>

<code>[root@www ~]# cp /etc/fstab /nyist</code>

檢視檔案

<code>[root@www ~]# cat /nyist/fstab </code>

<code>#</code>

<code># /etc/fstab</code>

<code># Created by anaconda on Thu Mar 26 20:01:38 2015</code>

<code># Accessible filesystems, by reference, are maintained under </code><code>'/dev/disk'</code>

<code># See man pages fstab(5), findfs(8), mount(8) </code><code>and</code><code>/</code><code>or</code> <code>blkid(8) </code><code>for</code> <code>more info</code>

<code>/dev/mapper/vg0-root    /                       ext4    defaults        1 1</code>

<code>UUID=0d0698ff-1645-4ff8-af27-fc6e73573941 /boot                   ext4    defaults        1 2</code>

<code>/dev/mapper/vg0-usr     /usr                    ext4    defaults        1 2</code>

<code>/dev/mapper/vg0-</code><code>var</code>     <code>/</code><code>var</code>                    <code>ext4    defaults        1 2</code>

<code>/dev/mapper/vg0-swap    swap                    swap    defaults        0 0</code>

<code>tmpfs                   /dev/shm                tmpfs   defaults        0 0</code>

<code>devpts                  /dev/pts                devpts  gid=5,mode=620  0 0</code>

<code>sysfs                   /sys                    sysfs   defaults        0 0</code>

<code>proc                    /proc                   proc    defaults        0 0</code>

<code>/dev/sda3           /usr/soc                ext4    defaults        0 0</code>

檢視VG剩餘空間:

<code>  </code><code>myvg   2   1   0 wz--n-  5.01g 3.01g</code><code>//還有3G 我們要擴充到4G 容量足夠</code>

擴充實體邊界

<code>[root@www ~]# lvs /dev/myvg/mylv</code>

<code>  </code><code>LV   VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert</code>

<code>  </code><code>mylv myvg -wi-a----- 2.00g          //目前大小為2G                                          </code>

<code>[root@www ~]# lvextend -L 4G  /dev/myvg/mylv  //擴充LV 也可以寫為: lvextend -L +2G /vev/myvg/mylv</code>

<code>  </code><code>Size of logical volume myvg/mylv changed from 2.00 GiB (512 extents) to 4.00 GiB (1024 extents).</code>

<code>  </code><code>Logical volume mylv successfully resized</code>

<code>[root@www ~]# lvs /dev/myvg/mylv檢視mylv大小</code>

<code>  </code><code>mylv myvg -wi-a----- 4.00g              //擴充為4G                                      </code>

<code>[root@www ~]# </code>

<code>  </code><code>LV Size                4.00 GiB  //已經擴充為4G</code>

檢視邏輯空間大小

<code>[root@www ~]# df -h</code>

<code>......</code>

<code>                      </code><code>2.0G  3.1M  1.9G   1% /nyist</code><code>//依然為2G</code>

拉伸邏輯邊界

<code>[root@www ~]# resize2fs /dev/myvg/mylv</code><code>//擴充邏輯邊界</code>

<code>resize2fs 1.41.12 (17-May-2010)</code>

<code>Filesystem at /dev/myvg/mylv is mounted on /nyist; on-line resizing required</code>

<code>old desc_blocks = 1, new_desc_blocks = 1</code>

<code>Performing an on-line resize of /dev/myvg/mylv to 1048576 (4k) blocks.</code>

<code>The filesystem on /dev/myvg/mylv is now 1048576 blocks long.</code>

<code>                      </code><code>3.9G  4.0M  3.7G   1% /nyist</code><code>//大小已經為3.9G 成功擴充</code>

============================================================

縮減LV

注意:

1、縮減LV必須要離線

2、必須先縮減檔案系統,然後再縮減LV大小

過程:

    1、先确定縮減後的目标大小:要確定縮減後的大小能夠容納現在的所有資料;

    2、解除安裝邏輯卷,并強制做檔案系統一緻性檢查;

    e2fsck -f /dev/VGNAME/LVNAME

    3、縮減邏輯邊界

    resize2fs /dev/VGNAME/LVNAME #[bBsSkKmMgGtTpPeE]

// resize2fs /dev/myvg/mylv 3G

    4、縮減實體邊界

    lvreduce -L [-]#[bBsSkKmMgGtTpPeE] /dev/VGNAME/LVNAME

//lvreduce -L 3G /dev/myvg/mylv    //縮減到3G

eg:

<code>[root@www ~]# umount /nyist</code>

<code>[root@www ~]# e2fsck -f /dev/myvg/mylv</code>

<code>e2fsck 1.41.12 (17-May-2010)</code>

<code>Pass 1: Checking inodes, blocks, </code><code>and</code> <code>sizes</code>

<code>Pass 2: Checking directory structure</code>

<code>Pass 3: Checking directory connectivity</code>

<code>Pass 4: Checking reference counts</code>

<code>Pass 5: Checking group summary information</code>

<code>/dev/myvg/mylv: 12/262144 files (0.0% non-contiguous), 33871/1048576 blocks</code>

<code>[root@www ~]# resize2fs /dev/myvg/mylv 3G</code><code>//縮減邏輯邊界</code>

<code>Resizing the filesystem on /dev/myvg/mylv to 786432 (4k) blocks.</code>

<code>The filesystem on /dev/myvg/mylv is now 786432 blocks long.</code>

<code>[root@www ~]# lvreduce -L 3G /dev/myvg/mylv</code><code>//縮減實體邊界</code>

<code>  </code><code>WARNING: Reducing active logical volume to 3.00 GiB</code>

<code>  </code><code>THIS MAY DESTROY YOUR DATA (filesystem etc.)</code>

<code>Do you really want to reduce mylv? [y/n]: y</code>

<code>  </code><code>Size of logical volume myvg/mylv changed from 4.00 GiB (1024 extents) to 3.00 GiB (768 extents).</code>

驗證:

<code>  </code><code>mylv myvg -wi-a-----  3.00g          </code><code>//大小3G                                          </code>

<code>[root@www ~]# mount /dev/myvg/mylv /nyist</code>

<code>                      </code><code>2.9G  3.1M  2.8G   1% /nyist</code><code>//大小2.9G   </code>

本文轉自 1inux 51CTO部落格,原文連結:http://blog.51cto.com/1inux/1706105

繼續閱讀