基本介绍
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详细信息,会显示PE数
VG #PV #LV #SN Attr VSize VFree
vg0 1 0 0 wz--n- 1.87G 1.87G

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             #格式化

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 / 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      #使用 "-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命令         针对的是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

LVM常规操作记录梳理(扩容/缩容/快照等)的更多相关文章

  1. LVM划分磁盘及扩容缩容

    lvm:logical volume monitor 逻辑卷管理器 作用: 采用lvm划分磁盘:磁盘空间不够时,方便扩展磁盘.物理卷加到卷组时被划分等大的pe,即pv是由众多pe构成.pe是卷组的最小 ...

  2. nginx缓存配置的操作记录梳理

    web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...

  3. Centos6.8下编译安装LAMP的操作记录梳理

    之前用的最多的web框架是LNMP,偶尔也会用到LAMP.接下来简单说下LAMP环境的部署记录,这里选择源码安装的方式: LAMP相关安装包下载地址:https://pan.baidu.com/s/1 ...

  4. map的自动扩容与手动缩容

    map的自动扩容与手动缩容 首先还是提出问题:扩容和缩容有什么用?为什么需要扩容和缩容? 在想解答这个问题之前,首先还是需要了解一下go语言中的map go语言中的map与Java中的map实现还是有 ...

  5. docker微服务部署之:七、Rancher进行微服务扩容和缩容

    docker微服务部署之:六.Rancher管理部署微服务 Rancher有两个特色用起来很方便,那就是扩容和缩容. 一.扩容前的准备工作 为了能直观的查看效果,需要修改下demo_article项目 ...

  6. k8s Pod 扩容和缩容

    在生产环境下,在面临服务需要扩容的场景时,可以使用Deployment/RC的Scale机制来实现.Kubernetes支持对Pod的手动扩容和自动扩容. 手动扩容缩容 通过执行扩容命令,对某个dep ...

  7. Mycat节点扩缩容及高可用集群方案

    数据迁移与扩容实践: 工具目前从 mycat1.6,准备工作:1.mycat 所在环境安装 mysql 客户端程序. 2.mycat 的 lib 目录下添加 mysql 的 jdbc 驱动包. 3.对 ...

  8. Netty 如何高效接收网络数据?一文聊透 ByteBuffer 动态自适应扩缩容机制

    本系列Netty源码解析文章基于 4.1.56.Final版本,公众号:bin的技术小屋 前文回顾 在前边的系列文章中,我们从内核如何收发网络数据开始以一个C10K的问题作为主线详细从内核角度阐述了网 ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容

    上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...

随机推荐

  1. [Demo_01] MapReduce 实现密码 Top10 统计

    0. 说明 通过 MapReduce 实现密码 Top10 统计 通过两次 MapReduce 实现 1. 流程图 2. 程序编写 密码 Top10 统计代码

  2. JUnit单元测试入门

    什么是单元测试 写了个类,要给别人用,会不会有bug?怎么办?测试一下. 用main方法测试好不好?不好! 不能一起运行! 大多数情况下需要人为的观察输出确定是否正确 为什么要进行单元测试 重用测试, ...

  3. log4.net 配置 - StringMatchFilter过滤器的使用

    当我们需要对log4输出的内容进行过滤时就需要使用到StringMatchFilter过滤器 它有两种工作模式: 1.字符串查找模式:只要消息内容包含指定字符串则符合过滤器规则. 2.正则表达式模式: ...

  4. FileInputStream与FileOutputStream学习笔记

    这是我的第一篇博客,纪念一下吧! 最近学习了IO流,想着学长说的话,就突然想要写写博客了,别管这是什么逻辑了,进入正题. 一.FileInputStream 1.概念 FileInputStream是 ...

  5. Beta冲刺(1/5)(麻瓜制造者)

    今天小组进行了第一次冲刺,虽然新组员还没有确定. 今日完成任务 邓弘立:修改登录代码 李佳铭: 用户收藏UI代码编写 江郑: 进行了后台管理员界面ui的设计和环境的搭建 刘双玉:后台github仓库建 ...

  6. Linux(CentOS)上配置 SFTP(附解决Write failed: Broken pipe Couldn't read packet: Connection reset by peer)

    #创建sftp组: groupadd sftp #创建一个用户sftpuser: useradd -g sftp -s /bin/false sftpuser #提示: /etc/group 文件包含 ...

  7. 解决 docker ulimit open file 过少的问题

    解决方法: ExecStart=/usr/bin/dockerd -- -- -- -- --insecure-registry= --dns --dns-opt timeout: --dns-opt ...

  8. Qt 编程指南 1 从Hello World开始

    1 简单的hello QT 注意项目和路径不要包含任何中文字符,特殊字符,空格. 只能有英文,数字,下划线,且不能数字开头. //helloqt.cpp #include <QtWidgets/ ...

  9. select * 和select 所有字段的区别

    文章取自http://blog.csdn.net/u014305991/article/details/44964171 MySQL 5.1.37 表记录数41,547,002,即4000w行 使用远 ...

  10. springcoud feign超时的问题

    配置 #开启超时控制 打开feign-hystix feign.hystrix.enabled=true ribbon.ReadTimeout= ribbon.ConnectTimeout= #如果e ...