文件系统与inode


文件=文件内容+文件属性
一个文件没有被打开。那么这个文件就在磁盘里面存放着

磁盘是:我们计算机中的一个机械设备(SSD,FLASH卡,USB)
在这里插入图片描述
扇区:同心园中一道一道的以小块区域,
磁道:每一快同心园
柱面:半径相同的扇形围起来构成的一圈
磁盘写入的基本单位:扇区! 512字节
定位方式:
可以把磁盘想象成线性结构,

在这里插入图片描述

LBA可以理解为数组的下标,访问地址,如果我们要写到物理地址,我们就要转换成为物理地址
类比(虚拟地址和物理地址)

大磁盘管理成本就非常高
先要把磁盘划分成一个有一个的小区域
在这里插入图片描述

  1. 分区:磁盘中就是分区(C盘D 盘),新加卷,把大盘分解成好几个盘(大磁盘变成小空间)
  2. 格式化::分区写入文件系统: 类比我们给每个省,写入省政府领导班子,(格式化)—》更换领导班子,(更换文件系统)

Linux特有的ext系列的文件系统
在这里插入图片描述

  • super block:里面存放的是每个空间的使用情况,是描述整个分区的相关文件系统信息(可以理解为做了一个备份),避免其他的super block坏掉
  • group describe table: 描述组的情况,inode bitmap和data bitmap中使用的情况,没有用多少,

一个文件包含文件数据和文件属性,
data block里面存放的就是文件数据(4kb)
inode block里面存放的就是文件的属性(512b)
inode都被存放在了inode table里面

要让inode和block先关联才方便我们去查找,而我们在Linux里面利用文件名操作,在操作系统角度是毫无意义的,操作系统是通过inode的编号,因为一个文件一个inode

inode

我们可以通过inode的编号找到文件

 struct inode
 {
//文件的所有属性(文件大小,文件权限,文件的拥有者,所属组,文件的编号inode)
//数据信息  int inode number
//int block[32]//用数组的方式把和inode关联的写到inode里面
}


找到一个文件的inode就可以找到他的所有属性,
block是通过映射关系找到器对应的数据块

bitmap

位图
block bitmap
inode bitmap
00001010
从右向左:
比特位的位置含义:inode 编号
比特位内容含义: 特定的inode是否有被占用,

将inode bitmap加载到内存中,找到一个没有被使用的inode(使用位操作)找到里面为0的位置,将其使用
同理对于,block bitmap(对数据块的使用情况,未进行数据的申请释放,遍历5个为0 的位置,在填如到inode里面)

inode操作

目录是文件吗

目录是文件,他也是有inode,里面的文件大小,权限,所有人,所属组也都是有的,同样,目录也是有数据的

目录中的数据存放这将目录中的文件名映射到对应inode编号,我们创建的文件一定是在特定的目录当中

touch a
echo hello > a
cat a

这一系列的操作

  1. 我们通过inode bitmap找到未被使用的位,inode
  2. 我们再把文件的相关信息全都存放进去
  3. 写入: 再block bitmap里面看未被使用的block,建立映射关系,把数据写入到相应的块中
  4. 查看: 再当前目录下,把hello.c和新的inode的映射关系查找到,查找到相应的文件

假如我们mkdir demo
在里面查找inode=1234的hello.c
我们通过inode把数据映射到当前路径之下,

维护1234的inode的hello.c的映射关系—> 找到inode=1234----> 在inode table里面找到对应的inode --> 就可以找到了对应的block 数据块—>再打印文件内容

然而
rm hello.c并不是按照上述流程来操作的
他不需要inode table 将上述的操作把inode bitmap给清掉 即可
把所有的数据块清掉
(属性数据和内容数据都还在),—>(恢复文件,把inode bitmap把曾经的位由0置1就可以了,同理block)
:rm并不是删除文件的属性和数据,只是把其是否有有效位给置去了

如果我们误操作了,删除了文件,最好的做法是什么??
什么东西都没有,找人

实际上: 我们创建了一个文件,实在inode table里面创建了一个节点,然后再数据区里面,找多个数据块,进行维护,,然后再inode里面数据和属性建立关系

软硬链接

软连接相当于一个快捷方式,方便我们查找一个路径

  1. 创建软链接
ln -s [file] [lname]

在这里插入图片描述
2. 删除链接
unlink [链接名]
在这里插入图片描述
软连接是有独立的inode 的,
说明他就是一个独立文件,,有自己的属性集合,和数据块,数据块里面保存的是指向文件的所在路径+文件名

  1. 创建硬链接
    硬链接本质上就不是一个独立的文件,而是一个文件名和inode编号的映射关系,因为自己没有独立的inode,所以就没有所谓的属性数据

创建硬链接,本质是在特定的路径下,填写一对文件名和inode的映射关系,相当于完成了重命名,

在这里插入图片描述

在这里插入图片描述

ref就是有多少个硬链接数
建立硬链接数就是ref++,就是叫做引用计数
ref=0的时候就才把这个文件给删除掉

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
ext4文件系统的Inode结构体定义在内核源代码中的`include/linux/ext4_fs.h`文件中。 其结构体定义如下: ``` struct ext4_inode { __le16 i_mode; /* File mode */ __le16 i_uid; /* Low 16 bits of Owner Uid */ __le32 i_size_lo; /* Size in bytes */ __le32 i_atime; /* Access time */ __le32 i_ctime; /* Creation time */ __le32 i_mtime; /* Modification time */ __le32 i_dtime; /* Deletion Time */ __le16 i_gid; /* Low 16 bits of Group Id */ __le16 i_links_count; /* Links count */ __le32 i_blocks_lo; /* Blocks count */ __le32 i_flags; /* File flags */ union { struct { __le32 l_i_version; } linux1; struct { __u32 h_i_translator; } hurd1; struct { __u32 m_i_reserved1; } masix1; } osd1; /* OS dependent 1 */ __le32 i_block[EXT4_N_BLOCKS];/* Pointers to blocks */ __le32 i_generation; /* File version (for NFS) */ __le32 i_file_acl_lo; /* File ACL */ __le32 i_size_high; __le32 i_obso_faddr; /* Obsoleted fragment address */ union { struct { __le16 l_i_blocks_high; /* were l_i_reserved1 */ __le16 l_i_file_acl_high; __le16 l_i_uid_high; /* these 2 fields */ __le16 l_i_gid_high; /* were reserved2[0] */ __le16 l_i_checksum_lo;/* crc32c(uuid+inum+inode) LE */ __le16 l_i_reserved; } linux2; struct { __le16 h_i_reserved1; /* Obsoleted fragment number/size which are removed in ext4 */ __u16 h_i_mode_high; __u16 h_i_uid_high; __u16 h_i_gid_high; __u32 h_i_author; } hurd2; struct { __le16 h_i_reserved1; /* Obsoleted fragment number/size which are removed in ext4 */ __u16 m_i_file_acl_high; __u32 m_i_reserved2[1]; } masix2; } osd2; /* OS dependent 2 */ }; ``` 可以看到,`ext4_inode`结构体包含了文件的基本属性信息,如文件大小、文件类型、访问、修改和创建时间、文件所属用户和组、文件权限等。此外,还包含了指向文件内容的指针、文件所在的磁盘块号、文件版本号、文件ACL等信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevin~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值