零基础学Linux运维:从虚拟机搭建到DNS排错的实战笔记
这份笔记是我从零开始系统学Linux运维时整理的内容对应课程的上半部分。我尽量按一个新手最容易上手、也最贴近真实运维工作的顺序来组织从虚拟机搭环境开始到文件命令、用户权限、磁盘管理最后是网络配置与DNS排错。你完全可以照着顺序操作一遍每一条命令我都实际敲过标注了踩坑点和适用范围。适合谁看刚入行想做运维、还在校准备运维岗、或者干桌面运维想转服务器运维的人。有Windows基础但没碰过Linux也完全能跟上我会在讲命令的同时解释它为什么这么用尽量不让你死记硬背。1. 先把Linux装进虚拟机环境搭建的正确姿势学Linux第一步不是急着敲命令而是把环境跑起来。我强烈建议新手用虚拟机而不是双系统或直接买服务器原因很简单虚拟机随时可以快照、随时可以重装折腾坏了不影响宿主机。没有这套容错机制你根本不敢大胆实验。1.1 虚拟化平台与镜像版本选型虚拟化平台主流就是VMware Workstation和VirtualBox。我给的建议是直接用VMware Workstation Pro内核级虚拟化性能更稳NAT网络模式在NAT模式下虚拟机能上网但外部访问不到它这个特性对实验环境非常合适。VirtualBox也能用但VMware在快照恢复、复制虚拟机、拖拽文件这几个日常操作上体验更好。镜像选择上如果你是自学首推CentOS 7系列。不是说它版本新相反它已经进入了维护周期的末期但市面上绝大多数教程、面试题、企业内部存量服务器都基于它。CentOS 7的systemd、firewalld、NetworkManager这套体系学明白换到其他发行版只是命令微调的问题。当然现在Rocky Linux、AlmaLinux是更“政治正确”的替代品但我个人建议新手初期完全不用纠结版本先用CentOS 7把路走通再考虑迁移。1.2 安装配置中的几个关键决策点安装过程中有几个选择决定了你后面的学习体验我详细说一下磁盘分区。新手最容易跳过分区直接下一步但我建议你手动分区。系统盘分出/boot1GBswap给内存的1.5到2倍剩余全给/。/home可以单独分也可以不分学习阶段没必要搞太复杂。关键在于学会看分区方案后面讲磁盘管理时你会更理解这样分的理由。软件包选择。一定选“最小化安装”或者只勾选“开发工具”。这是黑马课程一直强调的最小化系统能让你清楚知道每个软件是自己装上去的而不是安装器预装了一堆你不知道的东西。等用到再来yum安装这个过程本身就是学习。网络配置。安装时把主机名设置好网卡开启。这一点很多人忽略等系统装完发现没有IP还要回头去改配置文件制造不必要的挫败感。1.3 快照习惯从第一堂课就养成快照是虚拟机给你最大的学习红利。我刚学Linux时养成一个习惯每完成一个阶段的学习比如配置好静态IP、装好了Nginx、写好了第一个Shell脚本就打一个快照。这样后面操作出问题时恢复快照比自己排查快十倍。还有一个经常踩的坑复制虚拟机后网卡起不来。VMware复制虚拟机时会复制网卡MAC地址但你如果选择“复制”而非“克隆”新虚拟机的网卡配置里还带着旧MAC导致网卡无法启动。解决方法是删除/etc/udev/rules.d/70-persistent-net.rules后重启或者直接用克隆功能。这个坑在我学员群里出现了不下十次提前告诉你省得白折腾。2. 文件与目录操作运维每天睁开眼都在用的命令文件操作是整个Linux的基石这部分看似基础但很多干了两年运维的人ls、grep、find用得也很糙。我按实际工作频率把这些命令串起来讲。2.1 目录导航与文件查看的实用组合pwd、cd、ls这三个是起步命令但ls的参数组合值得好好记。我日常用得最多的三个是ls -l长格式列出文件详细信息包括权限、属主属组、大小、修改时间。注意带-d参数看目录本身而不是目录里面的内容。ls -a显示隐藏文件配置文件大多以点开头排查问题绕不开。ls -lh人类可读的大小显示大文件一眼看清是GB还是MB。文件查看也有讲究。cat适合看小文件但一个日志几百兆cat会直接刷屏卡死。这时候用tail -f实时跟踪日志更实用或者用less翻页查看按G跳到底部按gg跳到开头按/搜索关键词。这些操作都是排障时高频使用的熟能生巧。2.2 vi编辑器必须咬牙学会我知道很多人学Linux最抵触的就是vi。Vim编辑器学习曲线陡但它是绕不过去的原因很现实服务器上未必装了nano或其他编辑器而vi是任何Linux发行版都自带的大多数情况下也是运维唯一能用的文本编辑器文档修改、脚本编辑都依赖它。新手只要记住三个模式切换按i进入插入模式按Esc回到命令模式在命令模式下按:wq保存退出按:q!不保存强制退出。这三个操作覆盖了90%的场景。剩下的复制粘贴、查找替换等操作用到的时候再查。不要试图一遍把vi全部学会先会用再慢慢熟练这是我反复验证过的方法。2.3 find、grep、管道排查问题的铁三角find用于定位文件grep用于过滤内容管道符|把前后两个命令连接起来实现“前者的输出是后者的输入”。这三者组合起来就是一套完整的排障武器库。find最常用几个参数find / -name nginx.conf按文件名全盘查找适合找配置文件的准确位置。find /var/log -mtime 7查找修改时间超过7天的文件清理过期日志时很有用。find / -size 100M查找超过100MB的大文件排查磁盘空间耗尽时快速定位元凶。find /tmp -type d限定目录类型避免搜出一堆同名文件干扰判断。grep常用得更多grep error /var/log/messages在指定文件里搜包含error的行这是日志排障最常见操作。grep -v ^# /etc/selinux/config排除注释行看有效配置。除注释和空行后的有效配置是grep -vE ^#|^$这个技巧在检查配置时非常实用。grep -i忽略大小写搜索比如查warning时大小写不确定就用-i。组合拳示例查出现在日志里的IP看看哪些地址在刷请求grep Failed password /var/log/secure | awk {print $11} | sort | uniq -c | sort -rn。这条命令展示了强大的组合能力先用grep筛选出登录失败记录awk取第11列IP地址sort排序uniq -c统计次数最后倒序排列。这个管道组合我在处理安全事件时反复用到建议你拆开一条一条执行看每次的输出结果理解每一步在干什么。2.4 硬链接与软链接别再用“快捷方式”一笔带过很多课程把软链接简单说成快捷方式就完了但运维工作里链接的含义不止于此。软链接符号链接持有目标文件的路径目标删除它就失效硬链接持有目标文件的inode内容还存在就能访问。备份场景中硬链接的价值很大用ln命令对同一份文件建多个目录的硬链接不额外占用磁盘空间还能确保各目录随时能访问到数据。日常运维更常用的是软链接比如ln -s /usr/local/nginx-1.24 /usr/local/nginx这样升级Nginx时只改版本目录名路径引用不需要动。这个习惯能让版本升级变得非常简单新版本解压到新目录切换软链指向平滑切换版本回退也容易。3. 用户与权限管理从useradd到sudo的完整链路用户和权限直接关系到系统安全边界每次服务器被入侵基本都是权限分配不当造成的。这部分内容我分两块一是用户创建和管理的完整流程二是文件权限的设置逻辑。3.1 用户创建的完整流程与常见误区创建用户的命令是useradd但很多人只敲useradd zhangsan就结束了这样创建的用户没设密码、没指定shell很多环境根本进不去。我建议养成一套完整的创建习惯# 创建用户并指定home目录、shell、附加组、备注信息 useradd -m -d /home/zhangsan -s /bin/bash -G wheel -c 张三 zhangsan # 设置密码注意密码不回显是正常的 passwd zhangsan参数很快就能记住-m创建家目录-d指定家目录路径-s指定登录shell-G附加组-c备注。这里有个易错点useradd和adduser在CentOS里指向同一个命令但在Ubuntu里adduser是交互式脚本两者行为不同。我在CentOS上习惯了useradd到了Ubuntu上直接敲结果提示找不到原来是需要sudo apt install adduser或直接用useradd。关于用户文件还有个易踩坑点尽量用usermod修改用户信息不要手动编辑/etc/passwd。/etc/passwd的格式是用户名:x:UID:GID:备注:家目录:shell这里的x表示密码放在shadow文件里如果你手动改成别的字符可能导致认证失效。3.2 sudo权限配置的细节解析给用户sudo权限把用户加入wheel组即可usermod -aG wheel zhangsan但Linux系统默认的wheel组是否拥有sudo权限取决于sudoers文件的配置。用visudo命令编辑/etc/sudoers找到这一行并取消注释%wheel ALL(ALL) ALL这里我想强调一个很多人忽略的点必须用visudo编辑sudoers文件不要直接用vim改。visudo会在保存时做语法检查语法错误它会警告而不是让你直接保存能有效防止配置错误导致sudo无法使用。有一次我把%wheel这行前面的注释删掉但多敲了一个空格visudo立刻提示语法错误问我要不要强制保存我选择否并重新修改避免了锁死系统sudo权限的事故。另一个实用的sudo技巧是配置NOPASSWD。如果你有自动化脚本需要sudo执行每次都输密码脚本就卡住了。在sudoers里加一行%wheel ALL(ALL) NOPASSWD: ALL但要注意这会带来安全隐患不建议在生产环境对所有wheel组用户放开NOPASSWD。通常做法是只对特定用户、特定命令放开比如zhangsan ALL(ALL) NOPASSWD: /usr/bin/systemctl restart nginx这样张三可以用sudo免密重启nginx但其他命令还是要密码。这是最小权限原则的直接应用学会这套思路面试问“怎么给某个用户特定命令的sudo权限”你就能答得比别人有深度。3.3 文件权限的八进制与符号设置以及隐藏的ACL权限三件套读(r4)、写(w2)、执行(x1)分别对应owner、group、other三个身份类别。设置时用chmod 755或chmod urwx,gorx效果一样但八进制写法更常用。记住rwx对应421加起来就是权限码。目录的执行权限是个容易混淆的点对目录来说没有x权限你就没法cd进去只有r权限虽然能列出文件名但拿不到文件详细属性和内容。所以光给r不给x目录依然进不去权限设置时这两个经常一起给。处理更复杂的权限需求时必须认识setfacl和getfacl。场景是这样的有个目录属于root组你想让zhangsan能读写、让lisi只读但其他用户完全无权限传统chmod做不到这么细。ACL可以做到# 给zhangsan设置读写执行权限 setfacl -m u:zhangsan:rwx /data/share # 给lisi设置只读权限 setfacl -m u:lisi:r-x /data/share # 查看ACL设置 getfacl /data/share设了ACL的文件ls -l会显示一个号。这个细节很多运维不注意看到不知道什么意思其实就是在告诉你这文件有ACL扩展权限。ACL在企业里非常常用尤其是多部门共享目录的场景。4. 磁盘管理的实操细节分区、挂载与inode磁盘管理是运维事故高发区。我把最常遇到的问题拆开讲磁盘容量的查看与定位、分区与格式化、开机自动挂载的配置以及inode耗尽这个冷门但致命的问题。4.1 用df和du准确定位磁盘占用df -h查看文件系统整体使用情况du -sh查看指定目录大小。两个一看一查配合定位。排障现场经常出现“df显示磁盘满了但du加总却没有那么大”的矛盾。这种诡异情况一般是文件被进程占用但已经删除导致的。在Linux中文件被删除后只要还有进程持有它的文件描述符磁盘空间就不会立刻释放但你在目录里已经看不到这个文件。排查命令# 找出占用已删除文件的进程 lsof | grep deleted找到进程后重启或kill它磁盘空间就会释放。这个坑非常隐蔽我刚入行时遇到过一台服务器反复报警df一直显示/dev/sda1 100%但du看哪个目录都找不到大文件最后才发现是日志文件被logrotate切割后原来那个进程还在往旧文件描述符里写日志。日志被删除了但因为旧进程仍持有打开的文件句柄磁盘空间始终不释放属于教科书级的运维故障。4.2 分区、格式化、挂载的完整流程新增一块磁盘的完整流程是这样的# 1. 查看新磁盘的设备名 lsblk fdisk -l # 2. 对新磁盘分区 fdisk /dev/sdb # 3. 格式化分区为ext4文件系统 mkfs.ext4 /dev/sdb1 # 4. 创建挂载点并挂载 mkdir /data mount /dev/sdb1 /data # 5. 验证 df -hfdisk交互式分区对新手不太友好这里给个快速上手流程进入后按n新建分区选择p主分区分区号默认起始和结束扇区直接默认即可最后按w写入分区表。如果分区后发现看不到新分区用partprobe /dev/sdb刷新分区表不需要重启系统。4.3 /etc/fstab自动挂载的坑与修复手动mount的挂载在重启后就失效了要实现开机自动挂载必须写入/etc/fstab。格式是UUIDxxx /data ext4 defaults 0 2关键点挂载参数建议用UUID而不是设备名。为什么因为设备名如/dev/sdb1在系统重启后可能会变尤其有多块磁盘时插拔可能让sdb变成sdc挂载就失效了。用blkid查看分区的UUID把这个固定值写进fstab再也不会因为设备名漂移导致挂载失败。fstab写错会导致系统启动失败或进入emergency mode。如果真写错了在开机界面输入root密码进入维护模式用mount -o remount,rw /重新挂载根文件系统为可写然后编辑fstab把错误行删除或注释掉。这个操作你最好在虚拟机里演练一次万一生产环境真遇到心里有底。fstab还有一个易错点就是最后两位数字0和2的含义第5位是是否dump备份第6位是fsck检查顺序根分区为1其他为2。如果一个分区被重复挂载或新旧挂载点冲突也容易出问题这些都需要实战中积累。4.4 inode耗尽一个隐蔽的磁盘陷阱df -h显示磁盘还有几个GB但系统提示No space left on device十有八九是inode耗尽。inode是存储文件元数据的数据结构每个文件或目录占用一个inode格式化时就固定了不能动态扩容。你可能会很困惑inode怎么会耗尽原因大多是大量小文件塞满了比如邮件队列、缓存目录、没有轮转的临时文件。检查方法# 查看文件系统inode使用情况 df -i如果IUse%接近100%就要开始找小文件聚集地。定位后删除即可但要谨慎处理系统目录不要误删。预防手段是用crontab定期清理临时目录、为缓存目录设置定时清空策略。这个知识点考试不常考但生产环境一旦遇到就是大故障建议提前了解。5. 网络基础与DNS排错从NAT模式到域名解析失败网络是Linux运维中最容易含糊的部分虚拟机能上网但物理机访问不了、域名ping不通但IP能通、DNS配置文件正确却不生效我都遇到过。这一节把网络配置原理和排错思路完整讲清楚。5.1 虚拟机三种网络模式和工作机制VMware的三种网络模式对应三种不同的使用场景模式通信范围是否能访问外网外部能否访问虚拟机适用场景NAT宿主机虚拟机可以不能学习练手、需要上外网但不需要对外提供服务桥接局域网所有机器可以可以模拟真实服务器部署、集群通信仅主机宿主机虚拟机不能不能完全隔离测试NAT模式理解起来有个点虚拟机通过宿主机的IP访问外网本质是网络地址转换外网设备看到的请求来源是宿主机的IP所以外部无法主动访问虚拟机。这正好满足学习环境的需求对外封闭对上外网通畅。如果你后面要练习Nginx部署或模拟线上环境建议切到桥接模式让虚拟机在局域网里有自己的IP其他机器可以直接访问它部署的服务。5.2 用nmcli和配置文件完成静态IP配置CentOS 7默认网络管理工具是NetworkManager命令行工具是nmcli。快速配置静态IP的方法# 查看网卡名称 nmcli device status # 假设网卡名叫ens33用nmcli配置静态IP nmcli connection modify ens33 ipv4.method manual \ ipv4.addresses 192.168.1.100/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 114.114.114.114 # 启用配置修改后需要重新激活连接才会生效 nmcli connection up ens33配置不生效时检查配置文件/etc/sysconfig/network-scripts/ifcfg-ens33中是否有一行NM_CONTROLLEDyes有些老教程教你直接改ifcfg文件但如果网络服务被NetworkManager接管手改和nmcli可能有冲突。我的习惯是能用nmcli就用nmcli尽量避免直接改文件。因为nmcli会同步更新配置文件并通知NetworkManager直接改文件容易造成配置不一致的“疑难杂症”。5.3 DNS解析失败的完整排查链路下面这个排错过程是针对“域名解析不了”的经典链路我在工作中被问过很多次完整复现一下排查思路。第一个排查原则先分清是网络不通还是域名解析不了。最简单的方法ping一个IP地址能通ping域名不通问题基本锁定在DNS解析上。比如ping 114.114.114.114通ping www.baidu.com提示unknown host那就开始DNS排查。第二步查看/etc/resolv.conf里的DNS配置cat /etc/resolv.conf正常会有nameserver行如果这个文件为空或者配置的DNS地址不可达解析必然失败。注意CentOS 7中这个文件往往被NetworkManager接管你手动改了重启网络服务后被覆盖这是个典型坑。第三步用nslookup或dig命令做详细解析测试nslookup www.baidu.com # 或 dig www.baidu.com如果nslookup提示connection timed out或server cant find说明你配置的DNS服务器本身有问题或不通。可以临时换一个公用DNS测试nslookup www.baidu.com 223.5.5.5如果换成新DNS后解析成功说明原DNS配置有问题修改/etc/resolv.conf指向可靠的DNS服务器即可。第四步如果nslookup显示解析出了IP但ping仍失败不一定是DNS问题。检查故障范围是否真的在解析层ping -c 3 解析出来的IPIP能通域名不通再查nsswitch.conf看/etc/nsswitch.conf里hosts那行是否包含dns如果配置顺序异常比如没有了dns会导致系统根本不去查DNS。第五步在服务器上遇到的坑本地是否存在一个名叫“DNS缓存”的服务或本地Hosts条目干扰。先检查/etc/hosts里有没有写死域名对应错误IP的条目有时候为了让某个域名指向本机测试手动改过hosts事后忘了删除就会产生“为什么我的域名一直解析到错误IP”的怪异现象。把hosts里的那条记录注释掉再看效果。还有一个我在实际环境遇到的案例服务器上安装了dnsmasq作为DNS缓存导致/etc/resolv.conf指向了127.0.0.1但dnsmasq服务挂掉了所有域名解析全部失败。这提示你在排除DNS问题时要注意本机是否运行了DNS相关的本地服务netstat -tlnp | grep :53查看53端口有没有被本地进程监听如果有可能是本地DNS缓存服务如dnsmasq、systemd-resolved在工作。systemd-resolved也是一个大坑。新版本的CentOS、Ubuntu中systemd-resolved接管了DNS解析即使/etc/resolv.conf被指向了127.0.0.53但这个本地DNS转发服务本身配置了上游DNS。如果你手动改/etc/resolv.conf为外部DNS服务器很快会被systemd-resolved覆盖回127.0.0.53。正确思路是修改/etc/systemd/resolved.conf里的DNS配置然后重启systemd-resolved服务。这个问题在现在新装系统里特别常见我帮人排查“DNS配置改了不生效”时十有八九是systemd-resolved在搞鬼。务必记住一个排错原则不要一上来就怀疑DNS配置先用IP测试定位问题层次。网络分层排查的思路在现场很重要我见过太多同事一上来就把/etc/resolv.conf改了又改最后发现其实是出口防火墙丢了DNS流量。5.4 Linux服务自启动的正确管理方式服务管理这块顺手提一下虽然是下半部分重点但网络服务和系统服务自启经常要配合使用。查看服务自启动状态systemctl is-enabled firewalld systemctl list-unit-files | grep enabled关闭不需要的服务并禁止自启systemctl stop firewalld systemctl disable firewalld这里有个细节systemctl status显示服务有loaded、active、running几个状态新手容易混淆。loaded只代表配置文件被读取了active表示主进程在运行running通常表示服务正常运行。判断一个服务是否真的在提供服务要以active (running)为准。6. 学习路线建议与排错习惯的养成笔记的最后我想从整个学习过程的角度给你几条已经验证过的建议。6.1 别贪多先形成肌肉记忆Linux运维知识体系特别庞大命令成百上千但真正每天都用的其实就那几十个。我强烈建议你先把核心命令敲到形成肌肉记忆的程度文件操作类、权限类、进程类、磁盘类、网络类。每学一个命令不要只看不敲立刻在虚拟机上练习组合用法。等你敲到不需要思考就能打出ls -lh | grep error这样的管道命令再往下推进效率比一口气看完所有电路教程高得多。6.2 建立一个自己的排错清单我学Linux时有一个习惯每踩一个坑就把它记到自己的笔记里包含问题现象、排查思路、最终原因、解决办法。比如这里我提到的“df满了但du没有大文件”和“DNS配置被systemd-resolved覆盖”都是经历了完整排查过程才弄明白的。这些坑和排查经验不记录下来的话过了两三个月就只剩个模糊印象下次遇到又得从头来一遍。记录排错清单的好处在于它会逐渐形成你自己的排查套路以后遇到新问题第一反应是按照记过的链路去分析而不是乱试命令。6.3 把每个知识点拆成“是什么、怎么用、为什么这么用”我后面给新人答疑时反复强调学习Linux不要只背命令参数一定要问为什么。为什么/etc/fstab里要用UUID为什么解析失败时先ping IP再ping域名为什么配置sudo要用visudo而不是vim搞懂这些为什么你才能真正脱离“照着敲”的阶段具备独立排查的能力。这份笔记覆盖的内容偏基础和上半部分后面关于Shell脚本、计划任务、日志服务、软件包管理、服务部署等知识点还会继续整理。如果你照着这些内容把环境搭起来、把每个命令和排错思路实际操作一遍虚拟机里的Linux你就能玩得比较顺手了。遇到报错时别慌先定位问题的层次再一层层排除这是所有运维老手共同的入门之路。