ESXi 8 快速安装 Ubuntu Linux 虚拟机前置配置

整理 ESXi 8 中使用 Ubuntu Cloud Image 创建 Linux 虚拟机的前置步骤,包括 cloud-init 用户配置、开启 SSH、基础系统初始化、Netplan 固定 IP 和释放 53 端口。

在 ESXi 8 上快速准备一台 Ubuntu Linux 虚拟机。目标是把系统先跑起来,并完成 SSH、时区语言、固定 IP 和 53 端口释放等基础配置。

后续如果要部署 DNS 服务,比如 mosdns,建议先确认本文这些前置步骤都已经完成。

准备 Ubuntu Cloud Image

Ubuntu Cloud Image 官方下载站:

https://cloud-images.ubuntu.com/

在 ESXi 中使用 Cloud Image 的好处是部署速度快,适合快速拉起一台轻量 Linux 虚拟机。但 Cloud Image 默认会依赖 cloud-init,因此创建虚拟机时建议提前准备好用户、密码或 SSH 公钥配置。

创建虚拟机并写入 cloud-init

在 ESXi 里创建虚拟机后,可以通过 guestinfo.userdata 写入 cloud-init 配置。原文示例里使用了 base64 方式:

guestinfo.userdata.encoding      base64
guestinfo.userdata

下面是对应的 cloud-init 明文示例。请把用户名、密码和 SSH 公钥改成你自己的值:

#cloud-config
users:
  - name: mac
    groups: sudo
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    plain_text_passwd: '12345'
    lock_passwd: false
    # ssh_authorized_keys:
    #   - ssh-ed25519 AAAA... your-key

如果要转换成 base64,可以在本机保存为 user-data.yaml 后执行:

base64 -w0 user-data.yaml

macOS 上的 base64 没有 -w0,可以用:

base64 < user-data.yaml | tr -d '\n'

生成结果再填入 ESXi 的 guestinfo.userdata

开启 SSH 登录

进入系统后先切换到 root 环境并设置 root 密码:

sudo -i
passwd

编辑 SSH 配置:

nano /etc/ssh/sshd_config

Cloud Image 环境中,如果登录时反复提示密码错误,可以检查下面这一行是否加载了额外配置:

Include /etc/ssh/sshd_config.d/*.conf

原文的处理方式是把它注释掉:

#Include /etc/ssh/sshd_config.d/*.conf

然后允许 root 密码登录:

PermitRootLogin yes
PasswordAuthentication yes

保存后重启 SSH:

systemctl restart ssh

更稳妥的做法是优先使用普通 sudo 用户和 SSH 公钥登录;只有在临时初始化或内网维护时,再开启 root 密码登录。

基础系统初始化

更新系统并安装常用工具:

apt update
apt install -y curl unzip lsof nano

设置时区为北京时间。这里的作用是把系统本地时间显示为 Asia/Shanghai,不是手动校准系统时钟:

timedatectl set-timezone Asia/Shanghai

确认时区:

timedatectl
date

在 Ubuntu 25.10 中,时间同步默认已经改用 chrony。如果要确认网络校时状态,可以继续检查:

systemctl status chrony
chronyc tracking

也就是说:timedatectl set-timezone Asia/Shanghai 负责设置北京时间显示,chrony 负责把系统时钟同步准确。

如果需要中文环境,可以启用中文 locale:

echo "zh_CN.UTF-8 UTF-8" >> /etc/locale.gen
dpkg-reconfigure locales

重启后再更新一次软件源:

reboot
apt update

修改固定 IP

Ubuntu 服务器通常使用 Netplan 配置网络。先进入配置目录:

cd /etc/netplan
ls

编辑其中的 YAML 配置文件,例如:

nano /etc/netplan/00-installer-config.yaml

不同镜像的文件名可能不同,以实际 ls /etc/netplan 输出为准。

云镜像示例

下面是原文里的云镜像示例。注意替换 IP、网关、DNS、MAC 地址和网卡名:

network:
  ethernets:
    ens192:
      addresses:
        - 192.168.16.8/24
      routes:
        - to: 0.0.0.0/0
          via: 192.168.16.5
      nameservers:
        addresses: [192.168.16.2]
      match:
        macaddress: 00:0c:29:34:70:3c
      set-name: eth0
  version: 2

应用配置:

netplan apply

IPv4 + IPv6 示例

如果需要同时配置 IPv4 和 IPv6,可以参考:

network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 10.20.20.9/24
        - fd88::9999/64
      match:
        macaddress: bc:24:11:61:c0:a4
      nameservers:
        addresses:
          - 223.5.5.5
          - 8.8.8.8
          - 1.1.1.1
          - fd88::6666
        search:
          - local
      routes:
        - to: default
          via: 10.20.20.1
        - to: default
          via: fd88::1111
      set-name: eth0

普通安装镜像示例

如果不是 cloud image,而是普通 Ubuntu 安装镜像,可以参考:

network:
  renderer: networkd
  ethernets:
    ens192:
      dhcp4: false
      dhcp6: false
      addresses:
        - 192.168.8.8/24
      routes:
        - to: default
          via: 192.168.8.1
      nameservers:
        addresses:
          - 192.168.8.1
        search: []
  version: 2

带 IPv6 的版本:

network:
  renderer: networkd
  ethernets:
    ens192:
      dhcp4: false
      dhcp6: false
      addresses:
        - 192.168.8.8/24
        - fd88::6666/64
      routes:
        - to: default
          via: 192.168.8.1
        - to: ::/0
          via: fd88::1
      nameservers:
        addresses:
          - 192.168.8.1
          - fd88::1
        search: []
  version: 2

Cloud-init 网络配置注意点

Ubuntu Cloud Image 可能会生成类似下面的提示:

# This file is generated from information provided by the datasource.
# Changes to it will not persist across an instance reboot.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}

意思是当前 Netplan 文件可能会被 cloud-init 重新生成。如果你想手动维护网络配置,可以创建:

nano /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

写入:

network: {config: disabled}

然后再维护 /etc/netplan/ 下的配置文件。

释放 53 端口

如果后续要在本机运行 DNS 服务,需要先确认 53 端口是否被 systemd-resolved 占用:

lsof -i:53

编辑配置:

nano /etc/systemd/resolved.conf

找到这一项:

#DNSStubListener=yes

改成:

DNSStubListener=no

重启 systemd-resolved

systemctl reload-or-restart systemd-resolved

再次检查:

lsof -i:53

如果 53 端口已经没有被 systemd-resolved 监听,后续 DNS 服务就可以直接绑定本机 :53

建议做快照

到这里,虚拟机已经完成基础初始化。建议在 ESXi 里先做一次快照,再继续安装后续服务。这样后面如果配置 DNS 服务或网络规则出错,可以很快回滚。