深入了解Linux文件系统

Posted 还行少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入了解Linux文件系统相关的知识,希望对你有一定的参考价值。

inode和block概述

文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节
文件数据包括元信息与实际数据
在这里插入图片描述
block(块)
连续的八个扇区组成一个block
是文件存取的最小单位

inode(索引节点)
中文译名为“索引节点”,也叫i节点
用于存储文件元信息

inode的内容

inode包含文件的元信息

文件的字节数
文件拥有者的User ID
文件的Group ID
文件的读、写、执行权限
文件的时间戳
文件所在block

查看inode信息

[root@localhost ~]# stat 1
  文件:"1"
  大小:0         	块:0          IO 块:4096   普通空文件
设备:fd00h/64768d	Inode:134312827   硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2021-05-18 16:27:48.097818793 +0800
最近更改:2021-05-18 16:27:48.097818793 +0800
最近改动:2021-05-18 16:27:48.097818793 +0800
创建时间:-
[root@localhost ~]#

Linux系统文件三个主要的时间属性

ctime(change time)
最后一次改变文件或目录(属性)的时间
atime (access time)
最后一次访问文件或目录的时间
mtime (modify time)
最后一次修改文件或目录(内容)的时间

[root@localhost ~]# touch 1
[root@localhost ~]# stat 1
  文件:"1"
  大小:0         	块:0          IO 块:4096   普通空文件
设备:fd00h/64768d	Inode:134312827   硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2021-05-18 16:38:05.395844907 +0800
最近更改:2021-05-18 16:38:05.395844907 +0800
最近改动:2021-05-18 16:38:05.395844907 +0800
创建时间:-
[root@localhost ~]# vi 1
[root@localhost ~]# stat 1
  文件:"1"
  大小:0         	块:0          IO 块:4096   普通空文件
设备:fd00h/64768d	Inode:134312827   硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2021-05-18 16:38:21.195903349 +0800   //只更改了atime
最近更改:2021-05-18 16:38:05.395844907 +0800
最近改动:2021-05-18 16:38:05.395844907 +0800
创建时间:-
[root@localhost ~]# 

[root@localhost ~]# echo 123 >> 1   //追加123到1中
[root@localhost ~]# stat 1
  文件:"1"
  大小:17        	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:134312830   硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2021-05-18 16:40:43.711096672 +0800
最近更改:2021-05-18 16:44:02.494935574 +0800    //mtime变更了
最近改动:2021-05-18 16:44:02.494935574 +0800    //ctime变更了
创建时间:-
[root@localhost ~]# 
[root@localhost ~]# chown tvxq 1   //改变属主
[root@localhost ~]# stat 1
  文件:"1"
  大小:17        	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:134312830   硬链接:1
权限:(0644/-rw-r--r--)  Uid:( 1000/    tvxq)   Gid:(    0/    root)
最近访问:2021-05-18 16:40:43.711096672 +0800
最近更改:2021-05-18 16:44:02.494935574 +0800
最近改动:2021-05-18 16:51:21.427187399 +0800   //只变更了ctime
创建时间:-
[root@localhost ~]# 

inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件
Linux系统内部不使用文件名,而使用inode号码来识别文件
对于用户,文件名只是inode号码便于识别的别称

用户通过文件名打开文件时,系统内部的过程
1.系统找到这个文件名对于的inode号码
2.通过inode号码,获取inode信息
3.根据inode信息,找到文件数据所在的block,读出数据

查看inode号码的方法

[root@localhost ~]# ls -i 1
134312830 1
[root@localhost ~]#
[root@localhost ~]# stat 1
  文件:"1"
  大小:17        	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:134312830   硬链接:1
权限:(0644/-rw-r--r--)  Uid:( 1000/    tvxq)   Gid:(    0/    root)
最近访问:2021-05-18 16:40:43.711096672 +0800
最近更改:2021-05-18 16:44:02.494935574 +0800
最近改动:2021-05-18 16:51:21.427187399 +0800
创建时间:-
[root@localhost ~]# 

inode大小

inode也会消耗硬盘空间
每个inode的大小一般是128字节或256字节或512字节

[root@localhost ~]# xfs_info /dev/sda1
meta-data=/dev/sda1              isize=512   //大小为512字节  agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]# 

查看inode总数和已经使用的数量

[root@localhost ~]# df -i
文件系统                    Inode 已用(I)   可用(I) 已用(I)% 挂载点
devtmpfs                   478405     421    477984       1% /dev
tmpfs                      482660       1    482659       1% /dev/shm
tmpfs                      482660    1485    481175       1% /run
tmpfs                      482660      16    482644       1% /sys/fs/cgroup
/dev/mapper/centos-root 102297600  175767 102121833       1% /
/dev/sda1                  524288     349    523939       1% /boot
tmpfs                      482660       9    482651       1% /run/user/42
tmpfs                      482660       1    482659       1% /run/user/0
[root@localhost ~]# 

inode的特殊作用

由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象
当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
移动或重命名文件时,只改变文件名,不影响inode号码
打开一个文件后,系统通过inode号码来识别该文件,不在考虑文件名

[root@localhost ~]# ls -i 1
134312830 1
[root@localhost ~]# find -inum 134312830 -exec rm -rf {} \\;  //删除当前目录下inode号码为134312830的文件
[root@localhost ~]# ls -i 1
ls: 无法访问1: 没有那个文件或目录
[root@localhost ~]# 

硬链接和软连接

软连接硬链接
删除原始文件失效仍旧可用
使用范围适用于文件或目录只可用于文件
保存位置与原始文件可以位于不同的文件系统中必须与原始文件在同一个文件系统
[root@localhost ~]# ln -s 1 2
[root@localhost ~]# ll -i 1 2
134312829 -rw-r--r-- 1 root root 0 5月  18 18:38 1
134312830 lrwxrwxrwx 1 root root 1 5月  18 18:39 2 -> 1   //inode号和原文件不一样
[root@localhost ~]# 

[root@localhost ~]# ln /root/1 /root/3  创建硬链接
[root@localhost ~]# ll -i 1 2 3
134312829 -rw-r--r-- 2 root root 0 5月  18 18:38 1
134312830 lrwxrwxrwx 1 root root 1 5月  18 18:39 2 -> 1
134312829 -rw-r--r-- 2 root root 0 5月  18 18:38 3   //与原文件的inode号一样
[root@localhost ~]# 

恢复XFS类型的文件

首先查看是否安装xfsdump

[root@localhost ~]# rpm -q xfsdump
xfsdump-3.1.7-1.el7.x86_64
[root@localhost ~]# 

xfsdump命令格式

xfsdump -f 备份存放位置 要备份的路径或设备文件

[root@localhost 2]# xfsdump -f /boot/2/1 /boot -L 1 -M 1  //备份/boot
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:/boot
xfsdump: dump date: Tue May 18 18:52:22 2021
xfsdump: session id: b0e7437f-fde8-4973-976b-afd3eae67c27
xfsdump: session label: "1"
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: 209713472 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 209390312 bytes
xfsdump: dump size (non-dir files) : 209140496 bytes
xfsdump: dump complete: 7 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /boot/2/1 OK (success)
xfsdump: Dump Status: SUCCESS
[root@localhost 2]# 

xfsdump备份级别(默认为0)
0:完全备份
1-9:增量备份

xfsrestore命令格式

xfsrestore -f 恢复文件的位置 存放恢复后文件的位置
[root@localhost 2]# xfsrestore -f /boot/2/1 /boot/1  //恢复文件
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.7 (dump format 3.0) - type ^C for status and control
xfsrestore: searching media for dump
xfsrestore: examining media file 0
xfsrestore: dump description: 
xfsrestore: hostname: localhost.localdomain
xfsrestore: mount point: /boot
xfsrestore: volume: /dev/sda1
xfsrestore: session time: Tue May 18 18:52:22 2021
xfsrestore: level: 0
xfsrestore: session label: "1"
xfsrestore: media label: "1"
xfsrestore: file system id: 54cce9ff-2f23-43b3-a654-728926b2a555
xfsrestore: session id: b0e7437f-fde8-4973-976b-afd3eae67c27
xfsrestore: media id: 6dc5f49d-6516-4d12-b51f-9df07d42e439
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 13 directories and 352 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: WARNING: unable to unlink current file prior to restore: 1/1: 不是目录: discarding
xfsrestore: WARNING: unable to unlink current file prior to restore: 1/2: 不是目录: discarding
xfsrestore: WARNING: unable to unlink current file prior to restore: 1/3: 不是目录: discarding
xfsrestore: WARNING: unable to unlink current file prior to restore: 2/1: 不是目录: discarding
xfsrestore: restore complete: 4 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /boot/2/1 OK (success)
xfsrestore: Restore Status: SUCCESS
[root@localhost 2]# 

xfsdump使用限制

只能备份已挂载的文件系统
必循使用root的权限才能操作
只能备份xfs文件系统
备份后的数据只能让xfsrestore解析
不能备份两个具有相同UUID的文件系统

以上是关于深入了解Linux文件系统的主要内容,如果未能解决你的问题,请参考以下文章

深入理解linux系统的目录结构(总结的非常详细)

linux 删除文件深入了解及任务定时--Linux的闹钟

深入剖析Linux文件系统

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段

深入了解linux操作系统引导过程详解

深入了解linux操作系统引导过程详解