0x01 磁盘配额
磁盘配额(Quota)就是 Linux 系统中用来限制特定的普通用户或用户组在指定的分区上占用的磁盘空间或文件个数的。
- 磁盘配额限制的用户和用户组,只能是普通用户和用户组,也就是说超级用户 root 是不能做磁盘配额的;
- 磁盘配额限制只能针对分区,而不能针对某个目录,换句话说,磁盘配额仅能针对文件系统进行限制,举个例子,如果你的 /dev/sda5 是挂载在 /home 底下,那么,在 /home 下的所有目录都会受到磁盘配额的限制;
- 我们可以限制用户占用的磁盘容量大小(block),当然也能限制用户允许占用的文件个数(inode)。
磁盘配额在实际生活中其实是很常见的,比如,我们的邮箱不管多大,都是有限制的,而不可能无限制地存储邮件;我们可以上传文件的服务器也是有容量限制的;网页中的个人空间也不可能让我们无限制地使用。
- 我的楼是租给外来用户的(普通用户),可以租给一个人(用户),也可以租给一家公司(用户 组),但是这栋楼的所有权是我的,所以不能租给我自己(root 用户);
- 如果要租用,则只能在每层租用一定大小的空间,而不能在一个房间中再划分出子空间来租用(配额只能针对分区,而不能限制某个目录);
- 租户可以决定在某层租用多大的空间(磁盘容量限制),也可以在某层租用几个人员名额,这样只有这几个人员才能进入本层(文件个数限制)。
0x011 磁盘配额的条件
- 内核必须支持磁盘配额
-> #grep CONFIG_QUOTA /boot/config-3.10.0-1062.4.1.el7.x86_64
CONFIG_QUOTA=y #这个就是磁盘配额的条件
CONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_QUOTA_DEBUG is not set
CONFIG_QUOTA_TREE=y
CONFIG_QUOTACTL=y
CONFIG_QUOTACTL_COMPAT=y
- 系统中必须安装了 Quota 工具。我们的 Linux 中默认安装了 Quoted 工具,查看命令如下:
[root@localhost ~]# rpm -qa | grep quota
quota-3.17-16.el6.i686
要支持磁盘配额的分区必须开启磁盘配额功能。这项功能可以手动开启,不再是默认开启的。
0x012 磁盘配额中的常见概念
0x0121 用户配额和组配额
用户配额是指针对用户个人的配额,而组配额是指针对整个用户组的配额。如果我们需要限制的用户数量并不多,则可以给每个用户单独指定配额。如果用户比较多,那么单独限制太过麻烦,这时我们可以把用户加入某个用户组,然后给组指定配额,就会简单得多。
0x0122 磁盘容量限制和文件个数限制
我们除了可以通过限制用户可用的 block 数量来限制用户可用的磁盘容量,也可以通过限制用户可用的 inode 数量来限制用户可以上传或新建的文件个数。
0x013 软限制和硬限制
软限制可理解为警告限制,硬限制就是真正的限制了。比如,规定软限制为 100MB,硬限制为 200MB,那么,当用户使用的磁盘空间为 100~200MB 时,用户还可以继续上传和新建文件,但是每次登录时都会收到一条警告消息,告诉用户磁盘将满。
0x014 宽限时间
如果用户的空间占用数处于软限制和硬限制之间,那么系统会在用户登录时警告用户磁盘将满,但是这个警告不会一直进行,而是有时间限制的,这个时间就是宽限时间,默认是 7 天。
0x02 磁盘配额规划
配额实验,前先规划我们的实验
- 磁盘配额是限制普通用户在分区上使用磁盘空间和文件个数的,所以我们需要指定一个分区。那么我们手工建立一个5G的/dev/sdb1分区,把他挂载在/disk目录中
- 我们还需要建立限制用户和用户组。那么假设建立三个用户user1,2,3和test组
- 其中test组的磁盘容量限制为500MB,软件限制为450MB,文件个数不限制,user1为了方便先测试,磁盘容量限制为50MB,软限制为40MB,文件硬限制为10个,软限制为8个。user2,3用户容量硬限制250,软限制为200MB,文件个数不做限制。
- 其中user1,2,3三个用户次磁盘容量共为550MB超过了test组的磁盘限制。其实test组中的其他软限制都是先到先得,谁先用test的数据,谁就先占,超过则用不了了。
分区不管了,用户和用户组创建
#groupadd test
#useradd -G test user1
#useradd -G test user2
#useradd -G test user3
#passwd user1
#passwd user2
#passwd user3
查看
#cat /etc/passwd
user1:x:1001:1002::/home/user1:/bin/bash
user2:x:1002:1003::/home/user2:/bin/bash
user3:x:1003:1004::/home/user3:/bin/bash
0x021 在分区上开启磁盘配额功能
注意上面是支持。这次是开启
#mount -o remount,usrquota,grpquota /disk1 #临时启动
#永久生效
#vi /etc/fstab
/dev/sdb1 /disk ext4 defaults,usrquota,grpquota 0 0
#修改配置文件要想生效,必须重启,否是在也需要把分区重新挂载一变
0x022 建立磁盘配额的配置文件
# quotacheck [选项] [分区名]
选项:
-a : 扫描/etc/mtab文件中所有启动用磁盘配额的功能分区。如果假如此参数,命令后面就不需要加入分区名了
-c : 不管原先的配置文件,重新扫描并建立新的配置文件
-u : 建立用户配额的配置文件,就是生成aquota.user文件
-g : 建立组配额配置文件,就是生成aquota.group文件
-v : 显示扫描过程
-m : 强制以读写的方式扫描文件系统,和-M类似。一般扫描根分区时使用
-f : 强制扫描文件系统,并写入新的配置文件,一般扫描新添加的硬盘分区时使用。
#quotacheck -avug
需要关闭SELinux,否则会报错。
这里简单的关闭SELinux后面再想写这个。
#getenforce #获取SElinux状态
#setenforce 0 #关闭SELinux 同样这个只是临时的办法。
#永久的关闭SELinux
#vi /etc/selinux/config #将enforcing改成disable 需重启
补充: 如果时根分区使用,在建立配额文件要使用m指令因为跟分区是一直在使用的。
0x023 设置用户和组的配额限制
# edquota [选项] [用户名或组名]
选项:
-u 用户名 : 设定用户配额
-g 组名 : 设定组配额
-t : 设定宽限时间
-p : 复制配额限制。如果已经设置某个用户的配额限制,其他用户的配额限制如果和这个用户相同,那么可以直接赋值配额限制,而不用手工指定。
[root@localhost ~]# edquota -u user1
Disk quotas for user myquota (uid 710):
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 0 0 0 10 0 0
表头 | 含义 |
---|---|
文件系统(filesystem) | 说明该限制值是针对哪个文件系统(或分区); |
磁盘容量(blocks) | 此列的数值是 quota 自己算出来的,单位为 Kbytes,不要手动修改; |
磁盘容量的软限制(soft) | 当用户使用的磁盘空间超过此限制值,则用户在登陆时会收到警告信息,告知用户磁盘已满,单位为 KB; |
磁盘容量的硬限制(hard) | 要求用户使用的磁盘空间最大不能超过此限制值,单位为 KB; |
文件数量(inodes) | 同 blocks 一样,此项也是 quota自己计算出来的,无需手动修改; |
文件数量的软限制(soft) | 当用户拥有的文件数量超过此值,系统会发出警告信息; |
文件数量的硬限制(hard) | 用户拥有的文件数量不能超过此值。 |
注意,当 soft/hard 为 0 时,表示没有限制。另外,在 Vi(或 Vim)中修改配额值时,填写的数据无法保证同表头对齐,只要保证此行数据分为 7 个栏目即可。
0x024 启动和关闭配额
配置的配置完成,接下来只需要启动即可
#quotaon [选项] [分区名]
选项:
-a : 依据/etc/mtab文件启动所有的配置分区。如果不加-a,后面一定要指定分区名
-u : 启动用户配额
-g : 启动组配额
-v : 显示启动过程的信息
#qunotaoff [选项] [分区名]
选项:
-a : 依据/etc/mtab文件关闭所有的配置分区。如果不加-a,后面一定要指定分区名
-u : 关闭用户配额
-g : 关闭组配额
#quotanon -vug /disk1/
/dev/sdb1 [/disk1]: user quotas turned on
0x025 查询磁盘配额
按用户或组来查
#quota [选项] [用户名和组名]
选项:
-u 用户名 : 查询用户配额
-g 组名 : 查询组配额
-v : 显示详细信息
-s : 以习惯单位显示内容大小,如M,G
#quota -uvs user1
按分区来查
#repquota [选项] [分区名]
选项:
-a : 依据/etc/mtab文件配额,如果不加a选项,一定要加分区名
-u : 查询用户配额
-g : 查询组配额
-v : 显示详细信息
-s : 已习惯单位显示容易大小
#repquota - augvs
0x026 复制配额
user2用户的配额值和user1用户完全一样,我们就可以使用user1作为模板进行复制,这样我们如果需要建立大量的配额值时,就会非常方便,不用一个个手工建立了。命令如下
# edquota -p user1 -u user2 # -p 源用户 -u 目标用户
0x027 非交互设定用户磁盘配额
就算有复制配额,但是user1还要手工建立特别的麻烦。这里有指令可以直接设定用户配额
#setquota -u 用户名 容量软限制 容量硬限制 个数软限制 个数硬限制 分区名
例子
#setquota -u user3 40000 500000 8 40 /disk1/
0x03 LVM逻辑卷管理
0x031 基本概念
LVM 是 Logical Volume Manager 的简称,译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。
LVM 适合于管理大存储设备,并允许用户动态调整文件系统的大小。此外,LVM 的快照功能可以帮助我们快速备份数据。LVM 为我们提供了逻辑概念上的磁盘,使得文件系统不再关心底层物理磁盘的概念。
Linux LVM 允许我们在逻辑卷在线的状态下将其复制到另一设备上,此成功被称为快照功能。快照允许我们在复制的同时,保证运行关键任务的 Web 服务器或数据库服务继续工作。
LVM 是在硬盘分区之上建立一个逻辑层,这个逻辑层让多个硬盘或分区看起来像一块逻辑硬盘,然后将这块逻辑硬盘分成逻辑卷之后使用,从而大大提高了分区的灵活性。
- 物理卷(Physical Volume,PV):就是真正的物理硬盘或分区。
- 卷组(Volume Group,VG):将多个物理卷合起来就组成了卷组。组成同一个卷组的物理卷可以是同一块硬盘的不同分区,也可以是不同硬盘上的不同分区。我们可以把卷组想象为一块逻辑硬盘。
- 逻辑卷(Logical Volume,LV):卷组是一块逻辑硬盘,硬盘必须分区之后才能使用,我们把这个分区称作逻辑卷。逻辑卷可以被格式化和写入数据。我们可以把逻辑卷想象为分区。
- 物理扩展(Physical Extend,PE):PE 是用来保存数据的最小单元,我们的数据实际上都是写入 PE 当中的。PE 的大小是可以配置的,默认是 4MB。
也就是说,我们在建立 LVM 的时候,需要按照以下步骤来进行:
- 把物理硬盘分成分区,当然也可以是整块物理硬盘;
- 把物理分区建立为物理卷(PV),也可以直接把整块硬盘都建立为物理卷。
- 把物理卷整合为卷组(VG)。卷组就已经可以动态地调整大小了,可以把物理分区加入卷组,也可以把物理分区从卷组中删除。
- 把卷组再划分为逻辑卷(LV),当然逻辑卷也是可以直接调整大小的。我们说逻辑卷可以想象为分区,所以也需要格式化和挂载。
其实,在安装 Linux 系统时,我们采用的图形安装界面就可以直接把硬盘配置成 LVM(RAID 也可以在安装时直接配置),但当时我们只分配了基本分区。那是因为 LVM 最主要的作用是调整分区大小,所以就算在安装时已经安装了 LVM,我们还是需要学习 LVM 的命令
0x032 命令安装LVM
0x0321 创建磁盘分区
创建方式就是fidisk命令,不过需要注意的时时分区的系统ID不再是Linux默认的分区ID号83了,而是要改成LVM的ID号8e
0x0322 建立物理卷
#pvcreate [设备文件名]
建立物理卷时,我们说既可以把整块硬盘都建立成物理卷,也可以把某个分区建立成物理卷。如果要把整块硬盘都建立成物理卷,命令如下
#pvcreate /dev/sdb
在我们的使用中,是要把分区建立成为物理卷,所以执行下面的命令
#pvcreate /dev/sdb5
0x0323 查看物理卷
#pvscan
PV /dev/sda2 VG centos lvm2 [<19.00 GiB / 0 free]
PV /dev/sdb6 lvm2 [1.00 GiB]
PV /dev/sdb5 lvm2 [1.00 GiB]
PV /dev/sdb7 lvm2 [<3.00 GiB]
Total: 4 [23.99 GiB] / in use: 1 [<19.00 GiB] / in no VG: 3 [<5.00 GiB]
还有一个他能查看物理卷更详细的资料。
#pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size <19.00 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 4863
Free PE 0
Allocated PE 4863
PV UUID FVGExa-kv4w-rVwM-dqf2-SmJs-wywY-tU1Cwf
"/dev/sdb6" is a new physical volume of "1.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb6
VG Name
PV Size 1.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID BTZNBA-ejUb-qZI7-UdZ2-bRR6-nz64-QQ3Xcq
"/dev/sdb5" is a new physical volume of "1.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb5
VG Name
PV Size 1.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID cOKRHz-3D8w-CQvG-j9tR-RIJl-e2U6-TsQZFB
"/dev/sdb7" is a new physical volume of "<3.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb7
VG Name
PV Size <3.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID odk3sQ-979l-K9QZ-n9pz-g2lE-WI3q-3fe1Ld
0x0324 删除物理卷
#pvremove /dev/sdb5
0x033 创建卷组
0x0331 建立卷组
#vgcreate [选项] 卷组名 物理卷名
选项:
-s PE大小 : 指定PE的大小,单位可以时MB,GB,TB等。如果不屑默认为4MB
vgcreate -s 8MB scvg /dev/sdb5 /dev/sdb6
Volume group "scvg" successfully created
0x0332 查看卷组
#vgscan
#vgdisplay
同pv一样。
0x0333 增加卷组的容量
#vgextend scvg /dev/sdb7 #把sdb7加入到scvg中,简单来说就是扩容了。
理论上可以缩减,但缩减会影响存储的数据坚决不要缩减。
0x0334 删除卷组
#vgremove scvg
0x034 逻辑卷的管理
0x0341 建立逻辑卷
#lvcreate [选项] [-n 逻辑卷名] 卷组名
选项:
-L 容量 : 指定逻辑卷大小,单位MB,GB,TB等
-l 个数 : 按照PE个数指定逻辑卷大小,这个参数需要换算容量,泰玛珐
-n 逻辑卷名 : 指定逻辑卷名
例子
#lvcreate -L 1.5G -n userlv scvg
建立完逻辑卷后,还是要格式化和挂载才能正常使用的。格式化和挂载命令和平常的一样。不过需要注意的是逻辑卷的设备文件名时/dev/卷组名/逻辑卷名。如我们的userlv和scvg。正常的格式化和挂载就是
#mkfs -t ext4 /dev/scvg/userlv
#mount /dev/scvg/userlv /disk1
自动挂载一样的。
0x0342 查看逻辑卷
同上pv和vg
0x0343 调整逻辑卷大小
#lvresize [选项] 逻辑卷设备文件名
选项:
-L 容量 : 按照大小调整,+是增加 -是减少 单位KB,GB,TB等。如果直接写容量,代表逻辑卷大小直接指定为大小。
-l 个数 : 按照PE个数调整逻辑卷大小
#lversize -L 2.5G /dev/scvg/userlv
注意调整大小后一定要重新刷新挂载,LVM可以不需要重新挂载
#resize2fs [选项] [设备文件名] [调整的大小]
选项:
-f : 强制调整
设备文件名 : 指定调整哪个分区的大小
调整的大小 : 指定分区调整到多大,要加M,G等大小,如果不加大小,会使用整个分区
#resize2fs /dev/scvg/userlv