简介:《鸟哥的Linux私房菜-基础篇》第四版是一份面向Linux初学者的入门电子书,适合具备基本计算机操作能力、希望系统掌握Linux概念与常用工具的读者,也适用于有一定经验的IT技术人员查漏补缺。内容从计算机组成与操作系统原理讲起,逐步延伸到man页与info页等文档查看方法、常见实用文档的位置与使用、nano文本编辑器操作,以及SELinux安全管理等知识点,并配有大量实际操作说明,帮助读者培养独立解决常见问题的能力。资源包内共1个PDF文件,大小约17.5MB,单文件结构便于在电脑或移动设备上直接阅读与检索。目前已有1232人学习下载,说明该版本在Linux入门群体中具有较高的参考价值。对于想打牢Linux基础、为后续深入研究类Unix系统做准备的读者,这份资料可作为系统学习的主线读物。
1. 从一本被翻烂的书说起:为什么第四版值得重新过一遍
很多人第一次接触 Linux 命令行,靠的不是视频课,而是一本被翻到书脊开裂的《鸟哥的Linux私房菜-基础篇》。第四版在保留原有体系的前提下,把 CentOS 7 之后的环境变化、systemd 的普及、磁盘分区与文件系统的调整都重新梳理了一遍。它解决的不是“怎么装一个系统”这种一次性问题,而是让你在遇到权限报错、磁盘满、服务起不来时,知道该翻哪一章、敲哪条命令去定位。适合谁?刚入行的运维、被派去管服务器的后端、以及想从“会敲几个命令”进阶到“能独立排查”的开发者。这一版最值钱的地方,是它把命令行背后的判断逻辑讲透了,而不是只给答案。
2. 把第四版当操作手册:环境准备与最小验证路径
2.1 为什么选 CentOS 系而不是 Ubuntu 来跟书
第四版的命令和目录结构默认围绕 RHEL/CentOS 体系展开,比如yum、firewalld、/etc/sysconfig/下的网络配置。如果你用 Ubuntu 跟练,会遇到apt和ufw的差异,虽然原理相通,但初学阶段频繁切换包管理器会打乱节奏。常见做法是装一个 CentOS 7 或 Rocky Linux 9 的虚拟机,分配 2 核 4G、40G 磁盘,网络选 NAT。这样书里的systemctl、rpm、fdisk示例都能原样复现。我一般会额外挂一块 10G 的空磁盘,专门用来练分区和 LVM,避免把系统盘搞崩后重装。
# 查看当前系统版本和内核,确认跟书环境一致 cat /etc/redhat-release uname -r # 查看磁盘布局,确认额外挂载的空盘设备名 lsblk -f # 关闭 SELinux 的强制模式(仅练习环境,生产慎用) setenforce 0 getenforce逻辑说明:/etc/redhat-release确认发行版大版本,uname -r看内核是否支持书里提到的特性。lsblk -f能同时看到设备名、文件系统类型和挂载点,比fdisk -l更直观。setenforce 0是临时关闭 SELinux,避免练习权限时被拦截,重启后失效。参数上,-f表示显示文件系统信息,不加只显示块设备树。
2.2 用快照把“后悔药”提前备好
跟书练分区、改fstab、调服务,翻车概率不低。最省时间的做法不是背命令,而是在虚拟机里打快照。每做完一章的练习,关机打一个快照,命名带上章节号。一旦fstab写错导致系统起不来,回滚只要几十秒。这个习惯比任何救援模式都管用。注意:快照占磁盘空间,练完确认没问题就删掉旧的,只保留最近两三个。
# 在宿主机上查看虚拟机快照列表(以某虚拟化平台命令为例) virsh snapshot-list practice-vm # 创建带章节标记的快照 virsh snapshot-create-as practice-vm ch05-fstab --description "第五章 fstab 练习前" # 回滚到指定快照 virsh snapshot-revert practice-vm ch05-fstab逻辑说明:snapshot-create-as的--description方便日后辨认,snapshot-revert会丢弃当前状态回到快照点。参数上,快照名建议用「章节-内容」格式,避免snap1、snap2这种过两周自己都看不懂的命名。如果你用的是桌面虚拟化软件,图形界面里找“快照”按钮,逻辑一样。
2.3 最小验证:三条命令确认你跟对了版本
书里有些命令在不同小版本间输出格式有差异,比如ip addr和ifconfig的字段。开始正式跟练前,先跑三条命令确认环境没跑偏。
# 确认 systemd 是 init 系统,书里服务管理章节依赖它 ps -p 1 -o comm= # 确认包管理器是 yum/dnf,而不是 apt which yum || which dnf # 确认默认 shell 是 bash,书里脚本示例基于 bash echo $SHELL逻辑说明:ps -p 1 -o comm=只输出 1 号进程的名字,systemd说明服务管理方式跟书一致。which yum || which dnf用或运算兼容新旧 CentOS。echo $SHELL确认登录 shell,如果是zsh或fish,书里部分变量展开和通配符行为会有细微差别,建议临时切回bash。参数上,-p指定进程号,-o指定输出列,comm=表示只输出命令名不带表头。
3. 权限、磁盘、服务:第四版里最容易卡住的三个实操点
3.1 权限数字背后的判断顺序
书里讲chmod和chown时给了不少例子,但新手最容易混的是“到底谁说了算”。实际判断顺序是:先看进程的有效 UID 是不是文件属主,是就按属主权限;不是再看是不是属组,是就按属组权限;都不是才按其他人权限。root 例外,它几乎能无视权限位,但 SELinux 和文件系统属性(如chattr +i)仍能拦住它。
# 创建一个测试文件和目录,观察默认权限 touch /tmp/perm_test mkdir /tmp/perm_dir ls -ld /tmp/perm_test /tmp/perm_dir # 修改属主和属组,再验证权限判断 chown user1:group1 /tmp/perm_test chmod 640 /tmp/perm_test ls -l /tmp/perm_test # 用另一个用户身份读取,观察是否被拒 sudo -u user2 cat /tmp/perm_test逻辑说明:ls -ld看目录本身而不是目录内容。chmod 640表示属主读写、属组只读、其他人无权限。sudo -u user2以 user2 身份执行,如果 user2 既不是 user1 也不在 group1,就会报 Permission denied。参数上,-u指定目标用户,cat只是用来触发读取动作,换成head也一样。
3.2 磁盘满时先看 inode 还是容量
书里提到df和du,但没展开一个经典坑:磁盘显示有空间,却写不进文件。这通常是 inode 耗尽,不是块耗尽。df -i看 inode 使用率,df -h看块使用率。如果df -i到 100%,而df -h还有余量,就是小文件太多把 inode 用完了。常见于缓存目录、邮件队列、日志切分过碎的场景。
# 同时查看块和 inode 使用情况 df -h df -i # 定位哪个目录 inode 消耗最多 find /var -xdev -type f | awk -F/ '{print "/"$2"/"$3}' | sort | uniq -c | sort -rn | head # 查看目录下文件数量,确认是否异常 ls -f /var/spool/postfix/maildrop | wc -l逻辑说明:df -i的-i表示显示 inode 信息。find /var -xdev的-xdev避免跨文件系统,awk取前两级目录做统计,sort | uniq -c | sort -rn按数量倒序。ls -f的-f表示不排序、不解析颜色,直接列目录项,比ls -l快很多,适合大目录计数。参数上,head默认前十行,够定位主要消耗者。
3.3 systemd 服务起不来时的排查顺序
第四版把服务管理从service和chkconfig迁到了systemctl。服务起不来,别急着重装,按顺序看:状态、日志、配置、依赖。
# 查看服务状态和最近日志 systemctl status nginx.service journalctl -u nginx.service -n 50 --no-pager # 检查配置文件语法(以 nginx 为例) nginx -t # 查看服务依赖和启动顺序 systemctl list-dependencies nginx.service逻辑说明:systemctl status给出 Active 状态和最近几行日志,journalctl -u按单元过滤,-n 50看最近 50 行,--no-pager避免进入分页器。nginx -t是应用自带的语法检查,不同服务命令不同,比如sshd -t、httpd -t。list-dependencies看它依赖谁、谁依赖它,端口被占或依赖服务没起都能从这里发现。参数上,-u后跟单元名,带不带.service都行。
4. 避坑与排查:跟书练时最容易翻车的五件事
4.1 改完 fstab 重启直接进救援模式
现象:编辑/etc/fstab后重启,系统卡在紧急模式,提示某个挂载点失败。原因:UUID 写错、挂载点目录不存在、文件系统类型不对,或者用了nofail却没加。解决:进救援模式后,mount -o remount,rw /重新挂根,注释掉刚加的那行,再reboot。预防:改完先mount -a测试,不报错再重启。
4.2 用 chmod -R 777 解决权限后服务反而更不安全
现象:网页访问报 403,有人直接chmod -R 777 /var/www,结果能访问了,但安全扫描告警。原因:777 让所有用户可写,Web 服务进程被入侵后可直接改文件。解决:属主给运行服务的用户,目录 755,文件 644,需要写的目录单独给 775 并设setgid。预防:先ls -l看属主,用chown -R user:group修正,再按最小权限给。
4.3 yum 装包报“无法解析主机”
现象:yum install卡住然后报错,提示无法解析镜像站域名。原因:DNS 没配、/etc/resolv.conf被覆盖、或者网络模式选错。解决:ping一个公网 IP 确认连通性,cat /etc/resolv.conf看有没有 nameserver,没有就加一个可用的。预防:虚拟机网络用 NAT 时,确认 DHCP 下发了 DNS;静态 IP 要手动写resolv.conf或改网卡配置里的 DNS1。
4.4 脚本里 cd 失败却继续往下跑
现象:一个备份脚本,cd /data/backup失败后,后面的rm -rf *在当前目录执行,删错了东西。原因:没判断cd的退出码,也没用set -e。解决:cd /data/backup || exit 1,或者在脚本开头加set -euo pipefail。预防:所有涉及删除、覆盖的命令前,先确认路径存在,用绝对路径,变量加引号。
4.5 用 kill -9 停服务导致数据损坏
现象:数据库服务卡住,直接kill -9后重启,数据文件损坏。原因:-9 不给进程清理和刷盘的机会。解决:先systemctl stop或kill -15,等几秒,确认进程还在再考虑 -9。预防:数据库类服务优先用自带管理命令,如mysqladmin shutdown、pg_ctl stop -m fast,让进程自己收尾。
5. 把书读薄:用 man 和 --help 建立自己的命令索引
跟完第四版,真正留在手里的不是那几百条命令,而是一套查命令的方法。我自己的习惯是:每学一个新命令,先man看 SYNOPSIS 和 OPTIONS,再用--help快速确认常用参数,最后在笔记里只记“这个命令解决什么问题、最常用的三个参数、一个翻车点”。比如find,我记的是按时间删日志、按大小找大文件、-exec结尾用\;还是+。这样下次遇到问题,先想“哪个命令能解决”,再去查参数,而不是背参数。
# 用 man 查看命令的概要、选项和示例 man find # 快速看常用参数,适合已经知道命令但忘了选项 find --help # 用 apropos 按关键词搜相关命令,适合不知道命令名时 apropos "disk usage"逻辑说明:man是完整手册,按q退出,/关键词搜索。--help输出比 man 短,适合快速扫一眼。apropos搜的是手册页的简短描述,disk usage能搜到df、du等。参数上,apropos等价于man -k,如果提示 nothing appropriate,先跑mandb更新索引。
再进一步,把常用排查动作写成函数或别名,减少重复输入。比如我习惯把“看端口、看进程、看日志”三件套做成一个函数,传服务名就输出三样信息。这样跟书练完之后,日常排查能直接复用,不用每次翻历史命令。
# 在 ~/.bashrc 里加一个排查函数 check_svc() { local svc="$1" echo "===== status =====" systemctl status "$svc" --no-pager echo "===== listen =====" ss -tlnp | grep "$svc" || echo "no listen port found" echo "===== recent log =====" journalctl -u "$svc" -n 20 --no-pager } # 重新加载配置后使用 source ~/.bashrc check_svc nginx逻辑说明:函数接收一个参数作为服务名,依次输出状态、监听端口、最近日志。ss -tlnp的-t看 TCP,-l看监听,-n不解析服务名,-p显示进程。grep "$svc"过滤出相关行,没有则提示。参数上,local限定变量作用域,避免污染全局。这个函数不依赖具体发行版,CentOS 和 Ubuntu 都能用,只是服务名不同。
最后说一个我自己的教训:早年跟书练,总想一次把一章全做完,结果权限、分区、服务混在一起,出了问题不知道是哪步导致的。后来改成每章只动一个变量,做完立刻验证,再打快照。慢就是快。希望帮到你。
本文还有配套的精品资源,点击获取