磁盘配额

基于用户或者组,限制用户的使用空间以及文件个数

限制使用空间

mount -o usrquota /dev/sdb(磁盘) /mnt (挂载点)开启用户配额

edquota -u robin 对用robin配额

Disk quotas for user robin (uid 1007):
Filesystem                   blocks       soft       hard     inodes     soft     hard
/dev/sdb                          0          0         102400          0        0       20
/dev/sdb                          0          0         102400          0        0       20

blocks 表示用户已使用空间(不能修改)

soft 空间软限

hard 空间硬限

inodes 表示用已创建文件个数(不能修改)

soft 个数软限

hard 个数硬限

[root@localhost ~]# quotaon /mnt/ 激活配额

[root@localhost ~]# chmod o=rwx /mnt 测试权限

测试空间限制

[robin@localhost mnt]$ dd if=/dev/zero of=data bs=101M count=1

dd: 写入"data" 出错: 超出磁盘限额

[robin@localhost mnt]$ ll -h

-rw-r--r-- 1 robin devel 100M 12月 30 15:19 data

测试文件个数

[robin@localhost mnt]$ touch abc{1..21}.txt

touch: 无法创建"abc21.txt": 超出磁盘限额

组配额

[root@localhost mnt]# groupadd devel

[root@localhost mnt]# useradd -g devel robin

[root@localhost mnt]# useradd -g devel zorro

[root@localhost ~]# mount -o grpquota /dev/sdb /mnt

[root@localhost ~]# edquota -g devel

Disk quotas for group devel (gid 1002):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb                          0          0          102400          0        0        20

[root@localhost ~]# quotaon /mnt/

[root@localhost ~]# quotaoff /mn

 

[robin@localhost mnt]$ dd if=/dev/zero of=/mnt/robin1 bs=110M count=1

dd: 写入"/mnt/robin1" 出错: 超出磁盘限额

[robin@localhost mnt]$ ll -h

-rw-r--r-- 1 robin devel 100M 12月 30 16:27 robin1

 

[root@localhost mnt]# su - zorro

[zorro@localhost ~]$ dd if=/dev/zero of=/mnt/zorro1 bs=10M count=1

[zorro@localhost ~]$ ll -h /mnt/

-rw-r--r-- 1 robin devel 100M 12月 30 16:27 robin1

-rw-r--r-- 1 zorro devel 0 12月 30 16:28 zorro1

 

软限制:

[root@localhost ~]# edquota -t 查看宽限时间

Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem             Block grace period     Inode grace period
/dev/sdb                  10seconds               10seconds

[root@localhost ~]# edquota -u robin

Disk quotas for user robin (uid 1007):
Filesystem                   blocks       soft       hard     inodes     soft     hard
/dev/sdb                          0      51200     102400          0       10       20

测试

[robin@localhost ~]$ dd if=/dev/zero of=/mnt/robin1 bs=60M count=1

[root@localhost ~]# repquota -a
*** Report for user quotas on device /dev/sdb
Block grace time: 00:00; Inode grace time: 00:00
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
root      --       0       0       0              3     0     0
robin     +-   61440   51200  102400   none       1    10    20

grace=none后

[robin@localhost ~]$ dd if=/dev/zero of=/mnt/robin2 bs=10M count=1

dd: 打开"/mnt/robin2" 失败: 超出磁盘限额

恢复限制

[robin@localhost ~]$ rm -rf /mnt/robin1

[robin@localhost ~]$ dd if=/dev/zero of=/mnt/robin2 bs=110M count=1

dd: 写入"/mnt/robin2" 出错: 超出磁盘限额

[robin@localhost ~]$ ll -h /mnt/

-rw-r--r-- 1 robin devel 100M 12月 30 16:44 robin2

GPT分区

GPT: global parttion table 全局分区表

1.磁盘大于2TB

2.分区超过14个可用分区

 

[root@localhost ~]# parted /dev/sdb

GNU Parted 3.1

使用 /dev/sdb

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) mklabel

新的磁盘标签类型? GPT

警告: 正在使用 /dev/sdb 上的分区。

忽略/Ignore/放弃/Cancel? i 忽略已有分区表

警告: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you

want to continue? 确认后移除现有数据

是/Yes/否/No? yes

(parted) mkpart

分区名称? []? sdb1 分区名字

文件系统类型? [ext2]? xfs 将使用文件系统

起始点? 0 分区起始位置

结束点? 500M 分区结束位置

警告: The resulting partition is not properly aligned for best performance.

忽略/Ignore/放弃/Cancel? i 确认

(parted) p 查看分区信息

Model: VMware, VMware Virtual S (scsi)

Disk /dev/sdb: 2147MB

Sector size (logical/physical): 512B/512B

Partition Table: gpt

Disk Flags:

Number Start End Size File system Name 标志

1 17.4kB 500MB 500MB sdb1

(parted) quit 退出分区命令

 

删除分区

[root@localhost ~]# parted /dev/sdb

GNU Parted 3.1

使用 /dev/sdb

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted) rm 1 删除分区编号

(parted) quit 退出命令

XFS文件系统

ext4文件系统

mkfs.ext4 /dev/sdb1

超级块: block总数 inode总数 free block空闲块 free inode空闲inode block size 块大小 block per group 一个组内有8192块

若干块组:

块组:

[root@robin ~]# dumpe2fs /dev/sda1 查看块组与超级块信息

主superblock 备superblock

块描述:

保留块

block bitmap 和 inode bitmap

inode表: 一个inode占用那些数据块

XFS文件系统的配置

[root@localhost ~]# xfs_info /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=30517 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=122066, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =external               bsize=4096   blocks=122112, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

基本上XFS就是一个日志式文件系统,之所以现在把它当预设的文件系统 是因为它原本就是被开发用于高容量磁盘以及高性能文件系统之用的,相当适合于现在的环境。此外,几乎所有EXT4文件系统具有的功能,xfs都具备。

 

xfs文件系统在资料的分布上,主要规划为三个部分:资料区(data section),文件系统活动登录区(日志区)(log section),实时运作(realtime section)。具体如下:

 

1资料区(data section)

这个区域基本上与之前说的EXT家族一样,包括inode、block、superblock等数据都放在这个区块。这个数据区与ext家族的block group类似,分多个储存区群组(allocation groups)。每个储存区群组中都包含了整个文件系统的superblock,剩余空间的管理机制,inode的分配与追踪。此外,inode,block都是系统需要用到时才会动态配置产生,所以格式化动作较EXT家族快了很多。

其实,只需要把这个数据区的储存区群组当成ext的block群组就可以了,只是inode与block是动态产生的,并非一开始于格式化就完成配置的。

 

2.文件系统活动日志区(log section)

日志和数据分离

这个区域主要被用来记录文件系统的变化,具体原理和之前说的相同。

因为系统所有的动作都会在这个区域做个记录所以这个区域的磁盘活动是相当频繁的,xfs的设计在这里有一个巧妙之处,你可以指定外部的磁盘来作为xfs文件系统的日志管理区块。例如,你可以将SSD磁盘作为xfs的文件系统活动日志区,这样,当系统需要进行任何活动时,就可以更迅速的工作。

 

3.实时运作区(realtime section)

当有文件要被建立时,xfs会在这个区段里找一个到数个extent区块,将文件放置在这个区块中,等到分配完毕后,再写入到data section的inode和block中。这个extent区块的大小得要在格式化的时候就先指定,最小值为4K最大可到1G。一般非磁盘阵列的磁盘默认为64K容量,而具有类似磁盘阵列的stripe情况下,则建议extent设定为与stripe一样大较佳。这个extent最好不要乱动,因为可能会影响到实体磁盘的效能。

 

 

下面解释一下以上输出的信息:

 

isize : inode的容量,这里为256bytes。

agcount:储存区群组的个数,这里有4个。

agsize : 每个储存区群组里的block个数,这里为32000个。

sectsz:逻辑扇区(sector)的容量,这里为512bytes。

bsize:每个block的容量为4 k。

blocks:共有128000个block在这个文件系统内。

sunit,swidth:与磁盘阵列的stripe相关性较高,这里暂时不说明。

internal,指这个登录区的位置在文件系统内,而不是外部系统的意思,占用了4K * 853空间。

第9行:realtime区域,extent容量为4k,none=>不过目前没有使用。

xfs局限性

1.XFS是一个单节点文件系统,如果需要多节点同时访问需要考虑使用GFS2文件系统

2.XFS支持16EB文件系统,而redhat仅支持100TB文件系统

3.XFS较少的适用在单线程元数据密集的工作负荷,在单线程创建删除巨大数量的小文件的工作负荷下,其他文件系统(ext4)表现的会更好一些

4.xfs文件在操作元数据时可能会使用2倍的CPU资源,在CPU资源有限制的情况下可以研究使用不同文件系统

5.xfs更多适用的特大文件的系统快速存储,ext4在小文件的系统或系统存储带宽有限的情况下表现的更好

 

 

xfs文件系统磁盘配额

[root@localhost ~]# mount -o usrquota,grpquota /dev/sdb1 /mnt/ #开启配额 user group

[root@localhost ~]# xfs_quota -x -c 'report' /mnt/ # 报告配额状态

User quota on /mnt (/dev/sdb1)
Blocks
User ID          Used       Soft       Hard    Warn/Grace
root                0          0          0     00 [--------]
 
Group quota on /mnt (/dev/sdb1)
Blocks
Group ID         Used       Soft       Hard    Warn/Grace
root                0          0          0     00 [--------]

[root@localhost ~]# xfs_quota -x -c 'limit bsoft=50M bhard=100M robin' /mnt 指定配额

[root@localhost ~]# xfs_quota -x -c 'report' /mnt/ 查看配额

User quota on /mnt (/dev/sdb1)

Blocks
User ID          Used       Soft       Hard    Warn/Grace
root                0          0          0     00 [--------]
robin               0      51200     102400     00 [--------]
 
Group quota on /mnt (/dev/sdb1)
Blocks
Group ID         Used       Soft       Hard    Warn/Grace
root                0          0          0     00 [--------]

prject配额(对目录配额): 该目录下所有文件大小总和不超过设定大小

mkdir /quota #创建配额目录

mount -o prjquota /dev/sda8 /quota #挂载设备并开启支持目录配额的选项 prjquota和usrquota,grpquota冲突

mkdir /quota/test #创建测试目录

mount

/dev/sda8 on /quota type xfs (rw,relatime,attr2,inode64,prjquota) #保证参数开启

[root@localhost ~]# echo 50:/quota/test >> /etc/projects #[配置project 的id 和 对应的目录

[root@localhost ~]# echo test:50 >> /etc/projid #项目名称和对应的id

[root@localhost ~]# cat /etc/projects

50:/quota/test

[root@localhost ~]# cat /etc/projid

test:50

xfs_quota -x -c 'project -s -p /quota/test 50' #项目名称

xfs_quota -x -c 'limit -p bhard=100M 50' /quota #限制目录大小

查询

xfs_quota -x -c 'report' /quota #查询

[root@localhost ~]# yum install xfsprogs -y xfs文件系统得工具(命令)

 

日志和数据分离

使用一个块硬盘不同得分区做数据和日志分离没有意义

不分离

[root@localhost ~]# mkfs.xfs /dev/sdb1

 

分离

[root@localhost ~]# mkfs.xfs -f -l logdev=/dev/sdb2 /dev/sdb1

[root@localhost ~]# mount -t xfs -o logdev=/dev/sdb2 /dev/sdb1 /mnt

修复文件系统

[root@localhost ~]# umount /mnt

[root@localhost ~]# xfs_repair -l /dev/sdb2 /dev/sdb1

磁盘碎片整理

[root@localhost ~]# mkfs.xfs -l logdev=/dev/sdb2 /dev/sdb1

[root@localhost ~]# mount -o logdev=/dev/sdb2 /dev/sdb1 /mnt

[root@localhost ~]# for FILE in file{0..3} ; do dd if=/dev/zero of=/xfs/${FILE} bs=4M count=100 & done

[root@localhost ~]# filefrag /mnt/file* #整理磁盘碎片

xfs_db -c frag -r /dev/vdb1 磁盘碎片当前状态

[root@localhost ~]# xfs_fsr -v #查看磁盘碎片状态

差异备份只以完全备份为基础备份变更数据;增量备份以上一次增量备份为基础备份变更数据。

备份

[root@localhost ~]# mount /dev/sdb1 /mnt/

[root@localhost ~]# touch /mnt/abc{1..3}.txt

[root@node6 ~]# yum install xfsdump #安装备份工具

 

[root@localhost ~]# xfsdump -L full -M dumpfile -l 0 - /mnt | xz > /tmp/mnt-$(date +%y-%m-%d).0.xz#完全备份

-L label

-M 备份

-l 级别(level)

[root@node6 ~]# xfsdump -I

file system 0:
fs id: 467c218c-22b5-45bc-9b0e-cd5782be6e2e
session 0:
mount point: node6.uplooking.com:/xfs
device: node6.uplooking.com:/dev/vdb1
time: Sat Sep 14 17:39:47 2013
session label: "full"
session id: 75f91e6b-c0bc-4ad1-978b-e2ee5deb01d4
level: 0
resumed: NO
subtree: NO
streams: 1
stream 0:
pathname: stdio
start: ino 131 offset 0
end: ino 135 offset 0
interrupted: NO
media files: 1
media file 0:
mfile index: 0
mfile type: data
mfile size: 1678152296
mfile start: ino 131 offset 0
mfile end: ino 135 offset 0
media label: "dumpfile"
media id: de67b2b5-db72-4555-9804-a050829b2179
xfsdump: Dump Status: SUCCESS

恢复

[root@localhost mnt]# rm -rf rm -rf /mnt/ #模拟删除

[root@localhost ~]# xzcat /tmp/mnt-23-01-03.xz | xfsrestore - /mnt #完全恢复

[root@localhost ~]# ls /mnt/

abc1.txt abc2.txt abc3.txt

 

 

增量备份

[root@localhost ~]# touch /mnt/aa.txt

[root@localhost ~]# xfsdump -L add -M dumpfile -l 1 - /mnt | xz > /tmp/mnt.$(date +%y-%m-%d).add1.xz

[root@localhost ~]# echo 111111111111 >> /mnt/aa.txt

[root@localhost ~]# xfsdump -L add -M dumpfile -l 2 - /mnt | xz > /tmp/mnt.$(date +%y-%m-%d).add2.xz

全备+增量恢复

[root@localhost mnt]# xzcat /tmp/mnt-23-01-03.xz | xfsrestore - /mnt

[root@localhost mnt]# xzcat /tmp/mnt.23-01-03.add1.xz | xfsrestore - /mnt

[root@localhost mnt]# xzcat /tmp/mnt.23-01-03.add2.xz | xfsrestore - /mnt

[root@localhost mnt]# cat /mnt/aa.txt

111111111111

 

差异备份

[root@localhost mnt]# touch /mnt/xx.txt

[root@localhost mnt]# echo xxxxxxx >> /mnt/xx.txt

[root@localhost mnt]# xfsdump -L cha -M dumpfile -l 1 - /mnt | xz > /tmp/xfs.$(date +%y%m%d).cha1.xz

完全备份+差异备份恢复

[root@localhost mnt]# rm -rf /mnt/*

[root@localhost mnt]# xzcat /tmp/mnt-23-01-03.xz | xfsrestore - /mnt

[root@localhost mnt]# xzcat /tmp/mnt.230103.cha1.xz | xfsrestore - /mnt/

 

清除备份记录

rm -rf /var/lib/xfsdump/inventory/*