学习linux lvm操作空间方法

发布时间:2019-09-04编辑:脚本学堂
学习linux lvm操作空间方法

使用lvextend -L size LVNAME 增大一个逻辑卷的大小。
[root@NEWLFS mnt]#lvextend -L +1G /dev/LVM_vg/lv_home
  Extending logical volume lv_home to 3.00 GB
  Logical volume lv_home successfully resized
[root@NEWLFS mnt]#                    
-L +1G 为lv_home加上 1G 空间。或者使用这种格式:
[root@NEWLFS mnt]#lvextend -L 3G /dev/lvm_vg/lv_home
指定lv_home更改后的大小,效果相同。

更改逻辑卷大小后,还应该更改文件系统的大小,保持一致:
[root@NEWLFS mnt]#resize_reiserfs -f /dev/lvm_vg/lv_home
resize_reiserfs 3.6.19 (2003 www.jb200.com)

ReiserFS report:
blocksize             4096
block count           786432 (524288)
free blocks           778197 (516061)
bitmap block count    24 (16)

Syncing..done
resize_reiserfs: Resizing finished successfully.

[root@NEWLFS mnt]df
Filesystem            Size  Used Avail Use% linuxjishu/9952.html target=_blank class=infotextkey>mounted on
/dev/md0              5.4G  2.8G  2.7G  51% /
/dev/hda1             6.4G  4.0G  2.5G  62% /mnt/C
/dev/hda6              25G   22G  3.6G  86% /mnt/E
/dev/hda7             9.7G  3.7G  5.6G  40% /mnt/lfs
/dev/mapper/lvm_vg-lv_home
                      3.0G   33M  3.0G   2% /mnt/lvm_home
[root@NEWLFS mnt]#
成功的将lvm_home扩展到了3G,没有重新启动,并且没有卸载文件系统。
ReiserFS真是好用!  ^_^

当然,ReiserFS 也允许卸载文件系统后resize,使用下列命令:
[root@NEWLFS mnt]#umount /dev/lvm_vg/lv_home
卸载文件系统
[root@NEWLFS mnt]#resize_reiserfs /dev/lvm_vg/lv_home
调整大小,与上面不同的地方是没有 -f 参数.
[root@NEWLFS mnt]#mount -t reiserfs /dev/lvm_vg/lv_home lvm_home/
重新挂载上.

EXT2/3 安装,扩展:
[root@NEWLFS mnt]#lvcreate -L 2G -n lv_opt lvm_vg
  Logical volume "lv_opt" created
分出一块2G名字为lv_opt的逻辑卷

[root@NEWLFS mnt]#mke2fs -j /dev/lvm_vg/lv_opt
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
262144 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
16 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 35 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
创建ext3文件系统
[root@NEWLFS mnt]#mkdir lvm_opt
[root@NEWLFS mnt]#mount -t ext3 /dev/lvm_vg/lv_opt lvm_opt/
创建挂载点,挂载上。
[root@NEWLFS mnt]#df
Filesystem            Size  Used Avail Use% Mounted
..............
/dev/mapper/lvm_vg-lv_home
                      3.0G   33M  3.0G   2% /mnt/lvm_home
/dev/mapper/lvm_vg-lv_opt
                      2.0G   33M  1.9G   2% /mnt/lvm_opt

[root@NEWLFS mnt]#lvextend -L +1G /dev/lvm_vg/lv_opt
  Extending logical volume lv_opt to 3.00 GB
  Logical volume lv_opt successfully resized
为lv_opt 增加一个G的空间。

[root@NEWLFS mnt]#umount lvm_opt/
调整ext2/3文件系统 需要先卸载,然后调整,不象ReiserFS可以不用卸载。

[root@NEWLFS mnt]#resize2fs /dev/lvm_vg/lv_opt
resize2fs 1.35 (28-Feb-2004)
Please run 'e2fsck -f /dev/lvm_vg/lv_opt' first.
提示先运行e2fsck -f 那就检查下吧 :)
resize2fs -f 参数可以不用e2fsck,检查下也是好的。

[root@NEWLFS mnt]#e2fsck -f /dev/lvm_vg/lv_opt
e2fsck 1.35 (28-Feb-2004)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/lvm_vg/lv_opt: 11/262144 files (0.0% non-contiguous), 16443/524288 blocks

[root@NEWLFS mnt]#resize2fs /dev/lvm_vg/lv_opt
resize2fs 1.35 (28-Feb-2004)
Resizing the filesystem on /dev/lvm_vg/lv_opt to 786432 (4k) blocks.
The filesystem on /dev/lvm_vg/lv_opt is now 786432 blocks long.
成功将lv_opt调整成3G,重新mount 看看吧 !

[root@NEWLFS mnt]#mount -t ext3 /dev/lvm_vg/lv_opt lvm_opt/
[root@NEWLFS mnt]#df
Filesystem            Size  Used Avail Use% Mounted on
.............
/dev/mapper/lvm_vg-lv_home
                      3.0G   33M  3.0G   2% /mnt/lvm_home
/dev/mapper/lvm_vg-lv_opt
                      3.0G   33M  2.9G   2% /mnt/lvm_opt
[root@NEWLFS mnt]#
OK啦。 LVM真是方便 ^_^

再来看看如何减小分区大小:
注意: 减小逻辑卷大小之前,应该先减小文件系统的大小,否则可能会导致数据丢失。

ReiserFS :
[root@NEWLFS mnt]#umount lvm_home/
首先卸载ReiserFS文件系统。

[root@NEWLFS mnt]#resize_reiserfs -s-1G /dev/lvm_vg/lv_home
resize_reiserfs 3.6.19 (2003 www.namesys.com)

You are running BETA version of reiserfs shrinker.
This version is only for testing or VERY CAREFUL use.
Backup of you data is recommended.

Do you want to continue? [y/N]:y
Processing the tree: 0%....20%....40%....60%....80%....100%    left 0, 0 /sec

nodes processed (moved):
int        0 (0),
leaves     1 (0),
unfm       0 (0),
total      1 (0).

check for used blocks in truncated region

ReiserFS report:
blocksize             4096
block count           524288 (786432)
free blocks           516061 (778197)
bitmap block count    16 (24)

Syncing..done

resize_reiserfs: Resizing finished successfully.

先减小文件系统的大小, -s-1G 减去1个G

[root@NEWLFS mnt]#lvreduce -L -1G /dev/lvm_vg/lv_home
WARNING: Reducing active logical volume to 2.00 GB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv_home? [y/n]: y
  Reducing logical volume lv_home to 2.00 GB
  Logical volume lv_home successfully resized
然后减小LV大小, -L -1G 减去1个G 与文件系统保持一致。

[root@NEWLFS mnt]#mount -t reiserfs /dev/lvm_vg/lv_home lvm_home/
[root@NEWLFS mnt]#df
Filesystem            Size  Used Avail Use% Mounted on
/dev/md0              5.4G  2.8G  2.7G  51% /
/dev/hda1             6.4G  4.0G  2.5G  62% /mnt/C
/dev/hda6              25G   22G  3.6G  86% /mnt/E
/dev/hda7             9.7G  3.7G  5.6G  40% /mnt/lfs
/dev/mapper/lvm_vg-lv_opt
                      3.0G   33M  2.9G   2% /mnt/lvm_opt
/dev/mapper/lvm_vg-lv_home
                      2.0G   33M  2.0G   2% /mnt/lvm_home

OK,成功减少了一个G,从上面输出可以看出,减小要比增大危险一些
所以应该尽量避免减小分区大小,以及做重要数据的备份,有备无患嘛 :)

EXT2/3:
在LVM1中可以通过e2fsadm这个程序,方便的减小一个ext2/3的大小。
而LVM2中这个程序不可用。
所以在LVM2中减小EXT2/3大小时麻烦一些,因为必须要知道减少后卷的块数。

[root@NEWLFS ~]#umount /mnt/lvm_opt/
首先卸载文件系统
[root@NEWLFS ~]#mke2fs -n /dev/lvm_vg/lv_opt
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
262144 inodes, 786432 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
16 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912
[root@NEWLFS ~]#
因为必须知道减少后卷的块数,所以通过mke2fs -n 列出块大小

注意: -n 参数不会使mke2fs真的创建文件系统,而只是列出文件系统的信息。
千万不要少了-n 否则数据就全没了。。:(
块大小是4096(4kb) 当前有786432个blocks 现在打算减小一个G的空间。
1G占用的blocks一共是262144个,所以减少后的blocks应该是524288个。

减小FS大小:
[root@NEWLFS ~]#resize2fs /dev/lvm_vg/lv_opt 524288(这可直接输入以G或M为单位的大小,省略MKE2FS这个步骤!)
resize2fs 1.35 (28-Feb-2004)
Resizing the filesystem on /dev/lvm_vg/lv_var to 524288 (1k) blocks.
The filesystem on /dev/lvm_vg/lv_var is now 524288 blocks long.
减少LV大小:
[root@NEWLFS mnt]#lvreduce -L -1G /dev/lvm_vg/lv_var
  WARNING: Reducing active logical volume to 2.00 GB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv_var? [y/n]: y
  Reducing logical volume lv_var to 2.00 GB
  Logical volume lv_var successfully resized
ok,成功缩小了1G,再重新mount上吧。

[root@NEWLFS mnt]#mount /dev/lvm_vg/lv_var lvm_var/
[root@NEWLFS mnt]#df
..........
/dev/mapper/lvm_vg-lv_var
                      2.0G   33M  1.9G   2% /mnt/lvm_var

下面再来看看如何删除LV,VG :
删除LV:
[root@NEWLFS mnt]#umount /dev/lvm_vg/lv_opt
必须先关闭LV才可以删除它。
[root@NEWLFS mnt]#lvremove /dev/lvm_vg/lv_opt
Do you really want to remove active logical volume "lv_opt"? [y/n]: y
  Logical volume "lv_opt" successfully removed
[root@NEWLFS mnt]
使用lvremove命令删除一个逻辑卷,这里删除了lv_opt.

删除VG:
首先必须确保VG中没有任何逻辑卷存在,才可以删除一个VG。
我已经使用lvremove 删除了lv_usr lv_home。
[root@NEWLFS mnt]#lvdisplay
[root@NEWLFS mnt]#
没有任何输出,说明已经没有lv了。

[root@NEWLFS mnt]#vgchange -a n lvm_vg
  0 logical volume(s) in volume group "lvm_vg" now active
使用vgchange -a n 关闭了lvm_vg,然后才可以删除它。

[root@NEWLFS mnt]#vgremove lvm_vg
  Volume group "lvm_vg" successfully removed
干掉了 ....世界清静了 ^_^

[root@NEWLFS mnt]#vgdisplay
[root@NEWLFS mnt]#                   
没有回显,说明已经没有任何VG了。

向VG中添加/删除PV :
上面已经提到了,VG可以由多个PV组成(hda1,hda3,hda5....)
可以使不相邻的分区,结合在一起使用。(和线性RAID同样的作用)

来看看如何向VG中添加PV:

因为我没有多余的物理设备来演示,所以用到了loop设备。
首先我通过
[root@NEWLFS ~]#dd if=/dev/zero of=/root/lvm bs=4096 count=32768
在/root目录下创建了一个128M的文件(/root/lvm)
然后用losetup 命令挂在了/dev/loop0上,这样我的loop0就象/dev/hdaX一样
是一个可用的块设备了。loop设备真是不错,用来做实验很好,比如试试reiserfs
raid,LVM.....练习好了,再在真实分区上实践。

看看我是怎么使用的 :)
[root@NEWLFS ~]#losetup /dev/loop0 lvm
将刚刚建立的lvm文件挂在了/dev/loop0中,这样loop0可以象其他物理设备可以使用了。
初始化loop0 为PV:
[root@NEWLFS ~]#pvcreate /dev/loop0
  Physical volume "/dev/loop0" successfully created
[root@NEWLFS ~]#

使用vgextend命令将/dev/loop0添加到lvm_vg中:
[root@NEWLFS ~]#vgextend lvm_vg /dev/loop0
  Volume group "lvm_vg" successfully extended
[root@NEWLFS ~]#
成功的将/dev/loop0加入到了lvm_vg中。下面就可以创建LV啦。
[root@NEWLFS ~]#lvcreate -L 128M -n loop_lv lvm_vg /dev/loop0
  Insufficient allocatable logical extents (31) for logical volume loop_lv: 32 required
加上/dev/loop0表示指定这个LV只在/dev/loop0中,可能因为LE自身占用空间,所以无法分配128M
[root@NEWLFS ~]#lvcreate -L 100M -n loop_lv lvm_vg /dev/loop0
  Logical volume "loop_lv" created
[root@NEWLFS ~]#
100M就可以成功创建了,可以看出,loop_lv这个LV完全在/dev/loop0上。

删除PV:
必须确保要删除的PV中没有被任何LV使用
使用 pvdisplay /dev/loop0 查看 (假设loop0是要删除的pv)

[root@NEWLFS ~]#pvdisplay /dev/loop0
  --- Physical volume ---
  PV Name               /dev/loop0
  VG Name               lvm_vg
  PV Size               124.00 MB / not usable 0
  Allocatable           yes
  PE Size (KByte)       4096
  Total PE              31
  Free PE               31 ---->FreePE=TotalPE
  Allocated PE          0------>占用的PE为0 说明loop0上没有lv
  PV UUID               K38G8y-G6b7-81O0-SFz5-HZii-Rp6t-sHq4ou
[root@NEWLFS ~]#


如果仍然有LV使用该物理卷,可以通过 pvmove 命令转移到另一个PV上
然后使用vgreduce命令 删除PV :

[root@NEWLFS ~]#vgreduce lvm_vg /dev/loop0
  Removed "/dev/loop0" from volume group "lvm_vg"
[root@NEWLFS ~]#
成功将/dev/loop0从lvm_vg中删除,很简单吧 ^_^                 
系统启动时自动加载LVM分区:

修改/etc/fstab 加入LVM分区 以及挂载点,FS类型等。。。。
/dev/lvm_vg/lv_home /mnt/lvm_home reiserfs defaults 0 0
/dev/lvm_vg/lv_opt  /mnt/lvm_opt  ext3     defaults 0 0

然后需要在系统启动脚本中加入激活LVM的命令
并且必须在挂载/etc/fstab中的文件系统之前激活LVM,不然怎么挂载阿。^_^
我写在了/etc/rc.d/init.d/mountfs这个脚本中,它的作用是
在fsck检查各个分区后,将/分区及其他分区重新挂载成read-write的
/sbin/vgscan  -------->需要加入的两行
/sbin/vgchange -a y

mountfs脚本主要内容是:(传递start参数)
echo "Remounting root file system in read-write mode..."
mount -n -o remount,rw /
echo "Recording existing mounts in /etc/mtab..."
                > /etc/mtab
                mount -f / || failed=1
                mount -f /proc || failed=1
                if grep -q '[[:space:]]sysfs' /proc/mounts ; then
                        mount -f /sys || failed=1
                fi
echo "Mounting remaining file systems..."
                ##############LVM##############
                /sbin/vgscan  #------->在挂载其他文件系统之前
                /sbin/vgchange -a y #---->就激活了LVM,随后就挂载上啦
                mount -a -O no_netdev #--->依照/etc/fstab挂载FS

这样系统启动时,就会激活LVM,并自动挂载上。

一篇关于LVM的文章中说,将这两条命令加在了检查文件系统脚本中,但是我加在那里
不成功,可能因为在checkfs时,系统是read-only的,而vgchange -a y
需要写入数据却无法写入,所以不行.

udev服务先于checkfs启动,并且通过mount -n -t ramfs ramfs /dev
将/dev挂载成ramfs,完全在内存中活动,无论根分区是否可写,/dev都是可写的。
莫非vgchange -a y 还要向其他位置写入数据?有待研究:)

在其他的发行版中,如Red Hat,Mandrake中,检查根文件系统,依照/etc/fstab
挂载各个文件系统,开启swap分区...等等,这些都是通过/etc/rc.d/rc.sysinit完成的
而在LFS中则是将这个脚本 分成了若干的小脚本,然后逐一的运行它们。
个人认为这样可以更直观的了解系统的启动过程,方便修改。
所以在其他发行版中,激活lvm,就要写到/etc/rc.d/rc.sysinit中
并且必须要在挂载/etc/fstab中文件系统之前激活。还要注意激活时,系统是rw的。

最后我又在mountfs中添加了关闭VG的语句,这样可以
在系统关机/重启的时候自动关闭VG。
/sbin/vgchange -a n ------>添加这句

当系统关机/重启时,mountfs会依照/etc/fstab卸载所有的文件系统:
mountfs 脚本内容 : (传递stop参数)

echo "Unmounting all other currently mounted file systems..."
umount -a -d -r -t noramfs
/sbin/vgchange -a n # --->加在了这里

在卸载LV卷后,才可以关闭VG,开始我加在了umount上面一行就不行。提示仍有LV在使用。
其他发行版中,关闭VG要比激活VG容易多啦。只要加在halt/reboot这个服务脚本里就可以。
其实只要卸载文件系统后的服务脚本都可以。