
这个系列写到这里已经是第五篇。前面几篇把虚拟化平台怎么选、虚拟机怎么创建、操作系统怎么装、基础环境怎么初始化都过了一遍按理说到这一步很多朋友已经急着往里面装开发工具、跑业务服务了。但我每次都会先拦一下先花半个小时把系统配置做扎实后面能少踩无数坑。这篇所谓的“[虚拟机环境配置]05_系统配置”说白了就是把刚装好的“裸系统”打磨成一个适合长期使用、可远程管理、出问题能快速定位的“开发/测试专用虚拟机”。它解决的痛点是默认安装的系统网络配置是落地的、存储可能是单分区的、root账户直接暴露在外面、一堆用不上的服务占着内存和端口。这些问题前期不处理后期要么连不上、要么磁盘满了、要么被安全问题追着跑到时候再回头补课代价比现在大得多。这篇文章适合正在用KVM、VirtualBox这类方案搭建本地开发环境或测试集群的工程师也适合刚接触虚拟化的学生朋友。我会按真实操作的顺序把网络、存储、用户安全、服务调优、问题排查这几个板块挨个展开每个步骤都会说明为什么这么做、做完怎么验证。1. 系统配置到底在配置什么1.1 为什么系统安装完成后还要单独做一轮配置很多刚接触虚拟机的人有一个误解系统装完能开机、能用root登录不就完事了吗真不是。系统安装程序给你的只是一个“通用默认状态”它考虑的是兼容所有硬件、满足最小可用而不是针对你的具体场景做优化。默认状态下的虚拟机有几个常见毛病网络地址是动态分配的或者干脆没启动网卡重启一次IP就变SSH连接配置跟着失效。磁盘大概率是一个大分区系统盘和数据放一起后续扩容只能整个人重来。root账户密码虽然登录方便但一旦被爆破成功整台虚拟机等于裸奔。系统装完后台挂着大量用不上的服务占用内存和CPU还持续拉高功耗。内核参数全是保守默认值连接数、文件描述符上限一高就报错。所以“系统配置”并不是装一个软件那么简单它是一整套环境初始化动作把虚拟机从“能开机”变成“能可靠地干活”。我习惯把这一轮配置分成四个优先级网络虚拟机必须有一个稳定的、可预期的网络身份。存储分区规划要合理目录职责清晰扩容路径明确。账号与安全日常不用root远程登录走密钥防火墙只开必要端口。服务与内核降低资源浪费让系统在持续运行下更稳定。这个顺序是我自己实践摸索出来的先有路再有仓库然后装门锁最后才是整理房间。反过来做会不断返工。1.2 配置前需要准备哪些信息动手之前把信息核对清楚能避免一半以上的无效操作。我自己的习惯是先列一张配置清单类似于这样主机名规划这台虚拟机叫什么后续会不会加入某种管理集群。IP地址规划网段是什么哪一段IP是预留的静态地址网关和DNS分别是什么。磁盘规划系统盘多大、数据盘多大、数据盘挂载到哪个目录。用户规划日常使用的用户名、是否需要sudo权限、SSH密钥准备。服务规划这台虚拟机将来跑什么业务对应需要开放哪些端口。这些信息不一定都来自虚拟化平台很多时候是团队网络规划的一部分。宁可花五分钟问清楚也不要先随手填一个IP后续再整体返工。2. 网络配置让虚拟机从“孤立”到“互联”2.1 三种常见网络模式怎么选虚拟机网络模式直接决定了这台机器在局域网里的身份。不同的虚拟化平台叫法可能略有差异但本质上就三类模式工作方式典型场景优点缺点NAT虚拟机通过宿主机访问外部网络外部无法直接访问虚拟机只需要虚拟机上网、不需要外部主动连接的场景配置简单宿主机能上网虚拟机就能上网外部无法直接连入端口转发配置麻烦桥接虚拟机直接接入宿主机所在局域网拥有独立可被访问的IPWeb服务、数据库、需要被同事访问的测试环境虚拟机在网络中就是一台独立主机占用局域网IP与宿主机网络环境强耦合仅主机/隔离网络虚拟机之间、虚拟机与宿主机之间互通但隔离了外网多台虚拟机组成集群做内部联调安全网络可控默认访问不了外网需要额外配置代理或网关我个人的经验是如果只是自己练手跑一两个服务NAT加端口转发完全够用。但如果这台虚拟机要模拟真实服务器环境比如别的同事也要连上来部署代码那一定要用桥接模式给它一个局域网内可被路由的静态地址。还有一点容易忽略很多虚拟化平台默认创建的虚拟网络是随机的地址段比如KVM默认的NAT网络往往是192.168.122.0/24。这个网段如果和公司局域网段冲突看似网络配置没问题实际却各种诡异。所以确定虚拟网卡的网段也是必不可少的一步。2.2 配置静态IP、DNS与主机名无论底层虚拟化平台是什么操作系统层面的网络配置思路都是共通的。下面我以现代Linux发行版、基于NetworkManager的管理方式为例演示一套完整的配置过程。先查看当前网卡名称和连接状态ip addr show nmcli device status假设网卡名称是eth0我们要把它配置为静态IP192.168.1.50/24网关192.168.1.1DNS为223.5.5.5和1.1.1.1。用NetworkManager的命令行工具操作nmcli connection modify eth0 ipv4.method manual \ ipv4.addresses 192.168.1.50/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 223.5.5.5 1.1.1.1 nmcli connection up eth0这里有几个容易被忽略的细节ipv4.method manual必须有否则系统重启后DHCP会覆盖你的静态配置。DNS建议一次给两个一个主一个备避免单一DNS故障导致域名解析卡顿。修改完一定要up一下让配置生效然后核对。验证命令ip addr show eth0 ip route show ping -c 3 192.168.1.1 ping -c 3 baidu.com systemctl restart systemd-resolved网络通之后顺手把主机名也改了。主机名如果乱起后面做监控、做日志收集、甚至加入K8s集群都会遇到身份识别不清的问题hostnamectl set-hostname dev-node-05改完检查一下hostname有个小坑如果你通过SSH连接虚拟机操作改主机名不会断开SSH但某些基于主机名的认证比如Kerberos会受影响。所以在系统初始化阶段就把主机名定好比后期再改要省心得多。2.3 网络配置中的常见核对项网络配完不要急着做下一步先花一分钟检查这些地方/etc/hosts里是否残留了安装时的旧主机名映射如果有改成新主机名。确认没有同时启用多个网络管理服务。比如NetworkManager和systemd-networkd同时管同一张网卡会出现配置互相覆盖的故障。防火墙默认策略是否允许外部访问这台虚拟机。这一步通常放到安全加固部分一起做。3. 存储规划分区、LVM与自动挂载3.1 磁盘规划思路数据要和系统分开很多虚拟机在安装系统时直接采用“自动分区”也就是一块盘全部分给根分区。从纯粹的“能开机”角度看当然没问题但从可维护性角度这是个大坑。根分区一旦写满最直接的后果就是系统服务异常、写入日志失败甚至开机都进不去。如果是数据目录和系统盘混在一起你连“把数据目录迁移走”的操作空间都没有。我一般建议至少规划三块区域系统分区存放操作系统本身容量不用过于夸张30-50GB足够。数据分区存放业务数据、代码仓库、数据库文件按实际需求预估。交换分区或交换文件内存不够时的兜底KVM虚拟机建议配置但不建议依赖。在虚拟机层面新加的磁盘对操作系统来说就是一块裸盘接下来的工作就是分区、建文件系统、挂载目录。3.2 LVM逻辑卷扩容的后悔药分区方案里我强烈推荐用LVM它在虚拟机场景下的价值是别的东西替代不了的。LVM把磁盘抽象成三个层级物理卷、卷组、逻辑卷。你真正挂载使用的是逻辑卷而逻辑卷可以从卷组里临时划出空间相当于“硬盘空间可以从一个池子里动态调整”。创建单个逻辑卷的完整流程如下。假设虚拟机里有一块新加的磁盘/dev/vdb、容量200GB我们想把它做成一个数据分区挂载到/data# 1. 格式化物理卷 pvcreate /dev/vdb # 2. 创建卷组 vgcreate vg-data /dev/vdb # 3. 创建逻辑卷先给150GB留下50GB做扩容缓冲 lvcreate -L 150G -n lv_data vg-data # 4. 格式化文件系统数据量大的环境优先考虑xfs mkfs.xfs /dev/vg-data/lv_data # 5. 挂载 mkdir -p /data mount /dev/vg-data/lv_data /data注意第4步的文件系统选择我这里用xfs它适合大文件、高吞吐场景数据库日志、视频文件都很合适。如果你的场景是大量小文件频繁读写ext4反而更稳。格式化之前就要想清楚因为xfs不支持缩容。扩容时LVM的好处就体现出来了# 如果卷组还有剩余空间 lvextend -L 50G /dev/vg-data/lv_data # 如果文件系统是xfs根分区需要执行这一条 xfs_growfs /data如果是ext4则用resize2fs。这里最容易踩的坑是扩容逻辑卷后忘记扩容文件系统结果用df -h一看容量没变化。记住一条命令对应一个动作lvextend只扩LVM层文件系统必须单独再扩一次。3.3 开机自动挂载与目录建议临时挂载只对当前会话有效重启后会自动消失。要开机自动挂载就要把挂载信息写入/etc/fstab。先使用blkid拿到逻辑卷的UUIDblkid /dev/vg-data/lv_data然后在/etc/fstab里新增一行UUID上一步查到的值 /data xfs defaults,noatime 0 0这里两个参数说明一下noatime避免每次读取文件都更新访问时间减少不必要的磁盘写入对虚拟机磁盘寿命和性能都有好处。最后一列的0 2表示允许dump且在启动后检查文件系统如果填0 0则完全跳过检查。修改完fstab后建议执行mount -a这条命令会把fstab里所有没有挂载的分区都挂一遍如果配置有误它会直接报错。测试完顺手重启一次确认系统能正常起来再继续后续配置。3.4 目录职责划分的实战建议给数据分区规划目录时不要让它在根目录下飘着。我的习惯是代码仓库放在/data/code。数据库数据放在/data/db不要让数据库进程直接写根分区。备份文件放在/data/backup定期清理。如果你的虚拟机会承载多个项目还可以按项目再分二级目录。这里的核心逻辑是数据全部落在独立的LVM分区上将来无论是扩容、快照、迁移操作边界都非常清晰。4. 用户、SSH与安全加固4.1 创建普通用户并按需授权系统装完默认只有一个root账户。日常操作用root看起来省事实际是给自己埋雷。误删文件、改错配置、被爆破成功导致整机沦陷这些事故大半都是root裸奔带来的。我习惯第一步就创建日常使用的普通用户比如创建一个名为dev的账号useradd -m -s /bin/bash dev passwd dev给用户加sudo权限visudo在文件里追加dev ALL(ALL) NOPASSWD:ALL注意那条NOPASSWD:ALL如果后面做了自动化脚本用sudo免密会方便很多。但对纯手工操作的机器我建议去掉NOPASSWD改成要求输密码多一重确认也避免误操作。给用户加sudo权限时还有个习惯不要直接编辑/etc/sudoers用visudo。因为它内部会做语法校验一旦写错系统会提示而不是直接破坏sudo功能。我见过有人直接写文件写错了语法导致sudo完全失效的。4.2 SSH安全登录配置远程管理虚拟机绕不开SSH而SSH是暴力破解的重灾区。一台暴露在公网或局域网且开着密码登录、允许root登录的机器用不了多久就会被扫到。针对KVM这种内网虚拟机环境我推荐的安全基线如下。先生成密钥对ssh-keygen -t ed25519 -C dev user key然后把公钥复制到虚拟机只要你在宿主机的终端执行ssh-copy-id dev192.168.1.50接着编辑目标机器的/etc/ssh/sshd_config做以下修改PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes改完检查配置并重启服务sshd -t systemctl restart sshd这里有一个特别重要的提醒在确认密钥登录能通之前不要关闭密码认证。正确顺序是先生成密钥、把公钥拷过去、新开一个SSH会话用密钥登录确认成功再关密码认证。很多人先关密码再连结果密钥配置有误直接把自己锁在门外。如果确实需要密码登录的场景至少要禁用root直接登录。root账号只允许通过su或sudo从普通用户切换进去。4.3 防火墙与系统更新策略防火墙的配置思路很简单默认拒绝入站只放行明确需要的服务。以KVM环境常见的firewalld为例# 查看默认zone firewall-cmd --get-default-zone # 开放SSH端口注意这是保证你能连接的基础 firewall-cmd --permanent --add-servicessh # 如果有Web服务 firewall-cmd --permanent --add-servicehttp firewall-cmd --permanent --add-servicehttps # 如果有自定义端口比如8080 firewall-cmd --permanent --add-port8080/tcp # 重载配置 firewall-cmd --reload不推荐把整个端口段直接放行更不推荐关闭防火墙图省事。虚拟机虽然只在内部网络但内部扫描攻击一样存在端口全开等于把所有服务暴露在别人面前。系统更新策略方面我的做法是开发测试环境每周固定做一次全量更新生产类虚拟机则明确不做自动更新走排期窗口。原因不难理解虚拟机环境往往依赖特定内核版本或依赖包版本自动更新可能导致某个服务突然不兼容。手动控制的更新节奏反而更可靠。5. 系统服务、内核参数与时间同步5.1 关闭不需要的系统服务装完系统后后台会有一堆默认启用的服务。其中不少在虚拟机环境里根本用不到比如打印服务、蓝牙管理、自动挂载媒体等。它们不仅消耗内存偶尔还会占着CPU。查看所有正在监听的服务ss -lntp systemctl list-units --typeservice --staterunning针对明确用不上的服务用disable防止随开机启动systemctl disable --now 某个服务名对某些彻底不需要的甚至可以mask掉避免它被依赖它的服务间接拉起systemctl mask 某个服务名这一步的要点是克制不要为了显得“干净”看见什么服务都去停很多服务之间有依赖关系盲目停掉会导致系统组件异常。我自己的原则是不确定作用的服务先查文档确认无依赖再停。5.2 内核参数调优虚拟机默认的内核参数偏向“保守”。比如文件描述符上限默认的1024对于一个稍大一点的Java应用或Node服务来说完全不够用。调优可以直接写入/etc/sysctl.conf。常用的几个参数参考# 文件描述符全局上限 fs.file-max 655360 # 单个进程可打开的文件数上限 fs.nr_open 655360 # TCP连接复用时的整体连接数上限 net.core.somaxconn 32768 # 通用网络缓冲区默认大小 net.core.rmem_default 16384 net.core.wmem_default 16384修改后sysctl -p再查看是否生效sysctl fs.file-max这里想多说一句内核参数不是越大越好。somaxconn调大如果后端服务本身处理能力跟不上反而会堆积连接。这些数值只是给一个相对合理的起点具体还要结合你的业务负载逐步压测调整。5.3 时间同步与日志轮转虚拟机时间不同步是个很隐蔽又很致命的问题。最典型的场景是运行一段时间后容器里和物理机的时间差了好几分钟导致认证失败、日志时间线错位、定时任务执行混乱。现代Linux系统基本都是systemd环境直接开起时间同步timedatectl set-ntp true timedatectl status一般来说前一步开启NTP后时间会逐步对齐。如果网络中无法访问公共时间服务器就需要配置内网的时间源让虚拟机指向网络里的时钟服务器。这块属于基础设施规划动手前先确认环境里是否有可用的NTP源。日志方面默认的systemd-journald会持续累积日志时间长了同样把磁盘占满。限制一下日志大小# /etc/systemd/journald.conf SystemMaxUse200M改完重启日志服务systemctl restart systemd-journald如果是传统业务日志配置好logrotate轮转按天切分并保留一定份数这是运维里的老规矩了。6. 常见问题与排查技巧实录6.1 常见问题速查表问题现象可能原因排查与解决虚拟机开机后IP丢失网卡没有配置为静态或DHCP未续约用nmcli connection show确认连接配置重写静态IP后nmcli connection up宿主机能通外部机器ping不通虚拟机防火墙默认拒绝入站或桥接模式没生效firewall-cmd --list-all查看策略确认虚拟网络模式是桥接SSH连接特别慢DNS反向解析超时sshd_config里设置UseDNS no重启sshdSSH提示“Permission denied”公钥写入位置或权限不对确保公钥在~/.ssh/authorized_keys目录和文件权限分别为700和600df -h空间没变磁盘却提示满了LVM扩容后文件系统未扩xfs执行xfs_growfsext4执行resize2fs新建用户无法使用sudo未授权或visudo语法错误重新执行visudo检查授权行定时任务不执行或时间错乱虚拟机时间漂移确认timedatectl set-ntp true已开启端口已开但外部连不上防火墙只放行了服务名没放行对应端口用firewall-cmd --permanent --add-port显式放行具体端口执行某个大任务时系统卡顿交换分区过小用free -h检查内存与交换空间必要时增加swap文件6.2 最常见的网络故障排查过程从实际经验看虚拟机网络故障有一半以上不是IP配错了而是“底层网络模式没选对”。比如你在KVM里建了一台虚拟机默认虚拟网络是NAT虚拟机有IP也能上网但别的机器就是访问不到它。这时候无论如何改虚拟机内部的IP都没用该改的是虚拟机的网卡模式把它切到桥接让虚拟机直接挂到宿主机所在的局域网里。另一类高频故障是“改完配置重启就失效”。原因无外乎两种NetworkManager没有reload成功或者配置文件本身存在语法错误。排查思路是nmcli connection reload nmcli connection up eth0 journalctl -u NetworkManager -n 50看日志里有没有网卡相关的报错比一步步猜要快得多。6.3 SSH被锁在门外的自救办法SSH配置出错把自己锁在外面几乎是每个运维都会遇到的事。如果你手头还能操作宿主机处理方式其实很简单在宿主机上使用虚拟化平台提供的图形控制台或命令行控制台登录虚拟机然后把sshd_config改回来。如果是远程机房里的物理机无法接控制台就只能通过带外管理或者让机房同事帮忙。所以我反复强调在任何SSH配置修改前先确认自己有至少一条备用登录路径。对虚拟机来说这条备用路径就是宿主机上的虚拟控制台——永远保留这个入口。另外给个建议在动手改sshd_config之前把ssh配置的备份放一份到虚拟机里另一个位置比如/root/ssh_config.bak。出问题时恢复配置只需要一条命令不用凭记忆往回改。6.4 快照与回滚策略系统配置做完、验证通过之后第一件事就是给虚拟机打一个“干净基线”快照。这一步的价值在于后续你安装新软件、调整配置万一搞砸了可以直接回滚到刚完成配置的状态。KVM环境里可以用libvirt的快照功能也可以直接在宿主机上做磁盘快照。操作入口虽然不同但思路一致快照永远是你的后悔药。我自己的经验是配置完成后连打两个快照一个叫base-clean-01表示干净的原始状态另一个叫base-optimized-01表示完成调优后的状态。后面日常备份和部署都从这两个快照派生而不会拿一个处于未知状态的虚拟机反复折腾。最后再说几句写到这这一轮虚拟机系统配置的核心内容基本齐了。说实在的这套流程本身并没有太多“高精尖”的东西每一条都是Linux系统管理和运维的基础操作。但把这些基础动作组合在一起按正确顺序执行就能让一台刚装好的虚拟机变成一个稳定可靠的长期工作台。在我实际维护的机器里凡是坚持做完这轮配置的后面几个月几乎不操心底层问题凡是跳过系统配置直接装业务的十有八九过不了多久就得回来补救。如果时间紧张至少把这四件事做掉静态IP加SSH密钥、数据目录独立LVM、关闭root远程登录、打完干净基线快照。这四个动作能帮你挡住80%的日常麻烦。剩下的等用到了再回头细调也来得及。