本文转载自:https://blog.csdn.net/qyp199312/article/details/54927843

前言

闲来无事复习了下Linux文件系统的基本构成,做下记录。主要涉及的内容有: 
Ext文件系统的记录方式; 
Linux文件系统的访问方式; 
rm删除的原理以及恢复方案。

Linux文件系统构成

现在一般使用的是Ext4格式的文件系统, 由最初的Ext2发展而来。 
对于Ext2和Ext3文件系统的描述, 请见:

Linux将文件系统抽象为一个树形结构,可以在系统内挂载多个磁盘。 
Linux里面所有数据都是文件,文件夹也是文件。 
文件由如下内容构成:

  • 目录项(即文件名与Inode的映射)
  • Inode(文件基本信息与数据块 DataBlock 索引)
  • DataBlock

文件式的文件结构

以文件 /root/File 为例:

# pwd
/root # stat /root/
File: `/root/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd01h/64769d Inode: 2315 Links: 14
Access: (0550/dr-xr-x---) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-02-08 16:09:51.510593179 +0800
Modify: 2017-02-08 16:09:45.789604414 +0800
Change: 2017-02-08 16:09:45.789604414 +0800 # stat File
File: `File'
Size: 23496 Blocks: 48 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 57115 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-02-08 16:06:52.739596489 +0800
Modify: 2017-02-08 16:06:52.739596489 +0800
Change: 2017-02-08 16:06:52.739596489 +0800
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

当前操作系统持有的磁盘, 0~1号扇区为引导扇区, 2号扇区归”/”使用。

# stat /
File: `/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd01h/64769d Inode: 2 Links: 30
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-02-08 13:21:03.821594978 +0800
Modify: 2016-07-31 03:53:01.651715290 +0800
Change: 2016-07-31 03:53:01.651715290 +0800
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其包含:

  • Innode: 通过上级目录项的Innode序列’2’找到Innode
  • Innode中的DataBlock又是一个目录项,其中有root -> 2315的映射

由此层层找到了/root/File这个文件。该文件依然包含:

  • Innode(大小共128B):

    Innode文件权限(rwx)文件所有者(root/other)文件创建时间... ... ...数据索引 DataBlock文件是否为空?Innode直接数据索引一直接数据索引二... ... ...直接数据索引十二间接一级数据索引间接二级数据索引间接三级数据索引yesno
  • DataBlock(文件具体内容)

其中DataBlock的计算方式为:

  • 十五个索引的大小都是4B, 共60B。
  • 前十二个直接索引直接索引到Block, Linux支持的Block大小有1K,2K, 4K
  • 间接索引就是索引的索引。可以索引 (Block大小 / 4B) * Block大小数据
  • 双间接索引是间接索引的索引,三间接索引是双间接索引的索引

设置为1KB Block大小的文件系统的最大单个文件支持量16G。

Block大小设1KB为,则间接为(1KB / 4B) * 1KB = 256KB。

总空间= 直接+ 间接+ 双间接+ 三间接 
总空间= 12K + 256K + 256 * 256K + 256 * 256 *256K = 16G.


其余:

Block大小 最大单一文件限制
1KB 16GB
2KB 256GB
4KB 2TB

文件和文件夹的一个区别为其DataBlock里面储存的内容不一样。文件夹储存的是当前文件夹下一级所有的文件名与Innode号的映射;而文件则储存的是文件的具体内容。

Linux的一个具体文件

新建一个空文件 空文件/root/EmptyFile 进行对比

# touch EmptyFile
# stat EmptyFile
File: `EmptyFile'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 57109 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-02-08 16:09:45.789604414 +0800
Modify: 2017-02-08 16:09:45.789604414 +0800
Change: 2017-02-08 16:09:45.789604414 +0800
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 它的文件名储存在 /root 的 DataBlock中。即目录项。
  • Innode里面包含了 Inode: 57109 、Links: 1、Access: (0644/-rw-r–r–)等信息
  • 数据块大小扇区大小 0.5KB, 8个扇区凑成一个Block,所占Block: 0, Size: 0。该文件无数据。
  • 作为对比File的Blocks: 48, Size: 23496。

一个Block只能属于一个文件。未使用完毕则空置。 
每个扇区的大小、Block由多少个扇区组成、Block的大小在系统格式化的时候就已经定好。理论上不能更改。

系统对文件的访问方式

如上一章节所诉。系统在访问文件的时候必须从根”/”开始逐级通过文件名寻找对应的Innode号,再通过Innode访问到文件的具体数据。

例如访问/home/work/File

找到"/"是否是个文件夹?目录项里有无下级目标?找到目标文件夹下级目标是文件?文件是否存在?找到/home/work/File错误结束yesnoyesnoyesnoyesno

在这里面, 每次目录的访问都会对访问用户的权限进行校验,如果没有权限都会报权限错误

Linux系统的删除方式

了解了文件的储存形式,才能知道怎么删除它。

Linux对每一个文件都设置了两个引用计数器i_count/i_nlink。这两个计数器是关乎Linux操作系统的,跟文件系统无太大关联。

i_count: 引用计数器,文件被一进程引用,i_count数增加 ,可以认为是当前文件使用者的数量; 
i_nlink: 硬链接数目(可以理解为磁盘的引用计数器),创建硬链接对应的 i_nlink 就会增加

通过分析rm的源码得知它是调用了系统函数unlinkat

static enum RM_status
excise (FTS *fts, FTSENT *ent, struct rm_options const *x, bool is_dir)
{
int flag = is_dir ? AT_REMOVEDIR : 0;
if (unlinkat (fts->fts_cwd_fd, ent->fts_accpath, flag) == 0)
{
// print
// ....
return RM_OK;
} /* The unlinkat from kernels like linux-2.6.32 reports EROFS even for
nonexistent files. When the file is indeed missing, map that to ENOENT,
so that rm -f ignores it, as required. Even without -f, this is useful
because it makes rm print the more precise diagnostic. */
// .... if (ignorable_missing (x, errno))
return RM_OK; /* When failing to rmdir an unreadable directory, we see errno values
like EISDIR or ENOTDIR (or, on Solaris 10, EEXIST), but they would be
meaningless in a diagnostic. When that happens and the errno value
from the failed open is EPERM or EACCES, use the earlier, more // ....
return RM_ERROR;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

即rm的时候i_count加一再减二。 i_nlink减一(删除目录项中的文件名与Innode号的映射, 即无法再通过这个文件名进行索引)。


如图: 

可以看到rm的删除仅仅是去掉目录项里面的一个值而已

也就可以解释如下两个观点:

  • 当一个进程正在访问文件时,文件依然可以被访问。

    • 进程已经得到了文件的DataBlock
    • ls或者cat等操作必须通过文件名,而文件名已经在目录项里面删除了
  • 当文件存在其余硬链接时,文件依然可以显示。 
    • 硬链接是文件名对Innode号的映射
    • 只要映射一直存在,文件一定能访问到(rm不会抹掉Innode)

shred与rm的区别

shred 在去掉目录项的时候,还会修改Innode以及覆盖DataBlock(3次)。 
此外shred还有多种模式,比如补充0,多次抹掉等等。

rm删除文件的恢复

rm 只是删除了目录项的一个链接。只要删除之后当前数据块没有被操作。 文件是一定可以被恢复的。 见testdisk: 
How to use TestDisk

还有其它很多的文件恢复软件,其使用原理都是绕过文件系统,直接访问磁盘。每读取到一个Innode就根据其DataBlock索引找到被删除文件。

后续可能会写一个C的单个文件恢复的代码。写好之后贴上来。

我的代码

Linux文件系统及文件储存方式【转】的更多相关文章

  1. 【Linux学习】Linux文件系统3—文件操作命令

    Linux文件系统3-文件操作命令 Linux文件操作命令主要有: cd:    改变目录位置 pwd:  显示当前目录的绝对路径 ls:    显示文件名称.属性等 -a 列出全部文件 -l  列出 ...

  2. Linux 学习笔记03丨Linux文件系统、文件基本属性、目录处理及文件查看

    Chapter 2. 文件系统 2.1 Linux 系统目录结构 命令窗口下输入命令: $ ls /,能够看到根目录下的全部目录及文件 树状目录结构为: 最顶级的目录: / :根目录 / 是根目录,~ ...

  3. Linux 文件系统类型 文件系统结构 与Windows文件系统的比较

    摘自:http://blog.csdn.net/gelivable007/article/details/7249365 Linux 文件系统类型 磁盘文件系统.包括硬盘.CD-ROM.DVD.USB ...

  4. Spark修炼之道(基础篇)——Linux大数据开发基础:第二节:Linux文件系统、文件夹(一)

    本节主要内容 怎样获取帮助文档 Linux文件系统简单介绍 文件夹操作 訪问权限 1. 怎样获取帮助文档 在实际工作过程其中,常常会忘记命令的使用方式.比如ls命令后面能够跟哪些參数,此时能够使用ma ...

  5. Linux文件系统及文件类型

    Linux文件系统: 根文件系统(rootfs) root filesystem LSB, FHS: (FileSystem... /etc,  /usr,  /var,  /root.... /bo ...

  6. Day3(1)linux文件系统及文件类型

    Linux的文件系统 根文件系统(rootfs) root filesystem LSB,FHS:(FileSystem Heirache Standard) /etc,/usr,/var,/root ...

  7. linux几种文件传输方式

    本文记录linux系统中文件传输的多种方式,留作备忘.linux中文件传输的方式有ftp,scp,rsync,rz,sz等,但各个工具的功能又有所区别: FTP : FTP是文件服务器,可实现文件的上 ...

  8. Linux基础篇学习——Linux文件系统之文件存储与读取:inode,block,superblock

    Linux文件类型 代表符号 含义 - 常规文件,即file d directory,目录文件 b block device,块设备文件,支持以"block"为单位进行随机访问 c ...

  9. linux文件系统,文件的分类

    从硬盘的构造可知,每次对物理磁盘的访问的最小单位是一个盘面上的一个磁道的扇区,即使用户需要读取一个字节的数据,实际读写时都是先把该字节所在的扇区读读入到内存,然后再访问. 1.普通文件 2.目录文件 ...

随机推荐

  1. php文件加密

    1.在线加密 网址:http://www.phpjm.net/encode.html 本人测试过还可以,就是纯加密,没有解密.

  2. mac os 10.10.4 上安装mysql5.6.26

    在 Mac 系统上, 安装 MySQL Server 通常是用 DMG 包在图形化界面下按提示安装, 此外 MySQL 还提供了 Compressed TAR Archive 二进制包安装方式, 即免 ...

  3. html5 上传头像示例及其注意事项

    转自[B5教程网]:http://www.bcty365.com/content-142-5244-1.html 这次分享一个简易的上传头像示例,其大致流程为: 一.将选择的图片转为base64字符串 ...

  4. xenserver 模板导出导入

    由于业务需求,新增一台xenserver,需要将原先创建好的模板环境导入到新的母机上面,此处记录一下 1.导出模板 # 获取需要导出的模板uuid [root@localhost ~]# xe tem ...

  5. Quartz实现定时功能

    ---------------------------------博主讲废话 在自己实现爬取某个网站的信息后,发现,如果要自己每次把程序跑一遍不太现实(麻烦),所以有没有什么可以实现 定时的功能,只要 ...

  6. 任务03—简单程序测试及 GitHub Issues 的使用

    任务三主要是测试别人的代码找bug,和根据别人提出的bug修改自己的代码. 首先是测试的对象是jinlinchao的代码,根据他的代码很容易发现几个问题,一开始,我是打算,将发现的问题一个一个提上去, ...

  7. ASP-Server.Transfer-Response.Redirect

    Server.Transfer Transfer 方法把一个 ASP 文件中创建的所有状态信息(所有 application/session 变量以及所有 request 集合中的项目)发送(传输)到 ...

  8. Velocity模板引擎介绍

    整理下Velocity使用方法,整理比较详细用例 1 Velocity基础语法 1.1 用户和开发人员参考文档 http://velocity.apache.org/engine/releases/v ...

  9. where VS having

    where 和 having 的区别:        WHERE 子句不能包含聚集函数: 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的.相反,HAVING 子句总是包含聚集函数    hav ...

  10. sql语句备份/导入 mysql数据库或表命令

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/30049851