Linux 磁盘管理 高级篇 -- quota,RAID,LVM

字数 6002阅读 602

1 概述

本文对配额,RAID,LVM的概念和具体创建过程做了介绍

2 配额

2.1 配额概念

在内核中执行

以文件系统为单位启用

对不同组或者用户的策略不同

根据块或者节点进行限制

执行软限制(soft limit)

硬限制(hard limit)

实现控制用户使用磁盘空间,防止某个用户无限制使用磁盘空间,对系统造成损害

配额要对磁盘独立分区进行控制,而且只能针对文件系统来进行配额,不能对文件夹进行控制,文件系统挂载选项要具备quota功能,在fstab里添加usrquota,grpquota

2.2 搬移目录数据到独立分区

假设原来家目录/home和根目录在同一磁盘上,当用户在自己家目录下无限使用空间,可能会导致磁盘空间不够,对系统造成严重的损害,因此,迁移旧磁盘/home的数据到独立的磁盘上,步骤如下

1新建一个磁盘/dev/sdb1,格式化后分区挂载到系统上,如挂载点/mnt/home

2数据迁移完成了,发通知告诉所有用户说明我们什么时间要维护系统,如取消旧目录/home挂载,系统暂时不能使用

3切换到单用户模式下进行操作init 1,确保所有用户不再对/home继续数据写入。

4迁移数据cp-a/home/* /mnt/home注意。这里我们明确home下都是用户的家目录,没有隐藏文件,所以我们就用/home/*形式进行拷贝

5建议提前做备份,如果确认数据迁移都完成,第4步操作完成后,数据都在磁盘/dev/sdb1下了

清空旧目录数据rm-rf/home/*

6.卸载掉/dev/sdb1在原来的挂载点/mnt/home。重新挂载到/home下

mount/dev/sdb1 /mnt/home

umount/dev/sdb1/home

这一步建议写入配置文件/etc/fstab里

vim/etc/fstab

/dev/sdb1/home ext4 defaults 0 0

到这里数据迁移完成,/home已经在独立的分区/dev/sdb1上

2.3 启用分区配额功能

1.在fstab里对应挂载分区的挂载选项添加usrquota,grpquota

生效配置,重新挂载分区mount –a remount /home

2创建磁盘配额数据库

配额是放到二进制的数据库里

quotacheck -cug/home在home里会生成两个quota的二进制文件,c是创建的意思,u对应usrquota,g对应grpquota

执行语句后,发现在/home下生成了两个二进制的文件,执行命令file /aquota.*查看新生成的文件的类型

如果出现如下的报错,请坚持selinux是否开启,getenforce,如果开启请关闭,setenforce0

3开启数据库

quotaon /home

4查看配额设置是否已经生效,如果显示on,表示已经生效

quotaon -p /home

5针对每个用户设置配额

这里的blocks单位就是1k。block是目前已经暂用多少空间,不可以通过设置得到。

inodes是当前已经创建文件的数量,后面的hard soft才是对文件数的现在,不可以通过设置得到。

grace是指宽限期,超出soft现在后,才会出现的日期,表示超过soft多少天后,即使没有超过hard现在,超过时间也是会导致不能创建任何的文件。可以通过edquota -t这个命令修改block或者是inode的值

edquota wang//针对sunny用户来修改配额

另外,edquota是交互式的命令,可以通过setquota实现非交换的配额设置

setquota sunny80000 100000 175 180 /home前面两个数字80000

100000分别对应block的soft和hard,后面的0 0是inode的现在,0 0表示不对文件数进行限制

到这里,quato针对用户的设置已经完成。接下来测试

6测试

切换到对应用户账号,然后在家目录下创建文件

su -wang

dd if=/dev/zero of=test1bs=1M count=65正常创建

dd if=/dev/zero of=test2bs=1M count=85出现报警,但是还是可以成功

dd if=/dev/zero of=test2bs=1M count=105失败,文件大小为上限100M

如果要针对用户去掉配额限制,只要把配合对应的hard和soft都调整为0就可以

文件占用的空间的大小是根据所有者来设置的。以下例子,把f1所有者改为mage后,可以看到files数量就少了一个

edquota –p wang mage 复制wang的磁盘配额设置给到mage这个账号

2.4针对组进行配额

组管理配额是针对整个组所有用户的空间或者文件数量使用总和进行限制

对组quota进行配置

edquota -g quota,限制如下

实验截图

管理员账号下repquato可以查看配额使用情况

2.5 xfs文件系统配额

XFS基于目录配额的Project Quota配置,和ext4是根据用户和组创建方法不一样。

关于xfs_quota的详细介绍,建议manxfs_quota查看,里面有详细的例子和各个参数的介绍

/etc/projectsMapping ofnumeric project identifiers to directories trees.

/etc/projidMapping ofnumeric project identifiers to project names.

这里简要介绍步骤

1.分区和挂载见ext4格式的例子

2.建立一个使用配置文件的Project

Quota文件目录并设置配额

mkdir -p /home/app

echo 42:/home/app >>/etc/projects

echo application:42 >>/etc/projid

xfs_quota -x -c 'project -s application'/home

xfs_quota -x -c 'limit -p bhard=100Mapplication' /home/

xfs_quota -x -c 'report /home/app'

xfs_quota -x -c 'limit -p bsoft=80Mapplication' /home/

3.查看配额报告信息

xfs_quota -x -c 'report /home/app

4. 测试,在/app下创建大于100M的文件,就会报警

3 RAID

3.1 RAID概念

raid每个硬盘取出的空间大小是要一致的

假设有一个3个硬盘组成的raid0,一个100M的文件要放到raid0里,该大文件会分成很多chunk(小块),然后分别将这些块放到raid的三块硬盘上写入。

raid1防止的是硬件损坏,如果在其中一块盘修改数据,另一块盘也会被修改。同步的。

raid4具有容错性和性能提高,一块当做校验的硬盘,但是raid4的问题是校验位固定往一块硬盘上写入的,根据经验,该校验位的硬盘损坏频率很高。

raid5.和raid4差不多,使用率也是(n-1)/n,但是校验位是平均放到其他硬盘上的,没有固定在一块硬盘,这样同一机器上硬盘的使用频率就差不多,所以损坏频率就都一样,也叫带有奇偶校验位的磁带机。当坏掉一块硬盘后,服务器的性能会下降,因为要去反正算错校验位的数据,对系统造成了压力。所以为了应对这种情况,raid5还有一个spare disk,要在机器上准备一个备用的硬盘。平常不参与raid工作。即spare disk。当发现有故障的硬盘,这块备用的硬盘会立即使用

raid6有两个校验位.使用率为(n-2)/n。坏掉两块硬盘也不会有问题。

raid10,先1后0,假设8块盘,先两两做成1,再把4组做成0,相对raid01容错性好,所以生产环境一般用raid10

raid01即先0后1,假设有8块硬盘,先4块4块做成raid0,然后再把两组raid0做成了raid1.

3.2 创建raid5

1.做raid先分区,类型选择raid

注意,这里如果整块硬盘都拿来做raid,可以不用做分区,更不存在选择类型raid。测试一下整块盘拿来用的情况

2.mdadm -C创建

mdadm -C /dev/md0-a yes-l 5-n 3-x 1 /dev/sd{c,d,e,f}1

注意,这个创建过程比较慢

可以用

cat/proc/mdstat

mdadm-D/dev/md0查看raid的状态

3.写入配置文件,系统默认没有mdadm.conf的文件,需要手动生成

mdadm-Ds> /etc/mdadm.conf

这里的s是小写字母s,这个配置文件如果不生成,那么当禁用raid后,想要再次重启就起不来了

/etc/mdadm.conf语法如下

4. 格式化新的raid分区文件

mkfs.ext4/dev/md0

5 挂载

mount/dev/md0/mnt/raid

写入配置文件

vim /etc/fstab

/dev/md0/mnt/raidext4defaults00

到这里raid就创建完成了。

3.3 测试性能和容错性

3.3.1 测试写性能

raid5写性能并没有提高太多

dd if=/dev/zeroof=/dev/raid/bigfile bs=1M count=1024

3.3.2 测试读性能

raid5读性能相对普通硬盘有较大的提高

dd if=/dev/raid/bigfileof=/dev/null

3.3.3 测试容错性

模拟逻辑故障mdadm /dev/md0 -f /dev/sdc1

移除损坏的sdc1mdadm /dev/md0-r/dev/sdc1

添加硬盘mdadm/dev/md0-a /dev /sdc1

模拟物理性的损坏,硬盘故障后,raid的性能会严重降低

直接移除一个硬盘,在虚拟机上,直接移除掉一块硬盘,如果要添加回去用,添加硬盘后,执行

mdadm/dev/md0-a /dev /sdc1

3.4 增加新的成员

#mdadm –G /dev/md0 –n4 -a /dev/sdf1这样就会在增加一块硬盘到raid里,由原来的3块硬盘变成了4块硬盘做raid5.

如果要加一块是spare,即备用的盘,spare状态的盘可以有很多块,执行如下语句

mdadm/dev/md0-a /dev/sdf2.

3.5 停止raid

1.取消挂载,umount,同时把配置文件/etc/fstab里的对应md0信息删掉

2.停止raid ,

mdadm -S /dev/md0//注意,这里-S是大写字母S

这里如果要重新激活,可以用语句mdadm  -A  -s /dev/md0 激活,然后才能重新挂载

3.清掉生成的配置文件

rm –rf /etc/mdadm.conf

4.清除raid上元数据

mdadm--zero-superblock /dev/sd{b,c,d,e}

删掉raid后,raid的信息还在,如果不清,这些盘就不能用,重启机器后这些盘还会启用raid,所以要清除raid数据。注意,如果这些数据不清除,即使做了1—3步骤,当重启机器后,就会变成md127的raid。处理办法是先停掉md127: mdadm

-S /dev/md127,然后在通过blkid把查出来之前做raid的盘全部用第4步的方法清空。

这里如果没有清干净,下次重新给这些盘分区,分区还是会显示旧的raid原信息。所以拿掉raid建议都做一下这步,如果比较顽强,重启后还是出现,再次执行这个清空步骤,把对应的分区raid旧的元数据清掉

清除raid,如果停raidmd0后,执行mdadm--zero-superblock /dev/sd{b,c,d,e},这个raid md0

又复活了,如下,多次停掉还是一样的问题,这个情况可能是raid里某个分区处于忙碌状态,导致整个raid都不能被清空,建议直接删掉raid对应的每个分区,然后同步硬盘,看看是否同步磁盘partprobe后,看看磁盘是否正常被清掉了,用blkid查看对应分区的相同UUID是否没了,如果没了,就正常。如果同步还是有问题,在具体看是哪个盘有问题,可以重复清空对应分区的元数据,已经删掉分区进行同步处理

备注,特殊情况下,清掉raid有时比较麻烦,可以通过清空元数据,重启,清空对应分区,三个方式进行处理。如果再次重启,没有启动raid,说明已经完成卸载raid的工作。

3.6 创建raid10

以下仅介绍创建raid的方法,分区,格式化和挂载需读者自行创建

方法一,先建1后建0

mdadm -C /dev/md0 -a yes -l 1 -n 2 /dev/sdb{1,2}

mdadm -C /dev/md1 -a yes -l 1 -n 2 /dev/sdc{1,2}

mdadm -C /dev/md2 -a yes -l 0  -n 2 /dev/md{0,1}

方法二,直接创建

mdadm -C /dev/md0 -a yes -l 10 -n 4 /dev/sdb{1,2} /dev/sdc{1,2}

4 LVM

4.1 LVM概念

创建成物理卷后相当于给分区贴了一个标签,告诉系统这些硬盘以后可以用来创建LV,然后要把物理卷组合在一起,创建卷组,卷组的空间为物理卷空间的总和。然后再将卷组创建为逻辑卷。

扩容的时候,就是要将新的硬盘建成物理卷,然后再加到对应的卷组,则卷组的空间就扩展了。逻辑卷的读写性能不比物理分区差

LVM的LV的容量默认是256G,原因是一个lv里面PE最多是65536个,每个PE默认大小是4M,所以65536*4M/1024=256G,因为PE数量调整不了,所以我们可以通过调整PE的大小来进行调整,在创建VG的时候用选项-s来指定PE的值,如将PE=16M,那么LV的最大总量就可以达到1TB的容量。

LVM的相关指令汇总如下

4.2 创建逻辑卷

1.分区,选择类型是8e,这里组合的分区的大小可以不一样大

2.pvcreate /dev/sdb1 /dev/sdc1

3 pvs或pvdisplay进行查看

4创建卷组vgcreate  vg0  /dev/sd{b,c}1

5 vgs或vgdisplay查看卷组

6创建逻辑卷lvcreate-n lv0 -l 50%vg vg0

这里-L也可以跟大小10G

7查看lvdisplay

ll/dev/vg0/*可以看到有链接文件

8格式化,给文件创建系统

mkfs.xfs /dev/vg0/lv0

9挂载,写入配置文件

到这里,创建成功

4.3 扩展LVM空间

扩展是先扩展逻辑卷后再同步文件系统

先用vgdisplay查看空间。看看剩余有多少卷组空间可以分配,

4.3.1 如果有剩余空间

扩展逻辑卷,两个写法,如下

lvextend -l +2000 /dev/vg0/lv0

lvextend -L +5G /dev/vg0/lv0

注意大写L和小写l后面跟的单位不一样,大写L后面跟单位,多少M或G等,小写的l跟多少个逻辑卷单位

增加完成后,用lvdisplay查看空间增加情况

然后用df –h查看逻辑卷目前的文件系统空间情况,因为新增加的空间还没有创建文件系统,所以用df看不到新增加后的大小。需要同步

如果是xfs文件系统,同步命令为xfs_growfs /mnt/lv0后面跟着的是挂载点,将同步新增加的空间的文件系统,xfs的文件系统只能增加,不能减少

如果是ext文件系统的同步用resize2fs /dev/vg0/lv17G

如果出现如下的报错,建议同步语句中不要写扩容后的大小,命令resize2fs /dev/vg0/lv1

[root@localhost lv0]# resize2fs/dev/vg0/lv0 9.6G

resize2fs 1.41.12 (17-May-2010)

resize2fs: Invalid new size: 9.6G

ext4文件系统可以缩减空间,但是一般生产环境不缩减空间,如果要缩减,要先做好原来数据备份后再进行缩减

4.3.2 步骤如下

1.分出一块分区,类型选择逻辑卷sda7

fdisk/dev/sda--> n-->7-->+3G-->t—8e->w

2.pvcreate /dev/sda7

3.vgextend vg0 /dev/sda7

4.扩展逻辑卷

lvextend -L  7G /dev/vg0/lv1

5.同步文件系统

resize2fs /dev/vg0/lv1

注意,这里扩展逻辑卷和同步文件系统,可以直接用一条命令创建,如下

lvextend -r -L +500M  /dev/vg0/lv1

4.4 缩减空间

缩减则是先缩减文件系统再缩减逻辑卷,注意缩减前要先把数据做好备份,才能做缩减,否则数据可能丢失,如果,当前数据量大于要减少后的盘的大小,则数据会部分丢失,步骤如下:

umount /mnt/lv1

e2fsck  -f  /dev/vg0/lv1 //系统强制要求的步骤

resize2fs /dev/vg0/lv1 5G

lvreduce -L 5G /dev/vg0/lv1

mount-a

4.5 迁移逻辑卷

首先要确保要迁移的逻辑卷和新的机器上已有的逻辑卷名称不一样,可以重命名

1.umount /mnt/lv0

2.确保逻辑卷的名字和新机器上的逻辑卷不同名,同名就直接改掉

lvrename /dev/vg0/lv0 newlv0

vgrename vg0 newvg0

3.改成非活动状态,pvdisplay查看

vgchange -an newvg0

4.导出逻辑卷

vgexportnewvg0

5.拆除硬盘,把拔下来的硬盘插入目标主机,这边虚拟机上操作硬盘移除和插入新主机,主要是把硬盘文件移动到新主机的目录下,新主机添加硬盘选择已有的磁盘,选中对应的移动过来的硬盘文件.vmk,完成硬盘的添加

6.在新主机上用pvscan扫描,这步可以不操作

7.导入硬盘

vgimport newvg0

8.激活新增加的硬盘

vgchange -ay newvg0

9.挂载

mount /dev/newvg0/newlv0  /mnt/newlv0

完成迁移

4.6 从逻辑卷里删除正在使用的物理分区

pvdisplay看看要移走的分区是否有人用,有人用的话,

pvdispaly查看到如果total PE和free PE一样大,表示没人用,可以直接移走

4.6.1 没有数据,方法如下

1.从逻辑卷里移走

vgreduce vg0 /dev/sda7

2.去掉物理卷标签

pvremove /dev/sda7

3.直接删掉分区fdisk/dev/sda -->d-->7

如果用pvdiskpaly查看到有数据,表示有人用,就要迁走数据到同一卷组的其他可用的PE上执行

pvmove /dev/sda6

移走sda6上的PE到同一卷组的剩余PE后才能拆掉空间,这里要确认同一卷组还有多余的空间,即PE,才能移走数据

4.6.2 如果同一卷组没有多余的空间,要先加卷组空间

1.新建一块分区fdisk/dev/sda->n-->7-->t—8e-->w

2.pvcreate /dev/sda7

3.vgextend vg0 /dev/sda7

4.有空间后就可以移走数据,pvmove命令会在同一卷组里找到其他空闲空间进行数据的存放

pvmove /dev/sda6

5.从vg0里删掉/dev/sda6这块盘

vgreduce vg0/dev/sda6

6.删掉空间

pvremove /dev/sda6

7.通过fdisk移除分区

4.7 逻辑卷快照

逻辑卷快照相当于是把当前的状态记录下来,有备份的效果,但是不能代替备份,因为备份可以备份到其他机器上,快照都是在本地磁盘下

逻辑卷快照的原理是在同一个卷组里也要创建一个快照逻辑卷,快照会占用一定大小的空间。快照之所以快,原因是没有真正拷贝数据,而是分配了一定的空间来使用,但是后期数据有变更时,旧的数据就会被推送到快照空间,即快照存放最旧的数据,当前的逻辑卷存放最新的数据,没有变更的数据就不会存放到快照里。但是快照会导致服务器性能下降,因为快照会做备份的操作,导致快照会导致服务器性能下降,所以一般用于测试环境。

新建快照速度很快

4.7.1 创建LVM快照

创建快照命令如下,-s表明是做快照,-p指定属性为只读

lvcreate-nlv1-snapshot-s-L100M-pr/dev/vg0/lv1

挂载快照

mount/dev/lv1-snapshot/mnt/snap

测试

在数据还没修改前,/mnt/snap看到的快照数据实际是lv1上的原始数据,此时还没做任何备份操作

1.当在lv1上修改数据,一旦数据被修改后,/mnt/snap就保存旧的数据,新的数据在lv1上

2.将原来的lv1删掉一个文件,则被删掉的文件就会被复制到snap上

3.在lv1上新建一个文件,snap上不会生成有新的文件

4.7.2 恢复LVM备份

1.取消逻辑卷和快照的挂载

2.合并数据,恢复后,快照会被删掉。

lvconvert--merge/dev/vg0/lv1-snapshot

如果没有取消挂载,就进行数据恢复,就会出现如下对的报错

[root@localhost ~]# lvconvert --merge/dev/vg0/lv0-snap3

Can't merge over open origin volume

Can't merge when snapshot is open

Merging of snapshot lv0-snap3 will start next activation.

然后,即使取消挂载,要再次恢复原始数据时候,就会出现如下的报错

[root@localhost ~]#lvconvert --merge /dev/vg0/lv0-snap3

Snapshot lv0-snap3 is already merging

Unable to merge LV "lv0-snap3" intoits origin.

如果遇到这样的报错,查看还是出现异常,因为lv0还没被恢复到原始数据,但是重启发现就正常了,出现这个报错,原因是未取消快照盘的挂载就执行了恢复的操作

所以,要恢复快照,即恢复原始数据,一定要取消挂快照的挂载后才能进行恢复

如果不重启机器,解决办法是同时取消快照盘和lv0盘的挂载,将lv0设为未激活,然后再次激活,最后重新挂载,就可以恢复到快照时的数据

umount /mnt/lv0

umount /mnt/snap

lvchange -an /dev/vg0/lv0

lvchange -ay /dev/vg0/lv0

mount /dev/vg0/lv0 /mnt/lv0

4.8 删除逻辑卷

1.取消挂载,

2.删除逻辑卷,如果逻辑卷上有快照,系统会提示先删快照再删逻辑卷,此次操作,会清空数据

lvremove  /dev/vg0/lv1

3.删卷组

vgremove vg0

4.删除物理卷

pvremove /dev/sd{a,b,c}

5.通过fdisk删掉之前创建逻辑卷的分区,达到彻底删除的效果

5 附录

创造一个即有LVM的的优点,弹性调整filesystem的大小,同时又具备磁盘阵列的效能和备份功能的文件系统

思路先建raid再建LVM

1.用fdisk分区sd{b,c,d,e,f}1,五个

2.将多个分区通过命令mdadm创建一个raid5的磁盘阵列,并生成配置文件

mdadm-C/dev/md0-ayes-l5-n 4-x 1/dev/sd{b,c,d,e,f}1

mdadm-Ds >/etc/mdadm.conf

3.创建PG,VG,LV

pvcreate/dev/md0

vgcreatesunny_raid_vg/dev/md0

lvcreate-L 10G-nsunny_raid_lvsunny_raid_vg

4.格式化lv文件系统

mkfs.ext4/dev/sunny_raid_vg/sunny_raid_lv

5.挂载

mkdir /dev/raidlv

mount/dev/sunny_raid_vg/sunny_raid_lv/mnt/raidlv

移除设备

思路卸载lv的挂载后,先拆除lv,后停掉raid

步骤如下

umount /dev/raidlv

lvremove/dev/sunny_raid_vg/sunny_raid_lv

vgchange-ansunny_raid_vg

vgremovesunny_raid_vg

pvremove/dev/md0

mdadm-S/dev/md0

rm-rf/etc/mdadm.conf

mdadm--zero-superblock /dev/sd{b,c,d,e,f}1

用fdisk将对应的分区删掉

到此,实验完成。

推荐阅读更多精彩内容