文件系统和日志
inode与block详解
inode和block概述
- 文件数据包括元信息与实际数据
- 文件储存在硬盘上,硬盘最小储存单位是"扇区",每个扇区储存512字节
- block(块)
连续的八个扇区组成一个 block(4K)
是文件存取的最小单位 - node (索引节点)
中文译名为“索引节点”,也叫 i节点
用于存储文件元信息
inode内容
inode 包含很多的文件元信息,但不包含文件名,例如:
- 文件的字节数
所在块及块大小、inode号、文件的Group ID、文件拥有者的User ID、文件的读、写、执行权限、文件的时间戳
Linux系统文件有三个主要的时间属性,分别是ctime(change time),atime(access time),mtime (modify time)
ctime(change time):最后一次改变文件或目录(属性)的时间,例如执行 chmod、chown命令
atime(access time):最后一次访问文件或目录的时间
mtime(modify time):最后一次修改文件或目录(内容)的时间
inode大小
inode也会消耗硬盘空间,每个inode 的大小,一般是128字节或256字节。inode的总数,在格式化时就给确定,使用df -i命令可以查看每个硬盘分区的inode总数和已经使用的数量。
[root@localhost ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 499014 403 498611 1% /dev
tmpfs 503269 1 503268 1% /dev/shm
tmpfs 503269 1512 501757 1% /run
tmpfs 503269 16 503253 1% /sys/fs/cgroup
/dev/mapper/centos-root 31195136 163018 31032118 1% /
/dev/sda1 256000 340 255660 1% /boot
tmpfs 503269 25 503244 1% /run/user/1001
/dev/sr0 0 0 0 - /run/media/lisi/CentOS 7 x86_64
tmpfs 503269 1 503268 1% /run/user/0
[root@localhost ~]#
inode的特殊作用
由于inode号码与文件名分离,导致一些Unix/Liunx系统具有以下现象
当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
移动或重命名文件时,只改变文件名,不影响inode号
打开一个文件后,系统用过inode号码来识别该文件,不在考虑文件名
inode号码
访问文件的简单流程:
1.系统找到这个文件名对应的inode号码;
2.通过inode 号码,获取inode 信息;
3.根据inode信息,找到文件数据所在的block,读出数据。
查看文件的inode号码
stat 文件名
ls -l 文件名
[root@localhost ~]# touch abc.txt
[root@localhost ~]# stat abc.txt
文件:"abc.txt"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:67439367 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2023-04-17 14:40:16.283095184 +0800
最近更改:2023-04-17 14:40:16.283095184 +0800
最近改动:2023-04-17 14:40:16.283095184 +0800
创建时间:-
[root@localhost ~]#
inode耗尽故障处理
故障原因:目录中存在数量非常多的小字节缓存文件,占用的block 不多,但是占用了大量的 inode
故障现象:在硬盘还未存满的情况下,就无法在硬盘上创建新的文件
实验步骤:
1.磁盘分区(因为是做实验,磁盘分区设为20M就可以了),并进行初始化和挂载处理
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+20M
分区 1 已设置为 Linux 类型,大小设为 20 MiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 59.5G 0 part
├─centos-root 253:0 0 59.5G 0 lvm /
└─centos-swap 253:1 0 8M 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20M 0 part
sr0 11:0 1 4.4G 0 rom /run/media/lisi/CentOS 7 x86_64
[root@localhost ~]#
2.进/cx 目录下使用,for循环创建多个文件,并确认磁盘占用情况
3.解决方法,只需要找出该分区中占用大量inode号的空白文件,删除就行。
[root@localhost cx]# rm -rf /root/cx/abc*
[root@localhost cx]# df -i /root/cx
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sdb1 5136 11 5125 1% /root/cx
[root@localhost cx]# df -i /root/cx
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sdb1 5136 11 5125 1% /root/cx
[root@localhost cx]# df -Th /root/cx
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb1 ext4 19M 450K 17M 3% /root/cx
[root@localhost cx]#
恢复误删除文件
恢复EXT类型的文件
1.在编译安装 extundelete软件包之前,要先安装两个依赖包e2fsprogs-libs和e2fsprogs-devel,使用rpm命令将其安装,安装完毕后,即可将上传的extundelete 软件包解压、配置、编译、安装。
[root@localhost ~]# rpm -q e2fsprogs-devel
e2fsprogs-devel-1.42.9-19.el7.x86_64
[root@localhost ~]# ls
anaconda-ks.cfg cx initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost ~]# ls
anaconda-ks.cfg extundelete-0.2.4.tar.bz2 公共 视频 文档 音乐
cx initial-setup-ks.cfg 模板 图片 下载 桌面
[root@localhost ~]# tar jxf extundelete-0.2.4.tar.bz2
[root@localhost ~]# ls
anaconda-ks.cfg extundelete-0.2.4 initial-setup-ks.cfg 模板 图片 下载 桌面
cx extundelete-0.2.4.tar.bz2 公共 视频 文档 音乐
[root@localhost ~]# cd /extundelete-0.2.4
bash: cd: /extundelete-0.2.4: 没有那个文件或目录
[root@localhost ~]# cd extundelete-0.2.4/
[root@localhost extundelete-0.2.4]# ls
acinclude.m4 autogen.sh configure depcomp LICENSE Makefile.in README
aclocal.m4 config.h.in configure.ac install-sh Makefile.am missing src
[root@localhost extundelete-0.2.4]# ./configure
Configuring extundelete 0.2.4
Writing generated files to disk
[root@localhost extundelete-0.2.4]# make && make install
make -s all-recursive
Making all in src
extundelete.cc: 在函数‘ext2_ino_t find_inode(ext2_filsys, ext2_filsys, ext2_inode*, std::string, int)’中:
extundelete.cc:1272:29: 警告:在 {} 内将‘search_flags’从‘int’转换为较窄的类型‘ext2_ino_t {aka unsigned int}’ [-Wnarrowing]
buf, match_name2, priv, 0};
^
Making install in src
/usr/bin/install -c extundelete '/usr/local/bin'
[root@localhost extundelete-0.2.4]#
2.使用fdisk 命令创建新分区,将其挂载到 /cx 目录下,并创建一下文件和目录
3.模拟误操作并恢复
恢复XFS类型文件
xfsdump -f 备份存放位置 要备份的路径或设备文件
xfsrestore -f 恢复文件的位置 存放恢复后文件的位置
xfsdump备份级别(默认为0)
0: 完全备份
1-9: 增量备份
xfsdump常用选项
选项 说明
-f 指定备份文件目录
-L 指定标签 session label
-M 指定设备标签 media label
-s 备份单个文件,-s 后面不能直接跟路径
xfsdump使用限制
只能备份已挂载的文件系统
必须使用root的权限才能操作
只能备份XFS文件系统
备份后的数据只能让 xfsrestore 解析
不能备份两个具有相同UUID的文件系统(可用 blkid命令查看)
模拟删除并执行恢复操作
1.使用fdisk创建分区/dev/sdh1,格式化xfs文件系统,并进行挂载
2.使用 xfsdump 命令备份整个分区
[root@localhost lisi]# xfsdump -f /opt/dump_sdh1 /dev/sdh1 -L dump_sdh1 -M sdh1
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.7 (dump format 3.0) - type ^C for status and control
xfsdump: level 0 dump of localhost.localdomain:/lisi
xfsdump: dump date: Mon Apr 17 18:01:35 2023
xfsdump: session id: 54ef3259-0acd-44ab-bed7-111656c96662
xfsdump: session label: "dump_sdh1"
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: 29632 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 26488 bytes
xfsdump: dump size (non-dir files) : 4160 bytes
xfsdump: dump complete: 0 seconds elapsed
xfsdump: Dump Summary:
xfsdump: stream 0 /opt/dump_sdh1 OK (success)
xfsdump: Dump Status: SUCCESS
[root@localhost lisi]# cd /opt
[root@localhost opt]# ls
dump_sdh1 nginx-1.22.0 nginx-1.22.0.tar.gz rh
[root@localhost opt]#
3.模拟数据丢失并使用 xfsrestore 命令恢复文件