06_目录结构介绍
一、Linux目录配置依据–FHS
利用Linux来开发产品或发行的社区、公司及个人太多了,如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰。所以,后来就有所谓的Filesystem Hierarchy Standard(FHS)标准的出现。根据FHS的标准文件指出,主要目的是希望用户了解到已安装软件通常放置在哪个目录下。事实上,FHS会根据文件系统使用的频繁与否和是否允许用户随意修改,而将目录定义成四种交互作用的形态。下面用表格说明:
可共享的(shareable) | 不可共享(unshareable) | |
---|---|---|
不变(static) | /usr(软件存放处) | /boot(启动与内核文件) |
/opt(第三方辅助软件) | /boot(启动与内核文件) | |
可变动(variable) | /var/mail(用户邮箱) | /var/run(程序相关) |
/var/spool/news(新闻组) | /var/lock(程序相关) |
- 可共享:可以分享给其他系统挂载使用目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录。
- **不可共享:**自己机器上面运行的设备文件或是与程序有关的socket文件等,由于仅与自身机器有关,所以当然不适合分享给其他主机。
- 不变:有些数据是不会经常变动的,跟随着发行版本而不变动。例如函数库、文件说明、系统管理员所管理的主机服务配置文件等。
- 可变动:经常修改的数据,例如日志文件、一般用户可自行接受的新闻组等。
二、Linux目录的详细介绍(CentOS7)
1. 目录树(directory tree)
Linux的文件采用层级式的树状目录结构。在Linux中,所有文件的目录都是由根目录(/)开始的。那是所有目录和文件的源头。也就是说CentOS最上层是根目录"/",然后在此目录下一个一个的分支下来,有点像树枝。我们也称这种目录配置方式为:目录树(directory tree)。根目录的特性:
- 目录树的起始点为根目录(/,root)
- 每一个目录不止能使用本地端的partition的文件系统,也可以使用网络上的filesystem。举例来说,可以利用Network File System(NFS)服务器挂载某特定目录等
- 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的
⚠️ 这句话一定要记住:在Linux中,一切皆文件。
2. 目录的详细介绍
目录 | 应放置文件内容 |
---|---|
第一部分:FHS要求必须存在的目录 | |
/bin | 系统有很多存放执行文件的目果,但/bin比t较特殊。因为/bin放置的是在单人维护模式下还能够被使用的命令。在/bin下面的命令可以被root与一般账号所使用,主要有:cat、 chmod. chown、date、mv、 mkdir、cp、 bash 等常用的命令 |
/boot | 这个目录主要在放置启动会使用到的文件,包括Linux 内核文件以及启动选项气启动所需配置文件等。Limux 内校常用的文件名为:vmlinuz,如果使用的是 grub2 这个启动引1导程序,则还会存在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/ 目录下: 1. /etc/opt(必要): 这个目录在放置第三方协力软件 /opt 的相关配置文件 2./etc/X11/(建议): 与 XWindow 有关的各种配置文件都在这里,尤其是 xorg.conf 这个 XServer的配置文件。 3./etc/sgml/(建议):与 SGML 格式有关的各项配置文件 4./etc/xml/(建议]:与 XML 格式有关的各项配留文件 |
/lib | 系统的函数库非常的多,而/lib 放置的则是在开机时会用到的函式库, 以及在/bin 或/sbin 底下的指令会呼叫的函式库而已。 什么是函式库呢? 你可以将他想成是[外挂],某些指令必须要有这些[外挂]才能够顺利完成程序的执行之意。 另外 FSH 还要求底下的目录必须要存在: /lib/modules/:这个目录放置可抽换式的核心相关模块(驱动程序) |
/media | media 是[媒体]的英文,顾名思义,这个/media 底下放置的就是可移除的装置! 包括软盘、光盘、DVD 等等装置都暂时挂载于此。常见的档名有: /media/floppy,/media/cdrom 等等。 |
/mnt | 如果你想要暂时挂在某些额外的装置,一般建议你可以放置在这个目录中。在早期的时候,这个目录的用途与/media相同,只是现在有了/media这个目录之后,/mnt目录就用来暂时挂载使用了 |
/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 | usr 是Unix Software Resource的缩写, 也就是【Unix 操作系统软件资源】所放置的目录。 FHS 建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。/usr 里面放置的数据属于可分享的与不可变动的(shareable,static)。如果你知道如何透过网络进行分区槽的挂载(例如在服务器篇会谈到的 NFS 服务器),那么/usr 确实可以分享给局域网络内的其他主机来使用。其实/usr下面还有很多次目录也是很重要的,后续介绍… |
/var | 主要放置变动性的数据。如果/usr 是安装时会占用较大硬盘容量的目录,那么/var 就是在系统运作后才会渐渐占用硬盘容量的目录。 因为/var 目录主要针对常态性变动的文件,包括快取(cache)、登录档(log file)以及某些软件运作所产生的文件,包括程序文件(lock file,run file),或者例如 MySOL 数据库的文件等等。其实/var下面还有很多次目录也是很重要的,后续介绍… |
第二部分:FHS建议可以存在的目录 | |
/home | 这是系统默认的用户家目录(home directory)。在你新增一个一般使用者账号时, 默认的用户家目录都会规范到这里来,比较重要的是,家目录有两种代号: 1. ~:代表目前这个用户的家目录 2. ~kang:则代表kang的家目录 |
/lib<qual> | 用来存放与 /lib 不同的格式的二进制函式库,例如支持 64 位的 /lib64 函式库等 |
/root | 系统管理员(root)的家目录。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,目录就能够拥有 root 的家目录,所以我们会希望 root 的家目录与根目录放置在同一个分区槽中。 |
实际上,FHS针对根目录所定义的标准仅有上面的目录,不过Liunx下还有其他目录你也需要理解一下,下面是几个在Linux当中也是非常重要的目录:
目录 | 应放置文件内容 |
---|---|
/lost+found | 这个目录是使用标准的 ext2/ext3/ext4 文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时, 将一些遗失的片段放置到这个目录下。不过如果使用的是 xfs 文件系统的话,就不会存在这个目录了! |
/proc | 这个目录本身是一个[虚拟文件系统(virtual filesystem)] 。他放置的数据都是在内存当中, 例如系统核心、行程信息(process)、周边装置的状态及网络状态等等。因为这个目录下的数据都是在内存当中,所以本身不占任何硬盘空间。 比较重要的文件例如: /proc/cpuinfo,/proc/dma,/proc/interrupts,/proc/ioports,/proc/net/* 等等。 |
/sys | 这个目录其实跟/proc 非常类似,也是一个虚拟的文件系统,主要也是记录核心与系统硬件信息较相关的信息。 包括目前已加载的核心模块与核心侦测到的硬件装置信息等等。这个目录同样不占硬盘容量喔! |
下面就对/usr和/var下的次目录进行详解:先对/usr进行讲解,再对/var进行讲解。
- /usr的意义与内容
所有系统默认的软件(distribution 发布者提供的软件)都会放置到/usr 底下,因此这个目录有点类似 Windows 系统的 [C:Widowsl(当中的一部份)+ C:Program filesl] 这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。一般来说,/usr 的次目录建议有底下这些:
目录 | 应放置的文件内容 |
---|---|
第一部分:FHS要求必须存在的目录 | |
/usr/bin | 所有一般用户能够使用的指令都放在这里。目前新的 CentOS 7 已经将全部的用户指令放置于此,而使用连结档的方式将 /bin 连结至此!!也就是说, /usr/bin 与 /bin 是一模一样了!另外,FHS要求在此目录下不应该有子目录! |
/usr/lib | 基本上,与/lib功能相同,所以/lib就是链接到次目录中的。 |
/usr/local | 系统管理员在本机自行安装自己下载的软件(非 distribution 默认提供者),建议安装到此目录, 这样会比较便于管理。举例来说,你的 distribution 提供的软件较旧,你想安装较新的软件但又不想移除旧版, 此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别啦! 你可以自行到/usr/local 去看看,该目录下也是具有 bin,etc,include, lib…的次目录。 |
/usr/sbin | 非系统正常运行所需要的系统指令,最常见的就是某些网络服务器软件的服务指令(daemon)。不过基本功能与/sbin也差不多,因此目前/sbin就是链接到此目录的。 |
/usr/share | 主要放置只读架构的数据文件,当然也包括共享文件。在这个目录下放置的数据几乎是部分硬件架构均可读取的数据,在此目录下常见的还有这些次目录: 1. /usr/share/man:联机帮助文件 2./usr/share/doc:软件杂项的文件说明 3./usr/share/zoneinfo:与时区有关的时区文件 |
第二部分:FHS建议可以存在的目录 | |
/usr/games | 与游戏比较相关的数据放置处 |
/usr/include | c/c++等程序语言的档头(header)与包含档(include)放置处,当我们以 tarball 方式(*.tar.gz 的方式安装软件)安装某些数据时,会使用到里头的许多包含档。 |
/usr/libexec | 某些不被一般使用者惯用的执行档或脚本(script)等等,都会放置在此目录中。例如大部分的 X 窗口底下的操作指令, 很多都是放在此目录下的。 |
/usr/lib<qual> | 与 /libequa>/功能相同,因此目前 /libequal> 就是链接到此目录中 |
/usr/src | 般原始码建议放置到这里,src 有 source 的意思。至于核心原始码则建议放置到/usr/src/linux目录下。 |
目录 | 应放置的文件内容 |
---|---|
第一部分: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 放置在这个目录下。至于 PID 的意义我们会在后续提到的。与 /run 相同,这个目录链接到 /run 去了! |
/var/spool | 这个目录通常放置一些队列数据,所谓的[队列]就是排队等待其他程序使用的数据! 这些数据被使用后通常都会被删除。举例来说,系统收到新信会放置到/var/spool/mail/中, 但使用者收下该信件后该封信原则上就会被删除。信件如果暂时寄不出去会被放到/var/spool/mqueue/中,等到被送出后就被删除。如果是工作排程数据(crontab),就会被放置到/var/spool/cron/目录中。 |
3.针对FHS,各家分配的异同,与CentOS7的变化
由于 FHS 仅是定义出最上层(/)及次层(/usr,var)的目录内容应该要放置的文件或目录数据, 因此,在其他次目录层级内,就可以随开发者自行来配置了。举例来说,CentOS的网络设定数据放在/etc/sysconfig/network-scripts/ 目录下,但是 SuSE 则是将网络放置在 /etc/sysconfig/network/ 目录下。目录名称可是不同的,不过只要记住大致的 FHS 标准,差异性其实有限。
此外,CentOS 7 在目录的编排上与过去的版本也有所不同。比较大的差异在于将许多原本应该要在根目录(/)里面的目录,将他内部数据全部挪到 /usr 里面去,然后进行连结设定。包括底下这些:
- /bin -->/usr/bin
- /sbin --> /usr/sbin
- /lib --> /usr/lib
- /lib64 -->/usr/lib64
- /var/lock --> /run/lock
- /var/run --> /run
三、绝对路径和相对路径
说起目录必定会提及的就是路径,根据我们写法的不同,可以将路径定义为绝对路径(absolute)和相对路径(relative)。这两种文件名/路径的写法是这样的:
- 绝对路径:由根目录(/)开始写起的文件名或目录名称,例如:/home/user;
- 相对路径:相对于当前路径的文件名写法。例如:./home/user 或 …/…/home/user 等等,口诀:开头只要不是 / 就属于相对路径
你必须要了解,相对路径是以你当前所在路径的相对位置来表示的。举例来说:假如你当前在/home这个目录下,如果想要进入/etc/sysconfig/network-scripts这个目录时,你可以使用下面两种的任意一种写法:
- cd /etc/sysconfig/network-scripts (绝对路径)
- cd …/sysconfig/network-scripts (相对路径)
在使用相对路径时,因为你在/home目录下,所以你需要回到上一层(…/)之后,才能够继续进入到 /etc 目录下,要特别注意这两个特殊的目录:
- . :代表当前的目录,也可以使用 ./ 表示
- … :代表上一层目录,也可以用 …/ 表示
这个 . 与 …目录概念很重要,你经常会见到 cd… 或 ./command 之类的指令下达方式,这就是代表上一层和当前所在目录的方式。
例题:
问:如何先进入/var/spool/mail/目录,再进入/var/spool/cron/目录内?
答:从题目中可以看出/mail 与 /cron 是同样在/var/spool目录中,所以可以通过下面的指令下达:
- cd /var/spool/mail
- cd …/cron
如此就不需要再由根目录开始写起了。这个相对路径是非常有帮助的。如果你需要进入的目录距离你当前所在的目录很近,就可以使用相对路径的方法进入你所需要的目录。灵活的使用相对路径和绝对路径会让你在切换路径时行云流水。
例题:
问:有时候你常常会看到类似 ./run.sh 之类的数据,这个指令又是什么意思呢?
答:由于指令的执行需要变量的支持,若你的执行文件放置在本目录,并且本目录并非正规的执行文件目录(bin,/usr/bin 等为正规),此时要执行指令就得要严格指定该执行档。[./] 代表本目录的意思,所以[./run.sh] 代表[执行本目录下,名为 run.sh 的文件] 。