LVM与磁盘配额

325 阅读11分钟

LVM逻辑卷

LVM 是 Logical Volume Manager 的简称,译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备,并允许用户动态调整文件系统的大小。此外,LVM 的快照功能可以帮助我们快速备份数据。LVM 为我们提供了逻辑概念上的磁盘,使得文件系统不再关心底层物理磁盘的概念。

  • 物理卷(Physical Volume,PV):就是真正的物理硬盘或分区。
  • 卷组(Volume Group,VG):将多个物理卷合起来就组成了卷组。组成同一个卷组的物理卷可以是同一块硬盘的不同分区,也可以是不同硬盘上的不同分区。我们可以把卷组想象为一块逻辑硬盘。
  • 逻辑卷(Logical Volume,LV):卷组是一块逻辑硬盘,硬盘必须分区之后才能使用,我们把这个分区称作逻辑卷。逻辑卷可以被格式化和写入数据。我们可以把逻辑卷想象为分区。
  • 物理扩展(Physical Extend,PE):PE 是用来保存数据的最小单元,我们的数据实际上都是写入 PE 当中的。PE 的大小是可以配置的,默认是 4MB。

1.分区是磁盘上的连续空间,

2.有了raid各种raid解决了一些问题(分完就无法扩容修改了,4块变一块,关机会影响服务,进入raid配置界面)

3.平滑扩容,动态扩容

功能pvvglv
scanpvscanvgscanlvscan
createpvcreatevgcreatelvcreate
displaypvdisplayvgdisplaylvdisplay
removepvremovevgremovelvremove
extendvgextendlvextend
reducevgreducelvreduce

1.1模拟实验——创建LVM逻辑卷

Snipaste_2022-03-25_01-00-02.png

创建逻辑卷:

##在虚拟机上添加新的硬盘,用来创建逻辑卷,然后刷新你的硬盘接口
[root@localhost ~]# echo "- - -" > /sys/class/scsi_host/host0/scan
[root@localhost ~]# echo "- - -" > /sys/class/scsi_host/host1/scan
[root@localhost ~]# echo "- - -" > /sys/class/scsi_host/host2/scan

[root@localhost ~]# lsblk ##查看接口是否刷新成功
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  200G  0 disk 
├─sda1            8:1    0    5G  0 part /boot
└─sda2            8:2    0   48G  0 part 
  ├─centos-root 253:0    0   40G  0 lvm  /
  └─centos-swap 253:1    0    8G  0 lvm  [SWAP]
sdb               8:16   0   40G  0 disk 
sdc               8:32   0   40G  0 disk 
sr0              11:0    1  4.2G  0 rom  /mnt

[root@localhost ~]# fdisk /dev/sdb       ##分区sdb硬盘
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x8c407be8 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):n   ###建立分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p  ### p是建立主分区
分区号 (1-4,默认 1):
起始 扇区 (2048-83886079,默认为 2048):      ##起始大小默认回车
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-83886079,默认为 83886079):+10G                                                #### 这里分区给了10G #########
分区 1 已设置为 Linux 类型,大小设为 10 GiB

命令(输入 m 获取帮助):t                   ### 分区需要修改文件类型:8e
已选择分区 1
Hex 代码(输入 L 列出所有代码):8e          #### 修改文件类型:8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):w                   ###保存修改
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

[root@localhost ~]# lsblk       ###查看是否已成功分区
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  200G  0 disk 
├─sda1            8:1    0    5G  0 part /boot
└─sda2            8:2    0   48G  0 part 
  ├─centos-root 253:0    0   40G  0 lvm  /
  └─centos-swap 253:1    0    8G  0 lvm  [SWAP]
sdb               8:16   0   40G  0 disk 
└─sdb1            8:17   0   10G  0 part 
sdc               8:32   0   40G  0 disk 
sr0              11:0    1  4.2G  0 rom  /mnt
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc      ### 创建物理卷
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdc" successfully created.
[root@localhost ~]# vgcreate vg01 /dev/sdb1 /dev/sdc ### 创建卷组
  Volume group "vg01" successfully created
[root@localhost ~]# lvcreate -L 20G -n lv01 vg01  ###创建名为lv01,大小为20G的逻辑卷
  Logical volume "lv01" created.
[root@localhost ~]# mkfs.xfs /dev/vg01/lv01      ### 格式化逻辑卷格式
meta-data=/dev/vg01/lv01         isize=512    agcount=4, agsize=1310720 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5242880, 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
[root@localhost ~]# mkdir /lyn                 ### 创建新文件夹
[root@localhost ~]# mount /dev/vg01/lv01 /lyn  ### 挂载逻辑卷 
[root@localhost ~]# df -Th                     ### 查看逻辑卷是否创建成功
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        40G  4.8G   36G   12% /
devtmpfs                devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                   tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                   tmpfs     1.9G  9.1M  1.9G    1% /run
tmpfs                   tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1               xfs       5.0G  179M  4.9G    4% /boot
tmpfs                   tmpfs     378M   48K  378M    1% /run/user/0
/dev/sr0                iso9660   4.3G  4.3G     0  100% /mnt
/dev/mapper/vg01-lv01   xfs        20G   33M   20G    1% /lyn

 

扩容逻辑卷:

[root@localhost ~]# pvcreate /dev/sdd          ##### 创建新的硬盘为物理卷
  Physical volume "/dev/sdd" successfully created.
[root@localhost ~]# vgextend vg01 /dev/sdd     ##### 将新的硬盘加入卷组
  Volume group "vg01" successfully extended
[root@localhost ~]# lvextend -L +20G /dev/vg01/lv01   ##### 扩容逻辑卷——20G
  Size of logical volume vg01/lv01 changed from 20.00 GiB (5120 extents) to 40.00 GiB (10240 extents).
  Logical volume vg01/lv01 successfully resized.
[root@localhost ~]# xfs_growfs /lyn/           ##### 刷新逻辑卷挂载点
meta-data=/dev/mapper/vg01-lv01  isize=512    agcount=4, agsize=1310720 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=5242880, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 5242880 to 10485760

[root@localhost ~]# df -Th       ######@@@ 显示扩容成功!!!
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        40G  4.8G   36G   12% /
devtmpfs                devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                   tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                   tmpfs     1.9G  9.1M  1.9G    1% /run
tmpfs                   tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1               xfs       5.0G  179M  4.9G    4% /boot
tmpfs                   tmpfs     378M   48K  378M    1% /run/user/0
/dev/sr0                iso9660   4.3G  4.3G     0  100% /mnt
/dev/mapper/vg01-lv01   xfs        40G   33M   40G    1% /lyn

磁盘配额

综述

磁盘配额(Quota)就是 Linux 系统中用来限制特定的普通用户或用户组在指定的分区上占用的磁盘空间或文件个数的。

在此概念中,有以下几个重点需要注意:

  1. 磁盘配额限制的用户和用户组,只能是普通用户和用户组,也就是说超级用户 root 是不能做磁盘配额的;
  2. 磁盘配额限制只能针对分区,而不能针对某个目录,换句话说,磁盘配额仅能针对文件系统进行限制,举个例子,如果你的 /dev/sda5 是挂载在 /home 底下,那么,在 /home 下的所有目录都会受到磁盘配额的限制;
  3. 我们可以限制用户占用的磁盘容量大小(block),当然也能限制用户允许占用的文件个数(inode)

磁盘配额就好像我们出租写字楼,虽然整栋楼的空间非常大,但是酬整栋楼的成本太高。我们可以分开出租,用户如果觉得不够用,则还可以租用更大的空间。不过租用是不能随便进行的,其中有几个规矩必须遵守:

  • 我的楼是租给外来用户的(普通用户),可以租给一个人(用户),也可以租给一家公司(用户 组),但是这栋楼的所有权是我的,所以不能租给我自己(root 用户);
  • 如果要租用,则只能在每层租用一定大小的空间,而不能在一个房间中再划分出子空间来租用(配额只能针对分区,而不能限制某个目录);
  • 租户可以决定在某层租用多大的空间(磁盘容量限制),也可以在某层租用几个人员名额,这样只有这几个人员才能进入本层(文件个数限制)。

使用条件

磁盘配额要想正常使用,有以下几个前提条件:

  1. 内核必须支持磁盘配额。
  2. 系统中必须安装了 Quota 工具。我们的 Linux 中默认安装了 Quoted 工具
  3. 要支持磁盘配额的分区必须开启磁盘配额功能。这项功能可以手动开启,不再是默认开启的

磁盘配额中的常见概念

磁盘容量限制和文件个数限制

我们除了可以通过限制用户可用的 block 数量来限制用户可用的磁盘容量,也可以通过限制用户可用的 inode 数量来限制用户可以上传或新建的文件个数。

软限制和硬限制

软限制可理解为警告限制,硬限制就是真正的限制了。比如,规定软限制为 100MB,硬限制为 200MB,那么,当用户使用的磁盘空间为 100~200MB 时,用户还可以继续上传和新建文件,但是每次登录时都会收到一条警告消息,告诉用户磁盘将满。

#########  CentOS7中设置磁盘配额步骤
1、检查是否已安装xfsprogs和xfs_ quota软件包
rpm -q xfsprogs quota
yum install -y xfsprogs quota


[root@localhost ~]# mount -o remount usrquota,grpquota /dev/sdb1  /mnt
#添加磁盘配额属性
手动添加的方式,会在下次重新挂载时消失,因此我们可以直接修改 /etc/fstab 文件,将挂载参数写入到配置文件中,这样,即便重新挂载也不会消失,
[root@www ~]# vim /etc/fstab
/dev/sdb1      /mnt     xfs     defaults,usrquota,grpquota  0 0  
[root@www ~]# mount -a
#刷新  /etc/fstab  文件
[root@localhost ~]#xfs_quota -x -c 'limit -u bsoft=80M bhard=100M isoft=40 ihard=50 lisi' /mnt/
-x:表示启动专家模式,在当前模式下允许对配额系统进行修改的所有管理命令可用。
-c: 表示直接调用管理命令。
-u: 指定用户账号对象
-g: 指定组账号对象
bsoft: 设置磁盘容量的软限制数值(默认单位为KB)。
bhard:设置磁盘容量的硬限制数值(默认单位为KB)。
isoft:设置磁盘文件数的软限制数值。
ihard:设置磁盘文件数的硬限制数值。


xfs_ quota -x -c 'limit -u bsoft=80M bhard=100M lisi' /opt/
#仅限制磁盘容量

xfs quota -x -c 'limit -u isoft=4 ihard=5 lisi' /opt/
#仅限制文件数

xfs_ quota -C 'quota -uv lisi' /opt/
#查看zhangsan磁盘:容量限制

xfs quota -c 'quota -i -uv lisi' /opt/
#查看zhangsan文件数限制


验证磁盘配额功能
chmod 777 /opt
Su lisi
cd /opt
#验证磁盘容量超限
dd if=/dev/zero of=/opt/kgc.txt bs=1OM count=12
#验证磁盘文件数超限
touch {aa,bb, cc,dd,ee, ff} .txt
dd命令是一一个设备转换和连续复制命令
“if=” 指定输入设备(或文件)
"of="指定输出设备(或文件)
"bs=" 指定读取数据块的大小
"count=”指定读取数据块的数量
/dev/zero “零"设备文件,可以无限的提供空字符。常用来生成-一个特定大小的文件。

5、查看配额使用情况
#查看所有可用分区的磁盘容量配额使用情况
xfs_ quota - X -C ' report -abih'

查看磁盘配额

report常用选项:
-u:对用户查看
-g:对组查看
-a:查看所有可用分区的配额使用报告
-b:查看磁盘容量
-i:查看文件数


取消设置
[root@localhost ~]#xfs_quota -x -c 'disable -up' /data

xfs_quota -x -c "disable -up" /data/
#暂时取消
xfs_quota -x -c "off -up" /data/
#需要重新挂载,完全关闭
xfs_quota -x -c "remove -p" /data/
#移除设置 需要在off状态下
[root@localhost ~]# xfs_quota -x -c 'limit -u bsoft=20M bhard=30M isoft=5 ihard=6 zhangsan' /opt/log/ 
[root@localhost ~]# chmod 777 /opt/log/
[root@localhost ~]# su zhangsan
[zhangsan@localhost log]$ touch file{1..10}.txt
touch: 无法创建"file7.txt": 超出磁盘限额
touch: 无法创建"file8.txt": 超出磁盘限额
touch: 无法创建"file9.txt": 超出磁盘限额
touch: 无法创建"file10.txt": 超出磁盘限额
[zhangsan@localhost log]$ ls
file1.txt  file2.txt  file3.txt  file4.txt  file5.txt  file6.txt
[zhangsan@localhost log]$ dd if=/dev/zero of=/opt/log/test.txt bs=1M count=20
记录了20+0 的读入
记录了20+0 的写出
[zhangsan@localhost log]$ dd if=/dev/zero of=/opt/log/test1.txt bs=1M count=20
dd: 写入"/opt/log/test1.txt" 出错: 超出磁盘限额
记录了11+0 的读入
记录了10+0 的写出
10485760字节(10 MB)已复制,0.00546079 秒,1.9 GB/秒
[zhangsan@localhost log]$ touch file{1..10}.txt
touch: 无法创建"file1.txt": 超出磁盘限额
touch: 无法创建"file2.txt": 超出磁盘限额
touch: 无法创建"file3.txt": 超出磁盘限额
touch: 无法创建"file4.txt": 超出磁盘限额
touch: 无法创建"file5.txt": 超出磁盘限额
touch: 无法创建"file6.txt": 超出磁盘限额
touch: 无法创建"file7.txt": 超出磁盘限额
touch: 无法创建"file8.txt": 超出磁盘限额
touch: 无法创建"file9.txt": 超出磁盘限额
touch: 无法创建"file10.txt": 超出磁盘限额
[zhangsan@localhost log]$ ls
test1.txt  test.txt
[zhangsan@localhost log]$ rm -rf *
[zhangsan@localhost log]$ touch file{1..10}.txt
touch: 无法创建"file7.txt": 超出磁盘限额
touch: 无法创建"file8.txt": 超出磁盘限额
touch: 无法创建"file9.txt": 超出磁盘限额
touch: 无法创建"file10.txt": 超出磁盘限额
[zhangsan@localhost log]$ ls
file1.txt  file2.txt  file3.txt  file4.txt  file5.txt  file6.txt