Linux系统基础:历史、发行版、内核与用户空间、FHS与Shell入门
Linux 并非横空出世的商业产品,而是源于 1991 年 Linus Torvalds 在赫尔辛基大学的一个个人项目。它继承了 UNIX 的设计哲学——"一切皆文件"与"小而美"的工具组合,同时借助 GNU 通用公共许可证(GPL)实现了自由传播与协作开发。理解 Linux 的历史脉络、发行版生态、内核与用户空间的边界、文件系统层次标准(FHS)以及 Shell 的基本操作,是迈向 Linux 应用开发与系统管理的第一步。本章将围绕这五大主题展开,帮助读者建立完整的系统认知框架。
2.1 Linux 历史与设计哲学
核心原理
Linux 的诞生与 UNIX 的发展密不可分。1969 年,Ken Thompson 和 Dennis Ritchie 在贝尔实验室开发了 UNIX 操作系统,其核心思想是"多任务、多用户"以及"模块化工具"。1991 年,Linus Torvalds 因个人兴趣开发了一个基于 80386 处理器的内核,并在 comp.os.minix 新闻组发布了第一版 Linux 0.01。随后,GNU 项目(由 Richard Stallman 发起)提供了大量自由软件工具(如 gcc、bash、coreutils),使得 Linux 内核与 GNU 工具链结合,形成了完整的操作系统。
Linux 的设计哲学可以概括为三点:一切皆文件(设备、进程、网络连接均以文件形式暴露)、单一职责原则(每个命令只做一件事并做好)、组合性(通过管道和重定向将简单工具组合成复杂功能)。
判断方法
判断一个系统是否为 Linux 系统,可以从以下三个层面入手:
- 内核层面:运行
uname -r查看内核版本,若输出包含 "linux" 字样(如 5.15.0-91-generic),则为 Linux 内核。 - 用户空间层面:检查是否存在 GNU coreutils(如
ls --version)或标准目录结构(/etc、/usr、/var)。 - 发行版层面:查看 /etc/os-release 文件,其中包含发行版名称和版本号。
案例拆解
以 CentOS 7 与 Ubuntu 22.04 为例,两者均基于 Linux 内核,但包管理工具不同(yum vs apt)、默认文件系统布局略有差异(/home 与 /root 的权限设置)、init 系统不同(SysVinit vs systemd)。这种差异正是"发行版"概念的体现——内核相同,但外围工具链和配置策略不同。
常见误区
2.2 主流发行版与选型策略
核心原理
Linux 发行版(Distribution)是将 Linux 内核、GNU 工具、软件包管理器、桌面环境及预装应用打包而成的完整系统。根据包管理方式和目标用户,发行版可分为三大流派:
| 流派 | 代表发行版 | 包管理器 | 适用场景 |
|---|---|---|---|
| Debian 系 | Debian、Ubuntu、Linux Mint | apt / dpkg | 桌面、服务器、开发环境 |
| Red Hat 系 | RHEL、CentOS、Fedora | yum / dnf / rpm | 企业服务器、生产环境 |
| Arch 系 | Arch Linux、Manjaro | pacman | 极简定制、滚动更新 |
操作流程
选择发行版时,建议按以下步骤评估:
- 明确用途:服务器选 RHEL/CentOS(稳定性优先),开发选 Ubuntu(社区活跃),学习选 Debian(纯净)。
- 检查硬件兼容性:使用
lspci和lsusb确认网卡、显卡驱动支持。 - 评估维护周期:RHEL 提供 10 年支持,Ubuntu LTS 提供 5 年,Arch 为滚动更新。
- 验证软件生态:确认所需软件(如 Docker、CUDA)是否提供官方源。
案例拆解
某金融企业需要部署交易系统,要求 7×24 小时稳定运行且安全补丁及时。选型时对比 CentOS 7(已停止维护)与 Rocky Linux 9(RHEL 9 的兼容分支),最终选择 Rocky Linux 9,因为其提供 10 年安全更新,且与 RHEL 二进制兼容,可无缝迁移现有脚本。
常见误区
2.3 内核与用户空间
核心原理
Linux 采用宏内核架构,内核运行在 CPU 的特权模式(Ring 0)下,负责进程调度、内存管理、文件系统、设备驱动和网络协议栈。用户空间(User Space)运行在非特权模式(Ring 3)下,应用程序通过系统调用(syscall)接口请求内核服务。这种隔离机制保证了系统的稳定性和安全性——用户程序崩溃不会导致内核崩溃。
内核与用户空间的交互主要通过以下方式:
- 系统调用:如
read()、write()、fork(),是用户程序访问内核的唯一入口。 - 伪文件系统:/proc 和 /sys 以文件形式暴露内核状态,如
/proc/cpuinfo显示 CPU 信息。 - 设备文件:/dev 下的设备节点(如 /dev/sda)通过 ioctl 或 read/write 与驱动交互。
判断方法
使用 ls -l /dev/sda 查看设备文件,若第一个字符为 "b"(块设备)或 "c"(字符设备),说明该设备由内核驱动管理。使用 cat /proc/version 可查看内核编译信息,包括 GCC 版本和内核源码版本。
案例拆解
当用户执行 cat /etc/passwd 时,流程如下:
- Shell 调用
fork()创建子进程,并调用execve()加载 /bin/cat。 - cat 程序调用
open()系统调用打开 /etc/passwd 文件。 - 内核 VFS(虚拟文件系统)根据文件路径查找 inode,并调用 ext4 驱动读取磁盘数据。
- 数据从内核缓冲区拷贝到用户空间缓冲区,cat 调用
write()将内容输出到终端。
整个过程涉及 4 次用户态/内核态切换,体现了系统调用的开销。这也是为什么高性能程序会使用 mmap() 或 sendfile() 减少拷贝次数。
常见误区
insmod 或 modprobe,且必须与当前内核版本匹配。
2.4 文件系统层次标准(FHS)
核心原理
FHS(Filesystem Hierarchy Standard)定义了 Linux 系统中目录的命名、存放内容和权限规范,确保不同发行版之间文件布局的一致性。其核心目录结构如下:
| 目录 | 用途 | 示例 |
|---|---|---|
| /bin | 基本命令(所有用户可用) | ls, cp, bash |
| /sbin | 系统管理命令(需 root) | fdisk, mkfs, iptables |
| /etc | 配置文件 | /etc/passwd, /etc/ssh/sshd_config |
| /home | 普通用户家目录 | /home/alice |
| /root | root 用户家目录 | /root/.bashrc |
| /var | 可变数据(日志、缓存、队列) | /var/log/messages, /var/spool/cron |
| /usr | 共享只读数据(应用程序、库、文档) | /usr/bin, /usr/lib, /usr/share |
| /tmp | 临时文件(重启后可能清除) | /tmp/session_abc |
操作流程
排查文件系统问题时,可按以下路径定位:
- 使用
df -h检查磁盘空间,确认 /var/log 是否占满。 - 使用
du -sh /var/log/*找出大文件。 - 检查 /etc/fstab 中的挂载配置,确认 /tmp 是否使用 tmpfs(内存文件系统)。
- 使用
find / -name "*.log" -size +100M搜索异常大文件。
案例拆解
某服务器出现"no space left on device"错误,但 df -h 显示 / 分区仍有 20% 空间。排查发现 /var/log 目录下存在大量被删除但仍被进程占用的日志文件(如 syslog 持续写入)。使用 lsof | grep deleted 找到占用进程,重启该进程后空间释放。此案例说明 FHS 中 /var/log 的日志轮转(logrotate)配置至关重要。
常见误区
2.5 基本命令与 Shell 入门
核心原理
Shell 是用户与内核交互的命令行解释器,常见的 Shell 包括 Bash(默认)、Zsh、Fish。Bash 脚本编程是 Linux 运维和开发的基础技能。Shell 的核心机制包括:
- 命令解析:将输入拆分为命令名、选项和参数,并查找 PATH 环境变量中的可执行文件。
- 管道与重定向:
|将前一个命令的标准输出连接到后一个命令的标准输入;>、>>重定向输出到文件。 - 通配符与变量:
*、?匹配文件名,$VAR引用环境变量。
操作流程
学习 Shell 命令建议按以下顺序掌握:
- 文件操作:ls、cd、cp、mv、rm、mkdir、touch、chmod、chown。
- 文本处理:cat、grep、sed、awk、sort、uniq、wc。
- 进程管理:ps、top、kill、jobs、fg、bg。
- 网络命令:ping、curl、wget、ss、netstat。
- 权限与用户:useradd、passwd、su、sudo。
案例拆解
统计 /var/log/nginx/access.log 中访问量最高的 10 个 IP 地址:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
该命令链的解析:awk 提取第一列(IP),sort 排序使相同 IP 相邻,uniq -c 统计出现次数,sort -nr 按次数降序排列,head -10 取前 10 行。这种管道组合体现了 Shell 的"小而美"哲学。
常见误区
if [ $var = "yes" ] 时,变量未加引号可能导致语法错误。正确写法是 if [ "$var" = "yes" ]。此外,cp -r 复制目录时若目标已存在,会创建子目录而非覆盖,需注意行为差异。