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
对应的目录树结构如下:
FHS 标准
Linux中的目录层级遵循 FHS( Filesystem Hierarchy Standard) 标准,该标准规定了 UNIX-like
操作系统中文件和目录的布局规范,规定了每个特定的目录下应该要放置什么样子的数据。FHS 一直在持续改版,目前已到 3.0 版本。FHS 依据文件系统使用的频繁与否、以及是否允许使用者随意更动, 而将目录定义成四种形态:
可分享的(
shareable
):可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;不可分享的(
unshareable
):自己机器上面运作的设备文件或者是与程序有关的 socket 文件等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了;静态的(
static
):包括二进制文件、库、文档文件和其他在没有系统管理员干预的情况下不会更改的文件。例如函数库、文件说明文件、系统管理员所管理的主机服务配置文件等等;可变动的(
variable
):经常改变的数据,例如登录文件、一般用户可自行收受的新闻组等。
事实上,FHS 针对目录树架构仅定义出三个目录底下应该放置什么数据而已,下面是这三个目录的定义:
-
/ (root,根目录)
:与启动系统有关; -
/usr (unix software resource)
:与软件安装/执行有关; -
/var (variable)
:与系统运行过程有关。
/
表示整个文件系统的根路径。根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与启动、还原、系统修复等操作有关。由于系统开机时需要特定的启动软件、内核文件、启动所需程序、函数库等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。FHS 标准建议:根目录(/)所在分区在合理适当的情况下越小越好,且应用程序不需要必须在根目录下创建文件或依赖根目录下的文件,所以应用程序最好不要与根目录放在同一个分区内。保持根目录越小越好,如此不但性能较好,根目录所在的文件系统也较不容易发生问题。因为越大的分区你会放入越多的数据,如此一来根目录所在分区的频繁读写就会增加出错的几率。
关于 FHS 最新版文档,可以参考笔者翻译的 FHS 3.0 文档。
FHS 要求必须存在的目录
FHS 定义出根目录下要有下面这些子目录存在,即使没有对应的物理目录,至少也要有对应目录的符号链接。
/bin
bin
是 binary
的缩写,这个目录直接(没有子目录)存放着一些基本的(essential )二进制命令或这些命令的符号链接,这些命令在单人维护模式仍然可以使用(系统管理员和非授权用户都可以使用),通常包含 shell(如 bash
、csh
等)和常用的命令(如 cp
、mv
、rm
、cat
、ls
)等。
/boot
除了启动时不需要的启动加载器配置文件(位于 /etc
目录下),以及映射安装器以外,这里存放着启动 Linux 时所需的所有文件,包括 Linux 内核文件以及启动选项与启动所需配置文件等,可能包含保存的主引导扇区和扇区映射文件。Linux 内核常用的文件名为 vmlinux
或 vmlinuz
,如果使用的是 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
页:
/etc/rc
或/etc/rc.d
或/etc/rc?.d
: 启动、或改变运行级时运行的脚本或脚本的目录。/etc/passwd
:用户数据库,其中的域给出了用户名、真实姓名、用户起始目录、加密口令和用户的其他信息。详细介绍参考用户和用户组管理相关部分的内容。/etc/fdprm
: 软盘参数表,用以说明不同的软盘格式。可用setfdprm
进行设置。更多的信息见setfdprm
的帮助页。/etc/fstab
: 指定启动时需要自动安装的文件系统列表。也包括用swapon -a
启用的 swap 区的信息。/etc/group
: 类似/etc/passwd
,但说明的不是用户信息而是组的信息。包括组的各种数据。 详细介绍参考用户和用户组管理相关部分的内容。/etc/inittab
:init
的配置文件。/etc/issue
: 包括用户在登录提示符前的输出信息。通常包括系统的一段短说明或欢迎信息。具体内容由系统管理员确定。/etc/magic
: “file” 的配置文件。包含不同文件格式的说明, “file” 基于它猜测文件类型。/etc/motd
:motd
是 message of the day 的缩写,用户成功登录后自动输出。内容由系统管理员确定。常用于通告信息,如计划关机时间的警告等。/etc/mtab
: 当前安装的文件系统列表。由脚本初始化,并由 mount 命令自动更新。当需要一个当前安装的文件系统的列表时使用 ( 例如df
命令 ) 。/etc/shadow
: 在安装了影子 (shadow) 口令软件的系统上的影子口令文件。影子口令文件将/etc/passwd
文件中的加密口令移动到/etc/shadow
中,而后者只对超级用户 (root) 可读。这使破译口令更困难,以此增加系统的安全性。/etc/login.defs
:login
命令的配置文件。/etc/printcap
: 类似/etc/termcap
,但针对打印机。语法不同。/etc/profile 、/etc/profile.d /etc/csh.login 、 /etc/csh.cshrc
: 登录或启动时bourne
或cshells
执行的文件。这允许系统管理员为所有用户建立全局默认环境。/etc/securetty
: 确认安全终端,即哪个终端允许超级用户(root)登录。一般只列出虚拟控制台,这样就不可能 ( 至少很困难 ) 通过调制解调器 (modem) 或网络闯入系统并得到超级用户特权。/etc/shells
: 列出可以使用的 shell 。chsh
命令允许用户在本文件指定范围内改变登录的 shell 。提供一 台机器ftp
服务的服务进程ftpd
检查用户 shell 是否列在/etc/shells
文件中,如果不是,将不允许该用户登录。/etc/termcap
: 终端性能数据库。说明不同的终端用什么 “ 转义序列 ” 控制。写程序时不直接输出转义序列(这样只能工作于特定品牌的终端) ,而是从/etc/termcap
中查找要做的工作的正确序列。这样,多数的程序可以在多数终端上运行。
此外,FHS 还规定了以下几个重要的目录最好在 /etc
目录中也要存在:
-
/etc/opt/
:放置第三方辅助软件/opt
的相关配置文件(必要)。 -
/etc/X11/
:与 X Window 有关的各种配置文件都在这里,尤其是xorg.conf
这个 X Server 的配置文件(可选)。 -
/etc/sgml/
:SGML 的配置文件(可选)。 -
/etc/xml/
:XML 的配置文件(可选)。
/lib
代表 libraries
(函数库),这个目录里存放着系统启动时、以及 /bin
和 /sbin
下面的命令(binaries)会用到的函数库。绝大多数应用程序都需要用到这些共享库。Linux 下的函数库就是动态连接(dynamically-linked)的共享库(Linux 下的共享库一般是 .so
文件,即 shared objects
),其作用类似于 Windows 里的 dll
文件。仅用于 /usr
目录中命令的共享库( 比如 X Window 的函数库)不会放在该目录 /lib
中,仅 /bin
和 /sbin
目录中的命令所需的函数库会放在 /lib
中。
- FHS 要求该目录下至少要存在以下两种文件名模式中一种的文件或符号链接:
-
libc.so.*
:动态 C 语言函数库(可选); -
ld*
:运行时链接器/加载器(execution time linker/loader)(可选)。
-
如果安装了 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 还要求底下的目录必须要存在:
-
/lib/modules/
:这个目录主要放置可抽换式的内核相关模块(驱动程序)。
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/
或 /opt/
目录树中,其中,
是描述软件包的名称,
是软件开发者的 LANANA
注册名称。
目录 /opt/bin
、/opt/doc
、/opt/include
、/opt/info
、/opt/lib
和 /opt/man
是保留给本地系统管理员使用的。附件软件程序包可以提供“前端”(front-end)文件,供本地系统管理员放置在(通过链接或复制)这些保留目录中,但必须在没有这些保留目录的情况下正常运行。
用户调用的程序必须位于 /opt/
目录中,或者位于 /opt/
层次结构下。如果包中包含 UNIX 手册页,那么它们必须位 于/opt/
中,或者位于 /opt/
层次结构下,并且必须使用与 /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
目录下,文件命名规范为
, 比如 crond
的 PID
文件名为 /run/crond.pid
。PID
文件的内部格式未发生改变,该文件必须由 ASCII 编码的十进制整数的进程标识符组成,后面跟着换行符, 例如,如果 crond
是进程号25,/run/crond.pid
将包含三个字符:2、5 和换行符。读 PID
文件的程序应该在接受什么方面有一定的灵活性。例如,它们应该忽略额外的空格、前面的零、末尾缺失的换行、或 PID
文件中的额外行。创建 PID
文件的程序应该使用上面的简单规范。维护临时 UNIX-domain 套接字的系统程序必须将它们放在这个目录或上面所述的适当的子目录中。
/sbin
是 system binaries
的简称,有时也称为 static binaries
, 最初,/sbin
中的二进制文件保存在 /etc
中。/sbin
包含了(除了 /bin
中的二进制文件外的)用于启动、恢复(restoring)、恢复(recovering)和/或修复系统、硬件配置程序所必需的二进制文件,如 init
、ifconfig
、mount
等。FHS 要求 /sbin
目录下不能有子目录,该目录下必须包含 shutdown
命令。
系统管理员使用的程序和其他仅限 root 用户可用的命令存储在 /sbin
、/usr/sbin
和 /usr/local/sbin
中。/sbin
目录下的二进制程序是静态链接( statically-linked)的,因为某些系统需要确保在 /lib
目录损毁后,从而来保证系统可以启动。另一个包含系统二进制文件的目录是 /usr/sbin
,此目录包含系统管理员使用的其他二进制文件(比如某些服务器软件程序,以及 fdisk
、fsck
、ifconfig
、mkfs
等指令)。在 /usr
之后执行的(不太重要的)程序(当没有问题时)通常被放在 /usr/sbin
中。在这里,你会发现系统的网络守护进程以及其他二进制文件(通常只有系统管理员有权访问,但系统维护和修复不需要这些二进制文件)。通常,这些目录从来都不是普通用户 $PATH
(PATH 是一个环境变量,它控制系统试图查找命令的位置顺序)的一部分,而是 root 的 $PATH
的一部分。本地安装的系统管理程序应该放在 /usr/local/sbin
中。
很容易决定哪些内容该放在 /sbin
目录中:如果一个普通用户(不是系统管理员)将直接运行它,那么它必须被放在 /bin
目录中。例如,像 chfn
这样的文件,用户只是偶尔使用,仍然必须放在 /usr/bin
中。尽管 ping
对于 root
(网络恢复和诊断)是绝对必要的,但用户经常使用它,因此它必须驻留在 /bin
中。我们建议用户拥有 /sbin
中所有内容的读取和执行权限, 但某些 setuid
和 setgid
程序除外。建立 /bin
和 /sbin
之间的分隔并不是出于安全原因,也不是为了防止用户看到操作系统,而是在每个人都使用的二进制文件和主要用于系统维护、管理任务的二进制文件之间提供良好的区分。对于用户来说,禁止使用 /sbin
没有固有的安全优势。
/srv
该目录存放一些服务启动之后需要提取的数据。srv
可以视为 service
的缩写,是一些网络服务启动之后这些服务所需要取用的数据目录。常见的服务例如 WWW, FTP 等。举例来说,WWW 服务器需要的网页数据就可以放置在 /srv/www/
里面。不过,系统的服务数据如果尚未要提供给因特网任何人浏览的话,预设还是建议放置到 /var/lib
下面即可。
/srv
子目录命名的方法没有具体的规定,因为目前还没有就如何做到这一点达成共识。在 /srv
下构造数据的一种方法是通过协议,例如,ftp
、rsync
、www
和 cvs
。在大型系统上,通过管理上下文(如 /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 Resources
或 Unix specific(or system ) resources
。很多人都习惯将其读成 user
的发音。这是一个非常重要的目录,存放着共享的只读数据,类似于 Windows 下的 C:\Program Files
目录,用户的很多应用程序、文档、库和头文件等都放在这个目录下。
-
/usr/bin
:存放非必需的(non-essential)二进制命令(不是单用户模式必须的),如 vim、tail、yum 等; -
/usr/include
:存放 C 语言程序编译时所需的系统头文件。 -
/usr/lib
:包含对象和库文件(.so
和.a
格式)。应用程序可能会使用该目录下的单个子目录。 -
/usr/libexec
:包含不被用户和 shell 脚本直接使用的二进制文件。应用程序可能会使用该目录下的单个子目录,使用该目录下的某个目录后,应用程序就不能再使用/usr/lib
下的目录了。 -
/usr/local/
: 该目录用来存放系统管理员本地安装的软件。本地安装的软件必须安装在该目录下而不是/usr
目录下,除非安装的软件是用来替换或升级/usr
目录下的软件。该目录下的子目录结构类似于/usr
目录。 -
/usr/sbin
:存放系统管理员专用的非必需的系统程序,如多个网络服务的守护进程。 -
/usr/share
:用来存放所有架构独立的(architecture-independent)只读数据文件(docs、icons、fonts 等),用于在不同架构平台上共享,而不是用于不同 OS 或相同 OS 的不同版本之间共享的。任何程序或包所需的不用修改的文件应该放在/usr/share
或/usr/local/share
的子目录下。 -
/usr/src
:内核源代码默认的放置目录。 -
/usr/etc
:理论是配置文件所在的另一个目录,现在已不使用。 -
/usr/games
:从前该目录下存放着网络游戏文件,现在很少使用。 -
/usr/tmp
:存放用户临时文件的目录。该目录是从 Unix 继承而来的遗产,在许多 Linux 发行版中都不存在了。
/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
中了。
-
/var/catman
: 包括了格式化过的帮助页(man page
)。帮助页的源文件一般存在/usr/man/catman
中;有些man
页可能有预格式化的版本,存在/usr/man/cat
中。而其他的man
页在第一次看时都需要格式化,格式化完的版本存在/var/man
中,这样其他人再看相同的页时就无须等待格式化了。/var/catman
经常被清除,就像清除临时目录一样。 -
/var/lib
: 存放系统正常运行时要改变的文件。 -
/var/local
: 存放/usr/local
中安装的程序的可变数据 ( 即系统管理员安装的程序 ) 。注意,如果必要, 即使本地安装的程序也会使用其他/var
目录,例如/var/lock
。 -
/var/lock
: 锁文件。许多程序遵循在/var/lock
中产生一个锁文件的约定,以用来支持它们正在使用某个特定的设备或文件。其他程序注意到这个锁定文件时,就不会再使用这个设备或文件。 -
/var/log
: 各种程序的日志文件,尤其是login
(/var/log/wtmplog
纪录所有到系统的登录和注销)和syslog
(/var/log/messages
纪录存储所有核心和系统程序信息)。/var/log
里的文件经常不确定地增长,应该定期清除。 -
/var/run
: 保存在下一次系统引导前有效的关于系统的信息文件。例如,/var/run/utmp
包含当前登录的用户信息。 -
/var/spool
: 放置spool
程序的目录,如 mail 、 news 、打印队列和其他队列工作的目录。每个不同的spool
在/var/spool
下有自己的子目录,例如,用户的邮箱就存放在/var/spool/mail
中。 -
/var/tmp
: 比/tmp
允许更大的或需要存在较长时间的临时文件。注意系统管理员可能不允许/var/tmp
有很旧的文件。
/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 内核中新出现的一个文件系统 sysfs
。sysfs
文件系统集成了下面 3 种文件系统的信息:针对进程信息的 proc 文件系统、针对系统硬件设备的 devfs
文件系统以及针对伪终端的 devpts
文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
/lost+found
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。这个目录是使用标准的 ext2/ext3/ext4
文件系统格式才会产生的一个目录,目的在于当文件系统发生 错误时,将一些遗失的片段放置到这个目录下。不过如果使用的是 xfs
文件系统的话,就不会存在这个目录了。
绝对路径和相对路径
根据写法的不同,也可将所谓的路径定义为绝对路径(absolute path)与相对路径(relative path)。
- 绝对路径:由根目录(
/
)开始的路径(可以是一个文件,也可以是一个目录)。例如/home/vincent
,/home/vincent/.bashrc
。 - 相对路径:相对于当前工作目录的路径,不以根目录(
/
)开始。相对路径前面加上当前工作目录的绝对路径就是该相对路径对应的绝对路径。例如,从/usr/share/doc
目录切换到/usr/share/man
目录下时,对应的命令可以写成cd ../man
,这里cd
命令的目录参数就是相对路径的写法。
使用相对路径可以方便地在一个大目录中各个子目录中相互切换,而不需要知道每个子目录的绝对路径。使用绝对路径虽然麻烦,但其确定性较好,只要绝对路径书写正确,就可以正确使用对应的文件,而相对路径在某些工作环境中可能无法正确找到文件。
特殊目录
在 Linux 文件系统中还有几个特殊的目录:
-
.
表示用户所在的工作目录,也叫当前目录,也可以使用./
来表示。 -
..
表示当前目录的上一级目录,也叫父目录,也可以../
来代表。 -
-
表示前一个工作目录。比如,使用cd -
命令可以切换到上一个目录中。 -
~
表示当前用户的主目录,也可以用~/
表示。
如果一个目录或文件名以一个点 .
开始,表示这个目录或文件是一个隐藏目录或文件(如:.bashrc
)。即以默认方式查找时,不显示该目录或文件,如果要显示出隐藏目录,需要在 ls
或 ll
命令后面加 -a
选项。
经常可以看到类似于 ./run.sh
的运行可执行文件的写法,这是如何解析的呢?由于命令的执行需要变量的支持,若执行文件放置在当前工作目录中,并且当前工作目录并非正规的执行文件目录(/bin
、/usr/bin
等为正规),此时要运行的可执行文件就需要严格指定可执行文件。./
代表当前工作目录的意思,所以
./run.sh
代表运行当前工作目录下名为 run.sh
的可执行文件。