quota,raid和lvm

前言

在本篇博客主要讲解一些磁盘管理的知识。包括硬盘配额、软磁盘阵列和逻辑卷管理。

quota

linux系统是一个多人多任务操作系统,会出现多人使用一个磁盘的情况,如果少数几个用户将大部分的硬盘空间使用掉,那么其他用户的使用空间就会大大减小,因此就需要限制用户对磁盘的使用,妥善的分配系统资源。例如/home下有10个用户,总空间大小为10G,那么每个人用户平均使用的最大容量为1G,但是有的用户在home目录下放置了许许多多的大文件,导致占用了大部分空间,影响了其他用户的磁盘使用空间,那么想要磁盘空间能公平使用,就可以使用quota限制用户的磁盘使用。

quota一般用途

  1. 针对www服务器,限制每个人网页空间的容量限制;
  2. 针对mail服务器,限制每个人的邮件空间限制;
  3. 针对file服务器,限制每人最大的网络硬盘空间。

在linux系统上一般会有的设置为:

  1. 限制某一群组能使用的最大磁盘配额;
  2. 限制某一用户的最大磁盘配额;
  3. 限制某一目录的最大磁盘配额;

在xfs文件系统中quota是整合到文件系统中的,因此需要在fstab进行设置开启quota。而其他的文件系统(例如ext系列文件系统)的quota是通过外挂程序实现的,因此quota查询磁盘使用相较du等命令快速,du需要重新计算目录下磁盘使用情况,而xfs直接通过xfs_quota就能查询到相关信息。通过quota,系统管理员可以直接管理磁盘的使用情况。

quota使用存在的限制

quota虽然管理磁盘空间方便,但是还是存在一定的局限性:

  1. EXT家族文件系统只能支持整个文件系统的quota。在设计quota的使用只能针对整个文件系统进行设计,无法对单个目录进行设计。但是xfs已经支持使用project模式对目录的磁盘配额进行设计。

  2. 核心必须支持quota。要使用quota还需要linux系统核心支持quota,查询核心是否支持可以通过命令dmesg | grep quota查询。

  3. 只对一般用户有效。不能对root用户设置quota。

  4. 若启用了SELinux,并非对所有的目录都能设置quota。目前的CentOS系统内核一般预设启动SELinux,在预设情况下只能对/home设置quota。

    PS:设置quota需要注意使用的文件系统。

quota限制设定项目

quota对于XFS文件系统所能做的限制分为以下几种:

  1. 分别针对使用者、群组和个别目录进行限制,一般是针对磁盘使用率进行限制。
  2. 容量限制或者档案数量限制,也就是限制node的数量和限制inode的数量。
  3. 警告值(soft)和使用阈值(hard)限制。当使用量低于警告值时正常使用,当高于正常值时,每次登录系统都会收到系统警告,但使用量到达阈值则不能再使用磁盘。
  4. 倒数宽限日期(grace time):当到达警告之后,且磁盘使用量小于阈值时,则开始警告,并且开始倒计时,如果减小磁盘使用量到警告值以下时,则取消倒计时,如果倒计时结束,则将警告值设置为使用阈值

quota的使用示例

在这个实例中新建5个用户,分别名为quota1、quota2、quota3、quota4和quota5,密码为password,同时都属于quotagroup,每个用户可以最多可以使用300MB,警告值为200MB,同时,由于/home为单独分区,最大为2GB,同时也有其他用户,为了确保其使用空间则限制群组所使用的空间最大为1GB。最后设置警告倒计时为两周,超时则将警告值设置为阈值。

为了使之间共享文件,创建一个共享文件夹,最大为500MB。

创建用户及共享文件夹

#!/bin/bash
# name: create5users.sh
# create 5 users for testing.
# author:
# qzt
# create testing env
# bash create5users.sh
# clear testing env
# bash create5users.sh clear
# history:
# 2019/12/23 qzt create the script.

# clear
if [[ -n $1 ]];then
        for username in quota1 quota2 quota3 quota4 quota5
        do
                userdel -r $username
                echo $username' delete'
        done
        rm -rf /home/quota
        echo 'clear share dir.'
        groupdel quotagroup
        echo 'clear work group'
        exit 0
fi

# add
groupadd quotagroup
for username in quota1 quota2 quota3 quota4 quota5
do
        useradd -g quotagroup $username
        echo "password" | passwd --stdin $username
done
mkdir /home/quota
chgrp quotagroup /home/quota
chmod 2770 /home/quota

运行bash create5users.sh脚本执行结果如下图:

create5users.sh脚本运行结果

开启分区quota功能(user和group的quota)

首先查看/home目录是不是属于单独的分区,运行指令df -hT /home,运行的结果如下:

查询/home是否为单独的分区

确认是单独的分区之后,就可以开启quota功能,就xfs文件系统来说,在系统运行挂载磁盘时已经宣告quota功能,不能通过remount来重启quota功能,所以通过修改/etc/fstab配置文件,使得xfs文件系统在挂载时就已经开启了quota功能(PS:修改/etc/fstab配置文件需要使用)。在挂载/home目录的选项中添加usrquota,grpquota选项。

挂载/home时添加usrquota和grpquota选项

重启系统或者卸载/home分区之后重新挂载分区。通过mount命令查看是否生效。

查看quota是否开启成功

进一步验证quota是否正确开启,使用指令xfs_quota -x -c 'print'显示quota挂载功能开启情况。

进一步验证quota开启情况

quota的基本使用
quota基本查询
xfs_quota -x -c '指令' [挂载点]
参数讲解
-x:专家模式,后续才能接-c并输入指令;
-c:后面添加指令;
指令:
    print:简单列出本系统种文件系统的参数信息,一般可用于检测quota是否正确开启;
    df:与系统中的df一样的功能,可以加-b(block),-i(inode),-h(单位)等;
    report:列出目前的quota项目,有-ugr(usr,group,project)以及-bi等资料;
    state:说明目前支援quota的档案系统的咨讯,有没有相关启动项目等。

查看/home挂载点档案使用情况,命令:xfs_quota -x -c "df -h" /home:

查看/home挂载点情况

查看/home目录的所有用户的quota限制值,xfs_quota -x -c "report -ubih" /home

查看/home目录下所有用户的quota限制值

列出目前支持quota的文件系统是否开启了quota功能,xfs_quota -x -c "state"

查看档案系统支持情况:开启了user和group quota,未开启project quota

设置限定值
xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name" [挂载点]
xfs_quota -x -c "timer [-ug] [-bir] Ndays" [挂载点]
## 参数解释
limit: 设置限定值命令,可以对user或者group进行设置,设置的内容有:
    bsoft/bhard:block数量的soft/hard限制,可以使用单位;
    isoft/ihard:inode数量的soft/hard限制;
    name:就是user或者group的名称。
timer: 用于设置grace time的命令,也是可以针对user/group以及block/inode进行限制。

根据之前的需求,需要设置每个测试用户(quota1,quota2,quota3,quota4,quota5)限制值,soft值300MBhard值500MB,命令xfs_quota -x -c "limit -u bsoft=200M bhard=300M quota1" /home && xfs_quota -x -c "limit -u bsoft=200M bhard=300M quota2" /home && xfs_quota -x -c "limit -u bsoft=200M bhard=300M quota3" /home && xfs_quota -x -c "limit -u bsoft=200M bhard=300M quota4" /home && xfs_quota -x -c "limit -u bsoft=200M bhard=300M quota5" /home

设置5个用户的quota限制

设置用户组的quota限制,xfs_quota -x -c "limit -g bsoft=950M bhard=1G quotagroup" /home

设置quotagroup的quota限制

设置grace time,命令xfs_quota -x -c "timer -ug -b 14days" /home:

设置grace time

测试设置值

切换到quota1用户,在/home/quota1目录下写入310M的文件,测试写入,命令dd if=/dev/zero of=test.img bs=1M count=310:

单个用户quota设置成功

分别用quota1、quota2、quota3、quota4、用户往/home目录下写入310M内容,前三个用户写入299M的内容,若quota4写入126M左右的内容,则说明群组quota设置成功。

群组quota设置成功

通过以上的两张图片也说明grace time设置成功。

开启分区project quota功能

由于project quota功能与之前的user和group quota功能冲突(比如说放在quota用户的家目录下和/home/quota下都属于在/home目录下,都会受到user quota和group quota的限制,达不到共享目录限制的效果),所以使用另外一个支持quota的空闲分区下的目录作为共享目录较好。

新建分区,格式化分区(建议为xfs分区),挂载为project quota(参数为prjquota)分区。

与设置user和group quota功能不同,project quota还需要设置专案名称和专案id,命令echo "8315:/media/m/share" >> /etc/projects && echo "quotaproject:8315" >> /etc/projid

设置好专案名称和专案id后,还要初始化专案名称,命令xfs_quota -x -c "project -s quotaproject",执行结果中有-1不用管。

初始化专案名称

查看project quota设置是否成功,命令xfs_quota -x -c "print" /media/m

设置project quota成功

设置project quota限制值

命令xfs_quota -x -c "limit -p bsoft=450M bhard=500M quotaproject" /media/m设置限制值。

开启project quota

测试project quota

使用quota1用户向/media/m目录中写入550M的内容,命令dd if=/dev/zero of=test.img bs=1M count=550

测试project quota

quota的其他一些设置参数

disable

disable命令可以暂时取消quota的限制,但是还是在计算quota。

暂停/media/m的quota功能

命令值得u和p参数分别表示对user和project quota进行限制,group使用g表示。

enable

enable是与disable相反的命令,恢复quota限制功能。

恢复quota功能

off

off命令用于停用quota功能,无法使用enable开启,只有卸载之后重新加载分区之后才能启用quota。一般该命令用于需要移除(remove)quota才会使用到。

off执行之后需要重新挂载分区才能启用quota

remove

remove命令用于永久移除quota功能,即无法再恢复quota数据。注意,remove之前用off停止quota。

移除/media/m的user quota功能

raid

目前磁盘的单盘容量大多限制在4T,对于大容量存储,尤其是需要PB级存储时,就需要多个磁盘同时存储。raid叫做磁盘阵列,通过软件或者硬件将多个较小的磁盘合并为较大的磁盘,除了提供较大的存储容量以外,还可以提供数据保护方面的功能。raid的等级不同可以提供不同的功能。

raid-0

raid-0在所有raid中具有最佳的效能,具备磁盘空间叠加,同时磁盘的速度叠加。但是该raid等级不提供任何的数据保护功能,但磁盘出现问题时,数据无法恢复。在raid0中,首先将所有的磁盘划分成等量的区块(chunk,一般设定为4K~1M之间),当有数据需要写入时,将数据按照chunk大小切割,并将数据分散写入不同的磁盘,当有两个磁盘时,则每个磁盘上存储一半的数据内容。同时,由于是多块磁盘同时读写,则可以叠加多块磁盘的读写速度,提高IO性能。

raid0实现原理

DiskA和DiskB两个磁盘首先以chunk大小划分为一个个小空间。数据在写入磁盘之前也划分为chunk大小的区块,写入数据时将一个个区块写入到不同的磁盘上。因为数据是切分之后放置到磁盘上的,因此单个磁盘的写入量减少。同样的,当磁盘的数量越多,则同样的数据写于到单个磁盘的数据越少,写入的时间花费越少。多张磁盘组合,存储的容量等于各个磁盘容量相加,速度等于各个磁盘速度叠加。raid0的缺点同样很明显,当其中一块磁盘损坏时,整个数据就就损坏了。组建raid0一定需要注意使用同样容量大小的磁盘,因为raid0写入数据是磁盘交替写入,当小容量磁盘写满数据后,速度就会下降。

raid-1

raid1也称为镜像模式,该模式需要相同容量的磁盘。如果是不同容量的磁盘组raid1则以较小容量的磁盘为主。raid1模式是将同一份资料同时存储到两个磁盘上,即为镜像。

raid1实现原理

当有数据需要写入时,同样的数据会被分别写入两个硬盘,相同的数据通过io写到硬盘之后,写入的数据量变多了,如果是通过软件实现的raid1,通过南桥的数据量会是正常数据量的两倍,可能会使写入效率降低,而读数据由于有两份数据在不同的磁盘上,在两个软件同时读取数据时效率可能会有所提升。如果是使用硬件(磁盘阵列卡)实现raid1则南桥的数据量没有改变,不会降低磁盘的io性能。raid1带来的最大的好处便是任何一个磁盘损坏都不会导致数据丢失。

raid-10和raid-01

raid-10和raid-01都是将raid0和raid1组合起来实现的,但是他们又存在一定的差别。raid10是将多个磁盘(4块以上且为偶数块磁盘),先两两组合成raid1,然后再将多个raid1按照raid0的方式组合。而raid01则是向组合成raid0再组合成raid1。在实际的应用中,raid10在数据恢复难度和数据恢复成本上较raid01更有优势,一般使用raid10。

raid10和raid01原理图(这里以六块磁盘作为示范)

raid5

raid5至少需要三块硬盘才能组成。raid5与raid0类似,将数据依次写入多个硬盘中,在循环写入数据时,也写入奇偶校验位(parity P)。

raid5原理图

在同一个循环内总有一块磁盘用于存储奇偶校验位,因此组raid5之后会少一块盘的容量,并且可以在有一块硬盘坏掉之时通过冗余方法恢复出该块硬盘的内容(多于一块盘损坏则无法恢复),同时由于写入方法类似于raid0,也具有raid0速度叠加的好处。由于存在奇偶校验位的原因,如果使用软件组建raid5,则在计算奇偶校验位时会使用到cpu运算,限制了raid5的效率;如果使用硬件组件raid5,则不会计算奇偶校验位只会产生在磁盘阵列卡上,不会影响到整个系统的性能。而raid6则是在raid5的基础上多了一个磁盘的parity,这样即使存在两个磁盘损坏时也可以恢复数据。

spare disk(热备份盘)

在raid5等raid模式下,出现磁盘损坏需要移除损坏的磁盘并使用完好的磁盘重建raid,但是即使是支持热插拔的磁盘阵列卡,也是需要手动更换损坏的硬盘,但是如果磁盘阵列卡支持热备份盘,并且你也设置了热备份盘的话,出现磁盘损坏时既可以立刻使用设置好的热备份盘重建raid。

项目 raid0 raid1 raid10 raid5 raid6
最少磁盘数 2 2 4 3 4
最大容错磁盘数 0 n-1 n/2 1 2
数据安全性 最好 较好 比raid5好
理论写入效率 n 1 n/2 n-1 n-2
理论读取效率 n n n/2 <n-1 <n-2
可用容量 n 1 n/2 n-1 n-2
应用 个人(提升硬盘性能) 保存数据与备份 服务器或云系统 保存数据与备份 保存数据与备份

软件和硬件raid

软件raid具有成本低的优点,存在占用系统资源,影响系统性能或是影响raid性能等缺点;

硬件raid具有更高的raid效率且可支持热插拔等特点,但是好的磁盘阵列卡成本都较高。

软件raid

在linux下可以使用mdadm指令实现软件raid,除了在磁盘上构建raid外,也可以使用多个分区构建raid。

mdadm

mdadm --detail /dev/md0
mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK --raid-devices=N --spare-devices=N /dev/sdx /dev/hdx ...
# 参数讲解
--create 建立raid选项
--auto=yes 决定建立后面的软件磁盘阵列设备,即/dev/md0,/dev/md1...
--chunk=NK 决定这个装置的chunk大小,一般为64K或者512K;
--raid-devices=N 使用几个磁盘组建raid;
--spare-devices=N 使用几个磁盘作为备用磁盘;
--level=[015] 组建磁盘阵列的等级;
--detail 显示指定磁盘阵列的详细信息。

软件组建raid示例

创建组建raid所需的分区

这里我们使用5个1G的分区用于组建raid,首先使用gdisk工具将磁盘划分为5个分区。

创建5个分区

使用mdadm创建raid

在这个示例中使用4个分区组成raid5,1个分区作为备用,命令mdadm --create /dev/md0 --auto=yes --level=5 --chunk=512K --raid-devices=4 --spare-devices=1 /dev/sdb{1,2,3,4,5}

mdadm组建raid

查看raid信息

格式化与挂载raid磁盘

这里格式化为xfs文件系统,但是需要注意的是,因为涉及到的是raid磁盘的xfs文件系统需要注意设置参数以优化xfs文件系统的性能:

stripe(chunk):在这里问我们设置为chunk大小,su=512K;
sw的设置为实际存储的磁盘数量,这里使用4块硬盘作为raid,但是实际上要除去一个硬盘的空间用于存储校验信息,因此sw=3;
资料的宽度为512K*3=1536K

经过以上的分析,格式化命令为:mkfs.xfs -f -d su=512k,sw=3 -r extsize=1536k /dev/md0

格式化raid磁盘

挂载raid磁盘mount -rw /dev/md0 /media/md0

挂载磁盘

设置自动挂载磁盘

在开机时较新的linux系统会自动加载raid磁盘。但是为了确保在较旧系统上依旧可以运行则可以配置mdadm的配置文档/etc/mdadm.conf。首先通过命令mdadm --detail /dev/md0 | grep UUID获得UUID,并修改/etc/mdadm.coonf文件。

# mdadm.conf
ARRAY /dev/md0 UUID=98d12859:872fd4cd:e71e89d7:c006b989

设定开机自动挂载磁盘。首先通过命令blkid /dev/md0查询磁盘UUID,其次修改/etc/fstab配置文件。

# /etc/fstab
# 最后一行添加
UUID=23b36776-09d1-4c0e-95d2-50759cda2aff    /media/md0    xfs    defaults    0    0
测试自动挂载

umount /dev/md0卸载raid磁盘md0,mount -a挂载所有未挂载磁盘。

测试自动挂载磁盘

测试磁盘出错

首先在raid磁盘下写入512M的数据dd if=/dev/random of=test.img bs=1M count=512,模拟在使用中的磁盘。

写入随机数据,模拟使用的raid磁盘

使用mdadm命令设置sdb2硬盘工作不正常,查看raid的工作状态。

模拟硬盘工作不正常

重建raid并能访问文件

sdb2磁盘并没有损坏,我们可以使用命令直接将磁盘加入,mdadm --manage /dev/md0 --remove /dev/sdb2 && mdadm --manage /dev/md0 --add /dev/sdb2

重新加入sdb2磁盘

关闭raid

首先卸载raid磁盘,命令umount /dev/md0,然后去掉/etc/fstab中自动挂载raid磁盘的部分【删掉(如果不确定可以只是注释掉,后边确认无问题之后再删除)添加的UUID内容】,接着用dd命令向md0中写入50M数据,命令dd if=/dev/zero of=/dev/md0 bs=1M count=50,清除raid的metadata和XFS的superblock,之后再mdadm中关闭raid,命令mdadm --stop /dev/md0,然后分别向5个分区写入10M内容,命令dd if=/dev/zero of=/dev/sdb1 bs=1M count=10 && dd if=/dev/zero of=/dev/sdb2 bs=1M count=10 && dd if=/dev/zero of=/dev/sdb3 bs=1M count=10 && dd if=/dev/zero of=/dev/sdb4 bs=1M count=10 && dd if=/dev/zero of=/dev/sdb5 bs=1M count=10,避免重新开机后raid重组或是以后划分分区出现问题。接着使用命令cat /proc/mdstat查看是否成功停掉raid,最后将/etc/mdadm.conf中添加的信息删除或注释。

关闭raid

注意

按照我们的预期,4磁盘组建raid5后,速度也应该接近单个磁盘的3倍,但是我们实际测试的速度还不及单个硬盘的速度,这是什么原因呢?

普通磁盘测速

raid磁盘测速

究其原因与实现raid的方式有关,例子组建raid系统所使用的是同一个硬盘上的5个分区,那么所有读写都是发生在同一个”硬件设备”上,组建raid的多个磁盘实际上是共用一个”硬件设备”的IO性能,无法达到速度叠加的效果,相反,写入的实际数据量较写入数据量少的,由于需要写入的信息中包含校验信息。更何况这里的”硬件设备”也只是一个虚拟硬盘。

LVM

LVM即逻辑卷管理,存在的最大意义便是可以不停机弹性调整各个分区大小,也可以加入新分区或者移除分区。LVM通过软件将多个实体分区整合成一个看起来独立的大的磁盘(VG),之后再将大的磁盘分割成可使用的分区(LV),最后就可以挂载使用了。

PV、PE、VG、LV

PV

PV(Physical Volume,物理卷),实体的分区都需要调整系统识别码为8e后经过pvcreate指令转化为LVM的底层的物理卷(PV)。

VG

VG(Volume Group,卷组),将多个物理卷整合为一个卷组,VG就是LVM组合起来的大磁盘。LVM预设使用的是4M大小的PE块,在32位系统中只能使用65534个PE块,也就是256G,但是目前大多数都是使用LVM2+64位系统,不存在容量的限制。

PE

PE(Physical Extent,物理区域),PE则是将卷组(VG)划分为一个个的PE,类似于档案系统的的block。

LV

LV(Logical Volume,逻辑卷),就是将VG分为一个个可用的逻辑卷,类似于磁盘分区,大小需要按照PE为单位大小进行划分。通过LV操作之后就可以在LV上创建文件系统用于存储。

LVM的弹性分区时通过调整PE实现的,即将需要缩小的LV的未使用的PE划分为需要增大的LV的PE。

LVM一般操作流程

LVM的操作流程

创建PV

首先使用pvcreate命令将实体分区转化为PV(物理卷)。

# 与PV有关的命令

# 将实体分区转化为PV
pvcreate 所有分区
# 例如 pvcreate /dev/sdb{1,2,3,4,5}

# 显示所有的PV
pvscan

# 显示PV的状态
pvdisplay [分区]
# 例如 pvdisplay /dev/sdb1

# 将PV分区转化为普通实体分区
pvremove 分区

在开始示例之前,我们使用的是上次组建raid的5个分区,因此转换为PV的命令为pvcreate /dev/sdb{1,2,3,4,5}

创建PV

创建VG

然后创建LVM大磁盘–VG。相关操作如下:

# 与VG有关命令

# 将PV整合为一个VG
vgcretae [-s N[mgt]] VG名称 PV名称
# 例如:vgcreate -s 16M lvmvg /dev/sdb{1,2,3}

# 查看系统上是否有VG存在
vgscan

# 显示VG的状态信息
vgdisplay VG名称

# 在VG内增加额外的PV
vgextend VG名称 PV名称

# 在VG内减少PV
vgreduce VG名称 PV名称

# 设定VG是否启动
vgchange -a[y|n] VG名称

# 移除一个VG
vgremove [-f] VG名称

示例中使用3个PV组建VG,命令为:vgcreate -s 16M lvmvg /dev/sdb{1,2,3}

创建vg

创建LV

最后创建LV,相关操作如下:

# 与LV有关的命令如下:

# 创建LV命令
lvcreate [-L N[mgt]|-l N] [-n LV名称] VG名称
# 参数讲解:
# L 后接容量,单位可以为m、g、t,最小单位为PE大小;
# l 后接PE的个数,不是PE的数量,需要自行PE的数量
# n 后接LV名称

# 浏览整个卷组的逻辑卷
lvscan

# 显示LV详细情况
lvdisplay LV名称

# 增加LV容量
lvextend -L [+]N[mgt] LV名称
# 注意,有+表示增加的容量,没有+表示调整容量为指定的容量

# 减少LV容量
lvreduce -L N[mgt] LV名称

# 移除LV
lvremove [-f] LV名称

# 调整LV大小
lvresize [-L [+|-]N[mgt]] LV名称
# 注意:+后接增加多少空间,-表示减少多少空间,无符号表示调整到多少,
# 千万注意缩减空间时一定要注意检查文件系统,避免缩减空间导致文件丢失。

在示例中创建一个大小为500G的LV,命名为firstlv,命令为:lvcreate -L 500M -n firstlv lvmvg
创建LV

挂载

LV相当于实体分区,需要格式化之后挂载使用。

首先格式化LV,LV的位置在/dev/VG名称/LV名称,命令mkfs.xfs /dev/lvmvg/firstlv

格式化LV

挂载LV,将格式化的LV挂载在/media/lvm,命令mkdir /media/lvm && mount /dev/lvmvg/firstlv /media/lvm

挂载LV

测试

往里写入50M文件测试工作是否正常,命令dd if=/dev/zero of=test.img bs=1M count=50

测试lvm工作是否正常

LV大小调整步骤

调整LV的大小实际上是想调整文件系统的大小,那么一般分为两种,扩容和缩容。

扩容

扩容的完整步骤类似于LVM的使用步骤

创建PV

可以通过vgdisplay命令用于查询VG的使用情况,命令vgdisplay lvmvg或者vgdisplay /dev/lvmvg

查看vg状态

如果VG有充足的剩余空间,则不需要创建新的PV用于扩容VG,可以跳过创建PV,直接进行扩容LV

如果VG空间不足,则需要使用新的分区用于创建PV

扩容VG

通过vgextend命令就可以完成VG扩容,命令为vgextend lvmvg /dev/sdb4

扩容VG

扩容LV

扩容LV使用lvextend命令即可。在本次示例中给firstlv扩容500M空间,命令为lvextend -L +500M /dev/lvmvg/firstlv

扩容LV

调整文件系统

最终的目的就是使文件系统的容量增大,目前支持LVM较好的是EXT4和XFS文件系统,更近一步说,完全支持缩放文件系统大小的是EXT4文件系统,XFS则只支持扩容操作。

XFS使用xfs_growfs,命令为xfs_growfs /media/lvm

扩容xfs文件系统

EXT4使用resize2fs扩容文件系统。用法如下:

resize2fs [-f] device [size]
# 参数讲解
# f 强制执行
# device 指定执行命令的文件系统所在的磁盘
# size 指定调整之后的文件系统容量大小

EXT4扩容命令为lvresize -L +500M /dev/lvmvg/ext4lv && e2fsck -f /dev/lvmvg/ext4lv && resize2fs /dev/lvmvg/ext4lv,注意e2fsck为检查文件系统命令,且不能挂载。

扩容EXT4文件系统

缩容

由于缩容使用较少且xfs文件系统不支持缩小文件系统容量,所以这里使用EXT4文件系统简要演示缩容的操作。

将上面扩容为1.5G的EXT4文件系统修改为1G,命令为e2fsck -f /dev/lvmvg/ext4lv && resize2fs -f /dev/lvmvg/ext4lv 1G && lvresize -L 1G /dev/lvmvg/ext4lv

LV缩容

LVM thin Volume

之所以会有这个技术的原因在于LVM的动态可调整,且在短时间内使用的磁盘空间只是总量的一部分,相当于通过LVM技术许诺一个磁盘大小,就像是一张支票一样,上边的数字可以随便填写,但是能不能取出这么多钱是不一定的。

具体的操作是,首先在VG的未分配空间内创建一个thin pool(LV),又叫磁盘容量存储池,thin pool的大小是真实占用物理磁盘的空间,而thin volume则是创建在thin pool之上,其大小是许诺的。

thin volume创建步骤

在创建thin volume的实例中,之前我们创建的lvmvg(VG)还剩余1.4G未使用,因此我们创建1G的thin pool,并许诺一个10G的thin volume。

创建thin pool

thin volume依托在thin pool之上,所以我们需要首先创建thin pool。创建thin pool与创建普通的LV类似,但是在命令中多一个T参数。示例中使用命令lvcreate -L 1G -T -n thinpool1 lvmvg

创建thin pool

创建thin volume

在thin pool之上创建LV,与创建LV使用的是相同的命令,但是有较大的差别。使用V参数指定虚拟的容量大小,使用T参数指定thin pool,n参数指定thin volume的名称。示例中使用的命令为lvcreate -V 10G -T /dev/lvmvg/thinpool1 -n thinvolume1

创建thin volume

测试thin volume

由于thin volume实际分配的空间只有1G,所以测试数据不能超过1G,这里我们选择写入100M内容。将/dev/lvmvg/thinvolume1格式化并挂载,使用命令dd if=/dev/urandom of=test.img bs=1M count=100写入数据。

测试thin volume是否可用

LVM快照

LVM除了能动态调整LV的大小以外还能提供快照的功能。LVM实现快照的功能是通过快照区实现的,当有文件被改动时,就将改动前的文件移到快照区,然后再把新内容保存下来,并将这个内容排除在快照区外。

LVM快照原理

创建快照

在创建快照之前注意查询VG是否还有空闲的空间(lvmvg还剩余26个PE未使用),若没有空闲的空间的话,则需要扩容VG以创建快照。

使用命令lvcreate -s -l 26 -n firstlvsnap /dev/lvmvg/firstlv

创建firstlv的LV快照

恢复

首先我们将快照和firstlv同时分别挂载(注意快照区和LV有同样的uuid,因此挂载时需添加-o nouuid),这时如果我们删除firstlv中的文件,并写入新文件,然后再查看快照区的文件内容。

利用快照区可以找回删除掉的文件

但是快照区的空间一般不大,当有大量数据改动时,快照区空间消耗完之后就会使快照区失效。

移除LVM

即将所有创建的LV、VG、PV都移除掉,并且将分区的系统标识号改回以前的号码。

首先将所有挂载的分区移除,命令umount /dev/lvmvg/firstlv && umount /dev/lvmvg/firstlvsnap && umount /dev/lvmvg/thinvolume1

移除所有挂载的LVM

其次移除所有的LV,注意thin pool移除前需将thin volume移除,移除LV之前应确保快照已经移除,命令lvremove -f /dev/lvmvg/firstlvsnap && lvremove -f /dev/lvmvg/firstlv && lvremove -f /dev/lvmvg/thinvolume1 && lvremove -f /dev/lvmvg/thinpool1 && lvremove -f /dev/lvmvg/ext4lv

移除所有的LV

接着移除VG,命令vgremove -f lvmvg

移除VG

然后移除所有与VG相关的PV,命令pvremove -f /dev/sdb1 && pvremove -f /dev/sdb2 && pvremove -f /dev/sdb3 && pvremove -f /dev/sdb4 && pvremove -f /dev/sdb5

移除所有相关PV

最后修改实体分区的系统标识号(gdisk)。

添加的LVM完全移除。

参考资料

鸟叔的linux私房菜第十四章:< http://linux.vbird.org/linux_basic/0420quota.php>

以及部分网络搜索的资料


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qinzhtao@163.com

文章标题:quota,raid和lvm

文章字数:7.5k

本文作者:捌叁壹伍

发布时间:2019-12-18, 16:39:25

最后更新:2020-02-08, 23:56:06

原始链接:http://qzt8315.github.io/2019/12/18/quota-raid和lvm/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏