文档章节

Linux File System 文件系统

Freewheel
 Freewheel
发布于 2017/04/25 12:10
字数 1927
阅读 127
收藏 2

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 指令 查看 文件属性,包括文件类型,大小,权限等

例:

如何更改文件属性?

 

关于文件的重要 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

为什么需要 Disk Partitions ? 

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

 

Mounting 挂载

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

 

几种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 。

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

由于存放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)。

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

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

假设

假设 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拥有相同的结构

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

 

inode的结构

Directory entry structure

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

 

Hard link

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

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

 

soft link / symbolic link 

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

 

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

© 著作权归作者所有

Freewheel
粉丝 10
博文 83
码字总数 48265
作品 0
普陀
程序员
私信 提问
Linux创建和挂载XFS文件系统测试实践

XFS文件系统简介 维基百科关于XFS的简介如下: XFS is a high-performance 64-bit journaling file system created by Silicon Graphics, Inc (SGI) in 1993.[6] It was the default file s......

潇湘隐者
2018/08/08
0
0
ZFS文件系统作为Linux内核模块形式发布

根据Phoronix报告,印度公司Knowledge Quest Infotech致力于移植ZFS文件系统到Linux平台的工作。计划在9月中间发布发布Linux平台的ZFS文件系统。 现在有个问题就是软件许可问题,ZFS是基于C...

红薯
2010/08/30
2K
5
对 Linux 用户一记暴击:Dropbox 或将停止支持 Linux​​​​​​​

云存储服务 —— 尤其是与本地备份计划搭配使用时,坦率地说,它是有史以来最好的计算创新之一。试想一下,你可以随时随地轻松地将重要文件备份到非现场位置,这有多酷?说实话 —— 在云之前...

局长
2018/08/12
2.9K
12
新手学堂 Linux操作系统下设置NFS共享

网络文件系统(NFS,Network File System)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像操作本地分区一样来对远程主...

红薯
2009/05/07
390
0
Linux下NFS的建立与配置方法

网络文件系统(NFS,Network File System)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像操作本地分区一样来对远程主...

红薯
2009/01/22
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

对集合的理解

开端 同事小G提了一点,Set都是无序的,但是我之前有看到过treeSet是有序的,就和他讨论了起来,还百度了一下,有序。然而他只是淡淡的说自己敲代码验证一下。 TreeSet 循环int类型 1~20,毫...

无极之岚
28分钟前
0
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
32分钟前
0
0
Ajax

定义 Ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,用于创建动态网页 Ajax=Asynchronous Javascript And XML(异步的JavaScript和XML) 原理 XMLHttpRequest对象(异...

星闪海洋
昨天
2
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
3
0
Spring中如何使用设计模式

关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式。 1. 策略模式 关于策略模式的使用方式,在S...

爱宝贝丶
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部