ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu Server 22.04 最小化安装全流程与避坑指南

Ubuntu Server 22.04 最小化安装全流程与避坑指南 1. 先说清楚最小化到底省了什么我从一台 1G 内存的老机器说起手上那台 10 年前的旧笔记本1GB 内存、机械硬盘之前在它上面装过一次带桌面的发行版登录界面转圈转到我把咖啡喝完还没进系统。后来换成 Ubuntu Server 22.04 的最小化安装装完开机Memory: 118MiB usedsystemd-analyze显示启动时间不到 9 秒。从那次以后我给所有跑后端服务、跑容器、跑自动化脚本的机器一律走 Server 最小化这条路。这篇内容讲的就是Ubuntu Server 22.04 的最小化安装整条链路从镜像下载和校验、写盘工具的选择、BIOS/UEFI 的引导设置到安装向导里每一个页面的真实含义、分区方案怎么选、Name servers这个字段到底在写什么再到装完之后静态 IP、换源、sshd 加固、Docker 与 Ansible 的落地顺序。适合两类人看一类是第一次接触 Linux 服务器、需要一份能照着抄的完整流程另一类是装过好几次但总在某些环节翻车、想知道为什么而不是照着点下一步的人。先把一个容易被误解的概念掰开最小化安装不是安装器上的一个按钮而是三层动作的叠加。第一层是介质选择用live-server镜像而不是desktop镜像第二层是安装过程中的勾选决策不选任何 Featured Server Snaps只装基础系统加 OpenSSH第三层是装完之后的包清理把snapd、lxd这些你可能根本用不上的东西处理掉。很多人只做了第一层然后抱怨Server 版装完怎么还有 4GB 占用答案就在第二层和第三层。1.1 Server 镜像与 Desktop 镜像的取舍逻辑有人会问装 Server 版然后再手动装个桌面环境不行吗技术上可以但这是本末倒置。Desktop 镜像自带 GNOME、Snap 版浏览器、一堆桌面服务安装器本身也是图形化的整个流程依赖显卡驱动和显示服务。Server 镜像用的是subiquity安装器全程在文本控制台里跑对显卡零要求安装体积小、出错面窄。更实际的区别在资源占用上。Desktop 版空载内存占用通常在 800MB 到 1.2GB 之间Server 版最小化之后大概在 100MB 到 200MB。如果你是拿一台 2 核 2G 的云主机跑 Nginx 或者几个小容器这个差距直接决定了你能不能多开一个服务。另外 Server 版的默认内核参数、systemd目标都是朝长时间无人值守运行配的没有自动挂起的电源管理逻辑也没有桌面通知服务在后台轮询。不过 Server 版也有它不擅长的地方。如果你需要浏览器做交互调试、需要图形化的磁盘工具、或者你本人对命令行极不熟悉硬上 Server 版会消耗大量时间在查命令上。这种情况下更合理的做法是本地用 Desktop 版练手服务器上再上 Server 版两者命令是同一套。1.2 最小化的三层含义介质、勾选项、装机后的包安装向导里有一个页面叫Featured Server Snaps列着microk8s、nextcloud、docker、wekan这些带勾选框的条目。这个页面是很多人的第一个坑以为我不勾就是了但实际上勾选状态在不同 ISO 版本上行为不完全一致稳妥做法是全部取消勾选等系统装完之后再用官方文档的方式单独装。原因很直接。Snap 版本的软件包在服务器上有一系列特殊行为它自带独立的挂载命名空间和只读镜像升级时机由snapd自动调度不受你的apt节奏控制它的数据目录在/var/snap/下跟标准路径不一样很多运维脚本会因此找不到配置文件而且 Snap 首次启动会有解压和挂载动作在低配机器上能明显感觉到卡顿。我在一台 1G 内存的机器上勾过microk8s装完之后snapd频繁占用 CPU最后只能snap remove --purge重来。第三层的清理要谨慎。sudo snap remove --purge lxd之后再sudo apt purge snapd可以把snapd彻底干掉代价是以后装不了 Snap 包某些只提供 Snap 渠道的软件就得换其他方式。如果你打算在这台机器上跑容器更推荐用apt装 Docker 或者 Compose而不是靠 Snap。1.3 镜像从哪下、怎么校验才敢往生产机上装下载入口只说一件事去官方发布页找live-server-amd64这个文件名比如ubuntu-22.04.5-live-server-amd64.iso。22.04 是 LTS 版本代号 Jammy Jellyfish点版本号会不断更新.1、.2……每个点版本会带上累积的安全更新所以优先选最新的点版本装完要打的补丁更少。下载完必须校验这一步花不了两分钟但能省掉一整晚的排查。同一个页面上有一份SHA256SUMS文件里面是所有镜像的哈希值。Linux 下直接对sha256sum ubuntu-22.04.5-live-server-amd64.isoWindows 下用 PowerShell 的Get-FileHashGet-FileHash .\ubuntu-22.04.5-live-server-amd64.iso -Algorithm SHA256把输出和SHA256SUMS里对应行的哈希逐位对比。不一致就是下载过程中数据出了问题别抱侥幸心理去装重新下。我遇到过一次下载中断导致 ISO 尾部缺了几百 KB安装器能引导起来但在拷贝系统文件那一步反复报错查了半天才想到是镜像本身的问题。提示校验时注意看SHA256SUMS文件名后缀有些渠道会提供.gpg签名文件能进一步验证哈希清单本身没被篡改。生产环境里这一步值得做。还有一件事中文官网和英文发布页的镜像内容是同一个不用纠结在哪下。真正要留意的是下载页面上的 Server install image 和 Cloud image 的区别。Cloud image 是给云平台用的预装镜像默认通过cloud-init拉取配置没有交互式安装界面不适合手动装机场景。2. 写盘与引导这一步做错后面全白干装系统的失败案例里真正发生在安装向导里的问题其实不多大部分卡在U 盘写不对和引导模式选错这两件事上。这两个环节的坑特别隐蔽因为现象往往表现为安装器本身报一些看不懂的错比如找不到 ISO、找不到安装介质、casper相关的报错让你以为是镜像坏了。2.1 写盘工具的实测对比与那个最坑的陷阱U 盘写盘工具的选择直接影响能不能引导成功。选错了的后果不是不能用而是时灵时不灵这种问题最难查。工具平台优点需要注意的地方ddLinux/macOS原样写入最可靠设备名写错会直接抹掉硬盘数据务必用lsblk确认RufusWindows界面直观速度快必须选 DD 模式ISO 模式对 Server 镜像可能引导失败balenaEtcher跨平台操作简单有校验写入后校验耗时较长Ventoy跨平台一次写入多个镜像部分版本对 live-server 的介质探测不友好最坑的就是 Rufus。它默认会问你要用 ISO Image mode 还是 DD Image mode。对桌面版镜像ISO 模式通常没问题但 Server 版的subiquity安装器对介质的文件系统结构有额外要求用 ISO 模式写出来的 U 盘可能出现能进引导菜单但进安装器之后找不到安装介质的情况。直接选 DD 模式不要犹豫。用dd的话先确认设备名lsblk -d -o NAME,SIZE,MODEL看清楚你的 U 盘是/dev/sdb还是/dev/nvme0n1然后sudo dd ifubuntu-22.04.5-live-server-amd64.iso of/dev/sdb bs4M statusprogress oflagsync convfsync这里有两个细节值得说。bs4M比默认的 512 字节快得多但不要盲目设成bs64M以上某些 U 盘主控在超大块写入时反而会降速甚至出错。oflagsync加上convfsync是保证数据真正落盘再退出否则你看到命令返回就拔盘很可能只写了一半。写完执行sync再拔这个习惯能救你很多次。Ventoy 的问题单独说一下它把 ISO 当文件放在数据分区里引导时通过虚拟光盘挂载正常情况下完全可用。但 live-server 镜像在某些 U 盘主控加某些 BIOS 组合下会出现安装器阶段介质挂载失败。如果你用 Ventoy 装到一半报介质相关的错第一反应应该是换工具重写而不是怀疑镜像。2.2 UEFI 与 Legacy 的选型逻辑以及装完不进系统的根因引导模式只有两种UEFI 和 Legacy BIOSCSM。选哪个不看机器新旧看硬盘分区表的格式。UEFI 引导要求 GPT 分区表加一个 EFI 系统分区ESPLegacy 引导对应 MBR 分区表。两者混用就会出现安装过程一切正常重启之后直接进了 BIOS 或者黑屏——因为固件在按一种方式找引导记录而系统按另一种方式写进去的。判断当前是以什么方式启动了 U 盘最直接的办法是看固件设置里的引导项名称。名字里带UEFI:前缀的就是 UEFI 模式没有前缀的是 Legacy 模式。也可以在引导时观察UEFI 模式下的引导菜单通常是全屏图形化的Legacy 模式下字体更粗糙、分辨率更低。我的建议是能上 UEFI 就上 UEFI理由有三点。第一GPT 支持远超 2TB 的磁盘MBR 会在 2TB 处截断现在随便一块盘都能超过这个数。第二UEFI 的引导文件是可读的.efi文件出问题可以直接从其他系统挂载 EFI 分区修复Legacy 的 MBR 引导代码是二进制 blob修复只能靠grub-install重写。第三安全启动Secure Boot只支持 UEFI而 Ubuntu 的引导程序是经过签名的开着安全启动也能正常装。装完之后想确认自己到底装成了什么模式登进系统执行[ -d /sys/firmware/efi ] echo UEFI 模式 || echo Legacy BIOS 模式还有一种情况是双系统机器上已经有一个 Windows你想再装 Ubuntu。这时候千万不要在 BIOS 里来回切换引导模式否则 Windows 那边的引导项可能就进不去了。保持和 Windows 一致的引导模式安装让安装器自己去识别现有的 EFI 分区并复用这样才会生成一个统一的 GRUB 菜单。2.3 虚拟机里装 Server 版的三个特殊参数在 VMware Workstation、VirtualBox、Hyper-V 这类虚拟化平台里装坑点和物理机不一样。内存不要给到临界值。subiquity安装器本身跑起来大概要吃 1GB 以上内存官方给的推荐是 1.5GB 起。你如果按最小化的思路给它 512MB安装过程会在解压和拷贝阶段随机卡死或者报一些莫名其妙的 OOM 相关错误。装的时候给 2GB装完再调回 1GB这个策略最省事。磁盘别用动态扩展的默认配置长期运行。VMware 的立即分配磁盘空间和 VirtualBox 的固定大小磁盘在写入性能上差别很大尤其是跑数据库类服务时。安装阶段用动态扩展没问题但生产用的话建议预先分配好。Hyper-V 有两个必须关的开关。第一个是动态内存开着它在安装过程中会因为内存回收导致安装器卡顿甚至失败装的时候改成静态内存。第二个是安全启动模板Generation 2 的虚拟机默认启用安全启动模板选 Microsoft UEFI 证书颁发机构 或者直接选 Ubuntu 模板不要选成其他系统的模板否则引导会直接失败。还有个体验问题虚拟机的窗口分辨率如果不够安装器的文本界面会被截断你看不到底部的按钮。VMware 里可以在虚拟机设置里把加速 3D 图形关掉然后把窗口尺寸调到 1280x800 以上VirtualBox 里则是执行VBoxManage setextradata vmname GUI/MaxGuestResolution any之后在视图菜单里切换分辨率。这个不是 bug是安装器在低分辨率下只能用简化布局。3. 走进安装向导每一步提示背后的真实动作引导进 U 盘之后GRUB 菜单里会出现几个条目。常见的是Try or Install Ubuntu Server部分版本直接写Install Ubuntu Server在较新的点版本 ISO 上还会多一个带 HWE 内核的选项。HWE 就是 Hardware Enablement换用更新的内核以支持较新的硬件。如果你用的是 12 代以后的 CPU、比较新的网卡或者 PCIe 设备选 HWE 那个选项能少很多麻烦老硬件随便选。3.1 语言键盘、网卡 DHCP 与 Name servers 字段的真正含义安装向导的前几页是语言、键盘布局、安装类型。语言选中文或者英文都行实际影响的是安装过程界面和默认 locale。我一般选英文理由是报错信息搜索起来命中率更高而且大部分服务器软件的日志都是英文的混着看容易乱。然后是网络页面这一步是整个安装过程里最值得停下来想一想的。安装器会自动扫描网卡如果有 DHCP 服务器它会直接拿到一个地址并显示出来。这里出现的信息结构大概是Interface比如ens33或者enp3s0这是网卡的设备名Address安装器获取到的 IP如果是 DHCP 拿到的后面标注 DHCPName serversDNS 服务器地址通常显示为127.0.0.53或者你网络里 DHCP 下发的地址Name servers这个字段被问到的频率特别高。它不是什么特殊的东西就是DNS 解析服务器地址等价于你在桌面系统里手动填的首选 DNS 服务器。安装器把它写进netplan配置的nameservers.addresses字段里。看到127.0.0.53不用慌那是systemd-resolved本地的存根监听地址。Ubuntu Server 默认启用了systemd-resolved真实的上游 DNS 由它管理你可以用resolvectl status查看当前用的是什么上游。这一步要不要手动改分两种情况。如果你能用 DHCP 拿到地址并且这个地址稳定比如路由器上按 MAC 做了绑定那就不用改按默认走。如果你需要固定 IP、或者要指定公司内网的 DNS那就在这一页直接编辑。我个人偏好在安装时就把静态 IP 和 DNS 配好因为它会直接写进安装后的netplan配置里省掉后面手写 YAML 的环节也避免手写出错。在这里填写时需要注意IP 地址要写成 CIDR 格式比如192.168.10.20/24网关是单独一个字段DNS 可以填多个用逗号分隔。填完之后一定要留意下一步的确认页面安装器会把你填的所有内容列出来让你复核这是最后一次改错的机会。3.2 代理与镜像源填写什么时候必须填紧接着是代理配置页。如果你的网络环境需要通过 HTTP 代理才能访问外部地址就在这里填否则留空直接下一步。这一步很多人不知道它的作用范围它影响的不只是安装过程安装器还会把这个代理地址写进目标系统的apt配置里。如果你只是装机时临时用一个代理装完要去/etc/apt/apt.conf.d/下检查一遍把残留的代理配置删掉否则后续apt update会一直连不上。然后是镜像地址Mirror配置。安装器默认会尝试连主站的archive.ubuntu.com和地区镜像。在国内的网络环境下直连官方源下载基础包的速度可能很慢安装过程会卡在Fetching阶段很久。这时候可以直接把地址换成国内的镜像站比如阿里云镜像站、清华 TUNA 镜像站、中科大镜像站路径结构都是https://mirrors.xxx.com/ubuntu。安装器会自动在这个地址后面补全dists/jammy/...的路径你只需要把域名部分换掉。换源之后有个细节安装器会去请求镜像站的Release文件做校验如果镜像站刚好在同步sync过程中可能会报校验失败。这种情况等十几分钟再重试就行不是配置错了。3.3 分区方案的三种选法整盘、LVM、自定义存储配置页是安装过程中唯一一个选错了要重装的地方值得花时间。安装器提供三种主要路径。第一种是Use an entire disk用整块盘最简单的做法。它内部其实还会问你两个可选项要不要用 LVM要不要加密。第二种是带 ZFS 的整盘方案Use an entire disk with ZFS适合熟悉 ZFS 快照和压缩的场景。第三种是Custom storage layout手动划每个分区。先看整盘 LVM 的默认布局会造成什么。典型结果是分区大小挂载点说明分区 11MB 或 512MB无 //boot/efiLegacy 下是 bios_grub 保留区UEFI 下是 EFI 系统分区分区 2约 2GB/bootext4独立出来是为了 LVM 和加密场景下 GRUB 能读到内核分区 3剩余空间无作为 LVM 物理卷上面建卷组和逻辑卷逻辑卷剩余空间减 swap/根文件系统LVM 的好处是以后可以给根分区扩容。虚拟机场景下这个价值特别大磁盘空间不够了你在虚拟化平台上把虚拟磁盘调大然后在系统里growpart加pvresize加lvextend加resize2fs四步就能在线扩容不用停机。代价是多了一层抽象排查磁盘问题时要多看一层。加密选项LUKS在服务器上要看场景。物理机放在自己机房加密能防硬盘被拔走导致数据泄露云主机上用不上因为虚拟磁盘本来就是平台加密的再叠一层只会让你每次重启都要到控制台输密码而云主机的控制台很多时候是受限的。虚拟机里也建议不开除非你有明确的合规要求。自定义分区适合两类人一类是对磁盘布局有强要求的老手比如要把/var、/var/log、/home拆开防止日志写满根分区另一类是只有一块小磁盘、需要精打细算的。如果要手写一个在 100GB 磁盘上比较合理的方案是EFI 512MB、/boot2GB、LVM 卷组占剩余空间卷组里/给 60GB、swap 给 8GB、剩下的留给以后可能加的/var或者扩容用。提示如果机器内存特别大比如 64GB 以上swap 不要按内存的 1.5 倍这种老经验来配。现代系统主要用 swap 做休眠和应对内存峰值8GB 到 16GB 通常够用。反过来如果内存只有 1GB 到 2GBswap 给到 4GB 是有意义的能避免 OOM Killer 在内存尖峰时杀进程。3.4 用户、OpenSSH 与 Featured Server Snaps 的勾选决策分区之后是用户创建页。这里要填的字段包括你的名字、服务器主机名、用户名、密码。有几个经验点主机名不要用中文不要用下划线只用小写字母、数字和短横线。主机名会被写进/etc/hostname和/etc/hosts有些服务尤其是 Kerberos、部分集群软件对下划线主机名会直接报错。命名建议带点规律比如web-01、db-01、node-01以后机器多了你会感谢自己。用户名不要用admin、root、test这种。SSH 对外暴露的机器上弱用户名会被自动化脚本优先爆破。用一个不那么常见的名字配合后面的密钥登录能挡掉大量噪音。密码设置页会告诉你弱密码别硬扛。如果你打算装完立刻配置 SSH 密钥登录并关闭密码登录安装时随便设一个强一点的也行但如果这台机器会长期开着密码登录这里的密码强度就是你的第一道防线。接下来是 SSH 页面会问你要不要安装 OpenSSH server。只要这台机器以后要远程连就勾上。还有一个选项是从 GitHub 或者 Launchpad 导入 SSH 公钥如果你已经在那上面放了自己的公钥可以直接导入装完就能用密钥登录。这个功能在批量装机场景下特别省事。最后是 Featured Server Snaps 页面。前面说过全部不勾。装完系统之后你想装什么再装什么用apt装的东西路径标准、升级可控、配置可预期。装完之后安装器会有一个确认页面把语言、键盘、网络、存储、用户、SSH 等全部列出来。这一页必须逐项看尤其是存储部分它会明确告诉你将要格式化哪些盘、创建哪些分区。看到不认识的盘出现在格式化列表里立刻返回检查这一步是最后的止损点。确认之后会显示安装进度同时有一个查看完整日志的选项卡住的时候切过去看日志比干等有用。4. 首次登录后的半小时收尾静态 IP、换源与 sshd 加固系统装完第一次登录进去看到欢迎信息很多人就以为完事了。实际上真正让这台机器能用、好用、安全的工作都在接下来的半小时里。4.1 用 Netplan 把动态 IP 改成静态 IP含语法避坑Ubuntu 22.04 Server 的网络配置由Netplan管理配置文件在/etc/netplan/下安装器生成的文件通常是00-installer-config.yaml。默认后端是systemd-networkd桌面版会用 NetworkManager这个区别很重要因为网上很多教程给的是 NetworkManager 的写法直接抄过来会失效。先确认网卡名ip -br link输出里除了lo之外的条目就是你的网卡比如enp3s0、ens33、eth0。然后编辑配置文件sudo vim /etc/netplan/00-installer-config.yaml一个完整的静态 IP 配置长这样network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: false addresses: - 192.168.10.20/24 routes: - to: default via: 192.168.10.1 nameservers: addresses: - 223.5.5.5 - 119.29.29.29几个必须注意的点。第一YAML 的缩进只能用空格不能用 Tab缩进错一级就直接解析失败。第二如果你在旧教程里看到gateway4: 192.168.10.1这种写法在 22.04 上会收到已废弃的警告改用上面routes加to: default的写法。第三addresses一定要带 CIDR 后缀/24漏掉前缀长度会导致子网掩码不对看起来配好了但同网段都通不了。改完之后先做权限收敛Netplan 会因为配置文件权限过宽而报警告sudo chmod 600 /etc/netplan/*.yaml然后是应用配置。这里有个远程操作的经典事故你在 SSH 里直接netplan apply如果 IP 配错了连接会立刻断掉而你再也连不回去只能通过控制台救。所以优先用netplan trysudo netplan try它会应用配置并启动 120 秒倒计时期间你可以另开一个终端测试连通性。如果配置有问题比如 IP 冲突导致连不上倒计时结束会自动回滚到原配置。确认没问题就按回车保留或者再执行sudo netplan apply固化。验证的完整链路应该是ip a看地址对不对、ip route看默认路由在不在、ping 网关看二层通不通、ping 223.5.5.5看三层通不通、ping 域名看 DNS 通不通。这五步能精确定位问题出在哪一层比笼统地说没网高效得多。如果 DNS 有问题用resolvectl status看上游服务器用resolvectl query example.com单独测解析。4.2 换国内源与升级节奏的把握22.04 的软件源还是传统的单行格式在/etc/apt/sources.list里。换源前先备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后替换域名。下面这条命令把官方源和 security 源都换成阿里云镜像sudo sed -i s|http://archive.ubuntu.com|https://mirrors.aliyun.com|g; s|http://security.ubuntu.com|https://mirrors.aliyun.com|g /etc/apt/sources.list换完之后sudo apt update sudo apt upgrade -y关于升级节奏有个实际经验值得分享。刚装完的机器可以放心upgrade但正在跑业务的机器不要用apt upgrade全量升。原因是upgrade会升级内核和 glibc 这类基础库某些第三方软件比如自编译的驱动模块、某些商业软件可能跟新内核不兼容。生产环境的做法是先apt list --upgradable看清单重点确认内核、libc6、openssl这几项然后决定是全升还是只装安全更新。安全更新可以用unattended-upgrades自动处理Server 版默认已经装了。检查它是不是启用的systemctl status unattended-upgrades需要调整策略的话跑sudo dpkg-reconfigure unattended-upgrades交互界面里能选自动更新的范围。另外要养成习惯升级装完之后检查一下/var/run/reboot-required这个文件在不在存在就说明有需要重启才能生效的更新通常是内核找个窗口重启。4.3 sshd 改配置不生效sshd_config.d 的覆盖顺序陷阱这是我踩过最久的一个坑值得单独拿出来讲。现象是这样的你在/etc/ssh/sshd_config里把PasswordAuthentication改成nosystemctl restart ssh重启然后用另一台机器测试密码登录依然能进去。查配置文件明明改对了sshd -T输出却显示passwordauthentication yes。根因在 Ubuntu 22.04 的 sshd 配置结构上。/etc/ssh/sshd_config的第一行是一条Include /etc/ssh/sshd_config.d/*.conf而sshd对绝大多数配置项遵循首次出现的值生效原则。也就是说被 Include 进来的那些文件先被解析它们的值优先级高于主配置文件后面的内容。而安装过程或者cloud-init会在/etc/ssh/sshd_config.d/下生成一个50-cloud-init.conf里面写着PasswordAuthentication yes按字母序它排在前面所以它赢了。你在主文件里改的值根本没有机会生效。正确的处理方式有三种按推荐程度排序第一种直接修改/etc/ssh/sshd_config.d/50-cloud-init.conf里的值把yes改成no。简单有效缺点是cloud-init在某些条件下会重写这个文件。第二种自己创建一个排序更靠前的文件比如/etc/ssh/sshd_config.d/00-hardening.conf在里面写你的加固配置。因为00排在50前面它会第一个被解析从而生效。第三种从源头掐掉在/etc/cloud/cloud.cfg.d/下放一个配置文件把cloud_init_modules列表里的ssh模块移除让cloud-init不再插手 sshd 配置。这个做法最彻底但需要把整个模块列表完整写一遍改错了会影响cloud-init的其他行为。改完之后不要直接重启先做两步验证sudo sshd -t # 语法检查没输出就是对的 sudo sshd -T | grep -i passwordauth # 看生效值确认生效值是你想要的结果再sudo systemctl restart ssh。注意服务名是ssh不是sshd这是 Ubuntu 和 CentOS 的一个差异systemctl restart sshd会直接报找不到单元。操作顺序上还有一个保命技巧不要关掉当前这个 SSH 会话。先开一个新终端测试密码登录是不是被拒了、密钥登录是不是正常两边都符合预期再关闭原会话。否则一旦配置把你自己也挡在外面就只能去物理机或者云控制台开 VNC 救援了。5. 装完之后从裸机到能干活的服务器基础系统跑起来之后接下来要做的是把这台机器变成能承载业务的状态。这一段的顺序安排有讲究顺序错了会返工。5.1 常用工具、时区、主机名与 Swap 的调整先把基础环境补齐。最小化安装出来的系统连vim、curl、htop都不一定有装一批日常工具sudo apt install -y vim curl wget htop git net-tools tree unzip bash-completionnet-tools提供了ifconfig、netstat这些老命令。虽然ip和ss才是现代工具但很多排查脚本和老文档还在用老命令装上能省事。bash-completion能让 Tab 补全更聪明日常操作体验提升明显。时区要设对否则日志时间戳和你本地时间差 8 小时排查问题的时候光换算时间就能把人绕晕sudo timedatectl set-timezone Asia/Shanghai timedatectl输出里确认Time zone和System clock synchronized: yes两项。如果时钟同步没开装个chrony或者用默认的systemd-timesyncdsudo apt install -y chrony chronyc sources -v主机名要改的话注意两个文件都要改sudo hostnamectl set-hostname web-01hostnamectl会自动写/etc/hostname但/etc/hosts里那条127.0.1.1的记录需要手动确认。很多程序比如sudo在解析自己主机名时会查/etc/hosts如果里面还是旧名字可能出现解析主机名很慢的现象表现为每条sudo命令都要卡一两秒。Swap 的调整取决于你有什么。安装时如果用整盘方案安装器会创建一个 swap 分区或者/swap.img文件。用文件的话可以调整大小swapon --show free -h如果内存很大想关掉 swap可以sudo swapoff /swap.img并注释掉/etc/fstab里对应行。我的建议是留着哪怕只有 2GB它能兜住偶发的内存尖峰避免 OOM Killer 毫无征兆地把你的数据库进程干掉。5.2 Docker 与 Ansible 的落地顺序这两个东西的安装顺序有实际影响。先装 Docker再装 Ansible因为 Ansible 的很多 playbook 会管理 Docker 容器和网络反过来则没有依赖关系。Docker 从官方仓库装比用发行版自带的包更可控因为版本更新更及时。完整流程sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release echo $VERSION_CODENAME) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin装完之后立刻做两件事不然迟早要出事。第一件配置日志轮转。Docker 默认的json-file日志驱动不限制大小一个疯狂输出的容器能在几小时内把根分区写满。写一个/etc/docker/daemon.json{ log-driver: json-file, log-opts: { max-size: 50m, max-file: 3 } }这表示每个容器最多留 3 个 50MB 的日志文件超出就滚动覆盖。改完sudo systemctl restart docker生效注意这个配置只对新建的容器生效已经在跑的容器要重建。第二件加用户组而不是直接用 root。sudo usermod -aG docker $USER newgrp dockernewgrp让当前 shell 立刻获得新组权限不用重新登录。但心里要清楚把用户加进docker组等于给了他 root 权限——因为你可以挂载宿主机的/目录到容器里。单机自用没问题多人共用的机器上要慎重。Docker 验证docker version docker run --rm hello-worldAnsible 这边控制节点和被控节点的角色要分清。如果这台机器只是被管理它只需要一个能 SSH 登录的普通用户加免密sudo如果它要当控制节点才需要装 Ansible。sudo apt install -y ansible ansible --version被控节点需要的是一个专用用户比如ops、你的公钥写进它的~/.ssh/authorized_keys、以及该用户在sudoers里有 NOPASSWD 权限。在控制节点上写 inventory[web] 192.168.10.20 [web:vars] ansible_userops ansible_ssh_private_key_file~/.ssh/id_ed25519测试连通性ansible web -m ping ansible web -m shell -a uptime如果ping模块返回SUCCESS但后面执行命令报权限问题八成是become没配。在 inventory 或 playbook 里加becometrue再加--ask-become-pass参数跑一次试试。另外 Ansible 需要被控节点有 PythonUbuntu 22.04 自带python3一般不用额外处理如果是更精简的系统可能需要ansible_python_interpreter显式指定解释器路径。5.3 带显卡的机器驱动应该什么时候装如果这台机器装了独立显卡比如要跑推理任务或者做 GPU 加速驱动安装的时机和顺序很关键。正确的顺序是基础系统收尾完成、内核版本确定之后先装显卡驱动再装容器运行时和 GPU 相关的工具链。原因在于 NVIDIA 的驱动是通过 DKMS 编译内核模块的如果先装了后面的东西内核更新时容易漏掉驱动重编译出现重启之后nvidia-smi报找不到设备的经典故障。装驱动前的准备sudo apt update sudo apt install -y build-essential linux-headers-$(uname -r)linux-headers这个包必须跟当前运行内核版本匹配DKMS 才有东西可编译。如果以后内核会频繁升级建议装上linux-headers-generic这个元包它会自动跟随新内核。然后让系统推荐合适的驱动版本ubuntu-drivers devices输出的列表里带recommended标记的就是官方推荐版本。可以直接sudo ubuntu-drivers install或者指定版本装比如sudo apt install -y nvidia-driver-535。装完重启验证nvidia-smi能看到显卡型号、驱动版本、显存占用就说明成了。如果报错先看dkms status正常应该显示模块已安装并绑定到某个内核版本。如果显示失败去/var/lib/dkms/下看编译日志通常是缺linux-headers或者编译器版本不匹配。一个容易忽略的点装了驱动之后再更新内核一定要重启前确认 DKMS 已经为新内核编译好了模块。可以在更新内核后先dkms status看一眼确认新内核版本有对应的模块记录再重启。否则重启之后驱动失效而你没有物理访问权限的话会很被动。6. 我踩过的五个安装坑与对应排查链路前面讲的都是正确路径但实际装机中真正花时间的往往是异常情况。这一章把几个高频问题和它们的排查过程完整写下来你可以照着这个思路去复现定位。6.1 卡在分区页面 / 装完无法引导残留分区表的处理现象安装器进到存储配置页时卡住很久或者直接报错退回到上一个页面也可能是安装顺利完成但重启之后黑屏或者进了固件设置界面找不到可引导设备。根因这块盘之前装过系统GPT 分区表或者 LVM 元数据还残留在磁盘的前几 MB 和后几 MB。安装器在读分区表时遇到互相冲突的信息行为就不可预期了。排查链路先从 U 盘的 live 环境进系统引导菜单里一般有 shell 或者你可以切到其他 TTY确认磁盘设备lsblk sudo parted -l如果parted -l提示 Unable to open /dev/sda - unrecognised disk label或者输出里出现多套互相矛盾的分区信息基本可以确定是残留问题。处理清理 GPT 和 MBR 两套表头sudo sgdisk --zap-all /dev/sda sudo wipefs -a /dev/sdasgdisk --zap-all清掉 GPT 主副表头和分区项wipefs -a抹掉文件系统魔数这个很关键光清 GPT 不抹魔数某些工具还是会按旧文件系统去认。如果这样还不够可以在确认盘上没有需要的数据之后用dd把磁盘头部清零sudo dd if/dev/zero of/dev/sda bs1M count100 oflagsync验证重新执行parted -l应该干净地显示没有识别到分区表。然后再走安装流程存储页面就不会卡了。关于无法引导除了引导模式不匹配还要检查 BIOS 里那几项Secure Boot 如果开着但你的引导程序没签名自行定制的内核或引导器会引导失败Fast Boot 开着可能跳过 U 盘检测某些品牌机还有 Intel RST快速存储技术模式必须改成 AHCI否则安装器看不到硬盘。6.2 装完没网络、网卡名对不上现象安装时明明配好了静态 IP装完登录进去ip a发现网卡没地址或者网卡名变成了enp0s3而配置文件里写的是ens33。根因网卡命名规则Predictable Network Interface Names在不同的虚拟化平台和硬件上表现不同。同一个虚拟机在网络配置不变的情况下改名通常是因为虚拟化平台升级改变了网络设备的 PCI 位置或者是克隆虚拟机导致 MAC 地址变了。排查链路ip -br link sudo netplan get ls /etc/netplan/ip -br link告诉你现在的真实网卡名netplan get显示当前生效的配置内容。两个一对比如果名字不一致就是配置引用错了。处理把/etc/netplan/*.yaml里的网卡名改成实际的然后sudo netplan apply。更稳妥的办法是不要写死网卡名用match加通配符network: version: 2 renderer: networkd ethernets: wan0: match: name: en* dhcp4: false addresses: [192.168.10.20/24] routes: - to: default via: 192.168.10.1 nameservers: addresses: [223.5.5.5]这里wan0只是个逻辑名真正的匹配靠match.name。这样不管网卡叫ens33还是enp0s3配置都能匹配上。虚拟机克隆、模板化部署的场景下这一招特别管用。验证netplan apply之后ip a看到地址、ip route看到默认路由、ping通外网。如果网卡物理层都是DOWN检查一下虚拟化平台的网络适配器是不是没连接或者物理机的网线、交换机端口。6.3 cloud-init 反复覆盖网络与 sshd 配置现象你手动改了 netplan 配置或者 sshd 配置重启之后又变回去了。或者 DNS 设置每隔一段时间被重置成 DHCP 下发的值。根因cloud-init在每次开机时会执行一遍它的模块流程如果它认为需要管理网络或者 SSH就会覆盖你手改的文件。Ubuntu Server 的 ISO 安装版默认会写入配置禁用部分功能但在某些点版本或者你自己装了cloud-init之后行为可能不一致。排查链路cloud-init status --long ls /etc/cloud/cloud.cfg.d/ sudo cat /var/log/cloud-init.log | tail -50cloud-init status --long会显示它执行了哪些阶段。配置文件目录下的内容能告诉你安装器留下了什么。处理禁用网络配置接管在/etc/cloud/cloud.cfg.d/下建一个99-disable-network-config.cfgnetwork: config: disabledSSH 密码认证被重置的问题处理方式在前面 4.3 已经详细讲过核心是找到50-cloud-init.conf这个文件并处理它或者从cloud_init_modules里移除ssh模块。验证改完之后重启再检查一次配置有没有被改回去sudo reboot # 登录后 sudo sshd -T | grep -i passwordauth sudo netplan get两个都稳定输出你设定的值才算真正解决。6.4 安装过程花屏、卡死、界面文字被截断现象引导之后屏幕花屏、显示乱码或者界面显示不全底部的按钮看不到只能看到上半部分内容。根因安装器在 Console 模式下会尝试使用图形帧缓冲framebuffer如果显卡不支持对应的模式或者虚拟机的显存配置太小就会花屏或降级显示。处理在 GRUB 引导菜单上选中安装项按e进入编辑模式找到以linux开头的那一行在末尾加上nomodeset按CtrlX或者F10引导。nomodeset会禁用内核的显示模式设置改用最基本的 VGA 文本模式能解决绝大多数花屏问题。界面文字被截断则是分辨率问题不是 bug。物理机上可以进 BIOS 调整显示输出虚拟机里按前面 2.3 说的调整窗口分辨率。另外安装器支持切换到另一个 TTY 看日志CtrlAltF2到F6通常有一个 shellCtrlAltF1回到安装界面。卡住的时候切过去执行tail -f /var/log/syslog能看到安装器在干什么比干等强。6.5 想批量装autoinstall 的最小可用模板如果你要装的不止一台手工点安装向导效率太低。Ubuntu 22.04 的subiquity支持autoinstall用一份 YAML 描述整个安装过程全自动完成。一份最小可用的配置大概是这样#cloud-config autoinstall: version: 1 locale: en_US.UTF-8 keyboard: layout: us identity: hostname: node01 username: ops password: $6$abcdefgh$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ssh: install-server: true allow-pw: false authorized-keys: - ssh-ed25519 AAAAC3Nza... your-key storage: layout: name: lvm packages: - vim - htop - curl几个要点。password字段是加密后的哈希不是明文用mkpasswd -m sha-512生成。storage.layout.name可以用lvm、direct、zfs。identity.hostname如果要给多台机器用同一份配置得想办法在生成种子文件时替换或者干脆让它固定装完再改。把这份文件交给安装器有三种方式做成一个卷标为CIDATA的种子 ISO 挂给虚拟机放在 HTTP 服务器上在引导参数里加dsnocloud-net;shttp://your-server/或者直接重制 ISO 把配置塞进去。虚拟机批量部署场景下第一种最省事改配置只改种子 ISO不用动主镜像。踩坑提醒autoinstall配置里任何一处语法错误都会导致安装器回退到交互模式或者在早期就报错退出。写完先用 YAML 校验器过一遍再看安装器的日志确认autoinstall被识别到了。另外identity.password的哈希如果生成方式不对比如用了-m sha-1装完之后根本登录不进去只能重装。这一项我建议在虚拟机上先跑一遍验证再上生产。我个人在批量部署时的做法是先手工完整装一台把subiquity生成的配置在目标系统/var/log/installer/或者安装环境里能找到作为基线改造成 autoinstall 配置而不是从零手写。这样出来的配置跟你实际装的那台一模一样风险低很多。装完之后再手工做的是个性化部分——静态 IP 在 Netplan 里改、主机名在 autoinstall 里按机器不同替换、Ansible 接管后续的软件配置。这样分工下来从裸机到能跑业务的时间能压到十几分钟。
返回列表