linux文件目录结构

原文:http://c.biancheng.net/view/2833.html

Linux一切皆文件(包含好处和弊端)

Linux 中全部内容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目录(Windows 下称为文件夹)是文件,硬件设备(键盘、监视器、硬盘、打印机)是文件,就连套接字(socket)、网络通讯等资源也都是文件。

Linux系统中,文件具体可分为如下几种类型:html

1) 普通文件

相似 mp四、pdf、html 这样,可直接拿来使用的文件都属于普通文件,Linux 用户根据访问权限的不一样能够对这些文件进行查看、删除以及更改操做。mysql

2) 目录文件

对于用惯 Windows 系统的用户来讲,目录是文件可能不太好理解。

Linux 系统中,目录文件包含了此目录中各个文件的文件名以及指向这些文件的指针,打开目录等同于打开目录文件,只要你有权限,能够随意访问目录中的任何文件。linux

注意,目录文件的访问权限,同普通文件的执行权限,是一个意思。sql

3) 字符设备文件和块设备文件

这些文件一般隐藏在 /dev/ 目录下,当进行设备读取或外设交互时才会被使用。

例如,磁盘光驱属于块设备文件,串口设备则属于字符设备文件。数据库

Linux 系统中的全部设备,要么是块设备文件,要么是字符设备文件。编程

4) 套接字文件(socket)

套接字文件通常隐藏在 /var/run/ 目录下,用于进程间的网络通讯。缓存

5) 符号连接文件(symbolic link)

相似与 Windows 中的快捷方式,是指向另外一文件的简介指针(也就是软连接)。网络

6) 管道文件(pipe)

主要用于进程间通讯。例如,使用 mkfifo 命令建立一个 FIFO 文件,与此同时,启用进程 A 从 FIFO文件读数据,启用进程 B 从 FIFO文件中写数据,随写随读。socket

“一切皆文件”的利弊

和 Windows 系统不一样,Linux 系统没有 C 盘、D 盘、E 盘那么多的盘符,只有一个根目录(/),全部的文件(资源)都存储在以根目录(/)为树根的树形目录结构中。

这样作最明显的好处是,开发者仅须要使用一套 API 和开发工具便可调取 Linux 系统中绝大部分的资源。举个简单的例子,Linux 中几乎全部读(读文件,读系统状态,读 socket,读 PIPE)的操做均可以用 read 函数来进行;几乎全部更改(更改文件,更改系统参数,写 socket,写 PIPE)的操做均可以用 write 函数来进行。

不利之处在于,使用任何硬件设备都必须与根目录下某一目录执行挂载操做,不然没法使用。咱们知道,自己 Linux 具备一个以根目录为树根的文件目录结构,每一个设备也一样如此,它们是相互独立的。若是咱们想经过 Linux 上的根目录找到设备文件的目录结构,就必须将这两个文件系统目录合二为一,这就是挂载的真正含义。编程语言


Linux文件系统的层次结构

在 Linux 操做系统中,全部的文件和目录都被组织成以一个根节点“/”开始的倒置的树状结构,如图 1 所示。

                    Linux系统文件和目录组织示意图

                                              图1 Linux系统文件和目录组织示意图


其中,目录就至关于 Windows 中的文件夹,目录中存放的既能够是文件,也能够是其余的子目录,而文件中存储的是真正的信息。

文件系统的最顶层是由根目录开始的,系统使用“/”来表示根目录,在根目录之下的既能够是目录,也能够是文件,而每个目录中又能够包含(子)目录或文件。如此反复就能够构成一个庞大的文件系统。

其实,使用这种树状、具备层次的文件结构主要目的是方便文件系统的管理和维护,想象一下,若是全部的文件都放在一个目录下,其文件系统的管理和维护将变成一场噩梦。

现实中也有许多相似的例子,例如在整个行政管理体制中,村民就至关于文件,他们住在一个村庄中,村庄就是存储村民的目录。许多村又组成了个乡,这个乡就至关于存储村的目录,依此类推,最终就构建出了一个庞大的行政区域管理结构图。

注意,目录名或文件名都是区分大小写的,如 dog、DOG 和 Dog 为 3 个不一样的目录或文件。完整的目录或文件路径是由一连串的目录名所组成的,其中每个目录由“/”来分隔。如 cat 的完整路径是 /home/cat。

在文件系统中,有两个特殊的目录,一个是用户所在的工做目录,即当前目录,可用一个点“.”表示;另外一个是当前目录的上一层目录,也叫父目录,用两个点“..”表示。

若是一个目录或文件名是以一个点开始,就表示这个目录或文件是一个隐藏目录或文件。即以默认方式査找(后续会讲查找命令)时,不显示该目录或文件。

为了方便管理和维护,Linux 系统采用了文件系统层次标准,也称为 FHS 标准,它规定了根目录下各个目录应该存在哪些类型的文件(或子目录),好比说,在 /bin 和 /sbin 目录中存放的应该是可执行文件。


因为 Linux 系统免费开源,使得 Linux 发行版本有不少,利用 Linux 开发产品的团队也有不少,若是任由每一个人都按照本身的想法来配置 Linux 系统文件目录,后期可能会产生诸多的管理问题。试想,若是你进入一家公司,所用 Linux 系统的文件目录结构与所学的彻底不一样,实在使人头疼。

为了不诸多使用者对 Linux 系统目录结构天马行空,Linux 基金会发布了 FHS 标准。多数 Linux 发行版系统都遵循这一标准。

FHS(Filesystem Hierarchy Standard)文件系统层次化标准,该标准规定了 Linux 系统中全部一级目录以及部分二级目录(/usr 和 /var)的用途。发布此标准的主要目的就是为了让用户清楚地了解每一个目录应该存放什么类型的文件。


Linux 根目录(/)

FHS 认为,Linux 系统的根目录(/)最为重要(没有之一),其缘由有如下 2 点:

  1. 全部目录都是由根目录衍生出来的;

  2. 根目录与系统的开机、修复、还原密切相关;


所以,根目录必须包含开机软件、核心文件、开机所需程序、函数库、修复系统程序等文件,如表 1 所示。

表 1 Linux一级目录及其做用
一级目录 功能(做用)
/bin/ 存放系统命令,普通用户和 root 均可以执行。放在 /bin 下的命令在单用户模式下也能够执行
/boot/ 系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等
/dev/ 设备文件保存位置
/etc/ 配置文件保存位置。系统内全部采用默认安装方式(rpm 安装)的服务配置文件所有保存在此目录中,如用户信息、服务的启动脚本、经常使用服务的配置文件等
/home/ 普通用户的主目录(也称为家目录)。在建立用户时,每一个用户要有一个默认登陆和保存本身数据的位置,就是用户的主目录,全部普通用户的主目录是在 /home/ 下创建一个和用户名相同的目录。如用户 liming 的主目录就是 /home/liming
/lib/ 系统调用的函数库保存位置
/media/ 挂载目录。系统建议用来挂载媒体设备,如软盘和光盘
/mnt/ 挂载目录。早期 Linux 中只有这一个挂载目录,并无细分。系统建议这个目录用来挂载额外的设备,如 U 盘、移动硬盘和其余操做系统的分区
/misc/ 挂载目录。系统建议用来挂载 NFS 服务的共享目录。虽然系统准备了三个默认挂载目录 /media/、/mnt/、/misc/,可是到底在哪一个目录中挂载什么设备能够由管理员本身决定。例如,笔者在接触 Linux 的时候,默认挂载目录只有 /mnt/,因此养成了在 /mnt/ 下创建不一样目录挂载不一样设备的习惯,如 /mnt/cdrom/ 挂载光盘、/mnt/usb/ 挂载 U 盘,都是能够的
/opt/ 第三方安装的软件保存位置。这个目录是放置和安装其余软件的位置,手工安装的源码包软件均可以安装到这个目录中。不过笔者仍是习惯把软件放到 /usr/local/ 目录中,也就是说,/usr/local/ 目录也能够用来安装软件
/root/ root 的主目录。普通用户主目录在 /home/ 下,root 主目录直接在“/”下
/sbin/ 保存与系统环境设置相关的命令,只有 root 可使用这些命令进行系统环境设置,但也有些命令能够容许普通用户查看
/srv/ 服务数据目录。一些系统服务启动以后,能够在这个目录中保存所须要的数据
/tmp/ 临时目录。系统存放临时文件的目录,在该目录下,全部用户均可以访问和写入。建议此目录中不能保存重要数据,最好每次开机都把该目录清空

FHS 针对根目录中包含的子目录仅限于表 1,但除此以外,Linux 系统根目录下一般还包含表 2 中的几个一级目录。


表 2 其余一级目录及功能
一级目录 功能(做用)
/lost+found/ 当系统意外崩溃或意外关机时,产生的一些文件碎片会存放在这里。在系统启动的过程当中,fsck 工具会检查这里,并修复已经损坏的文件系统。这个目录只在每一个分区中出现,例如,/lost+found 就是根分区的备份恢复目录,/boot/lost+found 就是 /boot 分区的备份恢复目录
/proc/ 虚拟文件系统。该目录中的数据并不保存在硬盘上,而是保存到内存中。主要保存系统的内核、进程、外部设备状态和网络状态等。如 /proc/cpuinfo 是保存 CPU 信息的,/proc/devices 是保存设备驱动的列表的,/proc/filesystems 是保存文件系统列表的,/proc/net 是保存网络协议信息的......
/sys/ 虚拟文件系统。和 /proc/ 目录类似,该目录中的数据都保存在内存中,主要保存与内核相关的信息

Linux /usr目录

usr(注意不是 user),全称为 Unix Software Resource,此目录用于存储系统软件资源。FHS 建议全部开发者,应把软件产品的数据合理的放置在 /usr 目录下的各子目录中,而不是为他们的产品建立单独的目录。

Linux 系统中,全部系统默认的软件都存储在 /usr 目录下,/usr 目录相似 Windows 系统中 C:\Windows\ + C:\Program files\ 两个目录的综合体。

FHS 建议,/usr 目录应具有表 3 所示的子目录。

表 3 /usr 子目录及其功能
子目录 功能(做用)
/usr/bin/ 存放系统命令,普通用户和超级用户均可以执行。这些命令和系统启动无关,在单用户模式下不能执行
/usr/sbin/  存放根文件系统没必要要的系统管理命令,如多数服务程序,只有 root 可使用。
/usr/lib/ 应用程序调用的函数库保存位置
/usr/XllR6/ 图形界面系统保存位置
/usr/local/ 手工安装的软件保存位置。咱们通常建议源码包软件安装在这个位置
/usr/share/ 应用程序的资源文件保存位置,如帮助文档、说明文档和字体目录
/usr/src/ 源码包保存位置。咱们手工下载的源码包和内核源码包均可以保存到这里。不过笔者更习惯把手工下载的源码包保存到 /usr/local/src/ 目录中,把内核源码保存到 /usr/src/linux/ 目录中
/usr/include C/C++ 等编程语言头文件的放置目录

Linux /var 目录

/var 目录用于存储动态数据,例如缓存、日志文件、软件运行过程当中产生的文件等。一般,此目录下建议包含如表 4 所示的这些子目录。

表 4 /var子目录及其功能
/var子目录 功能(做用)
/var/lib/ 程序运行中须要调用或改变的数据保存位置。如 MySQL 的数据库保存在 /var/lib/mysql/ 目录中
/var/log/ 登录文件放置的目录,其中所包含比较重要的文件如 /var/log/messages, /var/log/wtmp 等。
/var/run/ 一些服务和程序运行后,它们的 PID(进程 ID)保存位置
/var/spool/ 里面主要都是一些临时存放,随时会被用户所调用的数据,例如 /var/spool/mail/ 存放新收到的邮件,/var/spool/cron/ 存放系统定时任务。
/var/www/ RPM 包安装的 Apache 的网页主目录
/var/nis和/var/yp NIS 服务机制所使用的目录,nis 主要记录全部网络中每个 client 的链接信息;yp 是 linux 的 nis 服务的日志文件存放的目录
/var/tmp 一些应用程序在安装或执行时,须要在重启后使用的某些文件,此目录能将该类文件暂时存放起来,完成后再行删除


根据以上各表列举的各目录及做用,若是咱们要作一些实验和练习,须要建立一些临时文件,应该保存在哪里呢?

答案是用户的主目录或 /tmp/ 临时目录。可是要当心有些目录中不能直接修改和保存数据,好比 /proc/fn/sys/ 目录,由于它们是保存在内存中的,若是在这里写入数据,那么你的内存会愈来愈小,直至死机;/boot/ 目录也不能保存额外数据,由于 /boot/ 目录会单独分区做为启动分区,若是没有空闲空间,则会致使系统不能正常启动。

总之,Linux 要在合理的目录下进行操做和修改。

相关文章
相关标签/搜索