磁盘配额(Quota)与高级文件系统管理(14章)

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 就是:

  1. 先让两颗磁盘组成 RAID 1,并且这样的设置共有两组;
  2. 将这两组 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 0RAID 1RAID 10RAID 5RAID 6
最少磁盘数22434
最大容错磁盘数(1)n-1n/212
数据安全性(1)完全没有 最佳        最佳  比RAID 5好
理论写入性能(2)n1n/2<n-1<n-2
理论写入性能(2)nnn<n-1<n-2
可用容量(3)n1n/2n-1n-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 环境:

  1. 利用 4 个 partition 组成 RAID 5;

  2. 每个 partition 约为 1GB 大小,需确定每个 partition 一样大较佳;

  3. 利用 1 个 partition 设置为 spare disk

  4. chunk 设置为 256K 这么大即可!

  5. 这个 spare disk 的大小与其他 RAID 所需 partition 一样大!

  6. 将此 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 &#124; 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)

需要下面这些流程:

  1. VG 阶段需要有剩余的容量:VG 容量不足, 最简单的方法就是再加硬盘!然后将该硬盘使用上面讲过的 pvcreate 及 vgextend 增加到该 VG 内即可
  2. LV 阶段产生更多的可用容量:如果 VG 的剩余容量足够了, 此时就可以利用 lvresize 这个指令来将剩余容量加入到所需要增加的 LV 设备内
  3. 文件系统阶段的放大: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

范例:

  1. 由 vbirdvg 的剩余容量取出 1GB 来做出一个名为 vbirdtpool 的 thin pool LV 设备,这就是所谓的磁盘容量储存池 (thin pool)

  2. 由 vbirdvg 内的 vbirdtpool 产生一个名为 vbirdthin1 的 10GB LV 设备
  3. 将此设备实际格式化为 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)pvscanvgscanlvscanlsblk, blkidlsblk, blkid
创建(create)pvcreatevgcreatelvscanmkfs.xfsmkfs.ext4
列出(display)pvdisplayvgdisplaylvdisplaydf, mountdf, mount
增加(extend)vgextendlvextend (lvresize)xfs_growfsresize2fs
减少(reduce)vgreducelvreduce (lvresize)不支持resize2fs
删除(remove)pvdisplayvgremovelvremoveumount, 重新格式化umount, 重新格式化
改变容量(resize)lvresizexfs_growfsresize2fs
改变属性(attribute)pvdisplayvgchangelvchange/etc/fstab, remount/etc/fstab, remount
  • 删除LVM
  1. 先卸载系统上面的 LVM 文件系统 (包括快照与所有 LV);

  2. 使用 lvremove 移除 LV ;
  3. 使用 vgchange -a n VGname 让 VGname 这个 VG 不具有 Active 的标志;
  4. 使用 vgremove 移除 VG:
  5. 使用 pvremove 移除 PV;
  6. 最后,使用 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}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24591.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT-5不能停!吴恩达LeCun直播回怼马斯克:汽车都还没发明,要什么安全带

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号 第一时间获取价值内容 梦晨 发自 凹非寺量子位 | 公众号 QbitAI 大模型研究不能停&#xff01; 吴恩达和LeCun为了这事儿&#xff0c;甚至亲自搞了场直播。毕竟再不出手&#xff0c;事态眼看着越来越严重了&#xff…

OpenAI创始人:面临GPU短缺恐慌,GPT-3或将开源!

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【目标检测和Transformer】交流群 转载自&#xff1a;机器之心 眼下 OpenAI 面临的最大问题是「缺芯」。 从 ChatGPT 问世以来&#xff0c;大模型和 AI 技术就引起全世界的广…

国产大模型赛道人才济济,AI大战究竟谁能折桂?

原创 | 文 BFT机器人 横空出世的ChatGPT迅速在全球掀起一股AI浪潮&#xff0c;而后GPT4的惊艳发布更是在科技界掷下一颗深水炸弹。 正如英伟达创始人黄仁勋在GTC2023上说的那样“我们正处于AI的iPhone时刻”&#xff0c;由ChatGPT掀起的科技风暴正席卷世界&#xff0c;“AI是否…

“心机boy”马斯克:明面上呼吁暂停先进AI研发,背地里悄悄买1万块GPU推进自研ChatGPT项目...

mi点击“开发者技术前线”&#xff0c;选择“星标” 让一部分开发者看到未来 来自&#xff1a;AI前线 为了研发自家 AIGC&#xff0c; 马斯克狂买 GPU 并四处挖人 早前 马斯克带头和数千名科技大佬呼吁&#xff1a;叫停超强AI研发6个月&#xff01;&#xff0c;而在当地时间 …

ChatGPT新功能曝光:可记住用户信息、上传文件和工作区

&#x1f989; AI新闻 &#x1f680; ChatGPT新功能曝光&#xff1a;可记住用户信息、上传文件和工作区 摘要&#xff1a;一张神秘截图曝光了ChatGPT新功能&#xff0c;包括可记住用户信息的"My profile"、上传和管理文件的"My files"以及可以让AI使用不…

【类ChatGPT】中文羊驼大模型Alpaca-13B体验

书接上回&#xff1a;https://blog.csdn.net/nlpstarter/article/details/129834424推荐一个在本地部署中文类ChatGPT大模型的开源项目https://blog.csdn.net/nlpstarter/article/details/129834424 之前在推荐了一个中文类ChatGPT的大模型&#xff0c;感兴趣的可以看一下上面…

一名七年老安卓的一二月小结

你好&#xff0c;我是 shixin&#xff0c;一名工作七年的安卓开发。 每两个月我会做一次总结&#xff0c;记下这段时间里有意义的事和值得反复看的内容&#xff0c;为的是留一些回忆、评估自己的行为、沉淀有价值的信息。 一转眼 2023 年过去了六分之一&#xff0c;这两个月经历…

蛋仔派对兑换礼包码分析

🍋前言 由于C站版权太多,所有的爬虫相关均为记录,不做深入! 接到了一个项目大概是电商老板想弄一个自动化工具,方便自己处理买家买的兑换码,一个一个的兑换有点累人,代码写到一半才发现由于自己的原因分析错了,刚刚开始我以为他的验证码是在html上的,就像这样 <…

残疾人手语交流辅助系统手语识别与翻译基于数据手套的虚拟手的实现

残疾人手语交流辅助系统手语识别与翻译&&基于数据手套的虚拟手的实现 1、 特征提取 原始数据含有背景等大量无用成分&#xff0c;通过骨架技术&#xff0c;直接获得手的运动信息&#xff0c;减小问题复杂度。硬件和软件使用的是&#xff1a;Kinect和OpenNI。Kinect可…

AI绘图网站 MJ(Midjourney) 基础讲解+注册教程

【ChatGPT】前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击查看学习资料&#xff09; 最近有很多伙计在在问如何使用AI作图&#xff0c;MJ当属第一了&#xff0c;不…

ControlNet精准控制AI绘画教程

ControlNet精准控制AI绘画教程 AI绘画相信大家都已经不陌生了&#xff0c;虽然AI绘画出图很方便&#xff0c;但是要让其生成一副自己满意的图&#xff0c;还是需要费一番心思&#xff0c;有时候多次调整关键词就是生成不了自己想要的画面&#xff0c;这些一直以来都是AI绘画的痛…

python爬虫教程实战

写了那么久的博客&#xff0c;终于有了属于自己的小窝&#xff0c;欢迎各位访问我的个人网站&#xff0c;未来我们一起交流进步。 ChatGPT国内镜像站https://gpt.huntersking.top 八方云已经跑路&#xff0c;但其他的如果有类似的bug也一样。 成品 失效 下载链接 https://wwh…

让 ChatGPT 快速实现 To-Do List Web 应用

体验 ChatGPT 有段时间了&#xff0c;关于它的代码能力&#xff0c;只是比较粗浅地使用过。比如让它解一道算法题、解释一段代码的含义等。但它的潜力不止于此&#xff0c;它可以做更多的事情。比如&#xff0c;我们可以让它实现一个 To-Do List Web 应用&#xff0c;像下图这样…

chrome设置黑暗模式的4种方法

chrome设置黑暗模式的4种方法 前言方式一&#xff1a;自带皮肤暗黑具体操作效果 方式二&#xff1a;自带内容暗黑具体操作效果 方式三&#xff1a;安装chrome主题方式四&#xff1a;使用插件效果 额外&#xff1a;开发工具的暗黑设置结语 前言 对于大部分chrome用户来说&#…

实现暗黑模式

一、先在全局css中创建.dark-theme和.light-theme类&#xff0c;在分别在该类中创建相同的var变量 二、在组件刷新时为html添加类&#xff0c;再添加一个按钮可以进行模式切换 效果如下 暗黑模式如下 最后&#xff01;&#xff01;&#xff01;此案例通过vue写的&#xff0…

为 TDesignBlazor 添加暗黑模式

本文将讲述我为 TDesignBlazor 开源项目提交 PR 的经历&#xff0c;主要介绍暗黑模式功能的实现以及之后如何在项目中使用。我将会分享我在实现这一功能时遇到的问题&#xff0c;以及我是如何解决这些问题的。我希望通过我的经历能够鼓励更多的人参与开源项目&#xff0c;为 TD…

暗黑模式(黑暗模式,深色模式)适配

暗黑模式&#xff08;黑暗模式&#xff0c;深色模式&#xff09;适配 全局关闭 打开Info.plist 项目配置文件&#xff0c;添加UIUserInterfaceStyle字段&#xff0c;key类型为String&#xff0c; 其value值设置为 Light模式。 部分关闭 iOS13之后UIViewController与UIView …

太强了,英伟达面对ChatGPT还有这一招...

大家好&#xff0c;我是 Jack。 今年可谓是 AI 元年&#xff0c;ChatGPT、AIGC、VITS 都火了一波。 我也先后发布了这几期视频&#xff1a; 这是一个大模型的时代&#xff0c;AI 能在文本、图像、音频等领域大放异彩&#xff0c;得益于大模型。而想要预训练大模型&#xff0c…

让GPT-3、ChatGPT、GPT-4一起做脑筋急转弯,GPT-4一骑绝尘!

作者 | python 一个烙饼煎一面一分钟&#xff0c;两个烙饼煎两面几分钟&#xff1f; 让你来回答&#xff0c;是不是一不小心就掉到沟里了&#xff1f;如果让大语言模型来做这种脑筋急转弯会怎样呢&#xff1f;研究发现&#xff0c;模型越大&#xff0c;回答就越可能掉到沟里&a…

用ChatGPT学习多传感器融合中的基础知识

该列表会不定期更新… 文章目录 困惑与解答&#xff1a;问题&#xff1a;匈牙利算法中的增广矩阵路径是什么意思解答&#xff1a;个人理解概述&#xff1a; 问题&#xff1a;扩展卡尔曼滤波是非线性方程求解问题&#xff0c;是将非线性方程拟合为线性方程吗解答&#xff1a;个…