1、回顾知识
1.1、文件系统说明
xfs与ext4文件系统
- CentOS7以上:默认的就是XFS文件系统
- xfs 使用的就是restore、dump等工具
- CentOS6默认的就是ext4文件系统
- extundelete工具就是用于ext4系统
1.2、回顾Linux文件系统
Linux文件系统是由三个部分组成
- inode
- 文件名
- block块
Linux:文件系统类型
- ext2/ext3/ext4
- xfs
最小的存储单位就是扇区,每个扇区就是512字节–>就是0.5KB
多个扇区组成一个block–>4Kb
Inode包含的信息
- stat+ 文件可以查看
- 1个inode节点–>128字节
- 查看inode :
- ls -i
- 查看inode总数:
- df -i
- 查找文件大小为0 的文件
- find / -type f -size 0 -exec rm {} ;
[root@Node1 ~]# stat install.log
File: `install.log'
Size: 26505 Blocks: 64 IO Block: 4096 regular file
Device: 803h/2051d Inode: 784899 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-05-30 06:32:19.370999940 +0800
Modify: 2023-05-30 06:35:25.849999847 +0800
Change: 2023-05-30 06:35:29.599999845 +0800
#查看文件的inode号
[root@Node1 ~]# ls -i install.log
784899 install.log
#查看系统的inode情况
[root@Node1 ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 1160992 52142 1108850 5% /
tmpfs 238344 1 238343 1% /dev/shm
/dev/sda1 76912 39 76873 1% /boot
2、文件的硬链接和软链接
2.1、硬链接说明
硬链接:
- 硬链接指通过索引节点来进行链接
- inode是可以对应多个文件名的
- 多个文件名指向同一个inode号就是硬链接
- 允许一个文件拥有多个有效的路径,有防止误操作删除的作用
- 多个文件名共用一个inode号;删除只是修改链接数;
- 如果inode号为0了,就是释放了inode号
- 硬链接是不知作用于目录
- 硬链接也不能跨分区进行创建
硬链接总结:
- 相当于复制,功能强大点,可以同步更新文件
- 语法:ln + 源文件 + 链接文件
- 不支持跨分区链接
- 不通的文件名执行同一个inode号
- 删除文件等于删除inode的链接数
- 只能对文件操作,不能对目录操作
问题:刚创建的一个目录,链接数就是2,原因是什么?
- 刚创建的目录,里面隐藏了两个目录;一个是.另外一个就是…
#创建一个目录
[root@Node1 ~]# mkdir /test/
[root@Node1 ~]# cd /test/
[root@Node1 test]# ls
#创建一个文件aa.txt
[root@Node1 test]# echo aaaaaaaaaaaaa >> aa.txt
#然后直接创建一个硬链接
[root@Node1 test]# ln aa.txt aa.txt.hard
#查看两个文件的信息
[root@Node1 test]# ll aa.txt aa.txt.hard
-rw-r--r--. 2 root root 14 Jun 3 09:54 aa.txt
-rw-r--r--. 2 root root 14 Jun 3 09:54 aa.txt.hard
#使用diff命令来对比两个文件也没问题
[root@Node1 test]# diff aa.txt aa.txt.hard
#使用md5sum命令对比两个文件也没有问题
[root@Node1 test]# md5sum aa.txt aa.txt.hard
a628dac4de20bc12b5eef5ad614cfccb aa.txt
a628dac4de20bc12b5eef5ad614cfccb aa.txt.hard
#随便向一个文件取追加内容,两个文件都同事增加
[root@Node1 test]# echo "123456" >> aa.txt.hard
[root@Node1 test]#
[root@Node1 test]# cat aa.txt
aaaaaaaaaaaaa
123456
#修改权限,文件也会同时修改
[root@Node1 test]# chmod 7777 aa.txt
[root@Node1 test]# ll aa.txt aa.txt.hard
-rwsrwsrwt. 2 root root 21 Jun 3 09:58 aa.txt
-rwsrwsrwt. 2 root root 21 Jun 3 09:58 aa.txt.hard
#新创建的目录中,里面就隐藏了两个目录
[root@Node1 ~]# mkdir aa
[root@Node1 ~]# cd aa
[root@Node1 aa]# ls -a
. ..
2.2、软链接说明
软链接说明:
- 软链接:相当于windows的快捷方式;
- 另外一种称之为符号链接(Symbolic Link)–>这种也叫软链接
- 语法:ln + s 源文件 + 链接文件
- 源文件删除了,链接文件就失效
- 可以对目录进行链接,也可以跨分区链接
- 注意:软链接跨分区一定写上绝对路径
#准备素材
[root@Node1 ~]# cp -a /etc/passwd .
[root@Node1 ~]# ls
passwd
#创建软链接
[root@Node1 ~]# ln -s passwd passwd.soft
[root@Node1 ~]# ll
total 4
-rw-r--r-- 1 root root 1019 Jun 26 11:49 passwd
lrwxrwxrwx 1 root root 6 Jul 5 11:09 passwd.soft -> passwd
#如果删除源文件,链接文件失效
[root@Node1 ~]# rm -rf passwd
#链接文件显示红色文件闪烁
[root@Node1 ~]# ll
total 0
lrwxrwxrwx 1 root root 6 Jul 5 11:09 passwd.soft -> passwd
#软链接文件可以跨分区链接-->但是跨分区需要协商绝对路径
[root@Node1 ~]# cd /boot/
[root@Node1 boot]# ln -s /boot/grub /root/grub
[root@Node1 boot]# ll /root/grub/
3、Inode说明
3.1、Inode的特殊作用
inode号和文件名是分开的
- 假设文件名含有特殊符号;无法正常删除?
- 可以直接删除inode号;就等于删除文件
- 移动文件或者重命名的时候,只需要改变文件名,不会影响到inode
- 系统无法从inode号码来得知文件名
为何每次修改完服务器配置文件后,都需要重新加载一下配置文件?
- 修改了配置文件的内容,inode号就会改变,因此要重新读取一下文件的inode就可以;
#有些文件是特殊字符,如果要删除比较麻烦,可以通过inode号删除
[root@Node1 ~]# find /root inum 33574987 -exec rm -i {} \;
#修改文件名并不会影响inode
[root@Node1 ~]# echo 111 >> aa.txt
[root@Node1 ~]# ls -i
33574978 aa.txt
[root@Node1 ~]# mv aa.txt bb.txt
[root@Node1 ~]# ls -i
33574978 bb.txt
4、关于文件系统的实战
4.1、实战:磁盘有空间,但无法创建文件?
实战:解决磁盘有空间,但是没法创建文件–>修复服务器的文件系统;
- 面试:在公司中,遇到过棘手的文件是什么?
实战场景:
- 在⼀台配置较低的Linux服务器(内存、硬盘⽐较⼩)的/data分区内创建⽂件时,系统提示磁盘空间不⾜,⽤df -h命令查看了⼀下磁盘使⽤情况,发现/data分区只使⽤了80%,还有1.9G的剩余空间,但是⽆法创建新的⽂件。当时使⽤的是root⽤户。服务器没有被⿊。
#首先查看一下分区状态
[root@Node1 ~]# df -h
..............
#再查看一下inode情况
[root@Node1 ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 9703424 32301 9671123 1% /
............
#问题分析:
- 如果一个目录中存在数量非常多的小字节缓存文件,占用的Block 不多,但是占用了很多的inode节点
- 可以创建一个文件夹/bak/用于备份-->然后在删除文件,释放一些inode号
- 可以再创建一个分区,把这些文件都存放在这个里边
- 释放inode就可以了;
4.2、实战:修复文件系统
系统启动出现了control-D报错;如下图
通常的修复手段:
- fsck -f -y /dev/sda1 #引导分区文件系统修复
- -f:代表强制检查
- -y:对于所有的交互式提问都是yes的回答
- fsck -f -y /dev/sda3
- reboot重启
#尝试强制修复分区
[root@Node1 ~]# fsck -f -y /dev/sda2
#然后重启
[root@Node1 ~]# reboot
4.3、实战:xfs系统文件误删除修复
extundelete工具:是用于修复ext4文件类型的文件;需要提前备份
而xfs类型的文件就可以使用xfsdump(备份)与xfsrestore工具进行恢复
#安装xfsdump工具
[root@Node1 ~]# yum -y install xfsdump
xfsdump工具:
- 作用:用于备份xfs文件系统的文件
- 原理:
- xfsdump按照inode顺序备份一个xfs文件系统
- xfsdump的备份级别有两种:
- 0:表示完全备份–>默认选项
- 1-9:表示增量备份;
- 选项:
- -f:指定备⽂件⽬录 ;这里指定的就是恢复文件的位置,存放恢复后文件的路径
- -L:设定标签
- -M:设备标签
- -s:备份单个⽂件 -s 不能直接跟路径
- 注意事项:
- 不支持没有挂载的文件系统,只能备份已经挂载
- 需要使用root权限
- 只能对xfs
- 备份好的数据只能通过xfsrestore解析
实验思路:
- 创建磁盘
#虚拟机-->设置-->添加硬盘-->一直下一步下一步-->然后下一步
- 分区
#对sdb进行分区
[root@Node1 ~]# fdisk /dev/sdb
#创建新分区
Command (m for help): n
Partition number (4-128, default 4):
First sector (34-41943006, default 10487808):
Last sector, +sectors or +size{K,M,G,T,P} (10487808-41943006, default 41943006):
Created partition 4
#保存退出
Command (m for help): w
- 格式化
- 挂载使用
[root@Node1 ~]# mkfs.xfs -f /dev/sdb4
meta-data=/dev/sdb4 isize=512 agcount=4, agsize=982975 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=3931899, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
#创建目录-->然后挂在使用
[root@Node1 ~]# mkdir /test
[root@Node1 ~]# mount /dev/sdb4 /test/
- 创建数据
[root@Node1 ~]# cd /test/
[root@Node1 test]# echo 11111111 >> aa.txt
- xfsdump备份
#备份数据-->-f指定备份的名字
[root@Node1 test]# xfsdump -f /test/dump_sdb4 /dev/sdb4
.............
#指定标签名字
please enter label for this dump session (timeout in 300 sec)
-> dump_sdb4
.............
#指定备份名
please enter label for media in drive 0 (timeout in 300 sec)
-> sdb4
..........
#看到以下代表备份成功
xfsdump: stream 0 /test/dump_sdb4 OK (success)
xfsdump: Dump Status: SUCCESS
#查看一下备份好的数据
[root@Node1 test]# ls
aa.txt dump_sdb4
[root@Node1 test]# ls -l dump_sdb4
-rw-r--r-- 1 root root 22200 Jul 5 14:28 dump_sdb4
- 模拟删除数据
[root@Node1 test]# rm -rf aa.txt
- xfsrestore工具恢复
[root@Node1 test]# xfsrestore -f /test/dump_sdb4 /root/
xfsrestore: stream 0 /test/dump_sdb4 OK (success)
xfsrestore: Restore Status: SUCCESS
#再查看数据是否存在即可
[root@Node1 test]# cat /root/aa.txt
11111111
4.4、系统禁ping操作
简单地理解就是:你去ping一个IP;然后没有任何的返回记录;
- 云主机:无法ping它的IP
- 这个操作有临时的,和永久的操作
#正常情况下我们是可以ping通本机的
[root@Node1 ~]# ping -c2 -w2 192.168.75.131
PING 192.168.75.131 (192.168.75.131) 56(84) bytes of data.
64 bytes from 192.168.75.131: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 192.168.75.131: icmp_seq=2 ttl=64 time=0.021 ms
.......
#临时进制ping通本机
[root@Node1 ~]# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#然后再ping发现就没法ping通
[root@Node1 ~]# echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
[root@Node1 ~]# ping 127.0.0.1
#把这个规则写入配置文件可以达到永久禁ping操作
[root@Node1 ~]# vim /etc/sysctl.conf
...........
#添加这一行
net.ipv4.icmp_echo_ignore_all=1
[root@Node1 ~]# sysctl -p
fs.file-max = 51200
net.ipv4.icmp_echo_ignore_all = 1
[root@Node1 ~]# ping 127.0.0.1
#结合防火墙iptables也能实现
[root@Node1 ~]# iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP
5、ACL权限说明
一个需求:
- 一个项目不同部门;共同操作一个目录
- liangjiawei:开发有开发的权限
- zhangsan:又有不同的权限
- lisi:也有对应的权限
#进入一个目录
[root@Node1 ~]# cd /test/
#查看目录的权限
[root@Node1 test]# ls -ld /test/
drwxr-xr-x 2 root root 23 Jul 5 14:32 /test/
#创建一个测试用户组,然后把三个用户都丢入这个组里边
[root@Node1 test]# groupadd test
[root@Node1 test]# useradd -G test liangjiawei
[root@Node1 test]# useradd -G test zhangsan
[root@Node1 test]# useradd -G test lisi
#把测试目录也归纳到test组里边
[root@Node1 test]# chgrp test /test/
#然后设置一个gid
[root@Node1 test]# chmod 2770 /test/
[root@Node1 test]# ll -d /test/
drwxrws--- 2 root test 23 Jul 5 14:32 /test/
这里就引入一个概念:
- zhangsan可以读取内容,但是不能修改内容
- 如果想要实现这个权限就可以引入一个acl的权限概念
- zhangsan 加⼊组,删除权限
- 2775 进去看⽂件,但是别的⽤户也能进去
- 这里足以说明正常的权限是没法满足的;因此需要引入一个ACL权限的概念
- ACL可以针对几个用法
- 使⽤者 (user):可以针对使⽤者来设置权限;
- 群组 (group):针对群组为对象来设置其权限;
- 默认属性 (mask):还可以针对在该⽬录下在创建新⽂件/目录时,规范新数据的默认权限;
setfacl命令
- 作用:设置某个目录/文件的ACL权限
- 语法:setfacl + 选项 user:用户名:权限(rwx) 文件/目录
- 选项:
- -m:设置后续的acl参数给文件使用
- -x:删除acl参数
- -b:移除所有的参数
- -k:移除默认的
- -R:递归ACL权限
- -d:设置默认的参数,只有对目录有效
getfacl命令
-
作用:查看目录的规定
语法:getfacl + 文件名/目录名
#接上面的实验
#给zhangsan设置acl权限
[root@Node1 test]# setfacl -m user:zhangsan:r-- /test/
#查看一下acl权限
[root@Node1 test]# getfacl /test/
getfacl: Removing leading '/' from absolute path names
# file: test/
# owner: root
# group: test
# flags: -s-
user::rwx
user:zhangsan:r--
group::rwx
mask::rwx
other::---
#给组设置acl权限
[root@Node1 test]# setfacl -m group:test:rwx /test/
[root@Node1 test]# getfacl /test/
getfacl: Removing leading '/' from absolute path names
# file: test/
# owner: root
# group: test
# flags: -s-
user::rwx
user:zhangsan:r--
group::rwx
group:test:rwx
mask::rwx
other::---
#给liangjiawei用户设置rw权限
[root@Node1 test]# setfacl -m user:liangjiawei:rw- /test/
#清除test组的acl权限
[root@Node1 test]# setfacl -x group:test:rwx /test/