分区和目录

Linux的文件结构是单个的树状结构.可以用tree进行展示。 在Ubuntu下安装tree(sudo apt-get install tree),并可通过命令来查看。

Linux的分区是物理上的概念,就像我们把一块硬盘分成C:,D:,E:三个区一样,物理上将存储空间分开

Linux的目录是逻辑上的概念,Linux的目录树实际上是一个分区之间的数据逻辑结构关系,不是物理结构

每次安装系统的时候我们都会进行分区,Linux下磁盘分区和目录的关系如下:

  1. 任何一个分区都必须挂载到某个目录上。

  2. 目录是逻辑上的区分。分区是物理上的区分。

  3. 磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作。

  4. 根目录是所有Linux的文件和目录所在的地方,需要挂载上一个磁盘分区。

以下是我们可能存在的一种目录和分区关系:

如何查看分区和目录及使用情况?

fdisk:查看硬盘分区表

df:查看分区使用情况

du: 查看文件占用空间情况

为什么要分区,如何分区?

  1. 可以把不同资料,分别放入不同分区中管理,降低风险。

  2. 大硬盘搜索范围大,效率低

  3. 磁盘配合只能对分区做设定

  4. /home /var /usr/local经常是单独分区,因为经常会操作,容易产生碎片

机械磁盘随机读写时速度非常慢,操作系统是采用什么技巧来提高随机读写的性能的?

还是先从最基本的磁盘物理结构说起吧,注意本文只讨论机械磁盘,SSD不在本文讨论范围之内。对于管理磁盘,分磁盘面、磁头、磁道、柱面和扇区。

磁盘面:磁盘是由一叠磁盘面组成,见下左图。

磁头(Heads):每个磁头对应一个磁盘面,负责该磁盘面上的数据的读写。

磁道(Track):每个盘面会围绕圆心划分出多个同心圆圈,每个圆圈叫做一个磁道。

柱面(Cylinders):所有盘片上的同一位置的磁道组成的立体叫做一个柱面。

扇区(Sector):以磁道为单位管理磁盘仍然太大,所以计算机前辈们又把每个磁道划分出了多个扇区,见下右图

Linux上可以通过fdisk命令,来查看当前系统使用的磁盘的这些物理信息。

以上是我本人的一台虚拟机的磁盘物理信息。可以看出我的磁盘有255个heads,也就是说共有255个盘面。3263个cylinders,也就是说每个盘面上都有3263个磁道, 63sectors/track说的是每个磁道上共有63个扇区。命令结果也给出了Sector size的值是512bytes。那我们动笔算一下该磁盘的大小吧。

255盘面 3263柱面 63扇区 * 每个扇区512bytes = 26839088640byte。

结果是26.8G,和磁盘的总大小相符。

磁盘IO时的过程:

  1. 首先是磁头径向移动来寻找数据所在的磁道。这部分时间叫寻道时间。

  2. 找到目标磁道后通过盘面旋转,将目标扇区移动到磁头的正下方。

  3. 向目标扇区读取或者写入数据。到此为止,一次磁盘IO完成。

单次磁盘IO时间 = 寻道时间 + 旋转延迟 + 存取时间。

对于旋转延时,现在主流服务器上经常使用的是1W转/分钟的磁盘,每旋转一周所需的时间为60*1000/10000=6ms,故其旋转延迟为(0-6ms)。对于存取时间,一般耗时较短,为零点几ms。对于寻道时间,现代磁盘大概在3-15ms,其中寻道时间大小主要受磁头当前所在位置和目标磁道所在位置相对距离的影响。

操作系统通过按磁道对应的柱面划分分区,来降低磁盘IO所花费的的寻道时间 ,进而提高磁盘的读写性能。

我们使用文件时要怎么样来能提高磁盘IO速度?

如果你知道你的要新建的文件大概会占用多大的空间的话,比如1M。那么你新建文件时就顺便和操作系统说一下,让它帮你将文件的size预留下来。这样实际上操作系统时会尽可能为你分配连续的block,这样你再读取这个文件时,磁头就省去很多寻道时间了,IO速度就显得快多了。

Mount挂载

挂载

挂载的概念 :当要使用某个设备时,例如要读取硬盘中的一个格式化好的分区、光盘或软件等设备时,必须先把这些设备对应到某个目录上,而这个目录就称为“挂载点(mount point)”,这样才可以读取这些设备,而这些对应的动作就是“挂载”。 将物理分区细节屏蔽掉。用户只有统一的逻辑概念。所有的东西都是文件。Mount命令可以实现挂载:

mount [-fnrsvw] [-t vfstype] [-o options] device dir

所有的磁盘分区都必须被挂载上才能使用,那么我们机器上的硬盘分区是如何被挂载的?

这主要是它利用了/etc/fstab文件。每次内核加载它知道从这里开始mount文件系统。每次系统启动会根据该文件定义自动挂载。若没有被自动挂载,分区将不能使用。

移动硬盘如何挂载?如何挂载一个新的分区?

移动硬盘有驱动模块会自动挂载,如果有个新硬盘,要先进行分区,并通过mount命令挂载到某个文件夹。如果要自动挂载则可以修改/etc/fstab文件.

文件类型

Linux下面的文件类型主要有:

  1. 普通文件:C语言元代码、SHELL脚本、二进制的可执行文件等。分为纯文本和二进制。

  2. 目录文件:目录,存储文件的唯一地方。

  3. 链接文件:指向同一个文件或目录的的文件。

  4. 特殊文件:与系统外设相关的,通常在/dev下面。分为块设备和字符设备。

可以通过ls –l, file, stat几个命令来查看文件的类型等相关信息。

文件存储结构

大部分的Linux文件系统(如ext2、ext3)规定,一个文件由目录项、inode和数据块组成:

目录项:包括文件名和inode节点号。

Inode:又称文件索引节点,包含文件的基础信息以及数据块的指针。

数据块:包含文件的具体内容。

inode

理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector),每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。

inode包含文件的元信息,具体来说有以下内容:

文件的字节数。
文件拥有者的User ID。
文件的Group ID。
文件的读、写、执行权限。
文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
链接数,即有多少文件名指向这个inode。
文件数据block的位置。

可以用stat命令,查看某个文件的inode信息:

stat demo.txt

总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。

当查看某个文件时,会先从inode表中查出文件属性及数据存放点,再从数据块中读取数据。

请看文件存储结构示意图:

inode的大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i 命令。

查看每个inode节点的大小,可以用如下命令:

sudo dumpe2fs -h /dev/hda | grep "Inode size"

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

一个目录下最多能建多少个文件,这个最多其实是受限于你目录所在分区的inode数量,你有100W个inode,你最多就可以新建100W个文件

inode节点号

每个inode都有一个inode节点号,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

使用ls -i命令,可以看到文件名对应的inode号码,例如:

ls -i demo.txt

目录项

Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode节点号。

ls命令只列出目录文件中的所有文件名:

ls /etc
ls -i命令列出整个目录文件,即文件名和inode号码:
ls -i /etc

如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令就是通过这种方式列出文件的详细信息。

ls -l /etc

touch一个新的空文件占用磁盘空间吗?占用多少?

新建一个空的文件是会占用磁盘空间的,实际占用的是256Byte。准确的说法应该是一个inode size,具体的值是在格式化时决定的。用 ls -l 无法看到所占的磁盘空间,需要调用 df -i才能看到。

新建一个空目录占用磁盘空间吗?占用多少?

新建空目录会占用4KB的磁盘空间。目录也是会占用一个inode节点的,这个在你的系统上也不一定是4K,它实际上一个block size。同样在dumpe2fs下可以看到。目录的磁盘空间用来保存目录内的目录项的文件名。

新建一个内容大小1k的文件,实际会占用多大的磁盘空间?

操作系统分配空间时是以block为最小单位。也就是说只要你的文件数据不为空,操作系统就至少会给你分配一个block来存储,直到你超过了4KB,操作系统再给你分配下一个block,就是这样。所以对于开篇问题8,新建一个内容大小为1k的文件,实际会占用1个block(一般为4k)和一个inode(一般为256byte)。

文件名最长为多少?太长了会影响系统性能吗?为什么会产生影响?

Linux操作系统就是为了避免程序员不节制地使用长文件名,强加了个限制,不得超过255byte。

很多程序员都喜欢将文件命名为有意义的长串,使人一看文件名就知道用途。当然我没说这样不好,但是如果你的文件数量相当大的时候,你就要考虑你的文件名是否导致你的目录block占用太多了。占用的空间倒是小事,磁盘很便宜,但是你得考虑下在目录下查找文件时操作系统的感受,操作系统可需要用你你提供的文件名进行字符串比较,而且运气不好的话需要将其名下所有block都搞一遍才行啊。(当然了,你的文件名长度不变态,而且数量没有达到十万数量级的话实际上这个开销也不会太大,但是这个开销你还是知道的为好)

向操作系统发起读取文件2Byte的命令,操作系统实际会读取多少呢?

其实文件系统在向磁盘发起IO请求的时候,也是以block size为单位的。哪怕你只向操作系统发起读取文件的2Byte,但是操作系统会一次性给你读取4KB回来。因此磁盘IO真的是很慢,而且我们只要访问了这2Byte,确实很有可能接下来继续访问这2byte后面的内容,这也就是程序局部性原理,所以操作系统索性一次性就多读取些回来了。

硬链接和软链接

硬链接

一般情况下,文件名和inode号码是”一一对应”关系,每个inode号码对应一个文件名。但是,Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为”硬链接”(hard link)。

ln命令可以创建硬链接,语法为:

ln source_file target_file

运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的”链接数”。创建目录时,默认会生成两个目录项:”.”和”..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的”.硬链接“。

软链接

除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。

ln -s命令可以创建软链接,语法为:

ln source_file target_file

常见目录解释

转载:

http://blog.csdn.net/yapian8/article/details/41986571

http://www.cnblogs.com/yyyyy5101/articles/1901842.html