Linux 目录结构
![](https://file.mculoop.com/images/2024/01/08/202401080112433.png)
**/usr** - 用于存放用户安装的软件和文件的地方。它包含了许多子目录,每个子目录有自己的特定用途。也许有人会认为它是 user 的缩写,但实际上是 Unix System Resources 的缩写,也就是 Unix 操作系统软件资源。所有系统默认的软件都会放置到 /usr 底下,因此这个目录有点类似 Windows 系统的 “C:\Windows\ + C:\Program Files\” 这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。
值得注意的是,虽然在一些 Unix 系统上,仍然把 /usr/someone 当做用户家目录,如 Minix,但现代的 /usr 只专门存放各种程序和数据,用户目录已经转移到了 **/home**。
**/usr/bin** 中包含用户程序的二进制文件。如果你在 **/bin** 中找不到用户二进制文件,到 /usr/bin 目录看看。例如:at、awk、cc、less、scp。
**/usr/sbin** 中包含系统管理员的二进制文件。如果你在 **/sbin** 中找不到系统二进制文件,到 /usr/sbin 目录看看。例如:atd、cron、sshd、useradd、userdel。
/usr/bin 和 /bin 在 Linux 系统中都用于存放可执行文件,但它们之间存在一些重要的区别。
首先,**/bin** 目录是所有用户都可以访问并执行的可执行程序,包括超级用户及一般用户。它主要存放一些系统的必备执行档,例如 cat、cp、chmod、df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar 等。
而 /usr/bin 目录则存放一些用户安装的软件的运行脚本,如 c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome*、gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp 等。这些命令在 Linux 系统里的配置文件脚本里经常用到。
从用户权限的角度来看,/bin 目录下的命令管理员和一般的用户都可以使用,而 /sbin 目录下的命令通常只有管理员才可以运行。
此外,/bin 和 /sbin 目录是在系统启动后挂载到根文件系统中的,所以它们必须和根文件系统在同一分区。而 /usr/bin 和 /usr/sbin 可以和根文件系统不在一个分区。
**/usr/lib** 中包含了 /usr/bin 和 /usr/sbin 用到的库。
**/lib** 则是存放 /bin/ 和 /sbin/ 中二进制文件必要的库文件的目录。
**/usr/local** 中包含了从源安装的用户程序。例如,当你从源安装 Apache,它会在 /usr/local/apache2 中。
**/opt** - 可选的附加应用程序。
opt 代表可选的。包含从个别厂商的附加应用程序,附加应用程序应该安装在 /opt/ 或者 /opt/ 的子目录下。
**/boot** - 引导程序文件目录
例如:kernel、initrd。通常是一个单独的分区。
**/etc** - 配置文件目录
特定主机系统范围内的配置文件。
**/dev** - 设备目录
设备文件分为两种:块设备文件(b)和字符设备文件(c)
设备文件一般存放在 /dev 目录下,对常见设备文件作如下说明:
| 目录 | 描述 |
| -------------- | --------------------------- |
| /dev/hd | IDE设备 |
| /dev/sd | SCSI设备 |
| /dev/fd | 标准软驱 |
| /dev/md| 软raid设备 |
| /dev/loop | 本地回环设备 |
| /dev/ram | 内存 |
| /dev/null | 无限数据接收设备,相当于黑洞 |
| /dev/zero | 无限零资源 |
| /dev/tty | 虚拟终端 |
| /dev/ttyS | 串口 |
| /dev/lp | 并口 |
| /dev/console | 控制台 |
| /dev/fb| framebuffer |
| /dev/cdrom | => /dev/hdc |
| /dev/modem | => /dev/ttyS |
| /dev/pilot | => /dev/ttyS |
| /dev/random | 随机数设备 |
| /dev/urandom | 随机数设备 |
**/proc** - 处理信息虚拟文件系统
Linux 系统上的 /proc 目录是一种文件系统,即 proc 文件系统。与其它常见的文件系统不同的是,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
基于 /proc 文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为 0 字节。此外,这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于 RAM 中)有关。
为了查看及使用上的方便,这些文件通常会按照相关性进行分类存储于不同的目录甚至子目录中,如 /proc/scsi 目录中存储的就是当前系统上所有 SCSI 设备的相关信息,/proc/N 中存储的则是系统当前正在运行的进程的相关信息,其中 N 为正在运行的进程(可以想象得到,在某进程结束后其相关目录则会消失)。
大多数虚拟文件可以使用文件查看命令如 cat、more 或者 less 进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。不过,这些可读性较差的文件在使用一些命令如 apm、free、lspci 或 top 查看时却可以有着不错的表现。
1. /proc/apm
高级电源管理(APM)版本信息及电池相关状态信息,通常由 apm 命令使用;
2. /proc/buddyinfo
用于诊断内存碎片问题的相关信息文件;
3. /proc/cmdline
在启动时传递至内核的相关参数信息,这些信息通常由 lilo 或 grub 等启动管理工具进行传递;
```text
# more /proc/cmdline
ro root=/dev/VolGroup00/LogVol00 rhgb quiet
```
4. /proc/cpuinfo
处理器的相关信息的文件;
5. /proc/crypto
系统上已安装的内核使用的密码算法及每个算法的详细信息列表;
```text
# more /proc/crypto
name : crc32c
driver : crc32c-generic
module : kernel
priority : 0
type : digest
blocksize : 32
digestsize : 4
…………
```
6. /proc/devices
系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名;
7. /proc/diskstats
每块磁盘设备的磁盘 I/O 统计信息列表;(内核 2.5.69 以后的版本支持此功能)
8. /proc/dma
每个正在使用且注册的 ISA DMA 通道的信息列表;
9. /proc/execdomains
内核当前支持的执行域(每种操作系统独特“个性”)信息列表;
10. /proc/fb
帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息;
11. /proc/filesystems
当前被内核支持的文件系统类型列表文件,被标示为 nodev 的文件系统表示不需要块设备的支持;通常 mount 一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型;
12. /proc/interrupts
X86 或 X86_64 体系架构系统上每个 IRQ 相关的中断号列表;多路处理器平台上每个 CPU 对于每个 I/O 设备均有自己的中断号;
13. /proc/iomem
每个物理设备上的记忆体(RAM 或者 ROM)在系统内存中的映射信息;
14. /proc/ioports
当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;如下面所示,第一列表示注册的 I/O 端口范围,其后表示相关的设备;
15. /proc/kallsyms
模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核 2.5.71 以后的版本支持此功能);通常这个文件中的信息量相当大;
16. /proc/kcore
系统使用的物理内存,以 ELF 核心文件(core file)格式存储,其文件大小为已使用的物理内存(RAM)加上 4KB;这个文件用来检查内核数据结构的当前状态,因此,通常由 GBD 通常调试工具使用,但不能使用文件查看命令打开此文件;
17. /proc/kmsg
此文件用来保存由内核输出的信息,通常由 /sbin/klogd 或 /bin/dmsg 等程序使用,不要试图使用查看命令打开此文件;
18. /proc/loadavg
保存关于 CPU 和磁盘 I/O 的负载平均值,其前三列分别表示每 1 秒钟、每 5 秒钟及每 15 秒的负载平均值,类似于 uptime 命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的 PID;
19. /proc/locks
保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX 表示目前较新类型的文件锁,由 lockf 系统调用产生,FLOCK 是传统的 UNIX 文件锁,由 flock 系统调用产生;第三列也通常由两种类型,ADVISORY 表示不允许其他用户锁定此文件,但允许读取,MANDATORY 表示此文件锁定期间不允许其他用户任何形式的访问;
20. /proc/mdstat
保存 RAID 相关的多块磁盘的当前状态信息,在没有使用 RAID 机器上,其显示为如下状态:
21. /proc/meminfo
系统中关于当前内存的利用状况等的信息,常由 free 命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;
22. /proc/mounts
在内核 2.4.29 版本以前,此文件的内容为系统当前挂载的所有文件系统,在 2.4.19 以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向 /proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;
23. /proc/modules
当前装入内核的所有模块名称列表,可以由 lsmod 命令使用,也可以直接查看;如下所示,其中第一列表示模块名,第二列表示此模块占用内存空间大小,第三列表示此模块有多少实例被装入,第四列表示此模块依赖于其它哪些模块,第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),第六列表示此模块在内核内存(kernel memory)中的偏移量;
24. /proc/partitions
块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目(如下面输出中第三列所示);
25. /proc/pci
内核初始化时发现的所有 PCI 设备及其配置信息列表,其配置信息多为某 PCI 设备相关 IRQ 信息,可读性不高,可以用 “/sbin/lspci –vb” 命令获得较易理解的相关信息;在 2.6 内核以后,此文件已为 /proc/bus/pci 目录及其下的文件代替;
26. /proc/slabinfo
在内核中频繁使用的对象(如 inode、dentry 等)都有自己的 cache,即 slab pool,而 /proc/slabinfo 文件列出了这些对象相关 slap 的信息;详情可以参见内核文档中 slapinfo 的手册页;
27. /proc/stat
实时追踪自系统上次启动以来的多种统计信息;如下所示,其中,
“cpu” 行后的八个值分别表示以 1/100(jiffies)秒为单位的统计值(包括系统运行于用户模式、低优先级用户模式,运系统模式、空闲模式、I/O 等待模式的时间等);
“intr” 行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数;
“ctxt” 给出了自系统启动以来 CPU 发生的上下文交换的次数。
“btime” 给出了从系统启动到现在为止的时间,单位为秒;
“processes (total_forks) 自系统启动以来所创建的任务的个数目;
“procs_running”:当前运行队列的任务的数目;
“procs_blocked”:当前被阻塞的任务的数目;
```text
# more /proc/stat
cpu2751 26 5771 266413 2555 99 411 0
cpu0 2751 26 5771 266413 2555 99 411 0
intr 2810179 2780489 67 0 3 3 0 5 0 1 0 0 0 1707 0 0 9620 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12781 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 427300
btime 1234084100
processes 3491
procs_running 1
procs_blocked 0
```
28. /proc/swaps
当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于 /proc/swap 目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;下面是作者系统中只有一个交换分区时的输出信息;
```text
# more /proc/swaps
Filename Type Size Used Priority
/dev/sda8 partition 6425600 -1
```
29. /proc/uptime
系统上次启动以来的运行时间,如下所示,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒;
```text
# more /proc/uptime
3809.86 3714.13
```
30. /proc/version
当前系统运行的内核版本号,在作者的 RHEL5.3 上还会显示系统安装的 gcc 版本,如下所示;
```text
# more /proc/version
Linux version 2.6.18-128.el5 (mockbuild@hs20-bc1-5.build.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)) #1 SMP Wed Dec 17 11:42:39 EST 2008
```
31. /proc/vmstat
当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好;
```text
# more /proc/vmstat
nr_anon_pages 22270
nr_mapped 8542
nr_file_pages 47706
nr_slab 4720
nr_page_table_pages 897
nr_dirty 21
nr_writeback 0
…………
```
32. /proc/zoneinfo
内存区域(zone)的详细信息列表,信息量较大,下面列出的是一个输出片段:
```text
# more /proc/zoneinfo
Node 0, zone DMA
pages free 1208
min 28
low 35
high 42
active 439
inactive 1139
scanned0 (a: 7 i: 30)
spanned4096
present4096
nr_anon_pages 192
nr_mapped 141
nr_file_pages 1385
nr_slab 253
nr_page_table_pages 2
nr_dirty 523
nr_writeback 0
nr_unstable0
nr_bounce 0
protection: (0, 0, 296, 296)
pagesets
all_unreclaimable: 0
prev_priority: 12
start_pfn: 0
…………
```
**/root** - root 用户的家目录
其他用户的家目录通常在 /home/ 下。
**/mnt** - 挂载目录
临时安装目录,系统管理员可以挂载文件系统。
**/media** - 可移动媒体设备
用于挂载可移动设备的临时目录。
举例来说,挂载 CD-ROM 的 /media/cdrom,挂载软盘驱动器的 /media/floppy。
**/srv** - 服务数据
srv 代表服务。
包含服务器特定服务相关的数据。
例如,/srv/cvs 包含 cvs 相关的数据。
**/var** - 变量文件
这个目录下可以找到内容可能增长的文件。
这包括:系统日志文件(/var/log)、包和数据库文件(/var/lib)、电子邮件(/var/mail)、打印队列(/var/spool)、锁文件(/var/lock)、多次重新启动需要的临时文件(/var/tmp)等
**/tmp** - 临时文件
包含系统和用户创建的临时文件。当系统重新启动时,这个目录下的文件都将被删除。
/tmp 目录在 Linux 系统中通常使用 tmpfs 文件系统,也就是内存文件系统。tmpfs 允许将一部分内存用作文件系统,可以大大提高文件访问速度,尤其适合存储临时文件。
tmpfs 的优点包括:
1. 速度快:由于 tmpfs 直接使用内存,所以读写速度非常快,特别适合存储临时文件。
2. 节省磁盘空间:由于 tmpfs 直接使用内存,所以不会在磁盘上留下任何数据,可以节省磁盘空间。
3. 安全性高:由于 tmpfs 存储的是临时文件,所以即使系统崩溃或者重启,也不会丢失数据,可以提高系统的安全性。
**/lost+found** - 文件碎片存储目录
它的主要作用是帮助用户在文件系统发生错误或崩溃时恢复丢失的文件。
当系统意外崩溃或意外关机时,可能会导致一些文件碎片出现在 /lost+found 目录中。这些文件碎片通常是未链接的文件,可能还有一些进程正在使用它们(数据尚未被删除)。在系统启动的过程中,fsck 工具会检查这个目录,并尝试修复已损坏的文件系统。
每个 Linux 文件系统都有一个 /lost+found 目录,当文件系统崩溃时,任何在崩溃过程中损坏的文件都将被放入这个目录中。用户可以尝试在这个目录下查找并恢复这些文件。
值得注意的是,/lost+found 目录通常只有 root 用户可以访问,而且这个目录中的文件通常是未链接的文件,因此恢复过程可能会比较复杂。此外,为了防止数据丢失,建议定期备份重要数据,并保持系统更新和运行状态良好。
页:
[1]