这份笔记是我从零开始系统学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 安装配置中的几个关键决策点
安装过程中有几个选择决定了你后面的学习体验,我详细说一下:
磁盘分区。新手最容易跳过分区直接下一步,但我建议你手动分区。系统盘分出/boot1GB,swap给内存的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
权限三件套:读(r=4)、写(w=2)、执行(x=1),分别对应owner、group、other三个身份类别。设置时用chmod 755或chmod u=rwx,go=rx效果一样,但八进制写法更常用。记住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。格式是:
UUID=xxx /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_CONTROLLED=yes,有些老教程教你直接改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 can't find,说明你配置的DNS服务器本身有问题或不通。可以临时换一个公用DNS测试:nslookup www.baidu.com 223.5.5.5,如果换成新DNS后解析成功,说明原DNS配置有问题,修改/etc/resolv.conf指向可靠的DNS服务器即可。
第四步,如果nslookup显示解析出了IP但ping仍失败,不一定是DNS问题。检查故障范围是否真的在解析层:ping -c 3 解析出来的IP,IP能通域名不通,再查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你就能玩得比较顺手了。遇到报错时别慌,先定位问题的层次,再一层层排除,这是所有运维老手共同的入门之路。