Linux 文件系统
一、block 与 inode
一个文件必须占一个inode,但至少占用一个block
1. block(块)
由8个连续的扇区组成,1个block = 4K
文件存取的最小单位
2. inode(索引节点)
索引节点,也可以叫做 i节点
用于存储文件的元信息
3. inode的元信息
文件的字节数
文件拥有者的uid、gid
文件的读、写、执行权限
文件的时间戳
注:元数据中不包含文件名
空文件在添加文件内容后会更改inode号
4. 查看inode信息
使用stat命令可查看文件的inode信息
[root@localhost data]# touch test1
[root@localhost data]# stat test1
最近访问(atime):使用这个文件时就会更新时间
最近更改(mtime):修改这个文件就会更新时间
最近改动(ctime):修改文件的权限或者属性(包括inode号)时会更新时间
注:文件的占用空间发生变化,inode号也会发生变化,从而使ctime也发生改变
5. 目录文件结构
目录也是一种文件
每个inode都有一个号码,操作系统通过inode号开识别不同文件
对于用户,文件名只是inode号的别名
系统执行过程:
① 系统找到文件名对应的inode号
② 通过inode号,获取inode信息
③ 根据inode信息找到文件所在的block,读出数据
6. inode大小
inode也是会消耗硬盘空间的,每个inode的大小一般在128个字节和256个字节
在格式化文件系统时会确定inode号的总数(总数根据分区大小来确定)
df -i 命令可以查看每个分区inode号的总数和使用情况
7. inode号的特殊作用
由于inode号与文件名是分离的,可以出现以下情况:
① 当文件包含特殊字符时,可能无法正常删除文件,这时可以使用 ls -i 查看该文件的inode号,通过删除inode号,即可删除该文件
② 移动或重命名文件时,只是改变文件名,不会影响inode号
③ 打开文件后,系统不在使用文件名来识别文件,而是用inode号来对文件进行控制
8. 模拟inode号用完
(1)ext4 文件系统
ext4 文件系统最小支持4MB
[root@localhost data]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 9.3G 0 part /boot
└─sda2 8:2 0 32.6G 0 part
├─centos-root 253:0 0 28G 0 lvm /
└─centos-swap 253:1 0 4.7G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64
[root@localhost data]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x8e8d6b7d 创建新的 DOS 磁盘标签。
命令(输入 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):+4M
分区 1 已设置为 Linux 类型,大小设为 4 MiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost data]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 9.3G 0 part /boot
└─sda2 8:2 0 32.6G 0 part
├─centos-root 253:0 0 28G 0 lvm /
└─centos-swap 253:1 0 4.7G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 4M 0 part
sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64
[root@localhost data]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
1024 inodes, 4096 blocks
204 blocks (4.98%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=4194304
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (1024 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@localhost data]# mkdir -p /data/sdb1
[root@localhost data]# mount /dev/sdb1 /data/sdb1/
[root@localhost data]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 9.3G 0 part /boot
└─sda2 8:2 0 32.6G 0 part
├─centos-root 253:0 0 28G 0 lvm /
└─centos-swap 253:1 0 4.7G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 4M 0 part /data/sdb1
sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64
[root@localhost data]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 14649344 145278 14504066 1% /
devtmpfs 250005 404 249601 1% /dev
tmpfs 253986 1 253985 1% /dev/shm
tmpfs 253986 613 253373 1% /run
tmpfs 253986 16 253970 1% /sys/fs/cgroup
/dev/sda1 4882432 327 4882105 1% /boot
tmpfs 253986 6 253980 1% /run/user/42
tmpfs 253986 17 253969 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS 7 x86_64
/dev/sdb1 1024 11 1013 2% /data/sdb1
[root@localhost data]# cd /data/sdb1/
[root@localhost sdb1]# touch {1..1013}.txt
[root@localhost sdb1]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 14649344 145278 14504066 1% /
devtmpfs 250005 404 249601 1% /dev
tmpfs 253986 1 253985 1% /dev/shm
tmpfs 253986 613 253373 1% /run
tmpfs 253986 16 253970 1% /sys/fs/cgroup
/dev/sda1 4882432 327 4882105 1% /boot
tmpfs 253986 6 253980 1% /run/user/42
tmpfs 253986 17 253969 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS 7 x86_64
/dev/sdb1 1024 1024 0 100% /data/sdb1
[root@localhost sdb1]# touch test1
touch: 无法创建"test1": 设备上没有空间
[root@localhost sdb1]#
(2)xfs 文件系统
xfs 文件系统最小支持16MB
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 9.3G 0 part /boot
└─sda2 8:2 0 32.6G 0 part
├─centos-root 253:0 0 28G 0 lvm /
└─centos-swap 253:1 0 4.7G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 4M 0 part /data/sdb1
sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
分区号 (2-4,默认 2):
起始 扇区 (10240-41943039,默认为 10240):
将使用默认值 10240
Last 扇区, +扇区 or +size{K,M,G} (10240-41943039,默认为 41943039):+16M
分区 2 已设置为 Linux 类型,大小设为 16 MiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 9.3G 0 part /boot
└─sda2 8:2 0 32.6G 0 part
├─centos-root 253:0 0 28G 0 lvm /
└─centos-swap 253:1 0 4.7G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 4M 0 part /data/sdb1
sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64
[root@localhost ~]# partprobe
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 9.3G 0 part /boot
└─sda2 8:2 0 32.6G 0 part
├─centos-root 253:0 0 28G 0 lvm /
└─centos-swap 253:1 0 4.7G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 4M 0 part /data/sdb1
└─sdb2 8:18 0 16M 0 part
sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64
[root@localhost ~]# mkfs.xfs /dev/sdb2
meta-data=/dev/sdb2 isize=512 agcount=1, agsize=4096 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=4096, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# mkdir -p /data/sdb2
[root@localhost ~]# mount /dev/sdb2 /data/sdb2
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 28G 4.1G 24G 15% /
devtmpfs 977M 0 977M 0% /dev
tmpfs 993M 0 993M 0% /dev/shm
tmpfs 993M 9.1M 984M 1% /run
tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sda1 9.4G 161M 9.2G 2% /boot
tmpfs 199M 4.0K 199M 1% /run/user/42
tmpfs 199M 24K 199M 1% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
/dev/sdb1 2.9M 69K 2.6M 3% /data/sdb1
/dev/sdb2 13M 896K 12M 7% /data/sdb2
[root@localhost ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 14649344 145279 14504065 1% /
devtmpfs 250005 408 249597 1% /dev
tmpfs 253986 1 253985 1% /dev/shm
tmpfs 253986 620 253366 1% /run
tmpfs 253986 16 253970 1% /sys/fs/cgroup
/dev/sda1 4882432 327 4882105 1% /boot
tmpfs 253986 6 253980 1% /run/user/42
tmpfs 253986 17 253969 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS 7 x86_64
/dev/sdb1 1024 1024 0 100% /data/sdb1
/dev/sdb2 8192 3 8189 1% /data/sdb2
[root@localhost ~]# cd /data/sdb2
[root@localhost sdb2]# touch {1..8189}.txt
[root@localhost sdb2]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 14649344 145279 14504065 1% /
devtmpfs 250005 408 249597 1% /dev
tmpfs 253986 1 253985 1% /dev/shm
tmpfs 253986 620 253366 1% /run
tmpfs 253986 16 253970 1% /sys/fs/cgroup
/dev/sda1 4882432 327 4882105 1% /boot
tmpfs 253986 6 253980 1% /run/user/42
tmpfs 253986 17 253969 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS 7 x86_64
/dev/sdb1 1024 1024 0 100% /data/sdb1
/dev/sdb2 8192 8192 0 100% /data/sdb2
[root@localhost sdb2]# touch test1
[root@localhost sdb2]# touch test2
[root@localhost sdb2]# touch test3
[root@localhost sdb2]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 14649344 145279 14504065 1% /
devtmpfs 250005 408 249597 1% /dev
tmpfs 253986 1 253985 1% /dev/shm
tmpfs 253986 620 253366 1% /run
tmpfs 253986 16 253970 1% /sys/fs/cgroup
/dev/sda1 4882432 327 4882105 1% /boot
tmpfs 253986 6 253980 1% /run/user/42
tmpfs 253986 17 253969 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS 7 x86_64
/dev/sdb1 1024 1024 0 100% /data/sdb1
/dev/sdb2 8192 8192 0 100% /data/sdb2
[root@localhost sdb2]# touch test{4..100}
touch: 无法创建"test65": 设备上没有空间
……
[root@localhost sdb2]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 14649344 145279 14504065 1% /
devtmpfs 250005 408 249597 1% /dev
tmpfs 253986 1 253985 1% /dev/shm
tmpfs 253986 620 253366 1% /run
tmpfs 253986 16 253970 1% /sys/fs/cgroup
/dev/sda1 4882432 327 4882105 1% /boot
tmpfs 253986 6 253980 1% /run/user/42
tmpfs 253986 17 253969 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS 7 x86_64
/dev/sdb1 1024 1024 0 100% /data/sdb1
/dev/sdb2 8192 8192 0 100% /data/sdb2
[root@localhost sdb2]#
**总结: **
经过查资料得知,xfs文件系统类型并不是将inode号预先分配,而是动态分配inode号。xfs文件系统根据需要自动分配inode号,并在需要时动态添加inode号,所以当所有的inode号使用完时,依旧可以创建新的文件。但inode号也是需要占用存储空间的,当可用空间不足时,就无法创建新的文件了。
二、备份与恢复文件
1. ext类型的文件
(1)所需命令
① 编译安装extundelete软件包
# 安装依赖包
[root@localhost opt]#yum -y install e2fsprogs-devel e2fsprogs-libs
# 获取extundelete软件包
[root@localhost opt]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
# 解压extundelete软件包
[root@localhost opt]# tar -xf extundelete-0.2.4.tar.bz2
# 开始编译安装
# 进入软件包
[root@localhost opt]# cd extundelete-0.2.4/
# 安装编译环境
[root@localhost extundelete-0.2.4]# yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
# 指定安装路径
[root@localhost extundelete-0.2.4]# ./configure --prefix=/opt/apps/extundelete
# 编译与安装
[root@localhost extundelete-0.2.4]# make && make install
# 进入存放extundelete执行程序目录,将其执行程序软链接到/usr/bin目录下,作为系统命令使用
[root@localhost opt]# cd apps/extundelete/bin/
[root@localhost bin]# ln -s /opt/apps/extundelete/bin/extundelete /usr/bin/
② 将/dev/sdb1中的文件进行备份
# 进入sdb1的挂载目录/data/sdb1
[root@localhost bin]# cd /data/sdb1/
# 将其所有文件全部备份(inode 2 :表示从inode号为2开始的文件全部备份,.. 的inode号为2)
[root@localhost sdb1]# extundelete /dev/sdb1 --inode 2
# 恢复文件需要先将要恢复的分区先解挂载
[root@localhost opt]# umount /dev/sdb1
# 恢复文件(恢复的文件目录在当前目录下,命名为 RECOVERED_FILES)
[root@localhost opt]# extundelete /dev/sdb1 --restore-all
(2)实操
2. XFS 类型的文件
xfs文件系统的文件恢复可以使用xfsdump工具进行备份,它分为全量备份(完整备份)和增量备份
全量备份的级别为0(-l 0)默认,增量备份的级别为1-9(-l [1-9])
xfsdump命令选项:
选项 | 作用 |
---|---|
-l | 备份级别 0:全量备份 1-9:增量备份 |
-f | 备份文件的路径 |
-s | 指定备份单个文件 |
-L | 指定标签 |
-M | 指定设备标签 |
(1)全量备份
① 所需命令
# 检测是否安装xfs文件系统的备份工具xfsdump
[root@localhost sdb2]# rpm -q xfsdump
# 对/dev/sdb2中的所有文件进行备份
[root@localhost sdb2]# xfsdump -f /opt/sdb2_backup /dev/sdb2 [-L sdb2_backup -M sdb2]
# 恢复/dev/sdb2的所有文件(/data/sdb2为/dev/sdb2的挂载点)
[root@localhost sdb2]# xfsrestore -f /opt/sdb2_backup /data/sdb2
② 实操
(2)增量备份
增量备份首先要先做一遍全量备份,再进行增量备份
恢复也是先从全量备份文件开始恢复,然后再按依次等级恢复
① 所需命令
# 备份
# 先对sdb2中的文件进行全量备份
[root@localhost sdb2]# xfsdump -f /opt/sdb2_backup0 /dev/sdb2 [-L sdb2_backup0 -M sdb2]
# 对sdb2中的文件进行1级增量备份(第一次对新增文件备份)
[root@localhost sdb2]# xfsdump -l 1 -f /opt/sdb2_backup1 /dev/sdb2 [-L sdb2_backup1 -M sdb2
# 对sdb2中的文件进行2级增量备份(第二次对新增文件备份)
[root@localhost sdb2]# xfsdump -l 2 -f /opt/sdb2_backup2 /dev/sdb2 [-L sdb2_backup2 -M sdb2]
# 恢复
# 先对sdb2第一次的全量备份文件进行恢复(/data/sdb2为/dev/sdb2的挂载点)
[root@localhost sdb2]# xfsrestore -f /opt/sdb2_backup0 /data/sdb2
# 对sdb2的第一次增量备份文件进行恢复
[root@localhost sdb2]# xfsrestore -f /opt/sdb2_backup1 /data/sdb2
# 对sdb2的第二次增量备份文件进行恢复
[root@localhost sdb2]# xfsrestore -f /opt/sdb2_backup2 /data/sdb2
② 实操