文章整理自参考书《鸟哥的LINUX私房菜基础学习篇(第四版)》以及网上资料,详细阅读请参阅原著,本文仅作学习交流以及知识树立使用,侵删
¶Linux的部分目录结构
多数Linux版本采用文件系统层次化标准(Filesystem Hierarchy Standard, FHS)。其主要目的是希望用户可以了解到已安装软件通常放置于哪个目录下。FHS希望独立的软件开发商、操作系统制作者以及想要维护系统的用户,都能够遵循FHS的标准。这样,Linux操作系统就能够在既有的目录架构下发展出开发者想要的独特风格。
FHS依据文件系统使用频繁与否与是否允许用户随意修改,而将目录定义成为四种交互作用的形态,用表格来说有点像下面这样:
| 可分享(shareable) | 不可分享(unshareable) | |
|---|---|---|
| 不变(static) | /usr(软件存放处) | /etc(配置文件) |
| /opt(第三方辅助软件) | /boot(启动与内核文件) | |
| 可变动(variable) | /var/mail(用户邮箱) | /var/run(程序相关) |
| /var/spool/news(新闻组) | /var/lock(程序相关) |
表中目录是一些代表性目录,其中四个类型:
- 可分享: 可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录
- 不可分享:自己机器上面运行的设备文件或是与程序有关的socket文件等,由于仅与自身机器有关,所以当然就不适合分享给其他主机
- 不变:有些数据是不会经常发生变动的,跟随着发行版而不变动。例如函数库、文件说明、系统管理员所管理的主机服务配置文件等
- 可变动:经常修改的数据,例如日志文件、一般用户可自行接收的新闻组等
事实上,FHS针对目录树架构仅定义出三层目录下面应该放置什么数据:
- /(root,根目录):与启动系统有关
- /usr(unix software resource):与软件安装/执行有关
- /var(variable):与系统运行过程有关
¶根目录(/)的意义与内容
根目录是整个系统最重要的目录,所有的目录都是由根目录衍生出来,同时根目录也与启动、还原、系统修复等操作有关。由于系统启动时需要特定的启动软件、内核文件、启动所需程序、函数库等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。
因为根目录这么重要,因此FHS希望根目录不要放在非常大的分区内,因为越大的分区你会放入越多的数据,如此以来根目录所在分区就可能会有较多发生错误的机会。
因此FHS标准建议:根目录(/)下面应该要有下面这些子目录存在才好,即使没有物理目录,FHS也希望至少有链接(link)目录存在才好。
| 目录 | 应放置文件内容 |
|---|---|
| 第一部分:FHS要求必须要存在的目录 | |
| /bin | 系统有很多存放可执行文件的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被使用的命令。在。/bin下面的命令可以被root与一般帐号所使用 |
| /boot | 这个目录主要在放置启动会使用道德文件,包括Linux内核文件以及启动选项与启动所需配置文件等。Linux内核常用的文件名为:vmlinuz,如果使用的事grub2这个启动引导程序,则还会存在/boot/grub2这个目录 |
| /dev | 在linux系统上,任何设备与接口设备都是以文件的形式存在于这个目录当中。你只要通过读写这个目录下面的某个文件,就等于读写某个设备,比较重要的文件有/dev/null、/dev/zero、/dev/tty、/dev/loop*、/dev/sd*等 |
| /etc |
系统主要的配置文件几乎都放置在这个目录内,例如人员的帐号密码文件、各种服务的启动文件等。一般来说,这个目录下的各文件属性是可以让一般用户查看的,但是只有root有权利修改。FHS建议不要放置可执行文件(binary)在这个目录中。比较重要的文件有:/etc/modprobe.d、/etc/passwd、/etc/fstab、/etc/issue等。另外FHS还规范几个重要的目录最好要在/etc/目录下:
/etc/opt(必要):这个目录在放置第三方辅助软件/opt的相关配置文件 /etc/X11(建议):与X Window有关的各种配置文件都在这里,尤其是xorg.conf这个X Server的配置文件 /etc/sgml(建议):与SGML格式有关的各项配置文件 /etc/xml(建议):与xml格式有关的各项配置文件 |
| /lib |
系统的函数库非常多,而/lib放置的则是在启动时会用到的函数哭,以及在/bin或/sbin下面的命令会调用的函数库而已。什么是函数库?你可以将它想像成是外挂,某些命令必须要有这些外挂才能够顺利完成程序执行,另外FSH还要求下面的目录必须要存在:
/lib/modules:这个目录主要放置可抽换式的内核相关模块(驱动程序) |
| /media | media是媒体的英文,顾名思义,这个/media下面放置的就是可删除的设备,包括软盘、光盘、DVD等设备都暂时挂载于此。 |
| /mnt | 如果你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。在早些时候,这个目录的用途与/media相同。知识有了/media之后,这个目录就暂时用来挂载。 |
| /opt | 这个是给第三方辅助软件放置的目录。什么是第三方辅助软件?举例来说,KDE这个桌面管理系统是一个独立的软件,不过它可以安装到Linux系统中,因此KDE的软件就建议放置到此目录下。另外如果你想要自行安装额外的软件(非原本的发行版提供),那么也能够将你的软件安装到这里来。不过,以前的Linux系统中,我们还是习惯放置在/usr/local下。 |
| /run | 早期的FHS规定系统启动后所产生的各项信息应该要放置到/var/run下,新版的FHS规范到/run下面,由于/run可以使用内存来模拟,因此性能上会好很多 |
| /sbin | Linux有非常多命令是用来设置系统环境的,这些命令只有root才能够用来设置系统,其他用户最多只能用来查询而已。放在/sbin下面的为启动过程中所需要的,里面包括了启动、修复、还原系统所需要的命令。至于某些服务器软件程序,一般则放置到/usr/sbin/当中。至于本机自行安装的软件所产生的系统执行文件(system library),则放置到/usr/local/sbin当中了。常见的命令包括fdisk、fsck、ifconfig、mkfs等 |
| /srv | srv可以视为service的缩写,是一些网络服务启动之后,这些服务所需要的数据目录,常见的服务例如WWW,FTP等。举例来说,WWW服务器需要的网页数据就可以放置在/srv/www/里面。不过,系统的服务数据如果尚未要提供给因特网任何人浏览的话,默认还是建议放在/var/lib下 |
| /tmp | 这是让一般用户或是正在执行的程序提供暂时放置文件的地方。这个目录是任何人都能够存取的,所以你需要定期地清理一下。当然,重要数据不可放置在此目录。因为FHS甚至建议在启动时,应该要奖/tmp下的数据都删除 |
| /usr | 第二层FHS设置 |
| /var | 第二层FHS设置,主要放置可变动性数据 |
| 第二部分:FHS建议可以存在的目录 | |
| /home |
这是系统默认的用户家目录(home directory)。在你新增一个一般用户帐号时,默认的用户家目录都会规范到这里来,比较重要的是家目录有两种代号:
~:代表目前这个用户的家目录 ~dmtsai:代表dmtsai的家目录 |
| /lib |
用来存放与/lib不同格式的二进制函数库,例如支持64位的/lib64函数库等。 |
| /root | 系统管理员(root)的家目录,之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个 |
事实上FHS针对根目录所定义的标准仅有上面的东西,不过我们的Linux下面还有许多目录,下面是几个在Linux中也非常重要的目录:
| 目录 | 应放置文件内容 |
|---|---|
| /lost+found | 这个目录是使用标准ext2、ext3、ext4文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时,奖一些遗失的片段放置到这个目录下,不过如果使用的是xfs文件系统的化,就不会存在这个目录 |
| /proc | 这个目录是一个虚拟文件系统(virtual filesystem),它放置的数据都是在内存当中,例如系统内核、进程信息(process)、外接设备的状态及网络状态等等。因为这个目录下的数据是在内存当中,所以本身不占任何硬盘空间。比较重要的文件例如:/proc/cpuinfo、/proc/dma、/proc/interrupts、/proc/ioports、/proc/net/*等 |
| /sys | 这个目录与/proc非常相似,也十一个虚拟的文件系统,主要也是记录内核与系统硬件信息相关的内容。包括目前已加载的内核模块与内核检测道德硬件设备信息等,这个目录同样不占硬盘容量。 |
早期linux在设计时,若发生问题,恢复模式通常仅挂载根目录而已,因此有五个重要的目录要求一定要与根目录放在一起:/etc、/bin、/dev、/lib、/sbin。现在许多Linux发行版由于已经将许多非必要文件移出/usr之外,所以/usr也是越来越精简,因为/usr被建议为“即使挂载成为只读,系统还是可以正常运行”的模样,所以恢复模式也能同时挂载/usr。
¶/usr意义与内容
根据FHS的基本定义,/usr里面放置的数据属于可分享与不可变动(shareable,static),如果你知道如何通过网络进行分区的挂载(例如在这本书后面的服务器篇会降到NFS服务器),那么/usr确实可以分享给局域网络内其他主机来使用。
很多读者都会误以为/usr为user的缩写,其实usr是UNIX Software Resource的缩写,也就是UNIX操作系统软件资源所放置的目录,而不是用户的数据。FHS建议所有软件开发者,应该将他们的数据合理地分别放置到这个目录下的子目录,而不要自行建立该软件自己独立的目录。
因为是所有系统默认的软件(发行版发布者提供的软件)都会放置到/usr下面,因此这个目录有点类似Windows系统“C:\Windows\(当中的一部分)+C:\Program Files\”这两个目录的综合体,系统刚安装完时,这个目录会占用做多的硬盘容量。一般来说,/usr的子目录建议有下面这些:
| 目录 | 应放置文件内容 |
|---|---|
| 第一部分:FHS要求必须要存在的目录 | |
| /usr/bin/ | 所有一般用户能够使用的命令都放在这里。目前新的CentOS7已经将全部的用户命令放置于此,而使用链接文件的方式将/bin链接至此。也就是说,/usr/bin与/bin是一模一样的。另外,FHS要求在此目录下不应该有子目录 |
| /usr/lib | 基本上,与/lib功能相同,所以/lib就是链接到此目录中的 |
| /usr/local | 系统管理员在本机安装自己下载的软件(非发行版默认提供者),建议安装到此目录,这样会比较便于管理。举例来说,你的发行版提供的软件较旧,你想安装较新的软件但又不想删除旧版,此时你可以将新版软件安装于/usr/local目录下,可与原来的旧版软件有所分别。你可以自行到/usr/local去看看,该目录下也是具有bin、etc、include、lib...的子目录 |
| /usr/sbin | 非系统正常运行所需要的系统命令,最常见的就是某些网络服务器软件的服务命令(daemon)。不过基本功能与/sbin差不多,因此目前/sbin就是链接到此目录中的 |
| /usr/share |
主要放置只读的数据文件,当然也包括共享文件,在这个目录下放置的数据几乎是不分硬件架构均可读取的数据,因为几乎都是文本文件。在此目录下常见的还有这些子目录:
/usr/share/man:在线帮助文件 /usr/share/doc:软件的说明文档 /usr/share/zoneinfo:与时区有关的时区文件 |
| 第二部分:FHS建议可以存在的目录 | |
| /usr/games/ | 与游戏比较相关的数据存放处 |
| /usr/include/ | c/c++等程序语言的头文件(header)与包含文件(include)放置出,当我们以Tarball方式(*.tar.gz的方式安装软件)安装某些程序时,会使用里面的许多文件 |
| /usr/libexec/ | 某些不被一般用户常用的执行文件或脚本(script)等,都会放置在此目录中。例如大部分的X窗口下面的操作命令,很多都是放在此目录下 |
| /usr/lib |
与/lib |
| /usr/src | 一般源代码建议放置到这里,src有source的意思。至于内核源代码则建议放置到/usr/src/Linux/目录下 |
¶/var意义与内容
如果说/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运行后才会渐渐占用硬盘容量功能的目录。因为/var目录主要针对经常性变动的文件,包括缓存(cache)、日志文件(log file)以及某些软件运行所产生的文件,包括程序文件(lock file、run file),或例如MySQL数据库的文件等。常见的子目录有:
| 目录 | 应放置文件内容 |
|---|---|
| 第一部分:FHS要求必须要存在的目录 | |
| /var/cache/ | 应用程序本身运行过程中会产生一些缓存 |
| /var/lib/ | 程序本身执行的过程中,需要使用道德数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。举例来说,MySQL的数据库放置到/var/lib/musql/而rpm的数据库则放到/var/lib/rpm中。 |
| /var/lock | 某些设备或是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该设备时,就可能产生一些错误的状况,因此就得要将设备上锁(lock),以确保该设备只会给单一软件所使用。举例来说,刻录机正在刻录一张光盘,你想一下会不会有两个人同时在使用一个刻录机刻盘?如果两个人同时刻录,那光盘写入的时谁的数据?所以当第一个人在刻录时,刻录机就会被上锁,第二个人就得要该设备被接触锁定才能够继续使用,目前此目录也已经挪到/run/lock中 |
| /var/log | 重要到不行。这是日志文件放置的目录,里面比较重要的文件有/var/log/messages、/var/log/wtmp(记录登录信息)等 |
| /var/mail | 放置个人电子邮箱的目录,不过这个目录也被放置到/var/spool/mail/目录中,通常这两个目录时互为链接文件 |
| /var/run | 某些程序或是服务启动后,会将他们的PID放置到这个目录下,与/run相同,这个目录链接到/run目录 | /var/spool | 这个目录通常放置一些队列数据,所谓的队列就是排队等待其他程序使用的数据,这些数据被使用后通常都会被删除。举例来说,系统收到新邮件会放置到/var/spool/mail/中,但用户手下该邮件后该封新原则上就会被删除,邮件如果暂时寄不出去会被放到/var/spool/mqueue/中,等到被送出后就会被删除。如果时计划任务数据(crontab),就会被放置到/var/spool/cron/目录中 |
若要进行更深入的了解,可挑战阅读FHS官方英文文档。
注:CentOS7的目录结构略有不同
¶目录树(direction tree)
Linux系统下,所有的目录都是从根目录(/)开始,然后一级级分支开来,这种目录结构也被成为目录树(direction tree)。它的主要特性有:
- 目录树的起始点为根目录(/,root)
- 每一个目录不止能使用本地分区的文件系统,也可以使用网络上的文件系统。例如可以利用NFS服务器挂载某特定目录等
- 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。
¶绝对路径与相对路径
- 绝对路径(absolute):由根目录(/)开始写起的文件名或目录名称
- 相对路径(relative):相对于目前路径的文件名写法
符号含义:
.:代表当前的目录,也可以使用,/来表示
..:代表上一层目录,也可以用../来代表