linux目录树结构


linux的文件目录以树状结构的形式组织,linux目录结构遵循FHS标准.所有目录均以根目录/为起点,在linux命令下,/表示根目录. 通过'cd /'命令即可将当前工作目录切换到根目录下,我们在根目录下执行ls -al命令:

              peter@initroot:/$ ls -al
              total 2097268
              drwxr-xr-x  23 root root       4096 Dec 23 10:43 .
              drwxr-xr-x  23 root root       4096 Dec 23 10:43 ..
              drwxr-xr-x   2 root root       4096 Dec 17 20:48 bin
              drwxr-xr-x   3 root root       4096 Dec 25 15:20 boot
              drwxr-xr-x   2 root root       4096 Nov 18 16:58 cdrom
              drwxr-xr-x  18 root root       3900 Jan  3 15:33 dev
              drwxr-xr-x 148 root root      12288 Jan  3 15:33 etc
              drwxr-xr-x   4 root root       4096 Dec  9 10:13 home
              lrwxrwxrwx   1 root root         33 Nov 18 17:09 initrd.img -> boot/initrd.img-4.15.0-54-generic
              drwxr-xr-x  23 root root       4096 Nov 18 17:10 lib
              drwxr-xr-x   2 root root       4096 Jul 29 18:27 lib64
              drwx------   2 root root      16384 Nov 18 16:56 lost+found
              drwxr-xr-x   4 root root       4096 Dec 18 10:12 media
              drwxr-xr-x   2 root root       4096 Jul 29 18:27 mnt
              drwxr-xr-x   3 root root       4096 Dec 23 10:43 opt
              dr-xr-xr-x 187 root root          0 Jan  3 15:33 proc
              drwx------  14 root root       4096 Jan  3 09:53 root
              drwxr-xr-x  31 root root        920 Jan  3 15:33 run
              drwxr-xr-x   2 root root      12288 Jan  3 15:33 sbin
              drwxr-xr-x   2 root root       4096 Jul 29 18:27 srv
              -rw-------   1 root root 2147483648 Nov 18 16:56 swapfile
              dr-xr-xr-x  13 root root          0 Jan  3 15:33 sys
              drwxrwxrwt  17 root root      12288 Jan  3 16:31 tmp
              drwxr-xr-x  11 root root       4096 Jul 29 18:26 usr
              drwxr-xr-x  11 root root       4096 Jul 29 19:02 var
              -rw-------   1 root root          0 Jan  3 15:33 VBox.log
              lrwxrwxrwx   1 root root         30 Nov 18 17:09 vmlinuz -> boot/vmlinuz-4.15.0-54-generic
            
通过输出我们可以发现,linux根目录下主要有如下几个目录:
bin boot cdrom dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var.

一.用tree命令查看linux目录树结构

回到顶部

在Linux中,我们可以通过ls、tree等工具来查看目录结构,通过ls -al命令的输出结果我们发现,在根目录/下还有很多的目录,比如etc、usr、var、bin等目录。 而在这些目录中,我们通过cd命令切换到这些目录里面,再通过ls命令会发现也有很多的目录或文件。 所有的文件与目录都是由根目录开始的,往下一层一层分支为子目录,所有的目录和文件组成一个树状结构,这种目录配置方式称为目录树(directory tree)。
目录树的树根为/,我们称/为Linux的root根目录,Linux的文件系统的入口就是/,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。

tree列出当前工作目录的目录树结构 我们也可以通过tree命令更加直观的打印出目录的树状结构,但是由于tree目录打印目录太多,我们可以通过-L选项将目录深度限制在1层或者2层。tree命令的输出如下所示:

              peter@initroot:/$ tree -L 1 /
              /
              ├── bin
              ├── boot
              ├── cdrom
              ├── dev
              ├── etc
              ├── home
              ├── initrd.img -> boot/initrd.img-4.15.0-65-generic
              ├── initrd.img.old -> boot/initrd.img-4.15.0-54-generic
              ├── lib
              ├── lib64
              ├── lost+found
              ├── media
              ├── mnt
              ├── opt
              ├── proc
              ├── root
              ├── run
              ├── sbin
              ├── srv
              ├── swapfile
              ├── sys
              ├── tmp
              ├── usr
              ├── var
              ├── vmlinuz -> boot/vmlinuz-4.15.0-65-generic
              └── vmlinuz.old -> boot/vmlinuz-4.15.0-54-generic

                21 directories, 5 files
              
大家可以亲自观察一下tree -L 2 /的输出,由于内容太多,这里就不列出了。
目录树的主要特性有:
目录树的启始点为根目录(/, root);
每一个目录不止能使用本地端的文件系统partition,也可以使用网络上的filesystem 。例如可以利用Network File System(NFS)服务器挂载某特定目录等。
每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。
目录树结构如下图所示:
linux目录树结构

二.FHS标准

回到顶部

通过上面我们了解到linux文件系统目录是以树状结构的形式组织的,我们也通过ls和tree命令观察了根目录下的一些子目录,这些子目录有什么用途,里面应该存放什么文件? 这些都是由FHS标准规定的,我们刚才提到linux目录结构遵循FHS标准,FHS标准是文件系统层次结构标准的简称,那么什么是FHS标准呢?
由于linux内核的自由开源特性,出现了很多开发linux的组织、社群与个人,每个人都可以基于linux内核发行属于自己的linux发行版。 于是就会出现非常多的基于linux内核的linux操作系统发行版(distributions),常见的linux发行版有redhat、centos、debian、ubuntu、mint等。 更多关于linux发行版的信息参考: linux和linux发行版
每个人都可以有自己的想法来随意配置文件放置的目录,每个发行版都可以有自己的一套目录组织结构,于是这样就会造成混乱,非常不利于linux的学习和发展。
需要有一套标准来规范linux的目录结构,这就是Filesystem Hierarchy Standard (FHS)标准! 在Linux面世不久,就开始了对Linux文件系统进行标准化的活动,于1994年推出了名为FSSTND(Filesystem Standard)的Linux文件系统层次结构标准。 之后,FSSTND标准吸引了UNIX社团的开发人员,他们把FSSTND扩大到UNIX系统,FSSTND就变为FHS (Filesystem Hierarchy Standard)。
FHS标准主要是对linux做一些基本的规范要求,使不同的linux发行版可以遵循一致的标准。 这样即方便了开发者,也减轻了linux学习者的学习负担,可以在不同的linux发行版本之间自如切换,而不至于感到陌生。 例如我在学习linux的时候选择的是linux mint这个发行版,而在工作中却要用到centos这个发行版,在这两个版本之间切换并不会感到吃力, 因为他们的目录结构配置都遵循FHS标准。 根据FHS(http://www.pathname.com/fhs/)的官方标准文件:
1.FHS主要规范了文件系统中每个目录的用途,每个目录下应该放置什么样的文件;
2.定义了所需要的最小构成的目录和文件。
FHS希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户,都能够遵循FHS的标准。 这样Linux操作系统就能够在目录结构不变的情况下发展出开发者想要的独特风格。 事实上,FHS是根据过去的经验一直持续改版的,FHS依据文件系统使用的频繁程度与是否允许使用者随意变更,将目录定义为四种交互作用的形态:

表:FHS规定的目录类型
FHS规定的目录类型
可分享的(shareable) 不可分享的(unshareable)
不变的(static) /usr (软件放置处) /etc (配置文件)
/opt (第三方协力软件) /boot (开机与核心档)
可变的(variable) /var/mail (使用者邮件信箱) /var/run (程序相关)
/var/spool/news (新闻组) /var/lock (程序相关)

上表中的列举了一些代表性的目录,四种类型的解释如下:
1.可分享的:可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录;
2.不可分享的:自己机器上面运作的配置文件或者与程序有关的socket文件等,由于仅与自身机器有关,所以就不适合分享给其他主机了;
3.不变的:有些数据是不会经常变动的,跟随着distribution而不变动。 例如函式库、文件说明文件、系统管理员所管理的主机服务配置文件等;
4.可变动的:经常改变的数据,例如登录文件、一般用户可自行接收的新闻组等。
其实,针对目录树结构,FHS仅规定了三个目录下应该存放什么文件,这三个目录分别是/、/usr和/var:

表:FHS规定的三个目录
FHS规定的三个目录
目录 目录含义
/ 系统根目录(root),系统开机必备目录
/usr 注意这里的usr并非user的缩写,而是unix software resource的缩写,为unix软件资源目录,与软件安装和运行有关
/var variable,与系统运作过程有关。

3.根目录/的意义与内容

根目录是整个系统最重要的目录,所有的子目录都由根目录开始,同时根目录也与系统开机、还原、修复等有关。 系统开机时需要特定的开机启动程序、核心文件等,若系统出现错误,根目录必须包含能够修复文件系统的程序。 根目录如此重要,所以FHS要求根目录不能放在非常大的分区中, 因为越大的分区放入的数据越多,发生错误的风险就越大。
因此FHS标准建议:根目录(/)所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内。 这样不但系统效率大大提高,而且根目录所在的文件系统分区也不容易发生问题。

TIPS:
可以将根目录理解为Windows下的C盘。我们在之前安装linux的时候,已经规划硬盘分为三个分区, 硬盘的设备文件为/dev/sda,三个分区的设备文件分别对应为:/dev/sda1、/dev/sda2、/dev/sda3。 三个分区分别挂载到/、/boot、/home三个目录下。这三个分区,在windows下通常就是对应为C盘、D盘、E盘。
关于磁盘分区和挂载的内容可以参考: linux磁盘与文件系统管理
基于以上原因,FHS认为根目录/下应该包含如下子目录:
FHS标准对/根目录的规定
第一部份:FHS要求/根目录下必须存在的目录
目录 目录含义
/bin 存放二进制可执行文件(binary)的目录,/bin目录下存放的大多是可以在单人维护模式下运行的命令可执行文件。 /bin目录下的命令可以被root和普通帐号使用,比如cat, chmod(修改权限), chown, date, mv, mkdir, cp, bash等常用且比较重要的指令。
/boot /boot目录主要存放linux启动时用到的文件,包括Linux内核镜像文件,initrd镜像文件,内核加载程序bootloader的核心配置文件。 Linux kernel内核常用的镜像文件为vmlinuz,目前大部分linux发行版所用的bootloader都是grub,一般grub的配置文件存放在/boot/grub/这个目录。
/dev 我们在前面提到过,linux下的设备都是以文件的形式组织的,大部分linux设备的设备文件都存放在/dev目录下。读取该目录下的设备文件就相当于读取该设备。 常用的设备文件有/dev/null, /dev/zero, /dev/tty, /dev/lp*, / dev/hd*, /dev/sd*等.
/etc /etc目录主要存放linux系统的系统管理和配置文件,例如前面讲过的和用户账号管理有关的文件:/etc/passwd、/etc/shadow、/etc/group等。 各种系统服务的启动配置文件都存放在该目录下。一般来说,这个目录下的文件属性是可以让一般用户查阅的,但是只有root才有权限修改。 FHS建议不要将可执行文件(binary)放在该目录下。 比较重要的文件有:/etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等。与X Window有关的各种配置文件都存放在/etc/X11/目录下,尤其是xorg.conf或XF86Config这两个X Server的配置文件。
/lib /lib目录主要存放和系统程序运行相关的系统共享库文件和内核驱动模块文件,这些文件也都是二进制文件。共享库类似windows里的.dll文件,是很多程序顺利运行必不可少的组成部分。 内核驱动模块是linux内核驱动程序必不可少的组成部分,内核驱动模块主要存放在/lib/modules/目录下。
/media media即媒体的意思,该目录主要存放可移除的存储设备内容。包括软盘、光碟、DVD等设备都会挂载到该目录下。常见的文件名有:/media/floppy, /media/cdrom等。
/mnt /mnt提供设备的临时挂载点。在linux早起,这个目录用途与/media相同。有了/media之后,这个目录就被用来临时挂载设备了。
/opt 额外安装的第三方(非本发行版distribution提供的)可选应用程序包存放的位置。 例如KDE桌面管理系统属于独立的第三方软件,可以被安装到linux系统,KDE的的软件包就建议安装到到此目录下。 在以前的Linux系统中,我们还是习惯将软件安装到/usr/local目录下。
/sbin /sbin目录类似/bin目录,主要存放可执行二进制文件。该目录下的大部分命令只要系统管理员root才有权限使用。 Linux有非常多的命令是用来设置系统环境的,这些命令只有root才有权限使用,普通用户最多只能用来查询而已。 放在/sbin底下的多为开机过程中所必须的,包括开机、修复、还原系统所需要的命令。一般系统服务程序主要放置到/usr/sbin/目录中。 至于用户自行安装的软件可执行文件(system binary)则放置到/usr/local/sbin/目录下。常见的命令有fdisk, fsck, ifconfig, init, mkfs等。
/srv srv为service的缩写,很多网络服务启动之后所读取的文件都放在该目录下。常见的网络服务有WWW, FTP等, 例如www服务器读取的网页文件就可以放置在/srv/www/目录下。所以我们平时如果用linux搭建www服务器,看可以将html网页文件放到该目录下。
/tmp /tmp目录是可以让一般用户或者是正在执行的程序暂时存放文件的地方。任何人都有权限读写/tmp目录,所以该目录需要定期清理。重要文件不应该存放在该目录下。 FHS甚至建议在开机时,应该将/tmp目录下的文件全部删除。
/usr 注意这里的usr并非user的缩写,而是unix software resource的缩写,为unix软件资源目录,与软件安装和运行有关。FHS对该目录做了规定,见后续。
/var variable,与系统运作过程有关。FHS对该目录做了规定,见后续。
第二部份:FHS建议/根目录下可以存在的目录
目录 目录含义
/home /home目录存放普通用户的家目录(home directory),也叫用户主目录。 系统管理员通过useradd命令添加一个普通用户的时候,就会在/home目录下创建新用户的同名家目录。例如用户名是peter,那么peter的家目录就是/home/peter. 在命令行下登录用户的家目录用~表示,而~guest:则代表用户名为guest的家目录。
/lib<qual> 该目录和/lib目录一样,不同之处的是该目录下存放的二进制共享库和/lib目录下共享库支持的处理器位数不一样,例如支持64位的共享库存放在/lib64目录下
/root 超级用户roo的家目录。之所以将root用户的家目录放在根目录下,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录, 所以我们会希望root的家目录与根目录放置在同一个分区中。
FHS对根目录的定义就仅限于上表了,不过有些目录大多数linux发行版也都配置了,FHS没有规定但大多数linux发行版都配置的目录有如下:
目录 目录含义
/lost+found 一般ext2/ext3文件系统会产生该目录,当文件系统发生错误时,系统会将一些遗失的片段放置到该目录下。
/proc /proc目录为虚拟文件系统(virtual filesystem)。该目录中的文件都存在与内存中,目录本身不占任何磁盘空间。 该目录存放了linux系统运行时的各种状态信息,包括进程、设备、网络等。 比较重要的文件目录有/proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/*等。 /proc目录的详细讲解可参考: proc文件系统
/sys 这个目录其实跟/proc非常类似,也是一个虚拟的档案系统,主要也是记录与核心相关的资讯。 包括目前已载入的核心模组与核心侦测到的硬体装置资讯等等。 这个目录同样不占硬盘容量。

需要注意的是,因为根目录与linux启动有关,启动过程中仅有根目录所在分区会被挂载,其他分区都是在启动完成之后才被挂载。 因此根目录下与启动过程有关的目录,就不能挂载在其他的分区。这些目录包括:
1./etc:配置文件目录
2./bin:二进制可执行文件目录
3./dev:设备文件目录
4./lib:共享库和内核驱动模块目录
5./sbin:重要的系统可执行文件目录
这五个目录必须与根目录放在同一个分区,不可分开挂载不同的分区。

4./usr目录的意义与内容

usr不是user的缩写,而是Unix Software Resource的缩写,即Unix操作系统软件资源所放置的目录。 这个目录有点类似Windows系统中的C:\Windows + C:\Program files这两个目录的综合体,主要用来存放系统默认的软件资源,不能用/usr来存放用户的数据文件。 FHS建议所有的软件开发者,应该将他们的数据合理的放置到/usr目录下的子目录中,而不要自行为自己开发的软件建立独立的目录。 系统刚安装完毕时,这个目录会占用最多的硬盘容量。 根据FHS的定义,/usr里面放置的数据属于可分享的与不可变动的(shareable, static), /usr目录可以通过NFS挂载网络分区,分享给局域网络内的其他主机来使用。/usr目录下常见的子目录有:
FHS标准对/usr目录的规定
第一部份:FHS要求/usr目录下必须存在的目录
目录 目录含义
/usr/bin 绝大部分的用户可使用的命令可执行文件都放在这里。注意该目录与/bin的不同之处,/bin目录下存放的命令大都和启动过程有关,是启动过程中必不可少的命令。 而/usr/bin目录下的命令和启动没有多大关系。
/usr/lib 包含各应用软件的共享库、目标文件(object file),以及一些不经常被用户用到的可执行文件或脚本(script)。 某些软件会提供一些特殊的指令来进行服务器的设定,这些指令也不会经常被系统管理员用到, 那就会被放置到这个目录下。要注意的是,如果你使用的是X86_64的Linux系统,那可能会有/usr/lib64/目录产生。
/usr/local 系统管理员在本机自行下载安装的软件(非distribution默认提供者),建议安装到此目录, 这样会比较便于管理。 举例来说,你的distribution提供的软件较旧,你想安装较新的软件但又不想移除旧版,此时你可以将新版软件安装于/usr/local/目录下。 可以自行到/usr/local去查看,该目录下也是具有bin, etc, include, lib等子目录。
/usr/sbin 非系统正常运作所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)
/usr/share 放置共享文件的地方,在这个目录下放置的数据几乎是不分硬件架构均可读取的数据, 几乎都是文本文件。该目录下经常有如下的子目录:
/usr/share/man:联机帮助文件
/usr/share/doc:软件的说明文件
/usr/share/zoneinfo:与时区有关的时区文件
第二部份:FHS建议/usr目录下可以存在的目录
目录 目录含义
/usr/games 与游戏相关的目录
/usr/include 存放系统头文件的目录。c/c++等程序语言的头文件(header)与包含文件(include)存放到该目录下。
/usr/libexec 一些不经常使用的可执行文件或脚本(script)的存放目录。例如大部分的X视窗服务下的操作指令都放在此目录下。
/usr/lib<qual> 与 /lib/功能相同,因此目前 /lib 就是链接到此目录中
/usr/src 程序源码存放目录,src为source的缩写。linux内核的源代码则建议放置到/usr/src/linux/目录下。

5./var目录的意义和内容

如果说/usr目录在linux系统安装时就会占用较大的硬盘容量,那么/var就是在系统运作后渐渐占用硬盘容量的目录。 因为/var目录主要针对经常性变动的文件,包括缓存(cache)、登录文件(log file)以及某些软件运行时产生的文件, 包括程序文件(lock file, run file),或者MySQL数据库的文件等。/var目录下常见的子目录有:
FHS标准对/var目录的规定
第一部份:FHS要求/var目录下必须存在的目录
目录 目录含义
/var/cache 应用程序运行过程中会产生的一些缓存文件。
/var/lib 应用程序运行过程中需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。 举例来说,MySQL的数据库放置到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm目录中。
/var/lock 有些设备或者文件资源一次只能被一个应用程序使用,如果同时有两个程序使用该文件,就会发生错误,需要将该文件上锁(lock)以确保该文件同时只有一个用户使用。
/var/log 该目录非常重要。该目录存放用户登录日志文件。里面比较重要的文件有/var/log/messages, /var/log/wtmp(记录登入者的信息)等。
/var/mail 存放个人电子邮件信箱的目录,不过这个目录也被放置到/var/spool/mail/目录中,通常这两个目录是互为链接文件。
/var/run 某些程序或者是服务启动后,会将他们的进程ID(PID)放置在该目录下。
/var/spool 这个目录通常放置一些队列数据,所谓的“队列”就是排队等待其他程序使用的数据。 这些数据被使用后通常都会被删除。举例来说,系统收到的新邮件会放置到/var/spool/mail/中, 用户收下该邮件后原则上就会被删除。邮件如果暂时寄不出去会被放到/var/spool/mqueue/中, 等到被送出后就被删除。如果是工作例程数据(crontab),会被放置到/var/spool/cron/目录中。
由于FHS仅定义出根目录/及/usr和/var目录应该要放置的文件或目录数据, 因此,在其他子目录层级内,就可以随开发者自行来配置了。

2.绝对路径与相对路径

在命令行下一条路径(path)有两种书写形式,一种是相对路径(relative),一种是绝对路径(absolute)。
相对路径是指相对于当前工作目录的路径,相对路径加上当前工作路径就变成了绝对路径。绝对路径总是以根目录(/)为起点。
例如当前工作目录为/home/peter,该目录下还有一个子目录叫initroot目录。用cd命令进入该目录有两种写法:
相对路径形式:cd initroot
绝对路径形式:cd /home/peter/initroot。
相对路径和绝对路径只是一个路径的不同书写形式,都是给用户看的。 相对路径是为了方便用户提高使用效率,不管是相对路径还是绝对路径,在系统内部都会变成绝对路径。
在每个目录中都有两个隐藏文件,一个是.,另一个是..。.表示当前目录,..表示上一级目录。.与..非常重要, 我们经常会用cd ..命令返回上一级目录,开发者经常使用类似./command的命令执行自己编写的命令文件或者脚本文件, 如果直接执行command命令,那么linux会去$PATH环境变量指定的路径中寻找command相对应的可执行文件,而如果前面加上./,就是告诉shell不用那么费劲的去寻找command,它就在当前工作目录下。 最常见的就是执行自己编写的shell脚本文件了,假设你当前工作目录下的shell脚本为run.sh,只需要执行./run.sh即可执行该脚本。

三.目录树与磁盘分区的关系

在安装linux之前需要合理规划磁盘分区。假设我们将磁盘分为三个主分区,在windows下分别对应C盘、D盘和E盘。
而在linux下设备是以文件的形式存在的,假设磁盘设备文件为/dev/sda,那么三个主分区的设备文件分别对应为/dev/sda1、/dev/sda2和/dev/sda3。 我们在windows下可以很容易的访问磁盘分区,一般访问路径为C:\dir、D:\dir、E:\dir。那么在linux下该如何访问这三个磁盘分区呢? 在linux下,我们也是以目录路径的形式访问磁盘分区,但是和windows不同的是,linux目录是以根目录/为起点的树状结构,称为目录树。
在访问磁盘分区之前需要先将磁盘分区挂到这棵树上,称为挂载。而可以挂载设备的目录称为挂载点
通过mount命令我们可以将/dev/sda1挂载到/根目录下,/dev/sda2挂载到/home目录下,/dev/sda3挂载到/boot目录下:
mount /dev/sda1 /
mount /dev/sda2 /home
mount /dev/sda3 /boot
这样我们访问根目录就相当于访问windows下的C盘,访问/home目录就相当于访问D盘,访问/boot目录就相当于访问E盘。
通过lsblk命令可以观察磁盘分区和挂载点分配情况。
这里需要注意不是所有目录都适合作为挂载点使用的,比如根目录下的/etc、/bin、/dev、/lib、/sbin,这些目录都不能作为挂载点使用,需要和/根目录放在同一个分区中。
当然我们不能每次都通过mount命令手动挂载设备,况且根目录必须在linux启动的时候就挂载好。
正确的做法是将磁盘分区和挂载点信息写到/etc/fstab配置文件中,这样每次linux启动的时候就会自动挂载磁盘分区了。 根目录因为在系统启动的时候就必须挂载,所以/etc/fstab文件中必须有根目录的挂载信息。 在安装linux的时候,安装程序会要求我们对磁盘进行分区和分配挂载点,所以最好在安装linux之前,就根据实际情况合理规划好磁盘分区和挂载点分配。

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读