Linux 目录配置

  • 1. Linux 目录配置的依据--FHS
  • 1.1 根目录(/)的意义与内容
  • 1.2 /usr 的意义与内容
  • 1.3 /var 的意义与内容
  • 1.4 针对 FHS,各家发行版的异同,与 CentOS 7 的变化



Reference:

  1. 鸟哥 《鸟哥的 LINUX 私房菜》

1. Linux 目录配置的依据–FHS

因为利用 Linux 来开发产品或 distributions 的社群/公司与个人实在太多了,如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰。你能想象,你进入一个企业之后,所接触到的 Linux 目录配置方法竟然跟你以前学的完全不同吗?所以,后来就有所谓的 Filesystem Hierarchy Standard(FHS) 标准出炉了!

根据 FHS 的标准文件指出,他们的主要目的是希望让使用者可以了解到已安装软件通常放置于哪个目录下,所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的使用者,都能够遵循 FHS 的标准。也就是说,FHS 的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。这样做的好处非常多,因为 Linux 操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。

事实上,FHS 是根据过去的经验一直在持续地改版,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-注意不是source):与软件安装/执行有关;
  • /var(variable):与系统运行过程有关。

每层目录下面应该要放置的子目录都有特定的规定。

这个 root 在 Linux 里面的意义有很多。
如果以账号的角度来看,所谓的 root 指的是系统管理员的身份。
如果以目录的角度来看,所谓的 root 指的是根目录,也就是 ’/‘ 。

1.1 根目录(/)的意义与内容

根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来,同时根目录也与启动、还原、系统修复等操作有关。由于系统启动时需要特定的启动软件、内核文件、启动所需程序、函数库等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。因为根目录这么重要,所以在 FHS 的要求方面,它希望根目录不要放在非常大的分区内,因为越大的分区你会放入越多的数据,如此一来根目录所在的分区就可能会有较多发生错误的机会。

因此 FHS 标准建议:根目录(/)所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。如此不但性能较佳,根目录所在的文件系统也较不容易发生问题。

有鉴于上述的说明,因此 FHS 定义出根目录(/)下面应该要有下面这些子目录的存在才好,即使没有物理目录,FHS 也希望至少有链接(link)目录存在才好。

目录

应放置文件内容

第一部分: FHS 要求必须要存在的目录

/bin

系统有很多存放执行文件的目录,但 /bin 比较特殊。因为 /bin 放置的是在单人维护模式下还能够被使用的命令。在 /bin 下面的命令可以被 root 与一般账号所使用,主要有:cat、chmod、chown、date、mv、mkdir、cp、bash 等常用命令

/boot

这个目录主要放置启动会使用到的文件,包括 Linux 内核文件以及启动选项与启动所需配置文件等。Linux 内核常用的文件名为:vmlinuz,如果使用的是 grub2 这个启动引导程序,则还会存在 /boot/grub2/ 这个目录

/dev

dev 为 device 的缩写,在 Linux 系统上,任何设备与接口设备都是以文件的形式存在于这个目录当中。你只要通过读写这个目录下面的某个文件,就等于读写某个设备,比较重要的文件有 /dev/null、/dev/zero、/dev/tty、/dev/loop*、/dev/sd* 等

/etc

系统主要的配置文件几乎都放置在这个目录内,例如人员的账号密码文件、各种服务的启动文件等。一般来说,这个目录下的各文件属性是可以让一般用户查看的,但是只有 root 有权利修改。FHS 建议不要放置可执行文件(binary)在这个目录中。比较重要的文件有:/etc/modprobe.d、/etc/passwd、/etc/fatab、/etc/issue 等。另外 FHS 还规范几个重要的目录最好要存在 /etc/ 目录下:

/etc/opt(必要):这个目录放置第三方辅助软件 /opt 的相关配置文件;

/etc/X11/(建议):与 X Window 有关的各种配置文件都在这里,尤其是 xorg.conf 这个 X Server 的配置文件;

/etc/sgml/(建议):与 SGML 格式有关的各项配置文件;

/lib

系统的函数库非常多,而 /lib 放置的则是在启动时会用到的函数库,以及在 /bin 或 /sbin 下面的命令会调用的函数库。什么是函数库?你可以将它想成是外挂,某些命令必须要有这些外挂才能够顺利完成程序的执行之意,另外 FSH 还要求下面的目录必须要存在:

/media

/media 下面放置的是可删除的设备,包括软盘、光盘、DVD 等设备都暂时挂载于此。常见的文件名有:/media/floppy、/media/cdrom 等

/mnt

如果想要暂时挂载某些额外的设备,一般建议可以放置到这个目录中。在早些时候,这个目录的用途与 /media 相同。只是有了 /media 之后,这个目录就暂时用来挂载。

/opt

这个是给第三方辅助软件放置的目录。什么是第三方辅助软件?举例来说,KDE 这个桌面管理系统是一个独立的软件,不过它可以安装到 Linux 系统中,因此 KDE 的软件就建议放置到此目录下。另外,如果你想要自行安装额外的软件(非原本的发行版提供),那么也能够将你的软件安装到这里来。不过,以前的 Linux 系统中,我们还是习惯放置在 /usr/local 目录下

/run

早期的 FHS 规定系统启动后所产生的各项信息要放置到 /var/run 目录下,新版的 FHS 则规范到 /run 下面,由于 /run 可以使用内存来模拟,因此性能上会好很多。

/sbin

Linux 有非常多命令是用来设置系统环境的,这些命令只有 root 才能够用来设置系统,其他用户最多只能用来查询而已。 放在 /sbin 下面的是启动过程中所需要的,里面包括了启动、修复、还原系统所需要的命令。至于某些服务器软件程序,一般则放置到 /usr/sbin/ 当中。至于本机自行安装的软件所产生的系统执行文件(system binary),则放置到 /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)。在你新增一个一般用户账号时,默认的用户家目录都会规范到这里来,比较重要的是家目录有两种代号:

~:代表目前这个用户的家目录;

/lib<qual>

用来存放与 /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。因此五大目录的限制已经被打破了,例如 CentOS 7.x 就已经将 /sbin、/bin、/lib 通通移动到了 /usr 下面。

1.2 /usr 的意义与内容

依据 FHS 的基本定义,/usr 里面放置的数据属于可分享与不可变动(shareable, static),如果你知道如何通过网络进行分区的挂载,那么 /usr 确实可以分享给局域网内的其他主机来使用。

很多人都会误以为 /usr 为 user 的缩写,其实 usr 是 UNIX Sofware Resource 的缩写,也就是 UNIX 操作系统软件资源所放置的目录,而不是用户的数据,这点要注意。FHS 建议所有软件开发者,应该将他们的数据合理地分别放置到这个目录下的子目录,而不要自行建立该软件自己独立的目录。

因为是所有系统默认的软件(发行版发布者提供的软件)都会放置到 /usr 下面,因此这个目录有点类似 Windows 系统 “C:\Windows(当中的一部分) + C:\Program Files” 这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。一般来说,/usr 的子目录建议有下面这些:

目录

应放置文件内容

第一部分: FHS 要求必须要存在的目录

/usr/bin/

所有一般用户能够使用的命令都放在这里。目前新的 CentOS 7 已经将全部的用户命令放置于此,而使用链接文件的方式将 /bin 链接至此。也就是说,/usr/bin 与 /bin 是一模一样的(Ubuntu 系统下并不一样)。另外,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:软件的说明文档;

第二部分: FHS 建议可以存在的目录

/usr/games/

与游戏比较相关的数据放置处

/usr/include/

c/c++等程序语言的头文件(header)与包含文件(include)放置处,当我们以 Tarball 方式(*.tar.gz 的方式安装软件)安装某些程序时,会使用到里面的许多文件

/usr/libexec/

某些不被一般用户常用的执行文件或脚本(script)等,都会放置在此目录中。例如大部分的 X 窗口下面的操作命令,很多都是放在此目录下

/usr/lib<qual>/

与 /lib<qual>/ 功能相同,因此目前 /lib 就是链接到此目录中

/usr/src/

一般源代码建议放置到这里,src 有 source 的意思。至于内核源代码则建议放置到 /usr/src/Linux/ 目录下

1.3 /var 的意义与内容

如果说 /usr 是安装时会占用较大硬盘容量的目录,那么 /var 就是在系统运行后才会渐渐占用硬盘容量的目录。因为 /var 目录主要针对经常性变动的文件,包括缓存(cache)、日志文件(log file)以及某些软件运行所产生的文件,包括程序文件(lock file、run file),或例如 MySQL 数据库的文件等。常见的子目录有:

目录

应放置文件内容

第一部分: FHS 要求必须要存在的目录

/var/cache/

应用程序本身运行过程中会产生的一些缓存

/var/lib/

程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。举例来说,MySQL 的数据库放置到 /var/lib/mysql/ 而 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 官方英文文件,可对于 Linux 操作系统的目录有更深入的了解。

1.4 针对 FHS,各家发行版的异同,与 CentOS 7 的变化

由于 FHS 仅是定义出最上层(/)及次层(/usr 与 /var)的目录应该要放置的文件或目录数据,因此,在其他子目录层级内,就可以随开发者自行来配置。举例来说,CentOS 的网络设置数据放在 /etc/sysconfig/network-scripts/ 目录下,但是 SUSE 则是将网络放置在 /etc/sysconfig/network/ 目录下,目录名称是不同的。不过只要记住大致的 FHS 标准,差异性其实有限。

此外,CentOS 7 在目录的排列上与过去的版本不同。本节稍早之前已经介绍过, 这里做个汇总。 比较大的差异在于将许多原本应该要在根目录(/)里面的目录,将它内部数据全部挪到 /usr 里面去, 然后进行链接(link)设置。包括下面这些:

  • /bin --> /usr/bin
  • /sbin --> /usr/sbin
  • /lib --> /usr/lib
  • /lib64 --> /usr/lib64
  • /var/lock --> /run/lock
  • /var/run --> /run