Linux系统以文件形式对计算机中的数据和硬件资源进行管理,也就是彻底的一切皆文件,反映在Linux的文件类型上就是:普通文件、目录文件(文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信接口)等等。而这些种类繁多的文件被Linux使用目录树进行管理,所谓的目录树就是以根目录(/)为主,向下呈现分枝状的一种文件结构。不同于纯粹的ext2之类的文件系统,可以称之为文件体系,一切皆文件和文件目录树的资源管理方式一起构成了Linux的文件系统,让Linux操作系统可以方便使用系统资源。
一、文件系统概述
1、Linux文件系统模型
由上而下主要分为用户层、VFS层、文件系统层、缓冲层、块设备层、磁盘驱动层、磁盘物理层。
2、文件I/O与标准I/O
文件I/O又被称为不带缓冲的I/O,“不带缓冲”是指每个读写操作都调用系统内核的一个系统调用。文件I/O和标准I/O的区别在于:
标准I/O采用缓冲机制,打开文件的同时,在内存中建立一个缓冲区;而文件I/O一般不会建立缓冲区,需要手动创建;
标准I/O针对的是控制台、打印输出到屏幕等;文件I/O主要是对文件操作、读写硬盘等;
标准I/O是跨平台的,而文件I/O只适用于Uinx/Linux平台。
3、文件描述符
对内核而言,所打开的文件都是通过文件描述符引用的,当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符,该文件描述符对文件进行读写操作。
通过将文件描述符0与标准输入相关联,将文件描述符1与标准输出相关联,将文件描述符2与标准错误相关联(STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO)。
4、缓冲机制
基于流的操作最终都会一系统调用的形式进行I/O操作,,为了通过程序的运行效率,针对流通常会提供缓冲区,以减少系统调用的次数。
全缓冲:直到缓冲区被填满,才调用系统IO函数;
行缓冲:直到遇到转义字符-换行符“\n”,才会调用系统IO函数;
无缓冲:没有缓冲区,数据立即读入或者输出到外存文件或设备上。
二、文件类型
Linux系统的大多数文件时普通文件或者目录,也包括另外一些文件类型。文件类型包括如下几种:
1、普通文件(-)
从linux 的角度来说,类似mp4、pdf、HTML这样应用层面上的文件类型都属于普通文件;
Linux用户可以根据访问权限对普通文件进行查看,更改和删除。
2、目录文件(d,ditectory file)
目录文件对于用惯Windows的用户来说不太容易理解,目录也是文件的一种;
目录文件包括了各自目录下的文件名和指向这些文件的指针,打开目录事实上就是打开目录文件,只要有访问权限,你就可以随意访问这些目录下的文件(普通文件的执行权限就是目录文件的访问权限),但是只有一内核的进程可以修改它们。
虽然不能修改,但是我们可以通过vi/vim目录文件的内容。
3、块设备文件(b,block)和字符设备文件(c,char)
这些文件一般隐藏在/dev目录下,在进行设备读取和外设交互时会被使用到;
比如磁盘光驱就是块设备文件,串口设备则属于字符设备文件;
系统中的所有设备要么是块设备文件,要么是字符设备文件,无一例外。
4、符号链接(l,symbolic link)
这种类型的文件类型类似Windows中的快捷方式,是指向另一个文件的间接指针,也就是我们常说的软连接。
5、FIFO(p,pipe)
管道文件主要用于进程间通信。比如使用mkfifo命令可以创建一个FIFO文件,启动一个进程A从FIFO文件里读数据、启动进程B往FIFO里写数据,先进先出,随写随读。
6、套接字(s,socket)
用于进程间的网络通信,也可以用于本机之间的非网络通信;
这些文件一般隐藏在/var/run目录下,证明着相关进程的存在。
三、目录结构
/(root文件系统):root文件系统是文件系统的顶级目录(根目录)。它必须包含在挂载其他文件系统前需要用来启动Linux系统的全部文件。它必须包含需要用来启动剩余文件系统的全部可执行文件和库。文件系统启动以后,所有的文件系统作为root文件系统的子目录挂载到标准的、预定义好的挂载点。一般根目录只存放目录,不存放文件。
/bin: /usr/bin: 存放可执行文件,如常用的命令ls,tar,mv,cat等。
/boot:放置Linux系统启动时用到的一些文件。/boot/vmlinuz为Linux的内核文件,以及/boot/gurb 。
/dev: 存放Liunx系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的挂载光驱mount /dev/cdrom /mnt/ .
/etc: 系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有/etc/initab , /etc/init.d , /etc/X11 , /etc/sysconfig , /etc/xinetd.d 修改配置文件之前记得备份。注:/etc/X11 存放与 X、Windows有关的配置。
/etc/rc or /etc/rc.d or /etc/rc*.d
启动、或改变运行级时运行的scripts或scripts的目录.
/etc/passwd 用户数据库,其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息. /etc/fstab 启动时mount -a命令(在/etc/rc 或等效的启动文件中)自动mount的文件系统列表. Linux下,也包括用swapon -a启用的swap区的信息. /etc/group 类似/etc/passwd ,但说明的不是用户而是组. /etc/inittab init 的配置文件. /etc/issue getty 在登录提示符前的输出信息.通常包括系统的一段短说明或欢迎信息.内容由系统管理员确定. /etc/motd Message Of The Day,成功登录后自动输出.内容由系统管理员确定.经常用于通告信息,如计划关机时间的警告. /etc/mtab 当前安装的文件系统列表.由scripts初始化,并由mount 命令自动更新.需要一个当前安装的文件系统的列表时使用,例如df 命令. /etc/shadow 在安装了影子口令软件的系统上的影子口令文件.影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow 中,而后者只对root可读.这使破译口令更困难. /etc/login.defs login 命令的配置文件. /etc/printcap 类似/etc/termcap ,但针对打印机.语法不同. /etc/profile , /etc/csh.login , /etc/csh.cshrc 录或启动时Bourne或C shells执行的文件.这允许系统管理员为所有用户建立全局缺省环境. /etc/securetty 确认安全终端,即哪个终端允许root登录.一般只列出虚拟控制台,这样就不可能(至少很困难)通过modem或网络闯入系统并得到超级用户特权. /etc/shells 列出可信任的shell.chsh 命令允许用户在本文件指定范围内改变登录shell.提供一台机器FTP服务的服务进程ftpd 检查用户shell是否列在 /etc/shells 文件中,如果不是将不允许该用户登录. /etc/sysconfig 网络配置相关目录/home: 系统默认的用户家目录,新增用户账号时,用户的家目录都存在此目录下,~表示当前用户的家目录,~test表示用户test的家目录。建议单独分区,并设置较大的磁盘空间,方便用户存放数据。
/lib:/usr/lib:/usr/local/lib:系统使用的函数库目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,比较重要的是/lib/modules 。
/lost+found: 系统异常产生错误时,会将一些遗失的片段放置于此目录下,如加载disk中,此目录下就会自动产生目录 /disk/lost+found 。
/mnt:/media: 光盘默认挂载点,通常挂盘挂载于/mnt/cdrom下,也不一定,可以选择任意位置进行挂载。
/opt; 给主机额外安装软件所存放的目录。
/proc: 此目录的数据都在内存中,如系统核心,外部设备、网络状态,由于数据都存在内存中,所以不占用磁盘,比较重要的目录。
/root :系统管理员root的家目录,系统第一个启动的分区 / ,所以最好将/root和 / 放在一个分区下。
/sbin: /usr/sbin/: /usr/local/sbin : 放置系统管理员使用的可执行命令,如disk,shutdown,mount.与/bin 不同的是,这里面存放的命令是给系统管理员root使用的命令,一般用户只能使用和设置。
/tmp :一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
/srv: 服务启动之后需要访问的数据目录,如www服务器需要访问的网页数据存放在/srv/www内。
/usr: 应用程序存放目录。/usr/bin 存放应用程序;/usr/share 存放共享数据;/usr/lib存放不能直接运行的,却是许多程序运行所必需的一些函数库文件;/usr/local存放软件升级包;/usr/share/doc系统说明文件存放目录;/usr/share/man程序说明文件存放目录。
/var: 放置系统执行过程中经常变化的文件,如随时更改的日志文件/var/log,/var/log/message所有登陆文件存放目录,var/spool/mail邮件存放目录,/var/run程序或者服务启动。
/var/catman
当要求格式化时的man页的cache.man页的源文件一般存在/usr/man/man* 中;有些man页可能有预格式化的版本,存在/usr/man/cat* 中.而其他的man页在第一次看时需要格式化,格式化完的版本存在/var/man 中,这样其他人再看相同的页时就无须等待格式化了. (/var/catman 经常被清除,就象清除临时目录一样.) /var/lib 系统正常运行时要改变的文件. /var/local /usr/local 中安装的程序的可变数据(即系统管理员安装的程序).注意,如果必要,即使本地安装的程序也会使用其他/var 目录,例如/var/lock . /var/lock 锁定文件.许多程序遵循在/var/lock 中产生一个锁定文件的约定,以支持他们正在使用某个特定的设备或文件.其他程序注意到这个锁定文件,将不试图使用这个设备或文件. /var/log 各种程序的Log文件,特别是login (/var/log/wtmp log所有到系统的登录和注销) 和syslog (/var/log/messages 里存储所有核心和系统程序信息. /var/log 里的文件经常不确定地增长,应该定期清除. /var/run 保存到下次引导前有效的关于系统的信息文件.例如, /var/run/utmp 包含当前登录的用户的信息. /var/spool mail, news, 打印队列和其他队列工作的目录.每个不同的spool在/var/spool 下有自己的子目录,例如,用户的邮箱在/var/spool/mail 中. /var/tmp 比/tmp 允许的大或需要存在较长时间的临时文件. (虽然系统管理员可能不允许/var/tmp 有很旧的文件.)