九.xfs文件系统
XFS文件系统的配置
基本上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有个写入屏障,在有缓存的情况下开启barrier功能,保证数据安全,如果没有缓存可以关闭这个参数
mount -o nobarrier /dev/device /mount/point
barrier
该功能背后的思路很简单:在写入新的 数据块到磁盘之前,会先将元数据写入日志。预先将元数据写入日志可以保证在写入真实数据前后一旦发生错误,日志功能能很容易地回滚到更改之前的状态。这个 方法确保了不会发生文件系统崩溃的情况。
如果设备映射器作为存储层的优先级使用,因为设备映 射器不支持barrier,逻辑卷、软RAID或者多路径磁盘
xfs_quota
usrquota
groupquota
project
[root@localhost ~]# mount -o usrquota,grpquota /dev/sda3 /mnt/
[root@localhost ~]# xfs_quota -x -c 'report' /mnt/
User quota on /mnt (/dev/sda3)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 4 0 0 00 [--------]
Group quota on /mnt (/dev/sda3)
Blocks
Group ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 4 0 0 00 [--------]
[root@localhost ~]# xfs_quota -x -c 'limit bsoft=50K bhard=100K robin' /mnt
[root@localhost ~]# xfs_quota -x -c 'report' /mnt/
User quota on /mnt (/dev/sda3)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 4 0 0 00 [--------]
robin 0 52 100 00 [--------]
Group quota on /mnt (/dev/sda3)
Blocks
Group ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 4 0 0 00 [--------]
xfs_quota -x -c 'limit -g bsoft=1000m bhard=1200m accounting' /target/path
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 #查询
xfs局限性
1.XFS是一个单节点文件系统,如果需要多节点同时访问需要考虑使用GFS2文件系统
2.XFS支持16EB文件系统,而redhat仅支持100TB文件系统
3.XFS较少的适用在单线程元数据密集的工作负荷,在单线程创建删除巨大数量的小文件的工作负荷下,其他文件系统(ext4)表现的会更好一些
4.xfs文件在操作元数据时可能会使用2倍的CPU资源,在CPU资源有限制的情况下可以研究使用不同文件系统
5.xfs更多适用的特大文件的系统快速存储,ext4在小文件的系统或系统存储带宽有限的情况下表现的更好
[root@node6 ~]# yum install xfsprogs -y
[root@node6 ~]# mkfs.xfs /dev/vdb1
meta-data=/dev/vdb1 isize=256 agcount=4, agsize=6016 blks
= sectsz=512 attr=2, projid32bit=0
data = bsize=4096 blocks=24064, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =internal log bsize=4096 blocks=1200, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
日志分离(把数据和日志分别不同的磁盘)
[root@node6 ~]# mkfs.xfs -f -l logdev=/dev/sdc1 /dev/sdb1
meta-data=/dev/vdb1 isize=256 agcount=4, agsize=6016 blks
= sectsz=512 attr=2, projid32bit=0
data = bsize=4096 blocks=24064, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =/dev/vdb2 bsize=4096 blocks=24576, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
挂载:
[root@node6 ~]# mount -o logdev=/dev/sdc1 /dev/sdb1 /mnt/
修复文件系统
[root@node6 ~]# umount /xfs
[root@node6 ~]# xfs_repair /dev/vgxfs/lvxfs
#fsck e2fsck
磁盘碎片整理
[root@node6 ~]# mkfs.xfs -l logdev=/dev/vdb2 /dev/vdb1
[root@node6 ~]# mount -o logdev=/dev/vdb2 /dev/vdb1 /xfs
[root@node6 ~]# for FILE in file{0..3} ; do dd if=/dev/zero of=/xfs/${FILE} bs=4M count=100 & done
[root@node6 ~]# filefrag /xfs/file*
xfs_db -c frag -r /dev/vdb1 磁盘碎片当前状态
[root@node6 ~]# xfs_fsr -v
[root@node6 ~]# umount /xfs
[root@node6 ~]# xfs_repair -n -l /dev/vdb2 /dev/vdb1
Phase 1 - find and verify superblock...
Phase 2 - using external log on /dev/vdb2
- scan filesystem freespace and inode maps...
- found root inode chunk
Phase 3 - for each AG...
- scan (but don't clear) agi unlinked lists...
- process known inodes and perform inode discovery...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- process newly discovered inodes...
Phase 4 - check for duplicate blocks...
- setting up duplicate extent list...
- check for inodes claiming duplicate blocks...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity...
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify link counts...
No modify flag set, skipping filesystem flush and exiting.
[root@node6 ~]#
[root@node6 ~]# xfs_repair -l /dev/vdb2 /dev/vdb1
Phase 1 - find and verify superblock...
Phase 2 - using external log on /dev/vdb2
- zero log...
- scan filesystem freespace and inode maps...
- found root inode chunk
Phase 3 - for each AG...
- scan and clear agi unlinked lists...
- process known inodes and perform inode discovery...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- process newly discovered inodes...
Phase 4 - check for duplicate blocks...
- setting up duplicate extent list...
- check for inodes claiming duplicate blocks...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
Phase 5 - rebuild AG headers and trees...
- reset superblock...
Phase 6 - check inode connectivity...
- resetting contents of realtime bitmap and summary inodes
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done
差异备份只以完全备份为基础备份变更数据;增量备份以上一次增量备份为基础备份变更数据。
备份
[root@node6 ~]# mount -o logdev=/dev/vdb2 /dev/vdb1 /xfs
[root@node6 ~]# yum install xfsdump
[root@node6 ~]# xfsdump -L full -M dumpfile -l 0 - /xfs | xz > /tmp/xfs.$(date +%Y%m%d).0.xz
#完全备份 -L label -M 备份 -l 级别(level)
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.0.4 (dump format 3.0) - Running single-threaded
xfsdump: level 0 dump of node6.uplooking.com:/xfs
xfsdump: dump date: Sat Sep 14 17:39:47 2013
xfsdump: session id: 75f91e6b-c0bc-4ad1-978b-e2ee5deb01d4
xfsdump: session label: "full"
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: skipping (no pruning necessary)
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 1677743680 bytes
xfsdump: /var/lib/xfsdump/inventory created
xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 1678152296 bytes
xfsdump: dump size (non-dir files) : 1678101072 bytes
xfsdump: dump complete: 152 seconds elapsed
xfsdump: Dump Status: SUCCESS
[root@node6 ~]#
[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@node6 ~]# rm -rf /xfs/*
[root@node6 ~]# xzcat /tmp/xfs.20130914.0.xz | xfsrestore - /xfs #完全恢复
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.0.4 (dump format 3.0) - Running single-threaded
xfsrestore: searching media for dump
xfsrestore: examining media file 0
xfsrestore: dump description:
xfsrestore: hostname: node6.uplooking.com
xfsrestore: mount point: /xfs
xfsrestore: volume: /dev/vdb1
xfsrestore: session time: Sat Sep 14 17:39:47 2013
xfsrestore: level: 0
xfsrestore: session label: "full"
xfsrestore: media label: "dumpfile"
xfsrestore: file system id: 467c218c-22b5-45bc-9b0e-cd5782be6e2e
xfsrestore: session id: 75f91e6b-c0bc-4ad1-978b-e2ee5deb01d4
xfsrestore: media id: de67b2b5-db72-4555-9804-a050829b2179
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 1 directories and 4 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 33 seconds elapsed
xfsrestore: Restore Status: SUCCESS
[root@node6 ~]# ls /xfs
file0 file1 file2 file3
全备份
echo aaaaa >> a.txt
xfsdump -L all -M dumpfile -l 0 - /mnt | xz > /home/xfs.$(date +%Y%m%d).all0.xz
xzcat /home/xfs.20170609.all0.xz
增量
echo bbbbbbb > b.txt
xfsdump -L add -M dumpfile -l 1 - /mnt | xz > /home/xfs.$(date +%Y%m%d).add1.xz
xzcat /home/xfs.20170609.add0.xz
xzcat /home/xfs.20170609.add1.xz
echo ccccc > c.txt
xfsdump -L add -M dumpfile -l 2 - /mnt | xz > /home/xfs.$(date +%Y%m%d).add2.xz
xzcat /home/xfs.20170609.add2.xz
echo dddddd > d.txt
xfsdump -L add -M dumpfile -l 3 - /mnt | xz > /home/xfs.$(date +%Y%m%d).add3.xz
xzcat /home/xfs.20170609.add3.xz
差异
xfsdump -L cha -M dumpfile -l 1 - /mnt | xz > /home/xfs.$(date +%Y%m%d).cha1.xz
xzcat /home/xfs.20170609.cha1.xz
完全恢复+增量恢复
xzcat /home/xfs.20170609.all0.xz | xfsrestore - /mnt/
ls
xzcat /home/xfs.20170609.add1.xz | xfsrestore - /mnt/
ls
xzcat /home/xfs.20170609.add2.xz | xfsrestore - /mnt/
ls
xzcat /home/xfs.20170609.add3.xz | xfsrestore - /mnt/
ls
完全恢复+差异恢复
xzcat /home/xfs.20170609.all0.xz | xfsrestore - /mnt/
ls
xzcat /home/xfs.20170609.cha1.xz | xfsrestore - /mnt/
ls
清除备份记录
rm -rf /var/lib/xfsdump/inventory/*
十.符号链接与硬连接
符号链接(软连接)
[root@localhost ~]# ln -s /root/aa.txt /tmp/aa_soft.txt
[root@localhost ~]# ll /tmp/aa_soft.txt
lrwxrwxrwx 1 root root 12 8月 9 13:41 /tmp/aa_soft.txt -> /root/aa.txt
硬连接
[root@localhost ~]# ln /root/aa.txt /tmp/aa_hard.txt
[root@localhost ~]# ll /tmp/aa_hard.txt
-rw-r--r-- 2 root root 4 8月 9 13:40 /tmp/aa_hard.txt
符号连接和硬连接的区别
1.创建时参数不同
ln -s /root/aa.txt /tmp/aa_soft.txt ln /root/aa.txt /tmp/aa_hard.txt
2.符号连接源文件不能重命名或者删除,硬连接可以
3.符号链接文件权限永远是777,硬连接权限和源文件权限一致
[root@localhost ~]# ll /root/aa.txt -rw-r--r-- 2 root root 4 8月 9 13:40 /root/aa.txt [root@localhost ~]# ll /tmp/aa_soft.txt lrwxrwxrwx 1 root root 12 8月 9 13:41 /tmp/aa_soft.txt -> /root/aa.txt [root@localhost ~]# ll /tmp/aa_hard.txt -rw-r--r-- 2 root root 4 8月 9 13:40 /tmp/aa_hard.txt
4.符号连接和源文件的inode号不同,硬连接相同
[root@localhost ~]# ls -i /root/aa.txt 35261258 /root/aa.txt [root@localhost ~]# ls -i /tmp/aa_soft.txt 17462480 /tmp/aa_soft.txt [root@localhost ~]# ls -i /tmp/aa_hard.txt 35261258 /tmp/aa_hard.txt
5.符号连接可以对目录操作,硬连接不可以
[root@localhost ~]# ln -s /root/ /tmp/new_root [root@localhost ~]# ln /root/ /tmp/new_root ln: "/root/": 不允许将硬链接指向目录
6.软连接可以跨文件系统,硬连接不可以跨文件系统
[root@localhost ~]# ln -s /root/aa.txt /boot/ [root@localhost ~]# ll /boot/aa.txt lrwxrwxrwx 1 root root 12 8月 9 13:51 /boot/aa.txt -> /root/aa.txt [root@localhost ~]# ln /root/aa.txt /boot/aa_hard.txt ln: 无法创建硬链接"/boot/aa_hard.txt" => "/root/aa.txt": 无效的跨设备连接
7.符号连接创建时必须是绝对路径(除非源文件和目标在同一个目录下),硬连接相对路径或绝对路径都可以
释放连接
[root@localhost ~]# unlink /tmp/aa_soft.txt
[root@localhost ~]# unlink /tmp/aa_hard.txt