1 磁盘配额
1.1 Quota功能与作用
让磁盘的容量公平的分配,且只对一般身份使用者有效
quota 比较常使用的几个情况是:
- 针对 WWW server ,例如:每个人的网页空间的容量限制!
- 针对 mail server,例如:每个人的邮件空间限制。
- 针对 file server,例如:每个人最大的可用网络硬盘空间
软限制(soft)与硬限制(hard)
- hard:表示使用者的用量绝对不会超过这个限制值,若超过这个值则系统会锁住该用户的磁盘使用权
- soft:表示使用者在低于 soft 限值时 (此例中为 400MBytes),可以正常使用磁盘,但若超过 soft 且低于 hard 的限值 (介于 400~500MBytes 之间时),每次使用者登陆系统时,系统会主动发出磁盘即将爆满的警告讯息, 且会给予一个宽限时间 (grace time)
1.2 一个 XFS 文件系统的 Quota 实作范例
创建五个用户账号,所属群组为myquotagrp,五个账号共享一个共享目录/home/myquota
[root@localhost ~]# vim addaccount.sh
#!/bin/bash
#使用脚本来创建实验磁盘配额所需的环境
groupadd myquotagrp
for username in myqouta1 myqouta2 myquota3 myquota4 myquota5
douseradd -g myquotagrp ${username}echo "passwd" | passwd --stdin ${username}
done
mkdir /home/myquota #创建目录
chgrp myquotagrp /home/myquota #改变目录的所属用户组,使其成为共享目录
chmod 2770 /home/myquota
1.3 文件系统的支持和查看
首先看使用的是不是默认支持磁盘配额的内核,若是,启动文件系统的支持。
不要在根目录进行磁盘配额设置,会过于复杂。 此处在/home下的xfs文件系统操作。
为了查看目录使用的文件系统:
[root@study ~] df -hT /home
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-home xfs 5.0G 42M 5.0G 1% /home
vim /etc/fstab 编辑这个文件,才能启用磁盘配额功能在第四行的default后面加上俩参数:
/dev/mapper/centos-home /home xfs defaults,usrquota,grpquota 0 0文件全部内容:
#
# /etc/fstab
# Created by anaconda on Wed Apr 29 21:19:56 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=fa15ca75-5fee-40f1-a0c0-166886678508 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults,usrquota,grpquota 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
UUID="b9297c33-1376-4eab-8d25-98196d01c822" /data/xfs xfs defaults 0 0
/srv/loopdev /data/file xfs defaults,loop 0 0
UUID="c716c895-6286-45f2-8906-bc106bc5dcff" swap swap defaults 0 0
/tmp/swap swap swap defaults 0 0
UUID="DD87-2ABC" /data/win vfat defaults 0 0
[root@study ~] umount /home 此时务必是直接通过root身份登录系统,而不能是通过dj用户进入系统后通过su -转成root身份,这个命令必须所有的一般账户都注销后才能成功
[root@study ~] mount -a
[root@study ~] mount | grep home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
1.4 观察 Quota 报告数据
磁盘配额的设置信息
[root@localhost ~]# xfs_quota -x -c "指令" [挂载点]
选项与参数:
-x :专家模式,后续才能够加入 -c 的指令参数
-c :后面加的就是指令,这个小节我们先来谈谈数据回报的指令
指令:print :单纯的列出目前主机内的文件系统参数等数据df :与原本的 df 一样的功能,可以加上 -b (block) -i (inode) -h (加上单位) 等report:列出目前的 quota 项目,有 -ugr (user/group/project) 及 -bi 等数据state :说明目前支持 quota 的文件系统的信息,有没有起动相关项目等列出目前系统的各个文件系统,以及文件系统的磁盘配额挂载参数支持:
[root@study ~] xfs_quota -x -c "print"
Filesystem Pathname
/ /dev/mapper/centos-root
/boot /dev/sda2
/data/xfs /dev/sda4
/data/file /dev/loop0
/home /dev/mapper/centos-home (uquota, gquota) 这里是支持的列出目前/home这个支持磁盘配额的挂载点文件系统使用情况:
[root@study ~] xfs_quota -x -c "df -h" /home
Filesystem Size Used Avail Use% Pathname
/dev/mapper/centos-home5.0G 41.3M 4.9G 1% /home列出目前/home的所有用户的磁盘配额限制值:
[root@study ~] xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [------] 4 0 0 00 [------]
dj 8.5M 0 0 00 [------] 249 0 0 00 [------]
vbird1 16K 0 0 00 [------] 9 0 0 00 [------]
vbird2 20K 0 0 00 [------] 13 0 0 00 [------]
std01 12K 0 0 00 [------] 7 0 0 00 [------]
std02 12K 0 0 00 [------] 7 0 0 00 [------]
std03 12K 0 0 00 [------] 7 0 0 00 [------]
std04 12K 0 0 00 [------] 7 0 0 00 [------]
std05 12K 0 0 00 [------] 7 0 0 00 [------]
myquota1 12K 0 0 00 [------] 7 0 0 00 [------]
myquota2 12K 0 0 00 [------] 7 0 0 00 [------]
myquota3 12K 0 0 00 [------] 7 0 0 00 [------]
myquota4 12K 0 0 00 [------] 7 0 0 00 [------]
myquota5 12K 0 0 00 [------] 7 0 0 00 [------]soft和hard均为0,代表没限制。列出目前支持的磁盘配额文件系统是否有启动了磁盘配额功能:
[root@study ~] xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home) 这里说的是启动了对user的限制Accounting: ONEnforcement: ONInode: #47744 (3 blocks, 3 extents)
Group quota state on /home (/dev/mapper/centos-home) 这里说的是启动了对group的限制Accounting: ONEnforcement: ONInode: #47745 (4 blocks, 4 extents)
Project quota state on /home (/dev/mapper/centos-home) 这里说的是project并未支持Accounting: OFFEnforcement: OFFInode: #47745 (4 blocks, 4 extents)
Blocks grace time: [7 days] 这里说的是grace time 的选项
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]
1.5 限制值设置方式 (重点)
确认文件系统的磁盘配额支持顺利启用后,也能够查看到相关的磁盘配额限制,接下来就是要实际设置用户或用户组的限制。
设置语法:
[[email protected] ~]# xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"
[[email protected] ~]# xfs_quota -x -c "timer [-ug] [-bir] Ndays"
选项与参数:
limit :实际限制的项目,可以针对 user/group 来限制,限制的项目有bsoft/bhard : block 的 soft/hard 限制值,可以加单位isoft/ihard : inode 的 soft/hard 限制值name : 就是用户/群组的名称啊!
timer :用来设置 grace time 的项目喔,也是可以针对 user/group 以及 block/inode 设置范例一:设置好用户们的 block 限制值 (题目中没有要限制 inode 啦!)
[[email protected] ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota1" /home
[[email protected] ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota2" /home
[[email protected] ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota3" /home
[[email protected] ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota4" /home
[[email protected] ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota5" /home
[[email protected] ~]# xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquota1 12K 250M 300M 00 [------] 7 0 0 00 [------]范例二:设置好 myquotagrp 的 block 限制值
[[email protected] ~]# xfs_quota -x -c "limit -g bsoft=950M bhard=1G myquotagrp" /home
[[email protected] ~]# xfs_quota -x -c "report -gbih" /home
Group quota on /home (/dev/mapper/centos-home)Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotagrp 60K 950M 1G 00 [------] 36 0 0 00 [------]范例三:设置一下 grace time 变成 14 天吧!
[[email protected] ~]# xfs_quota -x -c "timer -ug -b 14days" /home
[[email protected] ~]# xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)
.....(中间省略).....
Blocks grace time: [14 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]范例四:以 myquota1 用户测试 quota 是否真的实际运行呢?
[[email protected] ~]# su - myquota1
[[email protected] ~]$ dd if=/dev/zero of=123.img bs=1M count=310
dd: error writing ‘123.img’: Disk quota exceeded
300+0 records in
299+0 records out
314552320 Bytes (315 MB) copied, 0.181088 s, 1.7 GB/s
[[email protected] ~]$ ll -h
-rw-r--r--. 1 myquota1 myquotagrp 300M Jul 24 21:38 123.img[[email protected] ~]$ exit
[[email protected] ~]# xfs_quota -x -c "report -ubh" /home
User quota on /home (/dev/mapper/centos-home)Blocks
User ID Used Soft Hard Warn/Grace
---------- ---------------------------------
myquota1 300M 250M 300M 00 [13 days]
myquota2 12K 250M 300M 00 [------]
# 因为 myquota1 的磁盘用量已经破表,所以当然就会出现那个可怕的 grace time
1.6 project 的限制 (针对目录限制) (Optional)
如果需要限制的是目录/home/myquota,而不是用户组myquotagrp时,使用下面的方法。先取消group的设置,才能进行project的设置,两者只能二选一。修改/etc/fstab
内的文件系统支持参数:
- 修改 /etc/fstab 内的文件系统支持参数
# 1、先修改 /etc/fstab 的参数,并启动文件系统的支持
[[email protected] ~]# vim /etc/fstab
/dev/mapper/centos-home /home xfs defaults,usrquota,grpquota,prjquota 0 0
# 记得, grpquota 与 prjquota 不可同时设置!所以上面删除 grpquota 加入 prjquota[[email protected] ~]# umount /home
[[email protected] ~]# mount -a
[[email protected] ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)Accounting: ONEnforcement: ONInode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)Accounting: OFF #已经取消Enforcement: OFFInode: N/A
Project quota state on /home (/dev/mapper/centos-home)Accounting: ON #确实启动Enforcement: ONInode: N/A
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
- 规范目录、选项名称(project)与选项 ID
# 2.1 指定方案识别码与目录的对应在 /etc/projects
[[email protected] ~]# echo "11:/home/myquota" >> /etc/projects# 2.2 规范方案名称与识别码的对应在 /etc/projid
[[email protected] ~]# echo "myquotaproject:11" >> /etc/projid# 2.3 初始化方案名称
[[email protected] ~]# xfs_quota -x -c "project -s myquotaproject"
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion
depth infinite (-1). # 会闪过这些讯息!是 OK 的!别担心![[email protected] ~]# xfs_quota -x -c "print " /home
Filesystem Pathname
/home /dev/mapper/centos-home (uquota, pquota)
/home/myquota /dev/mapper/centos-home (project 11, myquotaproject)
# 这个 print 功能很不错!可以完整的查看到相对应的各项文件系统与 project 目录对应![[email protected] ~]# xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject 0 0 0 00 [------] 1 0 0 00 [------]
# 确定有抓到这个选项名称!接下来准备设置吧!
- 实际设置规范与测试
将 /home/myquota 指定为 500M 的容量限制,那假设到 450M 为 soft 的限制好了! 那么设置就会变成这样
# 3.1 先来设置好这个 project 吧!设置的方式同样使用 limit 的 bsoft/bhard 喔!:
[[email protected] ~]# xfs_quota -x -c "limit -p bsoft=450M bhard=500M myquotaproject" /home
[[email protected] ~]# xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject 0 450M 500M 00 [------] 1 0 0 00 [------][[email protected] ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=510
dd: error writing '/home/myquota/123.img': No space left on device
501+0 records in
500+0 records out
524288000 Bytes (524 MB) copied, 0.96296 s, 544 MB/s
# 连 root 在该目录下面创建文件时,也会被挡掉!这才是完整的针对目录的规范!
磁盘配额(Quota)的应用与实践https://blog.csdn.net/qq_30885821/article/details/106680078?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168794061216800225530400%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168794061216800225530400&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-106680078-null-null.142%5Ev88%5Einsert_down1,239%5Ev2%5Einsert_chatgpt&utm_term=%20XFS%20%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9A%84%20Quota%20%E5%AE%9E%E4%BD%9C%E8%8C%83%E4%BE%8B&spm=1018.2226.3001.4187
1.5 xfs磁盘配额的管理与额外命令对照表
不多完美的系统,都要为可能的突发状况准备应对方案。
- disable:暂时取消 quota 的限制,但其实系统还是在计算 quota 中,只是没有管制而已!应该算最有用的功能啰!
- enable:就是回复到正常管制的状态中,与 disable 可以互相取消、启用!
- off:完全关闭 quota 的限制,使用了这个状态后,你只有卸载再重新挂载才能够再次的启动 quota 喔!也就是说, 用了 off 状态后,你无法使用 enable 再次复原 quota 的管制喔!注意不要乱用这个状态!一般建议用 disable 即可,除非你需要执行 remove 的动作!
- remove:必须要在 off 的状态下才能够执行的指令~这个 remove 可以“移除”quota 的限制设置,例如要取消 project 的设置, 无须重新设置为 0 喔!只要 remove -p 就可以了
#暂时关闭磁盘配额限制功能:
[root@study ~] xfs_quota -x -c "disable -up" /home
[root@study ~] xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)Accounting: ONEnforcement: OFFInode: #47744 (3 blocks, 3 extents)
Group quota state on /home (/dev/mapper/centos-home)Accounting: OFFEnforcement: OFFInode: #47745 (4 blocks, 4 extents)
Project quota state on /home (/dev/mapper/centos-home)Accounting: ONEnforcement: OFFInode: #47745 (4 blocks, 4 extents)
Blocks grace time: [14 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]#此时,可以写入大小超标的文件:
[root@study ~] dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520
记录了520+0 的读入
记录了520+0 的写出
545259520字节(545 MB)已复制,0.609748 秒,894 MB/秒[root@study ~] xfs_quota -x -c "report -pbh" /home
Project quota on /home (/dev/mapper/centos-home)Blocks
Project ID Used Soft Hard Warn/Grace
---------- ---------------------------------
#0 307.6M 0 0 00 [------]
myquotaproject 520M 450M 500M 00 [-none-]
#重新开启磁盘配额功能:
[root@study ~] xfs_quota -x -c "enable -up" /home
[root@study ~] dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520
dd: 写入"/home/myquota/123.img" 出错: 设备上没有空间
记录了501+0 的读入
记录了500+0 的写出
524288000字节(524 MB)已复制,0.612934 秒,855 MB/秒
#完全关闭磁盘配额功能:
[root@study ~] xfs_quota -x -c "off -up" /home#这时无法通过enable重启:
[root@study ~] xfs_quota -x -c "enable -up" /home
XFS_QUOTAON: 函数未实现#只能通过重新卸载后再挂载:
[root@study ~] umount /home;mount -a#重新挂载后磁盘配额功能自动恢复正常:
[root@study ~] xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)Accounting: ONEnforcement: ONInode: #47744 (3 blocks, 3 extents)
Group quota state on /home (/dev/mapper/centos-home)Accounting: OFFEnforcement: OFFInode: #47745 (4 blocks, 4 extents)
Project quota state on /home (/dev/mapper/centos-home)Accounting: ONEnforcement: ONInode: #47745 (4 blocks, 4 extents)
Blocks grace time: [7 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]
#删除project:
[root@study ~] xfs_quota -x -c "off -up" /home
[root@study ~] xfs_quota -x -c "remove -p" /home
[root@study ~] umount /home;mount -a #即使是重新挂载也无法恢复
[root@study ~] xfs_quota -x -c "report -phb" /home
Project quota on /home (/dev/mapper/centos-home)Blocks
Project ID Used Soft Hard Warn/Grace
---------- ---------------------------------
#0 307.6M 0 0 00 [------]
myquotaproject 500M 0 0 00 [------]
#soft和hard全是0,说明删除了所有限制值
- remove -p 是“移除所有的 project 控制列表”的意思!
1.6 不更动既有系统的 quota 实例
由于 /home 及 /var/spool/mail 根本不可能是同一个 filesystem (除非是都不分区,使用根目录,才有可能整合在一起), 所以,该如何进行这样的 quota 限制呢?
- 1.将 /var/spool/mail 这个目录完整的移动到 /home 下面;
- 2.利用 ln -s /home/mail /var/spool/mail 来创建链接数据;
- 3.将 /home 进行 quota 限额设置
2 软件磁盘阵列
2.1 磁盘阵列(RAID)
将多个较小的磁盘,整合成为一个较大的磁盘设备;RAID 由于选择的等级 (level) 不同,而使得整合后的磁盘具有不同的功能,基本常见的 level 有这几种 :
- RAID 0 (等量模式, stripe):性能最佳
在组成 RAID-0 时,每颗磁盘 (Disk A 与 Disk B) 都会先被区隔成为小区块 (chunk)。 当有数据要写入 RAID 时,数据会先被切割成符合小区块的大小,然后再依序一个一个的放置到不同的磁盘去。 举例来说,你有两颗磁盘组成 RAID-0 , 当你有 100MB 的数据要写入时,每个磁盘会各被分配到 50MB 的储存量。RAID-0 的示意图如下所示:
缺点:RAID-0 只要有任何一颗磁盘损毁,在 RAID 上面的所有数据都会遗失而无法读取。
- RAID 1 (映射模式, mirror):完整备份
特点:让同一份数据,完整的保存在两块磁盘上
工作原理:如果我有一个 100MB 的文件,且我仅有两颗磁盘组成 RAID-1 时, 那么这两颗磁盘将会同步写入 100MB 到他们的储存空间去。 因此,整体 RAID 的容量几乎少了 50%。
- RAID 1+0,RAID 0+1
RAID 1+0 就是:
- 先让两颗磁盘组成 RAID 1,并且这样的设置共有两组;
- 将这两组 RAID 1 再组成一组 RAID 0。
优点:不论哪一组 RAID 1 的磁盘损毁,由于是 RAID 1 的图像数据,因此就不会有任何问题发生
- RAID 5:性能与数据备份的均衡考虑
RAID 5 至少需要三块以上的磁盘才能够组成这种类型的磁盘阵列,每个循环的写入过程中 (striping),在每颗磁盘还加入一个奇偶校验值 (Parity) ,这个数据会记录其他磁盘的备份数据, 用于当有磁盘损毁时的救援。RAID-5 读写的情况有点像下面这样:
由于有奇偶校验值 ,因此 RAID 5 的总容量会是整体磁盘数量减一颗。以上图为例, 原本的 3 颗磁盘只会剩下 (3-1)=2 颗磁盘的容量。而且当损毁的磁盘数量大于等于两颗时,这整组 RAID 5 的数据就损毁了。 因为 RAID 5 默认仅能支持一颗磁盘的损毁情况。
- Spare Disk:预备磁盘的功能:
为了让系统可以实时的在坏掉硬盘时主动的重建,因此就需要预备磁盘 (spare disk) 的辅助;spare disk 就是一颗或多颗没有包含在原本磁盘阵列等级中的磁盘,这颗磁盘平时并不会被磁盘阵列所使用, 当磁盘阵列有任何磁盘损毁时,则这颗 spare disk 会被主动的拉进磁盘阵列中,并将坏掉的那颗硬盘移出磁盘阵列;
RAID总结:
项目 | RAID 0 | RAID 1 | RAID 10 | RAID 5 | RAID 6 |
最少磁盘数 | 2 | 2 | 4 | 3 | 4 |
最大容错磁盘数(1) | 无 | n-1 | n/2 | 1 | 2 |
数据安全性(1) | 完全没有 | 最佳 | 最佳 | 好 | 比RAID 5好 |
理论写入性能(2) | n | 1 | n/2 | <n-1 | <n-2 |
理论写入性能(2) | n | n | n | <n-1 | <n-2 |
可用容量(3) | n | 1 | n/2 | n-1 | n-2 |
一般应用 | 强调性能但数据不重要的环境 | 数据与备份 | 服务器、云系统常用 | 数据与备份 | 数据与备份 |
2.2 硬件 RAID, 软件 RAID
软件磁盘阵列:由于磁盘阵列有很多优秀的功能,然而硬件磁盘阵列卡偏偏又贵的很,因此就有发展出利用软件来仿真磁盘阵列的功能
硬件磁盘阵列的设备文件名为 /dev/sd[a-p]。软件磁盘阵列则是系统仿真的,因此使用的设备文件名是系统的设备文件, 文件名为 /dev/md0, /dev/md1...,两者的设备文件名并不相同
2.3 mdadm: 软件磁盘阵列的设置 (重点)
mdadm: 设置软件磁盘阵列
[root@study ~]# mdadm --detail /dev/md0
[root@study ~]# 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(数据块) 大小,也可以当成 stripe 大小,一般是 64K 或 512K。
--raid-devices=N :使用几个磁盘 (partition) 作为磁盘阵列的设备
--spare-devices=N :使用几个磁盘作为备用 (spare) 设备
--level=[015] :设置这组磁盘阵列的等级。支持很多,不过建议只要用 0, 1, 5 即可
--detail :后面所接的那个磁盘阵列设备的详细信息#设备文件名的总数必须要等于 --raid-devices 与 --spare-devices 的个数总和
案例:创建一个 RAID 5 的软件磁盘阵列! 下面是希望做成的 RAID 5 环境:
利用 4 个 partition 组成 RAID 5;
每个 partition 约为 1GB 大小,需确定每个 partition 一样大较佳;
利用 1 个 partition 设置为 spare disk
chunk 设置为 256K 这么大即可!
这个 spare disk 的大小与其他 RAID 所需 partition 一样大!
将此 RAID 5 设备挂载到 /srv/raid 目录下
[root@study ~]# gdisk -l /dev/vda
Number Start (sector) End (sector) Size Code Name1 2048 6143 2.0 MiB EF022 6144 2103295 1024.0 MiB 07003 2103296 65026047 30.0 GiB 8E004 65026048 67123199 1024.0 MiB 8300 Linux filesystem5 67123200 69220351 1024.0 MiB FD00 Linux RAID6 69220352 71317503 1024.0 MiB FD00 Linux RAID7 71317504 73414655 1024.0 MiB FD00 Linux RAID8 73414656 75511807 1024.0 MiB FD00 Linux RAID9 75511808 77608959 1024.0 MiB FD00 Linux RAID
# 上面特殊字体的部份就是我们需要的那 5 个 partition 啰!注意注意![root@study ~]# lsblk #列出系统上所有的磁盘列表
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0 disk
|-vda1 252:1 0 2M 0 part
|-vda2 252:2 0 1G 0 part /boot
|-vda3 252:3 0 30G 0 part
| |-centos-root 253:0 0 10G 0 lvm /
| |-centos-swap 253:1 0 1G 0 lvm [SWAP]
| `-centos-home 253:2 0 5G 0 lvm /home
|-vda4 252:4 0 1G 0 part /srv/myproject
|-vda5 252:5 0 1G 0 part
|-vda6 252:6 0 1G 0 part
|-vda7 252:7 0 1G 0 part
|-vda8 252:8 0 1G 0 part
`-vda9 252:9 0 1G 0 part
- 以 mdadm 创建 RAID
[root@study ~]# mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256K \
> --raid-devices=4 --spare-devices=1 /dev/vda{5,6,7,8,9}
mdadm: /dev/vda5 appears to contain an ext2fs file systemsize=1048576K mtime=Thu Jun 25 00:35:01 2015 # 某些时刻会出现这个东西!没关系的!
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# 详细的参数说明请回去前面看看啰!这里我通过 {} 将重复的项目简化!
# 此外,因为鸟哥这个系统经常在创建测试的环境,因此系统可能会抓到之前的 filesystem
# 所以就会出现如上前两行的讯息!那没关系的!直接按下 y 即可删除旧系统[root@study ~]# mdadm --detail /dev/md0 #查看磁盘阵列/dev/md0的详细信息
/dev/md0: # RAID 的设备文件名Version : 1.2Creation Time : Mon Jul 27 15:17:20 2015 # 创建 RAID 的时间Raid Level : raid5 # 这就是 RAID5 等级!Array Size : 3142656 (3.00 GiB 3.22 GB) # 整组 RAID 的可用容量Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB) # 每颗磁盘(设备)的容量Raid Devices : 4 # 组成 RAID 的磁盘数量Total Devices : 5 # 包括 spare 的总磁盘数Persistence : Superblock is persistentUpdate Time : Mon Jul 27 15:17:31 2015State : clean # 目前这个磁盘阵列的使用状态Active Devices : 4 # 启动(active)的设备数量
Working Devices : 5 # 目前使用于此阵列的设备数Failed Devices : 0 # 损坏的设备数Spare Devices : 1 # 预备磁盘的数量Layout : left-symmetricChunk Size : 256K # 就是 chunk 的小区块容量Name : study.centos.vbird:0 (local to host study.centos.vbird)UUID : 2256da5f:4870775e:cf2fe320:4dfabbc6Events : 18Number Major Minor RaidDevice State0 252 5 0 active sync /dev/vda51 252 6 1 active sync /dev/vda62 252 7 2 active sync /dev/vda75 252 8 3 active sync /dev/vda8
4 252 9 - spare /dev/vda9
# 最后五行就是这五个设备目前的情况,包括四个 active sync 一个 spare !
# 至于 RaidDevice 指的则是此 RAID 内的磁盘顺序
- 格式化与挂载使用 RAID
[root@study ~]# mkfs.xfs -f -d su=256k,sw=3 -r extsize=768k /dev/md0
# 有趣吧!是 /dev/md0 做为设备被格式化呢![root@study ~]# mkdir /srv/raid
[root@study ~]# mount /dev/md0 /srv/raid
[root@study ~]# df -Th /srv/raid
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 3.0G 33M 3.0G 2% /srv/raid
# 看吧!多了一个 /dev/md0 的设备,而且真的可以让你使用呢!还不赖!
2.4 模拟RAID错误的恢复方式
[root@study ~]# mdadm --manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备]
选项与参数:
--add :会将后面的设备加入到这个 md 中!
--remove :会将后面的设备由这个 md 中移除
--fail :会将后面的设备设置成为出错的状态
- 设置磁盘为错误 (fault)
# 0\. 先复制一些东西到 /srv/raid 去,假设这个 RAID 已经在使用了
[root@study ~]# cp -a /etc /var/log /srv/raid
[root@study ~]# df -Th /srv/raid ; du -sm /srv/raid/*
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 3.0G 144M 2.9G 5% /srv/raid
28 /srv/raid/etc <==看吧!确实有数据在里面喔!
51 /srv/raid/log
# 1\. 假设 /dev/vda7 这个设备出错了!实际仿真的方式:
[root@study ~]# mdadm --manage /dev/md0 --fail /dev/vda7
mdadm: set /dev/vda7 faulty in /dev/md0 # 设置成为错误的设备啰!
/dev/md0:
.....(中间省略).....Update Time : Mon Jul 27 15:32:50 2015State : clean, degraded, recoveringActive Devices : 3
Working Devices : 4Failed Devices : 1 <==出错的磁盘有一个!Spare Devices : 1
.....(中间省略).....Number Major Minor RaidDevice State0 252 5 0 active sync /dev/vda51 252 6 1 active sync /dev/vda64 252 9 2 spare rebuilding /dev/vda95 252 8 3 active sync /dev/vda82 252 7 - faulty /dev/vda7
# 看到没!这的动作要快做才会看到! /dev/vda9 启动了而 /dev/vda7 死掉了
# 2\. 已经借由 spare disk 重建完毕的 RAID 5 情况
[root@study ~]# mdadm --detail /dev/md0
....(前面省略)....Number Major Minor RaidDevice State0 252 5 0 active sync /dev/vda51 252 6 1 active sync /dev/vda64 252 9 2 active sync /dev/vda95 252 8 3 active sync /dev/vda8
2 252 7 - faulty /dev/vda7
- 将出错的磁盘移除并加入新磁盘
# 3\. 拔除“旧的”/dev/vda7 磁盘
[root@study ~]# mdadm --manage /dev/md0 --remove /dev/vda7
# 假设接下来你就进行了上面谈到的第 2, 3 个步骤,然后重新开机成功了!# 4\. 安装“新的”/dev/vda7 磁盘
[root@study ~]# mdadm --manage /dev/md0 --add /dev/vda7
[root@study ~]# mdadm --detail /dev/md0
....(前面省略)....Number Major Minor RaidDevice State0 252 5 0 active sync /dev/vda51 252 6 1 active sync /dev/vda64 252 9 2 active sync /dev/vda95 252 8 3 active sync /dev/vda86 252 7 - spare /dev/vda7
2.5 开机自动启动 RAID 并自动挂载
software RAID的配置文件在 /etc/mdadm.conf中;
[root@study ~]# mdadm --detail /dev/md0 | grep -i uuidUUID : 2256da5f:4870775e:cf2fe320:4dfabbc6
# 后面那一串数据,就是这个设备向系统注册的 UUID 识别码!# 开始设置 mdadm.conf
[root@study ~]# vim /etc/mdadm.conf
ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6
# RAID设备 识别码内容# 开始设置开机自动挂载并测试
[root@study ~]# blkid /dev/md0 #查看块设备的文件系统类型、LABEL、UUID等信息
/dev/md0: UUID="494cb3e1-5659-4efc-873d-d0758baec523" TYPE="xfs"[root@study ~]# vim /etc/fstab
UUID=494cb3e1-5659-4efc-873d-d0758baec523 /srv/raid xfs defaults 0 0
#卸载后再挂载
[root@study ~]# umount /dev/md0; mount -a
[root@study ~]# df -Th /srv/raid
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 3.0G 111M 2.9G 4% /srv/raid
# 你得确定可以顺利挂载,并且没有发生任何错误!
2.6 关闭软件 RAID(重要!)
# 1\. 先卸载且删除配置文件内与这个 /dev/md0 有关的设置:
[root@study ~]# umount /srv/raid
[root@study ~]# vim /etc/fstab
//UUID=494cb3e1-5659-4efc-873d-d0758baec523 /srv/raid xfs defaults 0 0
# 将这一行删除掉!或者是注解掉也可以!# 2\. 先覆盖掉 RAID 的 metadata 以及 XFS 的 superblock,才关闭 /dev/md0 的方法
[root@study ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50
[root@study ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0 <==不啰唆!这样就关闭了!
[root@study ~]# dd if=/dev/zero of=/dev/vda5 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda6 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda7 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda8 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda9 bs=1M count=10[root@study ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none> <==看吧!确实不存在任何阵列设备![root@study ~]# vim /etc/mdadm.conf
#ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6
# 一样!删除他或是注解他!
3 逻辑卷管理器(LVM)
LVM可以弹性地调整文件系统的容量,可以将多个物理分区整合在一起, 让这些分区看起来就像是一个磁盘一样!而且,还可以在未来新增或移除其他的物理分区到这个 LVM 管理的磁盘当中。
3.1 什么是 LVM: PV, PE, VG, LV 的意义
- Physical Volume, PV, 物理卷
- Volume Group, VG, 卷组
LVM 大磁盘就是将许多 PV 整合成这个 VG,所以VG就是LVM组合起来的大磁盘
- Physical Extent, PE, 物理扩展块
LVM 默认使用 4MB 的 PE 区块,而 LVM 的 LV 在 32 位系统上最多仅能含有 65534 个 PE (lvm1 的格式),因此默认的 LVM 的 LV 会有 4M*65534/(1024M/G)=256G。他是整个 LVM 最小的储存区块,也就是说,其实我们的文件数据都是借由写入 PE 来处理的。即这个 PE 就有点像文件系统里面的 block 大小
- Logical Volume, LV, 逻辑卷
最终的 VG 还会被切成 LV,这个 LV 就是最后可以被格式化使用的类似分区的东西;LV不可以随意指定大小,LV 的设备文件名通常为【/dev/vgname/lvname】
LVM 可弹性变更 filesystem 的容量是通过交换PE来实现的;通过“交换 PE ”来进行数据转换,将原本 LV 内 PE 移转到其他设备中以降低 LV 容量,或将其他设备的 PE 加到此 LV 中以加大容量
- 实践流程
由基础到最终的结果可以这样看:
LVM 各元件的实现流程图示
问题:数据写入LV时,是如何写入硬盘当中?
两大方式:
- 线性模式 (linear):假如我将 /dev/vda1, /dev/vdb1 这两个 partition 加入到 VG 当中,并且整个 VG 只有一个 LV 时,那么所谓的线性模式就是:当 /dev/vda1 的容量用完之后,/dev/vdb1 的硬盘才会被使用到, 这也是我们所建议的模式。
- 交错模式 (triped):那什么是交错模式?很简单啊,就是我将一笔数据拆成两部分,分别写入 /dev/vda1 与 /dev/vdb1 的意思,感觉上有点像 RAID 0 啦!如此一来,一份数据用两颗硬盘来写入,理论上,读写的性能会比较好
3.2 LVM实践流程
使用 4 个 partition ,每个 partition 的容量均为 1GB 左右,且 system ID 需要为 8e;
全部的 partition 整合成为一个 VG,VG 名称设置为 vbirdvg;且 PE 的大小为 16MB;
创建一个名为 vbirdlv 的 LV,容量大约 2G 好了!
最终这个 LV 格式化为 xfs 的文件系统,且挂载在 /srv/lvm 中
- 0. Disk 阶段 (实际的磁盘)
[root@study ~]# gdisk -l /dev/vda
Number Start (sector) End (sector) Size Code Name1 2048 6143 2.0 MiB EF022 6144 2103295 1024.0 MiB 07003 2103296 65026047 30.0 GiB 8E004 65026048 67123199 1024.0 MiB 8300 Linux filesystem5 67123200 69220351 1024.0 MiB 8E00 Linux LVM6 69220352 71317503 1024.0 MiB 8E00 Linux LVM7 71317504 73414655 1024.0 MiB 8E00 Linux LVM8 73414656 75511807 1024.0 MiB 8E00 Linux LVM9 75511808 77608959 1024.0 MiB 8E00 Linux LVM
# 其实 system ID 不改变也没关系!只是为了让我们管理员清楚知道该 partition 的内容,
# 所以这里建议还是修订成正确的磁盘内容较佳!
- 1. PV 阶段
pvcreate :将实体 partition 创建成为 PV ;
pvscan :搜寻目前系统里面任何具有 PV 的磁盘;
pvdisplay :显示出目前系统上面的 PV 状态;
pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。
# 1\. 检查有无 PV 在系统上,然后将 /dev/vda{5-8} 创建成为 PV 格式
[root@study ~]# pvscanPV /dev/vda3 VG centos lvm2 [30.00 GiB / 14.00 GiB free]Total: 1 [30.00 GiB] / in use: 1 [30.00 GiB] / in no VG: 0 [0 ]
# 其实安装的时候,我们就有使用 LVM 了喔!所以会有 /dev/vda3 存在的![root@study ~]# pvcreate /dev/vda{5,6,7,8}Physical volume "/dev/vda5" successfully createdPhysical volume "/dev/vda6" successfully createdPhysical volume "/dev/vda7" successfully createdPhysical volume "/dev/vda8" successfully created
# 这个指令可以一口气创建这四个 partition 成为 PV 啦!注意大括号的用途[root@study ~]# pvscanPV /dev/vda3 VG centos lvm2 [30.00 GiB / 14.00 GiB free]PV /dev/vda8 lvm2 [1.00 GiB]PV /dev/vda5 lvm2 [1.00 GiB]PV /dev/vda7 lvm2 [1.00 GiB]PV /dev/vda6 lvm2 [1.00 GiB]Total: 5 [34.00 GiB] / in use: 1 [30.00 GiB] / in no VG: 4 [4.00 GiB]
# 这就分别显示每个 PV 的信息与系统所有 PV 的信息。尤其最后一行,显示的是:
# 整体 PV 的量 / 已经被使用到 VG 的 PV 量 / 剩余的 PV 量# 2\. 更详细的列示出系统上面每个 PV 的个别信息:
[root@study ~]# pvdisplay /dev/vda5"/dev/vda5" is a new physical volume of "1.00 GiB"--- NEW Physical volume ---PV Name /dev/vda5 <==实际的 partition 设备名称VG Name <==因为尚未分配出去,所以空白!PV Size 1.00 GiB <==就是容量说明Allocatable NO <==是否已被分配,结果是 NOPE Size 0 <==在此 PV 内的 PE 大小Total PE 0 <==共分区出几个 PEFree PE 0 <==没被 LV 用掉的 PEAllocated PE 0 <==尚可分配出去的 PE 数量PV UUID Cb717z-lShq-6WXf-ewEj-qg0W-MieW-oAZTR6
# 由于 PE 是在创建 VG 时才给予的参数,因此在这里看到的 PV 里头的 PE 都会是 0
# 而且也没有多余的 PE 可供分配 (allocatable)。
- 2. VG 阶段
vgcreate :就是主要创建 VG 的指令啦!他的参数比较多,等一下介绍。
vgscan :搜寻系统上面是否有 VG 存在?
vgdisplay :显示目前系统上面的 VG 状态;
vgextend :在 VG 内增加额外的 PV ;
vgreduce :在 VG 内移除 PV;
vgchange :设置 VG 是否启动 (active);
vgremove :删除一个 VG
[root@study ~]# vgcreate [-s N[mgt]] VG名称 PV名称
选项与参数:
-s :后面接 PE 的大小 (size) ,单位可以是 m, g, t (大小写均可)# 1\. 将 /dev/vda5-7 创建成为一个 VG,且指定 PE 为 16MB 喔!
[root@study ~]# vgcreate -s 16M vbirdvg /dev/vda{5,6,7}Volume group "vbirdvg" successfully created
[root@study ~]# vgscanReading all physical volumes. This may take a while...Found volume group "vbirdvg" using metadata type lvm2 # 我们手动制作的Found volume group "centos" using metadata type lvm2 # 之前系统安装时作的
[root@study ~]# pvscanPV /dev/vda5 VG vbirdvg lvm2 [1008.00 MiB / 1008.00 MiB free]PV /dev/vda6 VG vbirdvg lvm2 [1008.00 MiB / 1008.00 MiB free]PV /dev/vda7 VG vbirdvg lvm2 [1008.00 MiB / 1008.00 MiB free]PV /dev/vda3 VG centos lvm2 [30.00 GiB / 14.00 GiB free]PV /dev/vda8 lvm2 [1.00 GiB]Total: 5 [33.95 GiB] / in use: 4 [32.95 GiB] / in no VG: 1 [1.00 GiB]
# 发现没!有三个 PV 被用去,剩下 1 个 /dev/vda8 的 PV 没被用掉!
[root@study ~]# vgdisplay vbirdvg--- Volume group ---VG Name vbirdvgSystem IDFormat lvm2Metadata Areas 3Metadata Sequence No 1VG Access read/writeVG Status resizableMAX LV 0Cur LV 0Open LV 0Max PV 0Cur PV 3Act PV 3VG Size 2.95 GiB <==整体的 VG 容量有这么大PE Size 16.00 MiB <==内部每个 PE 的大小Total PE 189 <==总共的 PE 数量共有这么多!Alloc PE / Size 0 / 0Free PE / Size 189 / 2.95 GiB <==尚可配置给 LV 的 PE数量/总容量有这么多!VG UUID Rx7zdR-y2cY-HuIZ-Yd2s-odU8-AkTW-okk4Ea
# 最后那三行指的就是 PE 能够使用的情况!由于尚未切出 LV,因此所有的 PE 均可自由使用。
这样就创建一个 VG 了!假设我们要增加这个 VG 的容量,因为我们还有 /dev/vda8 嘛!此时你可以这样做:
# 2\. 将剩余的 PV (/dev/vda8) 丢给 vbirdvg 吧!
[root@study ~]# vgextend vbirdvg /dev/vda8Volume group "vbirdvg" successfully extended[root@study ~]# vgdisplay vbirdvg
....(前面省略)....VG Size 3.94 GiBPE Size 16.00 MiBTotal PE 252Alloc PE / Size 0 / 0Free PE / Size 252 / 3.94 GiB
# 基本上,不难吧!这样就可以抽换整个 VG 的大小啊!
- 3. LV 阶段:对VG进行分区
lvcreate :创建 LV ;
lvscan :查询系统上面的 LV ;
lvdisplay :显示系统上面的 LV 状态;
lvextend :在 LV 里面增加容量;
lvreduce :在 LV 里面减少容量;
lvremove :删除一个 LV;
lvresize :对 LV 进行容量大小的调整;
[root@study ~]# lvcreate [-L N[mgt]] [-n LV名称] VG名称
[root@study ~]# lvcreate [-l N] [-n LV名称] VG名称
选项与参数:
-L :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE,因此这个数量必须要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。
-l :后面可以接 PE 的“个数”,而不是数量。若要这么做,得要自行计算 PE 数。
-n :后面接的就是 LV 的名称啦!
更多的说明应该可以自行查阅吧! man lvcreate # 1\. 将 vbirdvg 分 2GB 给 vbirdlv 喔!
[root@study ~]# lvcreate -L 2G -n vbirdlv vbirdvgLogical volume "vbirdlv" created
# 由于本案例中每个 PE 为 16M ,如果要用 PE 的数量来处理的话,那使用下面的指令也 OK喔!
# lvcreate -l 128 -n vbirdlv vbirdvg[root@study ~]# lvscanACTIVE '/dev/vbirdvg/vbirdlv' [2.00 GiB] inherit <==新增加的一个 LV 啰!ACTIVE '/dev/centos/root' [10.00 GiB] inheritACTIVE '/dev/centos/home' [5.00 GiB] inheritACTIVE '/dev/centos/swap' [1.00 GiB] inherit[root@study ~]# lvdisplay /dev/vbirdvg/vbirdlv--- Logical volume ---LV Path /dev/vbirdvg/vbirdlv # 这个是 LV 的全名喔!LV Name vbirdlvVG Name vbirdvgLV UUID QJJrTC-66sm-878Y-o2DC-nN37-2nFR-0BwMmnLV Write Access read/writeLV Creation host, time study.centos.vbird, 2015-07-28 02:22:49 +0800LV Status available# open 0LV Size 2.00 GiB # 容量就是这么大!Current LE 128Segments 3Allocation inheritRead ahead sectors auto- currently set to 8192Block device 253:3
- 文件系统阶段
# 1\. 格式化、挂载与观察我们的 LV 吧!
[root@study ~]# mkfs.xfs /dev/vbirdvg/vbirdlv <==注意 LV 全名!
[root@study ~]# mkdir /srv/lvm
[root@study ~]# mount /dev/vbirdvg/vbirdlv /srv/lvm
[root@study ~]# df -Th /srv/lvm
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.0G 33M 2.0G 2% /srv/lvm[root@study ~]# cp -a /etc /var/log /srv/lvm
[root@study ~]# df -Th /srv/lvm
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.0G 152M 1.9G 8% /srv/lvm <==确定是可用的啊!
3.3 放大 LV 容量 (P491)
需要下面这些流程:
- VG 阶段需要有剩余的容量:VG 容量不足, 最简单的方法就是再加硬盘!然后将该硬盘使用上面讲过的 pvcreate 及 vgextend 增加到该 VG 内即可
- LV 阶段产生更多的可用容量:如果 VG 的剩余容量足够了, 此时就可以利用 lvresize 这个指令来将剩余容量加入到所需要增加的 LV 设备内
- 文件系统阶段的放大:XFS 放大文件系统通过简单的 xfs_growfs 指令即可
范例:针对 /srv/lvm 再增加 500M 的容量
# 1\. 由前面的过程我们知道 /srv/lvm 是 /dev/vbirdvg/vbirdlv 这个设备,所以检查 vbirdvg 吧!
[root@study ~]# vgdisplay vbirdvg--- Volume group ---VG Name vbirdvgSystem IDFormat lvm2Metadata Areas 4Metadata Sequence No 3VG Access read/writeVG Status resizableMAX LV 0Cur LV 1Open LV 1Max PV 0Cur PV 4Act PV 4VG Size 3.94 GiBPE Size 16.00 MiBTotal PE 252Alloc PE / Size 128 / 2.00 GiBFree PE / Size 124 / 1.94 GiB # 看起来剩余容量确实超过 500M 的!VG UUID Rx7zdR-y2cY-HuIZ-Yd2s-odU8-AkTW-okk4Ea
# 既然 VG 的容量够大了!所以直接来放大 LV 吧!!# 2\. 放大 LV 吧!利用 lvresize 的功能来增加!
[root@study ~]# lvresize -L +500M /dev/vbirdvg/vbirdlvRounding size to boundary between physical extents: 512.00 MiBSize of logical volume vbirdvg/vbirdlv changed from 2.00 GiB (128 extents) to 2.50 GiB
(160 extents).Logical volume vbirdlv successfully resized
# 这样就增加了 LV 了喔!lvresize 的语法很简单,基本上同样通过 -l 或 -L 来增加!
# 若要增加则使用 + ,若要减少则使用 - !详细的选项请参考 man lvresize 啰![root@study ~]# lvscanACTIVE '/dev/vbirdvg/vbirdlv' [2.50 GiB] inheritACTIVE '/dev/centos/root' [10.00 GiB] inheritACTIVE '/dev/centos/home' [5.00 GiB] inheritACTIVE '/dev/centos/swap' [1.00 GiB] inherit
# 可以发现 /dev/vbirdvg/vbirdlv 容量由 2G 增加到 2.5G 啰![root@study ~]# df -Th /srv/lvm
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.0G 111M 1.9G 6% /srv/lvm
处理一下文件系统的容量,开始观察一下文件系统,然后使用 xfs_growfs 来处理;
# 3.1 先看一下原本的文件系统内的 superblock 记录情况吧!
[root@study ~]# xfs_info /srv/lvm
meta-data=/dev/mapper/vbirdvg-vbirdlv isize=256 agcount=4, agsize=131072 blks= sectsz=512 attr=2, projid32bit=1= crc=0 finobt=0
data = bsize=4096 blocks=524288, imaxpct=25= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=2560, version=2= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0[root@study ~]# xfs_growfs /srv/lvm # 这一步骤才是最重要的!
[root@study ~]# xfs_info /srv/lvm
meta-data=/dev/mapper/vbirdvg-vbirdlv isize=256 agcount=5, agsize=131072 blks= sectsz=512 attr=2, projid32bit=1= crc=0 finobt=0
data = bsize=4096 blocks=655360, imaxpct=25= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=2560, version=2= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0[root@study ~]# df -Th /srv/lvm
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.5G 111M 2.4G 5% /srv/lvm[root@study ~]# ls -l /srv/lvm
drwxr-xr-x. 131 root root 8192 Jul 28 00:12 etc
drwxr-xr-x. 16 root root 4096 Jul 28 00:01 log
# 刚刚复制进去的数据可还是存在的喔!并没有消失不见!
#发现到 1)整个 block group (agcount) 的数量增加一个!那个 block group 就是纪录新的设备容
#量之文件系统所在! 而你也会 2)发现整体的 block 数量增加了!这样整个文件系统就给他放大了!
xfs_growfs 命令
使用xfs_growfs命令增加 XFS 文件系统的大小。必须挂载 XFS 文件系统,并且底层设备上必须有可用空间。xfs_growfs 实用程序最常用于逻辑卷。xfs_growfs 命令的语法如下:
# xfs_growfs [options] mount-point 以下选项可用于 xfs_growfs 命令: -d:将文件系统的数据部分扩展到底层设备的最大大小。 -D [size] : 指定扩展文件系统数据部分的大小。[size] 参数以文件系统块的数量表示。 -L [size]:指定日志区域的新大小。这不会扩展大小,而是指定日志区域的新大小。因此,此选项可用于缩小日志区域的大小。您不能缩小文件系统的数据部分的大小。 -m [maxpct]:指定文件系统中可分配为 inode 的最大空间百分比的新值。对于 mkfs.xfs 命令,此选项是通过–i maxpct=[value]选项指定的。 #注意:目前无法缩小或减少 xfs 文件系统。因此,必须确保设备尺寸不大于预期尺寸。
3.4 使用 LVM thin Volume 让 LVM 动态自动调整磁盘使用率(p492)
LVM Thin Volume:实际用多少才分配多少容量给 LV
范例:
由 vbirdvg 的剩余容量取出 1GB 来做出一个名为 vbirdtpool 的 thin pool LV 设备,这就是所谓的磁盘容量储存池 (thin pool)
- 由 vbirdvg 内的 vbirdtpool 产生一个名为 vbirdthin1 的 10GB LV 设备
- 将此设备实际格式化为 xfs 文件系统,并且挂载于 /srv/thin 目录内!
# 1\. 先以 lvcreate 来创建 vbirdtpool 这个 thin pool 设备:
[root@study ~]# lvcreate -L 1G -T vbirdvg/vbirdtpool # 最重要的创建指令
[root@study ~]# lvdisplay /dev/vbirdvg/vbirdtpool--- Logical volume ---LV Name vbirdtpoolVG Name vbirdvgLV UUID p3sLAg-Z8jT-tBuT-wmEL-1wKZ-jrGP-0xmLtkLV Write Access read/writeLV Creation host, time study.centos.vbird, 2015-07-28 18:27:32 +0800LV Pool metadata vbirdtpool_tmetaLV Pool data vbirdtpool_tdataLV Status available# open 0LV Size 1.00 GiB # 总共可分配出去的容量Allocated pool data 0.00% # 已分配的容量百分比Allocated metadata 0.24% # 已分配的中介数据百分比Current LE 64Segments 1Allocation inheritRead ahead sectors auto- currently set to 8192Block device 253:6
# 非常有趣吧!竟然在 LV 设备中还可以有再分配 (Allocated) 的项目耶!果然是储存池!
[root@study ~]# lvs vbirdvg # 语法为 lvs VGnameLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convertvbirdlv vbirdvg -wi-ao---- 2.50gvbirdtpool vbirdvg twi-a-tz-- 1.00g 0.00 0.24
# 这个 lvs 指令的输出更加简单明了!直接看比较清晰!
# 2\. 开始创建 vbirdthin1 这个有 10GB 的设备,注意!必须使用 --thin 与 vbirdtpool 链接喔!
[root@study ~]# lvcreate -V 10G -T vbirdvg/vbirdtpool -n vbirdthin1
[root@study ~]# lvs vbirdvgLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convertvbirdlv vbirdvg -wi-ao---- 2.50gvbirdthin1 vbirdvg Vwi-a-tz-- 10.00g vbirdtpool 0.00vbirdtpool vbirdvg twi-aotz-- 1.00g 0.00 0.27
# 很有趣吧!明明连 vbirdvg 这个 VG 都没有足够大到 10GB 的容量,通过 thin pool
# 竟然就产生了 10GB 的 vbirdthin1 这个设备了!好有趣!
# 3\. 开始创建文件系统
[root@study ~]# mkfs.xfs /dev/vbirdvg/vbirdthin1
[root@study ~]# mkdir /srv/thin
[root@study ~]# mount /dev/vbirdvg/vbirdthin1 /srv/thin
[root@study ~]# df -Th /srv/thin
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdthin1 xfs 10G 33M 10G 1% /srv/thin
# 真的有 10GB !
# 4\. 测试一下容量的使用!创建 500MB 的文件,但不可超过 1GB 的测试为宜!
[root@study ~]# dd if=/dev/zero of=/srv/thin/test.img bs=1M count=500
[root@study ~]# lvs vbirdvgLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convertvbirdlv vbirdvg -wi-ao---- 2.50gvbirdthin1 vbirdvg Vwi-aotz-- 10.00g vbirdtpool 4.99vbirdtpool vbirdvg twi-aotz-- 1.00g 49.93 1.81
# 这时已经分配出 49% 以上的容量了!而 vbirdthin1 却只看到用掉 5% 而已!
# 所以,这个 thin pool 非常好用!但是在管理上,得要特别留意!
3.5 LVM 的 LV 磁盘快照
快照就是将当时的系统信息记录下来,就好像照相记录一般! 未来若有任何数据更动了,则原始数据会被搬移到快照区,没有被更动的区域则由快照区与文件系统共享;
针对传统 LV 磁盘进行快照的创建,大致流程为:
预计被拿来备份的原始 LV 为 /dev/vbirdvg/vbirdlv 这个东西;
使用传统方式快照创建,原始碟为 /dev/vbirdvg/vbirdlv,快照名称为 vbirdsnap1,容量为 vbirdvg 的所有剩余容量
传统快照区的创建
- 传统快照区的建立
# 1\. 先观察 VG 还剩下多少剩余容量
[root@study ~]# vgdisplay vbirdvg
....(其他省略)....Total PE 252Alloc PE / Size 226 / 3.53 GiBFree PE / Size 26 / 416.00 MiB
# 就只有剩下 26 个 PE 了!全部分配给 vbirdsnap1 啰!# 2\. 利用 lvcreate 创建 vbirdlv 的快照区,快照被取名为 vbirdsnap1,且给予 26 个 PE
[root@study ~]# lvcreate -s -l 26 -n vbirdsnap1 /dev/vbirdvg/vbirdlvLogical volume "vbirdsnap1" created
# 上述的指令中最重要的是那个 -s 的选项!代表是 snapshot 快照功能之意!
# -n 后面接快照区的设备名称, /dev/.... 则是要被快照的 LV 完整文件名。
# -l 后面则是接使用多少个 PE 来作为这个快照区使用。[root@study ~]# lvdisplay /dev/vbirdvg/vbirdsnap1--- Logical volume ---LV Path /dev/vbirdvg/vbirdsnap1LV Name vbirdsnap1VG Name vbirdvgLV UUID I3m3Oc-RIvC-unag-DiiA-iQgI-I3z9-0OaOzRLV Write Access read/writeLV Creation host, time study.centos.vbird, 2015-07-28 19:21:44 +0800LV snapshot status active destination for vbirdlvLV Status available# open 0LV Size 2.50 GiB # 原始碟,就是 vbirdlv 的原始容量Current LE 160COW-table size 416.00 MiB # 这个快照能够纪录的最大容量!COW-table LE 26Allocated to snapshot 0.00% # 目前已经被用掉的容量!Snapshot chunk size 4.00 KiBSegments 1Allocation inheritRead ahead sectors auto- currently set to 8192Block device 253:11
[root@study ~]# mkdir /srv/snapshot1
[root@study ~]# mount -o nouuid /dev/vbirdvg/vbirdsnap1 /srv/snapshot1
[root@study ~]# df -Th /srv/lvm /srv/snapshot1
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.5G 111M 2.4G 5% /srv/lvm
/dev/mapper/vbirdvg-vbirdsnap1 xfs 2.5G 111M 2.4G 5% /srv/snapshot1
# 有没有看到!这两个咚咚竟然是一模一样喔!我们根本没有动过
# /dev/vbirdvg/vbirdsnap1 对吧!不过这里面会主动记录原 vbirdlv 的内容!
因为 XFS 不允许相同的 UUID 文件系统的挂载,因此我们得要加上那个 nouuid 的参数,让文件系统忽略相同的 UUID 所造成的问题! 没办法啊!因为快照出来的文件系统当然是会一模一样的
- 利用快照区恢复系统
# 1\. 先将原本的 /dev/vbirdvg/vbirdlv 内容作些变更,增增减减一些目录吧!
[root@study ~]# df -Th /srv/lvm /srv/snapshot1
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.5G 111M 2.4G 5% /srv/lvm
/dev/mapper/vbirdvg-vbirdsnap1 xfs 2.5G 111M 2.4G 5% /srv/snapshot1
[root@study ~]# cp -a /usr/share/doc /srv/lvm
[root@study ~]# rm -rf /srv/lvm/log
[root@study ~]# rm -rf /srv/lvm/etc/sysconfig
[root@study ~]# df -Th /srv/lvm /srv/snapshot1
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs 2.5G 146M 2.4G 6% /srv/lvm
/dev/mapper/vbirdvg-vbirdsnap1 xfs 2.5G 111M 2.4G 5% /srv/snapshot1
[root@study ~]# ll /srv/lvm /srv/snapshot1
/srv/lvm:
total 60
drwxr-xr-x. 887 root root 28672 Jul 20 23:03 doc
drwxr-xr-x. 131 root root 8192 Jul 28 00:12 etc
/srv/snapshot1:
total 16
drwxr-xr-x. 131 root root 8192 Jul 28 00:12 etc
drwxr-xr-x. 16 root root 4096 Jul 28 00:01 log
# 两个目录的内容看起来已经不太一样了喔!检测一下快照 LV 吧!
[root@study ~]# lvdisplay /dev/vbirdvg/vbirdsnap1--- Logical volume ---LV Path /dev/vbirdvg/vbirdsnap1
....(中间省略)....Allocated to snapshot 21.47%
# 鸟哥仅列出最重要的部份!就是全部的容量已经被用掉了 21.4% 啰!
# 2\. 利用快照区将原本的 filesystem 备份,我们使用 xfsdump 来处理!
[root@study ~]# xfsdump -l 0 -L lvm1 -M lvm1 -f /home/lvm.dump /srv/snapshot1
# 此时你就会有一个备份数据,亦即是 /home/lvm.dump 了!
# 3\. 将 vbirdsnap1 卸载并移除 (因为里面的内容已经备份起来了)
[root@study ~]# umount /srv/snapshot1
[root@study ~]# lvremove /dev/vbirdvg/vbirdsnap1
Do you really want to remove active logical volume "vbirdsnap1"? [y/n]: yLogical volume "vbirdsnap1" successfully removed[root@study ~]# umount /srv/lvm
[root@study ~]# mkfs.xfs -f /dev/vbirdvg/vbirdlv
[root@study ~]# mount /dev/vbirdvg/vbirdlv /srv/lvm
[root@study ~]# xfsrestore -f /home/lvm.dump -L lvm1 /srv/lvm
[root@study ~]# ll /srv/lvm
drwxr-xr-x. 131 root root 8192 Jul 28 00:12 etc
drwxr-xr-x. 16 root root 4096 Jul 28 00:01 log
# 是否与最初的内容相同啊!这就是通过快照来还原的一个简单的方法啰!
3.6 LVM 相关指令汇整与 LVM 的关闭
任务 | PV 阶段 | VG 阶段 | LV 阶段 | filesystem(XFS) | filesystem(EXT4) |
搜寻(scan) | pvscan | vgscan | lvscan | lsblk, blkid | lsblk, blkid |
创建(create) | pvcreate | vgcreate | lvscan | mkfs.xfs | mkfs.ext4 |
列出(display) | pvdisplay | vgdisplay | lvdisplay | df, mount | df, mount |
增加(extend) | vgextend | lvextend (lvresize) | xfs_growfs | resize2fs | |
减少(reduce) | vgreduce | lvreduce (lvresize) | 不支持 | resize2fs | |
删除(remove) | pvdisplay | vgremove | lvremove | umount, 重新格式化 | umount, 重新格式化 |
改变容量(resize) | lvresize | xfs_growfs | resize2fs | ||
改变属性(attribute) | pvdisplay | vgchange | lvchange | /etc/fstab, remount | /etc/fstab, remount |
- 删除LVM
先卸载系统上面的 LVM 文件系统 (包括快照与所有 LV);
- 使用 lvremove 移除 LV ;
- 使用 vgchange -a n VGname 让 VGname 这个 VG 不具有 Active 的标志;
- 使用 vgremove 移除 VG:
- 使用 pvremove 移除 PV;
- 最后,使用 fdisk 修改 ID 回来啊!
[root@study ~]# umount /srv/lvm /srv/thin /srv/snapshot1
[root@study ~]# lvs vbirdvgLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync vbirdlv vbirdvg -wi-a----- 2.50gvbirdthin1 vbirdvg Vwi-a-tz-- 10.00g vbirdtpool 4.99vbirdtpool vbirdvg twi-aotz-- 1.00g 49.93 1.81
# 要注意!先删除 vbirdthin1 --> vbirdtpool --> vbirdlv 比较好!
[root@study ~]# lvremove /dev/vbirdvg/vbirdthin1 /dev/vbirdvg/vbirdtpool
[root@study ~]# lvremove /dev/vbirdvg/vbirdlv
[root@study ~]# vgchange -a n vbirdvg0 logical volume(s) in volume group "vbirdvg" now active
[root@study ~]# vgremove vbirdvgVolume group "vbirdvg" successfully removed
[root@study ~]# pvremove /dev/vda{5,6,7,8}