Linux 的诞生
1991 年的那封邮件
1991 年 8 月 25 日,芬兰赫尔辛基大学一名 21 岁的学生 Linus Benedict Torvalds 在 Usenet 新闻组 comp.os.minix 发布了一条消息,措辞极其谦虚:
大家好——我正在为 386(486) AT 克隆机做一个(免费的)操作系统
(只是一个爱好,不会是 GNU 那样的大东西也不专业)。
自四月份以来一直在酝酿,开始有了成果……
这个"爱好项目"就是 Linux 内核。Linus 的动机很简单:他想在自己新买的 386 PC 上运行类 UNIX 系统,但 UNIX 太贵,Minix 又有太多限制(不允许商业使用)。于是他决定自己写一个。三十年后,这个"爱好"成为了世界上使用最广泛的操作系统内核。
关键时间线
GNU/Linux 的关系
内核 vs 操作系统
严格来说,"Linux"只是操作系统内核——负责硬件抽象、进程调度、内存管理、驱动程序等底层工作。我们日常使用的文件命令(ls、cp)、Shell(bash)、编译器(gcc)、C 标准库(glibc)大多来自 GNU 项目。所以正确的叫法是 GNU/Linux,但习惯上简称为 Linux。
Linux 内核的主要职责
主流发行版图谱
三大家族
| 家族 | 代表发行版 | 包管理器 | 配置风格 | 适用场景 |
|---|---|---|---|---|
| Debian 系 | Debian, Ubuntu, Mint, Kali, Pop!_OS | apt / dpkg | /etc 配置文件,systemd | 服务器、桌面、开发 |
| Red Hat 系 | RHEL, CentOS Stream, Fedora, Rocky, AlmaLinux | dnf / yum / rpm | SELinux 默认启用 | 企业服务器、生产环境 |
| Arch 系 | Arch Linux, Manjaro, EndeavourOS | pacman / yay | 滚动更新,最新软件 | 高级用户、桌面 |
| 其他 | openSUSE, Alpine(容器), NixOS, Gentoo | zypper / apk / nix / emerge | 各有特色 | 特殊需求/容器/嵌入式 |
推荐从 Ubuntu LTS(如 24.04 LTS)开始学习。它有最大的社区、最丰富的教程资源,且与生产环境(大多数云服务器使用 Ubuntu 或 Debian)一致。掌握 Ubuntu 后,其他发行版迁移成本很低——核心命令和概念完全相同,只有包管理器不同。
"一切皆文件"哲学
Unix/Linux 的核心设计原则
在 Linux 中,几乎所有资源都被抽象为文件:普通文件是文件,目录是文件,硬件设备(磁盘、键盘、打印机)是文件,网络连接(socket)是文件,进程信息(/proc)是文件,内核参数(/sys)是文件……
这种设计的好处是:统一的接口。读取硬盘数据、读取键盘输入、读取网络数据,都可以用相同的 open()、read()、write()、close() 系统调用。这大幅简化了程序设计,也使得管道(pipe)等强大特性成为可能。
# 访问设备(一切皆文件的体现)
cat /dev/random | head -c 16 | xxd # 读取随机数据(/dev/random 是字符设备)
echo "Hello" > /dev/pts/1 # 向另一个终端写文字(pts = 伪终端)
dd if=/dev/sda of=backup.img # 读取整块磁盘(逐字节读取)
dd if=/dev/zero of=file.img bs=1M count=100 # 创建 100MB 空文件
# 进程信息作为文件(/proc 虚拟文件系统)
# /proc 中的文件不存在于磁盘,由内核在访问时动态生成
cat /proc/1/cmdline # PID=1 进程(systemd)的命令行参数
cat /proc/$$/status # 当前 shell 进程的状态($$=当前PID)
cat /proc/meminfo # 内存信息(MemTotal、MemFree、Cached 等)
cat /proc/cpuinfo # CPU 信息(型号、核心数、频率等)
cat /proc/loadavg # 系统负载(1分钟/5分钟/15分钟平均)
cat /proc/net/tcp # 当前所有 TCP 连接(十六进制格式)
# 内核参数作为文件(/sys 虚拟文件系统)
# /sys 暴露内核对象的属性,可读写(写入修改内核行为)
cat /sys/class/net/eth0/address # 网卡 MAC 地址
cat /sys/block/sda/size # 磁盘大小(以 512B 扇区为单位)
echo 1 > /sys/class/leds/led0/brightness # 控制 LED 亮度(需 root)
# 内核运行时参数调整(/proc/sys 是 sysctl 的接口)
sysctl vm.swappiness # 查看 swap 使用倾向(默认 60)
sysctl -w vm.swappiness=10 # 运行时修改(不持久)
echo 'vm.swappiness=10' >> /etc/sysctl.conf # 持久化配置
① 每个程序只做一件事,且做好它;② 程序的输出成为另一个程序的输入(管道/流);③ 编写处理文本流的程序,因为文本是通用接口。这三条原则解释了为什么 Linux 有成百上千个小命令,以及为什么管道(|)如此强大。
FHS 文件系统层次标准
Linux 目录结构速查
终端与 Shell 的区别
# 查看当前 Shell 信息
echo $SHELL # 当前用户默认 Shell(/bin/bash 或 /usr/bin/zsh)
echo $0 # 当前进程名(-bash 前缀的减号表示登录 Shell)
echo $$ # 当前 Shell 的 PID
# 查看系统安装的所有 Shell
cat /etc/shells
# 输出示例:
# /bin/sh
# /bin/bash
# /usr/bin/bash
# /usr/bin/zsh
# /usr/bin/fish
# 切换默认 Shell(重新登录后生效)
chsh -s /usr/bin/zsh # 修改当前用户的默认 Shell
sudo chsh -s /bin/bash alice # 修改指定用户的默认 Shell
# 查看 Linux 版本信息
uname -r # 内核版本(如 6.8.0-41-generic)
uname -a # 完整系统信息
cat /etc/os-release # 发行版信息(标准化格式)
lsb_release -a # 详细发行版信息(Debian/Ubuntu)
hostnamectl # 主机名、操作系统、内核版本
# 查看硬件信息
lscpu # CPU 详细信息(核心数、频率、架构)
lsmem # 内存信息
lsblk # 块设备(磁盘/分区)信息
lspci # PCI 设备(显卡、网卡等)
lsusb # USB 设备
用户与权限的基础概念
Linux 是多用户操作系统,权限模型是安全的基石。理解这些概念为后续章节打好基础。
# 用户管理基础命令
whoami # 当前用户名
id # 用户 UID、GID 和所属组
id alice # 查看指定用户信息
groups # 当前用户所属的组
# 使用 sudo 执行特权命令
sudo apt update # 以 root 权限执行 apt update
sudo -i # 切换到 root shell(需谨慎!)
sudo -u alice ls /home/alice # 以 alice 身份执行命令
# 临时切换用户
su alice # 切换到 alice(需要 alice 的密码)
su - alice # 切换到 alice 并加载其完整环境
exit # 退出,返回之前的用户
# 查看文件权限
ls -la /etc/passwd # 查看 /etc/passwd 的权限
stat /etc/shadow # 详细权限和时间戳信息
Linux 没有回收站(默认情况下),rm -rf / 会删除整个系统且无法恢复!在输入任何 rm 命令前先确认路径。在脚本中,优先使用变量保护:rm -rf "${DIR}/"(即使 DIR 为空,有斜杠的路径更安全)。生产环境建议安装 trash-cli,将文件移入回收站而非直接删除。
Linux 的核心要点:① Linux 是内核,GNU/Linux 才是完整操作系统;② "一切皆文件"让程序和硬件通过统一接口交互;③ FHS 规范了目录结构,/etc 是配置,/var 是可变数据,/proc 和 /sys 是内核接口;④ Shell 是命令解释器,终端是 I/O 界面;⑤ 多用户权限模型是安全基础,日常操作避免使用 root。掌握这些概念,是后续学习所有 Linux 操作技能的基础。