从500GB硬盘到SELinux:Linux基础为何先讲计算器概论 简介《鸟哥的Linux私房菜-基础篇》第四版以PDF电子书形式呈现面向具备基本计算机操作能力、希望系统入门Linux的初学者以及需要补齐基础概念的IT从业者。全书从计算机组成与操作系统原理讲起延伸到Linux文档查阅方法man页、info页、常见实用文档的位置与用法并涉及nano文本编辑器操作与SELinux安全管理配合大量实操讲解帮助读者建立独立排查与解决问题的思路。压缩包内共1个PDF文件约17.5MB单文件结构便于在电脑或移动设备上随时检索翻阅。目前已有1238人学习下载。对于想打牢命令行与系统管理根基、并为后续深入类Unix系统做铺垫的读者这份教程兼顾概念梳理与动手指引可作为长期查阅的案头读物。1. 一块标称 500GB 的硬盘装完系统只剩 460GBLinux 基础为什么要从计算器概论讲起新机器开箱df -h一看说好的 500GB 只剩 460GB 出头第一反应往往是被坑了。同一类困惑还有办了 20M 的宽带下载却只有 2.5MB/s机器插了 8GB 内存开两个虚拟机就开始卡。这些问题的答案都不在命令本身而在命令下面那一层——数据必须先进入主存储器CPU 才认得它任何输入输出都得在这条路上排队。《鸟哥的Linux私房菜-基础篇》第四版把计算器概论放在第零章讲的正是这层物理约束也是后面所有 Linux 基础操作的地基。把这层搞懂再看free、lscpu、dmidecode的输出看到的就不是一堆数字而是一条条绕不开的路径。2. 数据只有一条必经之路五大单元与内存决定手感的底层机制2.1 输入、内存、CPU、内存、输出为什么数据要绕两趟书里对计算机的定义很朴素接受用户输入的指令与数据经中央处理器的算术逻辑单元运算产生或储存成有用的信息。拆开就是五个单元——输入、输出、控制、算术逻辑、主存储器。真正值得盯住的是流向输入设备的数据先进主存储器CPU 再从主存储器取指令和数据算完写回主存储器最后才由主存储器送到输出设备。注意这条链里 CPU 从来没有直接跟硬盘或键盘打交道它只跟内存说话。这个约束解释了一个反复被验证的经验加内存比换 CPU 更能救一台卡顿的机器。因为所有数据都要在内存里过一遍内存容量不够时内核只能把一些暂时用不上的页写到磁盘上腾地方等进程再访问时又得读回来。磁盘的延迟是内存的几万倍这一来一回整机的手感就没了。书中用人体做类比CPU 是脑袋主存储器是脑袋里正在思考的那块区域硬盘是记忆深处主板是神经电源是心脏。这个比喻不严谨但极其好用——它把内存是工作台、硬盘是仓库这件事钉进了直觉里。工作台小你就得不停地从仓库搬货、把货搬回去搬运动作本身消耗掉了本该用于思考的时间。落到 Linux 上这条机制有几个可以直接观察的面孔# 看内存的真实余量别只看 free 那一列 free -m # total used free shared buff/cache available # Mem: 7822 2103 412 16 5306 5384 # Swap: 2047 0 2047free那一列很小是正常的内核会把空闲内存拿去做文件缓存buff/cache这不是浪费而是在利用内存比磁盘快这个事实。真正要看的是available——它估算的是在不触发换页的前提下还能给新进程用多少。很多人看到free只剩几百兆就慌其实是被列名误导了。当available也开始吃紧、si/so换入换出在vmstat 1里持续非零才是真的要加内存了。提示buff/cache里的页在被回收前是脏的或干净的干净的页可直接丢弃脏页必须先落盘。所以写密集的机器在内存压力下会先出现一段 I/O 抖动而不是立刻 OOM。2.2 字组大小32 位 CPU 的 4GB 墙是怎么砌起来的书里给位下的定义是CPU 一次数据读取的最大量。64 位 CPU 一次能读写 64 bit32 位就是 32 bit。这句话背后是一条硬算术——32 位能表示的地址数量是 2³²也就是约 42.9 亿个。如果每个地址对应一个字节那么可寻址空间就是 4GB一个字节都不多。这就是 32 位机器装 8GB 内存只认 4GB 的根本原因不是主板不认是 CPU 手里的门牌号不够用。更准确地说瓶颈是地址总线的宽度而非数据总线的宽度但两者在 x86 的历史上长期同步演进所以用字组大小来记这件事在实践中够用。后来出现过把地址线扩展到 36 位的方案能寻址 64GB但单个进程的虚拟地址空间仍然被限制在 4GB 以内——这堵墙对进程是硬的对物理内存只是松了口气。在系统里验证这个数字不需要重启也不需要拆机# 当前内核与用户态的字组大小 getconf LONG_BIT # 输出 64 表示用户态按 64 位编译 uname -m # x86_64 # 一次看清物理核、逻辑核、插槽与频率 lscpu | grep -E ^CPU\(s\)|Thread|Core|Socket|MHzlscpu里Socket(s)是物理插槽数Core(s) per socket是每颗 CPU 的物理核心Thread(s) per core是每核的硬件线程。三者相乘等于CPU(s)。如果Thread(s) per core是 2说明开了超线程如果它突然变成 1可能是 BIOS 里被关掉了也可能是虚拟机没把拓扑透传给客户机——这在跑并行计算时会让程序的线程数算错性能对不上账。2.3 外频乘倍频与超线程频率数字为什么骗人书里对频率的拆解很到位早期所有设备都挂在同一颗桥接芯片上必须同步工作于是有了前端总线CPU 跑得比总线快就在内部再乘一个倍数这就是外频与倍频的由来两者相乘才是 CPU 频率。3.0GHz 可能是 333MHz × 9 的结果。玩家超频通常动外频因为倍频出厂就锁了但外频一动整块主板上挂着的设备频率跟着变稳定性就成了玄学。这条历史在今天已经变形了内存控制器搬进 CPU 之后CPU 不必再跟外部设备同步基频退化成 100MHz 的参考时钟倍频可以拉到 30 以上。所以在监控工具里看到外频 100MHz、倍频 36不要惊讶那是正常形态不是软件读错了。更要命的是频率跨型号不可比。不同代际的微指令集不同、每周期能发射的指令数不同、缓存层次不同3.6GHz 的新架构打赢 4.0GHz 的老架构是常态。频率只在同款型号内部有意义这个结论书里写得直白但在实际选型时被违反的次数最多。超线程是另一个容易被误解的点。它的做法是把 CPU 内部关键的寄存器分成两组让两个程序各自占一组同时竞争同一套运算单元。操作系统因此看到两倍的核心数但物理上运算单元还是一个。收益完全取决于负载运算单元本来就吃不饱的任务比如访存密集、分支预测经常失败的数值模拟第二个线程能填进空隙收益可观运算单元本来就打满的任务两个线程互相抢反而可能比关掉超线程更慢。这也是为什么同一台机器上跑不同软件超线程的评价会两极分化——它不是免费的 30%而是把闲置的算力捡起来。3. 南北桥的消失一次访存要交多少过路费3.1 北桥时代的带宽账CPU 和显卡抢同一条路早期的芯片组分南北两座桥。北桥连接速度快的设备——CPU、主存储器、显示适配器南桥连接慢速设备——硬盘、USB、网卡。这个划分本身很合理问题出在北桥是个收费站CPU 要读写内存必须先经过北桥北桥再从总可用带宽里切一块给这次传输显示适配器要走同一条路也得排队。打个比方CPU 和显卡是两辆货车内存是仓库北桥是唯一一座桥。桥的总宽度固定谁过桥都要占掉一部分货车越多每辆车摊到的通行时间越长。更糟的是 CPU 的速度一直在涨桥的速度跟不上桥就成了整个系统的瓶颈——你把 CPU 换成更快的货车还是堵在桥上。3.2 内存控制器搬进 CPU 之后直连带来的延迟与带宽双收益后来的解决方案是把内存控制器直接整合进 CPU 封装。这一改CPU 与内存之间变成点对点直连不再跟显卡抢带宽显卡则改走独立的串行通道跟 CPU 对话。书里对这一步的评价是真浪费变成了不浪费——CPU 与内存的交流不再瓜分桥的总带宽。这件事在软件层的体现很隐蔽但很实在内存延迟降低意味着同样一段指针追逐式的代码链表遍历、树查找跑得更快而这部分收益跟算法复杂度无关纯粹是硬件结构变化带来的。所以拿十年前的性能模型去预测今天的程序行为经常翻车。顺着这个思路你在主板上看到北桥不见了不是印错而是它被吃进了 CPU 里。散片 CPU 上那块金属顶盖下面除了运算核心还有内存控制器、PCIe 控制器甚至核显。3.3 DDR 的双倍到底翻在哪预取、双边沿与等效频率书里有一张很有价值的对照表把 SDRAM 与 DDR 系列的带宽算得清清楚楚。把它整理成不依赖具体厂商型号的形式内存类型数据宽度内部频率等效传送率单通道带宽SDRAM PC13364 bit133 MHz133 MT/s1.06 GB/sDDR-40064 bit200 MHz400 MT/s3.2 GB/sDDR2-80064 bit200 MHz800 MT/s6.4 GB/sDDR3-160064 bit200 MHz1600 MT/s12.8 GB/s看这张表要抓住两件事。第一带宽 等效传送率 × 每次传送的字节数64 bit 就是 8 字节所以 1600 MT/s × 8B 12.8 GB/s跟 CPU 与内存之间那条通道的算法完全一致。第二型号里的数字是等效频率不是内存颗粒内部真正跑的时钟。DDR3-1600 的内部时钟只有 200MHz 左右靠预取和双边沿传输把每次时钟周期的数据吞吐放大了八倍。所谓DDR2 是 4 倍、DDR3 是 8 倍说的就是这个放大系数。用一段脚本把这张表变成可算的比死记数字可靠def bandwidth(mt_s, width_bit64, channels1): mt_s: 等效传送率型号里那个数字width_bit: 数据宽度 返回单通道/多通道的理论带宽单位 GB/s bytes_per_transfer width_bit / 8 # 64bit - 8 字节 per_channel mt_s * 1e6 * bytes_per_transfer / 1e9 return per_channel, per_channel * channels # DDR3-1600 双通道就是主板上插两根同规格内存的常见形态 single, dual bandwidth(1600, 64, 2) print(f单通道 {single:.1f} GB/s, 双通道 {dual:.1f} GB/s) # 单通道 12.8 GB/s, 双通道 25.6 GB/s这段代码里mt_s用的是型号标称值等效传送率已经把预取和双边沿算进去了所以不要再乘 2否则会得到双倍虚高的结果——这是自己写容量/带宽估算脚本时最常见的错。channels参数对应主板的通道数它决定了内存控制器能不能并行访问多根内存条。3.4 多通道与插槽顺序为什么插错槽位带宽减半多通道的原理很简单内存控制器有多个独立通道每个通道接一组内存可以同时读写。两根同规格内存插在属于不同通道的插槽上带宽翻倍插在同通道的两个槽上带宽不变容量倒是加了。主板上插槽的颜色就是提示但颜色规则各家不统一有的同色同通道有的同色跨通道。所以稳妥的做法是查主板手册或者直接读固件报告# 需要 root 权限查看每个插槽上内存的容量、频率与当前通道模式 sudo dmidecode -t memory | grep -E Locator|Size|Speed|Rank如果输出里Size全是No Module Installed说明要么真没插要么虚拟机没透传 SMBIOS 信息。如果两根内存的Speed不一致控制器会把它们统一降到较低的那档频率运行等于花高价买的高频条被低频条拖累——这也是升级内存时最该避免的组合。4. 内核是硬件的第一个抽象层man 页为什么分节、SELinux 为什么在文件上贴标签4.1 从加电到 shell内核把 CPU、内存、磁盘改名成进程、页、块设备前面几章讲的全是硬件但从你敲下第一条命令开始接触到的一切都已经被内核包装过一遍。CPU 的时间被切成片包装成进程和线程物理内存被页表映射包装成每个进程独立的虚拟地址空间磁盘被抽象成块设备再往上变成文件系统里的路径。这些抽象不是装饰它们的存在是为了让上层软件不必知道自己跑在哪颗 CPU、哪根内存条上。这也解释了为什么理解 Linux绕不开 man 页man 页记录的不只是命令怎么用更是这些抽象的接口约定。而 SELinux 这类强制访问控制机制则是在传统权限模型之上又加了一层判定它管的不是你能不能读这个文件而是这个进程有没有资格读这个标签的文件。4.2 man 的九个分节同一个 read 为什么有三个答案书里提到 man 页与 info 页是两套并行的文档体系常见的实用文档还散落在/usr/share/doc下。真正需要建立认知的是 man 页的分节机制因为它直接对应你问的是哪一层。# 按关键字反查不知道命令名时先搜一遍 man -k copy | head # 同一个名字三个完全不同的东西 man 1 read # 用户命令 man 2 read # 系统调用讲的是内核暴露的接口、返回值、errno man 3 printf # 库函数讲的是 C 标准库的实现约定第 1 节是给用户在 shell 里敲的程序第 2 节是系统调用read、write、open真正的内核入口第 3 节是库函数第 5 节是文件格式man 5 passwd讲的是/etc/passwd的字段含义而不是命令第 8 节是管理命令。查不到手册页时先跑mandb重建索引而不是怀疑系统坏了。这个分节不是学究式的分类。当你在程序里调用read()返回 -1 并拿到EINTR你看的必须是第 2 节因为那里写着哪些 errno 可能出现、信号中断时该怎么重试看第 1 节的read命令手册永远找不到答案。搞不清分层就会在错误的层次上找 bug。注意/usr/share/doc下常常放着上游的 README、示例配置和变更日志遇到 man 页没覆盖的边界行为这里往往比搜索引擎更快给出权威答案。4.3 nano 的最小可用与 vi 的对立编辑器为什么分成两个流派nano 文本编辑器的定位非常清楚屏幕上直接打字底部两行常驻快捷键提示^O保存、^X退出^就是 Ctrl。它没有模式切换不需要先学会怎么进插入模式这对刚接触命令行的 Linux 基础用户是决定性的优势——改一个配置文件不该先花半小时学编辑器。vi 那一派走的是另一条路模式分离普通模式下每个键都是命令编辑模式下才是输入。学习曲线陡但熟练之后手指不用离开主键区就能完成移动、删除、替换效率高得多。两派的分歧本质是认知负担前置还是操作效率前置没有对错。用 nano 改系统配置文件时有一个参数值得养成习惯# -w 关闭自动折行。不加的话nano 会把超长行在屏幕上折行显示 # 某些情况下保存时可能引入真实换行把一行配置拆成两行服务直接起不来 sudo nano -w /etc/ssh/sshd_config改完之后先别急着重启服务用编辑器自带的检查或系统的语法校验跑一遍比出事之后再回滚省事得多。这也是新手最容易踩的一类坑不是不会用编辑器而是不知道编辑器会悄悄改掉文件里的字节。4.4 SELinux权限位之外的第二个判定点传统 Linux 权限是属主/属组/其他人三组九位外加chmod 777这个万能膏药。SELinux 引入的是强制访问控制每个进程有一个域domain每个文件有一个类型type内核在传统的权限检查之后再判一次这个域能不能访问这个类型。判定依据是安全上下文形如user:role:type:level。# 看文件的 SELinux 上下文-Z 是关键 ls -Z /var/www/html/index.html # -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 # 看当前模式Enforcing / Permissive / Disabled getenforce # 把文件挪到新位置后用 restorecon 恢复成该目录的默认标签 # 比手工 chcon 更稳因为 chcon 改的是临时标签relabel 时会被冲掉 sudo restorecon -Rv /var/www/html # 出问题时先看审计日志而不是直接关掉 SELinux sudo ausearch -m AVC -ts recent这段操作的逻辑链条是文件从别处mv过来内容没变、权限位没变但上下文还带着原目录的标签于是 Web 服务进程访问时被拒绝。此时chmod 777完全无效因为拦你的不是权限位。用restorecon让文件回到当前目录的默认标签才是顺着机制解决问题。直接setenforce 0把 SELinux 关掉等于把报警器拆了问题还在。5. 避坑容量、位宽、内存槽与 nano/SELinux 的五个翻车现场5.1 现象500GB 硬盘只剩 460GB原因是两套进位制在打架。硬盘厂商按十进制算500GB 就是 500×1000×1000×1000 字节操作系统按二进制算除以 1024 三次之后约等于 466GB。这不是缺斤短两而是硬盘的最小物理单位是扇区传统上 512 字节容量按扇区数折算自然走十进制更顺。解决办法只有一个看容量时先确认单位基准df -h与df -H的差别就在这里前者 1024 进制后者 1000 进制。5.2 现象20M 宽带下载只有 2.5MB/s原因是 bit 与 Byte 差 8 倍。网络传输按 bit 计20Mbps是每秒 2000 万 bit除以 8 是 2.5MByte/s上传 5Mbps 约 625KByte/s。这只是理论上限实际还要扣掉协议开销。排查时先做单位换算再怀疑运营商能省掉大量无效沟通。5.3 现象加了一根内存性能没涨反而略降原因是插槽插错两根内存落在同一通道带宽没翻倍或者两根规格不同控制器统一降到低频。先用dmidecode -t memory确认每根的实际频率与插槽位置再对照主板手册的通道编号调整。还有一种可能新加的内存让系统从单通道变成非对称的双通道flex mode一部分容量跑双通道、一部分跑单通道表现就是时快时慢。5.4 现象nano 改完配置文件服务启动报语法错误原因是超长行被自动折行后保存成了两行或者粘贴时带进了不可见字符。解决方式是编辑时加-w关闭折行粘贴后检查行尾改完先用服务自带的-t之类语法检查参数验证一遍确认无误再重启。养成改配置前先备份、改完先校验的顺序比事后翻日志快得多。5.5 现象SELinux 开着权限给了 777 还是 Permission denied原因是拒绝发生在强制访问控制层跟权限位无关。先用ausearch -m AVC -ts recent看被拒的域与类型再用restorecon修正上下文如果是布尔开关控制的策略比如是否允许 Web 服务连数据库用getsebool -a | grep找到对应项再开。把 SELinux 切成 Permissive 只能用来验证确实是它拦的不能当作解决方案。6. 分层与泄漏从晶体管讲到 man 页的取舍以及怎么验证自己真的懂了把一本 Linux 基础的书的开头写成计算器概论是个有争议的取舍。反对的理由很直接读者是来学命令的讲 CPU 架构纯属浪费时间。支持的理由藏在细节里——抽象会泄漏。你写的程序跑在虚拟地址空间里但物理内存不够时它会因为换页而变慢你以为文件权限决定了一切但 SELinux 会在后面再拦一次你以为df报的容量就是硬盘标的容量但两套进位制在某个小数点后面分了岔。每一次抽象泄漏都会把一个会用命令的人打回原形。所以知识的组织方式应该是分层的而不是按命令字母序排列。底下那层讲清楚数据怎么流、地址怎么算、频率怎么乘上面那层讲文件怎么组织、权限怎么判、文档怎么查中间用内核把硬件包装成什么做接缝。这种结构的代价是开头几章显得离题收益是后面遇到没见过的报错时你有地方可以推。验证自己是不是真懂了我一般用三个动作。第一拿算式对账看到DDR3-1600 双通道能当场算出 25.6GB/s并且知道这个数字里没有重复计算预取倍数。第二拿工具对账lscpu报的逻辑核数、dmidecode报的内存频率、free报的available这三个数字能不能互相解释得通。第三拿故障对账给一个改了权限还是被拒的场景能不能在三十秒内判断出该查 AVC 日志还是查属主。我自己有过一次很难看的翻车早年在服务器上改完配置用编辑器随手保存重启服务起不来翻了两个小时日志才注意到某一行被拆成了两行。从那以后我每次动系统配置文件都强制走一遍先备份、用-w编辑、保存后跑语法校验、确认无误再重启的流程一步都不跳。这套习惯没什么技术含量但它挡住的都是低级且昂贵的错误。《鸟哥的Linux私房菜-基础篇》第四版的价值正在于它愿意从晶体管和扇区讲起一路铺到 man 页的分节和 SELinux 的上下文中间不打滑。这份资源适合放在手边当参照系遇到说不清的现象回头翻对应那一层往往比搜十篇帖子更快定位。希望帮到你。本文还有配套的精品资源点击获取