LVM

LVM(Logical Volume Manager),逻辑卷管理器。一种高级文件系统管理方式,它可以动态扩展文件系统。
 
LVM 的示意图如下所示:
 
partition:磁盘分区。
PV:Physical Volume,实体卷,由磁盘分区生成。
VG:Volume Group,卷组,由多个 PV 组成。
LV:Logical Volume,逻辑卷,从 VG 中划分出来。LV 可以制成文件系统再挂载,从而为用户所用。
 
之所以可以动态扩展文件系统,主要是有 PE 这个东西,PE(Physical Extend,实体扩展块)是 LVM 最小的存储单位,类似于文件系统的 block:
 
扩展 LV 的时候将 VG 中不用的 PE 加入到 LV 中。同样的,缩小 LV 的时候将 LV 中不用的 PE 给移出去。
 
制作 LV 流程:
1. 由于测试机空间不够,分区分不出来,这里用 dd 命令将文件挂载到 loop 设备以实现文件的分区,效果是一样一样的。
[root@test:/home/robot/test]
# dd if=/dev/zero of=/home/robot/test/lvm1 bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 0.474638 s, 1.1 GB/s
[root@test:/home/robot/test]
# dd if=/dev/zero of=/home/robot/test/lvm2 bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 0.49283 s, 1.1 GB/s
[root@test:/home/robot/test]
# dd if=/dev/zero of=/home/robot/test/lvm3 bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 0.48691 s, 1.1 GB/s
[root@test:/home/robot/test]
#
[root@test:/home/robot/test]
# losetup /dev/loop1 /home/robot/test/lvm1
[root@test:/home/robot/test]
# losetup /dev/loop2 /home/robot/test/lvm2
[root@test:/home/robot/test]
# losetup /dev/loop3 /home/robot/test/lvm3
[root@test:/home/robot/test]
# ll
total 1572876
-rw-r--r-- 1 root root 536870912 Mar 16 12:28 lvm1
-rw-r--r-- 1 root root 536870912 Mar 16 12:28 lvm2
-rw-r--r-- 1 root root 536870912 Mar 16 12:28 lvm3
三个分区 /dev/loop1 /dev/loop2 和 /dev/loop3 制作完毕!
 
2. pvcreate 命令将分区转成 PV。
[root@test:/home/robot/test]
# pvdisplay
[root@test:/home/robot/test]
# pvcreate /dev/loop1
Physical volume "/dev/loop1" successfully created.
[root@test:/home/robot/test]
# pvcreate /dev/loop2
Physical volume "/dev/loop2" successfully created.
[root@test:/home/robot/test]
# pvcreate /dev/loop3
Physical volume "/dev/loop3" successfully created.
[root@test:/home/robot/test]
# pvdisplay
"/dev/loop3" is a new physical volume of "512.00 MiB"
--- NEW Physical volume ---
PV Name /dev/loop3
VG Name
PV Size 512.00 MiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID PpWfyJ-1lSY-iNZY-MU0K-wQfz-zrh0-n9YnCF "/dev/loop1" is a new physical volume of "512.00 MiB"
--- NEW Physical volume ---
PV Name /dev/loop1
VG Name
PV Size 512.00 MiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 9cUDS8-9VGN-cvnS-8tCF-prIy-eRYS-Y83es9 "/dev/loop2" is a new physical volume of "512.00 MiB"
--- NEW Physical volume ---
PV Name /dev/loop2
VG Name
PV Size 512.00 MiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID fi632i-W46C-dvfw-9YCt-Z08g-rUZB-Hmakox
3. vgcreate 命令将 PV 转成 VG。 
[root@test:/home/robot/test]
# vgdisplay
[root@test:/home/robot/test]
# vgcreate -s 4M lianhuasheng /dev/loop{1,2,3}
Volume group "lianhuasheng" successfully created
[root@test:/home/robot/test]
# vgdisplay
--- Volume group ---
VG Name lianhuasheng
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size <1.49 GiB
PE Size 4.00 MiB
Total PE 381
Alloc PE / Size 0 / 0
Free PE / Size 381 / <1.49 GiB
VG UUID Y4l3Ad-bdIJ-7V5A-3FI1-kR74-QwDg-DbRdJ0
 
4. lvreate 命令将 VG 转成 LV。
[root@test:/home/robot/test]
# lvcreate -l 50 -n lv1 lianhuasheng
Logical volume "lv1" created.
[root@test:/home/robot/test]
# lvdisplay
--- Logical volume ---
LV Path /dev/lianhuasheng/lv1
LV Name lv1
VG Name lianhuasheng
LV UUID jQU1SV-tIzt-SRet-L5XK-rk1K-YC3h-o7YT7Q
LV Write Access read/write
LV Creation host, time test, 2020-03-16 22:27:14 +0800
LV Status available
# open 0
LV Size 200.00 MiB
Current LE 50
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:8
每个 PE 的大小是 4M,lv1 有 50 个 PE,所以 LV Size 是 200M。
 
5. 将 lv1 制成文件系统,挂载:
[root@test:/home/robot/test]
# mkfs -t ext4 /dev/lianhuasheng/lv1
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 204800 1k blocks and 51200 inodes
Filesystem UUID: 39a25411-b81c-42c0-b1d4-cb7dd1119e87
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729 Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done [root@test:/home/robot/test]
# ls
lvm1 lvm2 lvm3
[root@test:/home/robot/test]
# mkdir mountPoint
[root@test:/home/robot/test]
# mount /dev/lianhuasheng/lv1 /home/robot/test/mountPoint/
[root@test:/home/robot/test]
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 40G 8.9G 29G 24% /
/dev/mapper/lianhuasheng-lv1 ext4 190M 1.6M 175M 1% /home/robot/test/mountPoint
注意 lv 挂载之后的文件系统名字变成了 /dev/mapper/<vg_name>-<lv_name> 的形式。并且,可以发现文件系统的 Size 成了 190M,而分区的 Size 是 200M,说明文件系统自身也需要占用磁盘空间。
 
即然 LVM 是动态可扩展的(LVM 最大的优点),那么现在想给 lv 在增加 200M 空间怎么做呢?
可以通过 lvresize 命令扩展 lv:
[root@test:/home/robot/test/mountPoint]
# lvdisplay
--- Logical volume ---
LV Path /dev/lianhuasheng/lv1
LV Name lv1
VG Name lianhuasheng
LV UUID jQU1SV-tIzt-SRet-L5XK-rk1K-YC3h-o7YT7Q
LV Write Access read/write
LV Creation host, time test, 2020-03-16 22:27:14 +0800
LV Status available
# open 1
LV Size 200.00 MiB
Current LE 50
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:8
[root@test:/home/robot/test/mountPoint]
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 40G 8.9G 29G 24% /
/dev/mapper/lianhuasheng-lv1 ext4 190M 1.6M 175M 1% /home/robot/test/mountPoint
[root@test:/home/robot/test/mountPoint]
# touch test.log
[root@test:/home/robot/test/mountPoint]
# ll -hi
total 12K
11 drwx------ 2 root root 12K Mar 16 22:31 lost+found
12 -rw-r--r-- 1 root root 0 Mar 16 22:43 test.log [root@test:/home/robot/test/mountPoint]
# lvresize -l +50 /dev/lianhuasheng/lv1 [root@test:/home/robot/test/mountPoint]
# lvdisplay
--- Logical volume ---
LV Path /dev/lianhuasheng/lv1
LV Name lv1
VG Name lianhuasheng
LV UUID jQU1SV-tIzt-SRet-L5XK-rk1K-YC3h-o7YT7Q
LV Write Access read/write
LV Creation host, time test, 2020-03-16 22:27:14 +0800
LV Status available
# open 1
LV Size 400.00 MiB
Current LE 100
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:8
[root@test:/home/robot/test/mountPoint]
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 40G 8.9G 29G 24% /
/dev/mapper/lianhuasheng-lv1 ext4 190M 1.6M 175M 1% /home/robot/test/mountPoint

[root@test:/home/robot/test/mountPoint]
# resize2fs /dev/mapper/lianhuasheng-lv1
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/mapper/lianhuasheng-lv1 is mounted on /home/robot/test/mountPoint; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 4
The filesystem on /dev/mapper/lianhuasheng-lv1 is now 409600 (1k) blocks long. [root@test:/home/robot/test/mountPoint]
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 40G 8.9G 29G 24% /
/dev/mapper/lianhuasheng-lv1 ext4 384M 2.3M 360M 1% /home/robot/test/mountPoint
[root@test:/home/robot/test/mountPoint]
# ll -hi
total 12K
11 drwx------ 2 root root 12K Mar 16 22:31 lost+found
12 -rw-r--r-- 1 root root 0 Mar 16 22:43 test.log
通过 lvextend 将文件系统在线扩展,不需要 umount (需要用 resieze2fs 命令更新文件系统),并且不影响原始文件。
 

卸载 LVM

1. umount 文件系统;
2. lvremove 删除 lv;
3. vgremove 删除 VG;
4. pvremove 删除 PV;
[root@test:/home/robot/test/mountPoint]
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 40G 8.9G 29G 24% /
/dev/mapper/lianhuasheng-lv1 ext4 384M 2.3M 360M 1% /home/robot/test/mountPoint
[root@test:/home/robot/test/mountPoint]
# cd ..
[root@test:/home/robot/test]
# umount /home/robot/test/mountPoint/
[root@test:/home/robot/test]
# lvremove /dev/lianhuasheng/lv1
Do you really want to remove active logical volume lianhuasheng/lv1? [y/n]: y
Logical volume "lv1" successfully removed
[root@test:/home/robot/test]
# vgremove lianhuasheng
Volume group "lianhuasheng" successfully removed
[root@test:/home/robot/test]
# pvremove /dev/loop{1,2,3}
Labels on physical volume "/dev/loop1" successfully wiped.
Labels on physical volume "/dev/loop2" successfully wiped.
Labels on physical volume "/dev/loop3" successfully wiped.
[root@test:/home/robot/test]
# ll -hi
total 1.4G
656227 -rw-r--r-- 1 root root 512M Mar 16 22:58 lvm1
656229 -rw-r--r-- 1 root root 512M Mar 16 22:58 lvm2
656230 -rw-r--r-- 1 root root 512M Mar 16 22:58 lvm3
[root@test:/home/robot/test]
# rm -rf lvm{1,2,3}
[root@test:/home/robot/test]
# ll -hi
 

LVM 命令

PV
pvcreate                创建实体 partition 为 PV
pvscan 搜寻系统磁盘是否有 PV
pvdisplay 显示 PV 状态
pvremove 移除 PV 移除,partition 不具有 PV 属性
 
VG
vgcreate               创建 VG
vgscan 搜寻系统是否有 VG
vgdisplay 显示 VG 状态
vgextend 在 VG 内添加额外的 PV
vgreduce 在 VG 内移除 PV
vgchange 配置 VG 是否启动 (active)
vgremove 移除 VG
 
LV
lvcreate              创建 LV
lvscan 查询系统是否有 LV
lvdisplay 显示 LV 状态
lvextend 扩展 LV 容量
lvreduce 缩小 LV 容量
lvremove 删除 LV
lvresize 调整 LV 容量大小
 
(完)
 

每天学五分钟 Liunx 101 | 存储篇:LVM的更多相关文章

  1. 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange

    如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...

  2. 五分钟学Java:如何才能学好Java Web里这么多的技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  3. 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画

    原文:零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形 ...

  4. 《sed的流艺术之一》-linux命令五分钟系列之二十一

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  5. 五分钟搭建一个基于BERT的NER模型

    BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义.预训练的(pre-train)的语言模型通过无监督的学 ...

  6. GC算法精解(五分钟让你彻底明白标记/清除算法)

    GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底 ...

  7. zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》

    本篇文章阅读时间5分钟左右 点击看<每日五分钟搞定大数据>完整思维导图   zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同 ...

  8. 「每日五分钟,玩转JVM」:线程共享区

    前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计 ...

  9. Python专题——五分钟带你了解map、reduce和filter

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题第6篇文章,给大家介绍的是Python当中三个非常神奇的方法:map.reduce和filter. 不知道大家看到ma ...

  10. 一门能让你五分钟学会的语言-Brainfuck

    看到标题,不出意外的话,你肯定开始骂我了:**标题党,什么编程语言五分钟就能学会? 其实我本来也是不相信的,但是学过了才知道这是真的. 1.Brainfuck 看到这个小标题,不要误会,我没有骂人. ...

随机推荐

  1. Nginx服务器常用参数设置

    Nginx作为一个高性能的Web服务器和反向代理,它的性能可以通过调整底层操作系统的参数来进一步优化.以下是一些常见的操作系统级别的调整,通常针对Linux系统: File Descriptors L ...

  2. 华企盾DSC客户端服务无法启动一直处于启动停止状态

    该问题有两种情况: 1.客户端安装有问题,5097目录缺少文件,解决方法见下面详细信息 2.客户端本地数据库出现问题,需要卸载客户端以及删除对应的本地数据库备份文件(解决方法见下面详细信息) 3.由于 ...

  3. SpringCloud Gateway 网关

    SpringCloud Gateway 网关 spring: cloud: gateway: routes: - id: after_route uri: https://example.org pr ...

  4. 我的大数据之路 - 基于HANA构建实时方案的历程

    产品内部前期有一个共识,依据业务要求的时效性来选择技术平台,即: 实时类业务,时效性小于2小时,则使用HANA构建. 离线类业务,时效性大于2小时,则使用大数据平台构建. 经过五月.六月两月的努力,离 ...

  5. java生成企业公章图片源代码

    企业公章图片在电子签章业务中应用广泛,在电子签章应用过程中首先需要生成公章图片,然后再使用公章图片结合数字签名技术完成电子签,这样就实现了从可视化到不可篡改的数字化电子签章功能,以下是企业公章图片生成 ...

  6. Java 并发编程(七)线程池

    任务的创建与执行 在多线程的编程环境中,理想的情况是每个任务之间都存在理想的边界,各个任务之间相互独立,这样才能够享受到并发带来的明显的性能提升,并且,由于每个任务之间如果都是独立的,对于并发的处理也 ...

  7. 使用Winform开发自定义用户控件,以及实现相关自定义事件的处理

    在我们一些非标的用户界面中,我们往往需要自定义用户控件界面,从而实现不同的内容展示和处理规则,本篇内容介绍使用Winform开发自定义用户控件,以及实现相关自定义事件的处理. 1.用户控件的界面分析 ...

  8. Mybatis源码4 Cache的实现和其原理

    Mybatis CachingExecutor, 二级缓存,缓存的实现 一丶二级缓存概述 上一章节,我们知道mybaits在构造SqlSession的时候,需要让SqlSession持有一个执行器,如 ...

  9. 【“互联网+”大赛华为云赛道】CloudIDE命题攻略:明确业务场景,快速开发插件

    摘要:基于华为云CloudIDE和插件开发框架自行设计并开发插件. IDE是每个开发人员必备的生产工具,一款好的IDE + 插件的组合,除了帮助开发者把编写代码.组织项目.编译运行放在一个环境中外,还 ...

  10. WebKit三件套(1):WebKit之WebCore篇

    导语: Chrome浏览器的代码量其实是非常庞大的,要想对其有深入的理解,仅仅编译编译调试调试,是很难深入下去的.让我们还是从其主要部分如多进程管理通信.WebKit.V8.Skia.WinHttp. ...