Linux File System 文件系统

Linux: Everything is a file      Linux中的一切都是文件

四种基本类型

Regular File 常规文件
    – /home/CSIC3150/helloworld.c
Directory 目录
    – /home/CSCI3150
Block special file 块文件
    – /dev/disk0
    Binary, read/write block by block 二进制,以块为读写单位; Can random access 随机访问

Character special file  流文件
    – /dev/mouse
    Binary, read/write byte by byte (a stream of “characters”) 二进制,以byte为读写单位; 不能随机访问数据

 

文件包含两部分内容: attributes 属性  和   data 数据

可以通过 stat 指令 查看 文件属性,包括文件类型,大小,权限等

例:

101446_BRtL_2242731.png

如何更改文件属性?

101520_Lpp9_2242731.png

 

关于文件的重要 system call

1. open()

- 使用 pathname 检查文件是否存在;
- 读取文件属性并存放在 kernel space 中,因此在open返回前可以检查权限是否合法.
注意:open() 方法没有涉及到文件的数据部分
 

2. read()

- 检查文件是否已经读完(根据file size 和 seek)
- 读取文件数据
- 文件数据会存放在kernel space的一个固定大小的缓存cache里
- 将数据写入user space的缓存里

 

3. write()

- 将数据写入kernel space的缓存buffer里
- 根据所写的数据,对应地更新文件属性file size, seek 等
- kernel space的缓存buffer里的数据会时不时地真正写入硬盘 

 

kernel space的buffer有什么用?

提高读写效率(直接读写disk是非常低效的)。

因此,拔出U盘之前需要点击系统的“弹出USB”选项,以确保系统将buffer中的数据完全写入U盘

 

Disk Partitions

113220_fu5r_2242731.png

113236_pz6p_2242731.png

为什么需要 Disk Partitions ? 

- 支持多系统,即一个硬盘里可以安装多个系统。
- 方便数据管理,可以定义逻辑分盘存放不同文件
- 方便备份和维护,Partitions 之间是相互独立的,并且可以是不同的file system,一个Partitions 崩溃不会影响到其他的

 

Mounting 挂载

Linux的文件架构是树,可以通过 mount 命令将一个filesystem挂到树的一个节点下。

113930_Sjhe_2242731.png

 

几种FS的布局方式 Layout

– Contiguous allocation 连续分配

虽然定位和删除文件很容易;

但是创建文件会遇到很大问题(External Fragmentation 尽管空间足够,但是缺乏连续长度的空位而导致无法放入新文件),尽管Defragmentation process可能会有帮助(重新整理文件空间,把碎片整合),但是这种操作非常费时。

无法增大文件,除非移动周围的所有文件。

这种布局适用于 ISO 9660, CD-ROM等 比如 光盘


– Linked allocation  链接型

使用链表的思想,每个block都是固定大小。每个block里预留一段(4byte for 32-bit系统)作为指针指向下一个block。

在根目录下保存每个文件的大小file size,以便快速查询(比如 ls -l)。

问题?

Internal Fragmentation 由于文件都是以block为最小增长单位,block很可能无法被用尽(甚至一个block只用了1 byte),而且其他文件不能继续使用这个block,造成了浪费。

随机访问的效率低下,如果要访问一个文件的第18个block,则必须访问前17个block然后一路跳转。

 

FAT 一个链接型的文件系统

将每个block中的指针集中起来,放在一个叫做File allocation table (FAT)里。

读取一个文件的步骤:(1) 从根目录root directory 中读取这个文件的first block number  (2) 之后从FAT里读取下一个block的number (3) 直到FAT显示下一个block的number为-1

为了提高性能,通常将FAT的全部或者部分放在kernel space的cache中。

在MS DOS中,将FAT的block称为 cluster。 其中,cluster address 决定了File system里有多少个cluster 。

144120_A1Y1_2242731.png

144207_PB7M_2242731.png

145003_2vEX_2242731.png

directory entry 用于描述一个文件的属性,存放在root directory下。

145235_5FnB_2242731.png

由于存放file size只有4 byte,因此最大的单个文件大小为 2 ^32 -1 = 4G -1byte

注意: 使用的是 little endian 

读取一个文件的步骤:(1) 从根目录root directory 中读取这个文件的first cluster number  (2) 之后从FAT里读取下一个cluster的number (3) 直到FAT显示下一个cluster的number为-1

 

写入一个文件(增大文件):(1) 找到最后一个cluster,(2)  如果没写满就继续写入数据 (3) 分配一个新的cluster (4) 更新 FSINFO(# of free clusters , Next free cluster #) 和 FAT  (5)  写入完毕,更新FAT 文件大小

 

删除一个文件:(1) 更新FSINFO(# of free clusters , Next free cluster #) 和 FAT  (2) 将对应的 directory entry 中的文件名首字母改为 _ 。 (即并没有实际抹除硬盘里的数据,数据会一直存在,直到这个cluster被重用覆写了。)


– INode allocation  

一个文件只有一个inode,每个inode里除了包含一些文件属性(权限等),还包含四种指针:指向数据块的指针(direct pointer),指向一级间接地址块(indirect block)的指针,指向二级间接地址块(double indirect block)的指针,指向三级间接地址块(triple indirect block)的指针。

顾名思义, 间接地址块(indirect block)只包含地址,每个地址都指向一个数据块(data block)。、

二级间接地址块(double indirect block)也只包含地址,但是每个地址都指向一个间接地址块(indirect block)。

三级间接地址块(triple indirect block)也只包含地址,但是每个地址都指向一个二级间接地址块(double indirect block)。

162659_bjxM_2242731.png

以上提到的除了inode以外的块block的大小都是一致的,而且一个block要么是纯数据块要么是纯地址块。

因此决定一个文件的最大大小的因素在于block的大小,地址的大小,还有上述四种指针的个数。

假设

163015_RJVY_2242731.png

假设 x = 3, 那么 每个block 为  8 byte , 可以包含 2 个地址。

一个inode及其指针里总共有多少个指向数据块的指针?

inode里的direct pointer 12个

一级间接指针 1 个中 指向一个 地址块(包含2个地址) 即 1 * 2 = 2 个数据块指针

二级间接指针 1 个 中 指向一个 地址块(包含2个地址)指向 一级间接指针 即 1 * 2 * 2 = 4 个 数据块指针

三级简直指针 1个  中 指向一个 地址块(包含2个地址)指向 一级间接指针 即 1 * 2 * 2 * 2 = 8个

总共 12 + 2 + 4 + 8 = 26 个数据块指针

最大文件 = 26 * 8 = 208 bytes 

 

Ext2/3  一种以inode为基础的文件系统

整个文件系统都被分为block groups,每个block group拥有相同的结构

165625_2fxJ_2242731.png

165756_TSs3_2242731.png

170342_sSKa_2242731.png

Block groups带来的好处:
– (1) 性能: spatial locality 空间局部性.
           将相关的inodes和数据块都集中在一起,加快访问查询速度
– (2) 稳定性: superblock 和 GDT 在每个block group里都重复了一次

 

inode的结构

171701_4Mqb_2242731.png

Directory entry structure

172301_x0BV_2242731.png

删除一个文件时,实际是将前一个的directory entry的length加长,并没有实质删除数据。

 

Hard link

实际是创建一个directory entry,指向同一个inode (同时这个inode的 link count会加一)。

每一个目录的link count等 2 + 子目录的个数,因为目录下的 “.” 指的就是自身,而子目录的“..”指的也是该父目录。

 

soft link / symbolic link 

创建一个新的inode,但是inode的内容只是目标文件的pathname

173835_18s3_2242731.png

 

File system consistency 一致性

The file system journal is the current, state-of-theart practice 通常使用日志的方法(借鉴数据库的做法)

 

参考:

 http://www.nongnu.org/ext2-doc/ext2.html#DEF-BLOCK-GROUPS

https://cis.temple.edu/~ingargio/cis307/readings/stable.html

http://www.ruanyifeng.com/blog/2011/12/inode.html

转载于:https://my.oschina.net/Bruce370/blog/886657

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值