一、Linux根目录下的文件组成
1.1 根目录文件介绍
根目录在系统架构中占据核心地位,因为它不仅是所有其他目录的基础,还直接关联到系统的启动、恢复及修复等关键操作。为了顺利启动,系统依赖于位于根目录下的特定启动软件、核心文件、启动所需的程序和库文件等资源。同时,当系统遭遇故障时,根目录必须包含能够进行文件系统修复的工具。
鉴于根目录的重要性,文件系统层次结构标准(FHS)推荐,不应将根目录置于过大的分区中。较大的分区内往往会存储更多的数据,这增加了根目录所在分区出现错误的风险。因此,FHS建议,应尽可能保持根目录(/)所在的分区小巧精简,避免将应用程序安装在与根目录相同的分区内,以此减少根目录下文件系统的负担并降低出错几率。这样做不仅有助于提升系统性能,还能增强根目录所在文件系统的稳定性。
因此我将从分析根目录下的文件组成一步一步学习Linux内核。我的Linux系统根目录下的文件组成如下:
根据网上查阅的相关资料我们可以初步获得这些文件目录的作用:
目录名 | 解析 |
---|---|
/bin | 存放系统启动和运行所必需的二进制可执行文件。这些命令对所有用户都可用,包括一些基本的shell命令如ls , cp , mv 等。 |
/boot | 包含启动Linux时所需的静态文件,如内核( |
/data | 用户用于存放日志等数据的目录 |
/dev | 这个目录包含设备文件,代表系统上的硬件设备。例如, |
/etc | 存储系统范围的配置文件和启动脚本。其下的子目录如下:
|
/home | 用户主目录所在位置。每个用户有一个与其用户名相同的子目录用于存储个人文件。 |
/lib | 包含库文件,为/bin 和/sbin 中的程序提供共享库支持。 |
/lost-found | 这个目录平时是空的,当系统非正常关机而留下的“无家可归”的文件便会储存在这里 |
/media | 自动挂载可移动媒体(如USB驱动器或CD-ROM)的挂载点。 |
/mnt | 挂载目录,是系统管理员临时安装文件的系统安装点。 |
/opt | (option : 自由选择)主要给源码安装软件时选择的安装目录位置 |
/proc | 存放着用户与内核的交互信息 |
/root | 超级用户的目录 |
/run | 保存系统运行时的数据,包括进程ID文件、锁文件和其他临时性数据,这些数据在重启后不会保留。 |
/sbin | 类似于/bin ,但这里存储的是系统管理员使用的系统命令,比如ifconfig , reboot 等,主要用于维护或修理操作系统。 |
/srv | 系统启动服务时可以访问的数据库目录 |
/sys | 管理设备文件 |
/tmp | 临时文件,重启后自动清空 |
/var | 包含变化频繁的文件,如日志文件、缓存、邮件服务器的邮箱文件等。常见的子目录包括:
|
/usr | 包含只读用户数据,如应用程序和库。常见子目录包括:
|
在探讨操作系统的作用时,我们可以说操作系统主要负责为用户提供一个高效的接口来管理和操作计算机的硬件资源。为了实现这一目标,操作系统通常运行于两个逻辑层面上:内核态和用户态。
-
内核态(Kernel Space):这是操作系统的核心部分,负责“大家长式”的管理所有硬件资源,并确保系统的稳定性、安全性及高效性。内核直接与硬件交互,处理如内存管理、进程调度、中断处理等关键任务,并对外提供系统调用接口,允许用户态的应用程序请求服务或访问硬件资源。
-
用户态(User Space):这是一个相对独立的环境,应用程序在此环境中运行,与操作系统的核心功能隔离开来。这样做的目的是保护系统免受恶意或错误应用的影响,同时为用户和开发者提供一个安全、灵活的操作平台。
基于上述概念,我们可以对Linux文件系统中的目录进行如下分类:
用户态 | /bin 和 /usr/bin | 存放用户命令和工具,这些程序运行在用户空间。 |
/sbin 和 /usr/sbin | 虽然主要用于系统管理任务,但这些命令也是用户空间的应用程序,尽管它们通常需要超级用户权限来执行。 | |
/home | 每个用户的主目录,用于存储个人文件和设置。 | |
/tmp 和 /var/tmp | 临时文件存储区域,供用户和程序使用。 | |
/usr | 包含用户态程序、库、文档等。 | |
/opt | 可选的应用软件包安装位置。 | |
/var | 用于存储变化频繁的数据,如日志文件、缓存、打印机队列等,主要由用户态服务产生和使用。 | |
内核态(Kernel Space) | /proc | 虚拟文件系统,提供对内核状态的访问,比如进程信息、内存使用情况等. |
/sys | 另一个虚拟文件系统,允许用户查看及某种程度上控制硬件设备及其驱动程序的状态,它直接反映了内核中的设备模型。 | |
/dev | 包含设备文件,代表系统上的硬件设备,由内核创建和管理。 | |
/boot | 虽然这个目录的内容不直接由内核管理,但它包含了启动过程中必需的文件,如内核映像(vmlinuz )和引导加载器配置文件等,是内核启动过程的关键。 | |
/lib/modules | 存放为不同版本内核编译的可加载模块,扩展了内核的功能。 | |
混合或依赖于上下文 | /etc | 配置文件目录,虽然主要是为用户态服务和应用程序提供配置,但某些配置(如网络配置)会影响内核行为。 |
/run | 存储系统运行时的数据,包括进程ID文件、锁文件和其他临时性数据,这部分内容有时会涉及内核操作,但大部分是由用户态服务维护的。 |
可以发现基于这样分类,我们可以更加明确地识别出那些与内核直接相关的文件夹。这些文件夹不仅对程序员暴露了内核运行的相关信息,还为系统管理员提供了管理和监控系统的工具。
例如:proc文件夹下一般存放的是内核中进程运行的相关信息:
这写数字的文件夹代表着内核中运行的进程号
那如果我再打印进程为1的文件夹下的所有信息,可以发现,在这个1的进程下存放着地址、堆栈、io端口等信息。
例如:boot下存放着与内核启动相关的事项:这个目录主要在放置开机会使用到的档案,包括Linux核心档案以及开机选单与开机所需配置文件等等。Linux kernel常用的档名为:vmlinuz,如果使用的是gurb这个开机管理程序,则还会存在/boot/gurb这个目录。如下图,可以发现我的内核是linux-5.15.0版本的。
例如:dev下文件存放系统的设备文件(以文件的形式记录):在Linux系统上,任何装置与接口设备都是以档案的型态存在于这个目录中的。你只要透过存取这个目录底下的某个档案,就等于存取某个装置了,比较重要的档案有/dev/null, /dev/zero, /dev/tty, /dev/lp*, /dev/hd*, /dev/sd*等等。
1.2 总结
Linux操作系统的双重角色
在Linux中,操作系统扮演着一个“大家长”的角色,负责管理和优化计算机的所有硬件资源,并通过一系列精心设计的接口(系统调用)让外部命令能够在内核态安全地执行。与此同时,为了确保用户能够方便、高效地使用这些资源,操作系统还提供了丰富的工具和环境。
内核态与用户态的分离
- 内核态(Kernel Space):
- 操作系统的核心部分,专注于管理硬件资源,如CPU、内存、存储设备等,并确保系统的稳定性和安全性。
- 提供系统调用接口,允许用户态的应用程序请求服务或访问硬件资源,同时维护一个隔离层以保护内核免受恶意或错误应用的影响。
- 用户态(User Space):
- 为应用程序提供了一个相对独立的操作环境,使得它们可以在不影响系统核心功能的情况下运行。
- 提供了基础的操作命令及相关依赖库,使用户能够轻松地与系统交互并执行各种任务。
文件系统的组织与作用
-
基础命令与依赖:
/bin
和/usr/bin
:存放基本的用户命令和工具,支持日常操作。/sbin
和/usr/sbin
:包含系统管理相关的命令,通常需要超级用户权限来执行。/lib
和/usr/lib
:存储共享库文件,为命令行工具和其他应用程序提供必要的函数库支持。
-
用户安装的应用程序:
/opt
:用于存放可选的应用软件包,提供额外的功能和服务,便于用户安装和管理第三方软件。
-
暴露内核状态信息:
/proc
和/sys
:作为虚拟文件系统,分别提供对内核状态和硬件设备模型的实时访问,帮助开发者监控系统性能、调试程序及调整硬件配置。/dev
:包含设备文件,代表系统上的硬件设备,允许用户空间的应用程序直接与硬件进行交互,如读写数据或控制设备行为。
综上所述,Linux操作系统不仅充当了一个高效的资源管理者,还通过其精心设计的文件系统结构为用户和开发者提供了强大的支持。它通过提供基础的操作命令及相关依赖,确保了用户能够便捷地访问和管理系统;同时,通过暴露内核状态的信息,如/proc
、/sys
和/dev
下的内容,使编程人员能够更好地理解和利用系统资源。这种设计既保证了系统的稳定性和安全性,又极大地提高了灵活性和易用性,体现了Linux作为一款开源操作系统的核心价值。
后续打算:
- 编译一个基础的Linux镜像 :了解相关原理
- 阅读学习0.11内核源码
- 写一个简单的内核程序
- 打包一个docker