Filesystem Hierarchy Standard (文件系统层次标准,FHS)标准依据文件系统使用的频繁与否与是否允讲使用者随意更动, 而将目录定义成四种交互作用的形态,具体如下:
可分享的:可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;
不可分享的:自己机器上面运作的装置档案或者是与程序有关的 socket 档案等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。
不变的:有些数据是不会经常变动的,跟随着 distribution 而不变动。 例如函式库、文件说明文件、系统管理员所管理的主机服务配置文件等等;
可变动的:经常改变的数据,例如登录文件、一般用户可自行收受的新闻组等。
事实上,FHS针对目录树架构仅定义出三层目录下应该放置哪些数据,分别是下面三个目录:
- /(根目录):与开机系统有关;
- /usr(unix software resource):与软件安装执行有关;
- /var(variable):与系统运作过程有关。
一、/(根目录)
根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。由于系统开机时需要特定的开机软件、核心档案、开机所需程序、函式库等等档案数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。因为根目录是如此重要,所以在FHS的要求方面,希望根目录不要放在非常大的分割槽中,因为越大的分割槽会放入越多的数据,如此一来根目录所在分割槽就可能会有较多发生错误的机会。
因此通常情况下,根目录所在分割槽应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分割槽中,保持根目录越小越好。如此不但性能较佳,同时根目录所在的文件系统也较不容易放生错误。
FHS所定义的根目录下应该要有的次目录的介绍如下:
1./bin
目录又称为二进制目录,包含了那些供系统管理员和普通用户使用的重要linux命令的二进制映像。该目录存放的内容包括各种可执行文件,还有某些可执行文件的符号连接。常用的命令有:cp、dmesg、kill、login、rm、ping、chomd、bash、cat、echo、ls、 mail、vi等。
2./boot
目录存放系统核心文件以及启动时必须读取的文件,包括Linux内核的二进制映像。
3./dev
目录保存着外部设备代码的文件,这些文件比较特殊,实际上它们都指向所代表的外围设备,如终端、磁盘驱动器、光驱、打印机等。你可以访问这些外部设备,与访问一个文件或一个目录没有区别。
/dev/cdrom 光驱目录/dev/console 控制台/dev/fd 软驱/dev/hd 硬盘上的一个分区/dev/lp0 打印机/dev/ttyS0 系统的串口设备/dev/dsp 系统的音箱设备
4./etc
此目录是整个Linux系统的中心,其中包含所有系统管理和维护方面的配置文件,如dhcpd.conf、host.conf、logrotate.conf、man.config、mke2fs.conf、modprobe.conf、resolv.conf、sysctl.conf、syslog.conf(或rsyslog.conf)、xinetd.conf和yum.conf等,其他的配置文件分别位于单独的子目录中。通常应注意备份这个目录中的重要配置文件,以便需要时能够快速的恢复系统。除此之外用于存放系统的配置文件和特定主机的相关文件。例如,记录用户帐号名称的 password 文件、投影密码的 shadow 文件等。该目录不包含任何二进制文件,并且该目录下的所有文件主要由管理员使用,普通用户只对其具有阅读权限。该目录还包含一些网络配置文件、文件系统、 x系统配置文件、设备配置信息、设置用户信息等。
/etc/dhcpd.conf DHCP服务配置文件/etc/host.conf 解析器查询顺序配置文件,区别于/etc/hosts(存放IP与域名对应关系的文本文件)/etc/logrotate.conf logrotate(日志文件管理工具)的配置文件/etc/man.config/etc/mke2fs.conf mke2fs(磁盘格式化)指令配置文件/etc/modprobe.conf modprobe(自动处理可载入模块)命令配置文件/etc/resolv.conf DNS域名解析配置文件/etc/sysctl.conf 一些系统信息的配置文件,对应/proc/sys/这个目录的子目录及文件/etc/syslog.conf(或rsyslog.conf) syslogd进程的配置文件/etc/xinetd.conf xinetd(用来管理多个小型的网络服务)服务的配置文件/etc/yum.conf yum的配置文件
/etc/cron.d 用于存储cron进程调度运行后台进程所用的配置和控制文件。其他目录包括/etc/crontab文件定义的cron.hourly、cron.daily、cron.weekly和cron.monthly等四个目录。/etc/cups 用于存储通用UNIX打印系统(Commom UNIX Printing System,CUPS)使用的各种配置文件。/etc/default 其中的文件用于提供部分工具软件(如useradd程序)使用的变量及其默认值。/etc/httpd Apache配置文件的根目录。Apache是一个通用的、高性能的HTTP服务器,也是世界上最流行的Web服务器。Apache采用模块化的设计方式,支持运行时的动态模块选择、虚拟主机,以及服务进程数量的动态调整等。/etc/init.d 用于存储进入相应运行级时需要由init调度执行的脚本文件。在FedoraLinux系统中,这只是一个符号链接文件,实际的目录应为/etc/rc.d/init.d。/etc/ipsec.d 用于存储IPSee使用的配置文件等。/etc/kde 其中含有部分KDE初始化文件和KDM配置文件。/etc/pki 用于存储各种密匙,如用于安装软件包的密匙等。/etc/ppp 用于存储PPP的脚本和配置文件。/etc/profile.d 用于存储/etc/profile等使用的辅助初始化文件,如lang.sh脚本文件等。/etc/rc.d 用于存储进入相应运行级是由init进程调度执行的脚本文件。其中含有init.d和rcN.d等子目录(其中的N为0、1、2、3、4、5和6,表示系统的运行级)。/etc/samba Samba配置文件的根目录。Samba是一个网络共享软件的总称,Linux系统中实现的SMB协议,允许Linux系统为Windows系统提供文件和打印共享服务。/etc/security 用户存储的基本安全控制文件,包括注册控制文件、控制访问控制文件,以及资源限制控制文件等。/etc/selinux SElinux(Security Enhanced Linux,由美国国家安全部(National Security Agency)领导开发的GPL项目,它拥有一个灵活而强制性的访问控制结构,旨在提高Linux系统的安全性,提供强健的安全保证,可防御未知攻击,据称相当于B1级的军事安全性能。比MSNT所谓的C2等高得多。应用SELinux后,可以减轻恶意攻击或恶意软件带来的灾难,并提供对机密性和完整性有很高要求的信息很高的安全保障。)配置文件的根目录。/etc/skel 其中存有默认的初始化文件,如.bash_logout、.bash_profile、.bashrc、.emacs、.kde和.zshrc等。每当新增一个新用户时,系统将会把其中的部分初始化文件复制到用户的主目录中。注意:上述文件均为隐藏文件。(即以“.“开头的文件名)/etc/ssh 这个目录含有系统配置过程,以及系统引导过程中需要用到的各种配置文件,也是chkconfig维护的各种后台服务进程配置文件的根目录。例如,其中的clock文件包含系统的时区设置,keyboard文件包含键盘的类型定义,init文件包含系统引导过程使用的参数定义等。/etc/tomcat5 tomcat的根目录/etc/vsftpd 包含FTP服务器的配置文件,其中包括vsftpd.conf、ftpusers和user_list等重要文件。/etc/xinetd.d 其中包含xinetd服务进程控制的所有传统网络服务使用的配置文件,尤其包含telnet等网络应用的配置文件。在Linux系统中,原有的inetd已由功能更强的xinetd服务进程取代,原有的inetd.conf配置文件也由xinetd.d目录中的一系列单独的配置文件取代。/etc/yum 其中包含yum软件更新工具使用的配置文件。/etc/yum.repos.d 其中包含每个软件仓库的配置文件。
5./lib
目录下存放必要的运行库,主要是编程语言的库。典型的 Linux 操作系统中包含了C、C++和 Fortran 的库文件。用这些语言开发的应用程序可以使用这些编程语言库文件。这使软件开发者能够利用那些预先写好并通过测试的函数。库文件包含了标准的C库/lib/libc.so.*,数学库libm.so.*,共享的动态链接库/lib/ld/so以及目录/bin和/sbin下用到的其他共享库。/lib/modules目录存放系统的核心模块,某些可被模块化的部分并不需要在编译系统核心时放入核心本体,避免本体过于庞大而导致效率降低。
/lib/modules 放置核心相关的模块(驱动程序)/lib/crda/pubkey 放置了一些公钥密码/lib/systemd 存放了一些系统脚本,例如shutdown、sleep/lib/console 放置了一些驱动安装程序(sh文件),例如keyboard-setup.sh/lib/live/config 里面有0031-root-password ,使用cat可以看到root的密码
6./lost+found
该目录存放所有和其它目录都没有关联的文件。系统出现错误或发生问题时,Fedora会自动扫描磁盘驱动器,修正错误,如果找到遗失或错误的片段,将这些片段转化成文件存放于此,等待管理员的进一步处理。
7.
/mnt
该目录是默认的文件系统临时装载点,这是一个通用的安装点,可以临时安装任何文件系统或远程资源。系统管理员执行 mount
命令完成装载工作。在系统中,该目录包含了光驱、磁盘和软驱的挂载点。
命令完成装载工作。在系统中,该目录包含了光驱、磁盘和软驱的挂载点。
8./home
系统默认的用户家目录,当增加一个一般使用者管理账户时,默认的用户家目录都会规范到这里。
/home/~ 代表目前这个使用者的家目录
/home/~dmtsai 代表 dmtsai 的家目录
9./root
系统管理员(root)的家目录
10./media
可移除装置(如软盘、光盘、DVD等)的挂载点
11./opt
目录用来安装附加软件包,用户调用软件包程序放在目录/opt/package_name/bin下,package_name是安装软件包的名称。
12./sbin
目录/sbin、/usr/sbin和/usr/local/sbin存放了该目录启动系统时需执行的程序,如管理工具、应用软件和通用的根用户权限命令等内容。如包含getty、init、update。
13./srv
网络服务启动所需的数据存放的目录。
14./tmp
一般用户或是正在执行的程序暂时存放档案/文件的目录,不可存放重要数据。
15./sys
内核和系统信息虚拟文件系统。存放的是关于设备、驱动程序和一些内核特性的信息。它的底层结构由当前使用的Linux内核决定,在其他方面没有明确规定。
/sys/devices 该目录下是全局设备结构体系,包含所有被发现的注册在各种总线上的各种物理设备。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外,即platform devices和system devices。platform devices一般是挂在芯片内部的告诉或者低速总线上的各种控制器和外设,他们能被CPU直接寻址;system devices不是外设,而是芯片内部的核心结构,比如CPU,timer等,他们一般没有相关的驱动,但是会有一些体系结构相关的代码来配置他们。(sys/devices是内核对系统中所有设备的分层次表示模型,也是/sys文件系统管理设备的最重要目录结构)。/sys/dev 该目录下维护一个按照字符设备和块设备的主次号码(major:minor)链接到真是设备(/sys/devices)的符号链接文件。/sys/class 该目录下包含所有注册在kernel里面的设备类型,这是按照设备功能分类的设备模型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下都是那个设备类型的各种具体设备的符号链接,这些链接指向/sys/devices/name下的具体设备。设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型;一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。(/sys/class也是构成linux统一设备模型的一部分)/sys/block 该目录下的所有子目录代表着系统中当前被发现的所有块设备。按照功能来说放置在/sys/class下会更合适,但由于历史遗留因素而一直存在于/sys/block,但从linux2.6.22内核开始这部分就已经标记为过去时,只有打开了CONFIG_SYSFS_DEPRECATED配置编译才会有这个目录存在,并且其中的内容在从linux2.6.26版本开始已经正式移到了/sys/class/block,旧的接口/sys/block为了向后兼容而保留存在,但其中的内容已经变为了指向它们在/sys/devices/中真实设备的符号链接文件。/sys/bus 该目录下的每个子目录都是kernel支持并且已经注册了的总线类型。这是内核设备按照总线类型分层放置的目录结构,/sys/devices中的所有设备都是连接于某种总线之下的,bus子目录下的每种具体总线之下可以找到每个具体设备的符号链接,一般来说每个子目录(总线类型)下包含两个子目录,一个是devices,另一个是drivers;其中devices下是这个总线类型下的所有设备,这些设备都是符号链接,它们分别指向真正的设备(/sys/devices/name/下);而drivers下是所有注册在这个总线上的驱动,每个driver子目录下 是一些可以观察和修改的driver参数。(它也是构成linux统一设备模型的一部分)/sys/fs 按照设计,该目录使用来描述系统中所有的文件系统,包括文件系统本身和按照文件系统分类存放的已挂载点。/sys/kernel 存放内核中所有可调整的参数/sys/fireware 该目录下包含对固件对象(firmware object)和属性进行操作和观察的接口,即这里是系统加载固件机制的对用户空间的接口.(关于固件有专用于固件加载的一套API)/sys/hypervisor 该目录是与虚拟化Xen相关的装置。(Xen是一个开放源代码的虚拟机监视器)/sys/module 该目录下有系统中所有的模块信息,不论这些模块是以内联(inlined)方式编译到内核映像文件中还是编译为外模块(.ko文件),都可能出现在/sys/module中。即module目录下包含了所有的被载入kernel的模块。/sys/power 该目录是系统中的电源选项,对正在使用的power子系统的描述。这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机/重启等等
16./proc
进程文件系统proc的根目录,其中的部分文件分别对应正在运行的进程,可用于访问当前进程的地址空间。它是一个非常特殊的虚拟文件系统,其中并不包含“实际的”文件,而是可用以引用当前运行系统的系统信息,如CPU、内存、运行时间、软件配置以及硬件配置的信息,这些信息是在内存中由系统自己产生的。
/proc/net 其中的文件分别表示各种网络协议(如TCP、UDP以及ARP等)的状态与统计信息。/proc/sys 这个目录不仅存有各种系统信息,而且也包含系统内核与TCP/IP网络的可调参数。其中的kernel子目录含有共享内存和消息队列的可调参数,net子目录中含有TCP/IP的各种可调参数。例如,shmmax文件中含有系统的最大共享内存定义,如果使用“echo somevalue > /proc/sys/kernel/shmmax”命令,可以直接修改运行系统的内核参数,而无需重新引导系统。这一做法要谨慎,有的文件可能包含多个数值,或不同类型的数值,因此,在修改以前一定要弄清参数的意义和实际的数值。为了在每次启动系统时都能使用定制的系统可调参数,可以设置sysctl.conf配置文件,或编写自己的Shell启动脚本。
在Linux中,因为根目录与开机有关,开机过程中仅有根目录会被挂载,其他分割槽则是在开机完成之后才会持续的进行挂载行为。因此,根目录下与开机过程有关的目录就不能够与根目录放到不同的分割槽中。下面这五个目录则是与开机密不可分而不能与根目录分开的目录。
/etc:配置文件/bin:重要执行档。与一般用户及单人模式下操作有关的指令。/dev:装置和接口配置相关的档案/lib:执行档所需要的函式库与核心所需的模块/sbin:与系统管理员操作有关的指令
二、/usr
根据FHS的定义,/usr里面放置的数据属于可分享的但不可变动的数据。类似于Windows系统的C:\Windows与C:\Program Files这两个目录的综合体。建议所有软件开发者将他们的数据合理的分别放置在这个目录下的次目录中,而不是自行建立该软件自己独立的目录。
1./usr/X11R6
为X Window System重要数据所放置的目录。
2./usr/bin
存放应用程序。与/bin的区别在于是否与开机过程有关。
3./usr/include
存放Linux下开发和编译应用程序需要的头文件。
4./usr/lib
包含各应用程序的函式库、目标档案(object file),以及不被一般使用者惯用的执行档或脚本(script)。某些软件会提供一些特殊指令来进行服务器的设定,这些指令也不会经常被系统管理员操作,那就会被摆放到这个目录下。如果系统为X84_64的Linux系统,就有/usr/lib64目录产生。
5./usr/local
系统管理员在本机自行安装自己下载的软件的地方。
6./usr/sbin
非系统正常运作所需要的系统指令,最常见的为某些网络服务器软件的服务指令(deamon)。
7./usr/share
放置共享文件的地方,此目录下放置的数据几乎是不分硬件架构均可读取的数据。常见此目录如下:
/usr/share/man 系统帮助文件/usr/share/dooc 软件杂项的文件说明/usr/share/zoneinfo 与时区有关的失去档案
8./usr/src
Linux开放的源代码存放目录。核心源代码建议放置到/usr/src/linux/目录下。
三、/var
/var目录主要针对常态性变动的档案,包括快取(cache)、登陆档(log file)、以及某些软件运作所产生的档案,包括程序档案(lock file,run file),或者例如MYSQL数据库的档案等等。简单来说即存放很多不断变化的文件,例如日志文件等。常见的次目录有:
1./var/cache
应用程序本身运作过程中产生的一些暂存档。
2./var/lib
程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。例如,Mysql的数据库放置到/var/lib/mysql/而rpm的数据库放到/var/lib/rpm。
3./var/lock
某些装置或者是档案资源一次只能被一个应用程序所使用,如果同时有两个程序使用该装置时,就可能产生一些错误的状况,因此就要将该装置上锁(lock),以确保该装置只会给单一软件所使用。
4./var/log
登陆文件放置目录。
5./var/mail
放置个人电子邮箱的目录,此目录也被放置到/var/spool/mail/目录下,通常这两个目录互为链接文件。
6./var/run
某些程序或者是服务启动后,会将其PID放置到此目录下。
7./var/spool
放置一些队列数据,所谓队列就是排队等待其他程序使用的数据。这些数据被使用后通常会被删除。
综上即为FHS标准,接下来,我们将整个目录树以图标的方法来显示,并且将较为重要的档案数据列出来。
![](https://i-blog.csdnimg.cn/blog_migrate/bf5a46c2d8d79167a9c721b09803f3f9.png)