Linux零基础教程


Linux 零基础入门教程

一本写给"完全没接触过 Linux"的人的教程。 不需要任何基础,只要会开机、会打字,就能从头学到能上手干活。


写给翻开这本书的你

如果你有过下面这些念头,这本书就是为你写的:

  • "Linux 是不是很难?我数学不好、英语不好,能学吗?"
  • "命令那么多,我记不住怎么办?"
  • "网上的教程一上来就是一堆术语,我看两行就懵了。"
  • "敲错了会不会把电脑搞坏?"

先给你三个放心的答案:

  1. 能学。 Linux 常用命令其实只有几十个,而且在真实工作里反复出现的就是那些。你不需要背,你需要的是"知道有这么个东西、用的时候能查回来"。
  2. 不用背。 这本书里每一条命令都告诉你"它解决什么问题"。只要记住问题,命令忘了随时能查。
  3. 不会搞坏。 我们会让你在虚拟机里练习。虚拟机是电脑里"模拟出来的一台电脑",你怎么折腾都行,坏了删掉重建,你的真实电脑一点事没有。

这本书和其他教材有什么不一样

别的教材常见问题 这本书怎么做
一上来就列命令表,不告诉你为什么 每个知识点都先说"它是什么、为什么需要它",再给命令
术语一个接一个,看不懂就放弃 术语第一次出现一定用括号解释,并且尽量配一个生活比喻
示例只有命令,没有结果 每个命令后面都写 # 你会看到:,让你知道自己做对了没有
不讲新手会踩的坑 每章都有"常见坑 ⚠️",专讲最容易错的地方
看完不知道自己会不会 每章末尾有"动手练",附参考答案,自己就能检验

怎么用这本书

先看懂标记

  • 🔰 必学:所有人都要掌握,后面会反复用到。
  • 🔧 进阶:第一遍看不懂可以先跳过,只要知道"有这回事",等用到了再回来。

全书 10 篇、59 章。第一遍建议只学 🔰 章节,🔧 章节当"选修课"。

每章都是同一个结构

每章都长这样,你熟悉一次就够了:

第N章 标题
> 学完这一章,你能:……        ← 每章开头告诉你目标
N.1 小节(先讲人话,再给命令)
N.2 小节
本章小结(一张表,把这一章的东西收拢)
动手练(几道小题 + 参考答案)

学习节奏:一天一章就够

每天投入 建议
20~30 分钟 学 1 章,把章里的命令全部亲手敲一遍
45 分钟以上 学 2 章,再加 20 分钟做前一章的动手练

⚠️ 注意:宁可一天一章敲扎实,不要一天十章看过去。看会了≠会了,手指头敲出来的才算会。

三步学习法(很重要)

  1. 照着敲:把书里的例子一字不差敲进终端,看结果和书上写的是不是一样。
  2. 改一改:把文件名、路径、数字改掉再敲一次,看会不会报错、为什么报错。这一步才是真正学东西的地方。
  3. 合上书重做:不看答案,自己把这道题再做一遍。做不出来就再看一眼,然后接着试。

学习路线图

阶段 内容 学完你能做什么 建议用时
第 0 步 装好实验环境、学会登录 能进到 Linux 里,看到命令行 半天
第一阶段 第一篇~第四篇(第 1–21 章) 会用命令行、会看目录、会增删改查文件、会用 vim 改配置 5~7 天
第二阶段 第五篇~第六篇(第 22–39 章) 会建用户、会配权限、会装软件、会压缩解压 5~7 天
第三阶段 第七篇~第八篇(第 40–51 章) 会挂新硬盘、会看系统状态、会排查网络 5~7 天
第四阶段 第九篇~第十篇(第 52–59 章) 会用 grep/sed/awk 处理文本、会开服务、会配防火墙 4~6 天

一个零基础的人,按每天 1 章的节奏,大约 3~4 周可以把全书 🔰 部分学完。


你需要准备什么

  1. 一台电脑(Windows 就可以,不需要很新)。
  2. 一个虚拟机软件:VMware Workstation 或 VirtualBox(免费)。
  3. 一个 Linux 系统镜像:推荐 CentOS 7(本书示例都用它)或 Ubuntu 22.04。
  4. 一个远程连接工具:Windows 自带的 cmd 或 PowerShell 就够,也可以装 Xshell、MobaXterm。

💡 小贴士:如果装虚拟机对你来说太麻烦,还有一个更省事的办法——用云服务器。很多云厂商有几十块钱一个月的入门配置,甚至学生可以免费领。这样你也不用担心"敲坏了"。

具体怎么装、怎么连,见第 6 章。


遇到问题怎么办(按这个顺序)

  1. 先看报错。Linux 的报错一般第一行就说了原因,比如 No such file or directory(没有这个文件或目录)、Permission denied(权限不够)。看不懂就把它复制下来去搜。
  2. 查手册。命令 --help 看简版说明,man 命令 看完整手册(按 q 退出)。
  3. 搜英文报错原文。中文搜不到就直接搜英文原句,命中率高得多。
  4. 问人的时候给出三样东西:完整命令、完整报错、你期望的结果。

三个心态提醒

  1. 看不懂命令的语法,是正常的。 你们学开车的时候也不会先学发动机原理。先照着开,开着开着就懂了。
  2. 报错是好东西,不是失败。 每一条报错都在告诉你"哪里不对"。熟练的人的差别不是不报错,而是会看报错。
  3. 一定要动手。 这本书最大的价值不是读,是让你在终端里敲出第一个 ls、第一次看到自己的文件。今天就去敲。

目录

第一篇 认识 Linux

  • 第1章 Linux 到底是什么 🔰
  • 第2章 Linux 能用来做什么 🔰
  • 第3章 我该选哪个版本 🔰
  • 第4章 Linux 和 Windows 有什么不一样 🔰
  • 第5章 Linux 的三个核心思想 🔰

第二篇 走进 Linux

  • 第6章 第一次登录 Linux 🔰
  • 第7章 看懂终端里那行字 🔰
  • 第8章 命令是怎么组成的 🔰
  • 第9章 认识目录树:文件都放在哪 🔰
  • 第10章 必学的五个基础命令 🔰

第三篇 文件和目录

  • 第11章 创建文件与文件夹:touch 和 mkdir 🔰
  • 第12章 复制、移动、重命名:cp 和 mv 🔰
  • 第13章 删除:rm 🔰
  • 第14章 查看文件内容:cat、more、less、head、tail 🔰
  • 第15章 软链接与硬链接 🔧
  • 第16章 通配符和花括号:一次处理一批文件 🔰
  • 第17章 重定向和管道 🔰
  • 第18章 键盘上的省力技巧 🔰

第四篇 文本编辑:vi / vim

  • 第19章 vi 是什么,为什么非学不可 🔰
  • 第20章 vim 常用的三种模式与切换 🔰
  • 第21章 十个够用的 vim 操作 🔰

第五篇 用户和权限

  • 第22章 为什么要分用户 🔰
  • 第23章 用户管理:useradd、passwd、su、id 🔰
  • 第24章 组是什么 🔰
  • 第25章 权限的三个字母 rwx 🔰
  • 第26章 看懂 ls -l 的输出 🔰
  • 第27章 修改权限 chmod 🔰
  • 第28章 修改属主和属组:chown、chgrp 🔰
  • 第29章 umask:新文件的默认权限 🔧
  • 第30章 三个特殊权限 🔧
  • 第31章 隐藏权限:chattr 和 lsattr 🔧
  • 第32章 ACL:给某个用户单独开小灶 🔧
  • 第33章 sudo:临时借用 root 的权力 🔰

第六篇 装软件

  • 第34章 Linux 装软件的四种方式 🔰
  • 第35章 yum:最常用的装软件方式 🔰
  • 第36章 配置 yum 源 🔰
  • 第37章 rpm:直接安装单个安装包 🔧
  • 第38章 源码编译安装 🔧
  • 第39章 压缩和解压 🔰

第七篇 磁盘管理

  • 第40章 磁盘、分区、格式化、挂载:四个词一次讲清 🔰
  • 第41章 分区:fdisk 与 gdisk 🔧
  • 第42章 格式化:mkfs 🔧
  • 第43章 挂载:mount、umount 与 /etc/fstab 🔧
  • 第44章 swap 交换分区 🔧
  • 第45章 LVM:能变大变小的硬盘 🔧
  • 第46章 RAID:多块硬盘合作 🔧

第八篇 日常运维命令

  • 第47章 查看系统状态 🔰
  • 第48章 进程管理 🔰
  • 第49章 网络排查 🔰
  • 第50章 find:按条件找文件 🔰
  • 第51章 history 和 alias 🔰

第九篇 文本三剑客

  • 第52章 grep:从一堆文字里挑出你要的 🔰
  • 第53章 sed:批量改文字 🔰
  • 第54章 awk:按列取数据 🔰
  • 第55章 正则表达式入门 🔧

第十篇 服务、网络与防火墙

  • 第56章 systemctl:管理服务的开关 🔰
  • 第57章 配置网络 🔰
  • 第58章 防火墙 🔰
  • 第59章 常见基础服务一览 🔧

附录

  • 附录A 命令速查表
  • 附录B 常见报错与解决办法
  • 附录C 学习路线与下一步
  • 附录D 原始文档整理说明(勘误)

第一篇 认识 Linux

这一篇不讲命令,只讲"Linux 到底是个什么东西"。 看似没用,其实最有用——概念没清,后面每一条命令都会背得痛苦。

第1章 Linux 到底是什么 🔰

学完这一章,你能:用自己的话向别人解释 Linux 是什么,以及为什么它既叫"内核"又叫"操作系统"。

1.1 先说操作系统是什么

一台电脑,从你按下电源键到能用鼠标点东西,中间有一层东西在干活:它要管屏幕亮不亮、管键盘按了哪个键、管文件存在哪、管程序怎么抢 CPU。

这层东西就是操作系统。

比喻:把电脑想成一家公司。 硬件(CPU、内存、硬盘)是员工,只会闷头干活,不会自己安排工作。 操作系统就是总经理:它安排谁干什么、什么时候干、干多久,还负责对接外面的人(你)。 Windows 是总经理,Linux 也是总经理,只是两个总经理的管理风格不一样。

所以你平常用的 Windows、手机上的安卓、苹果的 macOS,都是操作系统。

1.2 Linux 这个名字,其实有两种意思

这是所有初学者第一个绕不过去的点,一定要分清。

狭义上的 Linux:只是"内核"。

内核(kernel)是操作系统里最核心的那一小块程序,它只干四件事:

内核管什么 通俗说
管进程 哪个程序先用 CPU,用多久
管内存 谁用哪段内存,用完收回
管硬件 硬盘、网卡、显卡怎么驱动
管文件 文件怎么存到硬盘、怎么读出来

广义上的 Linux:一整套能用的操作系统。

光有内核,你是什么都干不了的——没有 ls、没有 cd、没有编辑器的界面。所以真正交到你手上的"Linux",是内核 + 一大堆配套软件打包在一起的成品。

比喻:Linux 内核是发动机。 光有一台发动机,你开不走。要装上车架、轮子、方向盘、座椅,才是一辆能开的车。 这些"整车",就叫发行版(distribution,简称"发行版")。第 3 章专门讲怎么挑。

严格来说,我们日常用的这一整套,叫 GNU/Linux:

  • GNU:一个开源软件组织,提供了大量基础工具(我们后面要用的 ls、cd、cat 都是它家的)。
  • Linux:Linus Torvalds 在 1991 年写的内核。

💡 小贴士:以后看到 "GNU/Linux" 这个写法,别觉得奇怪,它是在说"内核是 Linux,工具是 GNU 的"。

1.3 Linux 是怎么来的(一分钟版本)

  • 1970 年前后,美国贝尔实验室做了一个叫 Unix 的操作系统,非常好用,但价格贵、还闭源。
  • 1980 年代,麻省理工的 Richard Stallman(斯托曼) 发起 GNU 计划,想做一个完全自由的操作系统,工具都写好了,就差内核。
  • 1991 年,芬兰大学生 Linus Torvalds(林纳斯) 写了一个内核,发在学校 BBS 上,起名 Linux。
  • 两边一凑,GNU 的工具 + Linux 的内核 = 一套完整免费的操作系统。

它为什么能火?因为它开源、免费。

开源的意思是:作者把程序的源代码(人能看懂的代码)公开出来,任何人都能看、能改、能再发布。于是全世界的程序员都往里加东西,它就越做越好。

1.4 为什么全世界的服务器都在用 Linux

  • 全球 90% 以上的服务器运行 Linux。
  • 你手机里的安卓系统,内核就是 Linux。
  • 路由器、智能电视、车机、工业机器人、超级计算机,大量在用 Linux。

原因就三条:免费、稳定、可定制。服务器一开机就要跑好几年不重启,Windows 做不到,Linux 可以。

本章小结

概念 一句话解释
操作系统 管理硬件和软件资源的"总经理"
内核(kernel) 操作系统最核心的一小块,管进程、内存、硬件、文件
Linux(狭义) 只是那个内核
Linux(广义) 内核 + 一堆配套软件,也就是我们真正在用的系统
发行版 把内核和软件打包好的成品,比如 CentOS、Ubuntu
开源 源代码公开,谁都能看能改能再发布

动手练

  1. 用自己的话说一遍:为什么"Linux 只是一个内核"却不能直接拿来用?
  2. 你手机的操作系统内核可能是什么?
  3. 判断题:Linux 是 Unix。(说说你的理由)

参考答案

  1. 因为内核只负责管 CPU、内存、硬件、文件这些底层工作,没有给人用的命令、没有界面,也没有配套工具。必须先打包一堆软件,才能变成"能用的操作系统"。
  2. 安卓手机的内核是 Linux。(顺便说一句,苹果的 macOS 和 iOS 走的是另一条路:Unix → macOS/iOS。所以"类 Unix 系统"有两个大分支:Unix 那一支和 Linux 这一支。)
  3. 错。Linux 是类 Unix(Unix-like)系统——借鉴了 Unix 的设计思想,但不是从 Unix 的代码改出来的。真正从 Unix 代码派生出来的是 macOS、iOS 这一支。

第2章 Linux 能用来做什么 🔰

学完这一章,你能:说出 Linux 主要用在哪几个地方,以及学会它能找什么样的工作。

2.1 服务器:Linux 的主战场

服务器就是"专门给别的电脑提供服务的电脑":网站、App 后台、数据库、文件存储,都跑在服务器上。

你在浏览器打开一个网页,背后可能是几十台 Linux 服务器在干活。银行、电商、12306 抢票、微信消息,全在 Linux 上跑。

2.2 云计算和容器

现在说的"云服务器""阿里云/腾讯云/AWS",绝大多数底层是 Linux。

你可能听过 Docker、Kubernetes(K8s)这些词——它们全是跑在 Linux 上的技术。学 Linux 是学云计算的前置条件。

2.3 你口袋里的安卓手机

安卓系统的内核就是 Linux。所以严格说,你早就在用 Linux 了,只是它被包装得很漂亮。

2.4 各种智能设备(嵌入式)

路由器、机顶盒、智能音箱、汽车中控、工业机器人、ATM 机、POS 刷卡机……这些设备里塞不下 Windows,但它们塞得下 Linux。这类开发叫嵌入式开发。

2.5 超级计算机

全世界跑得最快的那些超级计算机,操作系统几乎清一色是 Linux。因为只有开源才能把它们改到极致。

2.6 学完 Linux 能找什么工作

岗位 干什么 和 Linux 的关系
运维工程师 / Linux 运维 管服务器、装软件、排故障、做备份 天天用,最直接对口
云计算工程师 管云平台、容器、自动化部署 必会
网络工程师 配网络、防火墙、路由 要会用 Linux 配网络
测试 / 开发 部署环境、看日志 必须会基本命令
大数据 / 人工智能 装集群、跑任务 服务器全是 Linux
安全工程师 渗透测试、日志分析 Kali 就是 Linux

💡 小贴士:就算你不打算做运维,只要你的工作会碰到"服务器"这两个字,Linux 就是绕不过去的门槛。

本章小结

场景 说明
服务器 90% 以上,Linux 的主战场
云与容器 云主机、Docker、K8s 的底层
安卓 手机内核就是 Linux
嵌入式 路由器、车机、工业设备
超级计算机 几乎全是 Linux

动手练

  1. 举三个你身边可能正在运行 Linux 的设备。
  2. 为什么智能设备喜欢用 Linux,而不是 Windows?
  3. 如果你以后想做运维,这本书哪些部分最重要?

参考答案

  1. 参考:家里的路由器、安卓手机、智能电视/机顶盒。任何三个合理答案都可以。
  2. 因为 Linux 免费、可裁剪(只要内核和必需的工具,能做得非常小)、开源可定制,而且对硬件要求低、能长期稳定运行。Windows 体积大、要授权费、不适合深度剪裁。
  3. 第五篇(用户与权限)、第六篇(装软件)、第八篇(系统状态与排查)、第十篇(服务与网络)这几篇最常用,第一篇到第四篇是它们的地基。

第3章 我该选哪个版本 🔰

学完这一章,你能:认识常见的 Linux 发行版,并知道自己该装哪一个。

3.1 发行版是什么

第 1 章说过:内核是发动机,发行版是整车。同一个内核,不同厂家装出来的车,牌子、配置、用法都有差别。

这些"牌子"就叫发行版(distribution)。目前主流的可以分成两大流派,区别主要在装软件的工具不一样:

流派 代表系统 装软件命令 安装包后缀
Red Hat 系(红帽系) RHEL、CentOS、Rocky、Alma、麒麟、openEuler yum 或 dnf .rpm
Debian 系(德班系) Debian、Ubuntu、Kali、Deepin、UOS apt .deb

⚠️ 注意:这是新手最容易搞混的地方——网上的教程如果用的是 apt,而你的系统是 CentOS,那么 apt install 在你这儿就是不存在的命令。学习时一定要先确认教程是哪个流派。

3.2 Red Hat 系(国内企业最多)

发行版 是什么 一句话评价
RHEL 红帽企业版,收费但提供支持 企业正式用它,但个人不便宜
CentOS RHEL 的免费社区版(与 RHEL 高度兼容) 以前最流行的学习/服务器选择
CentOS Stream CentOS 的新形态,是 RHEL 的"上游测试版" 比 RHEL 更新,稳定性略低
Rocky Linux 原 CentOS 创始人另起炉灶,与 RHEL 兼容 CentOS 停更后的主流替代
AlmaLinux 另一个 RHEL 兼容版 同上,可与 Rocky 二选一
Fedora 红帽的个人版,技术新但更新快 想体验新东西可以玩,不适合服务器
Kylin(麒麟) 国产,政务/金融常见 国产化项目会碰到
openEuler(欧拉) 华为主导,国产服务器系统 国内服务器新项目常见

💡 关于 CentOS 7:CentOS 7 已于 2024 年 6 月停止维护。但国内大量存量服务器和教材还在用它,而且它足够老、足够稳定、资料最多,所以本书的示例以 CentOS 7 为准。学完换 Rocky 9 / Ubuntu 只是换几条命令的事。

3.3 Debian 系

发行版 是什么 一句话评价
Debian 社区维护,追求稳定 稳定到有点"旧",服务器上很常见
Ubuntu 基于 Debian,对新手最友好 最推荐的入门选择,资料最全
Kali Linux 基于 Debian,预装大量安全工具 搞网络安全用的,不适合日常
Deepin(深度)/ UOS(统信) 国产,桌面做得漂亮 国产桌面办公会碰到

3.4 Ubuntu 的版本号怎么读

Ubuntu 一年发两个版本,版本号是"年份.月份":

  • Ubuntu 20.04 = 2020 年 4 月发布
  • Ubuntu 22.04 = 2022 年 4 月发布
  • Ubuntu 24.04 = 2024 年 4 月发布

偶数年的 4 月版本(.04 结尾)是长期支持版(LTS),一般支持 5 年。装系统优先选 LTS。

3.5 那到底装哪个?

你的情况 建议
完全新手,想少踩坑,资料多 Ubuntu 22.04 LTS
跟本书学、以后要进企业做运维 CentOS 7(与本书一致),或 Rocky 9
公司/项目指定 按公司要求(国产化项目可能是麒麟、统信)
想学网络安全 先学 Ubuntu,熟悉后再用 Kali

⚠️ 注意:不用纠结。Linux 的内核、命令、目录结构、权限模型在所有发行版里是一样的,差别主要在"装软件"和"配网络"。学会一个,换另一个只需要一两天。

本章小结

概念 要点
发行版 内核 + 软件的打包成品,有很多"牌子"
两大流派 红帽系(yum/rpm)、Debian 系(apt/deb)
新手首选 Ubuntu 22.04 LTS
本书示例 CentOS 7
版本号 Ubuntu 用"年份.月份",选 .04 LTS

动手练

  1. 一个教程写着 sudo apt install nginx,另一个写着 sudo yum install nginx,分别适合什么系统?
  2. Ubuntu 24.04 是哪年哪月发布的?是长期支持版吗?
  3. 判断题:学会 CentOS 之后,Ubuntu 的命令要从头再学一遍。

参考答案

  1. apt 用于 Debian 系(Ubuntu、Debian、Kali);yum 用于红帽系(CentOS、RHEL、Rocky、麒麟)。
  2. 2024 年 4 月发布;是 LTS(长期支持版)。
  3. 错。绝大部分命令(ls、cd、chmod、ps……)完全通用,只有装软件(yum/apt)和部分网络配置文件的写法不同。

第4章 Linux 和 Windows 有什么不一样 🔰

学完这一章,你能:说出 Linux 和 Windows 最关键的 6 个差别,避免把 Windows 的习惯带到 Linux 里。

4.1 一张表看懂

对比项 Windows Linux
桌面 必须用鼠标点 用命令行敲(也能装桌面)
盘符 C 盘、D 盘 没有盘符,所有东西都在 / 下面
大小写 文件名不区分大小写 区分大小写(Tom.txt 和 tom.txt 是两个文件)
扩展名 靠 .exe 判断能不能运行 扩展名只是名字,能不能运行看权限
装软件 下载 exe 双击下一步 从软件仓库一条命令安装(yum/apt)
权限 管理员提示一下就过去了 严格,普通用户干不了管理员的事
回收站 有 往往没有(rm 删了就没了)
开关机 天天关 服务器常年不关机

下面挑最容易出事的几个详细说。

4.2 没有 C 盘 D 盘,所有东西都在 / 下面

Windows 里,文件可能放在 C:\Users\Tom\file.txt。Linux 里没有 C: 这种东西,所有硬盘、所有文件,都被"挂"在一棵以 /(读作"根")开始的树上。

# 看看根目录下有什么
ls /
# 你会看到类似这样:
bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

具体每个目录是干什么的,第 9 章会一个个讲。这里只要记住一句话:没有盘符,只有一个 /。

4.3 Linux 区分大小写!

这是新手第一周最常见的事故来源。

在 Linux 里:

  • File.txt、file.txt、FILE.TXT 是三个完全不同的文件。
  • 命令也是:ls 能运行,LS 会报错 command not found。

⚠️ 注意:敲命令和写文件名时,照着书上一字不差地敲,别自己"顺手"改大小写。

4.4 没有回收站,rm 删了就是删了

在 Windows 里删文件,它进回收站,你反悔了还能还原。

Linux 命令行里的 rm 直接删掉,不进回收站。而且它不会问你"确定吗"。

⚠️ 注意:第 13 章会专门讲怎么安全地删。现在先记住一句:执行 rm -rf 之前,先把命令念一遍再说。

4.5 权限很严格

在 Windows 里,你平时是管理员,装软件、改系统设置一般点个"是"就过了。

Linux 里分得很清楚:平时你就是个普通用户,很多事干不了;需要管理员权限时,要在命令前面加 sudo,然后输入自己的密码。

这不是 Linux 不友好,恰恰是它安全的原因——服务器上的一个误操作,可能让整个公司的业务挂掉。

# 普通用户想改系统配置,会被拒绝
cat /etc/shadow
# 你会看到:
cat: /etc/shadow: 权限不够

# 借用管理员身份来做
sudo cat /etc/shadow
# 输入你自己(当前用户)的密码后,就能看了

💡 小贴士:这里第一次见到 # 开头的注释和 sudo,不用深究,第 33 章讲 sudo,第 25 章讲权限。

4.6 靠命令行干活,而且效率极高

Linux 当然也能装图形界面,但服务器上通常不装,因为图形界面占内存、还容易出问题。

用命令行的好处是:能批量、能组合、能写成脚本自动跑。

举个直观的例子——你要找出 /var/log 下面今天改过的所有 .log 文件:

  • 用鼠标:一个个文件夹点开,看重的时间……点到天黑。
  • 用命令:一行,几秒钟。
find /var/log -name "*.log" -mtime -1

这就是为什么学 Linux 必须学命令行——它不是"高级玩法",它就是 Linux 的日常方式。

本章小结

差别 记住这句话
盘符 没有 C/D 盘,只有 / 一棵树
大小写 区分!Tom ≠ tom,LS ≠ ls
回收站 rm 删了就没有了
权限 严格,不够权要 sudo
装软件 从软件仓库一条命令装
操作方式 命令行为主,能批量、能自动化

动手练

  1. 判断题:在 Linux 里 Data.txt 和 data.txt 是同一个文件。
  2. 为什么服务器通常不装图形界面?
  3. 你在 Windows 里习惯"复制到 D 盘备份",在 Linux 里这句话要改成什么说法?

参考答案

  1. 错。Linux 区分大小写,两个不同的文件。
  2. 图形界面占内存和 CPU、组件多容易出问题、远程操作也不方便;命令行更轻、更稳、还能自动化。
  3. Linux 没有 D 盘,要"复制到某个目录",比如 cp 文件 /data/备份/——这里的 /data 是根目录下一个叫 data 的文件夹(它的背后可能是一块单独的硬盘)。

第5章 Linux 的三个核心思想 🔰

学完这一章,你能:理解 Linux 的设计逻辑,后面学命令时"秒懂"很多设计为什么是这样。

这三句话是 Linux 的"世界观"。第一次听可能没什么感觉,学完第三篇再回来看,你会发现处处都在印证它们。

5.1 一切皆文件

Linux 里,几乎所有东西都被当成"文件"来管理:

你以为是 Linux 当作
一块硬盘 文件 /dev/sda
一个 U 盘 文件 /dev/sdb
键盘、鼠标 文件 /dev/input/...
屏幕上要显示的字符 文件
一个正在运行的程序 文件 /proc/数字/
网卡 文件

有什么好处? 既然都是文件,那么一套读写文件的命令,就能操作所有东西。查看磁盘信息可以用 cat /proc/...,往设备里写数据也是"写文件",简单统一。

比喻:这就像一个公司把所有事项都办成"一份文件走流程"。不管你是请假、报销还是领电脑,都是填表走流程。规矩统一,好管。

5.2 一个命令只干一件事,组合起来干大事

Linux 的命令都很"小":ls 只负责列文件,grep 只负责按关键字过滤,awk 只负责按列取数。它们单个都很简单,但能用管道 | 串起来。

管道的含义很直白:把前一个命令的输出,直接交给后一个命令当输入。

# 需求:只看当前系统里正在监听的网络端口
ss -lnutp
# 输出很多,看着累

# 组合起来:只保留含 sshd 的那几行
ss -lnutp | grep sshd
# 你会看到类似:
tcp   LISTEN  0  128  0.0.0.0:22  0.0.0.0:*  users:(("sshd",pid=987,fd=3))

比喻:就像流水线。工位 A 只管拧螺丝,工位 B 只管装盖子,一个产品从 A 传到 B,最后出来的是成品。没有哪个工人会干全部的活,但流水线能干出很复杂的活。

这个思想会在第 17 章(管道)和第九篇(文本三剑客)里反复用到。

5.3 尽量少交互

"交互"就是"命令停下来等你按个 y 或 n"。

Linux 的设计倾向于:别停下来问我,要问就让我提前在命令里写好答案。

# 会停下来问你 "Is this ok [y/N]: ",要手敲 y 回车
yum install nginx

# 加 -y,表示"所有问题都替我回答 yes",一路装到底
yum install -y nginx

好处:可以把它写成脚本,让机器半夜自己跑,不用人守着。这也是"自动化运维"的基础。

5.4 顺带说说:开源和许可证

既然 Linux 是开源的,那"开源"到底是怎么规定的?靠许可证(License)。你只需要知道最常见的三种:

许可证 通俗理解 典型代表
GPL 你用了我的开源代码,你的程序也必须开源(有"传染性") Linux 内核
MIT 随便用,保留版权声明就行,可以闭源、可以商用 Vue、React、Redis
Apache 2.0 比 MIT 多一条:改动过的文件要说明 Hadoop、Kubernetes

💡 小贴士:做开发的同学要注意——GPL 的代码不能随便用进闭源的商业软件,否则可能被要求开源。这是真实存在的法律风险。

本章小结

核心思想 一句话 后面的章节
一切皆文件 硬盘、网卡、程序都是文件,一套命令都能操作 第 9 章、第 40 章
小命令 + 组合 每个命令只干一件事,用管道串起来干大事 第 17 章、第九篇
尽量少交互 用参数提前回答,方便自动化 第 35 章、第 50 章
开源许可证 GPL 有传染性、MIT 最宽松 —

动手练

  1. 判断题:既然"一切皆文件",那用 cat 命令读一块硬盘的数据,理论上是可行的。
  2. 用一句话解释管道 | 是干什么的。
  3. yum install 和 yum install -y 的区别是什么?为什么运维更喜欢后一种?

参考答案

  1. 对。硬盘在 Linux 里就是 /dev/sda 这样的文件,cat /dev/sda 确实能读出二进制数据(但会刷满屏幕,实践中用 dd 等工具)。
  2. 管道把前一个命令的输出,交给后一个命令当输入,像流水线一样把两个简单命令拼成复杂功能。
  3. yum install 会中途停下来问你是否确认;yum install -y 自动回答"是"。运维喜欢后一种,因为可以在脚本里无人值守地批量安装。

第二篇 走进 Linux

这一篇开始真正动手。你会第一次登进 Linux,看懂那个黑窗口里每一段字的意思, 然后学会最基本的几个命令。别怕敲错——在虚拟机里,敲坏了删掉重来就是。

第6章 第一次登录 Linux 🔰

学完这一章,你能:把自己"送进"Linux 系统,干完活再安全地退出来。

6.1 登录,就是进自己家的门

Linux 是一台"多人共用"的机器,每个人有自己的账号和密码,像一栋楼里每户人家有自己的钥匙。 登录 = 交出名字和密码,系统确认"哦,是你",然后把工作台交给你。

进 Linux 有两扇门:本地登录(人坐在虚拟机屏幕前直接敲)和远程登录(用你自己的 Windows 电脑,通过网络连服务器)。日常干活 99% 是远程。

6.2 本地登录:开机后出现 login:

系统启动完,屏幕最后一行会停下来等你:

# 屏幕显示(光标在冒号后闪):
localhost login:
# 输入用户名 root,回车,接着出现:
Password:

这时你敲键盘,屏幕上一个字符都不显示。不是键盘坏了,是 Linux 故意不显示密码,防止偷看。 把密码敲完回车,对了就会看到:

[root@localhost ~]#

这行字叫提示符,意思是"我准备好了,请下命令"。第7章会逐字拆解它。

💡 小贴士:root 的密码是装系统时设的。密码区分大小写,Abc123 和 abc123 不是一回事。

6.3 远程登录:用自己电脑连服务器

在 Windows 上按 Win + R,输入 cmd 回车,打开命令提示符,然后敲:

ssh root@192.168.8.120
# 第一次连接会看到:
The authenticity of host '192.168.8.120' can't be established.
Are you sure you want to continue connecting (yes/no)?

这里输入 yes 再回车(必须打完整的 yes,只打 y 不算),然后输入密码,看到下面这行就成功了:

[root@Server120 ~]#

💡 小贴士:SSH 就像给服务器打了个电话。电话通了,你的键盘和屏幕就接到服务器上;挂掉电话(关窗口),服务器还在跑,活也没停。

6.4 干完活,怎么退出

exit
# 远程登录时你会看到:
Connection to 192.168.8.120 closed.

6.5 常见坑 ⚠️

  • 密码敲了没反应:正常,接着敲完回车,别反复按回车。
  • # 不是让你敲的:[root@localhost ~]# 整行都是提示符,命令从 # 后面的空格开始。
  • 登录失败别连试十次:有些系统会锁账号,先检查用户名大小写和键盘布局。
  • 远程连不上:先 ping 服务器IP,网络不通时输多少次密码都没用。

本章小结

操作 命令/现象 说明
本地登录 localhost login: root 输密码时屏幕无显示是正常的
登录成功 [root@localhost ~]# 出现提示符才能敲命令
远程登录 ssh root@服务器IP 第一次要输入完整的 yes
退出登录 exit 关掉当前连接

动手练

  1. 用自己的话说明:为什么输入密码时屏幕上什么都不显示?
  2. 远程登录 IP 为 192.168.8.120 的服务器,用户名 root,写出完整命令。
  3. 登录成功后,看屏幕上什么位置能判断"可以开始敲命令了"?

参考答案:

  1. 防止旁边的人看到密码,Linux 连星号都不显示,这是正常的,照常输完回车即可。
  2. ssh root@192.168.8.120;第一次连接输入 yes,再输入 root 密码。
  3. 看有没有出现提示符 [root@Server120 ~]#,光标在最右边闪,就可以敲命令了。

第7章 看懂终端里那行字 🔰

学完这一章,你能:一眼看出"我是谁、我在哪台机器上、我站在哪个文件夹",不再对着提示符发懵。

7.1 提示符:终端在"问你话"

登录成功或敲完一条命令后,屏幕上总有一行字停在那里,光标在最后闪:

[root@localhost ~]#

这行字不是命令,也不是报错,它叫提示符。它其实在回答三个问题:你是谁、你在哪台机器上、你现在站在哪个文件夹里。

把它想成电梯里的楼层显示屏:告诉你现在在几层、能去哪几层,看懂了才不会按错按钮。

7.2 逐段拆解 [root@localhost ~]#

片段 含义 举例
[ ] 把提示符框起来,没实际作用 —
root 当前登录的用户名 普通用户 tom 显示 tom
@ 分隔符,读作"在" —
localhost 主机名,这台机器叫什么 也可能叫 Server120
~ 当前所在文件夹,~ 是家目录 在 /etc 时显示 etc
# 权限标志,# = root,$ = 普通用户 见 7.3
最后空格 光标停在这,等你敲命令 —

注意:提示符里的文件夹只显示最后一段名字。站在 /etc/sysconfig/network-scripts 时,它只显示 network-scripts。想看完整路径,敲 pwd。

7.3 # 和 $:一眼看出自己的权限

[root@localhost ~]#      # root 用户,最高权限,能改任何东西
[tom@localhost ~]$       # 普通用户 tom,权限受限
  • 看到 #,说明你是 root,这时的命令都是"没有保险的命令",删除、改配置直接生效,慢点敲。
  • 看到 $,说明你是普通用户。有些操作报"权限不够"不是你敲错了,是权限不够(第33章用 sudo 解决)。

⚠️ 注意:# 在配置文件里还有另一个身份——"注释",表示这一行不算数。提示符里的 # 只是装饰。

7.4 用命令验证提示符里的信息

whoami
# 你会看到:
root

hostname
# 你会看到:
localhost

pwd
# 你会看到:
/root

三行输出正好对应提示符的三段:用户名、主机名、所在文件夹。pwd 输出 /root,这就解释了为什么提示符里写 ~——root 的家目录就是 /root。

7.5 常见坑 ⚠️

  • 把提示符一起复制进终端:网上抄命令时连 [root@localhost ~]# 一起粘进去,必然报 command not found。只复制 # 后面那部分。
  • 以为 ~ 是根目录:~ 是家目录(root 是 /root,普通用户是 /home/用户名),根目录是 /,两码事。
  • 提示符变了就慌:[root@localhost etc]# 只是你进了 /etc,不是出错。

本章小结

你看到的 含义 记法
root 当前用户名 @ 前面
localhost 主机名 @ 后面
~ 家目录 root → /root
etc 当前在 /etc(只显示最后一段) 用 pwd 看全路径
# 超级管理员 root 危险,慢点敲
$ 普通用户 权限受限

动手练

  1. 提示符是 [root@localhost ~]#,现在你是哪个用户?用命令验证。
  2. 这个 ~ 具体是哪个文件夹?用命令证明。
  3. 提示符变成 [tom@localhost ~]$,你能判断出哪两件事?

参考答案:

  1. whoami,输出 root。
  2. pwd,输出 /root——root 的家目录就是 /root。
  3. ① 当前是普通用户 tom($ 号);② 你在名为 localhost 的机器上,站在 tom 的家目录 /home/tom 里。

第8章 命令是怎么组成的 🔰

学完这一章,你能:把一条命令拆成"命令、选项、参数"三块看懂,敲错了知道错在哪。

8.1 一条命令 = 命令 + 选项 + 参数

在饭馆点菜:"来一碗牛肉面,大份,不要香菜"。牛肉面是命令(要做的事),大份是选项(怎么做的细节),不要香菜是参数(对谁做)。

格式固定成一句话:命令 选项 参数,中间用空格隔开。比如 ls -l /etc:命令 ls、选项 -l、参数 /etc。

8.2 最小可用写法 + 完整示例

ls -l /tmp
# 你会看到(每个文件一行,含权限、大小、时间):
总用量 4
-rw-r--r--. 1 root root 12 10月 30 18:40 a.txt
drwxr-xr-x. 2 root root  6 10月 30 18:35 dir1

只要记住三件事:命令必须存在、选项必须真实、参数(路径)必须存在,三者有一个不对就报错。

8.3 短选项和长选项

同一个功能通常有两种写法,效果一样:

短选项 长选项 作用
-a --all 显示所有文件,含隐藏文件
-h --human-readable 文件大小带单位(K/M/G)

-l、-a、-h 是新手最先要记的三个。短选项可以合并:ls -l -a = ls -la = ls -al;长选项不能合并,要一个一个写。

8.4 命令敲错了,会看到什么

屏幕上的报错 意思 怎么改
command not found 没这个命令 拼错、大小写错,或软件没装
invalid option 没这个选项 查 --help,别自己猜
No such file or directory 文件或路径不存在 用 ls 看路径在不在
Permission denied 权限不够 不是敲错,是权限问题(第25章)

Linux 区分大小写:ls 能跑,LS、Ls 一律 command not found。

8.5 忘了怎么用:--help 和 man

ls --help    # 一屏英文帮助,列出所有选项
man ls       # 帮助手册:空格翻页,q 退出,/name 搜索

--help 短平快,man 详细权威。新手先看 --help,基本够用。

8.6 常见坑 ⚠️

  • ls-l 中间没空格:整串被当成一个命令名,报 command not found。
  • 中文输入法没切:打出全角空格 、中文逗号 ,,终端不认,报的错还看不出原因。
  • 复制带提示符:连 # 一起粘进去,等于让 shell 去找一个叫 # 的命令。

本章小结

成分 作用 例子
命令 做哪件事 ls、pwd、cd
选项 怎么做的细节,一般带 - -l、-a、--all
参数 对谁做(文件/目录) /etc、a.txt
--help 短帮助 ls --help
man 手册,q 退出 man ls

动手练

  1. ls -lh /etc 里,命令、选项、参数分别是什么?
  2. 想让 ls 同时显示隐藏文件和详细信息,最短怎么写?
  3. 为什么 ls -l(中间是全角空格)会报错?

参考答案:

  1. 命令 ls,选项 -lh(= -l + -h),参数 /etc。
  2. ls -la(或 ls -al)。
  3. 全角空格 和英文空格不是同一个字符,shell 不把它当分隔符,整串被当成一个命令,所以报 command not found。

第9章 认识目录树:文件都放在哪 🔰

学完这一章,你能:像查门牌号一样,用路径准确说出"某个文件在哪",不再到处乱翻。

9.1 Linux 里只有一棵树

Windows 有 C 盘、D 盘、U 盘,各是各的"独立王国"。Linux 不一样:所有东西都挂在唯一的一棵树下面,这棵树的树根叫根目录,写法是一个斜杠 /,所有文件夹、硬盘、U 盘都从 / 往下长:

/
├── etc        配置文件
├── home       普通用户的家
├── root       root 的家
├── usr        软件安装的地方
└── var        日志、数据

💡 小贴士:U 盘插进 Linux 后不是多出一个"F 盘",而是被挂载到某个文件夹上(比如 /media),那个文件夹就代表这个 U 盘。

9.2 根目录下各文件夹是干什么的

文件夹 放什么 新手会碰到的例子
/etc 系统和服务的配置文件 /etc/passwd、网卡配置
/home 普通用户的家目录 /home/tom
/root root 的家目录 只有 root 能进
/usr 系统和软件的程序文件 /usr/bin/ls
/var 经常变的数据:日志、数据库 /var/log/messages
/tmp 临时文件,谁都能写 练习文件放这

不用背,先记住:/etc 改配置、/var/log 看日志、/home 放自己的东西、/tmp 随便练。

9.3 绝对路径:从 / 开始说

绝对路径 = 从根目录 / 一路写下来,不管你现在在哪,它都指向同一个地方。

cd /etc/sysconfig/network-scripts
pwd
# 你会看到:
/etc/sysconfig/network-scripts

9.4 相对路径:相对于"我现在在哪"

相对路径 = 不以 / 开头,从你当前站的位置算起。三个符号先记牢:

写法 意思 例子
. 当前目录 ./a.txt = 当前目录下的 a.txt
.. 上一级目录 cd .. 回上一层
../.. 上两级 cd ../.. 回上两层
cd /etc/sysconfig
cd network-scripts      # 相对路径:进 /etc/sysconfig 下的 network-scripts
pwd
# 你会看到:
/etc/sysconfig/network-scripts

9.5 常见坑 ⚠️

  • cd /root 和 cd root 完全不同:前者是根目录下的 root 文件夹,后者是当前目录里名叫 root 的子文件夹。
  • .. 别写成 .:cd .. 是上一层,cd . 是原地不动,你会觉得"没反应"。
  • 在根目录再 cd ..:/ 的上一层还是 /,不报错,容易把自己绕晕。随时用 pwd 确认。
  • 相对路径换个地方就失效:在 /etc 下能 cd sysconfig,跑到 /root 下再敲就报错。拿不准就用绝对路径。

本章小结

概念 写法 说明
根目录 / 整个文件树的起点,唯一
绝对路径 /etc/passwd 从 / 开始,到哪都认
相对路径 sysconfig/、./a.txt 从当前位置算起
家目录 ~ root 是 /root
我在哪 pwd 迷路就敲它

动手练

  1. 你当前在 /etc,用相对路径回到根目录 /。
  2. 当前在 /usr/share/doc,用绝对路径进入 /var/log。
  3. cd root 和 cd /root 有什么区别?

参考答案:

  1. cd ..(/etc 的上一层就是 /)。
  2. cd /var/log。
  3. cd /root 是绝对路径,去根目录下的 root 文件夹;cd root 是相对路径,去当前目录下名叫 root 的子文件夹。在 / 下两者碰巧一样,换个目录就完全不同。

第10章 必学的五个基础命令 🔰

学完这一章,你能:随时回答"我在哪、这里有什么、怎么去别处",终端不再让你迷路。

10.1 pwd:我在哪

在商场找店铺,第一件事是看楼层指示牌。pwd 就是那块牌子:打印你现在站的位置。

pwd
# 你会看到:
/root

10.2 ls:这里有什么

ls
# 你会看到当前文件夹里的名字:
anaconda-ks.cfg  dir1  a.txt
ls -l
# 你会看到详细信息(权限、属主、大小、时间、名字):
总用量 4
-rw-------. 1 root root 1584 9月  20 16:09 anaconda-ks.cfg
drwxr-xr-x. 2 root root    6 10月 30 18:35 dir1

-l 详细列表、-a 含隐藏文件(以 . 开头)、-h 大小带单位。先记 ls -lh。

10.3 cd:我去哪(本章重点)

cd /var/log        # 绝对路径:从根开始
cd sysconfig       # 相对路径:从当前位置开始
cd ..              # 回上一层
cd -               # 回到上一次所在的目录

最容易被搞混的几条,必须记牢:

写法 去哪 说明
cd 家目录 不带参数就是回家
cd ~ 家目录 ~ 就是家目录,和 cd 一样
cd / 根目录 整棵树的最顶层
cd /root root 的家目录 root 家目录是 /root
cd /home/tom tom 的家目录 普通用户是 /home/用户名

cd 和 cd ~ 是"回家",cd / 是"去整台机器的根"——这是新手最容易混的一对。

10.4 clear 和 history:让终端清爽一点

clear          # 清屏,快捷键 Ctrl + L 效果一样
# 你会看到:屏幕清空,提示符回到左上角
history        # 列出敲过的命令,带编号
history 10     # 只看最近 10 条
!2             # 重新执行编号为 2 的命令

clear 只擦屏幕,不删文件和历史。按上方向键也能翻出刚敲的命令,比 history 更常用。

10.5 常见坑 ⚠️

  • cd 后面没写就回车:不是没反应,是回家了,用 pwd 确认。
  • cd / 和 cd ~ 当成一回事:一个去根目录,一个回家目录,差很远。
  • clear 以为删了东西:只清屏,文件和命令历史都还在。

本章小结

命令 作用 最常用写法
pwd 我在哪 pwd
ls 这里有什么 ls -lh
cd 去哪 cd /var/log、cd ~、cd ..
cd / 去根目录 不是回家
clear 清屏 clear 或 Ctrl + L
history 历史命令 history 10、!编号

动手练

  1. 登录后不确定自己在哪,敲什么命令?
  2. 从 /etc/sysconfig 回到 /etc,最短怎么写?
  3. 说出 cd、cd ~、cd / 分别去哪里。

参考答案:

  1. pwd。
  2. cd ..。
  3. cd 和 cd ~ 都回家目录(root 是 /root,普通用户是 /home/用户名);cd / 去根目录 /。

第三篇 文件和目录

这一篇讲 Linux 里最日常的活:新建、复制、查看、改名、删除。 学完这一篇,你就能自己整理文件、找到东西,并且知道怎么删才安全。

第11章 创建文件与文件夹:touch 和 mkdir 🔰

学完这一章,你能:想要一个空文件、一个空文件夹(目录),随手就能建出来。

11.1 两个命令的分工

mkdir 是盖一间空房间(建文件夹),touch 是往房间里放一张白纸(建空文件)。一个管容器,一个管内容。

11.2 touch:建一个空文件

cd /tmp
touch a.txt
ls -l a.txt
# 你会看到(大小是 0,说明是空文件):
-rw-r--r--. 1 root root 0 10月 30 18:40 a.txt

一次建多个,用空格隔开:

touch b.txt c.txt d.txt
ls
# 你会看到:a.txt b.txt c.txt d.txt 都在

touch 还有第二个用途:更新文件时间。对已存在的文件敲 touch,内容不会被清空,只是"最后修改时间"变成现在。

11.3 mkdir:建一个空文件夹

cd /tmp
mkdir dir1
ls -ld dir1
# 你会看到(开头是 d,表示 directory 文件夹):
drwxr-xr-x. 2 root root 6 10月 30 18:41 dir1

-p 是最有用的选项:父目录不存在就一起建出来,目标已存在也不报错。

mkdir -p /tmp/project/src/main
cd /tmp/project/src/main
pwd
# 你会看到:
/tmp/project/src/main

不用 -p 直接建多层,系统会报 No such file or directory,因为中间那层 project 还不存在。

11.4 常用写法小表

想做什么 写法
建一个空文件 touch a.txt
一次建多个文件 touch a.txt b.txt c.txt
建一个空文件夹 mkdir dir1
一次建多层文件夹 mkdir -p a/b/c
看文件夹本身的信息 ls -ld dir1

11.5 常见坑 ⚠️

  • touch 建不了文件夹:touch mydir 建的是名叫 mydir 的文件。要文件夹就用 mkdir。
  • mkdir 忘了 -p:建多层路径直接报 No such file or directory。
  • 文件名带空格:mkdir my dir 会建出两个文件夹。要带空格得写 mkdir "my dir",但更建议用下划线。
  • 以为不区分大小写:A.txt 和 a.txt 是两个不同的文件。
  • 用 rmdir 删目录:它只能删空目录,里面有一个文件就报错。真删目录用第13章的 rm -r。

本章小结

命令 作用 例子
touch 文件名 建空文件 / 更新时间 touch a.txt
touch 多个文件 一次建一批 touch 1.txt 2.txt
mkdir 文件夹 建文件夹 mkdir dir1
mkdir -p 多层 连父目录一起建 mkdir -p a/b/c
ls -ld 查看文件夹本身的信息 ls -ld dir1

动手练

  1. 在 /tmp 下建一个空文件 note.txt,并写出查看它大小的命令。
  2. 在 /tmp 下建出三层文件夹 /tmp/web/html/static,一条命令完成。
  3. 怎么确认建出来的是"文件夹"而不是"文件"?

参考答案:

  1. touch /tmp/note.txt;ls -l /tmp/note.txt,大小显示 0。
  2. mkdir -p /tmp/web/html/static。
  3. ls -ld /tmp/web,输出开头是 d(drwxr-xr-x)就是文件夹。

第12章 复制、移动、重命名:cp 和 mv 🔰

学完这一章,你能:把文件复制一份做备份、搬到别的文件夹、原地改个名字,都不会弄丢原件。

12.1 一个复印机,一个搬家公司

cp 像复印机:原件还在,多一份副本。 mv 像搬家公司:东西搬走了,原处就没了;如果只是从一个房间挪到隔壁,那就是"改名"。

12.2 cp 的最小写法

格式永远是 cp 源文件 目标:目标写"新名字"就是复制并改名,写"文件夹"就是复制进去、名字不变。

cd /tmp
echo "hello linux" > a.txt
cp a.txt b.txt          # 复制并改名
cp a.txt dir1/          # 复制到 dir1 文件夹里
ls
# 你会看到:a.txt  b.txt  dir1

12.3 复制文件夹:必须加 -r

mkdir -p dir1/sub
cp dir1 dir2
# 你会看到报错:
cp: 略过目录 'dir1'
cp -r dir1 dir2
ls dir2
# 你会看到:
sub

-r 是递归:连文件夹里面的东西一起复制。复制目录忘了它,一定失败。

12.4 mv:移动、剪切、改名

mv b.txt c.txt          # 原地改名:b.txt 变成 c.txt
mv c.txt dir1/          # 移动到 dir1 文件夹
mv dir1 /tmp/dir1_new   # 文件夹也能移动、改名

同一个文件夹里 mv = 改名;mv 到另一个文件夹 = 剪切。 不管哪种,原位置都不会再留着。

12.5 覆盖:同名文件会怎样

目标位置已经有同名文件时,cp 和 mv 默认直接覆盖,没有回收站、没有提示。

不过 CentOS 7 的 root 账号默认加了 -i 别名,覆盖前会问你一句:

cp a.txt b.txt
# 你会看到(问你是否覆盖):
cp: 覆盖 'b.txt' 吗?
# 输入 y 回车 = 覆盖;输入 n 回车 = 不覆盖

看到提示别慌,这是好事。没看到提示就直接覆盖了也正常,说明没有这个别名,操作前自己要先想清楚。

12.6 常见坑 ⚠️

  • 复制目录忘 -r:报 略过目录,目录根本没复制成功。
  • 把"移动"当成"备份":mv 之后原位置什么都没有了,要备份请用 cp。
  • 目标写错:cp a.txt /tmp 是复制进 /tmp;cp a.txt /tmp/newname 是复制并改名。写之前用 ls 确认目标存在。

本章小结

命令 作用 例子
cp 源 目标 复制文件 cp a.txt b.txt
cp -r 目录 目标 复制整个文件夹 cp -r dir1 dir2
mv 源 新名 改名 mv a.txt c.txt
mv 文件 目录/ 移动(剪切) mv a.txt /tmp/
覆盖 默认直接覆盖 先备份再操作

动手练

  1. 把 /etc/hostname 复制到 /tmp,命令怎么写?原件还在吗?
  2. 把 /tmp/a.txt 改名为 /tmp/hello.txt。
  3. 复制 /tmp/dir1 整个文件夹到 /tmp/dir3,命令怎么写?

参考答案:

  1. cp /etc/hostname /tmp/;原件 /etc/hostname 还在,/tmp 下多了一个副本。
  2. mv /tmp/a.txt /tmp/hello.txt。
  3. cp -r /tmp/dir1 /tmp/dir3。

第13章 删除:rm 🔰

学完这一章,你能:安全地删掉不要的文件,并且真正明白"为什么删之前要停三秒"。

13.1 rm 是一台碎纸机

Windows 删除是丢进回收站,后悔还能捞回来。Linux 的 rm 是碎纸机:纸进去就成碎片,没有回收站,删了就没了。这一章所有注意事项,都是从这一句话来的。

13.2 最小可用:删一个文件

cd /tmp
touch del.txt
ls
# 你会看到:del.txt 在列表里
rm del.txt
ls
# 你会看到:del.txt 已经不在列表里了

删的时候没有任何提示,也不问你确认。

13.3 删文件夹:-r 和 -f

rm dir1
# 你会看到报错(rm 默认不删文件夹):
rm: 无法删除 'dir1': 是一个目录
rm -r dir1        # 递归删除:文件夹和里面的东西一起删
rm -rf dir1       # 强制删除:不提示、不报错、直接删(和上一条二选一)
选项 意思 什么时候用
无选项 删文件 删单个文件
-r 递归,删文件夹及其内容 删文件夹
-f 强制,不提示不报错 确定要删、不想被打断
-rf 递归 + 强制 最危险,删文件夹不留余地
-i 每个文件都问一遍 想稳妥时手动加

13.4 真实后果:删错了会发生什么

  • 删掉 /etc 下的配置文件,对应的服务重启后直接起不来,网络、远程登录都可能断掉。
  • 删掉数据库目录,数据只能从备份恢复;没有备份就是永久丢失。
  • 在 /etc 里敲 rm -rf ./*,会把当前文件夹里的所有东西全删掉——它删的是你站的地方。
  • rm -rf / 是想删掉整个系统。新版本的 rm 会拒绝执行并提示危险,但千万别去试绕过它的参数,那是真的会把系统删没。

⚠️ 注意:-f 会把报错也吞掉,看起来"很顺利",其实可能已经删过头了。越是安静,越要回头看。

13.5 三个安全习惯(请背下来)

  1. 删之前先 ls:把 rm 换成 ls 敲一遍,看看这条命令到底会选中哪些文件,确认了再删。
  2. 回车前从右往左读一遍路径:重点看 / 和空格。rm -rf /data/logs 和 rm -rf / data logs 是两条完全不同的命令。
  3. 重要的先备份,不确定的先预览:用 echo 把通配符展开看一眼(第16章),或者先把文件移到 /tmp 放几天。

13.6 常见坑 ⚠️

  • 以为删错了能恢复:不能。极少数情况可以靠专业工具,但别指望。
  • rm -rf 手滑多打一个空格:空格会把一条命令拆成几条,后果不可控。
  • rm ./* 和 rm * 是一回事:都删当前目录全部,区别只是 ./ 写得明白一点。
  • 脚本里 rm -rf $DIR 而 $DIR 是空的:命令会变成危险的样子。写脚本时先判断变量不为空。

本章小结

命令/概念 作用 说明
rm 文件 删文件 不提示,不可恢复
rm -r 目录 删文件夹 连同里面内容一起删
rm -rf 目录 强制删文件夹 最危险,吞掉报错
rm -i 文件 逐个确认 稳妥,CentOS 7 的 root 默认带
回收站 没有 删掉就是删掉

动手练

  1. 删掉 /tmp 下的 del.txt,要求先预览再删,写出两条命令。
  2. rm -r 和 rm -rf 有什么区别?什么时候千万不能用 -rf?
  3. 同事让你在 /etc 下执行 rm -rf ./*,你应该怎么做?

参考答案:

  1. ls /tmp/del.txt 确认存在,再 rm /tmp/del.txt。
  2. -r 只负责递归删文件夹,删不掉的会报错;-f 强制、不提示、不报错。路径不明确、通配符没预览过时千万不能用 -rf。
  3. 停下来问清楚要删什么,先 ls ./* 看清楚;/etc 是系统配置目录,这条命令会毁掉系统,不能执行。

第14章 查看文件内容:cat、more、less、head、tail 🔰

学完这一章,你能:不管文件多长多短,都挑对命令看清楚它的内容。

14.1 五个命令各管一段

想象手里有一本厚书:cat 是把整本书摊在桌上,less 是一页页翻,more 是只能往后翻,head 是只看开头几页,tail 是只看最后几页。

14.2 cat:短文件,一次看完

cat /etc/os-release
# 你会看到:
NAME="CentOS Linux"
VERSION="7 (Core)"
...

加 -n 显示行号,找行、报错定位都靠它:

cat -n /etc/os-release
# 你会看到:
     1  NAME="CentOS Linux"
     2  VERSION="7 (Core)"

cat 文件1 文件2 可以把几个文件连着输出。

14.3 less 和 more:长文件,翻着看

less /etc/passwd
# 你会看到:整屏内容,底部显示 : 或 (END)
# 按 空格 翻一屏,回车 翻一行,按 q 退出
按键 作用
空格 往下一屏
b 往上一屏(less 才有)
/关键字 向下搜索,n 下一个,N 上一个
q 退出

more 和 less 用法几乎一样,但 more 只能往下翻,翻过头只能按 q 退出重来。所以长文件优先用 less。

14.4 head 和 tail:只看头和尾

head /etc/passwd          # 默认前 10 行
head -n 3 /etc/passwd
# 你会看到:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
tail -n 2 /etc/passwd     # 最后 2 行

tail -f 是看日志的神器:它不退出,一直盯着文件末尾,有新内容就立刻显示,看完按 Ctrl + C 退出。例如 tail -f /var/log/messages。

14.5 常见坑 ⚠️

  • 用 cat 打开大日志:几十万行刷屏,滚半天。先 head 看头,再 less 翻。
  • 用 cat 看压缩包或二进制文件:满屏乱码,还会把终端搞乱(敲 reset 恢复)。先用 file 文件名 看类型。
  • tail -f 之后退不出去:它在等新日志,按 Ctrl + C 才停。
  • Permission denied:不是命令写错,是没权限读这个文件(第25章)。

本章小结

命令 适合 关键写法
cat 短文件一次看完 cat -n 文件
less 长文件上下翻、搜索 q 退出、/ 搜索
more 长文件只看下去 空格翻页,不能回头
head 看开头 head -n 5 文件
tail 看结尾、盯日志 tail -n 5、tail -f

动手练

  1. 想只看 /etc/passwd 的前 3 行,命令怎么写?
  2. 打开一个大日志文件,想边看边搜索关键字 error,用哪个命令、按什么键?
  3. 实时监控 /var/log/messages 的新内容,命令怎么写?怎么退出?

参考答案:

  1. head -n 3 /etc/passwd。
  2. less /var/log/文件名,输入 /error 回车,n 跳到下一个,q 退出。
  3. tail -f /var/log/messages,按 Ctrl + C 退出。

第15章 软链接与硬链接 🔧

学完这一章,你能:看懂 ls -l 里的 l 和 ->,知道链接坏了是怎么回事;第一遍只要理解比喻,不必背命令。

15.1 两个比喻先记住

  • 硬链接 = 同一个人的两个名字。人只有一个(文件只有一份),身份证号(inode)也只有一个,只是名字有两个。叫哪个名字,来的都是同一个人。
  • 软链接 = 快捷方式。桌面上那个图标不是文件本身,只是一张写着"文件在那边"的纸条;原文件被删,快捷方式就打不开了。

💡 一句话说 inode:inode 是文件的"身份证",记录文件的大小、权限、数据放在哪;内容不变,inode 编号就不变。

15.2 硬链接:ln

cd /tmp
echo "hello linux" > a.txt
ln a.txt a_hard
ls -li a.txt a_hard
# 你会看到(第一列 inode 编号相同,第三列硬链接数是 2):
16777219 -rw-r--r--. 2 root root 12 10月 30 18:50 a.txt
16777219 -rw-r--r--. 2 root root 12 10月 30 18:50 a_hard

两个名字、一个 inode,就是同一个文件。删掉其中一个,另一个还能正常打开。

15.3 软链接:ln -s

ln -s a.txt a_soft
ls -l a_soft
# 你会看到(开头是 l,末尾有 -> 指向原文件):
lrwxrwxrwx. 1 root root 5 10月 30 18:50 a_soft -> a.txt

软链接自己是一个独立的小文件,里面只存着"原文件在哪"。所以:

rm a.txt
cat a_hard
# 你会看到:
hello linux
cat a_soft
# 你会看到:
cat: a_soft: 没有那个文件或目录

硬链接 a_hard 还是好的,软链接 a_soft 已经失效。

15.4 硬链接和软链接的区别

对比 硬链接 ln 软链接 ln -s
本质 同一个文件的另一个名字 指向别处的快捷方式文件
inode 和原文件相同 自己独立
能否跨文件系统 不能 能
能否指向目录 不能(系统禁止) 能
删原文件后 照样能打开 失效
ls -l 看 普通文件,硬链接数 +1 l 开头,带 ->

15.5 常见坑 ⚠️

  • ln -s 忘了写 -s:变成硬链接,本想删链接结果动了原文件。
  • 软链接用相对路径:ln -s a.txt /tmp/a_soft 里的 a.txt 是按链接所在目录算的,链接一挪就失效。给软链接指路时尽量写绝对路径:ln -s /tmp/a.txt /tmp/a_soft。
  • 给目录建硬链接:Linux 系统层面就禁止,root 也不行,会直接报错,这不是你操作错了。
  • 把硬链接当备份:它不是副本,文件内容一改,两个名字看到的都变。

本章小结

命令/概念 作用 说明
ln 源 新名 建硬链接 同一个 inode
ln -s 源 新名 建软链接 类似快捷方式
ls -l 看是不是软链接 l 开头、带 ->
ls -li 看 inode 编号 第一列相同 = 同一文件
inode 文件"身份证" 不包含文件名

动手练

  1. 在 /tmp 建文件 x.txt,为它建一个硬链接 x_hard,用什么命令?
  2. 怎么用一条命令证明 x.txt 和 x_hard 是同一个文件?
  3. 软链接指向的原文件被删了,软链接会怎样?

参考答案:

  1. ln /tmp/x.txt /tmp/x_hard。
  2. ls -li /tmp/x.txt /tmp/x_hard,两行第一列 inode 编号相同。
  3. 软链接还在,但打开会报 没有那个文件或目录(失效了);ls -l 看它还是 l 开头、带 ->。

第16章 通配符和花括号:一次处理一批文件 🔰

学完这一章,你能:用一个"模式"同时点名一批文件,批量删除、复制、创建不再一个个敲。

16.1 通配符就是"点名时说的姓什么"

老师点名:"姓张的同学站起来。"这一句能叫起一片人。通配符就是让 shell 帮你把"一片文件"写成一句话,命令照着展开。

先准备练习素材:

mkdir -p /tmp/prac
cd /tmp/prac
touch file1.txt file2.txt file3.txt file10.txt note.txt data.log
ls
# 你会看到:
data.log  file1.txt  file10.txt  file2.txt  file3.txt  note.txt

16.2 *:任意多个字符

ls *.txt
# 你会看到:
file1.txt  file10.txt  file2.txt  file3.txt  note.txt
ls file*.txt
# 你会看到(file10 排在 file2 前面,因为它是按字符逐个比大小的):
file1.txt  file10.txt  file2.txt  file3.txt

* 可以代表零个、一个、多个任意字符,是最常用的通配符。

16.3 ? 和 []:精确一点

ls file?.txt
# 你会看到(? 只代表一个字符):
file1.txt  file2.txt  file3.txt
ls file[12].txt
# 你会看到:
file1.txt  file2.txt
写法 意思 例子
* 任意多个字符 *.txt 所有 txt 文件
? 正好一个字符 file?.txt 匹配 file1、file2、file3
[abc] 括号里任意一个字符 file[12].txt

16.4 {}:生成一串,不是通配符

{ } 不负责"匹配已有文件",它负责先展开成一串:

echo {1..5}
# 你会看到:
1 2 3 4 5
mkdir -p /tmp/prac/{A,B,C}
ls /tmp/prac
# 你会看到多了 A B C 三个文件夹

16.5 常见坑 ⚠️

  • 通配符是 shell 展开的,不是命令的功能:没匹配到文件时,ls *.jpg 会把 *.jpg 原样交给 ls,于是报 No such file or directory。
  • rm * 等于删除当前目录全部:先 ls * 看一眼,确认了再删(第13章的三个习惯)。
  • {a,b} 里不能有空格:{A, B} 会变成两个不完整的东西。逗号也要用英文逗号。
  • * 不匹配隐藏文件:以 . 开头的文件,* 看不见,要单独写 .*。

本章小结

写法 作用 例子
* 任意多个字符 ls *.txt
? 一个字符 ls file?.txt
[] 括号内任选一个 ls file[12].txt
{a,b} 展开成多个字符串 mkdir {A,B,C}
{1..10} 数字序列 touch {1..10}.txt

动手练

  1. 列出 /tmp/prac 下所有 .txt 文件。
  2. 一次建出 p1.txt 到 p5.txt 五个空文件,一条命令。
  3. 为什么 ls *.jpg 可能报 No such file or directory?

参考答案:

  1. ls /tmp/prac/*.txt。
  2. touch p{1..5}.txt。
  3. 因为当前目录里没有 .jpg 文件,shell 无法展开,把 *.jpg 原样交给 ls,ls 找不到这个"文件名"就报错。

第17章 重定向和管道 🔰

学完这一章,你能:把命令的输出存进文件、追加到文件末尾,还能用管道把几条命令串起来干活。

17.1 比喻:屏幕是出水口

命令干活的结果默认"流"到屏幕上。重定向就是给水管换个出口,接到文件里:> 像先倒掉旧水再装,文件原来的内容被清空;>> 像接着往桶里倒,原来的内容保留,新内容加在最后。管道 | 像流水线:上一步的产出直接变成下一步的原料,屏幕上什么都不显示。

17.2 > 覆盖 和 >> 追加

cd /tmp
echo "第一行" > 1.txt
cat 1.txt
# 你会看到:
第一行
echo "第二行" > 1.txt     # 注意还是 >
cat 1.txt
# 你会看到:
第二行

第一行没了!这就是覆盖。想保留就换 >>:

echo "第三行" >> 1.txt
cat 1.txt
# 你会看到:
第二行
第三行

记法:箭头多一个,内容多一份。

17.3 < 和 <<:反过来喂数据

wc -l < /etc/passwd
# 你会看到:一个数字,比如 45

< 是"从文件读入",不经过屏幕,wc -l 就是数行数。<< 是"我下面敲的几行都算输入,直到遇到结束标记":

cat >> /tmp/1.txt << EOF
hello
linux
EOF
cat /tmp/1.txt
# 你会看到最后多了 hello 和 linux 两行

17.4 管道 |:串起几条命令

ls /etc | wc -l
# 你会看到:/etc 下有多少项
ip a | grep inet
# 你会看到:只留下带 inet 的行(grep 第52章细讲)

左边命令的输出,直接成为右边命令的输入,中间不落盘。想存下来就再接一个重定向:ls -l /etc > /tmp/etc_list.txt。

17.5 常见坑 ⚠️

  • 该用 >> 却写了 >:文件被清空,只剩最后一条内容。
  • cat 文件 > 同一个文件:文件会先被清空,再读就是空的,内容全丢。要改内容先 cp 备份。
  • > 没有提示:覆盖是静默的,敲完回车前先确认文件名。

本章小结

符号 名字 作用 例子
> 输出重定向 覆盖写入文件 ls > list.txt
>> 追加重定向 追加到文件末尾 echo hi >> a.txt
< 输入重定向 从文件读数据 wc -l < a.txt
<< 键盘输入重定向 敲到 EOF 为止 cat << EOF
\| 管道 前一个的输出给后一个 ls \| wc -l

动手练

  1. 把 free -h 的结果保存到 /tmp/mem.txt,命令怎么写?
  2. 已经有一个 /tmp/mem.txt,想再追加一条日期信息,用 > 还是 >>?
  3. 用一条命令数出 /etc 下有多少个文件和文件夹。

参考答案:

  1. free -h > /tmp/mem.txt。
  2. >>,例如 date >> /tmp/mem.txt。
  3. ls /etc | wc -l。

第18章 键盘上的省力技巧 🔰

学完这一章,你能:少敲一半的字、少打一半的错,还会用一行命令干几件事。

18.1 Tab 补全:最救命的一个键

打字最怕打错。Tab 让系统帮你把剩下的字补齐,不用自己敲全。像点外卖时输入"宫保",系统自动弹出"宫保鸡丁"。

# 敲命令名时:
cle           # 按一下 Tab,变成
clear

# 敲路径时:
cd /etc/sysc  # 按一下 Tab,变成
cd /etc/sysconfig/
  • 按一次 Tab 没反应或"叮"一声:说明有多个候选,再按一次 Tab 会把候选全列出来。
  • 按一次就补全了:说明前缀唯一,直接回车就行。
  • 命令名、文件夹名、文件名都能补全,能补全就别手打。

18.2 翻历史:上下方向键和 Ctrl + R

# 按 上方向键:一条条翻出刚才敲过的命令;按 下方向键:往回翻
# Ctrl + R 后输入关键字,直接搜到用过的命令:
(reverse-i-search)`pass': cat /etc/passwd

Ctrl + R 找到后按回车直接执行;再按 Ctrl + R 继续往前搜同一个关键字。

18.3 Ctrl 组合键:记住这六个

快捷键 作用 备注
Ctrl + C 终止当前正在跑的命令 不是复制!
Ctrl + L 清屏,等于 clear 不删任何文件
Ctrl + D 退出当前终端,等于 exit 光标在空行时才有效
Ctrl + A 光标跳到行首 改长命令时好用
Ctrl + E 光标跳到行尾 配合 A 用
Ctrl + U 删掉光标左边所有内容 整行敲错时一键重来

Ctrl + Z 是"把当前命令暂停扔到后台",不是撤销,新手先别按(恢复用 fg)。

18.4 一行敲几条命令:; && ||

cd /tmp ; ls          # 先 cd 再 ls,不管前面成不成功
mkdir /tmp/t1 && cd /tmp/t1     # 前一个成功才执行后一个
ls /tmp/nofile || echo "目录不存在"
# 你会看到:
ls: 无法访问/tmp/nofile: 没有那个文件或目录
目录不存在
连接符 意思
; 依次执行,前一个失败也继续
&& 前一个成功才执行后一个
\|\| 前一个失败才执行后一个

18.5 常见坑 ⚠️

  • Ctrl + C 当成复制:终端里它是"终止"。复制用右键菜单或 Ctrl + Shift + C。
  • Ctrl + Z 当成撤销:它只是把命令暂停了,按 fg 能恢复;真撤销是 vim 里的 u。
  • && 后面没执行:说明前面那条失败了,先看前面的报错。

本章小结

按键/符号 作用
Tab 补全命令、路径、文件名
↑ ↓ 翻历史命令
Ctrl + R 搜索历史命令
Ctrl + C 终止当前命令
Ctrl + L 清屏
; && \|\| 一行执行多条命令

动手练

  1. 输入 cd /etc/sysc 后按 Tab,会发生什么?
  2. 想清屏但不想丢失任何东西,按什么键?
  3. cd /tmp && ls 和 cd /tmp ; ls 有什么区别?

参考答案:

  1. 自动补全成 cd /etc/sysconfig/(若有两个以上候选,会列出候选让你继续输)。
  2. Ctrl + L(等于 clear),它只清屏幕。
  3. && 是前一条成功才执行 ls;; 不管成功失败都执行 ls。

第四篇 文本编辑:vi / vim

服务器上没有记事本,改配置只能靠 vi。 这一篇只教你“够用”的那部分:能打开、能改、能保存、能退出,日常工作就够用了。

第19章 vi 是什么,为什么非学不可 🔰

学完这一章,你能:用 vi 打开一个文件、敲进内容、保存退出;并且知道为什么绕不开它。

19.1 vi 就是 Linux 自带的"记事本"

vi 是 Unix/Linux 上最老牌的文本编辑器,差不多等于 Windows 的记事本——只能打字,没有鼠标,没有按钮。vim 是 vi 的升级版,多了颜色高亮和插件,日常说的"vi"通常就是 vim。

它有个和记事本完全不同的地方:按键分"模式"。同样一个 i,在记事本里就是打出一个 i,在 vi 里可能是"准备开始输入"。第20章专门讲模式。

19.2 为什么非学不可

  • 服务器没有图形界面,改配置只能编辑文本文件,/etc 下的配置全是纯文本。
  • 几乎所有 Linux 都自带 vi,连最小安装、救援模式里都有它;别的编辑器可能没装。
  • 配网络、装软件、起服务,最后一步常常都是"vi 改一下这个文件"。
  • 用 echo 往文件里写一两行还行,改几十行的配置就没法用了。

💡 小贴士:vi 就像家里的万能钥匙——不好用,但每次都能开锁。先学会它,别的编辑器再慢慢挑。

19.3 打开文件

vi /tmp/hello.txt
# 你会看到:屏幕被清空,底部出现
"/tmp/hello.txt" [New File]
  • 文件不存在:vi 会新建,底部标 [New File]。
  • 打开前先用 pwd 看清你在哪,不然保存到哪个目录都不知道。

19.4 先只会三步,就能活下去

新手只要会 i、Esc、:wq 三个动作就能活:

vi /tmp/hello.txt
# 1. 按 i,左下角出现 -- INSERT --,说明可以打字了
# 2. 敲:hello vim
# 3. 按 Esc,回到命令模式
# 4. 输入 :wq 回车(w=write 保存,q=quit 退出)
cat /tmp/hello.txt
# 你会看到:
hello vim
  • 不想保存:按 Esc,输入 :q! 回车,强行退出。
  • 改了一半想重来:Esc 后 :q!,改了的内容全丢。

19.5 装 vim 和练手

最小安装里可能只有精简版 vi,没有 vim 命令。装它需要 yum(第35章):

yum install -y vim
vimtutor
# 你会看到:vim 自带的互动教程,照着做完一遍,基本操作就记住了

19.6 常见坑 ⚠️

  • 打开 vi 后按字母没反应:不是卡死,是你在命令模式,先按 i 才能打字。
  • 退不出去:按 Esc,再输入 :q! 回车,一定退得出来。
  • :q 提示 E37:"已修改但尚未保存"。要么 :wq 保存,要么 :q! 放弃。
  • 别用 vi 打开压缩包和图片:满屏乱码,什么也改不了。
  • 保存到哪了?:打开时用了什么路径就存到哪,不确定就用绝对路径打开。

本章小结

操作 按键/命令 说明
开始输入 i 左下角出现 -- INSERT --
回到命令模式 Esc 任何时候都能按
保存退出 :wq w 保存,q 退出
不保存退出 :q! 改坏了用这个
教程 vimtutor 装完 vim 后跟着练

动手练

  1. 用 vi 新建 /tmp/me.txt,写一行 I love Linux,保存退出,写出完整操作步骤。
  2. 在 vi 里改了内容但不想保存,怎么退出?
  3. 为什么说"服务器上绕不开 vi"?

参考答案:

  1. vi /tmp/me.txt → 按 i → 输入 I love Linux → 按 Esc → 输入 :wq 回车;再用 cat /tmp/me.txt 验证。
  2. 按 Esc,输入 :q! 回车,强行退出不保存。
  3. 服务器通常没有图形界面,配置都是文本文件;vi 几乎每台 Linux 都自带,最小安装和救援模式里只有它。

第20章 vim 常用的三种模式与切换 🔰

学完这一章,你能:清楚知道自己现在在哪个"房间",不再出现"打字打不进去""退不出来"的慌乱。

20.1 三个房间

把 vim 想成一套三居室:

  • 命令模式(进门的大厅):默认就在这。按字母不是打字,而是"下命令",比如删一行、复制一行。
  • 编辑模式(书房):只有在这里,你敲的字才会进到文件里。
  • 末行模式(门口的柜台):保存、退出、显示行号、查找替换,都在这办。

20.2 怎么在三个房间之间走

启动 vi ──► 命令模式(默认)
              │ 按 i / a / o
              ▼
           编辑模式 ──按 Esc──► 命令模式
命令模式 ──按 : ──► 末行模式 ──回车或 Esc──► 命令模式
模式 怎么进去 能干什么 怎么出来
命令模式 打开就进去 删行、复制、粘贴、撤销、跳转 按 i/a/o 或 :
编辑模式 命令模式按 i/a/o 打字、改字、删字 按 Esc
末行模式 命令模式按 : 保存、退出、行号、替换 回车执行或 Esc 取消

20.3 一次完整的走法

vi /tmp/mode.txt
# 1. 打开后先按 i → 左下角出现 -- INSERT --
# 2. 输入:hello vim
# 3. 按 Esc → -- INSERT -- 消失,回到命令模式
# 4. 输入 :wq 回车 → 保存并退出,回到 [root@localhost ~]#
cat /tmp/mode.txt
# 你会看到:
hello vim

20.4 怎么判断自己在哪

  • 左下角有 -- INSERT --(或 -- 插入 --):编辑模式,可以打字。
  • 左下角什么都没有(不显示 -- INSERT --):命令模式。
  • 光标跑到屏幕最底下一行,以 : 开头:末行模式。

拿不准就按两下 Esc,一定会回到命令模式,不会删掉任何内容。

20.5 常见坑 ⚠️

  • 在编辑模式里敲 :wq:: 会被打进正文,文件里多出一行 :wq。先 Esc 再敲。
  • Esc 按一下没回到命令模式:有的场景要按两下,多按一次不吃亏。
  • :q 退不出去:说明文件改过了,用 :wq 保存或 :q! 放弃。
  • 以为 vim 死机了:绝大多数是模式搞混了,按 Esc 再试。

本章小结

你现在在 标志 按什么去别处
命令模式 左下角空白 i 进编辑、: 进末行
编辑模式 -- INSERT -- Esc 回命令模式
末行模式 底部一行以 : 开头 回车执行、Esc 取消

动手练

  1. 打开 vim 后直接敲字母没反应,你在哪个模式?怎么才能打字?
  2. 从编辑模式回到命令模式按什么键?从命令模式进末行模式按什么键?
  3. 屏幕最下面一行显示 : 开头,你在哪个模式?这时按回车会发生什么?

参考答案:

  1. 命令模式;按 i(或 a、o)进入编辑模式才能打字。
  2. 编辑→命令按 Esc;命令→末行按 :。
  3. 末行模式;回车执行你输入的那条末行命令(比如 :wq 就保存退出,命令敲错会报错但不会退出)。

第21章 十个够用的 vim 操作 🔰

学完这一章,你能:用十个按键完成日常九成的编辑工作,不再怕"改配置文件"。

21.1 十个操作,先记住这张表

序号 按键 在哪个模式 作用
1 i / a / o 命令模式 进入编辑:光标前 / 光标后 / 下一行新开
2 Esc 编辑模式 回到命令模式
3 :w 末行模式 保存(不退出)
4 :q 末行模式 退出(没改动时才行)
5 :wq 末行模式 保存并退出
6 :q! 末行模式 不保存,强行退出
7 dd 命令模式 删除当前行(5dd 删 5 行)
8 yy 命令模式 复制当前行(5yy 复制 5 行)
9 p 命令模式 粘贴到当前行下面
10 u 命令模式 撤销(Ctrl + r 反撤销)

vim 的按键像开车:i 是踩油门(能输入了),Esc 是刹车(停下来),:wq 是熄火锁车(保存走人)。另外 10gg 跳到第 10 行,G 跳到文件最后一行,gg 回第一行——这三个配合 dd、yy 很好用。

21.2 走一遍完整的编辑

vi /tmp/prac.txt
# 按 i,输入三行:
line one
line two
line three
# 按 Esc,输入 :wq 回车

再打开它,把第二行删掉、保存:

vi /tmp/prac.txt
# 命令模式下把光标移到第二行,按 dd
# 输入 :wq 回车
cat /tmp/prac.txt
# 你会看到:
line one
line three

21.3 三个进阶操作:查找、替换、行号

/hello        # 命令模式下输入:向下查找 hello,n 下一个,N 上一个
:%s/hello/HELLO/g    # 末行模式:全文把 hello 换成 HELLO
:set nu       # 末行模式:显示行号
:set nonu     # 末行模式:取消行号

:%s/旧/新/g 里的 g 是"每行所有匹配都换",不加 g 只换每行第一个。替换前先 :w 或者先备份文件。

21.4 常见坑 ⚠️

  • dd 以为删一个字符:它是删整行。删一个字符用 x。
  • yy 之后没粘贴:复制完要按 p 才会粘出来。
  • p 粘到哪了:粘在当前行下面;想粘到上面用 P。
  • :q 退不出:改过内容,用 :wq 或 :q!。
  • 替换完才发现改错::%s 影响全文,保存前可以用 u 撤销,或者先备份文件。

本章小结

想做什么 按键 口诀
开始输入 i i = insert 插入
回命令模式 Esc 按不坏,多按几下
保存 :w w = write
退出 :q q = quit
保存并退出 :wq 最常用
不保存退出 :q! 加 ! 表示"强制"
删行 dd d = delete
复制行 yy y = yank
粘贴 p paste
撤销 u undo

动手练

  1. 用 vim 打开 /tmp/prac.txt,把第一行改成 Linux is easy,保存退出。
  2. 在 vim 里删掉第 3 行,撤销一次,再保存退出,写出按键顺序。
  3. 把文件里所有的 linux 替换成 Linux,写出末行命令。

参考答案:

  1. vi /tmp/prac.txt → 光标在第一行按 dd 删掉旧行 → 按 i 输入 Linux is easy → Esc → :wq。
  2. 光标移到第 3 行按 dd → 按 u 撤销 → :wq。
  3. :%s/linux/Linux/g,回车执行;确认无误后 :wq 保存。

第五篇 用户和权限

这一篇是 Linux 的"规矩"。 看起来琐碎,但它是运维工作的地基:90% 的"莫名其妙失败"最后都归到权限上。 学完这一篇,你会拥有一项别人很羡慕的能力:看到 Permission denied,知道该改哪里。

第22章 为什么要分用户 🔰

学完这一章,你能:说清 Linux 里为什么有"用户"这个东西,以及三类用户分别是谁。

22.1 一个假设:如果人人都能改一切

想象一台公司服务器,上面跑着工资表、网站代码、数据库。

如果所有人都能用同一个账号登录、都能随便删文件,会发生什么?

  • 实习生手一抖,rm -rf 把网站目录删了,公司业务挂掉;
  • 谁都能看工资表;
  • 出了事,查日志发现"所有人都叫同一个名字",根本查不出是谁干的。

所以必须分用户。分用户带来三个好处:

好处 说明
隔离 你只能动自己的文件,动不了别人的
追溯 谁操作的,日志里记得清清楚楚
授权 需要什么权限,就精确地给多少

比喻:一栋写字楼,如果只有一把万能钥匙,谁都能进任何房间。正常的做法是:每个人都有自己办公室的钥匙,需要进会议室另外申请。Linux 的"权限"就是这套钥匙系统。

22.2 每个用户都有一个编号:UID

系统真正认的不是你的名字,而是一个数字,叫 UID(User ID,用户编号)。

名字只是给人看的,数字才是系统内部用的。

# 看看你自己是谁、编号多少
id
# 你会看到类似:
uid=1000(tom) gid=1000(tom) groups=1000(tom)

逐段读一下,很简单:

  • uid=1000(tom) —— 你的用户编号是 1000,名字叫 tom;
  • gid=1000(tom) —— 你的主组编号是 1000,组名叫 tom(组的概念第 24 章讲);
  • groups=... —— 你还在哪些组里。

22.3 Linux 里的三类用户

类型 UID 范围 是谁 用途
超级管理员 root 0 系统的"总老板" 什么权限都有,能改一切
系统用户 1 ~ 999 给软件用的账号 比如 mysql、nginx 运行时用的身份,默认不能登录
普通用户 1000 起 给人用的账号 日常登录、办公、干活

三个重点,请记住:

  1. root 的 UID 固定是 0。不是"名字叫 root 才是管理员",是"UID 是 0 才是管理员"。
  2. 系统用户是给程序用的。比如 MySQL 服务,它不希望用 root 身份跑(万一被攻破,损失太大),所以系统给它建一个 mysql 用户,权限很小,即使被攻破也搞不坏整个系统。
  3. 普通用户权限有限。能管自己的文件,不能管别人的、不能改系统配置。

那普通用户想干管理员的事怎么办?两种方式:

  • su - 切换到 root(第 23 章);
  • 在命令前加 sudo(第 33 章,更推荐)。

22.4 家目录:每个用户自己的房间

每个用户登录后,都会落在一个属于自己的文件夹里,这个文件夹叫家目录(也就是"主目录")。

用户 家目录
root /root
普通用户 tom /home/tom
普通用户 alice /home/alice

在家目录里,你就是主人,想怎么改都行。所以养成把东西放在自己家目录里的习惯,别到处乱放。

# 回到自己的家目录
cd ~
# 看看当前在哪个目录(~ 就代表家目录)
pwd
# 你会看到(普通用户 tom):
/home/tom

22.5 用户信息存在哪

两个文件,知道位置就行,不用背:

文件 存什么 谁能看
/etc/passwd 用户的基本信息(名字、UID、家目录、用哪个 shell) 所有人都能看
/etc/shadow 用户加密后的密码 只有 root 能看
# 看一眼 /etc/passwd 的最后一行(最新建的用户)
tail -1 /etc/passwd
# 你会看到类似(7 段,用冒号隔开):
tom:x:1000:1000::/home/tom:/bin/bash

七段的含义:用户名:密码占位:UID:GID:简介:家目录:登录shell

💡 小贴士:/etc/passwd 里密码那一段是个 x,意思是"密码不在这儿,去 /etc/shadow 里找"。这就是为什么普通用户能看 /etc/passwd 却看不到别人密码的原因。

本章小结

概念 要点
为什么分用户 隔离、追溯、精确授权
UID 系统真正认的编号,名字只是给人看的
root UID = 0,权限最大
系统用户 UID 1~999,给软件用,默认不能登录
普通用户 UID 1000+,日常使用
家目录 root 在 /root,普通用户在 /home/用户名
用户信息在哪 /etc/passwd(可看)、/etc/shadow(加密密码,只有 root 可看)

动手练

  1. 用 id 看看你现在的 UID 是多少,属于哪一类用户。
  2. 为什么数据库软件要单独建一个 mysql 用户来运行,而不是直接用 root?
  3. 判断题:只要用户名不叫 root,就肯定不是超级管理员。

参考答案

  1. 执行 id,如果 uid=0(root) 就是超级管理员;uid 是 1000 及以上一般是普通用户。
  2. 为了"降权"。如果数据库用 root 跑,一旦数据库被攻破,攻击者就拿到了整台机器的最高权限;用 mysql 这个权限很小的账号跑,即使被攻破,能造成的破坏也有限。
  3. 错。判断是不是管理员看 UID 是否为 0。理论上你可以建一个叫 admin 的账号并把它的 UID 设成 0,那它也是超级管理员。

第23章 用户管理:useradd、passwd、su、id 🔰

学完这一章,你能:新增一个用户、给他设密码、切换过去、用完删掉。

23.1 先学会"看"

动手前先学会看,不然你不知道自己做对没做对。

# 我是谁
whoami
# 你会看到:
root

# 我的详细身份(UID、GID、所属组)
id
# 你会看到:
uid=0(root) gid=0(root) groups=0(root)

# 当前有哪些人登录着
who
# 你会看到类似:
root     pts/0        2026-10-30 09:12 (192.168.8.1)

who 输出里的 pts/0 是远程登录(通过网络连上来的),tty1 是在机器面前直接登录。

23.2 创建一个用户:useradd

# 创建一个叫 tom 的用户
useradd tom

# 看看建成了没有
id tom
# 你会看到:
uid=1000(tom) gid=1000(tom) groups=1000(tom)

useradd 干了三件事:

  1. 在 /etc/passwd 里加一行;
  2. 建一个和用户名同名的组;
  3. 建家目录 /home/tom(从 /etc/skel 模板复制过来的)。

常用选项(先记这几个就够):

选项 作用 例子
-u 指定 UID useradd -u 1500 tom
-d 指定家目录位置 useradd -d /data/tom tom
-M 不创建家目录 useradd -M sysuser
-s 指定登录用的 shell useradd -s /sbin/nologin mysql
-G 指定附加组 useradd -G wheel tom

关于 -s(这个选项在实际工作里很常用):

  • /bin/bash —— 正常登录,能用命令行(默认值)。
  • /sbin/nologin —— 禁止登录。登录时会直接把你踢出来。

给软件建账号时,标准写法就是这样:

# 建一个不能登录、没有家目录、UID 固定的 mysql 账号
useradd -M -u 306 -s /sbin/nologin mysql

23.3 设置密码:passwd

useradd 建出来的用户是没有密码的,没密码就登不进去,必须设一个。

# 给 tom 设置密码(root 可以改任何人的密码)
passwd tom
# 你会看到提示:
Changing password for user tom.
New password:
# 注意:这时候你敲的密码屏幕上什么都不显示,这是正常的,不是卡了
Retype new password:
passwd: all authentication tokens updated successfully.

passwd 的其他用法:

命令 作用
passwd 改自己的密码(会先要你输旧密码)
passwd tom root 改 tom 的密码
passwd -l tom 锁定 tom,禁止他登录(lock)
passwd -u tom 解锁 tom(unlock)
passwd -e tom 让 tom 下次登录必须先改密码(expire)

⚠️ 注意:密码输入时屏幕没有任何显示(连星号都没有),这是 Linux 的正常设计,不是键盘坏了。输完直接回车。

新手最常见的笑话,就是这个:"我密码输不进去,是不是终端卡了?"——没卡,就是不显示。

💡 小贴士:批量设密码可以用 echo "123.com" | passwd --stdin tom,但这是红帽系(CentOS)的用法,Ubuntu 不支持 --stdin。

23.4 切换用户:su

# 从普通用户切到 root(要输 root 的密码)
su -
# 提示:Password:
# 输完密码后,提示符变成 # 开头,说明你已经是 root
[root@localhost ~]#

# 想退回原来的用户
exit

su 和 su - 的区别(必须搞清楚,面试也常问):

命令 切换身份 环境变量和工作目录
su tom 变成 tom 保持原来用户的环境和当前目录
su - tom 变成 tom 重新加载 tom 的完整环境,并 cd 到 tom 的家目录

💡 结论:推荐一律用 su -。因为 su 用户名 会带着上一个用户的环境变量过去,可能出现"命令找到了却运行不了""路径不对"等莫名其妙的问题。

还有一条规矩要记住:

  • 普通用户切 root,要输 root 的密码;
  • root 切普通用户,不用输密码(root 是老板,老板进谁办公室都不用敲门)。

23.5 删除用户:userdel

# 只删用户,保留家目录
userdel tom

# 删用户,同时把家目录和邮件也删掉(慎用!)
userdel -r tom

⚠️ 注意:userdel -r 会把 /home/tom 里的所有文件一起删掉,没有回收站。删之前确认这个人的数据你是不是真的不要了。

23.6 修改用户:usermod

# 把 tom 加到 wheel 组(wheel 组默认有 sudo 权限)
usermod -aG wheel tom

# 锁定 / 解锁账号
usermod -L tom
usermod -U tom

# 改 UID
usermod -u 1500 tom

⚠️ 注意:-G 有一个大坑——usermod -G 是"重新设定"附加组列表,不是"追加"。如果你用了 usermod -G wheel tom,tom 原来在的其他附加组会被清掉。

所以想追加组,必须写成 -aG(a = append 追加)。这是运维事故高发点。

本章小结

命令 作用 最常用写法
whoami / id 看当前用户身份 id
who 看谁登录着 who
useradd 建用户 useradd tom
passwd 设/改密码 passwd tom
su 切换用户 su -
userdel 删用户 userdel -r tom
usermod 改用户 usermod -aG wheel tom

动手练

  1. 建一个用户 zhangsan,设密码,然后切换到它,确认 pwd 的结果是什么。
  2. su zhangsan 和 su - zhangsan 执行完,pwd 的结果一样吗?为什么?
  3. 把 zhangsan 加到 wheel 组,用 id zhangsan 验证。

参考答案

  1. useradd zhangsan → passwd zhangsan → su - zhangsan;pwd 会显示 /home/zhangsan。
  2. 不一样。su zhangsan 保持原来的当前目录(比如原来是 /root,切换后还在 /root);su - zhangsan 会切到 /home/zhangsan。
  3. usermod -aG wheel zhangsan,然后 id zhangsan,输出里 groups= 后面会多出 10(wheel)。

第24章 组是什么 🔰

学完这一章,你能:说清"组"是干什么用的,并给别人分配组。

24.1 为什么要有组

如果公司有 20 个开发要访问同一个项目目录,你打算怎么办?

  • 办法一:给这 20 个人一个一个设权限。——新人来了要加一次,走人要删一次,改权限要改 20 遍。
  • 办法二:建一个"开发组",把 20 个人都放进去,然后只给这个组设一次权限。

显然是办法二。组(group)就是为了"批量授权"而存在的。

比喻:权限就像门禁卡。你不会给每个人单独配一把锁(太麻烦),你会给"部门"配一张卡,人来了进部门就有卡,走了退部门就失效。

24.2 主组和附加组(重点,别混)

每个用户必然有一个主组,还可以有零到多个附加组。

类型 数量 什么时候创建 作用
主组 有且只有 1 个 建用户时自动创建,和用户同名 你新建的文件,属组默认就是你的主组
附加组 可以 0 个或多个 手动加 额外获得这个组的权限

比喻:

  • 主组像你的"班级"——你只有一个班级,你交的作业默认写的是你班级的名字。
  • 附加组像你的"社团"——你可以同时参加多个社团,每个社团的活动你都能参加。

一条必须记住的话:

主组决定你"新创建的文件属于哪个组";附加组只决定你"能访问哪些组的资源"。

24.3 看看组在哪里

# 看系统里有哪些组(文件很长,看最后几行)
tail -5 /etc/group
# 你会看到类似:
tom:x:1000:
wheel:x:10:tom
docker:x:994:

# 看某个用户到底在哪些组里
id tom
# 你会看到:
uid=1000(tom) gid=1000(tom) groups=1000(tom),10(wheel),994(docker)

/etc/group 每行四段:组名:密码占位:GID:组里的成员列表

24.4 组的增删改

# 创建组
groupadd dev

# 改组名
groupmod -n developer dev

# 删组
groupdel developer

# 把用户加进组(两种写法,效果一样)
usermod -aG dev tom
gpasswd -a tom dev

# 把用户从组里移除
gpasswd -d tom dev

⚠️ 注意:usermod -G 不加 -a 会覆盖原有的附加组列表,见第 23 章的坑。

💡 小贴士:用户被加进新组后,当前已经登录的会话不会立刻生效。要么退出重新登录,要么执行 newgrp 组名 临时切换。这是"明明加了组却不生效"的常见原因。

24.5 有几个组名你要认识

组 作用
root 超级管理员组
wheel 红帽系里"可以 sudo"的组,成员能用 sudo 提权
sudo Debian/Ubuntu 里"可以 sudo"的组,作用同 wheel
users 普通用户组(不同发行版行为不同,了解即可)

本章小结

概念 要点
组的作用 批量授权,避免一个个设权限
主组 只有 1 个,和用户同名,决定新建文件的属组
附加组 可以有多个,用来获得额外权限
建组 groupadd dev
加人进组 usermod -aG dev tom
从组里删人 gpasswd -d tom dev
生效条件 重新登录(或 newgrp)

动手练

  1. 建一个组 dev,建一个用户 lisi,把 lisi 加进 dev 组,用 id lisi 验证。
  2. lisi 新建一个文件,这个文件的属组是什么?
  3. 判断题:给 dev 组设了读权限,lisi 就一定能读,因为他已经在 dev 组里了。

参考答案

  1. groupadd dev;useradd lisi;usermod -aG dev lisi;id lisi 输出里应出现 dev。
  2. 是 lisi 的主组,也就是 lisi(因为主组和用户同名)。注意:不是 dev,除非你把 lisi 的主组改成了 dev。
  3. 不一定。要看他当前登录的会话有没有加载新组——刚用 usermod 加的组,需要重新登录(或 newgrp dev)才生效。

第25章 权限的三个字母 rwx 🔰

学完这一章,你能:说清 r、w、x 分别是什么,以及它们对"文件"和"目录"的意义为什么完全不同。

25.1 权限是给"三种人"分的

Linux 把所有人分成三类身份,权限针对这三类分别设置:

身份 英文 是谁
属主 User 文件的主人(创建者,或被 chown 改成的人)
属组 Group 文件所属组里的其他人
其他 Other 既不是属主、也不在属组里的所有人

这三类合起来叫 UGO。每个文件,系统都会分别记录"这三种人各有什么权限"。

25.2 权限只有三种:rwx

字母 含义 数值
r read,读 4
w write,写 2
x execute,执行 1
- 没有这个权限 0

那个数字(4、2、1)很有用,第 27 章讲 chmod 数字法时会用到,先记着。

25.3 关键:rwx 对文件和对目录,意思不一样!

这是初学者最大的坎,请务必看清楚。 同一个 r,对文件和目录是完全不同的两件事。

权限 对文件 对目录
r 能看内容(cat、head) 能列出目录里有哪些文件(ls)
w 能修改内容(编辑、追加) 能在目录里新建、删除、改名文件
x 能运行(必须是程序;.txt 加了 x 也运行不了) 能进入这个目录(cd)

用"房间"来理解目录权限:

比喻:把目录想成一个房间。

  • r = 你能站在门口看到里面有什么(但不能进去);
  • x = 你能推门进去;
  • w = 你能往房间里搬东西、扔东西。

于是会有一个反直觉但非常重要的结论:

⚠️ 注意:只有 r 没有 x,你是进不去目录的。 也就是说 ls 目录 能列出文件名,但 cd 目录 会失败,也打不开里面的文件。

反过来,只有 x 没有 r:你能 cd 进去,也能访问你已经知道名字的文件,但 ls 看不到里面有什么。

25.4 对目录的 w 有个"隐藏技能"

这里有个超纲但很实用的知识点,理解了你会少踩很多坑:

删除一个文件,看的是"它所在目录"的 w 权限,而不是文件本身的 w 权限。

也就是说:一个文件哪怕设成 444(谁都不能改),只要你对它所在的目录有 w,你依然能 rm 把它删掉。

原因很简单:文件的"名字"是记录在目录里的,删文件本质上是"从目录里删掉这个名字"。

⚠️ 注意:这也解释了第 13 章的"rm 没有回收站"为什么这么危险——只要有目录写权限,删掉就真没了。

顺带一提,/tmp 目录用了 Sticky Bit(第 30 章),就是为了解决"大家都能往 /tmp 写,但只能删自己的文件"这个矛盾。

本章小结

概念 要点
三种身份 属主 U、属组 G、其他 O
三种权限 r=4 读、w=2 写、x=1 执行
对文件 r 看内容、w 改内容、x 能运行
对目录 r 能 ls、w 能建删改名、x 能 cd 进入
无 x 的目录 进不去,也打不开里面的文件
删文件看谁 看文件所在目录的 w 权限

动手练

  1. 一个目录权限是 r--(只有 r),你能 ls 它吗?能 cd 进去吗?
  2. 一个文件权限是 444,但它在权限为 777 的目录里。你能删掉这个文件吗?
  3. 为什么"能 ls 看到文件名"不等于"能打开这个文件"?

参考答案

  1. 能 ls(看得到文件名列表),但不能 cd(没有 x),也打不开里面的文件。
  2. 能。删除看的是目录的 w 权限,与文件自身权限无关。
  3. 因为 ls 只需要目录的 r;而打开文件需要对目录有 x(能进入),还需要对文件本身有 r。

第26章 看懂 ls -l 的输出 🔰

学完这一章,你能:看懂 ls -l 每一列在说什么,一眼判断"这是文件还是目录、谁能动它"。

26.1 先跑一下

ls -l
# 你会看到类似这样的输出:
总用量 4
-rw-r--r--. 1 root root 2058 5月  11 16:21 a.txt
drwxr-xr-x. 2 root root    6 5月  13 09:41 dir01
lrwxrwxrwx. 1 root root    7 5月  13 10:02 link.txt -> a.txt

一行里挤了 9 段信息,我们把它们拆开看。

26.2 逐段拆解

以这行为例:

-rw-r--r--.  1  root  root  2058  5月 11 16:21  a.txt
└────┬───┘  │   │     │      │         │         │
  ①权限    ②  ③属主 ④属组 ⑤大小   ⑥修改时间  ⑦文件名
编号 内容 说明
① -rw-r--r-- 权限位,共 10 个字符,第 1 个是文件类型,后面 9 个是权限
② 1 硬链接数(目录的这个数一般是子目录数 + 2)
③ root 属主(文件的主人)
④ root 属组
⑤ 2058 大小,单位是字节(不是 KB!)
⑥ 5月 11 16:21 最后修改时间
⑦ a.txt 文件名(如果是软链接,会显示 -> 指向哪里)

26.3 第①段细看:10 个字符怎么读

-rw-r--r-- 这 10 个字符这样切:

 -   rw-   r--   r--
└┘  └┬┘   └┬┘   └┬┘
类型  属主  属组  其他
  • 第 1 个字符:文件类型
字符 类型 你会在哪见到
- 普通文件 文本、程序、图片、压缩包……
d 目录(directory) 就是文件夹
l 软链接(link) 类似 Windows 的快捷方式
b 块设备(block) 硬盘、U 盘、光盘,都在 /dev
c 字符设备(character) 键盘、鼠标、打印机
s 套接字(socket) 程序之间通信用的文件
p 管道(pipe) 进程之间传数据

日常你 99% 只会碰到前三种:-、d、l。

  • 后面 9 个字符:三组权限,每组 3 位,顺序永远是 r w x:
rw-r--r--
rw- | r-- | r--
属主 r+w   属组 只读   其他 只读

所以 -rw-r--r-- 读作:"这是一个普通文件;主人能读能写;同组的人只能读;其他人只能读。"

再看 drwxr-xr-x:这是一个目录;主人能读能写能进;同组能读能进;其他人能读能进。

26.4 后面那个点 . 和加号 +

-rw-r--r--. 1 root root 2058 5月 11 16:21 a.txt
          ↑
-rw-rw----+ 1 root root    0 5月 14 16:14 1.txt
          ↑
符号 含义
. 该文件有 SELinux 安全上下文(安全模块标记),通常不用管
+ 该文件设置了 ACL(第 32 章),说明除了 UGO 还有额外授权
没有 一切正常,只有普通权限

💡 小贴士:看到 + 号就说明"这个文件的权限没你想的那么简单",想搞清楚要用 getfacl 文件名 看。

26.5 两种等价的查看方式

ls -l a.txt     # 只看一个文件
ls -l /etc/     # 看某个目录里所有文件的详情
ls -ld /etc/    # 只看 /etc 这个目录本身的权限,不列出里面的内容

⚠️ 注意:ls -l /etc/ 列出的是 /etc 里面的文件;想知道 /etc 这个目录自己的权限,必须加 -d。新手经常在这里搞错,看到一堆文件却找不到"目录的权限在哪"。

本章小结

位置 内容
第 1 位 类型:- 文件、d 目录、l 软链接
2~4 位 属主权限
5~7 位 属组权限
8~10 位 其他用户权限
后面 硬链接数、属主、属组、大小(字节)、时间、文件名
尾部的 . SELinux 标记,通常忽略
尾部的 + 有 ACL 权限

动手练

  1. -rwxr-x--- 分别表示三种身份有什么权限?
  2. 用一条命令只看 /etc 这个目录本身的权限。
  3. 输出里大小显示 4096 的 d 类型条目,这个 4096 是什么?

参考答案

  1. 属主 rwx(可读可写可执行),属组 r-x(可读可执行),其他 ---(什么权限都没有)。
  2. ls -ld /etc。
  3. 目录的大小不是"里面文件的总大小",而是记录这个目录里文件名清单所占用的磁盘空间,通常固定占一个块(4096 字节 = 4KB)。要看目录里文件的总大小,用 du -sh 目录。

第27章 修改权限 chmod 🔰

学完这一章,你能:用两种方法精确地设置权限,并知道常用的几个权限数字代表什么。

27.1 只有两种人会改权限

  1. 文件的属主(自己的文件自己能改);
  2. root(什么都能改)。

改权限的命令叫 chmod(change mode,改变模式)。

它有两种写法:符号法(像说话一样,好理解)和数字法(快,但要想一下)。两种都要会。

27.2 符号法:u / g / o / a + / - / = 和 rwx

格式:chmod 谁 加还是减 什么权限 文件

  • 谁:u(属主)、g(属组)、o(其他)、a(所有人 = ugo)
  • 怎么改:+ 增加、- 减少、= 直接设定成这个值
  • 什么权限:r、w、x
# 给属主增加写权限
chmod u+w a.txt

# 去掉属组的执行权限
chmod g-x a.txt

# 给其他人增加读权限
chmod o+r a.txt

# 给所有人加上执行权限(最常用的一条)
chmod +x run.sh

# 一次设定三个身份:属主 rwx、属组 r-x、其他无
chmod u=rwx,g=r-x,o=--- a.txt

# 一次给属主和属组都加读权限(逗号分隔)
chmod u+r,g+r a.txt

符号法的优点:改的时候不用管原来是什么权限,只说我"要加/减/设"什么。适合微调。

27.3 数字法:把三个权限加起来

这是工作中最常用的写法,也是面试必考。原理很简单:

权限 数值
r 4
w 2
x 1
无 0

一个有权限的组合,就把对应数字加起来:

组合 算式 数字
rwx 4+2+1 7
rw- 4+2+0 6
r-x 4+0+1 5
r-- 4+0+0 4
-wx 0+2+1 3
-w- 0+2+0 2
--x 0+0+1 1
--- 0+0+0 0

然后三个身份三个数字,拼成一个三位数:

chmod  7 5 5  文件
       │ │ └── 其他:5 = r-x
       │ └──── 属组:5 = r-x
       └────── 属主:7 = rwx

练习一下口算(自己先算,再看答案):644 是什么?

  • 6 = 4+2 = rw-
  • 4 = r--
  • 4 = r--
  • 所以 644 = -rw-r--r--,也就是"主人能读能写,其他人只能读"。
# 一次性把文件设成 rw-r--r--
chmod 644 a.txt

# 给所有用户全部权限(危险!)
chmod 777 a.txt

27.4 五个你必须记住的常用权限

数字 权限 用在哪 说明
644 rw-r--r-- 普通文件、网页、配置 主人能改,别人只能看。最常用
755 rwxr-xr-x 目录、可执行程序 主人全权,别人能进能看
600 rw------- 私密文件(密钥、密码本) 只有主人能读写,别人完全看不到
700 rwx------ 私密目录(家目录、.ssh) 只有主人能进,别人连门都进不去
777 rwxrwxrwx 几乎不该用 所有人都能改,等于没上锁

⚠️ 注意:chmod 777 是新手最爱干、运维最讨厌见到的操作。

遇到"权限不够"就 chmod 777,确实能"解决",但同时打开了所有人的权限:

  • 网站目录 777,别人可以上传恶意脚本;
  • 私钥文件 777,等于把密码贴墙上;
  • 更可怕的是 chmod -R 777 /(对根目录递归),系统直接报废,救不回来。

正确的思路永远是:想清楚"谁需要什么权限",只给到够用为止。

27.5 递归改权限:-R

# 把目录和里面所有文件的权限都改成 755(递归)
chmod -R 755 /data/app

⚠️ 注意:-R 会连子目录、子文件全部改掉,而且文件和目录用同一个数字会出问题——目录需要 755(有 x 才能进),普通文件通常只需要 644。全都设成 755 虽然能用但不符合最小权限原则;全都设成 644 则目录进不去。

专业做法是分开设:

```bash

目录设 755,普通文件设 644

find /data/app -type d -exec chmod 755 {} \; find /data/app -type f -exec chmod 644 {} \; ```

27.6 特殊:给文件加执行权限

# 写了一个脚本,想让它能直接运行
chmod +x backup.sh

# 然后就能这样跑
./backup.sh

💡 小贴士:为什么用 ./backup.sh 而不是 backup.sh?因为当前目录 . 默认不在系统的 PATH 搜索路径里。敲 ./ 的意思是"就在当前目录找这个文件"。这是很常见的疑惑,记住就好。

本章小结

写法 例子 说明
符号法加 chmod u+w a.txt 给属主加写权限
符号法设 chmod u=rwx,g=rx,o= a.txt 直接设定
数字法 chmod 644 a.txt 三位数,分别对应 ugo
递归 chmod -R 755 目录 小心用
记住 4=读、2=写、1=执行 相加得每位的数字
常用 含义 场景
644 主人读写,别人只读 普通文件
755 主人全权,别人可读可进 目录、程序
600 只有主人读写 私密文件
700 只有主人能进 私密目录

动手练

  1. chmod 640 a.txt 之后,ls -l 显示的是什么?
  2. 把 a.txt 设成"属主可读写执行,属组可读,其他人无权限",用数字法怎么写?
  3. 一个目录权限是 644,别人能 cd 进去吗?为什么?

参考答案

  1. -rw-r-----(6=rw-,4=r--,0=---)。
  2. 属主 7(rwx)、属组 4(r--)、其他 0(---),所以是 chmod 740 a.txt。
  3. 不能。进入目录需要 x 权限,而 644 拆开是 rw- / r-- / r--,三段里一个 x 都没有,所以连属主自己也进不去,别人更进不去。

第28章 修改属主和属组:chown、chgrp 🔰

学完这一章,你能:把文件"过户"给别人,或者挂到某个组下面。

28.1 什么时候需要改属主

场景:你用 root 解压了一个网站程序到 /var/www/html,结果文件属主全是 root。网站是以 apache 用户运行的,它改不了这些文件,网站就报错。

这时候要做的是改属主,而不是 chmod 777。这是"权限问题"最常见的正确处理方式。

28.2 chown:改属主

chown = change owner(改变主人)。

# 只改属主
chown apache a.txt

# 改属主的同时改属组,用冒号连起来
chown apache:apache a.txt

# 递归改整个目录
chown -R apache:apache /var/www/html

语法:chown 属主[:属组] 文件

  • chown tom file —— 只把属主改成 tom,属组不动
  • chown tom:dev file —— 属主改成 tom,属组改成 dev
  • chown :dev file —— 只改属组(冒号前面空着)
  • chown tom: file —— 注意:这样写会把属组改成 tom 的主组

💡 小贴士:chown tom:dev 这种"用户:组"的写法最常用,一次搞定两件事,比用两条命令省事。

28.3 chgrp:只改属组

chgrp = change group。功能单一,就是改属组。

# 把文件的属组改成 dev
chgrp dev a.txt

# 递归改目录
chgrp -R dev /data/project

它和 chown :dev a.txt 效果一样,你挑一个顺手的记就行。

28.4 谁有权改属主

操作 谁能做
改自己的文件的属组(改到自己所在的某个组) 属主本人
改属主 只有 root
把文件给别人 只有 root

道理很简单:如果能随便把文件"过户"给别人(尤其是 root),就可以用来栽赃或提权,所以这个权限被锁死了。

⚠️ 注意:普通用户执行 chown 会报 Operation not permitted(不允许的操作),这是正常的,加 sudo 就行。

28.5 一个完整案例(很典型,建议跟着敲)

# 1. 建一个测试目录
mkdir -p /data/web
echo "hello" > /data/web/index.html

# 2. 看看现在是谁的
ls -l /data/web/
# 你会看到:属主属组都是 root(因为你用 root 建的)
-rw-r--r--. 1 root root 6 10月 30 10:00 index.html

# 3. 把整个目录交给 tom
chown -R tom:tom /data/web
ls -l /data/web/
# 你会看到:属主属组都变成了 tom
-rw-r--r--. 1 tom tom 6 10月 30 10:00 index.html

# 4. 切换到 tom 试试能不能改
su - tom -c 'echo "hi" >> /data/web/index.html'
# 没有报错就成功了(因为 tom 现在有写权限)

本章小结

命令 作用 常用写法
chown 改属主 chown tom file
chown 同时改属主和属组 chown tom:dev file
chown 只改属组 chown :dev file
chgrp 只改属组 chgrp dev file
递归 目录下全部 加 -R
权限 改属主只能 root 普通用户要 sudo

动手练

  1. 把 /data/web 目录(含里面所有文件)的属主和属组都改成 tom。
  2. chown tom file 和 chown tom: file 有什么区别?
  3. 网站报 "Permission denied",文件属主是 root、目录属主是 root,网站进程是 apache 用户。正确的做法是什么?

参考答案

  1. chown -R tom:tom /data/web。
  2. chown tom file 只改属主,属组保持不变;chown tom: file 会把属主改成 tom,同时把属组改成 tom 的主组。
  3. 把文件交给 apache:chown -R apache:apache /var/www/html,再配合 chmod 755(目录)/644(文件)。不要用 chmod 777。

第29章 umask:新文件的默认权限 🔧

学完这一章,你能:解释"为什么我新建的文件权限是 644 而不是 777",并会自己改默认值。

29.1 一个自然的问题

你新建一个文件,没设过任何权限,那它的权限是谁定的?

答案:系统按一个"默认规则"自动给的,这个规则叫 umask(权限掩码)。

# 看看当前的 umask
umask
# 你会看到:
0022

29.2 umask 是"减掉的权限"

先记住两个基准值(系统定的,背下来):

新建 最高权限
目录 777
普通文件 666

💡 为什么文件不是 777? 因为 Linux 觉得"新建一个文本文件就带执行权限"太危险了(万一被塞了恶意脚本,一敲就执行)。所以文件的基础权限里天生不带 x。

然后 umask 的作用是"从基准值里减掉这些权限":

目录:777 - 022 = 755   →  drwxr-xr-x
文件:666 - 022 = 644   →  -rw-r--r--

022 的意思是"从属组和其他人那里,各减掉写权限(2)"。所以:

  • 目录默认 755:主人能读写进,别人只能读和进;
  • 文件默认 644:主人能读写,别人只能读。

29.3 验证一下

# 新建一个目录和一个文件
mkdir testdir
touch testfile

ls -ld testdir testfile
# 你会看到:
drwxr-xr-x. 2 root root 6 10月 30 10:05 testdir
-rw-r--r--. 1 root root 0 10月 30 10:05 testfile

和推算的 755 / 644 完全一致。

29.4 改 umask

# 临时改(只对当前这个终端有效,关掉就没了)
umask 077

mkdir private_dir
ls -ld private_dir
# 你会看到:目录变成了 700(只有自己能进)
drwx------. 2 root root 6 10月 30 10:06 private_dir

077 = "把属组和其他的所有权限都减掉",所以目录变成 700、文件变成 600。这在做安全加固时很常用。

永久修改要写到配置文件里(比如 ~/.bashrc 末尾加一行 umask 077),然后重新登录。

29.5 常见的 umask 值

umask 目录默认 文件默认 含义
022 755 644 最常见,同组和其他人可读
002 775 664 团队共享,同组可写
077 700 600 私密,别人什么都看不到

⚠️ 注意:umask 是"减"不是"加",这是最容易记反的地方。而且这种减法其实是按位减(去掉对应权限位),只是对常见的 022 来说,直接当算术减法算出来的结果恰好一样,方便你理解。看到 027 这类值时别硬算,理解成"去掉对应权限位"就好。

本章小结

概念 要点
umask 新建文件/目录时"减掉"的权限
基准值 目录 777、文件 666(文件天生无 x)
默认值 022 → 目录 755、文件 644
查看 umask
临时改 umask 077(只影响当前终端)
永久改 写进 ~/.bashrc 或 /etc/profile

动手练

  1. umask 是 022 时,新建目录和新建文件的权限各是多少?
  2. 想让新建文件默认是 600(只有自己能读写),umask 要设成多少?
  3. 判断题:把 umask 设成 000,新建文件就是 777。

参考答案

  1. 目录 777-022=755;文件 666-022=644。
  2. 077。它的含义是"把属组和其他的所有权限都去掉",所以文件变成 600、目录变成 700。
  3. 错。文件的基础权限是 666,天生没有 x,所以 umask 设成 000 时新建文件是 666(rw-rw-rw-),不是 777。只有目录才会是 777。

第30章 三个特殊权限 🔧

学完这一章,你能:看懂 ls -l 里出现的 s 和 t,并知道它们各自解决什么问题。

30.1 它们解决什么"普通权限解决不了"的问题

普通的 rwx 有三个场景搞不定:

  1. 普通用户要改自己的密码,但密码存在只有 root 能改的文件里 —— 怎么做到的?
  2. 一个团队共享目录,大家新建的文件都要自动属于同一个组 —— 怎么做到的?
  3. /tmp 所有人可写,怎么防止我删掉别人的文件? —— 怎么做到的?

答案就是三个特殊权限:SUID、SGID、Sticky Bit。

30.2 SUID(4):临时借用"主人"的身份

作用:一个程序带了 SUID,任何人运行它,都会以"程序的主人"的身份运行,而不是以自己的身份。

最经典的例子就是 passwd:

ls -l /usr/bin/passwd
# 你会看到(属主那一段是 rws,注意这个 s):
-rwsr-xr-x. 1 root root 27856 4月   1 2020 /usr/bin/passwd

分析一下:

  • 这个文件的属主是 root;
  • 它的属主权限是 rws(s 就是 SUID);
  • 所以普通用户执行 passwd 时,实际上是"以 root 身份"在运行;
  • 而 /etc/shadow(存密码的文件)只有 root 能改,所以普通用户才能改自己的密码。

没有 SUID 会怎样? 普通用户就改不了自己的密码了——因为他没有权限写 /etc/shadow。

设置方法:

chmod u+s 程序名        # 符号法
chmod 4755 程序名       # 数字法:在前面加个 4

⚠️ 注意:SUID 只有对可执行程序才有意义。而且如果文件本身没有 x 权限,s 会显示成大写 S,表示"设置了但没生效"。

另外,SUID 是提权手段,也是黑客最爱利用的东西。运维定期检查系统里"谁是 SUID 文件",就是为了排查后门。

30.3 SGID(2):目录里的文件自动继承组

SGID 有两个作用,对目录的那个作用最实用:

用在 作用
文件 运行时以"文件的属组"身份运行
目录 在这个目录里新建的文件,属组自动变成这个目录的属组

场景:/data/project 是 dev 组共享的开发目录,组里有 tom、jerry、alice。

问题:tom 新建一个文件,属组是 tom(他的主组)。jerry 就改不了这个文件,因为 jerry 只属于 dev 组。

解决:给目录加 SGID,之后任何人在这个目录里新建文件,属组都自动是 dev。

# 给目录加 SGID
chmod g+s /data/project
# 或者数字法(2755)
chmod 2755 /data/project

ls -ld /data/project
# 你会看到属组权限位变成了 rws:
drwxrwsr-x. 2 root dev 6 10月 30 10:10 /data/project

30.4 Sticky Bit(1):只能删自己的文件

作用:加了 Sticky Bit 的目录,里面的文件只有"文件的主人"或 root 才能删,别人就算有目录写权限也删不了。

经典例子就是 /tmp:

ls -ld /tmp
# 你会看到最后一位是 t:
drwxrwxrwt. 12 root root 4096 10月 30 10:11 /tmp

/tmp 的权限是 777(所有人可写),但因为它带了 t,所以:

  • 你可以在 /tmp 里新建自己的文件(有 w);
  • 你删不掉别人的文件(被 t 挡住了)。

没有 t 会怎样? 任何人在 /tmp 里都能删你正在用的临时文件,程序就崩了。

# 设置方法
chmod o+t 目录名
chmod 1777 目录名     # 数字法前面加 1

30.5 三个放在一起记

权限 数值 给谁加 效果 记住这个例子
SUID 4 可执行程序 运行时借用属主身份 /usr/bin/passwd
SGID 2 目录 新建文件的属组自动继承 团队共享目录
Sticky 1 目录 只能删自己的文件 /tmp

数字法的口诀:这三位是"第四位",写在原来的三位权限前面。

chmod 4755 程序    →  SUID + rwxr-xr-x
chmod 2755 目录    →  SGID + rwxr-xr-x
chmod 1777 目录    →  Sticky + rwxrwxrwx

⚠️ 注意:SGID 和 Sticky 都是给目录用的,而且目录本身必须有 x 权限才会生效——否则你连目录都进不去,特殊权限也就没了意义。

本章小结

特殊权限 数字 作用对象 一句话作用
SUID 4 程序 借主人身份运行(passwd)
SGID 2 目录 新文件自动继承目录的属组
Sticky Bit 1 目录 只能删自己的文件(/tmp)
显示 s / t 出现在权限位里;大写 S/T 表示未生效

动手练

  1. 为什么 /usr/bin/passwd 需要 SUID?如果没有会怎样?
  2. /tmp 是 777,为什么你删不掉别人在里面建的文件?
  3. 给目录 /data/share 加 SGID,用数字法怎么写?

参考答案

  1. 因为普通用户改密码时要写 /etc/shadow,而这个文件只有 root 能写。有了 SUID,普通用户运行 passwd 时相当于以 root 身份执行,才能完成写密码文件的操作。没有 SUID,普通用户就改不了自己的密码。
  2. 因为 /tmp 带了 Sticky Bit(t),规则变成"只有文件主人和 root 能删",目录的 w 权限被这条规则限制住了。
  3. chmod 2755 /data/share(或 chmod g+s /data/share)。

第31章 隐藏权限:chattr 和 lsattr 🔧

学完这一章,你能:给重要文件上一把"连 root 都打不开"的锁。

31.1 普通权限管不住 root

前面讲的 UGO、ACL,对 root 都无效——root 是老板,什么门都拦不住他。

但有些场景,恰恰需要"连 root 也不能乱动":

  • 系统关键日志文件,怕被误删或篡改;
  • 服务器被入侵后,攻击者常会改配置文件留后门;
  • 重要配置文件,怕手抖删掉。

这就是隐藏权限(也叫文件属性)的用武之地。它对包括 root 在内的所有用户都生效。

31.2 查看隐藏权限:lsattr

lsattr anaconda-ks.cfg
# 你会看到:
---------------- anaconda-ks.cfg

那一串 - 表示"什么都没设置"。如果某个位置出现字母,就表示设置了对应的属性。

31.3 最常用的两个属性:+i 和 +a

属性 名称 效果 适合用在哪
+i immutable(不可变) 不能删除、不能修改、不能改名、不能追加,只能查看和复制 系统核心配置、重要文件
+a append only(只追加) 只能往后追加内容,不能删除原内容、不能覆盖 日志文件(防止日志被篡改)
# 给文件加"不可变"锁
chattr +i important.conf

# 验证一下
lsattr important.conf
# 你会看到(i 出现了):
----i----------- important.conf

# 现在试试删它(root 也不行!)
rm -f important.conf
# 你会看到:
rm: cannot remove 'important.conf': Operation not permitted

# 想改?先解锁
chattr -i important.conf
# 日志文件只能追加,不能删改
chattr +a /var/log/messages

# 现在不能覆盖,但能追加
echo "test" >> /var/log/messages   # 成功
> /var/log/messages                # 失败!不允许清空

⚠️ 注意:忘了自己加过 +i,会是一个非常抓狂的经历。

表现是:明明你是 root,明明权限是 777,就是删不掉、改不了,报错还特别含糊。这时候第一反应应该是:

bash lsattr 文件名

看到 i 就 chattr -i 解锁。这个坑很多人踩过,记住能省你半天时间。

本章小结

命令 作用
lsattr 文件 查看隐藏权限
chattr +i 文件 加不可变锁(不能删改)
chattr -i 文件 解锁
chattr +a 文件 只能追加(保护日志)
chattr -a 文件 取消追加限制
特点 对 root 也生效

动手练

  1. 给文件加 +i 后,用 root 执行 rm 会怎样?
  2. 日志文件该用 +i 还是 +a?为什么?
  3. 你发现一个文件权限是 777、属主是 root、你也是 root,但就是删不掉。先查什么?

参考答案

  1. 会失败,报 Operation not permitted。因为不可变属性对 root 也生效。
  2. 用 +a。因为日志需要持续追加新内容,+i 会连追加都禁止,日志就写不进去了;+a 允许追加但禁止删除和覆盖,正好防篡改。
  3. 先执行 lsattr 文件名,看是不是被加了 i(或者 a)属性。

第32章 ACL:给某个用户单独开小灶 🔧

学完这一章,你能:在"属主/属组/其他"之外,单独给某一个人或某个组开权限。

32.1 UGO 不够用的时候

假设有个文件:

  • 属主是 tom;
  • 属组是 dev(里面有 jerry、alice);
  • 权限是 640(rw-r-----)。

现在有个既不是 tom、也不在 dev 组的人叫 bob,他临时需要读这个文件。

怎么办?

  • 把 bob 加进 dev 组?——那他就获得了 dev 组所有的权限,给多了。
  • 把文件改成 644?——那"其他所有人"都能读了,给多了。

UGO 只有三个格子,塞不下"只给 bob 一个人读"这种需求。

这就是 ACL(Access Control List,访问控制列表)要解决的问题:在三个格子之外,再单独点名授权。

比喻:UGO 是"公司通行证分三种:本人、本部门、外人"。ACL 就是"临时访客单"——我可以专门给张三开一张,只允许他进 3 楼会议室。

32.2 看一个文件有没有 ACL

ls -l 权限位后面出现 + 号,就说明有 ACL:

ls -l a.txt
# 注意权限位末尾的那个 +
-rw-rw----+ 1 root root 0 10月 30 10:14 a.txt

32.3 给某个用户单独授权:setfacl

# 给用户 bob 单独加读、写权限
setfacl -m u:bob:rw a.txt

# 查看结果
getfacl a.txt
# 你会看到:
# file: a.txt
# owner: root
# group: root
user::rw-
user:bob:rw-          ← 这一行就是专门给 bob 的
group::---
mask::rw-
other::---

语法:setfacl -m 类型:名字:权限 文件

类型 含义 例子
u user,给某个用户 setfacl -m u:bob:rw a.txt
g group,给某个组 setfacl -m g:dev:rwx a.txt
o other,给其他人 setfacl -m o::r a.txt

32.4 撤销和清空

# 撤销 bob 的 ACL
setfacl -x u:bob a.txt

# 清空这个文件的所有 ACL
setfacl -b a.txt

32.5 给目录设 ACL,让新文件自动继承

这是 ACL 最实用的功能。加个 d:(default,默认)前缀:

# 让 /data/share 目录里"以后新建的文件"都自动带上 bob 的 rw 权限
setfacl -m d:u:bob:rw /data/share

# 查看
getfacl /data/share
# 你会看到多了一组 default 开头的:
default:user::rwx
default:user:bob:rw-
default:group::---
default:mask::rwx
default:other::---

⚠️ 注意:d: 只对"设置之后新建的"文件生效,对目录里已有的文件不起作用。 想要已有的文件也生效,得用 setfacl -R -m ... 递归设置。

32.6 mask 是什么(简单了解一下)

getfacl 输出里的 mask 是"ACL 权限的上限天花板":

  • 你给 bob 设了 rwx,但 mask 只有 rw-,那 bob 实际只有 rw-;
  • 这就是 getfacl 里有时会显示 #effective:rw- 的原因——生效的权限被 mask 削掉了。

如果发现"我明明设了权限怎么不生效",先看 mask。

本章小结

命令 作用
getfacl 文件 查看 ACL
setfacl -m u:用户:权限 文件 给某用户单独授权
setfacl -m g:组:权限 文件 给某组单独授权
setfacl -x u:用户 文件 撤销某用户的 ACL
setfacl -b 文件 清空所有 ACL
setfacl -m d:u:用户:权限 目录 让目录里新建的文件继承该 ACL
ls -l 有 + 说明该文件有 ACL
mask ACL 权限的天花板,实际权限取两者较小值

动手练

  1. 给文件 a.txt 单独授予用户 bob 读写权限,并验证。
  2. 撤销 bob 的权限。
  3. 怎么让 /data/share 目录以后新建的文件,都自动给 bob 读权限?

参考答案

  1. setfacl -m u:bob:rw a.txt,然后用 getfacl a.txt 看到 user:bob:rw- 就成功了(ls -l 会多出 +)。
  2. setfacl -x u:bob a.txt。
  3. setfacl -m d:u:bob:r /data/share(d: 是 default,只对之后新建的文件生效)。

第33章 sudo:临时借用 root 的权力 🔰

学完这一章,你能:用 sudo 安全地执行管理操作,并给其他用户授权。

33.1 为什么不干脆一直用 root

新手最常见的做法是:直接 su - 变成 root,然后就再也不退出来了。这是运维大忌。

原因:

风险 说明
没有保护 root 干什么都不问,rm -rf 敲错一个空格,系统就没了
无法追溯 大家都用 root,日志里全是 root,出了事查不到是谁
一个密码泄露 root 密码一旦泄露,整台机器就完了
会被入侵者利用 攻击者拿到 root 就等于拿到一切

正确姿势:平时用普通用户干活,只在需要的时候,用 sudo 临时提一下权。

比喻:sudo 就像"临时借用经理的门禁卡"。你不是经理,但你需要进资料室的时候,可以刷一下卡进去办这件事,办完出来还是你自己。而不是"我干脆把自己变成本经理"。

33.2 怎么用 sudo

用法极其简单:在命令前面加 sudo。

# 想改系统配置,普通用户直接干会被拒绝
vim /etc/hosts
# 提示:"/etc/hosts" E212: Can't open file for writing(写不进去)

# 加 sudo 就行
sudo vim /etc/hosts
# 提示:你会被要求输入密码
[sudo] password for tom:
# 输你自己的密码(注意:是"你自己的",不是 root 的!),然后就能正常改了

几个关键点,一定要记牢:

  1. sudo 要输的是"你自己的密码",不是 root 的密码。这点和 su - 完全不同,新手经常在这里懵。
  2. 密码输入时屏幕没有显示,输完直接回车。
  3. 输入一次密码后,默认 5 分钟内不用重复输。
  4. 只有被授权的用户才能用 sudo,没授权的人会看到 tom is not in the sudoers file。

33.3 谁能用 sudo?看组

不同发行版的"可以 sudo 的组"不一样:

系统 有 sudo 权限的组
CentOS / RHEL wheel
Ubuntu / Debian sudo

所以授权最简单的办法就是把人加进这个组:

# CentOS:把 tom 加进 wheel 组
usermod -aG wheel tom

# Ubuntu:把 tom 加进 sudo 组
usermod -aG sudo tom

💡 小贴士:加完组后,tom 要重新登录才生效(第 24 章提过)。不生效别怀疑命令写错了,先退出重登。

33.4 更精细的授权:/etc/sudoers

上面的办法是"要么全给,要么不给"。如果你想只给某几条命令的权限,就要改 /etc/sudoers 文件。

# 1. 必须用 visudo 命令编辑(重要!)
visudo

# 2. 在文件末尾加一行,例如允许 tom 用 sudo 执行任意命令、且不用输密码
tom  ALL=(ALL)  NOPASSWD:ALL

# 3. 保存退出(vim 操作:Esc 然后 :wq 回车)

这行的意思是:

部分 含义
tom 用户名(前面加 % 表示组,如 %wheel)
ALL= 允许从任何主机登录时使用
(ALL) 允许以任何人(包括 root)的身份执行
NOPASSWD:ALL 执行所有命令,且不用输密码(NOPASSWD: 可省略,省略就要输密码)

更安全的写法(只授权特定命令):

# 只允许 tom 用 sudo 管理系统服务和查看日志,其他一概不行
Cmnd_Alias  SVC = /usr/bin/systemctl, /usr/bin/journalctl
tom  ALL=(ALL)  SVC

禁止某些命令(用 ! 排除):

# 给全部权限,但禁止改密码、禁止重启
tom  ALL=(ALL)  ALL,!/usr/bin/passwd,!/usr/sbin/reboot

⚠️ 注意:/etc/sudoers 必须用 visudo 命令改,不要直接用 vim 打开改。

为什么?因为 visudo 会在你保存时自动检查语法,写错会提示你,不让你保存。

而如果你用 vim 直接改,语法写错了,所有用户(包括 root)都用不了 sudo 了,那时候连修都修不了(因为修它本身需要 sudo)。这是一个能让你重装系统的坑。

33.5 sudo 常用参数

参数 作用
sudo 命令 提权执行一条命令
sudo -i 切换到 root 的交互式 shell(相当于 su -,但要输自己的密码)
sudo -l 查看自己有哪些 sudo 权限(排查问题很有用)
sudo -u 用户 命令 以指定用户的身份执行,而不是 root
sudo -k 让当前的免密状态立刻失效
# 看看我被授权做什么
sudo -l
# 你会看到类似:
User tom may run the following commands on localhost:
    (ALL) NOPASSWD: ALL

33.6 出错排查:三行报错对照表

报错 原因 怎么办
tom is not in the sudoers file 没授权 用 root 把他加进 wheel(CentOS)或 sudo(Ubuntu)组
Sorry, user tom may not run sudo on localhost 有授权但这条命令不允许 用 sudo -l 看允许什么
sudo: command not found 系统没装 sudo root 执行 yum install -y sudo 或 apt install -y sudo

本章小结

知识点 要点
sudo 是什么 临时借用 root 权限执行一条命令
要输谁的密码 自己的(su - 才要 root 的)
CentOS 授权组 wheel
Ubuntu 授权组 sudo
加进组 usermod -aG wheel tom,之后需重新登录
编辑 sudoers 必须用 visudo,不能用 vim 直接改
NOPASSWD 免输密码,方便但降低安全性
查自己权限 sudo -l

动手练

  1. 用普通用户执行 sudo whoami,输出是什么?为什么?
  2. su - 和 sudo -i 都要输密码,区别是什么?
  3. 为什么改 /etc/sudoers 一定要用 visudo?

参考答案

  1. 输出是 root。因为 sudo 让这条命令以 root 身份执行了。
  2. su - 要输 root 的密码(需要知道 root 密码,所有权限一把抓);sudo -i 要输 自己的密码(只需自己账号密码,且受 sudoers 授权范围限制)。sudo -i 更安全,因为它不暴露 root 密码。
  3. 因为 visudo 会在保存前自动校验语法,写错会提示并不允许保存;直接用 vim 改,语法错误会让所有人都无法使用 sudo,包括 root 自己,可能连修复的机会都没有。

第六篇 装软件

Linux 装软件不是“下载 exe、双击下一步”,而是一条命令从“仓库”里取。 这一篇讲清四种装法,重点是 yum——它是你以后用得最多的一条命令。

第34章 Linux 装软件的四种方式 🔰

学完这一章,你能:说出 Linux 装软件的四种方式,知道每种方式什么时候用。

34.1 一句话:装软件就是往系统里"加东西"

在 Windows 里装软件,一般就是下载一个 .exe,双击,下一步下一步。

在 Linux 里,大部分软件不用点鼠标,而是敲一条命令。装法常分成四种,各有各的用处。

比喻:这就像给家里添家具,四种方式就是四种买法。

方式 生活里像什么 一句话说明
yum 安装 网购,送货上门还包组装 最简单,自动把缺的零件一起送来
rpm 安装 买一箱拆好的家具,说明书没写缺哪个螺丝 装单个安装包,缺零件就装不上
源码编译 买面粉和菜谱,自己在厨房做 最麻烦,但能按口味改
二进制包 精装修,拎包入住 解压改个配置就能跑

34.2 先看看系统里现在有什么

# 列出已经装好的软件包,只看前 3 行
yum list installed | head -3
# 你会看到类似这样的结果:
Loaded plugins: fastestmirror
Installed Packages
acl.x86_64          2.2.51-15.el7          @anaconda

系统里的软件包通常有几百行,所以接 head 只看前几行。

34.3 什么时候用哪一种

  • 有网、想省事 → yum
  • 手上只有一个 .rpm 安装包(或一张软件光盘),或必须装某个指定版本 → rpm
  • 要最新版、要改代码、要关掉某个功能 → 源码编译
  • MySQL、JDK 这类大软件,官方直接给打好包的 → 二进制包

💡 小贴士:还有一种更新的方式叫"容器"(Docker),把软件连环境一起打包,换台机器也能跑。这是进阶内容,现在知道有这回事就行。

34.4 常见坑 ⚠️

  • 以为 Linux 也能双击 .rpm 安装。桌面版可能能双击,服务器上一律用命令。
  • yum 装不上就急着找源码。先看报错,多半是网络或者 yum 源的问题(下一章讲)。
  • rpm 和 yum 混着用。用 rpm 装的包,yum 有时不知道它要什么,越装越容易乱。

本章小结

命令/概念 作用 例子
yum 从软件仓库自动装,解决依赖 yum install -y vim
rpm 手动装单个 .rpm 包 rpm -ivh 包名.rpm
源码编译 自己编译源码 ./configure && make
二进制包 解压即用 tar -xzvf 包.tar.gz
依赖 A 要用到 B,B 就是 A 的依赖 vim 依赖某些库

动手练

  1. 一台服务器不能上网,但手里有一张安装光盘,能用 yum 装软件吗?
  2. 哪种方式可以修改软件的源代码?
  3. 判断:在 Linux 里,软件一般靠双击安装包来安装。(对/错)

参考答案:

  1. 能。把光盘配成本地 yum 源就行,第 36 章会教你 6 步配好。
  2. 源码编译安装。拿到源码后可以改,再自己编译。
  3. 错。Linux 服务器上一般用命令安装。

第35章 yum:最常用的装软件方式 🔰

学完这一章,你能:用 yum 装、卸、查软件,看懂 -y 是干什么的。

35.1 它是什么

yum 是"软件管家"。你说要什么,它去 yum 源里找,把软件和它需要的东西一起装好。

比喻:yum 就是外卖 App。你点一份套餐(软件),店家把配套的餐具(依赖)一起送来,不用你一份一份凑。

依赖:A 软件要用到 B 软件,B 就是 A 的依赖。少一个 B,A 就装不好。这是 rpm 最头疼的地方,yum 专门解决它。

35.2 最小可用:装一个软件

# 装 vim,-y 表示一路同意,不再问你
yum install -y vim
# 你会看到类似这样的结果:
Loaded plugins: fastestmirror
---> Package vim-enhanced.x86_64 2:7.4.629-8.el7_9 will be installed
...
Complete!

看到最后一行 Complete! 就装好了。中途刷很多行是正常的。

35.3 五个命令够用了

命令 作用 例子
yum install -y 软件名 安装(可一次装多个) yum install -y wget tree zip
yum remove 软件名 卸载 yum remove wget
yum update 软件名 升级到新版本 yum update vim
yum search 关键字 不知道包名时先搜 yum search nginx
yum info 软件名 看软件信息 yum info nginx

35.4 -y 到底是什么意思

不加 -y 时,yum 装之前会问你一句:

yum install vim
# 你会看到:
Is this ok [y/d/N]:     ← 停在这里等你输入

输入 y 回车才继续。-y 就是把这一步自动回答成 y。

💡 练手时加 -y 省事;想看清要装什么,就先不加。

35.5 常见坑 ⚠️:报错了先查这两件事

# 1. 网络通不通
ping -c 3 www.baidu.com
# 你会看到:3 packets transmitted, 3 received, 0% packet loss
# 100% packet loss 就是网络问题

# 2. yum 源对不对
yum repolist
# 你会看到:
repo id           repo name             status
base/7/x86_64     CentOS-7 - Base       10019

status 是 0,或报 Cannot find a valid baseurl,就是源没配好(第 36 章)。

还有一点:yum remove 会把依赖它的软件一起删掉,卸载前看清楚要删哪些。

本章小结

命令/概念 作用 例子
yum install -y 安装软件 yum install -y vim
yum remove 卸载软件 yum remove wget
yum search 按名字搜 yum search nginx
-y 自动回答 yes 不加会停在 Is this ok
依赖 软件运行需要的其他软件 yum 自动解决

动手练

  1. 用一条命令装 wget、tree、zip,中间不要停下来问。
  2. 想装一个软件但不知道包名,怎么办?
  3. yum 报 Cannot find a valid baseurl,最可能是哪两个原因?

参考答案:

  1. yum install -y wget tree zip
  2. 先搜:yum search 关键字,从结果里找包名。
  3. 网络不通,或者 yum 源配错了(baseurl 写错、光盘没挂载)。

第36章 配置 yum 源 🔰

学完这一章,你能:配好本地光盘源,没网也能装软件;也知道网络源失效了怎么查。

36.1 yum 源是什么

比喻:yum 是外卖 App,yum 源就是它背后那家超市的地址。地址写错,App 再好也点不了单。

yum 源就是软件仓库(仓库 = 一堆 rpm 包放在一起的地方),分两种:网络源(在互联网上,如阿里云、华为云镜像站)和本地源(在你自己的机器上,如安装光盘、局域网服务器)。

配置都放在 /etc/yum.repos.d/,一个 .repo 文件就是一个仓库。

36.2 配本地光盘源:6 步走

⚠️ 前提:CentOS 7 安装光盘 ISO 已挂到虚拟机(虚拟机设置里"连接 CD/DVD")。

第 1~3 步:确认光盘、建挂载点、挂上去

lsblk
# 你会看到(TYPE 是 rom 的那个就是光盘):
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1  4.4G  0 rom

mkdir -p /media/cdrom
mount -r /dev/sr0 /media/cdrom    # -r 只读,光盘本来也写不进去
ls /media/cdrom
# 你会看到 Packages 和 repodata 都在,说明包齐全:
CentOS_BuildTag  EFI  GPL  Packages  repodata  ...

第 4 步:备份原来的源(用 mv 别用 rm,以后有网要改回来)

cd /etc/yum.repos.d/
mkdir bak && mv *.repo bak/

第 5 步:写新的源文件(vi local.repo,按 i 编辑,粘进下面内容;Esc 后输 :wq 保存)

[c7-media]
name=CentOS-7 - Media
baseurl=file:///media/cdrom/
gpgcheck=0
enabled=1

第 6 步:让 yum 认识这个源,然后就能装软件了

yum makecache
# 你会看到:
c7-media | 3.6 kB  00:00
Metadata Cache Created

36.3 有网时用网络源

CentOS 7 已经在 2024 年 6 月停止维护,官方源已下线。老机器要配源,一般换成镜像站(阿里云、华为云、清华等)的地址:做法和第 5 步一样,只换 baseurl。

baseurl=https://镜像站给的地址/centos-vault/7.9.2009/os/x86_64/

💡 地址请去镜像站网页复制,不要手敲,错一个字母就下不了。新机器建议直接用 Rocky Linux、AlmaLinux 或 Ubuntu,不用再折腾 CentOS 7。

36.4 常见坑 ⚠️

  • baseurl 写成 file://media/cdrom/(少一个斜杠)→ 本地路径必须是三条斜杠 file:///
  • 光盘没挂载就 yum makecache → 报 Cannot find a valid baseurl
  • 写了 gpgcheck=1 却没配 gpgkey → GPG 校验失败,新手先写 gpgcheck=0
  • 直接 rm 掉默认源,以后想恢复很麻烦

本章小结

命令/概念 作用 例子
/etc/yum.repos.d/ 存 yum 源配置的文件夹 —
mount -r /dev/sr0 /media/cdrom 挂载光盘(只读) 配本地源第 3 步
yum makecache 生成缓存,验证源能不能用 yum makecache
yum repolist 看配了哪些源 yum repolist
file:/// 本地路径写法,三条斜杠 file:///media/cdrom/

动手练

  1. local.repo 里写的是 baseurl=file://media/cdrom/,yum makecache 一直报错,问题在哪?
  2. yum repolist 里某个源的 status 是 0,说明什么?
  3. 配本地源时,为什么建议 mv *.repo bak/ 而不是 rm *.repo?

参考答案:

  1. 少了一个斜杠,本地路径必须是 file:///。
  2. 这个仓库里一个可用的软件包都没有,源配错了或者光盘没挂载好。
  3. mv 只是挪走,随时能挪回来;rm 删了就没了。

第37章 rpm:直接安装单个安装包 🔧

学完这一章,你能:装一个本地的 .rpm 包,查看它装在哪、属于谁,也知道它为什么会报"依赖错误"。

37.1 它是什么

rpm 是 RedHat 系的老牌安装工具。.rpm 文件就是"打包好的软件",里面有程序、配置文件、帮助文档。

比喻:rpm 包是一箱已经拆好的家具,箱里有一张零件清单。它能告诉系统"东西放哪",但不会替你去买缺的螺丝(依赖)。缺一颗就装不上。

安装包后缀 属于哪个系 常见系统
.rpm RedHat 系 CentOS、麒麟
.deb Debian 系 Ubuntu、UOS

37.2 最小可用:安装

# 安装当前文件夹下的一个 rpm 包
rpm -ivh 软件包名.rpm
# 你会看到类似这样的结果:
Preparing...             ################################# [100%]
   1:软件包名-1.0-1.el7  ################################# [100%]

三个字母:-i 安装,-v 显示过程,-h 显示进度条。

37.3 五个查询命令(比安装更常用)

命令 作用
rpm -qa 列出所有已安装的包
rpm -q 包名 查某个包是否已安装
rpm -qi 包名 看这个包的详细信息
rpm -ql 包名 看它装了哪些文件
rpm -qf 文件路径 看这个文件属于哪个包
rpm -q vim-enhanced
# 你会看到:
vim-enhanced-7.4.629-8.el7_9.x86_64

rpm -qf /usr/bin/vim
# 你会看到:
vim-enhanced-7.4.629-8.el7_9.x86_64

rpm -qf 很好用:看到一个命令不知道是哪个包提供的,一查就知道。

37.4 卸载

rpm -evh 软件包名
# 例如:
rpm -evh wget

⚠️ -e 后面写的是包名(wget),不是文件名(wget-1.14-18.el7.x86_64.rpm)。

37.5 常见坑 ⚠️

  • 依赖报错(最常见):error: Failed dependencies:,就是缺东西。 解决:改用 yum 装这个本地包,它会自动补依赖:

bash yum localinstall -y /路径/软件包名.rpm

  • 拿文件名当包名:rpm -q wget-1.14.rpm 查不到,要写 rpm -q wget。

  • 以为 rpm 装完就完事:rpm 只管"放文件",不会帮你启动服务、改配置。

本章小结

命令 作用 例子
rpm -ivh 安装 rpm -ivh a.rpm
rpm -evh 卸载(写包名) rpm -evh wget
rpm -qa 列出所有包 rpm -qa \| wc -l
rpm -ql 看包里的文件 rpm -ql wget
rpm -qf 文件属于哪个包 rpm -qf /usr/bin/vim

动手练

  1. 装了一个包,想知道它到底往系统里放了哪些文件,用哪个命令?
  2. 看到 /usr/sbin/sshd 这个程序,想知道它属于哪个软件包?
  3. rpm -ivh 报 Failed dependencies,最简单的解决办法是什么?

参考答案:

  1. rpm -ql 包名
  2. rpm -qf /usr/sbin/sshd(结果是 openssh-server)
  3. 用 yum localinstall -y 包路径 装,让 yum 把缺的依赖补上。

第38章 源码编译安装 🔧

学完这一章,你能:照着步骤把 nginx 从源码装进系统,知道每一步在干什么。

38.1 它是什么

源码就是程序员写的原始代码,不能直接运行,要先用编译器"翻译"成程序。

比喻:源码是面粉和菜谱。rpm/yum 是超市买的半成品菜,热一下就能吃;自己做饭麻烦,但想少放盐、多放辣椒都行——要最新版、要改代码时就该用它。

38.2 三步口诀

步骤 命令 生活里像什么
配置 ./configure 量厨房尺寸,定做橱柜
编译 make 照着尺寸把柜子做出来
安装 make install 把柜子搬进厨房装好

38.3 跟着做:装 nginx

需要联网。版本号以官网为准,这里用 1.24.0 举例。

第 1 步:装编译工具(第一次装一定要先装,不然 configure 会报错)

yum install -y gcc make pcre-devel zlib-devel openssl-devel wget
# 你会看到最后:
Complete!

第 2~3 步:下载源码包,解压后进去

cd /usr/local/src
wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 你会看到:
... 'nginx-1.24.0.tar.gz' saved

tar -xzvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

第 4 步:配置(--prefix 指定装到哪个文件夹)

./configure --prefix=/usr/local/nginx
# 你会看到最后一段:
Configuration summary
  + using system PCRE library
  ...

第 5 步:编译(要等一两分钟,屏幕一直刷是正常的)

make
# 你会看到最后:
make[1]: Leaving directory `/usr/local/src/nginx-1.24.0'

第 6 步:安装,然后验证

make install
# 一般没有大段输出,回到命令行提示符就是成功了
/usr/local/nginx/sbin/nginx -v
# 你会看到:
nginx version: nginx/1.24.0

38.4 常见坑 ⚠️

  • configure 报 C compiler cc is not found → 没装 gcc
  • 报 the HTTP rewrite module requires the PCRE library → 没装 pcre-devel
  • make 卡着不动不是死机,是在编译,等它
  • 源码装的软件没有 yum remove,卸载要自己删目录,装之前先想清楚装哪;编译失败想重来,把整个源码文件夹删掉重新解压最干净

本章小结

步骤/命令 作用
yum install gcc make ... 准备编译工具
./configure --prefix=路径 检查环境、定安装位置
make 编译成程序
make install 复制到安装目录
nginx -v 验证版本

动手练

  1. 把步骤排好序:make、./configure、make install、解压源码。
  2. ./configure 报 PCRE 相关的错误,应该装哪个包?
  3. 为什么源码装的软件不能 yum remove 卸掉?

参考答案:

  1. 解压源码 → ./configure → make → make install
  2. pcre-devel
  3. 它不在 yum 的已安装清单里,yum 根本不知道它的存在。要卸载只能去 --prefix 指定的目录手动删。

第39章 压缩和解压 🔰

学完这一章,你能:看到后缀就知道该怎么解开,也会自己打包压缩。

39.1 为什么要压缩

比喻:给棉被抽真空。一床被子能压成薄薄一片,好搬好放。文件也一样:压小了,占地方少,传得快。

压缩会改变文件,所以和压缩包打交道,永远记住一句话:压之前想清楚,解之前看仔细。

39.2 看到后缀就知道怎么解

后缀 是什么 解开用什么
.zip Windows/Linux 都认,最通用 unzip 包名.zip
.gz 单个文件压缩 gzip -d 文件.gz
.tar 只打包,没压缩 tar -xvf 包名.tar
.tar.gz 打包 + gzip 压缩 tar -xzvf 包名.tar.gz
.tar.bz2 打包 + bzip2 压缩 tar -xjvf 包名.tar.bz2
.tar.xz 打包 + xz 压缩(压得最小) tar -xJvf 包名.tar.xz

39.3 zip 和 unzip(和 Windows 通用)

# 压缩一个文件夹,-r 表示连同里面的东西一起压
zip -r 备份.zip 要压缩的文件夹
# 你会看到:
  adding: 要压缩的文件夹/a.txt (deflated 40%)

# 解压到当前目录
unzip 备份.zip
# 你会看到:
   creating: 要压缩的文件夹/
  inflating: 要压缩的文件夹/a.txt

⚠️ 压文件夹必须加 -r,否则只会压一个空文件夹进去,里面什么都没有。

39.4 tar 的记忆口诀

tar 的参数多,但记住这句口诀就够用:

打包 c,解开 x;gzip z,bzip2 j,xz 是大写 J;文件 f,过程 v,解压到别处用 C。

所以:-czvf 打包压缩,-xzvf 解压,看到这两个就认识 tar.gz 了。

39.5 tar 三个最常用的写法

# 1. 打包并压缩一个文件夹
tar -czvf etc.tar.gz /etc
# 你会看到(会刷很多行):
tar: Removing leading `/' from member names
etc/
etc/passwd
...

# 2. 解压到当前目录
tar -xzvf etc.tar.gz

# 3. 解压到指定文件夹
tar -xzvf etc.tar.gz -C /tmp

💡 解压前想先看看包里有什么?把 x 换成 t:tar -tzvf etc.tar.gz,只列清单,不动文件。

39.6 常见坑 ⚠️

  • gzip 会把原文件删掉,只留 .gz。想保留原文件就用 tar -czvf(tar 不删原文件)。
  • tar 的 -f 必须最后写、紧跟包名。
  • 用 tar -xzvf 解 .tar.bz2 会报错,算法要对应上(bz2 用 j)。
  • 在根目录打包会提示 Removing leading '/',这是正常提示,不是报错。

本章小结

命令 作用 例子
zip -r 压缩文件夹 zip -r a.zip 文件夹
unzip 解 zip unzip a.zip
tar -czvf 打包 + gzip 压缩 tar -czvf a.tar.gz 文件夹
tar -xzvf 解 tar.gz tar -xzvf a.tar.gz -C /tmp
gzip -d 解单个 .gz gzip -d a.txt.gz

动手练

  1. nginx-1.24.0.tar.gz 应该用什么命令解压?
  2. 你想把 /data 文件夹打包成 data.tar.gz,命令怎么写?
  3. gzip a.txt 之后,a.txt 还在吗?

参考答案:

  1. tar -xzvf nginx-1.24.0.tar.gz
  2. tar -czvf data.tar.gz /data
  3. 不在了。gzip 只保留 a.txt.gz,原文件被删掉。要保留请用 tar。

第七篇 磁盘管理

这一篇是全书最硬的一块骨头:分区、格式化、挂载。 但只要抓住一个比喻——毛坯楼 → 隔房间 → 铺地板 → 装门牌,四个词一次就能讲通。

第40章 磁盘、分区、格式化、挂载:四个词一次讲清 🔰

学完这一章,你能:用一个比喻说清这四个词,并亲手把一块新硬盘存上文件。

40.1 一条比喻:你买了一栋毛坯楼

把新硬盘想成一栋刚交房的毛坯楼,四个词就是四个动作:

词 生活里 命令 做完之后
磁盘 整栋毛坯楼 lsblk 查看 出现 /dev/sdb
分区 把楼隔成几个房间 fdisk /dev/sdb 出现 /dev/sdb1
格式化 给房间铺地板(装文件系统) mkfs.ext4 /dev/sdb1 房间能放东西了
挂载 给房间装门牌,开门让系统进去 mount /dev/sdb1 /data 能往 /data 存文件

所以四个词的关系是:一栋楼 → 隔成房间 → 铺地板 → 装门牌开门。

磁盘名:/dev/sda 是第一块硬盘,/dev/sdb 是第二块;/dev/sdb1 是第二块盘的第 1 个分区。

40.2 为什么新硬盘不能直接存文件

因为系统面对一整块新硬盘时,只看到"一栋楼",不知道:

  • 从哪间房进去(没有分区)
  • 东西放进去按什么规矩摆(没有文件系统)
  • 从哪个文件夹能走到它(没有挂载点)

所以顺序不能反:分区 → 格式化 → 挂载,少一步都用不了。

40.3 三步实操(跟着敲)

⚠️ 先用 lsblk 确认 /dev/sdb 是一块空盘。千万不要拿 /dev/sda 练手,那是系统盘!

第 1 步:分区(在楼里隔出一间 10G 的房间)

fdisk /dev/sdb
# 你会看到(← 后面是你要输入的内容):
Command (m for help): n            ← 输入 n,新建分区
Select (default p):                ← 回车,默认选主分区
Partition number (1-4, default 1): ← 回车,默认 1 号
First sector (...):                ← 回车,用默认起点
Last sector (...): +10G            ← 输入 +10G,给这间房 10G
Command (m for help): w            ← 输入 w,保存

第 2 步:格式化(给房间铺上 ext4 地板)

mkfs.ext4 /dev/sdb1
# 你会看到:
Creating filesystem with 2621440 4k blocks and 655360 inodes
...

第 3 步:挂载(装上门牌,从 /data 这扇门进去)

mkdir -p /data
mount /dev/sdb1 /data
df -h | grep sdb1
# 你会看到:
/dev/sdb1   9.8G   37M  9.3G   1%   /data

再试一下真的能存东西:

echo hello > /data/test.txt
cat /data/test.txt
# 你会看到:
hello

40.4 常见坑 ⚠️

  • 只分区没格式化就挂载 → 报 you must specify the filesystem type,回去做第 2 步
  • 格式化会清空这块分区上的所有数据,敲 mkfs 前先 lsblk 确认设备名
  • 只 mount 不写 /etc/fstab,重启后挂载就没了(第 43 章)
  • 挂载点如果是已有文件的文件夹,原来的文件会被"盖住",卸载后才看得见

本章小结

命令/概念 作用 例子
磁盘 一整块硬盘 /dev/sdb
分区 把硬盘隔成几块 fdisk /dev/sdb
格式化 装文件系统,让分区能存文件 mkfs.ext4 /dev/sdb1
挂载 把分区接到某个文件夹 mount /dev/sdb1 /data
查看 看磁盘和挂载情况 lsblk、df -h

动手练

  1. 填空:磁盘像 _,分区像 ,格式化像 _,挂载像 。
  2. 把三个命令排成正确顺序:mount、mkfs.ext4、fdisk。
  3. 一块新硬盘,敲完 fdisk 分了区,能马上 echo hi > /dev/sdb1 存文件吗?为什么?

参考答案:

  1. 一栋毛坯楼;把楼隔成房间;给房间铺地板;给房间装门牌并开门。
  2. fdisk(分区)→ mkfs.ext4(格式化)→ mount(挂载)。
  3. 不能。分区只是"隔好了房间",还没有文件系统(没铺地板),也没挂载(没门牌)。要先格式化再挂载,然后往挂载点里存文件。

第41章 分区:fdisk 与 gdisk 🔧

学完这一章,你能:在一块新硬盘上切出一两个分区,也知道 MBR 和 GPT 该选哪个。

41.1 它是什么

比喻:分区就是在硬盘上"砌墙隔房间",每面墙的位置和大小记在分区表里,它就像一张户型图。MBR 是 1980 年代的老户型图:最多 4 间房,总面积不能超过 2TB;GPT 是新户型图:128 间房,面积可以非常大。

41.2 MBR 和 GPT 怎么选

MBR GPT
分区工具 fdisk gdisk
最多几个分区 4 个主分区 128 个
最大支持磁盘 2TB 非常大(PB 级)
适合 小盘、老系统 大盘、新系统

一句话:硬盘超过 2TB 就必须用 GPT,否则 2TB 以后的空间用不上。

41.3 先看清有几块盘

lsblk
# 你会看到:
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk
├─sda1   8:1    0    1G  0 part /boot
└─sda2   8:2    0   19G  0 part /
sdb      8:16   0   10G  0 disk

有 MOUNTPOINT 的盘正在用(sda 是系统盘,别动);sdb 什么都没挂,可以练手。

41.4 fdisk 完整流程

第 1、2 步:进去,按 m 看菜单(不用背,随时能按)

fdisk /dev/sdb
# 你会看到:
Command (m for help): m
   d   delete a partition
   n   add a new partition
   p   print the partition table
   q   quit without saving changes
   w   write table to disk and exit

第 3 步:按 n 新建,一路回车,最后问大小时输 +10G

第 4、5 步:按 p 看结果,按 w 保存退出

Command (m for help): p
# 你会看到:
   Device Boot    Start       End      Blocks   Id  System
/dev/sdb1          2048  20973567  10485760   83  Linux
Command (m for help): w
# 写入完成后就回到命令行

⚠️ w 是保存,q 是不保存退出。手抖按了 q,前面全白干。

第 6 步:让系统重新读分区表

partprobe /dev/sdb
# 没有输出就是成功
lsblk
# 你会看到多了一个 sdb1

41.5 gdisk:大盘用这个

yum install -y gdisk
gdisk /dev/sdc    # 进去以后和 fdisk 一样:n 新建、w 保存、q 不保存

41.6 常见坑 ⚠️

  • 设备名写错 → 分区表被改写,数据可能全丢。动手前 lsblk 看三遍
  • 忘了按 w,分区只在内存里,退出就没了
  • 分完 lsblk 看不到,先 partprobe /dev/sdb

本章小结

命令/概念 作用 例子
fdisk -l 看所有磁盘和分区 fdisk -l /dev/sdb
fdisk /dev/sdb 进入分区界面 —
n / d / p 新建 / 删除 / 查看 在 fdisk 菜单里按
w / q 保存退出 / 不保存退出 千万别搞混
gdisk GPT 分区工具 gdisk /dev/sdc

动手练

  1. 一块 4TB 的新硬盘,用 fdisk 分区最多只能用到多少?为什么?
  2. fdisk 里按了 n 分了区,最后按 q 退出,分区还在吗?
  3. 分完区 lsblk 没看到新分区,先做什么?

参考答案:

  1. 只能用到 2TB。fdisk 用的是 MBR 分区表,MBR 最大只支持 2TB,4TB 的盘要用 gdisk。
  2. 不在。q 是不保存退出,等于什么都没做。
  3. 执行 partprobe /dev/sdb,让系统重新读分区表。

第42章 格式化:mkfs 🔧

学完这一章,你能:给分区装上 ext4 或 xfs 文件系统,也知道格式化到底做了什么。

42.1 它是什么

格式化就是给房间铺地板、划格子,让系统知道东西该放哪。铺的这层地板叫文件系统。

比喻:分区只是把墙砌好了,地面还是水泥,家具(文件)放不进去。格式化就是把地面铺平、画好格子。

两个必须知道的名词:

  • block(数据块,默认 4K):地板上的一个格子,文件内容放在格子里
  • inode(文件的"身份证"):记录文件的属主、大小、时间、放在哪些格子

42.2 常见文件系统

名字 用在哪 特点
ext4 CentOS 6 及以前的默认 最通用、稳定,能缩容(麻烦)
xfs CentOS 7 开始的默认 大文件快,不能缩容,只能扩
swap 交换分区专用 不放文件,是给内存当备用(第 44 章)

Windows 常用 NTFS、FAT32,和 Linux 的 ext4、xfs 不通用。

42.3 最小可用:格式化为 ext4

mkfs.ext4 /dev/sdb1
# 你会看到:
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
...
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

42.4 格式化为 xfs

mkfs.xfs /dev/sdb2
# 你会看到:
meta-data=/dev/sdb2    isize=512    agcount=4, agsize=655360 blks
data     =             bsize=4096   blocks=2621440, imaxpct=25
...

💡 两个小选项:mkfs.ext4 -L 卷标 设备 给分区起个名字;mkfs -t ext4 设备 是通用写法。

42.5 常见坑 ⚠️

  • ⚠️ 格式化 = 清空。这块分区上的数据全没了,找不回来。敲之前先 lsblk 确认设备名。
  • 格式化了整块盘(/dev/sdb 而不是 /dev/sdb1)→ 相当于把文件直接堆在没隔间的毛坯房里,以后再想分房间,数据就没了
  • xfs 不能缩小,选类型前想清楚
  • 分区和格式化不是一回事:分区只隔墙,格式化才铺地板

本章小结

命令/概念 作用 例子
mkfs.ext4 格式化为 ext4 mkfs.ext4 /dev/sdb1
mkfs.xfs 格式化为 xfs mkfs.xfs /dev/sdb2
block 磁盘最小存储单位,默认 4K 文件内容放这里
inode 文件的"身份证" 记录属主、大小、时间
文件系统 管理和查找文件的一套规则 ext4、xfs

动手练

  1. 分区做完了,mount 报 you must specify the filesystem type,少了哪一步?
  2. 一块硬盘主要存 30G 以上的大文件,ext4 和 xfs 选哪个更合适?
  3. 判断:格式化只是换个"格式",数据还在。(对/错)

参考答案:

  1. 少了格式化,先 mkfs.ext4 /dev/sdb1(或 mkfs.xfs)。
  2. xfs。它处理大文件更快,也是 CentOS 7 的默认文件系统。
  3. 错。格式化会重建文件系统,原有数据基本找不回来。

第43章 挂载:mount、umount 与 /etc/fstab 🔧

学完这一章,你能:把分区挂到文件夹上用起来,也能写成开机自动挂载。

43.1 它是什么

挂载就是给房间装门、挂门牌,让系统能走进这个分区放东西。

比喻:分区和格式化都做完了,房间也铺好地板了,但系统还不知道"从哪扇门进去"。mount 就是装门并挂门牌,门牌上的地址叫挂载点。

挂载点必须是一个文件夹,而且最好是个空文件夹。

43.2 临时挂载:三步走

# 第 1 步:建挂载点(给房间装门框)
mkdir -p /data/A

# 第 2 步:挂载(把门装上,指定从 /data/A 进去)
mount /dev/sdb1 /data/A

# 第 3 步:验证(看看门后是不是这块分区)
df -h
# 你会看到:
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        19G  3.1G   16G  17% /
/dev/sdb1       9.8G   37M  9.3G   1% /data/A

这样挂是临时的,重启就没了。不要了就卸载,两种写法都对(按设备、按挂载点):

umount /dev/sdb1
umount /data/A

💡 卸载时报 target is busy,是因为你正站在这个文件夹里,或者有程序在用。先 cd / 离开再卸。

43.3 永久挂载:/etc/fstab

比喻:/etc/fstab 是物业的门牌登记表。开机时系统照这张表,把每个房间的门都开好。

先查 UUID(每个文件系统的"身份证号",比 /dev/sdb1 稳定):

lsblk -f
# 你会看到:
NAME   FSTYPE  UUID                                 MOUNTPOINT
sdb1   ext4    170b7ad5-d3f9-4183-9bec-644d792a0883

每一行六列,用空格隔开:

列 写什么 例子
1 设备(推荐 UUID) UUID=170b7ad5-...
2 挂载点 /data/A
3 文件系统类型 ext4
4 挂载选项 defaults
5 是否备份 0
6 开机是否检查 0
UUID=170b7ad5-d3f9-4183-9bec-644d792a0883  /data/A  ext4  defaults  0 0

⚠️ 警告:/etc/fstab 写错,系统可能开不了机(开机卡在紧急模式,进不去系统)。必须按这三步做:

  1. 改之前先备份:cp /etc/fstab /etc/fstab.bak
  2. 改完立刻验证:mount -a(把 fstab 里所有条目试挂一遍,没报错才算对)
  3. 真出错了,用备份盖回去:cp /etc/fstab.bak /etc/fstab

43.4 常见坑 ⚠️

  • 挂载点选了一个已经有文件的文件夹 → 原来的文件被"盖住",看不见但没丢,卸载后又出现
  • fstab 里写 /dev/sdb1 不牢靠:加硬盘后设备名可能变,推荐用 UUID=
  • 改完 fstab 不跑 mount -a 就重启,等于拿系统赌博
  • 只挂载不写 fstab,重启后白干

本章小结

命令/概念 作用 例子
mount 挂载(临时) mount /dev/sdb1 /data/A
umount 卸载 umount /data/A
/etc/fstab 开机自动挂载的配置 六列,用 UUID 更稳
mount -a 按 fstab 全部挂一遍(验证) 改完 fstab 必做
lsblk -f 查 UUID 和文件系统 写 fstab 前先查

动手练

  1. mount /dev/sdb1 只写了设备没写挂载点,能挂成功吗?
  2. 卸载时提示 target is busy,怎么解决?
  3. 改完 /etc/fstab,为什么一定要跑一遍 mount -a?

参考答案:

  1. 不能。必须指定挂载点,写成 mount /dev/sdb1 /data/A。
  2. 先 cd / 离开那个文件夹,确认没有程序在用它,再 umount。
  3. mount -a 会把 fstab 里每一条都试着挂一遍,有错马上报出来。不验证就重启,写错会导致开不了机。

第44章 swap 交换分区 🔧

学完这一章,你能:给系统加一块 swap 交换分区,也知道它到底有什么用。

44.1 它是什么

比喻:swap 是内存的备用抽屉。内存像书桌,桌面放不下了,就把暂时不用的东西先塞进抽屉(硬盘上),腾出桌面。

注意:抽屉比桌面慢得多。swap 只是救急,让系统不崩,不能拿它当内存用。

44.2 先看现在有没有 swap

free -h
# 你会看到:
              total        used        free      shared  buff/cache   available
Mem:           1.8G        456M        120M        9.6M        1.2G        1.1G
Swap:          2.0G          0B        2.0G

最后一行就是 swap。swapon -s 也能看,输出更短。

44.3 跟着做:加一块 2G 的 swap 分区

第 1 步:分出一个 2G 分区,把类型改成 82(swap)

fdisk /dev/sdb
# n 新建一个 +2G 的分区 → 得到 /dev/sdb3
# t 改分区类型 → 输入 82(Linux swap)
# w 保存退出

第 2 步:格式化成 swap

mkswap /dev/sdb3
# 你会看到:
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=6b7e0c4a-...

第 3 步:打开它

swapon /dev/sdb3
free -h
# 你会看到 Swap 那一行的 total 变大了:
              total        used        free
Swap:          4.0G          0B        4.0G

第 4 步:关掉它

swapoff /dev/sdb3

44.4 让它开机自动生效

和挂载一样,写进 /etc/fstab:

UUID=6b7e0c4a-...   swap   swap   defaults   0 0

检查有没有写对:swapon -a(它会试着启用 fstab 里所有 swap 条目,没报错就是对的)。

44.5 常见坑 ⚠️

  • swap 不是越大越好:一般内存的 1~2 倍;服务器 8G 内存配 4~8G 很常见
  • ⚠️ mkswap 会清掉这块分区上的数据
  • 只 mkswap 没 swapon,等于没启用(free -h 里看不到变化)
  • 自动挂载写错 fstab 同样会开不了机,改之前先备份

本章小结

命令/概念 作用 例子
swap 内存的备用空间(在硬盘上) 内存不够时救急
mkswap 把分区格式化成 swap mkswap /dev/sdb3
swapon / swapoff 启用 / 关闭 swapon /dev/sdb3
free -h 看内存和 swap 用了多少 free -h
swapon -s 看当前启用的 swap swapon -s

动手练

  1. 内存只有 2G 的服务器,加 swap 有什么用?
  2. mkswap 之后 free -h 里 Swap 还是 0B,少了哪一步?
  3. 判断:swap 越快越好,能代替内存。(对/错)

参考答案:

  1. 内存不够时把暂时不用的数据挪到硬盘上,防止系统因为没内存而崩溃。
  2. 少了 swapon /dev/sdb3,只是格式化了还没启用。
  3. 错。swap 在硬盘上,比内存慢很多,只能救急,不能当内存用。

第45章 LVM:能变大变小的硬盘 🔧

学完这一章,你能:看懂 LVM 里的 PV、VG、LV 是什么,也能看懂别人给硬盘扩容时敲的命令。

45.1 为什么需要它

普通分区切了 10G 就是 10G,用满了只能重装或者加新盘。

LVM 让硬盘"像橡皮泥":先攒一堆空间,用多少切多少,不够了随时加。

45.2 比喻:积木 → 积木箱 → 抽屉

  • PV(物理卷):一块积木。用命令把整块硬盘变成一块积木
  • VG(卷组):积木箱。把所有积木倒进一个大箱子,箱子里的空间随便抓
  • LV(逻辑卷):抽屉。从箱子里抓一堆积木拼成的抽屉;抽屉不够用,就从箱子里再抓几块加上去

45.3 三个词一张表

简称 全名 生活里 常用命令
PV 物理卷 一块积木 pvcreate、pvs、pvdisplay
VG 卷组 积木箱 vgcreate、vgs、vgdisplay
LV 逻辑卷 抽屉 lvcreate、lvs、lvdisplay

45.4 从零做一遍(看得懂就行)

流程:硬盘 → pvcreate → vgcreate → lvcreate → mkfs → mount

pvcreate /dev/sdb /dev/sdc
# 你会看到:
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.

vgcreate vg1 /dev/sdb /dev/sdc
# 你会看到:
  Volume group "vg1" successfully created

lvcreate -n lv1 -L 10G vg1
# 你会看到:
  Logical volume "lv1" created.

mkfs.ext4 /dev/vg1/lv1      # 和普通分区一样格式化
mkdir -p /data
mount /dev/vg1/lv1 /data
df -h | grep lv1
# 你会看到:
/dev/mapper/vg1-lv1   10G   33M   10G   1% /data

发现没有:LV 上格式化、挂载的写法,和第 42、43 章完全一样。

45.5 最常用的一步:扩容

lvextend -L +10G /dev/vg1/lv1
# 你会看到:
  Size of logical volume vg1/lv1 changed from 10.00 GiB to 20.00 GiB.

resize2fs /dev/vg1/lv1     # ext4 用这条,让文件系统认新地盘
# 你会看到:
The filesystem on /dev/vg1/lv1 is now 5242880 (4k) blocks long.

💡 xfs 文件系统用 xfs_growfs /data(接挂载点)。VG 里没空间了,就加盘:pvcreate /dev/sdd 再 vgextend vg1 /dev/sdd。

45.6 常见坑 ⚠️

  • 扩容易,缩容难:xfs 不能缩;ext4 缩容要卸载、要按顺序,新手别碰
  • lvextend 之后必须 resize2fs,不然 df -h 看到的还是老大小(最常见问题)
  • ⚠️ 对根分区 / 乱缩容,可能直接把系统弄坏
  • 扩容完用 df -h 确认,别只看 lvextend 成功的提示

本章小结

命令/概念 作用 例子
PV 物理卷(积木) pvcreate /dev/sdb
VG 卷组(积木箱) vgcreate vg1 /dev/sdb
LV 逻辑卷(抽屉) lvcreate -n lv1 -L 10G vg1
lvextend 扩大 LV lvextend -L +10G /dev/vg1/lv1
resize2fs 让 ext4 认新容量 resize2fs /dev/vg1/lv1

动手练

  1. 填空:PV 像 _,VG 像 _,LV 像 ____。
  2. lvextend -L +10G 之后 df -h 还是原来大小,少做了什么?
  3. 一块 20T 的硬盘要做 LVM,用 fdisk 分区有什么问题?

参考答案:

  1. 一块积木;积木箱;从箱子里拼出来的抽屉。
  2. 少了 resize2fs /dev/vg1/lv1(xfs 用 xfs_growfs 挂载点)。
  3. fdisk 用 MBR,最大只支持 2TB,要用 gdisk 走 GPT。

第46章 RAID:多块硬盘合作 🔧

学完这一章,你能:看懂 RAID 0/1/5/6/10 各是什么,也知道别人为什么这么选。

46.1 它是什么

RAID 就是把几块硬盘"捆在一起"干活,目的只有两个:更快、更安全(有时两个都要)。

比喻:几个人分工合作。

  • RAID 0:两个人一起搬箱子,一人搬一半。快,但箱子摔了谁都拼不全 → 没有备份
  • RAID 1:两个人各抄一份一样的内容。安全,但一份内容花两份钱 → 只有一半容量能用
  • RAID 5:大家轮流记"别人的账"(校验码)。倒下一个,剩下的能把它那份算回来
  • RAID 6:两个记账员。倒下两个也能算回来
  • RAID 10:先两两一组互相抄(RAID 1),再两组一起搬(RAID 0)。又快又安全,就是贵

46.2 对比表(建议背下来)

级别 最少几块盘 读写速度 坏几块还能用 可用容量 适合
RAID 0 2 最快 0 块(全丢) 100% 临时数据、缓存、视频剪辑
RAID 1 2 读快写一般 1 块 50% 系统盘、重要资料
RAID 5 3 读快写中等 1 块 (n-1)/n 文件服务器、中小数据库
RAID 6 4 读快写较慢 2 块 (n-2)/n 大容量存储、关键数据
RAID 10 4 很快 每组 1 块 50% 数据库、交易系统

n 是硬盘块数。比如 4 块盘做 RAID 5,能用的是 (4-1)/4,也就是 3/4 的容量。

46.3 常见坑 ⚠️

  • RAID ≠ 备份! RAID 防的是"硬盘坏了",防不了"手一抖 rm -rf",备份要另外做。
  • RAID 0 一块盘坏,全部数据没了,上面别放要紧的东西
  • RAID 5 重建时如果另一块盘再坏,数据就没了,所以重要数据用 RAID 6 或 10
  • 软 RAID(mdadm)要占用 CPU,生产环境常用硬件 RAID 卡

46.4 软 RAID 长什么样(看得懂就行)

yum install -y mdadm
mdadm -Cv /dev/md0 -l 5 -n 3 /dev/sdb /dev/sdc /dev/sdd
# 你会看到:
mdadm: array /dev/md0 started.

cat /proc/mdstat
# 你会看到:
md0 : active raid5 sdd[2] sdc[1] sdb[0]
      41908224 blocks super 1.2 level 5, 512k chunk

意思是:用 3 块盘(-n 3)做了一个 5 级 RAID(-l 5),设备叫 /dev/md0。做好之后照样 mkfs.ext4 /dev/md0、mount。

本章小结

命令/概念 作用 例子
RAID 0 拼速度,没有备份 2 块盘,容量 100%
RAID 1 做镜像,最安全 2 块盘,容量 50%
RAID 5 速度、容量、安全折中 最少 3 块盘
RAID 10 又快又安全,最贵 最少 4 块盘
mdadm 做软 RAID 的命令 mdadm -Cv /dev/md0 ...

动手练

  1. 4 块 1TB 的盘做 RAID 5,实际能用多少容量?
  2. 公司账本这种绝对不能丢的数据,不考虑成本,选哪个 RAID?
  3. 判断:做了 RAID 1 就不用做备份了。(对/错)

参考答案:

  1. (4-1)/4 × 4TB = 3TB。
  2. RAID 10(或 RAID 6)。RAID 10 又快又安全,就是贵。
  3. 错。RAID 只能防硬盘坏,防不了误删、病毒、整机故障,备份必须另外做。

第八篇 日常运维命令

这一篇是“值班手册”:机器快不快、盘满不满、网通不通、文件在哪。 命令按“我要排查什么”来组织,而不是按字母表,方便你遇到问题时直接翻。

第47章 查看系统状态 🔰

学完这一章,你能:用几条命令说清这台机器是什么系统、几个核、多少内存、磁盘还剩多少。

47.1 先看仪表盘

接手一台 Linux 像接手一辆没开过的车,先看仪表盘:油量(内存)、水温(CPU)、车型(系统版本)。这一章的命令都"只看不改",敲错也安全。

47.2 它是什么系统

uname -a
# 你会看到类似这样:
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP ... x86_64 GNU/Linux

3.10.0-1160.el7 是内核版本,x86_64 是 64 位架构。

cat /etc/os-release
# 你会看到类似这样:
NAME="CentOS Linux"
PRETTY_NAME="CentOS Linux 7 (Core)"

💡 小贴士:找人帮忙时,把 PRETTY_NAME 那一行发过去,别人立刻知道你在什么系统上。

47.3 几个核、多少内存

lscpu
# 你会看到类似这样(前两行就够):
Architecture:        x86_64
CPU(s):              2
free -h
# 你会看到类似这样:
              total        used        free      available
Mem:           1.8G        211M        1.3G        1.4G

available 才是"新程序真正还能用多少"。free 很小不用慌,Linux 会拿空闲内存去做缓存。

47.4 磁盘还剩多少

df -h
# 你会看到类似这样:
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda2        55G  2.2G   53G    4% /
/dev/sda1      1014M  145M  870M   15% /boot

-h 是把字节换成人看得懂的 G、M。重点看"已用%"和 / 那一行。

⚠️ 常见坑:df -h 只列已经挂载的文件系统。新加的硬盘没格式化、没挂载,它不会出现,别以为硬盘坏了。tmpfs 那几行是内存里的临时文件系统,不是真硬盘。

47.5 这台机器叫什么名字

hostname
# 你会看到类似这样:
localhost.localdomain
hostnamectl set-hostname web01   # 永久改主机名,需要 root
# 重新登录,或敲一次 bash 让提示符刷新:
bash
# 提示符变成:
[root@web01 ~]#

⚠️ 常见坑:hostname 新名字 只是临时改,重启就没了;永久生效必须用 hostnamectl set-hostname。

本章小结

命令 作用 例子
uname -a 看内核版本和架构 uname -a
cat /etc/os-release 看发行版名称 cat /etc/os-release
lscpu 看 CPU 核数和型号 lscpu
free -h 看内存使用情况 free -h
df -h 看各分区用了多少 df -h
hostnamectl 永久改主机名 hostnamectl set-hostname web01

动手练

  1. 查出这台机器的内核版本和发行版名称。
  2. 内存总共多少?真正还能用多少?
  3. 把主机名临时改成 test01,再改回原名。

参考答案:

  1. uname -a 看内核,cat /etc/os-release 看发行版。
  2. free -h,看 available 那一列。
  3. hostname test01;改回 hostname 原主机名(永久改才用 hostnamectl)。

第48章 进程管理 🔰

学完这一章,你能:看懂现在有哪些程序在跑,找出吃 CPU、吃内存的那个,并安全地关掉它。

48.1 进程就是"正在运行的程序"

菜谱放在桌上不动,那叫程序;厨师照着菜谱开始做菜,这个"正在做的过程"就是进程。同一份菜谱能让三个厨师同时开做,所以一个程序也能同时有多个进程。

48.2 ps -aux:给进程拍张合影

ps -aux
# 你会看到类似这样(只截了几行):
USER       PID %CPU %MEM    VSZ   RSS TTY   STAT START   TIME COMMAND
root         1  0.0  0.1 128164  6976 ?     Ss   09:01   0:02 /usr/lib/systemd/systemd
root      1023  0.0  0.1 112796  5760 ?     Ss   09:01   0:00 sshd: /usr/sbin/sshd

列很多,先认这 4 列:

列 含义
USER 谁启动的(root 还是普通用户)
PID 进程编号,关进程靠它,每次启动都可能变
%CPU / %MEM 占了多少 CPU、多少内存(百分比)
COMMAND 是哪个命令启动的

💡 小贴士:STAT 里 R 是正在跑,S 是在等,Z 是僵尸进程(子进程结束了,父进程没收拾)。

48.3 top:实时监控大屏

ps 是照片,top 是直播,默认每 3 秒刷新一次。

top
# 你会看到类似这样(开头几行):
top - 09:30:01 up 20 min,  1 user,  load average: 0.00, 0.01, 0.05
MiB Mem :   1837.0 total,   1345.2 free,    211.4 used
   PID USER      PR  NI    VIRT    RES  %CPU  %MEM     TIME+ COMMAND
  1023 root      20   0  112796   5760   0.0   0.1   0:00.10 sshd

load average 三个数是最近 1、5、15 分钟的平均负载,接近 CPU 核数就说明忙了。

记住这 5 个按键就够:

按键 作用
q 退出 top
P 按 CPU 占用从高到低排序
M 按内存占用从高到低排序
1 显示每个 CPU 核的占用(再按收起)
k 输入 PID 杀进程(会先问你确认)

48.4 kill:让进程停下来

# 先用 ps 找到 PID,再发"请你退出"(默认 15 号信号,比较温和)
kill 2231
# 没有输出就是成功
kill -9 2231
# 如果进程已经没了,你会看到:
-bash: kill: (2231) - No such process

⚠️ 常见坑(很重要):kill -9 等于直接拔电源,进程来不及保存数据、来不及清理临时文件,数据库和正在写的文档可能丢数据甚至损坏。先 kill PID,等几秒,不行再 kill -9。而且 PID 会被系统重复使用,杀之前先用 ps 确认这个 PID 现在是谁。

本章小结

命令/按键 作用 例子
ps -aux 看当前所有进程 ps -aux
top 实时看 CPU/内存排行 top
q P M 1 k top 里的 5 个常用键 在 top 界面里按
kill PID 温和地结束进程 kill 2231
kill -9 PID 强制杀掉(有风险) kill -9 2231

动手练

  1. 用 ps -aux 看有没有 sshd 进程,PID 是多少?
  2. 打开 top,按 M 看谁最吃内存,再按 q 退出。
  3. 用 sleep 1000 & 造一个后台进程,找到它并杀掉。

参考答案:

  1. ps -aux | grep sshd(grep 第52章细讲,这里先照抄)。
  2. 按 M 看 %MEM 最高那行,q 退出。
  3. sleep 1000 &,ps -aux | grep sleep 找到 PID,再 kill PID。

第49章 网络排查 🔰

学完这一章,你能:按"网卡→连通→端口→服务"的顺序,一步步查出网站为什么打不开。

49.1 排查顺序:像查水管一样原地不动

网络不通别乱试。按固定顺序走,每一步都能砍掉一半可能性:

① ip a      网卡有没有 IP?      没 IP:网卡没启用 / DHCP 没拿到
② ping      网关、外网通不通?   不通:网线 / 网关 / 虚拟机网络模式
③ ss -lnutp 服务端口开没开?     没开:服务没启动,或只听 127.0.0.1
④ systemctl status / journalctl  服务本身报错了,看日志

49.2 第一步:ip a 看网卡有没有 IP

ip a
# 你会看到类似这样(只看关键几行):
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
    inet 192.168.8.28/24 brd 192.168.8.255 scope global ens33

看两件事:网卡名(这里是 ens33)和 inet 后面的 IP。没有 inet 那行就是没拿到 IP,先解决它,别急着 ping。127.0.0.1 是 lo(本机回环),它永远在,不代表网卡正常。

49.3 第二步:ping 由近到远

# 1. ping 网关:局域网内部通不通
ping -c 4 192.168.8.2
# 你会看到:
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
# 2. ping 外网 IP:出得去吗(223.5.5.5 是阿里公共 DNS)
ping -c 4 223.5.5.5
# 3. ping 域名:DNS 正常吗
ping -c 4 www.baidu.com

判断口诀:网关都不通,是网线、IP、虚拟机网络模式的问题;网关通但外网 IP 不通,是网关或路由的问题;外网 IP 通但域名不通,是 DNS 问题。-c 4 是只发 4 个包就停,不加会一直 ping,用 Ctrl+C 停。

49.4 第三步:ss -lnutp 看端口开没开

服务要通过端口(port,相当于门牌号)对外提供服务。端口没开,外面怎么访问都白搭。

ss -lnutp
# 你会看到类似这样:
Netid State  Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
tcp   LISTEN 0      128          0.0.0.0:22       0.0.0.0:*     users:(("sshd",pid=1023,fd=3))
tcp   LISTEN 0      128          0.0.0.0:80       0.0.0.0:*     users:(("httpd",pid=2231,fd=4))

参数拆开记:-l 只看正在监听(listening)的,-n 端口用数字不翻译,-u UDP,-t TCP,-p 显示进程。重点看冒号后面的端口:0.0.0.0:80 是所有网卡都接受,127.0.0.1:3306 只有本机能连。

⚠️ 常见坑:不是 root 时看不到 Process 那一列,前面加 sudo 再试。netstat 是老命令,新系统可能没装,先试 ss。

49.5 第四步:服务活没活

systemctl status httpd
# 你会看到类似这样(关键看 Active 那行):
   Active: active (running) since 2026-10-30 09:20:00 CST; 10min ago
# 起失败了就看日志,最后几行通常就是报错原因:
journalctl -u httpd -n 20

active (running) 是活着,inactive (dead) 是没启动,failed 是起失败了。

49.6 另外三个顺手的工具

# curl:模拟浏览器访问,判断"服务到底活没活"最直接
curl -I http://192.168.8.28
# 你会看到:
HTTP/1.1 200 OK
# traceroute:看数据包经过哪些路由器
traceroute www.baidu.com
# 你会看到类似这样:
 1  192.168.8.2      1.2 ms
 2  221.12.1.77     12.5 ms
# dig:查域名解析,看 ANSWER SECTION 里解析出的地址
dig www.baidu.com

traceroute 和 dig 可能要另外装:yum install -y traceroute bind-utils。整行 * * * 不一定是断了,有的路由器不搭理这种探测包。

⚠️ 常见坑:本机 curl 通、别人访问不通,大概率是防火墙没放行(第58章);ping 不通也不等于服务挂了,有的机器禁 ping,用 curl 再看一眼。

本章小结

步骤 命令 看什么
① 网卡 ip a 有没有 inet 那行 IP
② 连通 ping -c 4 网关/IP/域名 丢包率 0% 就是通
③ 端口 ss -lnutp 端口有没有在 LISTEN
④ 服务 systemctl status / journalctl -u active (running) 或报错
补充 curl / traceroute / dig 服务应答 / 路由 / DNS

动手练

  1. 用 ip -br a 看这台机器有几块网卡、IP 是多少。
  2. 先 ping 网关,再 ping www.baidu.com,看通不通。
  3. 用 ss -lnutp 看 22 端口是谁在监听。
  4. 用 curl -I http://127.0.0.1 看本机 80 端口的服务答不答话。

参考答案:

  1. ip -br a,UP 且有 192.168.x.x/24 的是你的网卡。
  2. ping -c 4 网关IP、ping -c 4 www.baidu.com,0% packet loss 就是通。
  3. sudo ss -lntp | grep :22,会看到 users:(("sshd",...))。
  4. 返回 HTTP/1.1 200 OK 说明 80 有服务在跑。

第50章 find:按条件找文件 🔰

学完这一章,你能:忘了文件放哪也能找出来,还能对找到的一批文件批量操作。

50.1 find 是什么

整栋楼有一千个房间,你要找"名字带 log 的房间"。你不会一个个开门,而是叫来管理员,说清条件,他挨个房间看一遍,把符合的全列出来。find 就是这个管理员。

格式:find 查找路径 选项 条件。路径写 ./ 是当前位置,写 / 是整台机器(很慢,新手别一上来就找 /)。

50.2 按名字找:-name 和 -iname

find ./ -name "*.conf"
# 你会看到类似这样:
./sshd_config.conf
# 不区分大小写(-iname 的 i 就是 ignore case)
find /etc -iname "*.CONF"
# 你会看到 /etc 下一堆大写的 .CONF 文件也被找出来

⚠️ 常见坑:-name 后面的通配符一定要加引号。不加引号,shell 会先把它在当前目录展开,find 收到的就不是你想要的条件了。

50.3 按类型和大小找

# 只找目录(d = directory)
find /etc -type d -name "*.d"
# 你会看到类似这样:
/etc/yum.repos.d
# 找大于 10M 的文件:+ 是大于,- 是小于,不带符号是"正好等于"
find /var -type f -size +10M
# 你会看到类似这样:
/var/log/messages-20261030

类型记 3 个就够:f 普通文件、d 目录、l 软链接。大小单位记 k、M、G。

50.4 按时间找:-mtime

-mtime 的单位是天,看的是文件最后一次被修改的时间。

# 找 7 天以前修改过的文件(+7 = 超过 7 天)
find /var/log -type f -name "*.log" -mtime +7
# 你会看到类似这样:
/var/log/messages-20261001

+7 是 7 天以外,-7 是 7 天以内,正好 7 天不带符号。这里最容易把正负号记反。

50.5 找到之后顺手处理:-exec

语法看着怪,拆开就不难:

find 路径 条件 -exec 命令 {} \;
部分 含义
-exec 对每一个找到的文件,执行后面的命令
{} 占位符,代表"当前找到的这个文件"
\; 结束标记,告诉 find"命令到此结束"

为什么写成 \;?因为分号 ; 在 shell 里有特殊含义(表示一条命令结束),前面加反斜杠是告诉 shell:"这个分号是给 find 的,你别管"。

mkdir -p /root/logs
find /var -name "*.log" -type f -exec cp {} /root/logs \;
# 没有输出就是成功,去 /root/logs 里能看到复制过来的日志

⚠️ 常见坑:-exec rm {} \; 也是合法写法,但它真的会删掉找到的每一个文件,没有回收站。先用 find 只看清单,确认没错,再换成 cp 或 rm。

本章小结

选项 作用 例子
-name 按名字(区分大小写) find /etc -name "*.conf"
-iname 按名字(不区分大小写) find /etc -iname "*.CONF"
-type 按类型 f/d/l find /etc -type d
-size 按大小,+大于 -小于 find /var -size +10M
-mtime 按修改天数 find /var/log -mtime +7
-exec ... {} \; 对结果逐个处理 find /var -exec cp {} /root/logs \;

动手练

  1. 找出 /etc 下所有以 .conf 结尾的普通文件。
  2. 找出 /var/log 下 7 天以前的 .log 文件。
  3. 把 /etc 下所有 .conf 文件备份到 /root/confbak。

参考答案:

  1. find /etc -type f -name "*.conf"。
  2. find /var/log -type f -name "*.log" -mtime +7。
  3. mkdir -p /root/confbak,再 find /etc -type f -name "*.conf" -exec cp {} /root/confbak \;(先不加 -exec 看一遍清单更稳)。

第51章 history 和 alias 🔰

学完这一章,你能:把敲过的长命令翻出来重跑,还能给常用命令起个短外号。

51.1 history:翻出敲过的命令

它就像浏览器的"历史记录"。早上敲的那条命令忘了怎么写,翻一下就有,不用重新想。

history
# 你会看到类似这样(左边是行号):
  101  ip a
  102  df -h
  103  find /etc -name "*.conf"

只想看最近 10 条,敲 history 10。

51.2 三种快速调命令的招

写法 作用 说明
!! 再执行上一条命令 最常见:sudo !! 就是用管理员身份重跑上一条
!103 执行第 103 号命令 行号从 history 里看
!find 执行最近一条以 find 开头的命令 只记得开头也行

还有一个最好用的键盘操作:Ctrl + R。按下去出现 (reverse-i-search),输入几个字母,它就从历史里往前搜,回车直接执行。

51.3 alias:给命令起外号

alias(别名)就是"外号":给常用联系人设个快捷拨号,以后按一下就能打通。

alias ll='ls -l'
ll
# 你会看到长格式的文件列表
alias
# 查看现在有哪些别名,你会看到类似这样:
alias ll='ls -l'
unalias ll
# 取消一个别名;unalias -a 是取消全部

⚠️ 常见坑(超高频):alias ll = 'ls -l' 这样写会报错,等号两边绝对不能有空格。另外别名只在当前终端有效,关掉窗口就没了,也不会传给别的用户。

51.4 让别名永久生效

把它写进自己的配置文件 ~/.bashrc:

vi ~/.bashrc
# 在文件最后加一行:
alias ll='ls -l'
# 存盘退出后,让它立刻生效:
source ~/.bashrc
# 没有输出就是成功,之后敲 ll 就有了

💡 小贴士:~ 是家目录,~/.bashrc 是每次开终端都会自动读的配置文件,写在这里才能永久生效。

本章小结

命令/按键 作用 例子
history 看历史命令 history 10
!! 重跑上一条 sudo !!
!行号 跑指定的历史命令 !103
Ctrl+R 搜索历史命令 按键
alias 起别名 / 查看别名 alias ll='ls -l'
unalias 取消别名 unalias ll
source 让配置文件立即生效 source ~/.bashrc

动手练

  1. 看最近 5 条历史命令,并重新执行其中一条。
  2. 给 df -h 起个别名 dfh,并验证能用。
  3. 让这个别名在下次登录后依然存在。

参考答案:

  1. history 5,记住行号后 !行号。
  2. alias dfh='df -h',敲 dfh 验证。
  3. echo "alias dfh='df -h'" >> ~/.bashrc,再 source ~/.bashrc(>> 是追加,用 > 会覆盖整个文件)。

第九篇 文本三剑客

grep 负责找、sed 负责改、awk 负责按列取数。三个小工具,能解决九成的日志处理。 这一篇一定要动手敲——看懂和会敲,是两件事。

第52章 grep:从一堆文字里挑出你要的 🔰

学完这一章,你能:从几百行的文字里,一眼挑出你要的那几行。

52.1 它是什么:一把"滤网"

grep 只干一件事:按行过滤。把它想成厨房里的筛子:文件往里一倒,含关键字的行留下,其余的行漏掉。它挑的是行,不是字,所以搜 tom,出来的是 tom 的一整行,不是只有 tom 三个字母。

52.2 从真实需求开始

一台上百个用户的服务器,你想知道:tom 这个用户到底有没有?/etc/passwd 是用户清单文件(名字叫 passwd,里面存的不是密码),一行一个用户。

# 命令:在用户清单里找 tom
grep 'tom' /etc/passwd
# 你会看到类似这一行(行号因系统而异):
tom:x:1001:1001::/home/tom:/bin/bash

这一行说明 tom 存在,家目录是 /home/tom。

52.3 五个选项,一个一个加

grep -i 'TOm' /etc/passwd     # -i:忽略大小写,照样找到
grep -n 'tom' /etc/passwd     # -n:显示行号
# 你会看到:23:tom:x:1001:1001::/home/tom:/bin/bash

grep -v 'nologin' /etc/passwd # -v:取反,只要不含 nologin 的行
# 你会看到:能登录的账号,比如
root:x:0:0:root:/root:/bin/bash

grep -r 'IPADDR' /etc/sysconfig/network-scripts/   # -r:整个文件夹一起搜
# 你会看到类似(前面是文件名):
/etc/sysconfig/network-scripts/ifcfg-ens33:IPADDR=192.168.1.10

grep -c 'bash' /etc/passwd    # -c:只数行数(数行,不数出现次数)
# 你会看到类似:2

-i 忽略大小写,-n 给行号,-v 取反,-r 递归搜文件夹,-c 数行数。先记这五个就够了。

52.4 常见坑 ⚠️

⚠️ 注意:grep 'tom' 也会匹配 tomcat、tommy。grep 只要求"包含",不要求"相等"。要整行完全相等,加 -x(进阶再看)。

  • 忘了 -i,搜 Root 就找不到 root。
  • grep -r 搜整个 / 会非常慢,还满屏 Permission denied。先指定具体文件夹。
  • ps -aux | grep ssh 会多出一行 grep 自己,加一段 | grep -v grep 去掉。

52.5 三剑客组合

ps -aux | grep ssh | awk '{print $2}'
# 你会看到:ssh 进程的 PID,一行一个,比如
812

|(管道)把前一个命令的输出,直接当成后一个命令的输入,像接水管。这里:ps -aux 列出所有进程 → grep ssh 只留 ssh 的行 → awk 取第 2 列(PID)。

本章小结

命令/概念 作用 例子
grep '词' 文件 按行过滤,匹配的行整行显示 grep 'root' /etc/passwd
-i 忽略大小写 grep -i 'ROOT' /etc/passwd
-n 显示行号 grep -n 'root' /etc/passwd
-v 取反,显示不匹配的行 grep -v 'nologin' /etc/passwd
-r 在文件夹里递归搜索 grep -rn 'IPADDR' /etc/
-c 只统计匹配的行数 grep -c 'bash' /etc/passwd
\| 把前一个命令的输出交给后一个 ps -aux \| grep ssh

动手练

  1. 找出 /etc/passwd 里所有不能登录的账号。
  2. 数一数 /etc/passwd 里有多少个账号用了 bash。
  3. 在 /etc 里搜 IPADDR,要看到文件名和行号。

参考答案:

grep 'nologin' /etc/passwd
grep -c 'bash' /etc/passwd
grep -rn 'IPADDR' /etc/

第53章 sed:批量改文字 🔰

学完这一章,你能:不打开文件,就把文件里的文字批量换掉,并且知道怎么改才不会改坏。

53.1 它是什么:流水线上的改字工人

sed 是"文本流编辑器"(stream editor)。把它想成流水线上的工人:文件一行一行从他面前过,他拿着你的指令,看到该改的就改,改完的流走,全程不用打开文件。所以 sed 最擅长干这种事:把一批文件里的同一个错误,一次改掉。动手前,先在家目录复制一份练手文件,别拿系统文件试。

53.2 最小可用:替换 s、-i 和 -i.bak

cd ~ && cp /etc/passwd ./passwd             # 复制一份,随便改
sed 's@/sbin/nologin@/bin/bash@g' ./passwd  # 先试一次,只看不改
# 你会看到:屏幕上一大批 /sbin/nologin 变成了 /bin/bash,比如
bin:x:1:1:bin:/bin:/bin/bash

注意:屏幕变了,文件一个字没变。这叫预览(sed 默认就是"改给你看")。想让结果真的写回文件,必须加 -i(in-place,原地修改):

sed -i 's@/sbin/nologin@/bin/bash@g' ./passwd       # 改法一:直接改,没备份
sed -i.bak 's@/sbin/nologin@/bin/bash@g' ./passwd   # 改法二:先备份再改(推荐)
ls passwd*    # 你会看到:passwd  passwd.bak(bak 就是改之前的原件)

三句话记牢:① 不加 -i 只预览,文件不动;② 加 -i 直接改,没有后悔药;③ 加 -i.bak 先备份再改,建议永远用这个。上面两条命令是同一件事的两种改法,二选一就行。

s 是替换(substitute),写法是 s/原内容/新内容/。结尾加 g 表示一行里全部替换;不加 g,每行只换第一个。要改的内容里本来就有 /,写起来满屏反斜杠,所以分隔符可以换。分隔符用 / @ # 都行,三个保持一致就好;以后改路径,优先用 @ 或 #。

sed 's/\/sbin\/nologin/\/bin\/bash/g' ./passwd   # 能跑,但难看
sed 's@/sbin/nologin@/bin/bash@g' ./passwd       # 换成 @,清爽
sed 's#/sbin/nologin#/bin/bash#g' ./passwd       # 换成 #,也行

53.3 删除 d、打印 p、插入 i 和 a

模式 作用 例子
d 删除整行 sed '2,5d' 文件
p 打印(要配 -n) sed -n '/tom/p' 文件
i / a 在指定行上面 / 下面插入 sed '1i 新内容' 文件
sed -n '2,3p' ./passwd        # 你会看到:只有第 2–3 行,共两行
sed '/nologin/d' ./passwd     # 你会看到:含 nologin 的行都没了
sed '1i # 文件开头加一行' ./passwd       # 第一行上面多出一行
sed '/tom/a # tom 下面加一行' ./passwd   # tom 那行下面多出一行(文件不变)

53.4 常见坑 ⚠️

⚠️ 注意:sed -i 直接改文件,没有回收站,改错只能靠 .bak,动手前先 cp 一份。另外 p 不配 -n 会出现"每行打印两遍",看到重复先想 -n。

  • 引号要用英文半角的 '。从网页复制常带中文引号 ‘’“”,会报 unknown command。
  • -i 和 .bak 之间不能加空格:写 -i.bak,别写 -i .bak。

53.5 三剑客组合

grep 'bash' /etc/passwd | sed 's#/bin/bash#/bin/sh#g'
# 你会看到:能登录的账号,shell 路径换成了 /bin/sh

| 把 grep 挑出来的几行,直接交给 sed 当输入:grep 负责挑行,sed 负责改字。

本章小结

命令/概念 作用 例子
sed 's/旧/新/g' 文件 预览替换结果,不改文件 sed 's@x@y@g' 文件
sed -i '...' 文件 直接改文件 sed -i 's@x@y@g' 文件
sed -i.bak '...' 先备份再改 sed -i.bak 's@x@y@g' 文件
d / p 删行 / 只打印匹配行(配 -n) sed '/x/d' 文件
i / a 在行上面 / 下面插入 sed '1i 内容' 文件

动手练

  1. 复制 /etc/passwd 到家目录,把所有 /bin/bash 换成 /bin/sh,改前先备份。
  2. 只看 /etc/passwd 的前 3 行,再预览"删掉所有含 nologin 的行"。

参考答案:

cd ~ && cp /etc/passwd ./passwd
sed -i.bak 's@/bin/bash@/bin/sh@g' ./passwd
sed -n '1,3p' ./passwd
sed '/nologin/d' ./passwd

第54章 awk:按列取数据 🔰

学完这一章,你能:把一行行"挤在一起"的文字当成表格,按列取出你要的数据,顺便做点计算。

54.1 它是什么:会按列取数的 Excel

/etc/passwd 每一行长这样:tom:x:1001:1001::/home/tom:/bin/bash。冒号把它切成 7 段,就像 Excel 的一行有 7 列。awk 就是"按列取数"的小工具:你告诉它分隔符是冒号,它就把每行切成 $1、$2、$3……你想看第几列,就打印第几列。

54.2 最小可用:-F 指定分隔符,$1 取第一列

# 命令:只看用户名(第 1 列),分隔符是冒号
awk -F: '{print $1}' /etc/passwd
# 你会看到:一行一个用户名
root
bin
daemon
...
tom
  • -F: 指定分隔符。-F:、-F ':'、-F ":" 三种写法都行。
  • {print $1} 是"动作":打印第 1 列。分隔符选错,列就全错。

再看另外三个常用"格子":

awk -F: '{print $NF}' /etc/passwd     # 最后一列:/bin/bash、/sbin/nologin……
awk -F: '{print $0}' /etc/passwd      # 整行,原样输出
awk -F: '{print NR, $1}' /etc/passwd  # 行号 + 第 1 列
# 你会看到:
1 root
2 bin
3 daemon

54.3 会算数:用 printf 做小数计算

awk 不止取列,还能算。最常用的场景:算内存占用率。

# free 的第 2 列是总数,第 3 列是已用
free | grep Mem | awk '{printf "%.2f%%\n", $3/$2*100}'
# 你会看到类似:
31.35%

拆开看:free 输出内存信息 → grep Mem 只留 Mem: 那一行 → awk 用第 3 列除第 2 列。printf "%.2f" 表示保留 2 位小数;%% 表示"打印一个百分号",因为 printf 里 % 有特殊含义,要写两个。

54.4 常见坑 ⚠️

⚠️ 注意:{print $1} 一定要用单引号包起来。用双引号的话,shell 会先把 $1 解释掉,变成空,你什么也看不到。

  • $NF 是"最后一列",不是第 N 列。要第 3 列就写 $3。
  • 空格分隔不用加 -F,awk 默认就按空白切;/etc/passwd 才需要 -F:。
  • 输出百分号写 %%,只写一个 % 结果不可靠。

54.5 三剑客组合

df -h | grep '^/dev' | awk '{print $1, $5}'
# 你会看到:每块盘用了多少,比如
/dev/sda1 18%
/dev/mapper/centos-root 12%

| 把三条命令串成流水线:df -h 列出磁盘 → grep '^/dev' 只留真正的分区行 → awk 打印"哪块盘"和"用了百分之几"。

本章小结

命令/概念 作用 例子
awk -F: '{print $1}' 按冒号切,取第 1 列 awk -F: '{print $1}' /etc/passwd
$0 整行 awk '{print $0}' 文件
$NF 最后一列 awk -F: '{print $NF}' /etc/passwd
NR 行号 awk '{print NR, $1}' 文件
printf 格式化输出,能做小数计算 awk '{printf "%.2f\n", $3/$2}' 文件

动手练

  1. 打印 /etc/passwd 里每个用户的用户名和 shell。
  2. 打印 /etc/passwd 的前 3 行,并带行号。

参考答案:

awk -F: '{print $1, $NF}' /etc/passwd
head -3 /etc/passwd | awk -F: '{print NR, $0}'

第55章 正则表达式入门 🔧

学完这一章,你能:看懂一串"奇怪的符号"在说什么,并用 grep -E 写出取 IP、去注释两个实战。

55.1 它是什么:一套"文字模具"

普通搜索是"找一模一样的东西":搜 tom 就只找 tom。正则能描述一类文字。它像一套模具:你定好形状,符合这个形状的文字都能被找出来。grep 默认用基础正则,很多符号要加反斜杠才生效;加 -E 打开扩展正则,+ ? | () {} 就能直接写。本章一律配 -E。

写法 含义 例子
. 任意一个字符 a.c 匹配 abc、a1c
[0-9] / [a-zA-Z] 一个数字 / 一个字母([^0-9] 是"不是数字") [0-9][0-9] 匹配 42
* / + / ? 前面字符 0 次以上 / 1 次以上 / 0 或 1 次 ab*、ab+、colou?r
{n,m} 前面字符 n 到 m 次 [0-9]{2,3} 匹配 42、123
^ / $ 行首 / 行尾 ^root、bash$
竖线 \| 或者 cat\|dog 匹配含 cat 或 dog 的行
() 分组,把几个字符当一个整体 (ab)+ 匹配 ab、abab
\. 转义:匹配真正的点 1\.2 匹配 1.2,不匹配 1x2

55.2 实战一:从 ip a 里揪出 IP 地址

ip a | grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}'
# 你会看到类似:
    inet 127.0.0.1/8 scope host lo
    inet 192.168.1.10/24 brd 192.168.1.255 scope global ens33
  • [0-9]{1,3}:1 到 3 个数字,这是 IP 的一段。
  • \.:一个真正的点。不写反斜杠,. 会匹配任意字符,1x2 也算一段。
  • ([0-9]{1,3}\.){3}:把"数字 + 点"打包成一组,重复 3 次。
  • 最后再来一个 [0-9]{1,3},第四段数字。连起来读"(数字 点)三遍,再加一段数字",就是 x.x.x.x。它只保证"长得像 IP",不检查每段小于 255,够用就行。

55.3 实战二:去掉注释行和空行

sudo grep -Ev '^$|^#' /etc/sudoers
# 你会看到:只剩真正有效的配置行,比如
Defaults   !visiblepw
root ALL=(ALL) ALL
  • -E:用扩展正则,| 才能直接写;| 表示"或者"。
  • -v:取反,匹配的行扔掉,剩下的才输出。
  • ^$:行首紧接着行尾,中间什么都没有,就是空行。
  • ^#:行首就是 #,就是注释行。

所以 ^$|^# 读作"空行,或者注释行";再加 -v,就是"把这些行去掉,留下有效内容"。

⚠️ /etc/sudoers 只有超级管理员 root 能读,所以要加 sudo。另外这写法只去掉"顶格"的注释,前面带空格的 # 注释 去不掉;要去干净,用 sudo grep -Ev '^[[:space:]]*(#|$)' /etc/sudoers。

55.4 常见坑 ⚠️

⚠️ 注意:\d 这类写法 grep 的扩展正则不支持(\d 会被当成字母 d),要加 -P 才行,而 -P 不是每个系统都有。\w、\s 在 GNU 版 grep 里确实能用,但它们是"方言",换台机器可能不认,含义也容易记错(\w 是"字母、数字、下划线",不是"任意字符")。所以统一改用 [0-9]、[a-zA-Z],走到哪都不会错。

  • ? 只有"0 次或 1 次",不是"非贪婪";grep -E 不支持非贪婪。* 从 0 次算起,所以 ab* 也能匹配单独的 a,要"至少一次"用 +。
  • [^] 里的 ^ 是"非";^ 写在最前面才表示行首,别混。

55.5 三剑客组合

ip a | grep -E 'inet ' | awk '{print $2}'
# 你会看到:
127.0.0.1/8
192.168.1.10/24

| 让三个工具接力:ip a 打印网卡信息 → grep -E 'inet ' 用正则留下带 inet 的行(后面有空格,所以不会匹配 inet6)→ awk 取第 2 列。

本章小结

写法 作用 例子
. / [0-9] / [a-zA-Z] 任意字符 / 数字 / 字母 a.c、[0-9]{3}
* + ? 0 次以上 / 1 次以上 / 0 或 1 次 ab+
^ $ 行首 / 行尾 ^#
() / \| 分组 / 或者 (ab)+、cat\|dog
grep -E 打开扩展正则 grep -E '...'

动手练

  1. 从 ip a 的输出里只挑出所有 IPv4 地址。
  2. 去掉 /etc/sudoers 的注释行和空行,把结果存到 ~/sudoers.clean。

参考答案:

ip a | grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}'
sudo grep -Ev '^$|^#' /etc/sudoers > ~/sudoers.clean

第十篇 服务、网络与防火墙

前面的知识在这一篇合起来了:把服务开起来、把网络配通、把门守好。 学完这一篇,你就能独立在一台服务器上跑起一个网站。

第56章 systemctl:管理服务的开关 🔰

学完这一章,你能:启动、停止、重启一个服务,让它开机自动启动,并在起不来时看懂日志。

56.1 服务是什么,systemctl 管什么

一台服务器像一家公司。sshd 是门卫,httpd 是前台,firewalld 是保安队长。这些在后台一直待命、等着别人来访问的程序就是服务。systemctl 是总控面板,负责让各部门上班、下班、全年在岗。服务名后面的 .service 可以省略。

56.2 四个最常用的动作

systemctl status sshd
# 你会看到类似这样:
● sshd.service - OpenSSH server daemon
   Active: active (running) since 2026-10-30 09:20:01 CST; 10min ago

Active: 后面三种结果要认得:

显示 含义
active (running) 正在运行,正常
inactive (dead) 没启动
failed 启动失败,要查日志

启动是 systemctl start sshd,停止是 systemctl stop sshd,重启是 systemctl restart sshd。这三个命令都没有输出,没输出就是成功,用 status 验证。

56.3 enable:开机自动启动

systemctl enable sshd
# 你会看到类似这样:
Created symlink from /etc/systemd/system/multi-user.target.wants/sshd.service to ...
# 一条命令 = 设置开机自启 + 现在就启动
systemctl enable --now httpd
systemctl is-enabled httpd
# 你会看到:
enabled

⚠️ 最常见坑:enable 只是"下次开机自动启动",现在要它跑起来必须再 start。新手常犯:只 enable 了服务,然后发现端口没开——服务压根没启动。反过来,stop 也不会取消开机自启,要取消得用 disable。

56.4 reload、restart 和看日志

  • restart:整个关掉再打开,正在访问的用户会断一下;
  • reload:只让它重新读一遍配置文件,用户不断线,但不是所有服务都支持。

改了配置先试 systemctl reload nginx,不行再 restart。起不来就查日志:

journalctl -u httpd -n 20
# 你会看到最后 20 行日志,报错原因一般在最后几行

常见原因:端口被占(提示 Address already in use)、配置文件写错(会报行号)、权限不够。

56.5 一个完整例子:把网站跑起来

yum install -y httpd              # 1. 装软件
systemctl enable --now httpd      # 2. 开机自启 + 立即启动
ss -lntp | grep :80               # 3. 确认 80 端口在监听
# 你会看到:
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("httpd",pid=2231,fd=4))
firewall-cmd --permanent --add-service=http   # 4. 防火墙放行(第58章)
firewall-cmd --reload
# 5. 用浏览器访问 http://服务器IP

💡 小贴士:本机 curl -I http://127.0.0.1 能通、别的电脑打不开,基本就是第 4 步防火墙没放行。

本章小结

命令 作用 例子
systemctl start 启动 systemctl start httpd
systemctl stop 停止 systemctl stop httpd
systemctl restart 重启(会断线) systemctl restart httpd
systemctl reload 只重读配置 systemctl reload nginx
systemctl status 看状态 systemctl status httpd
systemctl enable/disable 开机自启 / 不自启 systemctl enable --now httpd
journalctl -u 看某个服务的日志 journalctl -u httpd -n 20

动手练

  1. 查看 sshd 的当前状态,它是开机自启吗?
  2. 用一条命令启动 httpd 并设置开机自启。
  3. 确认 80 端口已经在监听。

参考答案:

  1. systemctl status sshd 看 Active: 是不是 running;systemctl is-enabled sshd 返回 enabled 就是开机自启。
  2. systemctl enable --now httpd(没装先 yum install -y httpd)。
  3. ss -lntp | grep :80。

第57章 配置网络 🔰

学完这一章,你能:在 CentOS 7 和 Ubuntu 22.04 上手动配好 IP、网关和 DNS,并确认网络真的通了。

57.1 先认四个词

配 IP 就像给新家写地址,四个词缺一不可:

词 人话 例子
IP 地址 门牌号 192.168.8.28
子网掩码 / 前缀 这个小区有多大范围 255.255.255.0 等于 /24
网关 出小区要走的大门 192.168.8.2
DNS 查号台,把域名翻译成 IP 223.5.5.5

网关和 IP 必须在同一个网段(前三段一样),否则出不去。

57.2 CentOS 7:改 ifcfg-ens33

网卡名可能是 ens33、eth0,先用 ip a 确认(第49章)。

vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 改成类似这样(有就改,没有就加):
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.8.28
PREFIX=24
GATEWAY=192.168.8.2
DNS1=223.5.5.5

最关键的 3 行:BOOTPROTO=none 是手动配(写 dhcp 是自动获取);ONBOOT=yes 是开机启用这块网卡;IPADDR/PREFIX/GATEWAY/DNS1 就是上面那四个词。

systemctl restart network
# 没有输出就是成功,再 ip a 看 ens33 的 inet 变成 192.168.8.28/24

57.3 Ubuntu 22.04 及以上:改 netplan

Ubuntu 不用 ifcfg 文件,用 /etc/netplan/ 下的 yaml 文件(文件名可能不同,先 ls /etc/netplan/ 看一眼)。

vi /etc/netplan/01-netcfg.yaml
# 改成类似这样(缩进用空格,每级 2 个空格):
network:
  version: 2
  ethernets:
    ens33:
      dhcp4: no
      addresses: [192.168.8.8/24]
      routes:
        - to: default
          via: 192.168.8.2
      nameservers:
        addresses: [114.114.114.114, 8.8.8.8]
netplan apply
# 没有输出就是成功
ip -br a
# 你会看到类似这样:
ens33            UP             192.168.8.8/24

⚠️ 常见坑:yaml 只能用空格缩进,绝对不能用 Tab;冒号后面必须有一个空格。错一格,netplan apply 就报错。老教程里的 gateway4: 在 22.04 还能用(会提示 deprecated),新版本请用上面 routes 的写法。

57.4 nmtui、nmcli,改完必须验证

nmtui                              # 文字版菜单:选网卡 → 填 IP/网关/DNS → OK
systemctl restart network          # 改完重启网络
nmcli device status                # 看每块网卡状态,ens33 那行应是 connected
nmcli connection up ens33          # 让改过的配置生效(换成你的连接名)
ping -c 4 192.168.8.2              # 验证:先 ping 网关
ping -c 4 www.baidu.com            # 再 ping 域名,能通说明 DNS 也对
ip -br a                           # 一行一块网卡,有没有 IP 一眼看见

nmtui 用方向键选、回车确认,最适合新手(CentOS 最小化安装可能要 yum install -y NetworkManager-tui);nmcli 是它的命令行版。CentOS 7 改完用 systemctl restart network,Ubuntu 上则是 netplan apply(或 systemctl restart NetworkManager)。两条 ping 都通就收工,哪条不通,回第49章按顺序查。

⚠️ 危险提醒:如果你是通过 SSH 远程连着这台机器改 IP,新 IP 一敲下去连接立刻就断。要么在虚拟机控制台或机房现场改,要么先想好用新 IP 连回来的办法。

本章小结

系统 / 场景 配置文件 生效命令
CentOS 7 /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network
Ubuntu 22.04+ /etc/netplan/*.yaml netplan apply
界面 / 命令行 nmtui / nmcli systemctl restart network / nmcli connection up 连接名
看结果 无 ip a / ip -br a

动手练

  1. 用 ip -br a 看当前网卡名和 IP。
  2. 在 CentOS 7 上把 IP 改成 192.168.8.50/24,网关 192.168.8.2,DNS 223.5.5.5。
  3. 改完怎么验证?说出两条命令。

参考答案:

  1. ip -br a,UP 且有 IP 的那块就是你的网卡。
  2. 编辑 ifcfg-ens33,改 IPADDR=192.168.8.50、PREFIX=24、GATEWAY=192.168.8.2、DNS1=223.5.5.5,再 systemctl restart network。
  3. ping -c 4 192.168.8.2(网关)和 ping -c 4 www.baidu.com(DNS)。

第58章 防火墙 🔰

学完这一章,你能:用 firewalld 放行一个端口,看懂 iptables 的四表五链,并安全地写出"只放行 80/443"的规则。

58.1 防火墙就是小区的门卫

小区有门卫,所有进出的人和包裹都得过一道。门卫手里有一张登记表:表上写了放行的就进,没写的拦下。防火墙干的就是这件事:检查进出这台机器的每一个数据包,按规则决定放行还是拦住。

Linux 上常见两套工具:firewalld 是门卫队长,你说"放行 80 号",他替你去写表,简单,日常首选;iptables 是你自己写登记表,灵活但语法难。两者底层都是内核里的 Netfilter,所以绝对不能同时启用。

58.2 firewalld 常用操作

firewall-cmd --state                           # 看防火墙开没开,显示 running 就是开着
firewall-cmd --add-port=8080/tcp               # 临时放行,重启防火墙失效
firewall-cmd --permanent --add-port=8080/tcp   # 永久放行,写进配置文件
firewall-cmd --reload                          # 让 permanent 的配置真正生效
firewall-cmd --list-all                        # 看当前放行了什么(最常用的命令)
# 你会看到类似这样:
public (active)
  services: ssh dhcpv6-client
  ports: 80/tcp

记忆要点:--permanent 只是写进配置文件,必须再 --reload 才生效;不加 --permanent 的改动重启就丢。撤销用 --remove-port=8080/tcp。

58.3 完整例子:只放行网页和 SSH

# 1. 永久放行 SSH——必须先放行,否则重载后远程就连不上了
firewall-cmd --permanent --add-service=ssh
# 2. 永久放行网页:http 对应 80,https 对应 443
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 3. 重新加载,让配置生效
firewall-cmd --reload
# 你会看到 success;再执行 firewall-cmd --list-all,services 那行能看到 ssh http https

⚠️ 常见坑:--reload 会重新加载规则。如果你远程 SSH 时,配置里把 22 关掉了,重载那一刻连接就断,人就进不去了。改防火墙前,先确认 22 是放行的。

58.4 iptables:门卫 + 四张登记表 + 五道关卡

四张表(四本不同的登记本,先只记前两张):

表 管什么 什么时候用
filter 放行还是拦住(默认表) 日常 90% 的规则都写在这里
nat 改 IP 地址 共享上网(SNAT)、端口映射(DNAT)
mangle 改数据包头部 流量整形,进阶再看
raw 连接跟踪之前处理 高并发优化,进阶再看

五道关卡(数据包像快递,路线不同,经过的关卡不同):PREROUTING(刚进小区,还没分拣)→ INPUT(送到本机的包裹)→ FORWARD(只是路过、要转给别人的包裹)→ OUTPUT(本机发出的包裹)→ POSTROUTING(出小区大门前最后一道)。日常配置 99% 是在 filter 表的 INPUT 链上做文章。

58.5 规则怎么写

格式:iptables [-t 表名] 操作选项 链名 匹配条件 -j 动作

操作选项(5 个够用):-A 追加到链的最后|-I 插到最前面(默认第 1 条)|-D 删除(如 -D INPUT 5)|-L 列出规则|-P 设置默认策略(所有规则都不匹配时怎么办)。

匹配条件:

选项 匹配什么 例子
-p 协议 tcp/udp/icmp -p tcp
-s 源 IP -s 192.168.8.0/24
-d 目标 IP -d 192.168.8.28
--dport 目标端口(必须配 -p tcp 或 -p udp) -p tcp --dport 80

动作(-j 后面跟):ACCEPT 放行;DROP 悄悄丢掉,对方一直等到超时;REJECT 明确拒绝,对方立刻收到"拒绝"消息。

58.6 完整例子:开放 80/443,其余拒绝

# 第一步:本机访问本机、SSH 必须先放行
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 第二步:放行网页
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 第三步:最后才设置默认拒绝——顺序绝不能反
iptables -P INPUT DROP
# 第四步:用 iptables -L -n -v --line-numbers 检查,你会看到类似这样(只保留关键列):
Chain INPUT (policy DROP)
num  target   prot opt source      destination
1    ACCEPT   tcp  --  0.0.0.0/0   0.0.0.0/0  tcp dpt:22
2    ACCEPT   tcp  --  0.0.0.0/0   0.0.0.0/0  tcp dpt:80
3    ACCEPT   tcp  --  0.0.0.0/0   0.0.0.0/0  tcp dpt:443

⚠️ 两大坑,必须记住:

  1. -P INPUT DROP 之前一定要先放行 22 端口。默认拒绝一设,SSH 当场断开,远程服务器你就再也进不去了(云服务器只能提工单进救援模式)。
  2. firewalld 和 iptables 不要同时启用。它们操作同一个 Netfilter,规则互相打架,表现就是"明明放行了却不生效"。用 iptables 前先 systemctl stop firewalld,再 systemctl disable firewalld。

💡 小贴士:实际还要放行"回包",否则你发出去的请求,回复会被拦下:iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT。iptables 规则默认重启就没了,要保存得装 iptables-services 再 service iptables save。

本章小结

工具 / 概念 作用 例子
firewall-cmd 日常最省事的防火墙管理 firewall-cmd --list-all
--permanent + --reload 永久放行一个端口 firewall-cmd --permanent --add-port=80/tcp
iptables 四表 / 五链 filter 等四表、INPUT 等五个关卡 日常只用 filter 表和 INPUT 链
-A/-I/-D/-L/-P 增、插、删、看、默认策略 iptables -A INPUT -p tcp --dport 22 -j ACCEPT
ACCEPT/DROP/REJECT 放行 / 静默丢弃 / 明确拒绝 -j ACCEPT

动手练

  1. 查看 firewalld 是否运行,并列出当前放行的端口。
  2. 永久放行 8080 端口,并让它立即生效。
  3. 用 iptables 开放 22 和 80、默认拒绝其他入站连接。先想一想:哪一步的顺序不能错?

参考答案:

  1. firewall-cmd --state;firewall-cmd --list-all(看 ports 那一行)。
  2. firewall-cmd --permanent --add-port=8080/tcp,再 firewall-cmd --reload。
  3. 先 iptables -A INPUT -p tcp --dport 22 -j ACCEPT,再放行 80,最后才 iptables -P INPUT DROP。

第59章 常见基础服务一览 🔧

学完这一章,你能:听到一个服务名,就知道它是干什么的、走哪个端口、装哪个包。

59.1 服务就是"一直开着的店"

服务像商场里常年在营业的店铺:各家卖的东西不同,门口挂着门牌号(端口)。客人按门牌号找上门,店里的老板(服务进程)就负责接待。这一章不要求你会配,先"认识人",以后用到再回来查表。

59.2 八个最常见的基础服务

服务 一句人话 干什么用 默认端口 安装包(CentOS)
SSH 远程登录 在别的电脑上敲这台机器的命令 22 openssh-server
FTP 传文件的老协议 上传、下载文件(明文传输,不安全) 21(控制)、20(数据) vsftpd
NFS Linux 之间的共享文件夹 把 A 机器的目录挂到 B 机器上用 2049 nfs-utils
Samba 和 Windows 共享文件夹 让 Windows 直接访问 Linux 的目录 445(旧版 137–139) samba
NTP 对时服务 让所有机器时间保持一致 123(UDP) chrony
DNS 域名翻译成 IP 把 www.baidu.com 变成 IP 地址 53(TCP/UDP) bind
DHCP 自动发 IP 新机器联网自动拿到 IP 67(服务器)、68(客户端) dhcp
HTTP/HTTPS 网页服务 对外提供网站 80 / 443 httpd(或 nginx)

💡 小贴士:Ubuntu 上包名不一样:NFS 服务端叫 nfs-kernel-server,DNS 叫 bind9,DHCP 叫 isc-dhcp-server,网页服务常用 apache2 或 nginx。

59.3 怎么确认服务在不在、开没开

ss -lnutp
# 你会看到所有正在监听的端口,最后一列 Process 写着是谁占的
systemctl status sshd
# Active: active (running) 就是服务活着
rpm -q httpd        # CentOS 查包装了没
# 装了会显示:
httpd-2.4.6-97.el7.centos.x86_64
# 没装会显示:
package httpd is not installed

⚠️ 常见坑:知道端口还不够。服务"装了 ≠ 启动了 ≠ 防火墙放行了",三步任何一步没做,外面都访问不到。比如 httpd 装好也启动了,但 firewalld 没放行 80,浏览器照样打不开。

59.4 端口冲突:最常见的事故

一个端口同一时间只能被一个程序占用。装了 httpd 和 nginx 都想用 80,后启动的必定失败,日志里写着 Address already in use。

ss -lntp | grep :80
# 你会看到谁占着 80,再决定停掉哪个

💡 小贴士:默认端口不是不能改,但改端口意味着用户要记新端口,一般不如停掉不需要的那个服务。真要改,记得防火墙同步放行新端口。

本章小结

想做什么 用什么命令
看谁占着端口 ss -lnutp
查包装没装 rpm -q 包名(Ubuntu 用 dpkg -l 包名)
查服务状态 systemctl status 服务名
查本机 IP ip a / ip -br a

动手练

  1. 说出 SSH、HTTP、HTTPS、DNS 的默认端口。
  2. 查出这台机器上 22 端口是哪个程序在监听。
  3. 判断:httpd 已经是 active (running),但同事的电脑打不开网页,最可能是什么原因?

参考答案:

  1. SSH 22;HTTP 80;HTTPS 443;DNS 53。
  2. ss -lntp | grep :22,能看到 users:(("sshd",...))。
  3. 防火墙(firewalld)没放行 80 端口,见第58章。

附录

附录A 命令速查表

用法:按"我想做什么"来找,不用按字母背。 表格里"例子"一列可以直接抄着敲(把文件名换成你自己的)。

A.1 认清自己在哪

我想…… 命令 例子
看当前在哪个目录 pwd pwd
看目录里有什么 ls ls -l、ls -a、ls -lh
看目录本身的权限 ls -ld ls -ld /etc
切换目录 cd cd /etc、cd ..、cd ~、cd -
我是谁 whoami whoami
我的详细身份 id id
谁登录着 who who
清屏 clear 或按 Ctrl + L
看历史命令 history history 20
查命令帮助 --help / man ls --help、man ls

A.2 文件和目录

我想…… 命令 例子
建空文件 touch touch a.txt
建目录 mkdir mkdir data
建多层目录 mkdir -p mkdir -p /data/app/logs
复制文件 cp cp a.txt /tmp/
复制目录 cp -r cp -r src/ /backup/
移动 / 重命名 mv mv a.txt b.txt、mv a.txt /tmp/
删文件 rm rm a.txt
删目录 rm -r rm -r data/
强制删(危险) rm -rf rm -rf data/
删空目录 rmdir rmdir empty/
看文件类型 file file a.txt
看文件详情 stat stat a.txt
看目录占用大小 du -sh du -sh /var/log
软链接 ln -s ln -s /data/app/config.yml ./c.yml
硬链接 ln ln a.txt b.txt

A.3 看文件内容

我想…… 命令 例子
看全部(小文件) cat cat /etc/os-release
看并显示行号 cat -n cat -n /etc/passwd
分页看(可上下翻) less less /var/log/messages(q 退出)
看前 10 行 head head /etc/passwd
看前 20 行 head -20 head -20 a.txt
看最后 10 行 tail tail /var/log/messages
实时跟踪日志 tail -f tail -f /var/log/messages
按关键字找行 grep grep root /etc/passwd
统计行数 wc -l wc -l a.txt

A.4 用户和组

我想…… 命令 例子
建用户 useradd useradd tom
不建家目录 useradd -M useradd -M -s /sbin/nologin mysql
设密码 passwd passwd tom
锁 / 解锁 passwd -l/-u passwd -l tom
切用户 su - su - tom
退出 exit exit
删用户 userdel -r userdel -r tom
改用户信息 usermod usermod -aG wheel tom
建组 groupadd groupadd dev
删组 groupdel groupdel dev
用户加入组 gpasswd -a gpasswd -a tom dev
用户移出组 gpasswd -d gpasswd -d tom dev
用 sudo sudo sudo systemctl restart nginx
查我的 sudo 权限 sudo -l sudo -l

A.5 权限

我想…… 命令 例子
加权限(符号法) chmod u+w chmod u+w a.txt
设权限(数字法) chmod 644 chmod 644 a.txt
递归改 chmod -R chmod -R 755 /data/app
给脚本加执行 chmod +x chmod +x run.sh
改属主 chown chown tom a.txt
改属主+属组 chown 用户:组 chown -R apache:apache /var/www
只改属组 chgrp chgrp dev a.txt
看默认权限 umask umask
看 ACL getfacl getfacl a.txt
设 ACL setfacl -m setfacl -m u:bob:rw a.txt
删 ACL setfacl -x setfacl -x u:bob a.txt
加不可变锁 chattr +i chattr +i important.conf
解锁 chattr -i chattr -i important.conf
看隐藏权限 lsattr lsattr important.conf

常用权限数字:644 普通文件 / 755 目录和程序 / 600 私密文件 / 700 私密目录 / 777 别用。

A.6 装软件

我想…… 命令(CentOS) 命令(Ubuntu)
装 yum install -y 包名 apt install -y 包名
卸 yum remove 包名 apt remove 包名
更新 yum update apt update && apt upgrade
搜索 yum search 关键字 apt search 关键字
看信息 yum info 包名 apt show 包名
列已装 yum list installed dpkg -l
重建软件源缓存 yum makecache apt update
装单个 rpm 包 rpm -ivh x.rpm dpkg -i x.deb
这命令来自哪个包 rpm -qf $(which nc) dpkg -S $(which nc)
这包装了哪些文件 rpm -ql 包名 dpkg -L 包名

A.7 压缩与解压

我想…… 命令
压 zip zip -r 包名.zip 目录/
解 zip unzip 包名.zip
解 zip 到指定目录 unzip 包名.zip -d /tmp/
压 tar.gz tar -czvf 包名.tar.gz 目录/
解 tar.gz tar -xzvf 包名.tar.gz
解 tar.gz 到指定目录 tar -xzvf 包名.tar.gz -C /tmp/
只看包里有什么(不解压) tar -tzvf 包名.tar.gz
gzip 压单文件 gzip 文件名
gzip 解压 gzip -d 文件名.gz

tar 记忆口诀:c 打包 / x 解包 / z gzip / j bzip2 / J xz / v 显示过程 / f 指定文件名 / C 指定解压目录。 注意:-f 后面紧跟包名,所以 -czvf 包名.tar.gz 目录 的顺序不能乱。

A.8 磁盘

我想…… 命令 例子
看所有磁盘和分区 lsblk lsblk
看磁盘的 UUID 和文件系统 lsblk -f lsblk -f
看各分区使用率 df -h df -h
看目录占用 du -sh du -sh /*
分区(MBR) fdisk fdisk /dev/sdb
分区(GPT) gdisk gdisk /dev/sdc
格式化为 ext4 mkfs.ext4 mkfs.ext4 /dev/sdb1
格式化为 xfs mkfs.xfs mkfs.xfs /dev/sdb2
挂载 mount mount /dev/sdb1 /data/A
卸载 umount umount /data/A
挂载 fstab 里的全部 mount -a mount -a
看挂载情况 mount / df -h df -h
格式化 swap mkswap mkswap /dev/sdb3
开 / 关 swap swapon/swapoff swapon /dev/sdb3

A.9 系统状态与进程

我想…… 命令 例子
内核版本、架构 uname -a uname -a
发行版版本 cat /etc/os-release cat /etc/os-release
CPU 信息 lscpu lscpu
内存 free -h free -h
磁盘空间 df -h df -h
主机名 hostname hostname
永久改主机名 hostnamectl hostnamectl set-hostname web01
运行时间、负载 uptime uptime
所有进程 ps -aux ps -aux
动态看进程 top top(m 内存、t CPU、q 退出)
结束进程 kill kill 1234
强杀进程 kill -9 kill -9 1234
按名字找进程 pgrep pgrep nginx
这端口谁在用 ss -lnutp ss -lnutp \| grep 80

A.10 网络

我想…… 命令 例子
看 IP 地址 ip a ip a
简洁看 IP ip -br a ip -br a
看路由/网关 ip route ip route
测连通性 ping ping -c 4 www.baidu.com
看路由路径 traceroute traceroute www.baidu.com
域名解析 dig / nslookup dig www.baidu.com
测端口是否开放 telnet / nc nc -zv 192.168.8.28 22
发 HTTP 请求 curl curl -I http://www.baidu.com
下载文件 wget wget https://xxx/file.tar.gz
图形化配网卡 nmtui nmtui

A.11 服务管理

我想…… 命令 例子
启动 systemctl start systemctl start httpd
停止 systemctl stop systemctl stop httpd
重启 systemctl restart systemctl restart httpd
重载配置(不断服务) systemctl reload systemctl reload nginx
开机自启 systemctl enable systemctl enable httpd
设自启并立即启动 systemctl enable --now systemctl enable --now httpd
取消自启 systemctl disable systemctl disable httpd
看状态 systemctl status systemctl status httpd
看是否运行中 systemctl is-active systemctl is-active httpd
列所有服务 systemctl list-units --type=service 同上
看服务日志 journalctl -u journalctl -u httpd -n 50
实时看日志 journalctl -fu journalctl -fu httpd
彻底禁用服务 systemctl mask systemctl mask httpd

A.12 防火墙

我想…… 命令(CentOS 7,firewalld)
看状态 systemctl status firewalld
开 / 关 systemctl start firewalld / stop
看开了哪些端口 firewall-cmd --list-all
放行端口(永久) firewall-cmd --permanent --add-port=80/tcp
放行服务(永久) firewall-cmd --permanent --add-service=http
撤销放行 firewall-cmd --permanent --remove-port=80/tcp
让配置生效 firewall-cmd --reload
临时关闭全部 systemctl stop firewalld && systemctl disable firewalld

iptables 速记:

我想…… 命令
看规则(带行号) iptables -L -n -v --line-numbers
追加允许 22 端口 iptables -A INPUT -p tcp --dport 22 -j ACCEPT
插到最前面 iptables -I INPUT -p tcp --dport 80 -j ACCEPT
删除第 5 条 iptables -D INPUT 5
清空规则 iptables -F
设默认策略 iptables -P INPUT DROP
保存规则 service iptables save(CentOS 7 需装 iptables-services)

⚠️ 在 -P INPUT DROP 之前,必须先放行 22 端口,否则 SSH 会断,你把自己锁在外面。

A.13 找文件

我想…… 命令 例子
按名字找 find -name find / -name "*.conf"
不区分大小写 find -iname find / -iname "*.conf"
按类型找目录 find -type d find /data -type d
按大小找 find -size find / -size +100M
按修改时间(天) find -mtime find /var/log -mtime -1
找到后执行操作 find -exec find . -name "*.log" -exec rm {} \;
按命令名找路径 which which nginx
按文件名找(快速) locate locate nginx.conf(需先 updatedb)

A.14 文本三剑客

我想…… 命令 例子
按关键字过滤 grep grep root /etc/passwd
忽略大小写 grep -i grep -i root /etc/passwd
显示行号 grep -n grep -n root /etc/passwd
反向(不含) grep -v grep -v "^#" /etc/sudoers
递归查目录 grep -rn grep -rn "listen" /etc/nginx/
用扩展正则 grep -E grep -E "80\|443" a.txt
批量替换 sed -i 's/旧/新/g' sed -i 's/8080/80/g' a.conf
改前先备份 sed -i.bak sed -i.bak 's/旧/新/g' a.conf
删除某行 sed -i '3d' sed -i '/^#/d' a.conf
打印匹配行 sed -n '/关键字/p' sed -n '/error/p' app.log
按列取数 awk -F awk -F: '{print $1}' /etc/passwd
取最后一列 awk '{print $NF}' awk -F: '{print $NF}' /etc/passwd

A.15 快捷键

快捷键 作用
Tab 自动补全(命令、文件名、路径)—— 最该养成的习惯
↑ / ↓ 翻历史命令
Ctrl + L 清屏
Ctrl + C 中断当前正在运行的命令
Ctrl + D 退出当前终端 / 结束输入
Ctrl + A 光标移到行首
Ctrl + E 光标移到行尾
Ctrl + U 删掉光标前的内容
Ctrl + Z 把当前命令放到后台
Ctrl + R 搜索历史命令(很好用)

A.16 特殊符号

符号 作用 例子
* 任意多个字符 rm *.log
? 任意一个字符 ls a?.txt
[abc] 括号里任意一个字符 ls [abc].txt
{1..10} 序列 touch file{1..10}.txt
{a,b} 枚举 mkdir /data/{A,B}
> 输出重定向,覆盖 ls -l > list.txt
>> 输出重定向,追加 echo hi >> list.txt
< 输入重定向 bc < calc.txt
<< 键盘输入直到标记 cat >> a.txt << EOF
\| 管道:前一个的输出给后一个 ps -aux \| grep nginx
; 依次执行,不管成功失败 cd /tmp ; ls
&& 前一个成功才执行后一个 cd /tmp && ls
\|\| 前一个失败才执行后一个 ping -c1 a \|\| echo 不通
# 注释(配置文件里) # 这是注释
~ 家目录 cd ~
. / .. 当前目录 / 上一级目录 cd ..

附录B 常见报错与解决办法

遇到报错先别慌,按顺序做三件事:① 看清报错最后一行 ② 确定是"找不到"还是"没权限"还是"网络不通" ③ 再对症。

# 报错 中文意思 常见原因 解决办法
1 command not found 找不到这个命令 命令打错了 / 没装这个软件 / 路径不对 先用 Tab 补全确认拼写;确认装没装 rpm -qf $(which 命令)
2 No such file or directory 没有这个文件或目录 路径写错 / 文件名大小写不对 / 文件真不存在 ls 到上级目录看看真实名字,注意大小写
3 Permission denied 权限不够 当前用户对这个文件/目录没权限 看 ls -l 的 ugo 三段;确认是不是需要 sudo;不要无脑 777
4 Operation not permitted 不允许操作 ① 普通用户改属主 ② 文件被 chattr +i 锁了 加 sudo;或 lsattr 看是不是有 i,用 chattr -i 解锁
5 Is a directory / Not a directory 这是个目录 / 这不是目录 把目录当文件用,或把文件当目录 cd ls -ld 名字 看清类型再操作
6 rm: cannot remove 'xxx': Is a directory 不能删,它是目录 删目录没加 -r rm -r 目录(确认清楚再敲)
7 Tom is not in the sudoers file 你没被授权用 sudo 没加进 wheel(CentOS)或 sudo(Ubuntu)组 root 执行 usermod -aG wheel tom,然后重新登录
8 Sorry, user tom may not run sudo on this host 有 sudo 但这条命令不许 sudoers 里限制了这个命令 sudo -l 看允许范围;找管理员申请
9 Authentication failure 认证失败(密码错) 密码打错了 / 键盘大小写 / 账号被锁 重新输;root 用 passwd -S 用户 看是否锁定
10 sudo: command not found 系统没装 sudo 最小化安装的 CentOS 常没装 root 执行 yum install -y sudo
11 Could not resolve host: xxx 域名解析不了 DNS 没配 / 网卡没连 / /etc/resolv.conf 空 ping 8.8.8.8 测外网;检查 cat /etc/resolv.conf
12 Network is unreachable 网络不可达 没有默认网关 / 网卡没启动 ip a、ip route 检查;systemctl restart network
13 Connection refused 连接被拒绝 目标端口没监听 / 服务没起 到目标机 ss -lnutp \| grep 端口、systemctl status 服务
14 Connection timed out 连接超时 防火墙拦了 / 网络不通 / IP 错 检查 firewalld、iptables -L -n;先 ping
15 Permission denied (publickey,gssapi-keyex,password) SSH 登录被拒 密码错 / root 禁止登录 / 密钥不对 看 /etc/ssh/sshd_config 的 PermitRootLogin;确认密码
16 Another app is currently holding the yum lock yum 被另一个进程占用 另一次 yum 还在跑 / 上次异常退出 ps -aux \| grep yum 找到后 kill,或删 /var/run/yum.pid
17 Cannot find a valid baseurl for repo 找不到可用的软件源 yum 源地址错 / 没网 / 光盘没挂载 先 ping www.baidu.com;检查 /etc/yum.repos.d/ 下的 baseurl
18 No package xxx available 源里没有这个包 包名写错 / 源里确实没有 yum search 关键字 找准确包名
19 Device or resource busy 设备正忙 有进程在用这个目录 lsof 目录 或 fuser -vm 目录 找出进程再处理
20 mount: wrong fs type, bad option, bad superblock 挂载失败 分区没格式化 / 文件系统类型写错 / 设备名错 lsblk -f 确认文件系统和设备名;没格式化先 mkfs
21 No space left on device 磁盘满了 日志或数据把磁盘写满 df -h 找满的分区;du -sh /* 找大目录清理
22 Argument list too long 参数太多 rm * 时文件数量上百万 改用 find 目录 -name "*.log" -delete
23 Text file busy 文件正在被使用 程序正在运行还想覆盖它 先停服务 systemctl stop 服务,再操作
24 E212: Can't open file for writing(vim 里) 写不进去 普通用户改系统文件 sudo vim 文件
25 vim 卡住打不了字 可能在插入模式外 按 i 进编辑模式;或者上次没正常退出 Esc 后 :wq;不行就 :q!

💡 万能排查三步:

  1. 是不是打错了?用 Tab 补全验证命令和路径。
  2. 是不是没权限?ls -l 看 ugo,加 sudo 试试。
  3. 是不是网络/服务问题?ping → ss -lnutp → systemctl status。

附录C 学习路线与下一步

C.1 学完本书,你已经拥有了什么

能力 对应章节
独立登录、远程连接 Linux 第 6 章
看懂命令格式,会用 --help 和 man 自己查 第 8 章
会四处走动、会增删改查文件和目录 第 9–18 章
会用 vim 改配置文件(这可是运维的日常) 第 19–21 章
会建用户、配权限、用 sudo 第 22–33 章
会装软件、配 yum 源、压缩解压 第 34–39 章
会给服务器加新硬盘并挂载 第 40–44 章
会看系统状态、找进程、排查网络 第 47–51 章
会用 grep/sed/awk 处理日志 第 52–55 章
会开服务、配网络、设防火墙 第 56–59 章

C.2 下一步学什么(按推荐顺序)

顺序 主题 为什么先学它
1 Shell 脚本编程 把重复的命令写成脚本,是"从会用变高效"的分水岭
2 计划任务(crontab、at) 定时备份、定时清理,运维必备
3 SSH 免密与安全加固 生产环境第一课
4 常见服务部署(Nginx、MySQL、Redis) 把前面的知识用起来
5 日志分析(结合 grep/sed/awk) 真正解决故障靠日志
6 Docker / 容器 现在的部署标准
7 监控告警(Zabbix、Prometheus) 从"出了问题再修"到"提前发现"
8 自动化(Ansible) 管 1 台和管 100 台的区别
9 Kubernetes 云原生方向必备
10 安全加固与等保 做运维迟早要面对

C.3 三个建议,帮你别停下

  1. 给自己找一个真任务。 比如:用一台虚拟机搭一个能访问的个人主页;给家里的旧电脑装个 Linux 当下载机。有目标,学得下去。
  2. 养成记笔记的习惯。 只记两样:你不会的、和你踩过的坑。半年后这本笔记比任何教程都值钱。
  3. 别只看,一定要敲。 看视频觉得"我会了",一上手全忘——这是所有人的通病。动手是唯一出路。

C.4 推荐的学习资料

类型 推荐
官方文档 man 命令(最权威,就在你机器上)
命令速查 tldr 工具(比 man 简洁,能直接装)
中文社区 阿里云/腾讯云开发者社区、博客园、CSDN 的实操类文章
系统学习 各发行版官方文档(Ubuntu Docs、Red Hat Documentation)
刷题验证 自己搭环境做实验,比任何题库都有用

附录D 原始文档整理说明(勘误)

本教程由三份原始课堂笔记整理而成:

  • Linux命令基础.md(1446 行)
  • Linux简介 - 副本.md(1274 行)
  • Linux基础 - 副本.md(55 行)

整理时做了四类工作:重排结构、补全讲解、统一术语、修正错误。下面列出发现的主要问题,方便你对照原文档核对。

D.1 原文的错误与笔误

# 原文位置 原文 问题 本文改为
1 Linux基础 - 副本.md 第 7 行 「侠义上讲」 错别字 「狭义上讲」
2 Linux命令基础.md 第 419 行 yum install makecache 命令写错,会把 makecache 当包名去安装 yum makecache
3 Linux命令基础.md 第 648 行 setfac -b file 命令名少个 l setfacl -b file
4 Linux命令基础.md 第 1219 行 ifconifg 拼写错误 ifconfig
5 Linux命令基础.md 第 724 行 bzip file / bzip -d 命令名错误(应为 bzip2) bzip2 file / bzip2 -d
6 Linux简介 - 副本.md 第 729–730 行 gz 文件 / gz -d 命令名错误 gzip 文件 / gzip -d
7 Linux简介 - 副本.md 第 844 行 「nfs windows默认文件系统」 事实错误:Windows 默认文件系统是 NTFS/FAT32/exFAT,NFS 是 Linux 的网络文件系统 改为「NTFS / FAT32 / exFAT」
8 Linux命令基础.md 第 1108 行 sed -i ”2,9p“ 文件 用了中文全角引号,会直接报错;且 p 模式应配 -n 改为半角引号,并说明 -n 的必要性
9 Linux命令基础.md 第 1132 行 「安装顺序依次执行」 错别字 「按顺序依次执行」
10 Linux命令基础.md 第 498 行 「将用户家目录(慎用)个邮件池删除」 错别字/病句 「家目录和邮件池一并删除」
11 Linux命令基础.md 第 1010 行 RAID 1「可用容量为总容量的 n/1」 写反了 「1/n」(n 块盘只用 1 块的容量)
12 Linux命令基础.md 第 1175 行 ? 「匹配0或1次,非贪婪模式」 概念混淆:? 是"0 或 1 次";"非贪婪"是在数量词后再加 ? 分开讲清
13 Linux命令基础.md 第 1167–1169 行 \w \d \W \s 被当作通用元字符,且 \w 解释为「匹配任意字符」 ① \w 的含义是"字母/数字/下划线",不是"任意字符";② GNU grep 的 -E 里 \w \W \s \S 属于 GNU 扩展,能用但不可移植;③ \d/\D 在 -E 里并不支持,要加 -P 第 55 章统一改教 [0-9]、[a-zA-Z] 这类哪种环境都能用的写法,并注明 GNU 方言的差异
14 Linux命令基础.md 第 1149 行 $1~$n 表示列第1列到第N列 awk 没有这种语法,会误导 删除,改为逐个说明 $1 $2 $NF
15 Linux命令基础.md 第 570 行 chmod 700 dir # 锁定目录,只有属主才能读写文件 表述不准:目录的 r/w/x 含义与文件不同 第 25 章单列"rwx 对目录的含义"
16 Linux命令基础.md 第 150 行 「查看系统内核版本 Linux 7.2」 示例内核是 3.10.0-1160.el7,属于 CentOS 7,不是所谓"Linux 7.2" 改为按实际内核版本号解释
17 Linux命令基础.md 第 963 行 mount /dev/vg1/lv1 缺挂载点参数 补成 mount /dev/vg1/lv1 /mnt/data
18 Linux命令基础.md 第 1347 行 firewalld「底层仍调用 iptables」 过时:CentOS 8+/新版 firewalld 默认后端是 nftables 改为「底层是 iptables 或 nftables」
19 Linux命令基础.md 第 651 行 %minsudev ALL=... 组名疑似拼写错误 本文改用通行的 %wheel 示例
20 Linux命令基础.md 第 1421–1424 行 只放行 tcp 53 DNS 还需要 udp 53,只放 tcp 会导致解析异常 补充 udp 说明
21 Linux命令基础.md 第 44 行 提示符写成 [ root@localhost ~ ]# 方括号内多了空格,和真实提示符不一致 统一为 [root@localhost ~]#
22 Linux简介 - 副本.md 第 111 行 –-all 用了长横线(en dash)而不是两个连字符,照着敲必然报错 改为 --all
23 Linux命令基础.md 第 284 行 ESC键:wq 文件名 # 另存为 说错了::wq 文件名 是"写入该文件并退出";另存为是 :w 文件名 改正并区分两者
24 Linux命令基础.md 第 84–86 行 /sys 说成"运行时产生的缓存数据(关机则消失)"、/proc 说成"启动后加载的内核数据" 二者是内核提供的虚拟文件系统(sysfs、procfs),不占磁盘、由内核实时生成,既不是"缓存"也不是"加载的数据" 第 9 章按虚拟文件系统解释
25 Linux命令基础.md 第 154 行 把 uname -a 的版本串拆成"主版本.次版本.修补次数.系统信息.架构" 拆法不准确,容易误导 第 47 章只讲"3.10.0 是内核版本",不硬拆
26 Linux命令基础.md 第 350 行 「p 粘贴、np 重复复制 n 次、可以剪切 dd 删除的内容」 表述混乱:np 是重复粘贴 n 次;dd 是剪切、p 是粘贴,不是"复制" 第 21 章重新表述
27 Linux命令基础.md 第 122、243 行 rm *、cp * /newPath 未提醒:复制目录要加 -r;* 匹配不到隐藏文件;rm 没有回收站 第 13、16 章补警告
28 Linux简介 - 副本.md 第 766 行 nginx-1.31.0.tar.gz 该版本号不存在,照着下载会 404 改用真实版本,并注明"版本号以官网为准"
29 Linux简介 - 副本.md 第 770 行 编译依赖未含 pcre-devel 少了它 ./configure 会在 rewrite 模块处报错 第 38 章补进依赖列表
30 Linux命令基础.md 第 930–939 行 LVM 扩容前先 umount 多余:ext4 支持在线扩容,不必先卸载 第 45 章改为不停机扩容
31 Linux命令基础.md 第 765 行 「GPT 支持 128 个分区」写作「128 个主分区」 GPT 就是 128 个分区,没有主分区/扩展分区之分 第 41 章改正措辞
32 Linux命令基础.md 第 771 行 btyes、GTP 错别字:应为 bytes、GPT 已改正
33 Linux命令基础.md 第 1380、1389、1292 行 iptable、—F(破折号)、is-enable 命令名/选项/子命令拼写错误 改为 iptables、-F、is-enabled
34 Linux命令基础.md 第 1227–1235 行 ifcfg 示例缺 BOOTPROTO=none 少了它有的机器会退回 DHCP,手工配的 IP 不生效 第 57 章补上并说明含义

D.2 结构问题(已重排)

问题 本教程的处理
三份文档内容大量重叠(用户/权限/UGO/ACL/sudo/rpm/yum/压缩/磁盘/LVM/RAID/find/grep/sed/awk 各出现两次) 合并去重,每个知识点只讲一次
同一知识点两处写法/示例冲突(如 sudoers 授权示例) 统一为一个标准示例
概念、命令、运维实践混在一起,没有先后 重排为 10 篇:认识 → 走进 → 文件 → 编辑 → 权限 → 软件 → 磁盘 → 运维 → 文本 → 服务
章节编号中断(正文编到 23 后突然出现无编号的「Linux网络基础」「Linux服务管理」) 全篇统一编号:59 章
标题层级混乱(### 6.VI编辑器 出现在第 5 节下面) 统一为 ## 章、### 节
大量命令只列语法不给示例、不给预期输出 每条命令都配示例和 # 你会看到:
危险命令没有统一警示 统一用 > ⚠️ **注意** 标注后果
缺少"看不懂怎么办""装环境""怎么排错"的入门内容 新增前言、第 6 章、附录 B

D.2.1 为"零基础"有意做的简化(不是漏写)

原文档有 本教程的处理 为什么
LVM 缩容完整步骤、pvmove/vgreduce 只在第 45 章讲扩容,缩容改为一句话警告 缩容有丢数据风险,且 xfs 根本不支持缩容;零基础第一遍不该碰
RAID 用 mdadm 实操建阵列 只讲原理和对比表 建 RAID 需要在虚拟机里加多块盘,入门阶段收益低
源码编译安装的模块参数 只给"下载→解压→configure→make→make install"五步 参数一多,新手就卡在报错上
iptables 完整规则集(含 NAT、限速) 只讲 filter 表 + INPUT 链 其余场景入门阶段用不到
%s###g、sed 高级模式、awk 脚本编程 只讲最常用的 s/d/p 和按列取数 先能干活,再谈精通

💡 一句话:进阶内容不是删掉,是藏起来了。等你把 🔰 章节用熟了,再回原文档翻这些细节,会轻松很多。

D.3 无法访问的资源(已移除)

位置 内容 处理
Linux命令基础.md 第 892 行 https://img-blog.csdnimg.cn/...lvm....png 外链图片,改为文字描述
Linux命令基础.md 第 903 行 D:\Code\img\img\image-20261014101157308.png 本地绝对路径,别人电脑上必然打不开,已删除
Linux命令基础.md 第 1006–1028 行 4 张 RAID 外链图 改为文字 + 对比表
Linux简介 - 副本.md 第 309 行 D:\Code\img\img\Linux文件查看与重定向技能.png 本地绝对路径,已删除

D.4 时效性提示

内容 情况 建议
CentOS 8 已于 2021 年底停止维护(EOL) 新项目别用
CentOS 7 已于 2024 年 6 月 30 日 EOL 存量服务器仍在用,学习可用;新项目建议 Rocky Linux 9 / AlmaLinux 9 / Ubuntu 22.04 LTS
Ubuntu 20.04 2025 年 5 月结束标准支持 新装建议 22.04 或 24.04 LTS
本书示例 以 CentOS 7 为准 换系统后主要改两处:装软件(yum → apt)和配网络(ifcfg → netplan)

💡 一句话总结原文档:内容其实很扎实、覆盖面很全,问题不在"讲少了",而在"没考虑看的人是零基础"——缺过渡、缺解释、缺示例、缺排错。这一版补的就是这些。


结语

到这里,这本书就结束了。

Linux 不难,难的是第一次面对一个黑漆漆的终端时,不知道从哪下手。你已经走过了这一段——你现在知道 ls 在哪、知道报错怎么读、知道权限不上去该改哪里。

剩下的路就是多用。用得越多,那些命令就越不像"要背的东西",而像"顺手的工具"。

祝你早日敲出那句属于你自己的 It works!。