
简介这份Unix/Linux基础讲义面向希望系统了解Unix/Linux操作系统原理与历史的初学者尤其适合高校计算机相关专业学生作为课堂笔记或自学参考资料。文档以清晰的章节结构展开先讲解操作系统在计算机系统中的目标与地位再分别梳理Unix家族从MULTICS到UNIX的演进过程以及Linux从Minix到Linus内核的诞生背景。同时介绍支撑Linux发展的五大支柱Unix、Minix、GNU计划、POSIX标准与互联网并对内核版本、发行版分类、X Window图形系统及服务器、嵌入式等应用领域做了概览帮助读者建立完整知识框架。资源为单个doc文档压缩包大小13.46MB便于下载后直接阅读或打印。目前已有323人学习查看内容难度适中理论性强适合作为课堂补充材料或入门扫盲读物。1. 从MULTICS到Linux为什么今天的服务器还是离不开命令行很多人第一次接触Linux是在云服务器控制台里复制粘贴yum install命令的时候。那时候的直观感受是这系统和Windows长得完全不一样没有盘符没有注册表连安装软件都要敲命令。但如果你只是把Linux当成一个“不要钱的Windows替代品”那你会错过它真正的设计逻辑。Unix/Linux的整个体系从文件系统到权限模型再到“一切皆文件”的哲学都是围绕着多用户、多任务这两个核心需求建立的。本文会从Unix的起源讲起一路拆解到文件系统结构、权限机制和常用命令最后落到一个实际排查问题的场景里。适合正在学习Linux基础、准备运维岗面试或者工作中需要和服务器打交道但一直停留在“能跑就行”阶段的开发者。2. Unix家族与Linux的崛起GNU、POSIX和内核版本2.1 Unix的诞生与分裂从MULTICS到System V和BSDUnix的历史可以追溯到1965年当时贝尔实验室、通用电气和麻省理工学院合作开发MULTICS操作系统目标是建立一个多用户、多任务、多层次的系统。这个项目因为过于复杂而失败但参与其中的Ken Thompson并没有放弃。1969年Thompson和Dennis Ritchie用B语言和汇编语言写出了UNICS后来改名为Unix。1971年到1973年间两人发明了C语言并用C语言重写了Unix——这个决定至关重要因为用高级语言写的操作系统意味着可以移植到不同硬件平台这在当时几乎是颠覆性的。到了1980年代Unix形成了两个主要分支伯克利的BSD UNIX和ATT的Unix。ATT在1982年发布了System Ⅲ并走向闭源BSD则因为与ATT长达近十年的版权官司错过了发展期。这两个分支的竞争导致Unix出现了大量变种也让Unix成为大型机和工作站上的昂贵专有系统。这段历史解释了为什么后来Linux能迅速占领市场它从一开始就是一个免费的、不受版权制约的类Unix实现。2.2 Minix与Linux内核的诞生Linus的“教学系统”如何改变世界1980年代Andrew Tanenbaum教授为了教学需要仿照4.3BSD编写了一个12000行C语言的Minix系统。Minix本身只是个教学工具但它启发了当时赫尔辛基大学的学生Linus Torvalds。1990年Linus决定编写自己的Minix内核最初命名为Linus Minix后来改为Linux1991年正式发布。Linux的成长依赖五个支柱Unix操作系统提供了设计思想、Minix提供了实现参考、GNU计划提供了用户态工具链、POSIX标准提供了接口规范、互联网提供了协作方式。这里要特别说下GNU和POSIX。GNU是Richard Stallman在1984年发起的计划目的是开发一套完全自由的类Unix系统。GNU提供了Emacs、BASH shell、GCC、GDB这些核心工具但一直缺少一个内核。Linux内核出现后与GNU工具链结合才形成了完整的操作系统——这也是为什么严格来说应该叫GNU/Linux。POSIX标准定义了操作系统应为应用程序提供的接口它统一了Unix和Linux各分支的编程接口提高了可移植性。没有POSIXLinux上的程序很难在不同发行版甚至不同Unix系统间编译运行。2.3 内核版本与发行版稳定版、开发版和FHSLinux内核是系统的心脏它管理硬件设备、提供抽象层。内核版本分为稳定版和开发版稳定版具有工业级强度只修正bug或添加驱动开发版变化很快用于试验新方案。内核源码汇总在kernel.org由Linus领导的开源社区审核后合入主线。发行版是内核加上大量应用软件的集合。常见的发行版有Red Hat、Debian、Ubuntu、CentOS、Arch等。不同发行版针对的场景不同CentOS/RHEL偏向服务器稳定性Ubuntu偏向桌面易用性Arch偏向滚动更新和定制化。这里要提一个容易混淆的概念内核版本和发行版版本是独立的。同一个内核版本可以运行在不同发行版上同一个发行版也可以升级内核。用uname -r查看当前内核版本用cat /etc/os-release查看发行版信息。Linux还有一个文件系统层次结构标准FHS于1994年推出统一了根目录各文件夹的名称及作用。FHS的推行是Linux生态成熟的标志——早期各厂家自定义目录结构导致软件无法跨平台安装部署。3. Linux文件系统路径规则、目录结构和一切皆文件3.1 绝对路径与相对路径斜杠的哲学和Windows用反斜杠\分割目录不同Unix/Linux用正斜杠/。这个差异看着小但背后是设计理念的不同Windows的路径从盘符开始每个盘符是一个独立的树Linux则是一个单一根目录/所有分区挂载到根目录下的某个位置。路径分为绝对路径和相对路径。绝对路径从根目录/开始例如/home/user/test.txt第一个字符一定是/。相对路径从当前目录开始用.表示当前目录用..表示上一级目录。写脚本时如果涉及文件路径建议尽量用绝对路径避免因为当前工作目录变化导致脚本报错。3.2 Linux目录结构详解/bin、/etc、/proc该放什么FHS标准规定了根目录下各个目录的用途理解这些目录是排查问题的基础。以下是核心目录的作用目录用途常见文件/bin、/usr/bin可执行二进制文件ls、tar、mv、cat/boot启动相关文件vmlinuz内核、grub引导配置/dev设备文件/dev/cdrom、/dev/sda/etc系统配置文件inittab、fstab、init.d/home用户家目录/home/edu/lib、/usr/lib函数库动态链接库.so文件/proc内存中的系统信息cpuinfo、interrupts、net/*/rootroot用户家目录root用户的配置文件/sbin管理员命令fdisk、shutdown、mount/tmp临时文件任意用户可读写/var变化数据/var/log日志、/var/spool/mail邮件有几个目录需要特别说明。/proc不占用磁盘空间它直接映射内核内存中的数据结构通过读取/proc/cpuinfo或者/proc/net/*可以了解系统状态这也是为什么cat /proc/cpuinfo能看到CPU信息的原理。/sbin下的命令只有root能用普通用户只能查看这是权限分离的体现。/mnt和/media是挂载点传统做法是把光盘挂载到/mnt/cdrom现代桌面系统会自动挂载到/media。3.3 一切皆文件普通文件、设备文件、管道和链接Linux的设计哲学是“一切皆文件”。文件、目录、设备、socket都被抽象成文件用统一的接口访问。文件通常分5类普通文件、目录文件、设备文件、管道文件、链接文件。设备文件在/dev目录下分为字符设备和块设备。字符设备按字符存取比如键盘块设备按块存取比如硬盘。管道文件用于进程间通信ls -l看到的类型标识是p。链接文件类似Windows的快捷方式分为软链接符号链接和硬链接。软链接类似于指向原文件路径的指针原文件删除后软链接失效硬链接是同一个inode的多个目录项在原文件删除后依然可以访问。创建软链接用ln -s 目标文件 链接名创建硬链接直接ln 目标文件 链接名。用file命令可以查看文件类型不需要扩展名来区分文件格式。这也是Linux和Windows的一个显著差异Linux文件可以没有扩展名可执行权限由权限位决定而不是由.exe这样的扩展名决定。3.4 文件权限模型所有者、用户组和其他人权限就是一个文件能“被谁以什么方式访问”。Linux权限分三类主体所有者创建文件的人、用户组一个预先指定的用户集合、其他用户。每类主体有三种权限读r、写w、执行x。读权限对文件来说是可以读取内容对目录来说是浏览目录列表。写权限对文件是可以修改内容对目录是可以删除和移动目录内文件。执行权限对文件是可以运行该文件对目录是可以进入该目录。注意对目录来说读和执行权限是分开的只有读权限可以列出文件名但没有执行权限不能cd进入目录。ls -l显示的第一列就是权限信息共10个字符。第1个字符表示文件类型d目录、-普通文件、c字符设备、b块设备、p管道、l软链接。后面9个字符分三组每组三个。举个实际例子$ ls -l /etc/passwd -rw-r--r-- 1 root root 3000 Jan 15 10:30 /etc/passwd第一个字符-表示普通文件。rw-表示所有者root有读写权限没有执行权限。r--表示root组有只读权限。最后的r--表示其他用户只能读。这个文件所有用户都可以读但只有root能写所以普通用户无法修改自己的密码字段——他们只能用passwd命令因为该命令是root权限执行的。4. 常用命令全解ls、通配符、重定向与man手册4.1 命令格式与查看帮助--help和man的section体系Linux命令的基本格式是command [-options] [parameter1] ...。命令名是英文单词或其缩写选项控制行为参数是操作对象。查看帮助有两种方式ls --help man 1 ls--help是命令自带的简洁帮助不是所有命令都支持。man是完整的手册分8个section理解这些section很重要因为同名命令和函数可能出现在不同章节。man printf查的是shell命令printfman 3 printf查的是C语言的printf库函数。如果不指定章节号man会按section顺序搜索默认先找到命令。关键功能键空格看下一屏Enter滚一行b回滚q退出/word向下搜索。4.2 ls命令与通配符从-a到[a-f]的匹配逻辑ls是list的缩写列出目录内容。三个常用参数组合-a显示所有文件包括隐藏文件-l以列表方式显示详细信息-h配合-l人性化显示文件大小。通配符是Shell提供文件名匹配机制。*代表任意多个字符?代表任意一个字符[]匹配字符组中任意一个。这里有几个容易混淆的例子ls te* # 查找以te开头的文件 ls a.? # 只找3个字符前2字符是a.最后一个任意 ls [a-f]* # 找到从a到f范围内任意字符开头的文件 ls \*a # 查找文件名为*a的文件*前的\是转义符需要注意*和?在方括号内时自动失去通配符功能。ls [a-f]*和ls a-f的结果不同——后者查找的是文件名为a-f的文件因为此时-在方括号之外只是一普通字符。这个区分在写脚本时非常容易出现bug建议遇到特殊字符文件名时要么转义要么用引号包裹。4.3 输出重定向和在实际工作中的应用输出重定向是Linux命令行的基石能力。把命令输出写入文件文件不存在则创建存在则覆盖内容。追加内容不覆盖。看几个实用场景ls test.txt # 把ls结果写入test.txt覆盖已有内容 cat a.txt b.txt c.txt # 合并两个文件内容到c.txt echo hello test.txt # 在test.txt末尾追加内容重定向有两个易错点。第一会覆盖已有文件没有确认提示小心误操作。第二重定向只捕获标准输出如果用ls /nonexist result.txt错误信息仍然显示在终端result.txt是空的——因为错误输出走的是标准错误stderr需要2来重定向。完整的写法是command file 21表示把标准输出和标准错误都写入file这在写脚本记录日志时非常常用。4.4 管道与历史命令命令行效率的分水岭管道符|把前一个命令的输出作为后一个命令的输入这是Unix设计哲学的体现——每个命令只做一件事但组合起来能做复杂任务ls -l | grep txt # 过滤包含txt的文件 ps aux | grep mysqld # 查找mysqld进程 history | grep kill # 在历史命令中搜索kill相关记录配合历史命令使用效率更高。按上下键翻看历史命令history列出所有执行过的命令。Tab键自动补全需要记住这个习惯不管输命令还是路径多按Tab。5. 内核、发行版与用户体系Linux生态的关键选择5.1 内核和发行版版本为什么总对不上内核是操作系统的心脏但用户日常打交道的其实是发行版。发行版可以理解为“内核GNU工具链应用软件”的打包产物。两者的版本独立演进这也回答了一个常见疑问为什么Ubuntu用的内核版本比Arch落后却也能正常跑起来。从用户角度选择发行版看两个维度生态和更新策略。生产环境服务器推荐选择Red Hat系CentOS、Rocky Linux、AlmaLinux因为它们有10年支持周期安全补丁稳定。桌面和开发环境选Ubuntu或Fedora前者包管理简单、社区资料多后者内核较新、对硬件支持好。想深入内核学习的可以试试Arch它的文档Wiki在Linux社区享有盛誉。5.2 用户体系root、普通用户和sudo的边界Linux是多用户系统用户分为root和普通用户。root拥有全部权限普通用户只能操作自己的文件和公共资源。新增用户的命令是useradd修改密码是passwd把用户加入sudo组用usermod -aG sudo username。生产环境的安全原则能用普通用户就不用root能用sudo就不用su切换。sudo和su的区别常被混淆。su是切换到某个用户需要的是目标用户的密码sudo是以root权限执行单条命令需要的是当前用户的密码并且用户必须在sudoers文件里配置权限。运维实践中一般会禁用root的SSH登录只允许普通用户通过sudo提权这样既保留了管理能力又可审计是谁执行了什么命令。5.3 X WindowLinux图形界面的工业标准Linux桌面和Windows的架构完全不同。Windows把图形界面集成在内核层Linux的图形界面是一个可选的应用程序组件核心是X Window系统。X Window是客户机/服务器结构X Server管理显示输出和输入设备X Client是具体的图形应用程序。这就意味着你可以在本地显示器上显示远程服务器上运行的图形程序而不需要把整个桌面环境都安装到远程服务器上。近年来Wayland在逐步取代X Window但X Window的“网络透明性”设计思想仍然影响着Linux图形生态。6. 实战技巧用权限和文件系统知识排查SSH登录失败把前面的知识串起来看一个服务器上最常见的症结SSH登录失败。排查思路遵循“文件类型→文件权限→目录权限”的顺序。# 检查sshd服务的运行状态 systemctl status sshd # 检查root用户的登录限制 grep -E PermitRootLogin|PasswordAuthentication /etc/ssh/sshd_config # 查看家目录和关键文件的权限 ls -ld /home/deploy ls -l /home/deploy/.ssh/authorized_keys # 查看secure log中的认证失败记录 sudo tail -50 /var/log/secure | grep -i fail\|denied第一个命令确认sshd服务在运行。第二个命令查配置文件里是否允许root直接登录、是否开启密码认证——这两项配置是SSH登录失败的常见原因。第三个命令是关键authorized_keys权限如果太宽松sshd为了保护安全会直接拒绝使用这个公钥文件。常见要求是~/.ssh目录权限为700authorized_keys文件权限为600。如果权限没问题就看日志。/var/log/secure记录了所有认证事件根据报错信息判断是密码错误、公钥不匹配还是被防火墙拦截。这一套流程做完大部分SSH问题都能定位。整个过程恰好用到前面讲的三件事/etc目录放配置、/var/log放日志、权限位决定谁能读写。理解了文件系统的组织方式和权限模型很多服务器问题就不再是玄学。本文还有配套的精品资源点击获取