Linux基础学习路径:从常用命令到DNS配置与Docker部署
简介这份《Linux基础学习篇》是一份面向入门到进阶读者的系统化学习资料内容覆盖Linux发展历史、文件系统、进程管理、用户权限、网络管理与系统安全等核心模块全书共二十四章条理清晰、由浅入深适合初学者系统建立知识框架也适合日常查阅巩固。资源为单个PDF电子书共940页包体约21.98MB阅读与检索均较为方便。目前已有989人学习使用。书中不仅详细讲解EXT系列、XFS文件系统、TCP/IP常见协议、Shell环境与常用命令还包含一份按字母排序的指令与术语速查表便于读者快速定位cd、chmod、grep、kill等命令对应的章节说明整体上既可作为系统教程也能充当随查随用的工具书对希望夯实Linux基础的读者来说是一份扎实的参考材料。1. 940页的Linux基础学习真正该被拆解的是动手路径一本叫《Linux基础学习篇》的940页PDF躺在网盘里往往比被读完更有存在感。但Linux的基础很难靠“读”获得一条lsblk看到的磁盘、分区、挂载点比一整节图文更适合建立记忆。这类大部头资料的真正价值是提供索引。先确定问题属于内核、Shell、权限还是网络再回到对应章节查细节比从头翻书更高效。如果只是跟着书敲命令遇到Permission denied或DNS解析失败时仍然不知道从哪里入手。这份学习路径从分层认知开始依次经过虚拟机安装、常用命令、用户权限、解压乱码、DNS配置、Docker/KVM和提权加固最后交给你一份把资料变成私人手册的复习法。适合能摆弄cd和ls但遇到故障时不知道去哪一页的人。2. 从分层模型开始选发行版、装虚拟机、跑通终端2.1 发行版 / 内核 / Shell 三层的划分Linux基础能不能学扎实先看你能不能区分发行版、内核和Shell。这个分层没有建立起来时apt install和dnf install会用不同的报错把你打懵分层建立后报错本身会变成线索。当你执行cat /etc/os-release时cat来自GNU coreutils读写动作由内核完成发行版则负责把内核、基础库和各种命令行工具打包。所以第一步是给系统“验明正身”uname -r cat /etc/os-release echo $SHELL参数说明uname -r是内核版本排查驱动问题时第一件事就是看它cat /etc/os-release打印机器可读的发行版标识echo $SHELL告诉你当前登录Shell是bash、zsh还是其他。后面看任何《Linux常用命令大全》都要带回这三条输出里校验。选择发行版不只是挑图标。Debian系用aptRed Hat系用dnfArch系用pacman国产系统里很多基于openEuler的发行版沿用RPM封装所以教科书里的/etc/yum.repos.d/路径依然适用。学习阶段优先选你熟悉教程最多的那个关键是把包管理器记住。家族包管理器软件包格式常见发行版Debianapt.debDebian、UbuntuRed Hatdnf/yum.rpmRHEL、Fedora、openEuler、RockyArchpacman.pkg.tar.zstArch、Manjaro这张表用来做“系统类别”定位不必背发行版官网的细节。装了Debian系却去查dnf命令报错会很难受。2.2 用虚拟机装一台最小Linux练习机Windows或macOS上学习Linux虚拟机是最安全、最容易还原的场地。VirtualBox适合桌面体验KVM/QEMU适合接近生产性能如果只是想练命令虚拟机比裸机装双系统更值得推荐。虚拟机安装Linux过程中最容易出现的两个现象Windows蓝屏和KVM黑屏。前者通常是宿主机虚拟化开关没开或Hyper-V和第三方虚拟化工具冲突后者要通过egrep -c (vmx|svm) /proc/cpuinfo确认CPU虚拟化是否可用。egrep返回值大于0时表示支持虚拟化返回0时说明这是被禁掉的虚拟机或老CPU。egrep -c (vmx|svm) /proc/cpuinfo virsh list --allvirsh list是libvirt的命令行入口安装libvirt-daemon-system后就会存在。学习KVM时先用virsh list看有没有默认网络和正在运行的domain再决定下一步操作。装完系统后建议立刻跑一轮基础更新和工具安装sudo apt update sudo apt upgrade -y sudo apt install -y vim tmux htop net-tools tree lsblk ip addr showlsblk输出块设备和分区挂载点比如/dev/sda1挂载到/boot/dev/sda2挂载到/ip addr show替代老ifconfig主要看ens33这类接口是否拿到IP。如果apt update卡在软件源先检查网络和DNS后面第3节会专门处理DNS问题。提示虚拟机里安装系统时不要把ISO镜像放在虚拟磁盘所在分区否则后续做快照时可能造成空间占用异常。2.3 终端和Shell的基本功图形桌面上打开终端的快捷键通常是CtrlAltT服务器上则通过ssh进入。终端不是给图形界面当陪衬的它会加载一个Shell会话把.bashrc里的所有配置应用进来。我一般建议先设置历史记录和别名echo HISTCONTROLignoreboth:erasedups ~/.bashrc alias llls -l --colorauto alias grepgrep --colorauto source ~/.bashrcHISTCONTROLignoreboth:erasedups会忽略以空格开头的命令并去掉历史里的连续重复alias ll是输出彩色长格式source手动重新加载配置。做到这一步Shell才会变成你训练肌肉记忆的地方而不只是一个黑窗。3. 常用命令、用户权限与中文解压把基础操作做成可查表3.1 建立自己的命令查找表基础差的时候总想搜“Linux常用命令大全”其实先学会man -k那里面已经包含了大全。man -k copy files apropos dnsman -k和apropos等价它搜索所有手册页的名称和描述返回匹配命令。比如apropos dns会显示dig、host、resolvectl等再man进去看详情。另一个容易忽略的是man分章节man 2 read是系统调用man 1 read通常不存在进阶排查段错误时这个区分比多背20条命令重要。下面的信息命令表适合贴到桌面命令用途典型用法man 名称查看手册页man ssh_configtype 名称判断是Shell内建还是外部命令type cdcommand -v 名称输出命令路径或别名定义command -v python3which -a 名称查找PATH中的所有同名文件which -a dockerhistory查看历史命令history | grep docker!!展开上一条命令sudo !!type和command -v的差别在于type会额外说“alias”或“builtin”command -v更安静适合写脚本时判断依赖是否存在。遇到“command not found”先用command -v看PATH再用ls /usr/bin对比。3.2 用户和用户组与权限“Linux新建用户”是使用频率很高的操作但useradd和adduser有本质区别。adduser是会交互的Perl脚本自动创建家目录和邮件池useradd是低层命令只按参数干活。服务器自动化场景里我更习惯用useradduseradd -m -d /home/deploy -s /bin/bash deploy passwd deploy usermod -aG sudo deploy id deploy-m表示创建家目录-d指定家目录路径-s指定登录Shell。执行完id deploy能看到uid1001(deploy) gid1001(deploy) groups1001(deploy),27(sudo)说明这个用户既在自己组里也在sudo组。权限设计上先熟悉/etc/passwd的七个字段用户名、密码占位符、UID、GID、描述、家目录、Shell。例如deploy:x:1001:1001::/home/deploy:/bin/bash中x表示密码实际存储在/etc/shadow这个设计避免了普通用户读取密码哈希。修改权限时我常用这套组合groupadd app usermod -aG app deploy chown root:app /srv/app chmod 750 /srv/appchmod 750的含义是属主rwx属组r-x其他人无权限。数字分别对应读4、写2、执行1。chown root:app把属主设为root属组设为app这样用户组内的成员才能协作。如果目录里全是共享文件还需要考虑setgid位例如chmod 2770让新文件自动继承目录属组。3.3 解压文件乱码的根因与修正Linux下解压Windows传来的zip常见现象是文件名变成乱码。根因不是压缩文件坏而是zip记录文件名用了GBK编码解压工具默认按UTF-8解码。先用file看压缩包再带上编码参数解压file 中文名.zip unzip -O GBK 中文名.zip -d target/ 7z x 中文名.zip -mcpGBKunzip -O是修改文件名字符集-d指定输出目录7z则用-mcpGBK。这两个选项不是所有发行版的默认包都支持解压报“invalid option”时要安装p7zip-full或使用unar自动识别编码。如果已经把文件名解乱可以用convmv整体转码convmv -f GBK -t UTF-8 --notest -r target/--notest表示真正改名不加它只预览。目录里混有其他编码时先convmv -f GBK -t UTF-8 --notest会误伤建议先file抽样再执行。下表是常见压缩格式的处理方式格式常用命令编码处理zipunzip 文件.zipunzip -O GBKzip7z x 文件.zip7z x -mcpGBKtar.gztar xzf 文件.tar.gztar不涉及文件名编码乱码后用convmvtar.xztar xJf 文件.tar.xz同上rarunrar x 文件.rarrar5默认UTF-8旧包少见3.4 DNS配置问题排查“Linux中配置DNS出现的问题”排在热门前几位大多不是配置格式错而是系统里有多层管理工具。传统做法改/etc/resolv.conf但很多发行版用systemd-resolved接管它改动会被覆盖。先看它到底指向哪ls -l /etc/resolv.conf resolvectl status systemctl status systemd-resolved如果/etc/resolv.conf是指向/run/systemd/resolve/stub-resolv.conf的软链接说明systemd-resolved在管理DNS。临时测试可以手动修改后立即执行resolvectl flush-caches永久配置则推荐用nmcli因为NetworkManager会同步多处配置nmcli con show nmcli con mod Wired ipv4.dns 223.5.5.5 1.1.1.1 ipv4.ignore-auto-dns yes nmcli con up Wired第一行拿到连接名第二行把DNS设为两组地址ipv4.ignore-auto-dns yes意思是忽略DHCP下发的DNS第三行重连生效。验证时不要只ping因为ICMP可能被禁getent hosts www.example.com curl -I http://www.example.comgetent hosts会走系统解析库curl -I确认HTTP层能连通。如果多级失败再用tcpdump -i any port 53看查询是否发到预期DNS服务器。4. 从systemd到Docker/KVM让基础理论跑成服务4.1 用systemctl管理服务状态Linux服务器的服务生命周期由PID 1启动现代发行版上PID 1通常是systemd。它把服务封装成unit让你能用统一命令操作。最常用的不是service而是sudo systemctl enable --now nginx systemctl list-units --typeservice --staterunning journalctl -u nginx -fenable --now合成了“开机自启”和“立即启动”list-units用来确认哪些服务在跑journalctl -u nginx -f实时滚动日志。排除启动失败时先看systemctl status nginx再看journalctl -u nginx --no-pager。这些命令比翻940页资料里的“服务管理”一节更直接。4.2 Docker最小部署Docker不是Linux发行版的一部分但它完全依赖Linux内核的namespace和cgroup。安装本身不难关键是理解容器只是加了隔离的宿主进程。sudo apt install -y docker.io sudo systemctl enable --now docker sudo usermod -aG docker $USER docker run -d --name web -p 8080:80 nginx:alpine docker exec -it web sh docker logs webdocker.io是Debian/Ubuntu仓库里的包名usermod -aG docker让当前用户免sudo执行docker但改完组要重新登录。-d后台运行--name命名容器-p 8080:80做端口映射docker exec -it进入容器Shell。看到这里应该明白“Linux安装Docker”本身只有三条命令后面的手脚都在端口、存储和网络。4.3 KVM网络基础KVM的网络比Docker更容易把人绕晕因为牵扯到宿主机网桥、虚拟交换机、NAT和防火墙。默认安装后virbr0就是一个NAT桥虚拟机通过它上网宿主机外面的设备看不到虚拟机。如果虚拟机需要被别的机器直接访问需要改成桥接模式让虚拟网卡直接绑到物理网卡。排查KVM网络时先看虚拟网络状态virsh net-list --all virsh net-dumpxml default ip addr show virbr0virsh net-dumpxml default输出默认网络的XML里面定义了virbr0的IP段、DHCP范围和NAT规则。学习阶段不需要手写XML但要能读懂forward modenat/和bridge namevirbr0/这两行。它们的区别可以用表格概括模式虚拟网卡如何通信适用场景NAT共享宿主机IP出站通过iptables转发学习、隔离不强求桥接虚拟网卡直接使用物理网卡需要对外提供服务隔离只允许虚拟网卡之间通信安全演练、离线测试4.4 用cron和脚本固化常见检查基础学习到一定阶段你会发现很多命令重复出现。把这些重复写进脚本是这个阶段最有价值的练习。下面是一个简单的健康检查脚本#!/bin/bash set -euo pipefail load$(uptime | awk -Fload average: {print $2}) mem$(free -h | awk /^Mem:/{print $3/$2}) disk$(df -h / | awk NR2{print $5}) echo [$(date %F %T)] load:$load mem:$mem disk:$diskset -euo pipefail是常见安全开关-e遇错退出-u未定义变量报错pipefail让管道中任一命令失败都算失败。awk分别取出负载、内存和根分区使用率输出日志时能看到时间戳。放到/usr/local/bin/check.sh后加执行权限再用crontab定时chmod x /usr/local/bin/check.sh crontab -e */5 * * * * /usr/local/bin/check.sh /var/log/check.log 21cron的五个字段分别代表“分 时 日 月 周”*/5是每5分钟。写完可以crontab -l验证。这比开着top盯屏幕更接近生产习惯。注意cron守护进程默认不会加载用户Shell的环境变量脚本里涉及PATH时要在脚本开头写完整路径。5. 安全加固与把940页变成私人手册的复习法5.1 从SUID和提权路径看权限边界学习权限时只记chmod数字是不够的。提权漏洞经常利用SUID程序因为SUID会让普通用户以属主身份执行文件。先用下面命令找出系统里的SUID程序find / -xdev -perm -4000 -type f 2/dev/null-xdev限制不进入其他文件系统-perm -4000匹配设置了SUID位的文件。看到/usr/bin/passwd这类程序正常但如果多余出现可疑路径就要立刻检查。Linux防病毒并不只在Windows里起作用ClamAV可用于扫描常见恶意文件clamscan能做按目录扫描。对这种问题更该关注auditd它能记录谁在什么时候访问了哪些文件。内核动态加载也值得了解LKM可加载内核模块通过file_operations结构注册read/write回调透明加密和审计软件都会用到这个机制。学习方向应该是“如何用lsmod和/proc/modules审计已加载模块”而不是仿写rootkit。另外sysctl里的几个保护项建议打开sudo sysctl -w fs.protected_hardlinks1 fs.protected_symlinks1这和透明加密一样属于“让权限系统在底层不被轻易绕过”的措施。涉及磁盘敏感数据时LUKS/dm-crypt是更彻底的透明加密方案用cryptsetup luksFormat前必须确认已备份磁盘。5.2 把PDF章节改写成自己的故障映射表940页的PDF不是让你记住每一页而是把故障场景对应到相关章节。我建议维护一个Markdown表每次排查完一个麻烦就往里补一行故障现象一条验证命令回到资料的位置解压中文乱码unzip -O GBK压缩与编码章节DNS配置被覆盖ls -l /etc/resolv.conf网络服务章节服务启动失败journalctl -u 服务名systemd与守护进程章节端口被占用ss -lntp进程与Socket章节填表时不要写“第100页”而是写“目录关键词profile/bashrc”或“权限章节”。这样做的好处是下次遇到相似问题时你会先想起这条命令再回到对应章节补理论而不是从头翻书。5.3 每周末跑一遍自测命令流最后分享一个我周五收尾时会用的自测命令块它把用户、网络、服务、磁盘几个维度的状态一次性打出来echo user/group getent passwd | wc -l echo listening ss -lntp echo failed services systemctl --failed echo disk df -h /getent passwd | wc -l看用户数量ss -lntp看监听端口和对应进程systemctl --failed找启动失败的服务df -h看根分区剩余空间。我通常把这四行放进/usr/local/bin/weekly.sh遇到有疑问的输出就把命令和现象抄进故障映射表。下次再看到systemctl --failed里有陌生服务名时打开终端先ss -lntp看看端口是否在听如果端口在听但连不上再man 7 capabilities那一页会用权限边界给你新的排查线索。本文还有配套的精品资源点击获取