文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法
对磁盘格式化,就是创建文件系统
linux在创建文件系统时,确定block,inode的 size和总数 ,并为每个block,inode编号
磁盘分区后,需要格式化才能挂载使用,传统的来说,一个磁盘分区就对应一个文件系统,但lvm技术在磁盘分区和文件系统之间添加了一个逻辑层,磁盘分区pv->逻辑卷lv,在lv上建立文件系统,pv和fs没有什么特定的对应关系了
文件数据除了文件实际内容外, 通常还含有非常多的文件属性
linux 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中
还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等
- superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码(多个);
- block:实际记录文件的内容,若文件太大时,会占用多个 block 。
linux的EXT?即是 索引式文件系统(indexed allocation)
Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统
Boot Sector
sector = 512 byte
boot sector 主引导扇区 包括:硬盘主引导记录(MBR)+ 硬盘分区表(DPT)+ 结束标志
MBR 446字节,DPT 64字节,结束标志2字节
Dpt(由4项组成,每项16个字节(Byte),描述一个分区的基本信息)
Superblock (超级区块)
- block 与 inode 的总量;
- 未使用与已使用的 inode / block 数量;
- block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128 bytes);
- filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;
- 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。
一个文件系统应该仅有一个 superblock 而已,但每个 block group 都可能含有 superblock ,主要目的是做为第一个 block group 内 superblock 的备份
Filesystem Description (文件系统描述说明)
描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。这部份也能够用 来观察的
# dumpe2fs -h /dev/sda2 #显示superblock信息
# dumpe2fs -f /dev/sda2 #显示superblock + 各个group描述信息
block bitmap (区块对照表)
inode bitmap (inode 对照表)
这两个位图就不说了
inode table
这个部分存储的是inode条目,
inode应包含以下两种信息
1. 记录文件的属性信息(metadata)
2. 文件数据所在的block号 (point分为:直接指向,3级的间接指向(借助data block))
属性:inumber,文件类型,权限,链接数,uid,gid,size(bytes,blocks),3个时间戳,point(file's data block号...),
查看inode信息: stat ; ls -i ; df -i
查看inumber
# ls -li
131081 drwxr-xr-x 2 oracle oinstall 4096 Oct 27 22:02 arch
15 -rw-r--r-- 1 root root 63171 Oct 29 11:17 ~dumpf.txt
查看文件的inode信息
# stat 112/bin/oracle
File: `112/bin/oracle'
Size: 173515521 Blocks: 338920 IO Block: 4096 regular file
Device: 802h/2050d Inode: 546887 Links: 1
Access: (6751/-rwsr-s--x) Uid: ( 501/ oracle) Gid: ( 501/oinstall)
Access: 2013-10-27 21:59:38.932013829 +0800
Modify: 2013-05-14 15:40:58.219034949 +0800
Change: 2013-05-14 15:40:59.033034948 +0800
查看文件系统的inode信息
# stat -f /u01/oracle
# df -i ; df (文件对应挂载的fs)
# dumpe2fs -h /dev/sda2
data block (数据区块)
data block 是用来放置文件内容数据地方
- 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
- 每个 block 内最多只能够放置一个文件的数据;
- 承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
- 承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。
目录也是一种文件
linux文件类型
d 目录文件
l 符号链接(指向另一个文件,类似于window下的快捷方式)
s 套接字文件
b 块设备文件,二进制文件(有缓冲,且可以随机存取)
c 字符设备文件(无缓冲,且只能顺序存取)
p 命名管道文件
- 普通文件,或者更准确地说,不属于以上几种类型的文件
ls -l 经常会发现目录的大小是4096
这是由于fs的block size是4k
[root@localhost oracle]# dumpe2fs -h /dev/sda2|grep Block
dumpe2fs 1.41.12 (17-May-2010)
Block count: 3407616
Block size: 4096
Blocks per group: 32768
那么,目录的大小与什么有关?
目录与普通文件类似,只不过data block里存放的是目录项(dirent对应的实际存储结构)
这个存储结构至少应包括 该目录下(文件/目录)的文件名 和相应的inumber
所以一个directory类型文件的大小,只与它下面直接包含(无递归)的文件数有关
[root@localhost dir1]# mkdir {A-Z}{1..100}
[root@localhost dir1]# ll |wc -l
2703
[root@localhost dir1]# ll ..
total 60
drwxr-xr-x 2 oracle dba 4096 Aug 19 20:24 bs
drwxr-xr-x 103 root root 57344 Oct 29 13:02 dir1 # dir1目录变大了
[root@localhost dir1]# ll ../..
total 96
drwxr-xr-x 4 oracle dba 4096 Oct 29 13:48 oracle #并不影响它的父目录的大小
假设一种不管cache的思路,
那么查找文件 /etc/sysctl.conf
内核解析该参数时,以"/"分割,发现是绝对路径,就以根目录作为工作目录,一般是2号,从根目录的datablock里查找etc,找到了取出inode号,然后读etc的datablock,查找sysctl.conf,返回它的inode号.
目录的权限:
r 浏览该目录清单的权限
w 具有删除,移动,新增目录内文件
x 具有进入目录,作为工作目录的权限
要开放目录给任何人浏览时,至少要给r-x的权限
只给r还是不够,Permission denied
文件名
对于一个文件来说有唯一的inode号与之对应,对于一个inode号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问它
即对于fs来说,使用inode number来唯一标识文件
而对于用户来说,使用文件名(路径名)来标识文件
这个对应关系只存在于 目录文件的block中,里面的数据结构也叫dentry好了,总之这里把他理解为存储结构,dentry结构,理解上可参考dirent结构体,至少包括文件名和该文件名所对应的inode号
除了目录的block(dentry条目)之外,没有地方存文件名了,文件block不会有,inode更不会有
所以增,删,改文件名与文件所在目录的w权限有关
链接
可以用ln命令对一个已经存在的文件再建立一个新的链接,链接有软链接和硬链接之分
建立硬链接,其实只是修改某个目录的block增加一个dentry项,inode号=被链接的inode(硬链接和文件指向同一个inode号)
并把inode的link count+1
目录不能有硬连接;硬连接不能跨越文件系统
软连接会创建一个"l"符号链接类型的文件,有自己的inode,block里的内容是被链接的文件的档名
当访问一个软连接文件时,系统会发现他的文件类型是"l",先读取block里的数据当做路径,再去找到真正要访问的文件
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28859270/viewspace-775264/,如需转载,请注明出处,否则将追究法律责任。