简介:《鸟哥的Linux私房菜-基础篇》第四版是一份面向Linux初学者及有一定经验IT技术人员的PDF教程,内容从计算机组成、操作系统原理等底层概念切入,逐步过渡到Linux日常使用所需的基础技能。书中围绕man页、info页等文档查阅方式展开,说明常见实用文档的位置与使用方法,并结合nano文本编辑器的基本操作和SELinux安全管理,帮助读者建立从硬件认识到系统管理的完整知识框架。压缩包内为1个PDF文件,大小约17.5MB,目录组织清晰,便于按章节系统阅读或针对薄弱环节查阅。已有1238人学习,适合希望打牢Linux基础、提升独立排错与文档检索能力,并为后续深入学习类Unix系统做准备的读者。
1. 拿到这份 Linux 基础篇第四版:别急着翻命令,先把三个入口钉住
如果你刚接手一台 Linux 测试机,第一反应是搜“常用命令大全”,这份《Linux 基础篇》第四版反而值得先放到手边:它不是命令速查表,而是把计算机组成、文档查阅、nano 编辑与 SELinux 这些底层概念串成一条可操作的路径。它适合能装系统、但一遇到权限、上下文和日志就发怵的从业者,也适合要把基础补牢的运维新人。拿到后别从头硬啃,先按“组成概念—查文档—改配置—看安全策略”的顺序切进去,后面几章我按这条线拆给你。
2. 先把计算机组成打通:五大单元、容量单位与 Linux 性能直觉
很多人读基础篇时会跳过第零章,直接去背ls、cd、grep,结果一看到free -h的输出就发懵,df和du的差异也说不清。我的血泪经验是,基础篇里最值钱的反而是最像“计算机概论”的那一段:输入单元、输出单元、CPU 内的控制单元与算术逻辑单元、主存储器,这五块一旦串起来,后面看内存、看位宽、看 32/64 位限制都不会飘。
这份第四版资料把“数据先进入主存储器,再交给 CPU 处理,最后写回主存储器并送到输出设备”讲得很直白。你不需要把它当硬件教材背,但要在机器上找到对应物:lscpu看 CPU 和位宽,free看主存与交换分区,lsblk看块设备。下面这套动作我一般会在一台新测试机上先跑一遍,只要五分钟,后面读文件系统、权限、服务配置都会顺很多。
2.1 五大单元不是背名词:从 CPU 到主存储器的数据路径
基础篇里反复强调“CPU 处理的数据来自主存储器”,这句话看着朴素,实际是排障时最常用的判断依据。程序启动要把可执行文件和依赖库映射进内存,服务读配置文件要先经过页缓存,日志写入也不是“直接写盘”那么线性。你看到系统卡顿、内存吃满、Swap 开始频繁换入换出,本质上就是数据在主存和磁盘之间来回搬运的成本变高了。
CPU 内部大致分控制单元和算术逻辑单元,前者负责协调周边组件,后者负责运算与判断。资料里用“人体”做类比:CPU 像脑袋,主存储器像当前正在思考的数据区块,硬盘像长期记忆,主板像神经系统。这个类比不严谨,但对新手够用。常见做法是把它落到三个观察点上:CPU 有多少核心和线程、主存储器够不够当前服务用、磁盘是机械盘还是固态盘。不要只盯 CPU 主频,频率只能比较同代同架构的型号,跨架构、跨代际拿频率硬比,很容易翻车。
另一个容易被忽略的点是 32 位与 64 位的“字组大小”。32 位 CPU 一次能解析的数据量有限,所以老系统常见 4GB 左右的内存寻址天花板;64 位环境下这个限制基本不再是日常瓶颈,但应用本身仍然可能是 32 位的。排查老服务时,file看二进制架构、uname -m看内核架构,比凭感觉猜靠谱。
2.2 容量单位与位宽:为什么 500GB 硬盘只剩 460GB
基础篇里专门讲了容量单位和速度单位,这一段经常被跳过,但它是很多“用户觉得被坑了”的来源。计算机内部按二进制记账,存储厂商按十进制标容量,两边都没错,只是尺子不同。你买一块标称 500GB 的盘,厂商按500×1000×1000×1000字节算,操作系统按 1024 进制换算,最后显示 460GB 左右很常见。网络带宽也一样,运营商说的 20M 是 20Mbps,落到文件下载速度要除以 8,理论值大约 2.5MB/s,实际还要扣协议开销和线路波动。
| 单位 | 二进制换算 | 十进制换算 | 常见场景 |
|---|---|---|---|
| K | 1024 | 1000 | 小文件、内存页 |
| M | 1024K | 1000K | 日志、图片 |
| G | 1024M | 1000M | 磁盘、内存 |
| T | 1024G | 1000T | 备份盘、日志归档 |
提示:看磁盘容量时先确认工具用的是 GiB 还是 GB,
lsblk、df -h、fdisk -l的显示口径不完全一样,别拿两个口径的数字直接对账。
2.3 用三条命令把书上的硬件概念落到机器上
先跑一组最基础的观察命令,不要急着改任何配置。下面这段可以在普通用户下执行,只有少数字段需要 root 才能看全:
# 查看 CPU 架构、核心数、线程数、缓存与 NUMA 信息 lscpu # 以人类可读单位查看内存与交换分区 free -h # 查看块设备、文件系统类型与挂载点 lsblk -f df -hTlscpu重点看Architecture、CPU(s)、Thread(s) per core、Core(s) per socket和缓存字段。free -h重点看available,不要只看free,Linux 会把空闲内存拿去做缓存,available才更接近“还能给新进程用多少”。lsblk -f里的-f是显示文件系统类型和 UUID,df -hT里的-T是显示文件系统类型,-h是人类可读单位。两块盘容量看起来一样但挂载点不同,排障时先看df的挂载层级,再看du的目录占用,否则容易在错误的挂载点上删东西。
再补一条内核视角的检查,看看系统启动时怎么识别 CPU、内存和磁盘:
# 只截取 CPU、内存、磁盘相关的前 20 行,避免刷屏 dmesg | grep -Ei 'cpu|memory|sd|nvme' | head -n 20dmesg读的是内核环形缓冲区,grep -Ei里的-E是扩展正则,-i忽略大小写,head -n 20限制输出行数。这个命令适合确认“系统到底有没有认到这块盘”“内存有没有被硬件保留”。如果dmesg输出被限制,普通用户可能看不到全部内容,换成sudo dmesg再试。读到这里再回看基础篇的五大单元,你会发现那些名词不是考试题,而是你每天看监控、看日志、看挂载点时反复出现的底层坐标。
3. 把 man、info 与文档路径用顺:三步定位一条命令的真实用法
基础篇花了不少篇幅讲 Linux 文档查阅,这个方向特别容易被新手低估。真实工作里,命令参数记不住很正常,关键是知道去哪里查、查哪一节、查到之后怎么验证。我的习惯是先把man的分节搞清楚,再用--help快速扫一遍常用参数,最后去/usr/share/doc找示例和发行版附带的说明。这样比在搜索引擎里翻十篇二手文章稳得多。
这一章按“先定位文档类型,再选择查阅工具,最后建立自己的文档路径清单”来走。你不需要背完所有参数,但要做到:看到一条陌生命令,能在两三分钟内找到它的官方说明,并且知道配置文件和命令本身要查不同的 man 节。
3.1 man 的分节与搜索:先定位“查的是命令还是配置文件”
man不是只查命令。同一个名字可能既是命令又是配置文件,比如passwd既有修改密码的命令,也有用户账户文件。直接man passwd通常打开第一节,但你想看文件格式时就要指定第五节。常见分节如下:
| 节号 | 内容 | 例子 |
|---|---|---|
| 1 | 用户命令 | man 1 ls |
| 5 | 文件格式与配置 | man 5 passwd |
| 8 | 系统管理命令 | man 8 mount |
先用关键词搜索,再进具体分节:
# 按关键词搜索 man 页,等同于 apropos man -k passwd # 明确查“配置文件”的说明 man 5 passwd # 明确查“命令”的说明 man 1 passwdman -k依赖 man 数据库,如果输出nothing appropriate,常见原因是数据库还没建,执行一次sudo mandb再试。man 5 passwd里的5不是版本号,是分节号,写错分节会打开另一份文档。进 man 页后,/关键词搜索,n跳下一个,N跳上一个,q退出。这个动作看着小,但在机房现场比翻网页快。
3.2 info、--help 与 /usr/share/doc 各自适合什么场景
--help适合快速看参数摘要,不适合看完整语义;man适合看命令、配置文件、系统调用的正式说明;info适合看带章节结构的 GNU 风格文档;/usr/share/doc适合看软件包附带的 README、示例配置和变更记录。四者不是替代关系,是不同颗粒度。
# 快速看命令支持的参数 ls --help | head -n 30 # 看 info 格式的说明,按 q 退出 info ls # 看软件包附带的文档目录 ls /usr/share/doc | head find /usr/share/doc -maxdepth 2 -iname '*readme*' | headls --help | head -n 30里的管道把输出交给head,只保留前 30 行,避免一屏刷完。find的-maxdepth 2限制递归深度,-iname '*readme*'忽略大小写匹配文件名。/usr/share/doc下每个包一个目录,里面经常有README、NEWS、examples,排障时比凭空猜配置项靠谱。
常见文档位置可以整理成一张自己的清单:
| 路径 | 用途 |
|---|---|
/usr/share/man | man 页源文件 |
/usr/share/info | info 文档 |
/usr/share/doc | 软件包附带说明与示例 |
/etc | 系统与服务配置 |
/var/log | 日志与审计记录 |
/proc、/sys | 内核与设备运行时信息 |
注意:
/usr/share/doc下的示例配置不能直接覆盖生产配置,先diff再合并,避免把发行版默认值带进业务环境。
3.3 一条命令查不到文档时,我的定位顺序
查不到文档时,不要第一反应去搜“某命令找不到 man 页”。先确认命令本身来自哪里:
# 查看命令类型与完整路径 type -a ls whereis ls # 查看命令属于哪个软件包,再列包内文件 rpm -qf "$(command -v ls)" rpm -ql "$(rpm -qf "$(command -v ls)")" | headtype -a会把别名、内建命令、外部命令都列出来;whereis只找二进制、源码和 man 页位置,范围比find /小。command -v返回命令路径,rpm -qf反查所属包,rpm -ql列出包内文件。使用其他包管理体系的机器,把rpm换成对应工具即可,思路不变:先定位命令来源,再定位文档来源。我的顺序是--help看摘要,man看正式说明,info看长文档,/usr/share/doc看示例,最后才去翻外部资料。这样查到的信息更接近你机器上的真实版本。
4. nano 编辑器别只会保存:配置文件修改的完整动作链
基础篇把 nano 作为新手友好的文本编辑器来讲,这个选择很务实。真实排障时,你未必要在服务器上跟模式编辑器较劲,能快速打开配置、搜索关键字、改完保存、校验差异、必要时回滚,就已经解决大半问题。nano 的快捷键直接印在屏幕底部,^表示 Ctrl,M-表示 Alt,现场看一眼就能操作,不用先背一整套模式切换。
这一章把 nano 放进“改配置”的完整动作链里:先备份,再打开,改完对比,确认语法或服务状态,最后保留回滚路径。只学Ctrl+O保存、Ctrl+X退出还不够,真正常见的翻车是改错文件、少打一个引号、覆盖了原配置却没有备份。
4.1 打开、搜索、保存与退出的快捷键链路
先用一个安全文件练手,比如/etc/hosts。它是本机名称解析文件,改坏了影响面相对可控,改之前也容易备份:
# 先备份,再打开;-w 关闭自动换行,-l 显示行号 bak="/etc/hosts.bak.$(date +%F-%H%M%S)" sudo cp -a /etc/hosts "$bak" sudo nano -w -l /etc/hostscp -a保留权限、时间戳和属主信息,备份文件名带时间戳,后面回滚时不会覆盖旧备份。nano -w关闭长行自动折行,改配置时更接近真实文件结构;-l显示行号,报错信息里给行号时特别好用。打开后常用动作如下:
| 快捷键 | 动作 |
|---|---|
Ctrl+W | 搜索 |
Alt+W | 跳到下一个匹配 |
Ctrl+O | 写入保存 |
Enter | 确认文件名 |
Ctrl+X | 退出 |
Ctrl+K | 剪切当前行 |
Ctrl+U | 粘贴 |
Ctrl+G | 打开帮助 |
Ctrl+_ | 跳到指定行 |
Alt+U | 撤销 |
改完之后不要直接重启服务。先看差异:
# 统一格式对比备份与当前文件 sudo diff -u "$bak" /etc/hosts | lessdiff -u输出统一格式差异,-开头是旧文件,+开头是新文件,less分页查看。确认只改了你想要的那几行,再决定是否继续。这个动作比“凭记忆检查”可靠得多,尤其是多人共用一台跳板机的时候。
4.2 改系统配置前的备份、校验与回滚
nano 本身不负责校验配置语法,改完要用对应服务或工具的检查命令验证。不同服务的校验方式不一样,通用思路是先备份、再改、再对比、再做语法检查,最后才 reload。不要一上来就restart,有些服务重启失败会直接影响业务。
# 备份保留权限和时间戳 bak="/etc/hosts.bak.$(date +%F-%H%M%S)" sudo cp -a /etc/hosts "$bak" # 改完后确认文件权限没有被意外改掉 ls -l /etc/hosts "$bak" # 如果改的是某个服务配置,先跑该服务自带的语法检查 # 例如:sudo nginx -t # 例如:sudo sshd -tls -l看属主、属组和权限位,备份文件不应该比原文件更宽松。服务自带的-t检查能挡住大部分语法错误,但挡不住逻辑错误,所以差异对比仍然要做。回滚时不要直接cp覆盖,先确认备份文件名和当前文件差异:
# 回滚前再看一眼差异,确认要放弃哪些改动 sudo diff -u "$bak" /etc/hosts # 确认后回滚 sudo cp -a "$bak" /etc/hostscp -a回滚会保留备份文件的元数据,如果备份时权限就是对的,回滚后一般不会引入新权限问题。改配置这件事,我的习惯是“备份文件名可读、差异可看、回滚命令可复制”,不要在紧张时现场拼命令。
4.3 .nanorc 与多文件编辑:让 nano 更适合排障
nano 可以通过~/.nanorc做一些轻量定制,比如默认显示行号、设置 Tab 宽度、开启鼠标。不要堆太多花哨配置,排障环境里稳定、可预测比好看重要:
# 追加个人 nano 配置;>> 表示追加,不会覆盖已有配置 cat >> ~/.nanorc <<'EOF' set linenumbers set autoindent set tabsize 4 set mouse EOFset linenumbers默认显示行号,set autoindent延续上一行缩进,set tabsize 4把 Tab 显示为 4 列,set mouse允许鼠标点选光标位置,但某些终端下可能和复制粘贴冲突,不合适就删掉。这里用>>而不是>,避免把原有配置清空。
多文件编辑也很实用:nano file1 file2打开多个缓冲区,Alt+,和Alt+.前后切换。排障时我经常左边放备份、右边放当前配置,改一行对一行,比在单文件里反复搜索稳。nano 不是功能最全的编辑器,但它在“快速打开、搜索、改完、对比、退出”这条链路上足够短,适合基础篇阶段建立肌肉记忆。
5. SELinux 初学排查:模式、上下文与四条踩坑记录
基础篇把 SELinux 放在安全管理相关章节里讲,很多人第一次遇到时的反应是“怎么又权限不够,干脆关掉”。这个反应很危险。SELinux 不是普通的文件权限,它看的是进程上下文、文件上下文、端口标签和布尔值。你chmod 777之后仍然被拒绝,很可能不是传统权限问题,而是策略不允许。先学会看状态、看上下文、看 AVC 日志,再决定是否调整策略,比直接关掉安全模块靠谱。
这一章按“先看模式,再看上下文,最后看日志和布尔值”的顺序走。所有命令都以观察为主,只有确认原因后才做临时或永久调整。生产环境里不要用关闭 SELinux 当第一反应,那等于把黑匣子直接扔掉。
5.1 先分清 enforcing、permissive 与 disabled
SELinux 有三种常见状态:enforcing按策略拒绝并记录,permissive只记录不拒绝,disabled完全不启用。新手最容易把permissive当成“关闭”,其实它仍然在记 AVC,适合短期收集拒绝原因;disabled才是彻底不启用,但切换回启用往往需要重新打标签,代价更大。
# 查看当前模式 getenforce # 查看完整状态、策略类型和加载情况 sestatusgetenforce只给一行结果,适合快速确认;sestatus会显示SELinux status、Current mode、Loaded policy name等信息。临时切到 permissive 可以用sudo setenforce 0,切回 enforcing 用sudo setenforce 1,但重启后会回到配置文件里的默认值。我的建议是:只在定位问题时临时切 permissive,收集完 AVC 就切回 enforcing,不要长期停留在 permissive 还当成已经解决。
注意:不要为了省事直接改配置文件永久关闭 SELinux。文件上下文和端口标签一旦长期不维护,后面再启用会遇到成批的标签错误。
5.2 看上下文和布尔值:不要用关 SELinux 当第一反应
SELinux 拒绝访问时,先看进程和文件的上下文是否匹配。文件用ls -Z,进程用ps -eZ,布尔值用getsebool -a。这三个动作能把“玄学权限问题”拉回到可观察的字段上:
# 查看文件或目录的 SELinux 上下文 ls -Z /var/www/html # 查看进程的 SELinux 上下文,按你的服务名替换过滤条件 ps -eZ | grep -E 'http|web|java' | head # 查看布尔值开关,先过滤常见服务关键字 getsebool -a | grep -E 'http|ftp|samba'ls -Z的-Z显示安全上下文,格式通常是用户:角色:类型:级别,排障时最常看第三段类型。ps -eZ的-e是所有进程,-Z显示进程上下文。getsebool -a列出所有布尔值,输出很多,必须配合grep。布尔值是策略提供的开关,比如允许服务访问网络、允许访问用户家目录,但不要看到off就无脑打开,先确认业务是否真的需要。
如果确认是文件标签问题,优先用restorecon按策略恢复,而不是手动chcon乱改:
# 递归恢复目录的默认上下文,-R 递归,-v 显示过程 sudo restorecon -Rv /var/www/html # 非标准目录需要先加规则,再加标签 sudo semanage fcontext -a -t httpd_sys_content_t '/webdata(/.*)?' sudo restorecon -Rv /webdatarestorecon -R会按策略数据库里的规则恢复标签,-v输出被修改的文件。semanage fcontext -a新增一条路径规则,-t指定目标类型,'/webdata(/.*)?'是正则,表示目录本身和其下所有内容。改完必须再跑一次restorecon,否则规则只是写在数据库里,文件标签还没变。
5.3 四条踩坑记录:现象、原因、解决
现象一:目录已经chmod 777,服务仍然报 Permission denied。
原因:传统权限放行了,但文件 SELinux 类型不对,进程上下文访问不了这个类型。
解决:先ls -Z看文件类型,再ps -eZ看进程类型,确认后用restorecon -Rv恢复默认标签;非标准路径用semanage fcontext加规则后再恢复。
现象二:服务换到 8080 端口启动失败,日志只说 bind 失败。
原因:SELinux 对端口有标签限制,8080 没有被标记成该服务允许绑定的端口类型。
解决:先查sudo semanage port -l | grep 8080,确认是否已分配;没有的话用sudo semanage port -a -t http_port_t -p tcp 8080添加,再重启服务验证。
现象三:setenforce 0后问题消失,重启又复发。
原因:setenforce只改运行时状态,重启后回到配置文件里的默认模式;真正的问题没有修。
解决:把模式切回 enforcing,用sudo ausearch -m avc -ts recent或sudo sealert -a /var/log/audit/audit.log找 AVC 记录,按拒绝项修标签、端口或布尔值,而不是长期停留在 permissive。
现象四:日志里看不到 AVC,但服务就是起不来。
原因:审计服务没运行、日志路径不对,或者拒绝发生在其他层,根本没走到 SELinux 拒绝。
解决:先systemctl status auditd确认审计服务状态,再看/var/log/audit/audit.log是否存在;同时用journalctl -u 服务名看服务自身报错,别把所有启动失败都归因给 SELinux。
# 查看最近的 AVC 拒绝记录 sudo ausearch -m avc -ts recent # 如果有 sealert,可用它做可读分析 sudo sealert -a /var/log/audit/audit.log # 查看端口标签分配情况 sudo semanage port -l | grep -E '8080|http'ausearch -m avc只筛 AVC 消息,-ts recent表示最近时间范围;sealert -a读取审计日志并给出解释。把这几条命令放在手边,遇到拒绝先收集证据,再决定改标签、改端口还是调布尔值。SELinux 的坑大多不是“它太严”,而是我们没看它到底在拒绝什么。
6. 把基础篇变成一轮小实验:三个验证点与我的复盘习惯
这份第四版资料最容易读成“看过等于会了”,我的做法是每读完一块就压成一个小实验。第一,用lscpu、free -h、lsblk -f对上五大单元和容量单位,能解释“为什么内存不足会拖慢系统”“为什么标称容量和显示容量不一致”。第二,用man -k、man 5、--help、/usr/share/doc查一条陌生命令,要求自己说清命令、配置文件、示例分别去哪找。第三,用nano -l -w改一次/etc/hosts,改前备份、改后diff -u,再把 SELinux 的getenforce、ls -Z、ausearch -m avc跑一遍,知道权限被拒时先看哪一层。
# 一轮最小验证:硬件、文档、编辑、安全状态各看一次 lscpu | head free -h man -k passwd | head getenforce这几个命令不解决业务问题,但能把基础篇里的概念钉在机器上。从那以后我每次改配置都强制走一遍“备份、编辑、差异、校验、回滚路径”,不再凭记忆直接覆盖;每次遇到权限拒绝也先看上下文和日志,不把关闭安全模块当后悔药。如果你准备把基础补一遍,建议把这份第四版资料放进本地文档目录,按上面的实验顺序跑一轮再回头翻概念,很多卡点会自己消失。希望帮到你。
本文还有配套的精品资源,点击获取