简介:这份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和BSD
Unix的历史可以追溯到1965年,当时贝尔实验室、通用电气和麻省理工学院合作开发MULTICS操作系统,目标是建立一个多用户、多任务、多层次的系统。这个项目因为过于复杂而失败,但参与其中的Ken Thompson并没有放弃。1969年,Thompson和Dennis Ritchie用B语言和汇编语言写出了UNICS,后来改名为Unix。1971年到1973年间,两人发明了C语言,并用C语言重写了Unix——这个决定至关重要,因为用高级语言写的操作系统意味着可以移植到不同硬件平台,这在当时几乎是颠覆性的。
到了1980年代,Unix形成了两个主要分支:伯克利的BSD UNIX和AT&T的Unix。AT&T在1982年发布了System Ⅲ并走向闭源,BSD则因为与AT&T长达近十年的版权官司错过了发展期。这两个分支的竞争导致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,后来改为Linux,1991年正式发布。
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各分支的编程接口,提高了可移植性。没有POSIX,Linux上的程序很难在不同发行版甚至不同Unix系统间编译运行。
2.3 内核版本与发行版:稳定版、开发版和FHS
Linux内核是系统的心脏,它管理硬件设备、提供抽象层。内核版本分为稳定版和开发版:稳定版具有工业级强度,只修正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/* |
/root | root用户家目录 | 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命令printf,man 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 2>&1表示把标准输出和标准错误都写入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 Window:Linux图形界面的工业标准
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目录权限为700,authorized_keys文件权限为600。
如果权限没问题,就看日志。/var/log/secure记录了所有认证事件,根据报错信息判断是密码错误、公钥不匹配还是被防火墙拦截。这一套流程做完,大部分SSH问题都能定位。整个过程恰好用到前面讲的三件事:/etc目录放配置、/var/log放日志、权限位决定谁能读写。理解了文件系统的组织方式和权限模型,很多服务器问题就不再是玄学。
本文还有配套的精品资源,点击获取