linux文件系统初学
Linux磁盘分区和目录
Linux发行版之间的差别很小,差别主要表现在系统管理的特色工具以及软件包管理方式的不同。
Windows的文件结构是多个并列的树状结构,最顶部是不同的磁盘(分区),如C,D,E等。而linux的文件结构是当个树状结构。
分区和目录的关系:
1. 任何一个分区都必须挂载到某个目录上。
2. 目录是逻辑上的区分,而分区是物理上的区分。
3. 根目录是所有linux的文件和目录
下面是我们某个可能的目录和分区的关系:
使用df可以查看各个分区的使用情况。
Mount挂载和Nfs
当要使用某个设备的时候,例如要读取一个格式化好的分区,光盘或者软件等设备,必须先把这些设备对应到某个目录上,而这个目录就被称为“挂载点”,这样才可以读取这些设备,这样的动作就是“挂载”。Mount是挂载指令,Nfs就是通过Mount来实现的。
Linux空间管理
Linux对于空间的管理相对简单,如图所示:
它将磁盘分为以下三个部分:
1) 超级块,文件系统中的第一个块被称为超级块。这个块被称为超级块。这个块存放文件系统本身的信息。比如,超级块记录了每个区域的大小,超级块也存放了未被使用的磁盘块的信息。
2) Inode表,超级块下的一个部分就是inode表。每个inode节点就是对应一个文件/目录的结构。这个机构包含了一个文件的长度,创建及修改时间,磁盘中的位置等信息。
3) 数据区,文件系统的第三个部分是数据区。文件的内容保存在这个区域。一个大的文件很容易被存储在上千个独立的磁盘块中。
一个文件主要包含文件名,属性,数据三项。内核将文件内容存放在数据区,文件属性将存放在inode中,文件名存放在目录里。下图显示了新建了一个文件的例子:
文件
文件类型
Linux主要的文件类型有以下几种:
1. 普通文件:c语言源代码,shell脚本,二进制可执行文件等,分为文本文件和二进制文件。
2. 目录文件:目录,存储文件的唯一地方。
3. 链接文件:指向同一个目录或者文件的文件。
4. 特殊文件:设备文件等。
文件存储结构
Linux正统的文件系统(ext2,ext3等)一个文件由目录项,inode和数据块组成。
目录项:包括文件名和inode节点号
Inode:又称文件索引节点,是文件基本信息的存放地方和数据块指针存放地。
数据块:文件的具体内容存放地。
下面是整体结构:
目录项内容如下:
Inode中的信息:
软链接,硬链接:
硬链接:是给文件一个副本,同时建立两者之间的连接关系,修改其中一个,与其链接的文件同时被修改。如果删除其中的一个,其余的文件则不受影响。
软链接:也叫符号链接,当源文件被删除,则符号链接会变成无源之水,而删除这个链接,源文件也不会受到影响。但是对链接文件的使用和引用都是直接调用源文件。
VFS
虚拟文件系统:
除了linux本身的文件系统,为了解决让linux支持其他不同的文件系统的问题,需要将对各种文件系统的操作和管理纳入到一个统一的框架中,使得用户程序可以使用同一组系统调用对各种不同的文件系统进行操作。这样,就对用户程序隐去了各种不同文件系统的实现细节,为用户提供一个统一的,抽象的,虚拟的文件系统界面。这就是所谓的“虚拟文件系统(VFS)”。
问题
http://djt.qq.com/article/view/620
1. 机械磁盘随机读写时速度非常慢,操作系统是采用什么技巧来提高随机读写的性能的?
附图一张:
磁盘面:磁盘就是由磁盘面组成
磁头:每个磁头对应一个磁盘面,负责该面上数据的读写
磁道:每个盘面上会围绕圆心划分出多个通信圆圈,负责该磁盘面上的数据的读写
柱面:所有盘片上的同一位置的磁道组成的立体叫做一个柱面。
扇区:以磁道为单位的管理单位仍然太大,所以计算机前辈们又把每个磁道划分出了各个扇区。
磁盘IO过程:第一步,先是磁头径向移动来寻找数据所在的磁道。这部分叫寻道时间。
第二部,找到目标磁道然后通过盘面旋转,将目标扇区移动到磁头的正下方。
第三部:向目标扇区写入数据。
所以单次磁盘IO时间=寻道时间+旋转延迟+存取时间。
所以答案是:因为一个分区的数据通常会一起读取,操作系统按照磁道对应的柱面来划分分区,来降低磁盘io所花费的寻道时间,进而来提高磁盘的读写性能。
2、touch一个新的空文件占用磁盘空间吗? 占用的话占用多少?
在linux下,新建一个新的空文件也是会占用空间,实际占用256Byte,确切的说是占用一个inode size,具体inode 的size是根据具体的平台决定的。
3、新建一个空目录占用磁盘空间吗?占用多少?和新建一个文件相比,哪个占用的更大?
占用1个block size+1个inode size,一个block size一般是4KB
4、你知道文件名是记录在磁盘的什么地方吗?
文件名记录在目录中的block的。
5、文件名最长多长?受什么制约?
linux限制文件名长度不得超过255byte。
6、文件名太长了会影响系统性能吗?为什么会产生影响?
文件名长了可能会对系统产生影响,因为这可能会导致更多的磁盘IO,比如由于文件名过长,导致目录的block变得很大,那么linux查找指定的文件极端情况可能需要遍历所有的block,产生大量的开销。、。
上面说的那个问题就是为什么有的时候ls快,有的时候ls慢,就是因为block过多,产生了多次IO。
7、一个目录下最多能建立多少个文件?
这个问题受限于你目录所在分区中inode数量,比如如果有100w个inode,就可以新建100w个文件,不过由于上面说的那个问题,单个目录下面的文件最好不要过万,不然ls之类的命令或者系统首次运行都会出现性能不佳的情况。
8、新建一个内容大小1k的文件,实际会占用多大的磁盘空间?
实际上会占用一个block加上一个inode的大小。。
9、向操作系统发起读取文件2Byte的命令,操作系统实际会读取多少呢?
块设备,当然是以block为单位进行读了。
10、我们使用文件时要怎么样来能提高磁盘IO速度?
如果知道你新建的文件会占用多大空间,比如1M,那么新建文件的时候就和操作系统说一下,让它帮你把文件的size预留下来,这样的话实际上操作系统会尽量分配连续的block,当你再读取这个文件的时候,磁盘就省去了很多寻道时间,IO速度显得快很多。
注:
使用df -i可以查看每个分区的inode数目。
使用du -h可以查看当前目录下每个文件所占实际硬盘空间大小。
如果文件都是大于4KB,甚至是几M。几G的文件,那么建议block还是尽量的大一点,这样inode可以少记几个地址。
如果文件大部分都是1K以下的,那么使用4K作为block size就会有些浪费。