m-zhuang

导航

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
② 实操



posted on 2023-05-16 01:00  m_zhuang  阅读(77)  评论(0编辑  收藏  举报