Linux 目录结构

2021-11-19  本文已影响0人  rosy_dawn

Linux 目录结构概览

登录 Linux 系统后,在当前命令窗口下输入执行如下命令:

[vincent@localhost ~]$ cd /
[vincent@localhost /]$ ls
bin   data  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
boot  dev   home  lib64  media       opt  root  sbin  sys  usr 

对应的目录树结构如下:

linux-filesystem.png

FHS 标准

Linux中的目录层级遵循 FHS( Filesystem Hierarchy Standard) 标准,该标准规定了 UNIX-like 操作系统中文件和目录的布局规范,规定了每个特定的目录下应该要放置什么样子的数据。FHS 一直在持续改版,目前已到 3.0 版本。FHS 依据文件系统使用的频繁与否、以及是否允许使用者随意更动, 而将目录定义成四种形态

fhs_file_type.png

事实上,FHS 针对目录树架构仅定义出三个目录底下应该放置什么数据而已,下面是这三个目录的定义:

/ 表示整个文件系统的根路径。根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与启动、还原、系统修复等操作有关。由于系统开机时需要特定的启动软件、内核文件、启动所需程序、函数库等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。FHS 标准建议:根目录(/)所在分区在合理适当的情况下越小越好,且应用程序不需要必须在根目录下创建文件或依赖根目录下的文件,所以应用程序最好不要与根目录放在同一个分区内。保持根目录越小越好,如此不但性能较好,根目录所在的文件系统也较不容易发生问题。因为越大的分区你会放入越多的数据,如此一来根目录所在分区的频繁读写就会增加出错的几率。

关于 FHS 最新版文档,可以参考笔者翻译的 FHS 3.0 文档

FHS 要求必须存在的目录

FHS 定义出根目录下要有下面这些子目录存在,即使没有对应的物理目录,至少也要有对应目录的符号链接。

/bin

binbinary 的缩写,这个目录直接(没有子目录)存放着一些基本的(essential )二进制命令或这些命令的符号链接,这些命令在单人维护模式仍然可以使用(系统管理员和非授权用户都可以使用),通常包含 shell(如 bashcsh 等)和常用的命令(如 cpmvrmcatls)等。

/boot

除了启动时不需要的启动加载器配置文件(位于 /etc 目录下),以及映射安装器以外,这里存放着启动 Linux 时所需的所有文件,包括 Linux 内核文件以及启动选项与启动所需配置文件等,可能包含保存的主引导扇区和扇区映射文件。Linux 内核常用的文件名为 vmlinuxvmlinuz,如果使用的是 grub2 这个开机管理程序, 则还会存在 /boot/grub2 这个目录。为了使引导加载程序能够引导文件,必须将必要的程序放置在 /sbin 中。

/dev

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

/etc

关于这个名称目前有争议。在贝尔实验室关于 UNIX 实现文档的早期版本中,etc 被称为 etcetera,这是由于过去此目录中存放所有不属于别处的所有东西。自从早期文档出版以来,该目录名称已被以各种方式重新称呼。最近的解释缩略语如:可编辑的文本配置(英文 Editable Text Configuration)或扩展工具箱(英文 Extended Tool Chest)。该目录现在用来存放系统级别(system-wide)的配置文件(静态文件,不能是二进制程序),用户平时几乎不用访问。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的,但是只有 root 有权力修改。FHS 建议不要在该目录中放置二进制文件。如果更改了该目录下的某个文件可能会导致系统或服务不能启动。下面说明其中的一些,其他的你应该知道它们属于哪个程序,并阅读该程序的 man 页:

此外,FHS 还规定了以下几个重要的目录最好在 /etc 目录中也要存在:

/lib

代表 libraries(函数库),这个目录里存放着系统启动时、以及 /bin/sbin 下面的命令(binaries)会用到的函数库。绝大多数应用程序都需要用到这些共享库。Linux 下的函数库就是动态连接(dynamically-linked)的共享库(Linux 下的共享库一般是 .so 文件,即 shared objects),其作用类似于 Windows 里的 dll 文件。仅用于 /usr 目录中命令的共享库( 比如 X Window 的函数库)不会放在该目录 /lib 中,仅 /bin/sbin 目录中的命令所需的函数库会放在 /lib

如果安装了 C 语言预处理器(该函数库通常放置在 /usr/bin/cpp ),出于历史原因, /lib/cpp 必须是对其的引用。FHS 建议该目录下也应该存在 /lib/modules/ 目录,这个目录主要放置可抽换式的内核相关模块(即驱动程序)。

/media

Linux系统会自动识别一些可移除设备(removable media),例如 U 盘、光驱等等,Linux 会把识别出的设备挂载到这个目录下的某个挂载点子目录上,比如 floppy( 软盘驱动器 ) 、cdrom( CD-ROM 驱动器)、cdrecorder(CD 刻录机 )、zip(zip 驱动器) 。常见的文件名有:/media/floppy/media/cdrom 等等。如果挂载了多个同类型的设备,则会在目录名称后面添加从 0 开始的数字以区分它们,而原来不含数字的目录名则是一个指向原来设备的符号链接。比如,同时挂载了两个 CD-ROM 驱动器,则它们的挂载点目录为 /media/cdrom0/media/cdrom1,而 /media/cdrom 是一个指向原来某个 CD-ROM 的符号链接。

FSH 还要求底下的目录必须要存在:

FSH 还提到:历史上有许多其他不同的地方被用于挂载可移动媒体,例如 /cdrom/mnt/mnt/cdrom。将所有可移动媒体的挂载点直接放在根目录中可能会导致在 / 目录中出现大量额外目录。尽管最近使用 /mnt 中的子目录作为挂载点很常见,但它与直接使用 /mnt 作为临时挂载点的古老传统相冲突。

zip Drive(极碟)又称为海量存储器,是美国埃美加(Iomega)公司所发明的一种高容量软式磁盘机,使用具有较坚固外壳的特制高容量软碟片,并利用部分硬盘中使用的技术,制成的个人电脑储存装置。 由于 zip 驱动器价格太高,难以普及,随着存储设备的发展逐渐退出市场。

/mnt

该目录是为了临时挂载其他的文件系统的挂载点,还可以挂载远程目录来当作本地目录。该目录是临时挂其他文件系统用的,不能用来安装应用程序。比如,可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。在早些时候,这个目录的用途与 /media 相同。只是有了 /media 之后,这个目录就用作临时挂载用了。

/opt

该目录是用来安装可选的附加软件程序包( optional add-on application software packages )的。举例来说,KDE 这个桌面管理系统是 一个独立的软件,它可以安装到 Linux 系统中,因此 KDE 的软件就建议放置到此目录下了。另外,如果你想要自行安装额外的软件(非原本的发行版提供的),那么也能够将你的软件安装到这里来。不过,以前的 Linux 系统中,我们还是习惯放置在 /usr/local 目录下。

FHS 要求安装在 /opt 中的包必须将其静态文件放在单独的 /opt/<package>/opt/<provider> 目录树中,其中,<package> 是描述软件包的名称,<provider> 是软件开发者的 LANANA 注册名称。

目录 /opt/bin/opt/doc/opt/include/opt/info/opt/lib/opt/man 是保留给本地系统管理员使用的。附件软件程序包可以提供“前端”(front-end)文件,供本地系统管理员放置在(通过链接或复制)这些保留目录中,但必须在没有这些保留目录的情况下正常运行。

用户调用的程序必须位于 /opt/<package>/bin 目录中,或者位于 /opt/<provider> 层次结构下。如果包中包含 UNIX 手册页,那么它们必须位 于/opt/<package>/share/man 中,或者位于 /opt/<provider> 层次结构下,并且必须使用与 /usr/share/man 相同的子结构。可变的包文件(在正常操作中更改)必须安装在 /var/opt。特定于主机的配置文件必须安装在 /etc/opt。 除了那些必须驻留在文件系统树中特定位置才能正常工作的包文件,在 /opt/var/opt/etc/opt 层次结构之外不会存在其他包文件。例如,设备锁文件必须放在 /var/lock中,设备必须放在 /dev 中。

发行版可以在 /opt 中适当注册的子目录下安装和以其他方式管理软件。并不是所有的 Linux 发行版都会使用该目录,有些发行版会使用 /usr/local 代替,所以 /opt 目录并不是系统运行所必需的目录。

add-on(附加组件)是一个软件扩展,用来为软件提供扩展功能, 可能是扩展了软件中的某些功能,添加了新的软件接口,或提供了额外的功能。大多数附加组件都可以作为自安装包使用。这意味着用户可以简单地双击附加包来安装相应的程序文件。其他附加组件可能要求用户手动将文件移动到特定目录中。虽然不是所有的程序都支持附加组件,但是现在许多程序都支持附加组件,因为它为其他开发人员扩展程序的功能提供了一种简单的方法。比如,浏览器的插件可以看做是一种附加组件。

LANANA(The Linux Assigned Names And Numbers Authority)的宗旨是通过提供一种可响应的、易于使用的注册服务来防止名称空间冲突 。

/run

该目录存放了启动后的操作系统的信息数据,必须在引导过程开始时清除这个目录下的文件。早期的 FHS 规定系统开机后所产生的各项信息应该要放置到 /var/run 目录下,新版的 FHS 则规范到 /run 下面。由于 /run 可以使用内存来仿真,因此效能上会好很多。已迁移到使用 /run 的程序应停止使用 /var/run,除非在 /var/run 部分中有所说明。但某些程序可能仍会继续使用 /var/run,为了向后兼容,在一些 Linux 发行版(比如 CentOS 7)中,/var/run 已经变成了一个指向 /run 的符号链接。建议使用到了 /var/run 目录的老旧应用程序迁移到 /run 目录。

应用程序可能会使用 /run 的子目录,鼓励应用程序使用多个运行时文件。用户也可能会使用 /run 的子目录,但必须注意适当地限制访问权限,以防止未经授权地使用 /run 本身和其他子目录。每个子目录只能让该目录的所有者修改

原本放在 /etc 目录下的进程 ID(PID)文件现在必须放在 /run 目录下,文件命名规范为 <program-name>.pid , 比如 crondPID 文件名为 /run/crond.pidPID 文件的内部格式未发生改变,该文件必须由 ASCII 编码的十进制整数的进程标识符组成,后面跟着换行符, 例如,如果 crond 是进程号25,/run/crond.pid 将包含三个字符:2、5 和换行符。读 PID 文件的程序应该在接受什么方面有一定的灵活性。例如,它们应该忽略额外的空格、前面的零、末尾缺失的换行、或 PID 文件中的额外行。创建 PID 文件的程序应该使用上面的简单规范。维护临时 UNIX-domain 套接字的系统程序必须将它们放在这个目录或上面所述的适当的子目录中。

/sbin

system binaries 的简称,有时也称为 static binaries, 最初,/sbin 中的二进制文件保存在 /etc 中。/sbin 包含了(除了 /bin 中的二进制文件外的)用于启动、恢复(restoring)、恢复(recovering)和/或修复系统、硬件配置程序所必需的二进制文件,如 initifconfigmount 等。FHS 要求 /sbin 目录下不能有子目录,该目录下必须包含 shutdown 命令。

系统管理员使用的程序和其他仅限 root 用户可用的命令存储在 /sbin/usr/sbin/usr/local/sbin 中。/sbin 目录下的二进制程序是静态链接( statically-linked)的,因为某些系统需要确保在 /lib 目录损毁后,从而来保证系统可以启动。另一个包含系统二进制文件的目录是 /usr/sbin,此目录包含系统管理员使用的其他二进制文件(比如某些服务器软件程序,以及 fdiskfsckifconfigmkfs 等指令)。在 /usr 之后执行的(不太重要的)程序(当没有问题时)通常被放在 /usr/sbin 中。在这里,你会发现系统的网络守护进程以及其他二进制文件(通常只有系统管理员有权访问,但系统维护和修复不需要这些二进制文件)。通常,这些目录从来都不是普通用户 $PATH (PATH 是一个环境变量,它控制系统试图查找命令的位置顺序)的一部分,而是 root 的 $PATH 的一部分。本地安装的系统管理程序应该放在 /usr/local/sbin 中。

很容易决定哪些内容该放在 /sbin 目录中:如果一个普通用户(不是系统管理员)将直接运行它,那么它必须被放在 /bin 目录中。例如,像 chfn 这样的文件,用户只是偶尔使用,仍然必须放在 /usr/bin 中。尽管 ping 对于 root(网络恢复和诊断)是绝对必要的,但用户经常使用它,因此它必须驻留在 /bin 中。我们建议用户拥有 /sbin 中所有内容的读取和执行权限, 但某些 setuidsetgid 程序除外。建立 /bin/sbin 之间的分隔并不是出于安全原因,也不是为了防止用户看到操作系统,而是在每个人都使用的二进制文件和主要用于系统维护、管理任务的二进制文件之间提供良好的区分。对于用户来说,禁止使用 /sbin 没有固有的安全优势。

/srv

该目录存放一些服务启动之后需要提取的数据srv 可以视为 service 的缩写,是一些网络服务启动之后这些服务所需要取用的数据目录。常见的服务例如 WWW, FTP 等。举例来说,WWW 服务器需要的网页数据就可以放置在 /srv/www/ 里面。不过,系统的服务数据如果尚未要提供给因特网任何人浏览的话,预设还是建议放置到 /var/lib 下面即可。

/srv 子目录命名的方法没有具体的规定,因为目前还没有就如何做到这一点达成共识。在 /srv 下构造数据的一种方法是通过协议,例如,ftprsyncwwwcvs。在大型系统上,通过管理上下文(如 /srv/physics/www/srv/compsci/cvs 等)构造 /srv 可能很有用。这种设置将因主机而异。因此,任何程序都不应该依赖 /srv 的特定子目录结构或者必须存放在 /srv 中的数据。但是,FHS 兼容的系统应该始终存在于 /srv,并应将其用作此类数据的默认位置。 Linux 发行版必须注意不要在没有管理员许可的情况下删除这些目录中本地放置的文件。

/tmp

此目录主要包含临时需要的文件,那些可能需要使用临时文件的程序必须要能够使用该目录,这些程序可能会在该目录下存放解压后的临时程序文件以便在运行时使用,例如,Java 程序使用的 jar 包中的 *.so 文件等。许多程序使用它来创建锁文件和临时存储数据。

不要从这个目录中删除文件,除非你知道你在做什么!其中许多文件对于当前运行的程序非常重要,删除它们可能会导致系统崩溃。通常,它不会包含超过几 KB 文件。虽然存储在 /tmp 中的数据可以以特定站点的方式删除,但建议在系统启动时删除 /tmp 中的文件和目录。FHS 根据历史先例和惯例增加了这项建议,但没有将其作为一项要求,因为系统管理不属于这一标准的范围。因此,用户和程序不能假设在程序调用之间会保存 /tmp 中的任何文件或目录。

Java 程序中使用 System.getproperty(“java.io.tmpdir”) 是获取操作系统缓存的临时目录,Unix-like 操作系统中该系统属性代表的就是 /tmp,而在Windows中则为:C:\Users\登录用户\AppData\Local\Temp\

/usr

在早期(70 年代,当时还没有 Linux 系统)的 Unix 实现中,/usr 目录是存放用户主目录的位置,当时的 /usr/someone 目录相当于如今的 /home/someone 目录,而现在 /usr 目录是用户级别程序和数据的位置。usr 的名称一直沿用至今,但其意义从 everything user related 变成了 user usable programs and data。所以,有人将 /usr 解释称 User System ResourcesUnix specific(or system ) resources。很多人都习惯将其读成 user 的发音。这是一个非常重要的目录,存放着共享的只读数据,类似于 Windows 下的 C:\Program Files 目录,用户的很多应用程序、文档、库和头文件等都放在这个目录下

/bin/usr/bin 存放着给系统用户使用的指令(除 root 外的跑普通用户),而 /sbin/usr/sbin 则存放着是给 root 用户使用的指令。

早期 Linux 在设计的时候,若发生问题时,救援模式通常仅挂载根目录而已,因此有五个重要的目录被要求一定要与根目录放置在一起,那就是 /etc/bin/dev/lib/sbin 这五个重要目录。现在许多的 Linux 发行版已经将许多非必要的文件移出到 /usr 之外了,所以 /usr 也是越来越精简。同时因为 /usr 被建议为即使挂载成为只读,系统还是可以正常运作,所以救援模式也能同时挂载 /usr。CentOS 7.x 版本在救援模式的情况下就是这样。CentOS 7.x 已经将 /sbin/bin/lib 通通移到 /usr 底下了,因此,那个五大目录的限制已经被打破了。

/var

这个目录中存放着variable files,习惯将那些经常被修改的目录放在这个目录下。包括各种日志、进程 ID、临时目录和邮件池等。原来 /var 目录中有些内容是在 /usr 中的,但为了保持 /usr 目录的相对稳定,就把那些需要经常改变的目录放到 /var 中了。

/proc

这个目录是一个虚拟文件系统(virtual filesystem),它是系统内存的文件映射,其内容(诸如系统核心、行程信息、周边设备的状态及网络状态等)是不在硬盘上而是在内存里,也不占用硬盘空间。我们可以通过直接访问这个目录来获取系统信息,也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的 ping 命令,使别人无法 ping 你的机器

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

FHS 中可选的目录

/home

存放所有用户的主目录,类似于 Windows 中 C:\Users 目录,一般为单独的分区。在Linux中,每个用户都有一个自己的目录,一般该用户目录名是以用户的账号命名的

/root

该目录为 root 用户(超级权限管理员)的主目录。

/selinux

这个目录是 Redhat/CentOS 所特有的目录,是用来存放 Selinux 相关的文件的。Selinux 是一个比较复杂安全机制,类似于 Windows 的防火墙

/sys

这个目录类似于 /proc 目录,也是一个虚拟的文件系统,同样不占硬盘空间。该目录是 Linux 2.6 内核的一个很大的变化,该目录下安装了 2.6 内核中新出现的一个文件系统 sysfssysfs 文件系统集成了下面 3 种文件系统的信息:针对进程信息的 proc 文件系统、针对系统硬件设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建

/lost+found

这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。这个目录是使用标准的 ext2/ext3/ext4 文件系统格式才会产生的一个目录,目的在于当文件系统发生 错误时,将一些遗失的片段放置到这个目录下。不过如果使用的是 xfs 文件系统的话,就不会存在这个目录了。

绝对路径和相对路径

根据写法的不同,也可将所谓的路径定义为绝对路径(absolute path)与相对路径(relative path)。

使用相对路径可以方便地在一个大目录中各个子目录中相互切换,而不需要知道每个子目录的绝对路径。使用绝对路径虽然麻烦,但其确定性较好,只要绝对路径书写正确,就可以正确使用对应的文件,而相对路径在某些工作环境中可能无法正确找到文件。

特殊目录

在 Linux 文件系统中还有几个特殊的目录:

如果一个目录或文件名以一个点 . 开始,表示这个目录或文件是一个隐藏目录或文件(如:.bashrc)。即以默认方式查找时,不显示该目录或文件,如果要显示出隐藏目录,需要在 lsll 命令后面加 -a 选项。

经常可以看到类似于 ./run.sh 的运行可执行文件的写法,这是如何解析的呢?由于命令的执行需要变量的支持,若执行文件放置在当前工作目录中,并且当前工作目录并非正规的执行文件目录(/bin/usr/bin 等为正规),此时要运行的可执行文件就需要严格指定可执行文件。./ 代表当前工作目录的意思,所以
./run.sh 代表运行当前工作目录下名为 run.sh 的可执行文件。

上一篇 下一篇

猜你喜欢

热点阅读