LVM磁盘管理
     分类:系统管理     有: 0 条评论

LVM磁盘管理

     分类:系统管理     有: 0 条评论

简介

LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。首先我们讨论以下几个LVM术语:

简单来说就是:



新建分区

当新加一块硬盘时就需要建立分区才能存储数据

建立分区(创建分区表)

fdisk -l查看硬盘,更直观的命令:lsblk -f;就拿这个1.8T的阵列来开刀。

Disk /dev/sdb: 1800.3 GB, 1800279121920 bytes, 3516170160 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes

分区

[root@localhost ~]# fdisk /dev/sdb   #分区,后面没有数字的,代表是硬盘,不要选错了
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x598c2a6d.

#新硬盘,在初始化时默认有一个分区了,要使用全部空间先删掉这个分区
Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

#接着再开始分区
Command (m for help): n      #新建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p        #主分区
Partition number (1-4, default 1): 1   #要分几个区
# fdisk默认操作的是MBR分区,最多4个主分区,如果单盘大于2T或者是GPT分区就要用parted命令了。
First sector (2048-3516170159, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-3516170159, default 3516170159): 
Using default value 3516170159
Partition 1 of type Linux and of size 1.7 TiB is set

Command (m for help): w       #将修改写入磁盘
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# 

这时再用fdisk -l查看时可以看到多了个/dev/sdb1,这个是后面有数字的,代表是分区

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048  3516170159  1758084056   83  Linux
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

这里注意特殊情况

1,单盘大于2T的,应该用parted命令分区。不管有没有做RAID
2,单盘为2T或小于2T,做了RAID,容量变为大于2T了,用parted是完全正常的;但是也可以用fdisk分区,但是GPT分区看不到/dev/sda1这样的标识了,也是可以用的,不影响使用,格盘时自己加个1就行了。

[root@Linux-01_kvm ~]# fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sda: 5999.5 GB, 5999532441600 bytes, 11717836800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt

#         Start          End    Size  Type            Name
 1         2048  11717836766    5.5T  Linux filesyste 
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

# 下面创建LVM
[root@Linux-01_kvm ~]# pvcreate /dev/sda1    #自己加个1,即/dev/sda1(上一步#下只有一个1,两个分区,第二个就是sda2)
  Physical volume "/dev/sda1" successfully created.

[root@Linux-01_kvm ~]# vgcreate sas_raid5 /dev/sda1
  Volume group "sas_raid5" successfully created

[root@Linux-01_kvm ~]# lvcreate -l +100%FREE -n lv02 sas_raid5
  Logical volume "lv02" created.

[root@Linux-01_kvm ~]# lvdisplay

 --- Logical volume ---
  LV Path                /dev/sas_raid5/lv02
  LV Name                lv02
  VG Name                sas_raid5
  LV UUID                ev1OXa-MNwW-NxVX-ZM1S-46xe-qeLl-f7sXwD
  LV Write Access        read/write
  LV Creation host, time Linux-01_kvm, 2017-09-12 11:19:44 +0800
  LV Status              available
  # open                 0
  LV Size                5.46 TiB
  Current LE             1430399
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3

# 可以看到也是正常使用的,完全不影响。
[root@Linux-01_kvm ~]# mkfs.ext4 /dev/sas_raid5/lv02
然后就可以挂载使用了。

新建PV

如果是扩容之类的就不用再创建了,合并就可以了。
这里都是用全部可用空间来创建,没有再分容量大小了。

[root@localhost ~]# pvcreate /dev/sdb1        #用/dev/sdb1来创建pv
  Physical volume "/dev/sdb1" successfully created.

创建VG

[root@localhost ~]# vgcreate sas_raid5 /dev/sdb1   #用/dev/sdb1来创建vg(sas_raid5)
  Volume group "sas_raid5" successfully created

创建LV

[root@localhost ~]# lvcreate -l +100%FREE -n lv02 sas_raid5   #用vg(sas_raid5)的全部空间创建lv(lv02)
  Logical volume "lv02" created.

这时创建好lv后就可以存储数据了,可以看到位置在/dev/sas_raid5/lv02,接下来格式化。

[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/sas_raid5/lv02
  LV Name                lv02
  VG Name                sas_raid5
  LV UUID                Gv5x2b-w5BL-IHAS-9tcS-7bHl-ZRwa-A07rte
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-06-10 19:34:36 +0800
  LV Status              available
  # open                 0
  LV Size                1.64 TiB
  Current LE             429219
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:3

格式化文件系统

[root@localhost ~]# mkfs -t ext4 /dev/sas_raid5/lv02
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=64 blocks, Stripe width=192 blocks
109887488 inodes, 439520256 blocks
21976012 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2587885568
13414 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000, 214990848

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

这回用fdisk -l可以看到创建好了

Disk /dev/mapper/sas_raid5-lv02: 1800.3 GB, 1800274968576 bytes, 3516162048 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes

开机自动挂载

cd /
mkdir sas_raid5
mount /dev/mapper/sas_raid5-lv02 /sas_raid5/
df -Th
#确认可以正常挂载后就可以写入fstab文件了,小心操作,写错了将导致系统无法启动
vim /etc/fstab
/dev/mapper/sas_raid5-lv02     /sas_raid5                   ext4     defaults        0 0

最后重启reboot就完成了。


动态调整

新分区、新硬盘用于扩容

貌似全程都不用格式化新建分区

运行的系统什么系统都行,都可以操作,但要注意ext3好像不支持在线扩容,要在liveCD中才行。ext4和xfs都支持动态扩容。如果是出了问题需要修复的话,建议用Ubuntu的liveCD 支持NTFS分区的自动挂载,方便备份资料后转移。

安装LVM
首先确定系统中是否安装了lvm工具:

df -Thfdisk -l 查看分区情况

开始分区

fdisk /dev/sdb
n          #新建
p          #设定为主分区
Partition number(1-4):1     #指定分区,即为之后创建的sdb1-4(主分区只能4个)
回车       #设定起始扇区
回车       #设定结束扇区(直接回车默认用全部空间创建,也可以输入+500M设定为500M)

t           #此时输入L能看到所有格式的代码,指定分区格式,8e为LVM
8e          # 设定为LVM
p           # 查看当前分区情况
w           # 写入硬盘

partprobe   # 重读分区表,可能会提示无法只读。。。。不用理会

查看当前PV:
pvdisplaypvscan

创建PV(物理卷)
pvcreate /dev/sdb1 使用之前创建的sdb1的全部空间创建PV,不想使用全部空间,之前分区时就要注意了。

查看当前VG(卷组)
vgdisplayvgscan

用/dev/sdb1创建VG并加到已存在的vg_bogon中
vgextend vg_bogon /dev/sdb1 vg_bogon是本机正在使用的vg_name

查看当前VGvgdisplay

发现有9.99G的空间

扩容/分区所在的LV(逻辑卷)

/dev/vg_bogon/LogVol01为正在使用的/分区
lvextend -l +100%FREE /dev/vg_bogon/LogVol01 路径用/dev/vg_bogon/LogVol01/dev/mapper/vg_bogon-LogVol01都是可以的,df -Th就能查看,或 lvextend -L +10G /dev/vg_bogon/LogVol01 来增加10G空间。

查看当前VG:
vgdisplay已经扩容了,但df -Th 显示没有扩容

重设逻辑卷大小,对于当前正在使用的LogVol01有效
resize2fs /dev/vg_bogon/LogVol01 #ext*分区有效,xfs分区不用执行
xfs分区不支持缩小,只支持扩容,被缩小的分区必须重新格式化才能使用



缩小其他分区扩容根分区

1.首先查看磁盘使用情况:df -Th同时查看分区格式,xfs格式缩小后必须格式化

文件系统                      格式  容量  已用 可用  已用% 挂载点
Filesystem                   Type Size  Used Avail Use% Mounted on  
/dev/mapper/VolGroup-lv_root  xfs 154G  7.9G  139G   6% /
/dev/sda1                    ext4 485M   69M  391M  15% /boot
/dev/mapper/VolGroup-lv_home  xfs 299G  984M  283G   1% /home

2、卸载/home 这里缩小home,扩容/分区
注意:如果缩小的分区是xfs的,先备份资料,缩小后必须重新格式化才能使用。

# 备份home目录
cd /home
tar -zcpv -f /tmp/home.tar.gz ./*
cd ~

# 卸载home;如果提示无法卸载,则是有进程占用/home,使用如下命令来终止占用进程:fuser -m /home
umount /home
一定要先卸载分区,直接格式化会失败,重启才能恢复,切可能导致启动失败,只有root能登录。

3、调整分区大小

# 如果/home是xfs格式的,是无法用resize2fs缩小的,先格式化为ext4
mkfs.ext4 /dev/mapper/VolGroup-lv_home

# 缩小home分区到20G(home的最大空间为20G)
resize2fs -p /dev/mapper/VolGroup-lv_home 20G
# 如果提示运行“e2fsck -f /dev/mapper/VolGroup-lv_home”,则执行相关命令: e2fsck -f /dev/mapper/VolGroup-lv_home
# 然后重新执行命令:resize2fs -p /dev/mapper/VolGroup-lv_home 20G

注:resize2fs为重新设定磁盘大小,只是重新指定一下大小,并不对结果有影响(标记超过20G部分为不使用),需要下面lvreduce的配合(真正的切割分区)

4、挂载上/home,查看磁盘使用情况

mount /dev/mapper/VolGroup-lv_home /home
df -Th

# 重要:可以看到这时/home的格式是ext4,所以要修改/etc/fstab中的相关格式,不然无法开机;
# 或者重新格式化为xfs分区也行。
mkfs.xfs -f /dev/mapper/VolGroup-lv_home
mount -t xfs /dev/mapper/VolGroup-lv_home /home   #挂载分区到/home下,测试是否正常挂载

# 还原home下的文件
tar -zxvf /tmp/home.tar.gz -C /home

此时看/home分区只有20G了。


5、设置空闲空间
使用lvreduce指令用于减少LVM逻辑卷占用的空间大小。可能会删除逻辑卷上已有的数据,所以在操作前必须进行确认。记得输入 “y”

lvreduce -L 20G /dev/mapper/VolGroup-lv_home   #超过20G的部分会被切割掉(用于扩容/)
# 这里是指定VolGroup-lv_home的空间为20G,刚才只是把/home多余的空间标记为不使用,这一步开始真正分割lv,把/home的lv分割为刚刚设定的大小,只能比20G大,比20G小,多分割出来的地方数据会丢失(上面已经设定了为20G了)

注:lvreduce -L 20G的意思为设置当前文件系统为20G,如果lvreduce -l 20G是指从当前文件系统上减少20G (-L设定为指定大小,-l减小指定大小),使用lvreduce减小逻辑卷的大小。注意:减小后的大小不能小于文件的大小,否则会丢失数据。

可以使用vgdisplay命令等查看一下可以操作的大小。也可以是用fdisk -l或df -h命令查看设备详细信息。
vgdisplay 注:vgdisplay为显示LVM卷组的元数据信息,此时可以看到有free空间。


6.把闲置空间挂在到根目录下

lvextend -l +100%FREE  /dev/mapper/VolGroup-lv_root
# 把free空间全部分给/分区;注:如果使用**lvextend -L +283G**则为在文件系统上增加283G
# 此时会显示blocks从xxxx to xxxxx 说明扩容了(忘记截图了)。没有的话再执行以下命令
resize2fs -p /dev/mapper/VolGroup-lv_root   #ext*分区有效,重设磁盘大小
xfs_growfs /dev/mapper/VolGroup-lv_root     #xfs分区有效,自动扩大到最大可用空间(VG空闲多少就用掉多少)

# 相关命令
xfs_info /dev/mapper/VolGroup-lv_root       #查看lv的相关信息,能看到区块大小。
xfs_growfs /dev/mapper/VolGroup-lv_root -D 1986208  #扩容到指定区块大小

#xfs_growfs报错:提示结构需要清理 看下面xfs常用命令

7、扩容完成,检查调整结果
df -Th

OK扩容完成。

注意:一定要看看/etc/fstab 文件有没有相应的自动挂载参数,分区格式也要对应,不然开机会进入一个XXX模式,结果开不了机。



xfs相关常用命令
需要安装:

yum install xfsprogs -y
apt install xfsprogs -y

xfs_admin: 调整 xfs 文件系统的各种参数
xfs_copy: 拷贝 xfs 文件系统的内容到一个或多个目标系统(并行方式)
xfs_db: 调试或检测 xfs 文件系统(查看文件系统碎片等)
xfs_check: 检测 xfs 文件系统的完整性
xfs_bmap: 查看一个文件的块映射
xfs_repair: 尝试修复受损的 xfs 文件系统()
xfs_fsr: 碎片整理
xfs_quota: 管理 xfs 文件系统的磁盘配额
xfs_metadump: 将 xfs 文件系统的元数据 (metadata) 拷贝到一个文件中
xfs_mdrestore: 从一个文件中将元数据 (metadata) 恢复到 xfs 文件系统
xfs_growfs: 调整一个 xfs 文件系统大小(只能扩展)
xfs_freeze 暂停(-f)和恢复(-u)xfs 文件系统
xfs_logprint: 打印xfs文件系统的日志
xfs_mkfile: 创建xfs文件系统
xfs_info: 查询文件系统详细信息
xfs_ncheck: generate pathnames from i-numbers for XFS
xfs_rtcp: XFS实时拷贝命令
xfs_io: 调试xfs I/O路径

关于xfs_repair:
一般xfs_repair /dev/mapper/VolGroup-lv_root 就可以了,一定要先备份被修复分区的资料,可以tar备份
完整备份整个根分区命令:

tar -cvpzf /media/sda7/backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys --exclude=/media /

xfs_repair慎用-L参数,会丢失一些数据。具体参考:
http://www.mamicode.com/info-detail-669354.html
http://blog.chinaunix.net/uid-522675-id-4665059.html


其他命令

lvdisplay
lvremove -f /dev/vg_bogon/LogVol02  #移除该lv逻辑卷

如果无法修改可能是因为激活原因,激活VG就可以修改LV名了
lvchange -an /dev/vg_bogon/LogVol02

若不是用于扩容,只是用来做磁盘存储文件,则要挂载分区,开机自动挂载修改/etc/fastab文件。

如果改名的lv卷是启动分区的话,再修改/etc/grub.conf文件


备份还原

LVM中snapshot通过“写时复制”(copy on write) 来实现,即当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data);创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里。

  注意:采取CoW实现方式时,snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效。所以,非常重要的一点,一定要在snapshot的生命周期里,做完你需要做的事情。

备份前提:lvm快照所在的vg必须和备份源(被 备份的lv所在的vg)要是同一个,因此需要确认vg的剩余空间充足,若不足需扩展。一般剩余空间是备份源的10%左右就够用了。

虽然dd命令也可以备份还原,但是直接用在分区上不仅占空间而且速度慢,特别是业务繁忙时容易出问题;但是这里可以将快照和dd结合在一起使用。

扩容VG空间

# 先看看目前的情况
[root@centosmini34 ~]# lvs
  LV   VG Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home cl -wi-ao---- <45.12g
  root cl -wi-ao----  50.00g
  swap cl -wi-a-----  <3.88g
[root@centosmini34 ~]# vgs
  VG #PV #LV #SN Attr   VSize   VFree
  cl   1   3   0 wz--n- <99.00g 4.00m

这里可以看到,只有一个名称叫cl的vg;VFree空间只有4m,一般要有备份源的10%空间,这里加150G硬盘

# 分区
fdisk /dev/sdb
n          #新建
p          #设定为主分区
Partition number(1-4):1     #指定分区,即为之后创建的sdb1-4(主分区只能4个)
回车       #设定起始扇区
回车       #设定结束扇区(直接回车默认用全部空间创建,也可以输入+500M设定为500M)

t           #此时输入L能看到所有格式的代码,指定分区格式,8e为LVM
8e          # 设定为LVM
p           # 查看当前分区情况
w           # 写入硬盘

partprobe   # 重读分区表,可能会提示无法只读。。。。不用理会

# 创建pv
pvcreate /dev/sdb1
# 扩容现在的vg
vgextend cl /dev/sdb1

# 然后再看看情况
[root@centosmini34 ~]# lvs
  LV   VG Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home cl -wi-ao---- <45.12g
  root cl -wi-ao----  50.00g
  swap cl -wi-a-----  <3.88g
[root@centosmini34 ~]# vgs
  VG #PV #LV #SN Attr   VSize   VFree
  cl   2   3   0 wz--n- 248.99g 150.00g

这时可以看到,VFree空间有150G了,就是刚刚加的。

创建快照备份、恢复

# 创建快照
lvcreate -L 10GB -s -n lv_snapHome2018 /dev/cl/root
mount -o ro /dev/cl/lv_snapHome2018 /mnt/123/      #只读挂载

其中: 
-L 300G 表示此次创建快照大小(这个大小随意,如果小于备份源,就只快照部分数据,大于备份源就全部数据)
-l 100 把L改为l表示不以容量为计算单位,以PE数量为计算单位。100个PE的数据量。
-s 表示创建快照 
-n 指定新的快照卷名为lv_snapHome2018 
/dev/cl/root  要创建快照的逻辑卷(备份源)


# 恢复备份
文件数量不多可以用cp命令会更方便。
# 法一
mount -o ro /dev/cl/lv_snapHome2018 /mnt/123/
mount /dev/new_vg_name/new_lv_name /mnt/234/
cd /mnt/123/
tar -jcv -f /data/lv-backup.tar.bz2 *
tar -jxv -f /data/lv-backup.tar.bz2 -C /mnt/234/

# 法二
mount -o ro /dev/cl/lv_snapHome2018 /mnt/123/
mount /dev/new_vg_name/new_lv_name /mnt/234/
dump -0u -f /data/lv-backup.dump /mnt/123/
restore -rf /data/lv-backup.dump /mnt/234/

# 法三
#确保/data拥有足够的空间(要比备份源空间略大)
dd if=/dev/cl/lv_snapHome2018 of=/data/recover.img
dd if=/data/recover.img of=/dev/new_vg_name/new_new_name      #还原到新vg的lv里
rm /data/recover.img
lvremove /dev/cl/lv_snapHome2018                              #移除快照卷

注意:虽然snapshot小,但是通过snapshot备份出来的空间一定要足够大,因为它的数据和源lvm的数据一样大。

删除逻辑卷

# 当不需要备份了,或者其他原因需要删除卷
lvremove /dev/cl/lv_snapHome2018   #删除快照卷
vgreduce cl /dev/sdb1              #退出vg(如果一部分用于其他分区扩容是无法退出的)
pvremove /dev/sdb1                 #删除pv

参考:
https://blog.csdn.net/yanggd1987/article/details/50124997

https://www.cnblogs.com/kevingrace/p/5573508.html

(●゚ω゚●)