Linux常用命令之--逻辑卷

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux常用命令之--逻辑卷相关的知识,希望对你有一定的参考价值。

参考技术A

每个Linux使用者在安装Linux时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值。如果估计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统、清除硬盘、重新对硬盘分区,然后恢复数据到新分区
逻辑卷管理器LVM(Logicl Volume Manager),通过使用逻辑卷管理器对硬盘存储设备进行管理,可以实现硬盘空间的动态划分和调整,而且可以将零碎的空间进行整合

• 物理卷(PV-Physical Volume)
物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘
• 卷组(VG-Volumne Group)
卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组
• 逻辑卷(LV-Logical Volume)
逻辑卷建立在卷组之上,卷中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组

逻辑卷管理器和是主分区还是逻辑分区没有关系

vgdisplay 里的PE Size是指逻辑卷的最小单位。假设PE Size是4M;比如我向里写东西。我一个文件可能只占用1B的容量,但是我先占上4M,其他的也是,不足4M我也先占上4M。等到每个块都用了,但是每个块都有剩余位置的时候,会把每个区的剩余位置都拼凑一下,以供使用。但是只要还有没被占用的块,都不会使用用过的块。逻辑卷大小为这个PE Size的整数倍

处在它所在的文件夹的时候是无法卸载的

我现在想创建两个卷组,vg1和vg2。sdc1和sdc2给vg1,sdc3和sdc4给vg2

修改卷组属性,用来设置卷组是否处于活动状态,活跃状态的时候卷组无法被删除,非活动状态的卷组才能被删除掉。VG Status:resizable是表示可被调整大小的状态。lvremove时有可能因为逻辑卷里东西过多导致删除逻辑卷的时候假删除,即逻辑卷没了,但是里面东西还在,这时卷组觉得它里面还有东西,就会处于活跃状态,这时需要↓

接下来resize1要用来做块(逻辑卷)的放大,resize2要用来做块的缩小。设备放大时不论是挂载状态下或非挂载状态下都可以做放大,即在线放大。但是缩小的话设备要是非挂载的状态,即离线缩小

df -lh

发现size大小变小了。之前给的resize1是800M,resize2是784M,这里的大小表示文件系统(filesystem)大小(即这个设备能存多少东西),剩下的容量mkfs,挂载的时候都会损耗一定的容量大小。文件系统大小不会随着块的变大或缩小而改变,需要手动才能改变文件系统大小。
放大要先放大块的大小,再放大文件系统的大小

lvresize -L +200M /dev/vg3/resize1 放大逻辑卷
如果不带+,会出现warning,+时是在原有基础之上加200M,不加+的话就是将现有逻辑卷的大小调整成200M。如果比之前设置的逻辑卷小的话就证明是要将其缩小,会造成数据丢失
resize2fs /dev/vg3/resize1 调整文件系统大小,但是不会管你到底是放大还是缩小,就是将文件系统调整到它可以变大的最大程度
df -lh 看设备容量变大了

缩小的时候要先将文件系统缩小,再缩小逻辑卷的大小

umount /mnt/rs2/
resize2fs /dev/vg3/resize2 700M
出现提示 [请先输入e2fsck -f /dev/vg3/resize2 命令],将处于多个块当中的内容整理到一起,以便进行缩小。但是也不能百分百保证数据不丢失
e2fsck -f /dev/vg3/resize2
resize2fs /dev/vg3/resize2 700M
lvresize -L 700M /dev/vg3/resize2
mount /dev/vg3/resize2 /mnt/rs2/ 重新挂载回来
df -lh 看系统里设备和文件系统挂载的使用情况

发现size变小了,缩小成功

Linux下非逻辑卷扩容之创建逻辑卷pvcreate是否会损坏原数据测试

导语

我们都知道使用lv逻辑卷可以方便的扩容。
但是当原盘不是逻辑卷且其上有数据的时候,如何扩容呢?
因为扩容只能是磁盘type为逻辑卷lvm才可以。
那么将有数据的盘直接pvcreate为虚拟卷lvm以后,是否对数据有损害?
我们今天就来测试一下。

添加硬盘

  • 虚拟机添加一个5G的磁盘作为实验用

查看当前分区情况

lsblk

  • 可以看到新加的5G磁盘sdb已经可以用了
[root@C8-196 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  200G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0  199G  0 part 
  ├─cl-root 253:0    0   70G  0 lvm  /
  ├─cl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─cl-home 253:2    0  127G  0 lvm  /home
sdb           8:16   0    5G  0 disk 

使用传统方式分区

fdisk /dev/sdb

  • 创建一个主分区
[root@C8-196 ~]# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.32.1).
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.
Created a new DOS disklabel with disk identifier 0x53b270c9.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-10485759, default 2048): 
Last sector, +sectors or +sizeK,M,G,T,P (2048-10485759, default 10485759): 

Created a new partition 1 of type 'Linux' and of size 5 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
  • 再次查看分区情况,sdb被分成了一个主分区,TYPE为part,大小为5G
[root@C8-196 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  200G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0  199G  0 part 
  ├─cl-root 253:0    0   70G  0 lvm  /
  ├─cl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─cl-home 253:2    0  127G  0 lvm  /home
sdb           8:16   0    5G  0 disk 
└─sdb1        8:17   0    5G  0 part 

在新创建的分区上创建文件系统

  • 使用xfs格式化sdb1
[root@C8-196 ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=327616 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=1310464, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

创建挂载点并挂载新建分区

  • 在根下创建目录data并挂载新分区到这个目录上
[root@C8-196 ~]# mkdir -v /data&& mount /dev/sdb1 /data&&df -Th
mkdir: created directory '/data'
Filesystem          Type      Size  Used Avail Use% Mounted on
devtmpfs            devtmpfs  876M     0  876M   0% /dev
tmpfs               tmpfs     896M     0  896M   0% /dev/shm
tmpfs               tmpfs     896M   17M  879M   2% /run
tmpfs               tmpfs     896M     0  896M   0% /sys/fs/cgroup
/dev/mapper/cl-root xfs        70G  2.3G   68G   4% /
/dev/mapper/cl-home xfs       127G  939M  126G   1% /home
/dev/sda1           xfs      1014M  197M  818M  20% /boot
tmpfs               tmpfs     180M     0  180M   0% /run/user/0
/dev/sdb1           xfs       5.0G   68M  5.0G   2% /data

创建测试文件在新建磁盘分区上

  • 写100个文件到磁盘上做数据测试
    for i in 1..100;do $(time dd if=/dev/zero of=/data/testw$i.db bs=4k count=10000);done&&ll /data&&df -Th
[root@C8-196 ~]# for i in 1..100;do $(time dd if=/dev/zero of=/data/testw$i.db bs=4k count=10000);done&&ll /data&&df -Th
10000+0 records in
10000+0 records out
40960000 bytes (41 MB, 39 MiB) copied, 0.0162844 s, 2.5 GB/s

## 中间的省略……
real	0m0.016s
user	0m0.002s
sys	0m0.014s
10000+0 records in
10000+0 records out
40960000 bytes (41 MB, 39 MiB) copied, 0.0153671 s, 2.7 GB/s

real	0m0.017s
user	0m0.001s
sys	0m0.015s
total 4000000
## 磁盘中已经有写入的文件了
-rw-r--r-- 1 root root 40960000 Mar  2 21:15 testw100.db
-rw-r--r-- 1 root root 40960000 Mar  2 21:15 testw10.db
-rw-r--r-- 1 root root 40960000 Mar  2 21:15 testw11.db
## …… 中间的省略
-rw-r--r-- 1 root root 40960000 Mar  2 21:15 testw99.db
-rw-r--r-- 1 root root 40960000 Mar  2 21:15 testw9.db
## 分区已经占了78%了
Filesystem          Type      Size  Used Avail Use% Mounted on
devtmpfs            devtmpfs  876M     0  876M   0% /dev
tmpfs               tmpfs     896M     0  896M   0% /dev/shm
tmpfs               tmpfs     896M   17M  879M   2% /run
tmpfs               tmpfs     896M     0  896M   0% /sys/fs/cgroup
/dev/mapper/cl-root xfs        70G  2.3G   68G   4% /
/dev/mapper/cl-home xfs       127G  939M  126G   1% /home
/dev/sda1           xfs      1014M  197M  818M  20% /boot
tmpfs               tmpfs     180M     0  180M   0% /run/user/0
/dev/sdb1           xfs       5.0G  3.9G  1.2G  78% /data

直接对有数据的分区做pvcreate

  • 很显然,处于安全考虑,已经mount的分区不能直接pvcreate
[root@C8-196 ~]# 
[root@C8-196 ~]# type pvcreate 
pvcreate is /usr/sbin/pvcreate
[root@C8-196 ~]# pvcreate /dev/sdb1
  Can't open /dev/sdb1 exclusively.  Mounted filesystem?
  Can't open /dev/sdb1 exclusively.  Mounted filesystem?

umount以后再次pvcreate

  • umount掉以后做pvcreate居然成功了,虽然提示了有xfs文件系统在分区上
[root@C8-196 ~]# umount /dev/sdb1
[root@C8-196 ~]# pvcreate /dev/sdb1
WARNING: xfs signature detected on /dev/sdb1 at offset 0. Wipe it? [y/n]: y
  Wiping xfs signature on /dev/sdb1.
  Physical volume "/dev/sdb1" successfully created.
  • 但是感觉pvcreate已经摧毁了已有的文件系统

创建逻辑卷

[root@C8-196 ~]# vgcreate vg_data /dev/sdb1
  Volume group "vg_data" successfully created
[root@C8-196 ~]# lvcreate -l 100%FREE -n data_lv vg_data
  Logical volume "data_lv" created.
[root@C8-196 ~]# pvs&&vgs&&lvs
  PV         VG      Fmt  Attr PSize    PFree
  /dev/sda2  cl      lvm2 a--  <199.00g    0 
  /dev/sdb1  vg_data lvm2 a--    <5.00g    0 
  VG      #PV #LV #SN Attr   VSize    VFree
  cl        1   3   0 wz--n- <199.00g    0 
  vg_data   1   1   0 wz--n-   <5.00g    0 
  LV      VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home    cl      -wi-ao---- 126.96g                                                    
  root    cl      -wi-ao----  70.00g                                                    
  swap    cl      -wi-ao----   2.03g                                                    
  data_lv vg_data -wi-a-----  <5.00g     

再次尝试挂载/dev/sdb1

  • 很显然已经挂载不上了
[root@C8-196 ~]# mount /dev/sdb1 /data
mount: /data: unknown filesystem type 'LVM2_member'.

尝试直接挂载新创建的lvm逻辑卷

  • 很显然,没有文件系统是挂在不上的
[root@C8-196 ~]# ll /dev/mapper/vg_data-data_lv 
lrwxrwxrwx 1 root root 7 Mar  2 21:28 /dev/mapper/vg_data-data_lv -> ../dm-3
[root@C8-196 ~]# ll /dev/vg_data/
total 0
lrwxrwxrwx 1 root root 7 Mar  2 21:28 data_lv -> ../dm-3
[root@C8-196 ~]# mount /dev/mapper/vg_data-data_lv /data
mount: /data: wrong fs type, bad option, bad superblock on /dev/mapper/vg_data-data_lv, missing codepage or helper program, or other error.

[root@C8-196 ~]# mount /dev/vg_data/data_lv /data
mount: /data: wrong fs type, bad option, bad superblock on /dev/mapper/vg_data-data_lv, missing codepage or helper program, or other error.

在新逻辑卷上创建文件系统

  • 使用xfs格式化新创建的逻辑卷,格式化嘛,你懂的
[root@C8-196 ~]# mkfs.xfs /dev/mapper/vg_data-data_lv 
meta-data=/dev/mapper/vg_data-data_lv isize=512    agcount=4, agsize=327424 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=1309696, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

挂载逻辑卷到曾经的data目录

mount /dev/mapper/vg_data-data_lv /data

[root@C8-196 ~]# mount /dev/mapper/vg_data-data_lv /data
[root@C8-196 ~]# df -Th
Filesystem                  Type      Size  Used Avail Use% Mounted on
devtmpfs                    devtmpfs  876M     0  876M   0% /dev
tmpfs                       tmpfs     896M     0  896M   0% /dev/shm
tmpfs                       tmpfs     896M   17M  879M   2% /run
tmpfs                       tmpfs     896M     0  896M   0% /sys/fs/cgroup
/dev/mapper/cl-root         xfs        70G  2.3G   68G   4% /
/dev/mapper/cl-home         xfs       127G  939M  126G   1% /home
/dev/sda1                   xfs      1014M  197M  818M  20% /boot
tmpfs                       tmpfs     180M     0  180M   0% /run/user/0
/dev/mapper/vg_data-data_lv xfs       5.0G   68M  5.0G   2% /data

查看目录下是否有文件

  • 见证奇迹的时刻到了!
/dev/mapper/vg_data-data_lv xfs       5.0G   68M  5.0G   2% /data
[root@C8-196 ~]# ll /data
total 0
  • 很显然,毛线都没有了。
  • 这目录下要是有生产数据,你就可以走人了!
  • 又是一种删库跑路的新方法!

结论

  • 使用pvcreate对已经挂载的分区不能直接创建pv
  • 使用pvcreate对有数据且已解挂载的分区可以直接创建pv,会提示文件系统存在

使用pvcreate对有数据的分区创建pv会摧毁文件系统,文件就~

使用pvcreate对有数据的分区创建pv会摧毁文件系统,文件就~

使用pvcreate对有数据的分区创建pv会摧毁文件系统,文件就~

以上是关于Linux常用命令之--逻辑卷的主要内容,如果未能解决你的问题,请参考以下文章

第十三天(linux常用的基础命令 )

linux创建逻辑卷(lv)并挂载

Linux命令:MySQL系列之十四--MySQL备份与还原(LVM逻辑卷)

linux 系统中部署逻辑卷(LVM)

lvm基本知识与常用命令

Linux系统运维学习---常用命令集