Linux文件系统---用户与内核的交互接口
从磁盘到数据,从数据到文件,从文件到目录,从目录到文件系统,从文件系统到操作系统。构成了计算机中的IO读写机制。
整个磁盘可以分为1个MBR(Master Boot Record)和4个partitions。一个分区,其实就是一个文件系统,文件系统就是管理组织硬盘上数据的一堆数据结构程序,一个文件系统由许多block块组成。块是文件系统读写存放数据的最小单位,一般是4KB。每个Block里只能存放一个文件的数据。如果文件大于Block大小,则该文件会占用多个Block。对于文件来说,分为目录项、inode、数据块。对于操作系统和应用程序来说,都是通过文件系统来访问硬盘上的文件。
1、硬盘读写原理
大多数永久性或半永久性电脑数据都是将磁盘上的一小片金属物质磁化来实现。然后再将这些磁性图可被转换成原始数据。这便是磁存储的原理。
我们知道信息存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1(磁化为1),凹的地方代表数字0。因此硬盘可以以二进制来存储表示文字、图片等信息。
硬盘,我们可以把它比喻成是我们电脑储存数据和信息的大仓库。一般说来,无论哪种硬盘,都是由盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部份组成。
磁头是硬盘中最昂贵的部件,也是硬盘技术中最重要和最关键的一环。
当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。这些磁道用肉眼是根本看不到的,因为它们仅是盘面上以特殊方式磁化了的一些磁化区,磁盘上的信息便是沿着这样的轨道存放的。磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的山区,每个扇区可以存放512个字节的信息,磁盘驱动器在向磁盘读取和写入数据时,要以扇区为单位。1.44MB3.5英寸的软盘,每个磁道分为18个扇区。
磁盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘单面上的磁道数是相等的。无论是双盘面还是单盘面,由于每个盘面都只有自己独一无二的磁头,因此,盘面数等于总的磁头数。所谓硬盘的CHS,即Cylinder(柱面)、Head(磁头)、Sector(扇区),只要知道了硬盘的CHS的数目,即可确定硬盘的容量,硬盘的容量=柱面数*磁头数*扇区数*512B。
2、文件
Linux中有个哲学,一切皆文件。那么,在Linux文件系统下,有哪些文件类型呢?文件又是怎样存储在文件系统中的呢?
在Linux下,常用的七种文件类型如下:
1)、普通文件regular file,用 - (破折号)标示, 比如 -rwxr--r-- ,rxw前面的 - 表明这个是普通文件。
2)、目录文件directory,用 d 标示 ,比如drwx------ 目录也是一个文件,其中存放着文件名和文件索引结点之间的关联关系。
3)、块设备文件block deivce ,用 b 标示,实际表示硬件设备 ,可以在/dev 目录访问,包含磁盘驱动光盘驱动等。
4)、字符设备文件character device,用 c 标示,也表示硬件设备,但数据是以字节流发送的,设备包括终端设备和串口设备。
5)、链接 link 设备用 l 标示,就是ln 创建的链接,分为软和硬链接。
6)、命名管道文件 pipe 用 p 标示,管道也是一个文件,作为数据管道方便程序之间的通信,也称为FIFO。
7)、套接字文件socket 用 s 标示,与管道不同,套接字能使通过网络连接的不同计算机的进程之间进行通信。
当执行一个文件时候,进程通过文件名直接访问文件本身。这样,每次读取文件的时候,过程如下:
文件名----(通过目录项)---->inode编号----(通过inode)----->得到文件的地址(数据块号数组)---->读取文件。
在Linux的文件系统(如ext2、ext3、ext4)中,一个文件由目录项、inode和数据块组成。
1)、目录项:包括文件名和inode节点号。
2)、Inode:又称文件索引节点,是包含了文件基本信息的和数据块的指针。
Linux正统的文件系统下,将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
3)、数据块:文件的具体内容存放地。
3、文件目录
目录,实际上是文件下系统的访问各个文件组合的映射。在LInux下,设备和硬盘都是挂载到某个目录,最原始的是挂载到根目录。然后用户通过进入目录去访问硬盘上的数据,也就是文件。所以说,目录是一个访问硬盘文件数据的实际入口。在Linux下的目录结构如下:
/bin:系统有很多放置执行档的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被root与一般帐号所使用,主要有:cat,chmod(修改权限),chown、date、mv、mkdir、cp、bash等等常用的指令。
/boot:主要放置开机会使用到的档案,包括Linux核心档案以及开机选单与开机所需设定档等等。Linux kernel常用的档名为:vmlinuz ,如果使用的是grub这个开机管理程式,则还会存在/boot/grub/这个目录。
/dev:在Linux系统上,任何装置与周边设备都是以档案的型态存在于这个目录当中。 只要通过存取这个目录下的某个档案,就等于存取某个装置。比要重要的档案有/dev/null、 /dev/zero、/dev/tty、/dev/lp*、 / dev/hd*、/dev/sd*等等
/etc:系统主要的设定档几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。 一般来说,这个目录下的各档案属性是可以让一般使用者查阅的,但是只有root有权力修改。 另外,其下重要的目录有:/etc/init.d/ 。所有服务的预设启动script都是放在这里的,例如要启动或者关闭iptables的话: /etc/init.d/iptables start、/etc/init.d/ iptables stop。
/homt:这是系统预设的使用者家目录(home directory)。在你新增一个一般使用者帐号时,预设的使用者家目录都会规范到这里来。比较重要的是,家目录有两种代号:~ :代表当前使用者的家目录,而 ~guest:则代表用户名为guest的家目录。
/lib:系统的函式库非常的多,而/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已 。 什么是函式库呢?妳可以将他想成是外挂,某些指令必须要有这些外挂才能够顺利完成程式的执行之意。 尤其重要的是/lib/modules/这个目录,因为该目录会放置核心相关的模组(驱动程式)。
/media:media是媒体的英文,顾名思义,这个/media底下放置的就是可移除的装置。 包括软碟、光碟、DVD等等装置都暂时挂载于此。 常见的档名有:/media/floppy、/media/cdrom等等。
/mnt:如果想要暂时挂载某些额外的装置,一般建议可以放置到这个目录中。
/opt:这个是给第三方协力软体放置的目录 。
/root:系统管理员(root)的家目录。
/sbin:Linux有非常多指令是用来设定系统环境的,这些指令只有root才能够利用来设定系统,其他使用者最多只能用来查询而已。放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。
/srv:srv可以视为service的缩写,是一些网路服务启动之后,这些服务所需要取用的资料目录。 常见的服务例如WWW, FTP等等。 举例来说,WWW伺服器需要的网页资料就可以放置在/srv/www/里面。呵呵,看来平时我们编写的代码应该放到这里了。
/tmp:这是让一般使用者或者是正在执行的程序暂时放置档案的地方。这个目录是任何人都能够存取的,所以定期清理。
4、文件系统
文件系统,是操作系统中用于明确磁盘或者分区上的文件的方法和数据结构,即磁盘上组织文件的方法。文件系统的存在,使得数据可以被有效而透明地进行存储访问。在传统意义上,一个分区只能格式化为一个文件系统,所以通常认为一个文件系统就是一个分区。在计算机中,DOS、Windows、OS/2、Macintosh和UNIX-based操作系统都有文件系统,在此系统中文件被放置在分等级的(树状)结构中的某一处。文件被放置进目录或子目录,在树状结构中你希望的位置中。
磁盘或分区和它所包括的文件系统的不同是很重要的。少数程序(包括最有理由的产生文件系统的程序)直接对磁盘或分区的原始扇区进行操作;这可能破坏一个存在的文件系统。大部分程序基于文件系统进行操作,在不同种文件系统上不能工作。
在Linux系统下,可以通过df -Th 查看Linux下硬盘分区以及文件系统信息,而du -sh是查看文件大小信息:
在安装 Linux 系统时,根据服务器的用途,需要对硬盘进行合理分区规划。在系统运行的过程中,随着业务的发展变化,不断增长的数据存储的要求,也需要对磁盘存储进行调整和管理。目前在服务器上使用得最多,技术最成熟可靠的仍然是传统的机械硬盘。随着技术的发展,在相当多的领域也使用了基于闪存技术的 SSD 硬盘。硬盘当然是用来存储数据,即存放系统和用户的文件,而分区的文件系统就规定了数据存储单元在硬盘上排列的规则。
不同的文件系统,存储数据的方式不一样,这些不同的文件系统可以共存于同一个系统的硬盘之上,但不能共存于同一个磁盘分区之上。Linux 最重要的特性之一就是支持多种文件系统。
而 Linux 通过 VFS(Virtual File System)支持多个不同的文件系统,能够与不同的操作环境实现资源共享。关于文件系统,在Linux下有一个重要的哲学,就是一切皆文件。其实现的原理,就是通过VFS。虚拟文件系统(VFS)作为内核的子系统,为用户空间程序提供了文件系统接口,系统中的所有文件系统依靠VFS系统协调工作。通过虚拟文件系统,可以利用标准的UNIX系统调用对不同介质的不同文件进行读写操作,而不需要考虑具体的文件系统和实际物理介质。
所有,总的来说。从磁盘到数据,从数据到文件,从文件到目录,从目录到文件系统,从不同的文件系统到操作系统,这其中蕴含了复杂的实现原理,但是底层设计思路构成了计算机中的IO读写机制的基础。