2019独角兽企业重金招聘Python工程师标准>>>
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/ext2-doc/ext2.html#DEF-BLOCK-GROUPS
https://cis.temple.edu/~ingargio/cis307/readings/stable.html
http://www.ruanyifeng/blog/2011/12/inode.html
转载于:https://my.oschina/Bruce370/blog/886657
更多推荐
Linux File System 文件系统
发布评论