
做运维这几年被问得最多的组合拳就是虚拟机里装好Linux之后怎么联网、怎么开SSH、怎么装gcc。这三个问题看起来各自独立实际上是一条完整的链路——虚拟机的网络选型决定了你能不能上网网络通不通决定了你能不能远程SSHSSH通了之后才能舒服地复制命令、折腾编译环境。这篇是运维系列的第一篇我把VMware下Linux的网络配置、SSH远程登录、gcc/g安装这三件事串起来讲用的都是日常干活验证过的做法也把新手最容易翻车的坑单独拎出来说。适合刚入行的运维新人、桌面运维同学也适合只是想在自己电脑上搭一套Linux练习环境的开发同事。先说一个基本态度这篇文章里的方案定位是仅供参考-推荐也就是说它能帮你最快把环境跑起来、把活儿干完但如果你在公司生产环境里操作一定要以你们团队的规范为准。尤其是网络参数、防火墙策略、系统版本这些每个公司都有自己的约定照抄我这边会出问题的。下面正式开始。1. 开工前的规划VMware版本、Linux发行版与虚拟硬件怎么选1.1 发行版选型Ubuntu还是CentOS还是麒麟V10很多人第一步就卡在选系统上。我的建议非常直接如果是自己学习、跑实验、写代码优先选Ubuntu的LTS版本比如22.04。原因不是Ubuntu比别的系统好而是它的软件源最全、社区资料最多、报错搜一下就能找到答案。对新手来说资料易得性比系统本身的性能重要得多。如果是跟着公司环境走那别自己拍脑袋。国内企业里CentOS 7的存量非常大虽然官方已经停止维护但很多业务还在上面跑运维还是要会这套命令体系。yum装包、systemctl管理服务、firewall-cmd配防火墙这些技能在CentOS上练熟了切换到RHEL系、以及国内常见的麒麟V10命令风格基本一致也用yum/dnf管理软件包都很顺。这里我给一个选型参考表你们可以直接对照使用场景推荐发行版包管理工具说明个人学习、开发环境Ubuntu 22.04 LTSapt资料多、报错容易搜到公司存量业务环境CentOS 7.9 / 麒麟V10yum/dnf生产环境用得多命令体系一致安全测试练习Kali Linuxapt预装大量安全工具不建议当日常系统极简服务器Debian / 麒麟V10服务器版apt内存占用低适合弱机器记住一个原则先搞清楚你要干什么再决定系统。只是体验LinuxUbuntu桌面版就够了以后想走运维路线建议从CentOS的命令行接口开始练逼自己习惯不用鼠标。1.2 别让虚拟化开关拦住你VT-x与常见蓝屏/黑屏VMware装好了镜像也下好了结果新建虚拟机一点开机直接蓝屏或者黑屏这是虚拟机安装linux蓝屏虚拟机ubuntu黑屏进不去桌面这些热搜词背后的共同原因。十次里有八次是同一个问题BIOS里的虚拟化开关没开。Intel的VT-x和AMD的AMD-V默认在部分机器上是关闭的尤其是品牌机的出厂设置。你需要在开机时进BIOS常见按键是F2、Del、F10具体看主板找到Intel Virtualization Technology或者SVM Mode这类选项改成Enabled。改完保存重启VMware里新建的64位Linux虚拟机才能正常引导。另外还有一个隐藏的坑Windows系统如果本身启用了Hyper-V或者WSL2会占用虚拟化层老版本的VMware Workstation会报VMware Workstation 与 Device/Credential Guard 不兼容这类错误。新版本15.5以后做了兼容处理一般能共存但性能会打折。真遇到这种提示要么升级VMware版本要么把Windows的Hyper-V功能关掉二选一别在中间反复折腾。1.3 虚拟硬件配置和安装镜像的准备虚拟机的硬件配置别贪高也别抠得太狠。我日常练手用的是2核CPU、4GB内存、40GB虚拟磁盘。这个配置跑Ubuntu桌面版够用跑不带图形界面的服务器版更是绰绰有余。如果你电脑本身内存只有8GB虚拟机给2GB内存就好否则宿主机和虚拟机一起卡。镜像下载这块提醒一句一定要去官网下载ISOvmware虚拟机安装教程里教的步骤都是标准操作但镜像来源不干净的话装完系统一堆问题都找不到原因。下完之后习惯性校验一下SHA256虽然麻烦但这是运维的肌肉记忆后面下载各种软件包都用得上。到这一步VMware Workstation 17或者免费的Player版本都行新建虚拟机的时候选择稍后安装操作系统手动挂载ISO系统类型选Linux、版本选Ubuntu 64位或者对应你的发行版。网络适配器这一项先不动默认的NAT模式就好下一节专门讲。2. 网络适配器三选一NAT、桥接、仅主机模式的真实使用场景2.1 三种模式的原理与生活化类比VMware装完会创建三个虚拟交换机VMnet0对应桥接模式、VMnet1对应仅主机模式、VMnet8对应NAT模式。很多教程把三种模式列个表就完了但真正用起来你得明白它们各自解决什么问题。用生活化的话说桥接模式等于你在这个局域网里新装了一部座机有自己的号码IP别人可以直接打给你NAT模式等于你借住在别人家里对外只有一个门牌号你能打出去电话访问外网但外面的人想直接找到你得通过主人转达端口转发仅主机模式就是你跟主人之间拉了根专线外面一概不通。这个类比背后对应着实际的网络行为。桥接模式下虚拟机的IP由公司或家里的路由器DHCP分配它在网络里是一台真机NAT模式下虚拟机的IP由VMware自己的DHCP服务分配默认网段通常是192.168.x.0/24通过宿主机的IP做地址转换上网仅主机模式则完全不提供外网访问能力。2.2 为什么我默认推荐NAT模式给个人练手环境配网络我几乎无脑选NAT。理由很简单不用求人。桥接模式需要你的物理网络允许新设备接入公司网络如果有MAC绑定、准入控制或者DHCP地址池紧张你桥接上去可能上不了网还得找网络管理员开权限。NAT模式完全绕开这些问题虚拟机只要在宿主机上就能通过VMnet8上网速度也不差。还有一个NAT的好处很多人没意识到虚拟机的IP不会因为你换了WiFi、换了办公地点而变化因为它依赖的是宿主机的VMware虚拟网卡而不是物理网络。对老爱抱着笔记本到处跑的运维来说这是真香。当然NAT不是万能的。如果业务场景需要局域网里其他机器直接访问你的虚拟机比如搭了个测试Web服务让同事体验NAT就不合适了这种情况下要用桥接让虚拟机拿一个和宿主机同网段的IP。另一个方案是用端口转发这个我放到SSH那一节细讲。2.3 切到桥接模式后容易踩的坑桥接模式的坑比大家想象的多。第一个坑是无线网卡环境下的桥接不稳定。笔记本连着WiFiVMware桥接走无线网卡时虚拟机的网络经常时通时断这是桥接驱动的固有问题不是你的配置错了。第二个坑是IP冲突。桥接模式下如果DHCP分配了和宿主机一样的IP或者地址池里已经有其他设备占了虚拟机会直接断网。第三个坑是切换模式后虚拟机里的IP不会自动刷新你必须重新获取或者手动指定不然会出现配置了桥接但还是没网的假象。所以我的建议是练手环境老老实实用NAT需要对外提供服务时再认真规划桥接。从NAT切到桥接之后记得在虚拟机里执行ip a看一眼网卡IP是不是已经变成了局域网网段没变就重启网络服务或者重启虚拟机。3. 让虚拟机稳定上网网卡配置文件与DNS排查一次说清3.1 Ubuntu的netplan配置从DHCP到静态IPUbuntu从18.04开始放弃了/etc/network/interfaces改用netplan管理网络。配置文件在/etc/netplan/下面文件名一般是00-installer-config.yaml。先看默认内容sudo cat /etc/netplan/00-installer-config.yaml默认情况下应该是这个样子的network: version: 2 ethernets: ens33: dhcp4: true这就够上网了NAT模式下VMware的DHCP会自动分配地址。但如果你要长期用SSH连这台机器DHCP的IP每次可能会变非常烦人。建议改成静态IP写死一个地址network: version: 2 ethernets: ens33: dhcp4: false addresses: - 192.168.88.101/24 routes: - to: default via: 192.168.88.2 nameservers: addresses: - 223.5.5.5 - 114.114.114.114这里有几个细节必须讲清楚。第一netplan新版里已经不建议用gateway4这个写法了改用routes老教程里那一套在新版本上会报错。第二网关地址要和NAT模式下的默认网关一致VMware NAT的网关通常是VMnet8网卡的IP也就是192.168.x.1或192.168.x.2具体可以在VMware的虚拟网络编辑器里看。第三DNS不能漏很多人静态IP配好之后发现能ping通IP但打不开域名就是nameservers没写。改完执行sudo netplan apply如果报语法错误netplan会提示你先sudo netplan try试一下这个命令会在超时后自动回滚比直接apply安全得多——这是我要特别推荐给新手的命令生产环境里改网络配置能用try就别用apply。3.2 CentOS的ifcfg配置ONBOOTyes是血泪教训CentOS的网络配置文件和Ubuntu完全是两套体系位置在/etc/sysconfig/network-scripts/下面网卡文件叫ifcfg-ens33名字取决于你的网卡用ip link查。默认NAT模式下这个文件长这样TYPEEthernet BOOTPROTOdhcp NAMEens33 DEVICEens33 ONBOOTyes新手最常见的错误就是把文件改成了静态IP但忘了把ONBOOT从no改成yes结果重启网络后网卡压根不启动连IP都没有。改静态IP的完整写法是BOOTPROTOstatic ONBOOTyes IPADDR192.168.88.101 NETMASK255.255.255.0 GATEWAY192.168.88.2 DNS1223.5.5.5 DNS2114.114.114.114保存后执行systemctl restart networkCentOS 7里还有一个特殊问题NetworkManager和network服务同时存在时配置容易乱。一般建议二选一要么用NetworkManager桌面版默认要么用network服务服务器版默认。你手动改ifcfg文件后如果发现没生效先systemctl status NetworkManager看一眼是不是被它接管了如果是要么在NetworkManager里改要么干脆禁用NetworkManager只留network服务。这里没有标准答案以你们环境稳定为准。3.3 上网故障的标准排查链路含DNS不管哪个发行版不能上网的排查思路是一样的我习惯按这个顺序来# 第一步看网卡有没有拿到IP ip a # 第二步ping网关判断链路通不通 ping -c 4 192.168.88.2 # 第三步ping公网IP判断路由和出口通不通 ping -c 4 223.5.5.5 # 第四步解析域名判断DNS通不通 nslookup example.com cat /etc/resolv.conf这里面的逻辑是逐层剥离先确认IP再确认网关再确认公网最后确认DNS。如果第一步就发现网卡没有IP问题在网卡配置或者DHCP服务第二步ping不同网关问题在虚拟网络编辑器里的子网配置第三步ping不同公网IP但网关通那多半是宿主机的NAT转发问题重启VMware的NAT服务试试第四步域名解析失败但公网IP能通那百分百是DNS的问题。补充一个高频求助外面的命令怎么复制到ubuntu虚拟机内部的dos窗口。这个是VMware Tools没装的问题装好open-vm-tools之后Windows和Linux之间复制粘贴、拖拽文件都顺畅了。具体安装命令在最后一节会给。下表把网卡层的关键排查项列一下现象可能原因优先检查项虚拟机没有IP网卡没启用 / DHCP故障ip a、ONBOOT、VMware DHCP服务能ping通IP不能打开网页DNS问题resolv.conf、nameservers静态IP配置不生效netplan语法 / NetworkManager接管netplan try、systemctl status NetworkManager换了网络环境后断网NAT模式下IP变化 / 桥接驱动问题VMware虚拟网络编辑器、重启网络4. SSH远程连接从安装到踩坑排查的完整链路4.1 装SSH服务端并开机自启网络通了接着就是SSH。注意Ubuntu桌面版默认是不装SSH服务端的所以ubuntu ssh无法连接这个热搜词背后的原因往往很简单服务端压根没装。Ubuntu下安装sudo apt update sudo apt install -y openssh-server sudo systemctl enable --now sshCentOS下安装sudo yum install -y openssh-server sudo systemctl enable --now sshd装完之后验证一下服务是否在监听ss -tlnp | grep :22只要看到有0.0.0.0:22这一行说明sshd已经在监听22端口了。systemctl enable --now这个写法我特别推荐一条命令同时完成开机自启和立即启动不用分两步。防火墙也要放行。Ubuntu用ufwsudo ufw allow 22/tcpCentOS用firewalldsudo firewall-cmd --add-servicessh --permanent sudo firewall-cmd --reload这一步漏掉的后果是服务端明明开着你也明白服务正常但从Windows这边连就是Connection refused或者超时。4.2 Windows侧工具选择与密钥登录Windows连SSH的工具非常多我按使用频率排个序Windows 10/11自带的终端ssh命令轻量不用装任何东西、FinalShell/MobaXterm带文件管理传文件方便、Xshell老牌个人免费、还有现在开发同学很喜欢的VSCode Remote SSH插件。具体选哪个看你习惯但基础技能是通用的。建议从自带命令练起在Windows终端里执行ssh 用户名虚拟机IP第一次连接会提示确认主机指纹输入yes回车然后输密码就行。这里提醒一句Linux的密码输入是不回显的屏幕上看不到任何字符变化不要以为键盘坏了。如果觉得每次输密码烦可以配置密钥登录。在Windows上执行ssh-keygen -t ed25519生成之后把公钥传过去ssh-copy-id 用户名虚拟机IPWindows没有ssh-copy-id的话手动把公钥追加到虚拟机的~/.ssh/authorized_keys里然后把文件权限调对chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys权限太宽松会被sshd拒绝这是密钥登录最常见的坑。4.3 连不上时的五步排查法附命令SSH连不上别慌也别急着重装系统。按这个顺序排查大部分问题五分钟内能定位第一步确认网络通不通。在Windows上ping虚拟机的IPping不通回到第三节的网络排查去看。第二步确认22端口通不通。Windows上执行telnet 192.168.88.101 22或者用PowerShellTest-NetConnection 192.168.88.101 -Port 22如果这一步报错说明虚拟机虽然网络通但22端口没监听或者被防火墙拦了。回到4.1检查sshd状态和防火墙。第三步确认sshd服务状态。在虚拟机里执行systemctl status ssh如果服务是挂的看日志找原因journalctl -u ssh -e tail -n 50 /var/log/auth.logauth.log里面会明确记录Connection refusedPermission denied这些原因比你自己瞎猜准多了。第四步检查防火墙。Ubuntu看一下sudo ufw statusCentOS看一下sudo firewall-cmd --list-all第五步检查VMware的网络服务。很多时候不是虚拟机的问题是宿主机的VMware NAT Service或者DHCP Service没有启动。Windows下按WinR输入services.msc找到VMware NAT Service和VMware DHCP Service确认状态是正在运行手动启动即可。最后说一个很容易被忽略的现实问题如果你把虚拟机的网络从NAT切换成了桥接IP会变Windows这边连接的时候还拿着旧IP自然连不上。每次改完网络配置先ip a确认新IP再去ping、再去ssh别跳步。4.4 NAT模式下让外部机器访问VM的端口转发上一节说过NAT模式下外部机器无法直接访问虚拟机。但运维场景里经常有这种需求局域网其他同事想访问你虚拟机里跑的服务又不想改桥接。解决办法是用VMware的端口转发功能。打开VMware的编辑菜单进入虚拟网络编辑器选中VMnet8NAT模式点击NAT设置在端口转发里添加一条规则字段值说明主机端口2222宿主机的端口随便选个不冲突的类型TCP默认虚拟机IP地址192.168.88.101你虚拟机的IP虚拟机端口22SSH服务端口配置好之后局域网里其他机器就可以用ssh 用户名宿主机IP -p 2222来连接你的虚拟机了。这招在演示环境、临时给同事开权限的时候特别好用不用动网络的架构就加一条转发规则。同理我配置主机端口2222而不是直接用主机端口22是为了避免和宿主机自己可能存在的SSH服务冲突这个习惯你们也可以保留。5. GCC/G安装与升级之后还是旧版本的真相5.1 两条命令装完编译环境先拿Hello World验证SSH通了之后最爽的事情就是可以在Windows终端里复制命令不用再手动敲了。接下来装编译环境。Ubuntu下安装gcc/g最容易的方式是装build-essential这个元包它会把gcc、g、make、libc-dev等一系列编译必备组件一起装上sudo apt update sudo apt install -y build-essential想看单独装了哪些apt list --installed | grep -E gcc|g\\|make|libc6-devCentOS下对应的是sudo yum install -y gcc gcc-c make验证版本gcc --version g --version make --version然后写个Hello World验证编译链路真的通vim hello.c内容是#include stdio.h int main() { printf(hello linux\n); return 0; }编译并运行gcc hello.c -o hello ./hello输出hello linux就说明环境没问题。这里顺便回应热搜词里gcc 日志输出到文件的疑问如果你编译时报错内容太多终端放不下可以把日志重定向到文件再慢慢看gcc hello.c -o hello build.log 21后面分析编译问题的时候这个用法非常常用特别是复杂项目编译失败一屏刷不完存到日志里用grep慢慢找。5.2 版本升级后还是旧版本PATH顺序、hash缓存与update-alternativesgcc升级后为啥还是旧版本是搜索热度非常高的一个问题我在这里展开讲因为大多数人都栽在同一个逻辑上。假设你用apt install gcc-12安装了一个新版gcc然后执行gcc --version发现显示的版本还是老的9/11。这时候第一反应不要怀疑安装失败先看which gccwhich gcc如果返回的是/usr/bin/gcc而新版gcc装在/usr/local/bin/gcc或者/usr/bin/gcc-12那问题就是PATH的搜索顺序。系统会按PATH变量的顺序查找命令先找到哪个就用哪个。你可以用type -a gcc看看所有匹配项和顺序type -a gcc第二个隐藏因素是shell的哈希缓存。bash为了提速会把查过的命令路径缓存起来。即使你改了PATH当前终端里执行gcc还是走缓存里的旧路径。这时候执行hash -r清除缓存再执行gcc --version就正常了。很多教程没提这一步导致很多人改完环境变量发现不生效其实就是hash在捣鬼。第三个情况是系统中确实存在多个gcc版本但并没有默认指向新版。这时候用update-alternatives来管理update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 120 update-alternatives --config gcc--config会让你选择一个默认版本选完再验证一次gcc --version。这套机制在Ubuntu上管理多版本工具链很顺手改起来也简单。相比之下CentOS上多版本管理一般用scl或者手动改软链接ln -sf操作上各有各的逻辑思路是一样的先确认命令实际指向哪里再决定改哪一层。5.3 编译环境里容易缺的几个组件装完gcc不代表所有编译场景都能跑起来。很多ubuntu安装gcc失败或者编译时各种稀奇古怪报错真正缺的不是gcc本身而是配套开发库。最典型的报错是/usr/bin/ld: cannot find crt1.o: No such file or directory看到cannot find字样多半是标准库开发包没装。Ubuntu需要sudo apt install -y libc6-devCentOS需要sudo yum install -y glibc-devel另外几个常见需求编译C项目要装g用make构建要装make用CMake的要装cmake编译内核模块需要内核头文件。Ubuntu下sudo apt install -y linux-headers-$(uname -r)CentOS下sudo yum install -y kernel-devel我建议新人装完基础编译环境后把下面这套命令留存下来当成检查清单# Ubuntu sudo apt install -y build-essential cmake git # CentOS sudo yum install -y gcc gcc-c make cmake gitgit可能不算编译环境但运维日常拉代码、看版本都用得上一次装齐省的后面再折腾。另外如果编译安装一些大型软件比如自己从源码编译新版gcc还依赖gmp、mpfr、mpc等数学库报错的时候顺着README里的依赖列表一个一个补就行。这里面的通用套路是报错信息里cannot find、No such file开头的基本都是在告诉你去装对应的-devel包。6. 装完收尾运维视角下值得养成的几个习惯6.1 装增强工具解决复制粘贴和分辨率环境装完第一件收尾的事是装VMware增强工具否则虚拟机分辨率低、复制粘贴失效、文件拖拽不能用体验会非常难受。Linux发行版一般建议装open-vm-tools而不是VMware自带的那个工具包# Ubuntu sudo apt install -y open-vm-tools # CentOS sudo yum install -y open-vm-tools装完重启虚拟机增强功能就生效了。这时候再回到命令行怎么复制粘贴的问题直接从Windows复制在Linux终端里CtrlShiftV粘贴就行。这个工具装上之后好多看起来是系统故障的体验问题都会消失值得第一个做。6.2 动配置前先备份、先快照接下来这个习惯是我做了多年运维之后总结出来最重要的一个改动任何配置文件之前先备份改动任何可能影响启动的服务之前先打快照。比如改网络配置先执行sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak改完如果连不上、起不来还能回滚。软件包升级同理apt upgrade这种操作在练手环境还好在接近生产的虚拟机里最好先做快照。VMware的快照功能就在右键菜单里点一下快照-拍摄快照一分钟的事情能救你一命。特别是你想试试这样配行不行的高危操作快照就是后悔药。6.3 五分钟巡检清单服务、日志、时间同步最后养成一个巡检习惯。环境搭好之后把这些命令过一遍确认系统处于健康状态# 服务状态 systemctl status ssh # 网络状态 ip a ping -c 2 223.5.5.5 # 磁盘和内存 df -h free -h # 日志里有没有异常 tail -n 50 /var/log/auth.log # 时间同步运维里时间不准会出一堆莫名其妙的问题 timedatectl set-ntp true timedatectl日志这一项我要多说一句。很多新手排错喜欢在终端里瞎试命令其实Linux的日志写得非常清楚SSH的登录失败、gcc编译报错、网络服务的异常基本都能在日志里找到线索。Ubuntu主要看/var/log/auth.log和/var/log/syslogCentOS看/var/log/messages和/var/log/secure。学会看日志比记住一百个命令更有用。还有一个很多人忽略的小习惯装完系统之后顺手把系统做一次apt update或者yum makecache把软件源索引刷新了。这样后面装任何包都不会卡在更新源这一步也不容易出现ubuntu安装gcc失败其实是源的问题这类尴尬。这篇文章里搭的这套虚拟机环境网络用NAT、SSH走静态IP、编译环境用build-essential是我个人反复验证过的最短路径。你在实际动手过程中如果遇到不一样的现象记住一个原则按网卡IP → 网关 → 公网 → DNS的顺序拆解网络问题按命令路径 → 服务状态 → 日志的顺序拆解服务问题。这套方法论会陪你走过很多坑。我自己刚入行时踩过的那些蓝屏、黑屏、连不上、版本不对的坑现在回头看都是成长最快的几步希望这篇文章能让你少走几步弯路。