Ubuntu Server 26.04 LTS(代号 Resolute Raccoon)是一个长期支持版本,提供长达 5 年的标准安全维护,适合在生产环境中部署。以下是基于官方文档和社区指南整理的完整安装与初始配置步骤。
在开始安装前,请确认硬件满足以下最低配置:
| 项目 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 1 GHz 64 位处理器 | 2 GHz+ 多核处理器 |
| 内存 | 1.5 GB | 4 GB 及以上 |
| 磁盘 | 5 GB 可用空间 | 25 GB 及以上 |
| 安装介质 | USB 端口或 DVD 驱动器 | 4 GB 以上 U 盘 |
Ubuntu Server 默认不包含图形界面,资源占用更低,更适合运行各类服务。
从 Ubuntu 官方发布页面下载 ISO 文件:
bashwget https://releases.ubuntu.com/26.04/ubuntu-26.04-live-server-amd64.iso
如果官方源速度较慢,可以使用国内镜像加速下载:
bash# 清华大学镜像
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/26.04/ubuntu-26.04-live-server-amd64.iso
# 阿里云镜像
wget https://mirrors.aliyun.com/ubuntu-releases/26.04/ubuntu-26.04-live-server-amd64.iso
下载完成后建议校验文件完整性:
bashwget https://releases.ubuntu.com/26.04/SHA256SUMS
sha256sum -c SHA256SUMS 2>/dev/null | grep ubuntu-26.04-live-server-amd64.iso
bash# 查看 U 盘设备名(注意确认,避免误写系统盘)
lsblk
# 写入 ISO(将 /dev/sdX 替换为实际设备名)
sudo dd if=ubuntu-26.04-live-server-amd64.iso of=/dev/sdX bs=4M status=progress oflag=sync
推荐使用 Rufus 或 balenaEtcher:
将制作好的启动盘插入服务器,设置 BIOS 从该介质启动。安装程序 Subiquity 会引导你完成整个过程。
服务器环境建议选择 English,可以避免后续终端中出现中文乱码问题。如需中文环境,可在系统安装完成后再单独配置。
一般选择默认的 English (US) 即可。
安装程序会默认通过 DHCP 自动获取网络配置。如需设置静态 IP,按以下步骤操作:
如网络环境需要代理,在此填入代理地址(如 http://proxy.example.com:8080),否则留空跳过。
默认使用 http://archive.ubuntu.com/ubuntu。建议替换为国内镜像以加快后续软件安装速度:
https://mirrors.tuna.tsinghua.edu.cn/ubuntu
推荐新手使用整块磁盘方案:
如需自定义分区,建议方案如下:
| 分区 | 大小 | 文件系统 | 挂载点 |
|---|---|---|---|
| EFI | 512 MB | fat32 | /boot/efi |
| /boot | 1 GB | ext4 | /boot |
| swap | 与内存等大 | swap | — |
| / | 剩余空间 | ext4 | / |
附扩容参考:LVM 在线扩容,支持 --check 干跑、扩前留底、扩后 SHA256/可写性校验
sh#!/usr/bin/env bash
# 在线扩容根分区:把 LVM 卷组里闲置的空间全部分配给 /(ext4 在线扩容,无需重启)
#
# 用法:
# sudo bash /home/lvm-extend-root.sh --check # 只检查、只报告,不改动
# sudo bash /home/lvm-extend-root.sh # 执行扩容
#
# 安全性说明:
# - 只做“扩大”:lvextend 追加空间 + resize2fs 在线扩文件系统,不动任何已有数据。
# - 失败可安全重试:即使 resize2fs 被中断,文件系统仍然有效,重新执行即可继续。
# - 本脚本不做自动回滚:缩容(resize2fs + lvreduce)需要卸载分区并做离线 fsck,
# 风险远高于扩容,因此只提供命令说明,不自动执行。
set -uo pipefail
VG=ubuntu-vg
LVNAME=ubuntu-lv
LVDEV=/dev/${VG}/${LVNAME}
LOG=/home/lvm-extend-root.log
SELF="$(readlink -f "$0")"
if [ "$(id -u)" -ne 0 ]; then
echo "错误:必须用 sudo 运行 -> sudo bash $SELF --check"
exit 1
fi
exec > >(tee -a "$LOG") 2>&1
echo "================ $(date '+%F %T %Z') 开始 ================"
MODE="${1:-run}"
TS="$(date +%Y%m%d%H%M%S)"
RECORD="/root/lvm-extend-${TS}.txt"
g2() { awk -v b="$1" 'BEGIN{printf "%.2f", b/1073741824}'; }
# ---------- 前置检查 ----------
FSTYPE="$(findmnt -no FSTYPE / 2>/dev/null)"
[ "$FSTYPE" = "ext4" ] || { echo "❌ 根文件系统类型是 '${FSTYPE:-未知}',本脚本只处理 ext4"; exit 1; }
[ -e "$LVDEV" ] || { echo "❌ 找不到逻辑卷 $LVDEV"; exit 1; }
ROOTSRC="$(findmnt -no SOURCE / 2>/dev/null)"
# 通过解析到真实设备节点比较,规避 LVM 名字里 '--' 转义导致的字符串不匹配
[ "$(readlink -f "$ROOTSRC")" = "$(readlink -f "$LVDEV")" ] || {
echo "⚠ 注意:/ 的源设备是 $ROOTSRC,与 $LVDEV 不一致,请人工确认后再执行"; exit 1; }
FREE_B="$(vgs --noheadings --units b --nosuffix -o vg_free "$VG" 2>/dev/null | tr -d ' ')"
case "$FREE_B" in ''|*[!0-9]*) echo "❌ 无法读取卷组 $VG 的空闲空间"; exit 1;; esac
SIZE_BEFORE="$(df -B1 --output=size / | tail -1 | tr -d ' ')"
AVAIL_BEFORE="$(df -B1 --output=avail / | tail -1 | tr -d ' ')"
USED_BEFORE="$(df -B1 --output=used / | tail -1 | tr -d ' ')"
echo "逻辑卷 : $LVDEV"
echo "文件系统 : $FSTYPE(支持在线扩容)"
echo "卷组空闲 : $(g2 "$FREE_B") GiB"
echo "当前 / : 总 $(g2 "$SIZE_BEFORE") GiB,已用 $(g2 "$USED_BEFORE") GiB,可用 $(g2 "$AVAIL_BEFORE") GiB"
echo "扩容后预期 : 总约 $(g2 $((SIZE_BEFORE + FREE_B))) GiB,可用约 $(g2 $((AVAIL_BEFORE + FREE_B))) GiB"
{
echo "# ===== 扩容前状态 $(date '+%F %T %Z') ====="
echo "## vgs"; vgs "$VG" 2>&1
echo "## lvs"; lvs "$VG" 2>&1
echo "## df"; df -h / 2>&1
echo "## lsblk"; lsblk /dev/sda 2>&1
} > "$RECORD"
echo "扩容前状态已记录 -> $RECORD"
if [ "$MODE" = "--check" ]; then
echo "(--check 模式:仅检查,未做任何修改)"
exit 0
fi
if [ "$FREE_B" -lt 1073741824 ]; then
echo "❌ 卷组空闲不足 1 GiB($(g2 "$FREE_B") GiB),无需扩容"
exit 1
fi
# ---------- 完整性标记(扩前写入,扩后校验) ----------
MARKER="/root/.lvm-extend-marker-${TS}"
echo "dsh lvm-extend check $TS" > "$MARKER"
MARK_SUM="$(sha256sum "$MARKER" | awk '{print $1}')"
PASS_SUM="$(sha256sum /etc/passwd | awk '{print $1}')"
# ---------- 第一步:扩容逻辑卷 ----------
echo ">>> lvextend -l +100%FREE $LVDEV"
if ! lvextend -l +100%FREE "$LVDEV"; then
echo "❌ lvextend 失败:未做任何文件系统改动,数据无风险"
exit 1
fi
echo "✅ 逻辑卷已扩容,接下来在线扩容文件系统(resize2fs,通常几十秒)..."
# ---------- 第二步:在线扩容文件系统 ----------
echo ">>> resize2fs $LVDEV"
if ! resize2fs "$LVDEV"; then
echo "⚠ resize2fs 首次失败,重试一次..."
if ! resize2fs "$LVDEV"; then
echo "❌ 文件系统扩容失败,但 LV 已扩容——这不影响数据完整性。"
echo " 请手动重试(可安全重复执行): sudo resize2fs $LVDEV"
exit 1
fi
fi
# ---------- 校验 ----------
sleep 1
sync
SIZE_AFTER="$(df -B1 --output=size / | tail -1 | tr -d ' ')"
AVAIL_AFTER="$(df -B1 --output=avail / | tail -1 | tr -d ' ')"
GROWTH=$(( (SIZE_AFTER - SIZE_BEFORE) / 1073741824 ))
ok=1
[ "$SIZE_AFTER" -gt "$SIZE_BEFORE" ] || { echo "❌ 文件系统总容量没有变化"; ok=0; }
[ "$(sha256sum "$MARKER" 2>/dev/null | awk '{print $1}')" = "$MARK_SUM" ] || { echo "❌ 标记文件校验不一致"; ok=0; }
[ "$(sha256sum /etc/passwd 2>/dev/null | awk '{print $1}')" = "$PASS_SUM" ] || { echo "❌ /etc/passwd 校验不一致"; ok=0; }
findmnt -no OPTIONS / | grep -q '^rw' || { echo "❌ 根分区未处于可读写状态"; ok=0; }
( touch /root/.lvm-write-test && rm -f /root/.lvm-write-test ) || { echo "❌ 根分区写入测试失败"; ok=0; }
for d in /etc /usr /var /home /boot; do [ -d "$d" ] || { echo "❌ 关键目录 $d 不见了"; ok=0; }; done
{
echo "# ===== 扩容后状态 $(date '+%F %T %Z') ====="
echo "## vgs"; vgs "$VG" 2>&1
echo "## lvs"; lvs "$VG" 2>&1
echo "## df"; df -h / 2>&1
echo "## lsblk"; lsblk /dev/sda 2>&1
} >> "$RECORD"
echo "扩容后状态已追加 -> $RECORD"
echo "---- 结果 ----"
df -hT / | sed 's/^/ /'
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT /dev/sda | sed 's/^/ /'
if [ "$ok" = "1" ]; then
echo "✅ 成功:/ 已扩容约 ${GROWTH} GiB,现总 $(g2 "$SIZE_AFTER") GiB、可用 $(g2 "$AVAIL_AFTER") GiB"
echo " 数据完整性校验全部通过(标记文件、/etc/passwd、可读写、关键目录)"
rm -f "$MARKER"
echo " 如需缩小回去(不推荐、需离线操作):"
echo " sudo swapoff /swap.img && sudo e2fsck -f $LVDEV && sudo resize2fs $LVDEV 29G && sudo lvreduce -L 29G $LVDEV && sudo swapon /swap.img"
else
echo "❌ 校验未全部通过:请查看上方 ❌ 项与日志 $LOG"
echo " LV 扩容本身不影响数据;必要时可再次执行本脚本重试文件系统扩容"
exit 1
fi
设置你的用户名和密码。Ubuntu 默认不启用 root 账户密码,日常操作通过 sudo 提权。
建议勾选 “Install OpenSSH server”,以便安装完成后可以通过 SSH 远程连接服务器。
根据服务器用途勾选需要的软件包(如 LAMP、Docker 等),也可全部跳过,后续按需安装。
确认配置后点击 Done → Reboot Now。系统会提示你拔出安装介质,拔出后按 Enter 重启。
重启后使用创建的账户登录,进行以下基本配置。
Ubuntu 默认 root 无密码,如需使用传统 su 命令切换,可手动设置:
bashsudo passwd root
bashsudo hostnamectl set-hostname your-server-name
编辑 Netplan 配置文件:
bashsudo nano /etc/netplan/00-installer-config.yaml
示例配置(请根据实际网卡名称和网络参数调整):netplan-ens33-static.yaml
yaml# 静态 IP 配置:ens33 -> 192.168.3.138/24
# 网关/DNS:192.168.3.2(路由器),备用 DNS:223.5.5.5
# 生效方式:复制为 /etc/netplan/00-installer-config.yaml 后执行 netplan apply
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: false
dhcp6: false
addresses:
- 192.168.3.138/24
routes:
- to: default
via: 192.168.3.2
metric: 100
nameservers:
addresses:
- 192.168.3.2
- 223.5.5.5
附静态IP设置参考:set-static-ip.sh
sh#!/usr/bin/env bash
# 把本机 ens33 固定为静态 IP 192.168.3.138/24
#
# 用法(只记这一条,sudo 会正常提示你输密码):
# sudo bash /home/set-static-ip.sh
#
# 回滚到 DHCP:
# sudo bash /home/set-static-ip.sh --rollback
#
# 原理:sudo 在前台拿到 root -> 脚本自己用 setsid 把真正干活的进程分离到后台
# -> 前台立即返回。这样 netplan apply 导致 SSH 掉线时,后台进程不会被 SIGHUP 杀掉。
# 调试:加 SETSTATIC_FOREGROUND=1 可让脚本留在前台运行(不推荐,掉线可能中断)。
set -uo pipefail
IFACE=ens33
IPADDR=192.168.3.138
PREFIX=24
GW=192.168.3.2
NEWSRC=/home/netplan-ens33-static.yaml
TARGET=/etc/netplan/00-installer-config.yaml
LOG=/home/set-static-ip.log
SELF="$(readlink -f "$0")"
# ---------- 阶段 1:前台前置检查(错误立刻显示在终端上) ----------
if [ "$(id -u)" -ne 0 ]; then
echo "错误:必须用 sudo 运行 -> sudo bash $SELF"
exit 1
fi
[ -f "$NEWSRC" ] || { echo "错误:找不到配置文件 $NEWSRC"; exit 1; }
# ---------- 阶段 2:把自己分离到后台 ----------
if [ "${SETSTATIC_DETACHED:-0}" != "1" ] && [ "${SETSTATIC_FOREGROUND:-0}" != "1" ]; then
export SETSTATIC_DETACHED=1
setsid bash "$SELF" "$@" >/dev/null 2>&1 </dev/null &
echo "已在后台启动(PID $!),约 20 秒后完成。"
echo "查看结果: cat $LOG"
echo "实时进度: tail -f $LOG"
exit 0
fi
# ---------- 阶段 3:后台正式执行 ----------
exec > >(tee -a "$LOG") 2>&1
echo "================ $(date '+%F %T') 开始 ================"
LATEST_BAK=$(ls -1t "${TARGET}".bak.* 2>/dev/null | head -1 || true)
if [ "${1:-}" = "--rollback" ]; then
[ -n "$LATEST_BAK" ] || { echo "❌ 没有找到任何备份,无法回滚"; exit 1; }
echo "回滚:$LATEST_BAK -> $TARGET"
cp -a "$LATEST_BAK" "$TARGET"
netplan apply && echo "✅ 已回滚为 DHCP 动态获取"
exit $?
fi
BAK="$TARGET.bak.$(date +%Y%m%d%H%M%S)"
if cp -a "$TARGET" "$BAK"; then echo "已备份原配置 -> $BAK"; else echo "❌ 备份失败,中止"; exit 1; fi
if ! install -m 600 -o root -g root "$NEWSRC" "$TARGET"; then
echo "❌ 写入新配置失败,还原备份"; cp -a "$BAK" "$TARGET"; netplan apply; exit 1
fi
echo "---- 新配置内容 ----"; cat "$TARGET"; echo "--------------------"
if ! netplan generate; then
echo "❌ netplan generate 语法检查失败,立即回滚"
cp -a "$BAK" "$TARGET"; netplan apply; exit 1
fi
echo "语法检查通过,正在应用(网络将瞬断几秒,SSH 会掉线)..."
netplan apply
ok_addr=""; ok_route=""
for _ in $(seq 1 20); do
sleep 1
ip -4 -o addr show dev "$IFACE" | grep -q "inet ${IPADDR}/${PREFIX}" && ok_addr=1
ip route show default 2>/dev/null | grep -q "via ${GW}" && ok_route=1
[ -n "$ok_addr" ] && [ -n "$ok_route" ] && break
done
if ping -c1 -W2 "$GW" >/dev/null 2>&1; then
ping_note="网关 ICMP 响应正常"
else
ping_note="网关未响应 ICMP(路由器可能禁 ping,不代表故障)"
fi
if [ -n "$ok_addr" ] && [ -n "$ok_route" ]; then
echo "✅ 成功:${IFACE} = ${IPADDR}/${PREFIX},默认路由 via ${GW};${ping_note}"
echo " 回滚命令:sudo bash $SELF --rollback"
exit 0
fi
echo "❌ 校验失败(地址生效=${ok_addr:-0},默认路由=${ok_route:-0}),自动回滚"
cp -a "$BAK" "$TARGET"
netplan apply
sleep 5
ip -4 -o addr show dev "$IFACE" || true
exit 1
应用配置:
bashsudo netplan apply
Ubuntu 26.04 默认使用 chrony 进行时间同步(替代了旧版的 systemd-timesyncd)。配置文件位于 /etc/chrony/sources.d/ubuntu-ntp-pools.sources,一般保持默认即可。
附把本机时区设为东八区: set-timezone-shanghai.sh
sh#!/usr/bin/env bash
# 把本机时区设为东八区(北京时间)Asia/Shanghai
#
# 用法(sudo 会正常提示你输密码):
# sudo bash /home/set-timezone-shanghai.sh
#
# 回滚到修改前的时区:
# sudo bash /home/set-timezone-shanghai.sh --rollback
#
# 说明:只改时区(/etc/localtime 与 /etc/timezone),不动系统时钟、不需要重启、
# 不会断网。同时会确认 chrony 时间同步在运行,保证时钟长期准确。
set -uo pipefail
TZ_TARGET=Asia/Shanghai
LOG=/home/jing/set-timezone.log
SELF="$(readlink -f "$0")"
# ---------- 前置检查(错误直接显示在终端) ----------
if [ "$(id -u)" -ne 0 ]; then
echo "错误:必须用 sudo 运行 -> sudo bash $SELF"
exit 1
fi
if [ ! -f "/usr/share/zoneinfo/${TZ_TARGET}" ]; then
echo "错误:缺少时区数据文件 /usr/share/zoneinfo/${TZ_TARGET}(请安装 tzdata)"
exit 1
fi
exec > >(tee -a "$LOG") 2>&1
echo "================ $(date '+%F %T %Z') 开始 ================"
ORIG_ZONE="$(timedatectl show -p Timezone --value 2>/dev/null || echo Etc/UTC)"
LATEST_BAK=$(ls -1t /root/tz-backup-*.txt 2>/dev/null | head -1 || true)
# ---------- 回滚模式 ----------
if [ "${1:-}" = "--rollback" ]; then
if [ -z "$LATEST_BAK" ]; then
echo "❌ 没找到备份文件 /root/tz-backup-*.txt,无法自动回滚"
echo " 手动回滚示例: sudo timedatectl set-timezone Etc/UTC"
exit 1
fi
RESTORE_ZONE="$(cat "$LATEST_BAK")"
echo "回滚:$ORIG_ZONE -> $RESTORE_ZONE(来自 $LATEST_BAK)"
timedatectl set-timezone "$RESTORE_ZONE"
echo "当前时区:$(timedatectl show -p Timezone --value) 时间:$(date '+%F %T %Z %z')"
exit $?
fi
# ---------- 备份 ----------
BAK="/root/tz-backup-$(date +%Y%m%d%H%M%S).txt"
printf '%s\n' "$ORIG_ZONE" > "$BAK"
echo "原时区:$ORIG_ZONE (已备份 -> $BAK)"
ls -l /etc/localtime
# ---------- 设置时区 ----------
if ! timedatectl set-timezone "$TZ_TARGET"; then
echo "timedatectl 失败,改用直接替换 /etc/localtime 的方式"
ln -sfn "/usr/share/zoneinfo/${TZ_TARGET}" /etc/localtime
printf '%s\n' "$TZ_TARGET" > /etc/timezone
systemctl restart systemd-timedated 2>/dev/null || true
fi
# ---------- 校验 ----------
NEW_ZONE="$(timedatectl show -p Timezone --value 2>/dev/null || echo unknown)"
OFFSET="$(date '+%z')"
echo "---- 校验 ----"
echo "时区 : $NEW_ZONE"
echo "偏移 : $OFFSET"
echo "本地时间: $(date '+%F %T %Z')"
echo "UTC 时间: $(date -u '+%F %T %Z')"
echo "/etc/localtime -> $(readlink -f /etc/localtime)"
# 时间同步服务确认(时钟准不准取决于它)
if systemctl is-active --quiet chrony 2>/dev/null; then
echo "时间同步: chrony 运行中(Stratum $(chronyc tracking 2>/dev/null | awk '/Stratum/{print $3}'))"
elif systemctl is-active --quiet systemd-timesyncd 2>/dev/null; then
echo "时间同步: systemd-timesyncd 运行中"
else
echo "时间同步: ⚠ 未发现运行中的 NTP 客户端,建议执行 sudo systemctl enable --now chrony"
fi
if [ "$NEW_ZONE" = "$TZ_TARGET" ] && [ "$OFFSET" = "+0800" ]; then
echo "✅ 成功:已切换为东八区(北京时间),无需重启,时钟不受影响"
echo " 回滚命令:sudo bash $SELF --rollback"
exit 0
fi
echo "❌ 校验失败:时区=$NEW_ZONE 偏移=$OFFSET(期望 $TZ_TARGET / +0800)"
echo " 回滚命令:sudo bash $SELF --rollback"
exit 1
bashsudo apt update && sudo apt upgrade -y
在 WinSCP 的会话窗口中,直接按下 Ctrl + Alt + H 组合键,可以快速在“显示”与“隐藏”状态之间切换
WinScp 下载地址:https://winscp.net/eng/index.php Putty 下载地址:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
在 Ubuntu 中“开放端口”通常涉及到两个层面:系统防火墙(UFW) 和 服务本身的监听地址。
由于你使用的是 Ubuntu Server 并打算用 PuTTY 远程管理,以下是标准的操作流程。
Ubuntu 默认的防火墙工具是 UFW (Uncomplicated Firewall)。
⚠️ 极度重要警告:在操作防火墙前,如果你是通过 SSH(比如 PuTTY)连的服务器,必须确保先放行了 22 端口,否则一旦开启防火墙,你的 SSH 连接会立刻断开!
bashsudo ufw status
Status: inactive,说明防火墙没开启。Status: active,说明防火墙已开启,并会列出所有规则。假设你要开放 8080 端口,输入以下命令:
bash# 开放 TCP 端口(最常用)
sudo ufw allow 8080/tcp
# 如果需要同时开放 TCP 和 UDP
sudo ufw allow 8080
bash# 重载防火墙(一般会自动生效)
sudo ufw reload
# 查看规则是否添加成功
sudo ufw status numbered
bash# 启用前,再次确认 22 端口已放行!
sudo ufw allow 22/tcp
sudo ufw enable
| 需求 | 命令 |
|---|---|
| 开放 80 (HTTP) | sudo ufw allow 80/tcp |
| 开放 443 (HTTPS) | sudo ufw allow 443/tcp |
| 开放 3306 (MySQL) | sudo ufw allow 3306/tcp |
| 开放端口范围 8000-9000 | sudo ufw allow 8000:9000/tcp |
| 允许特定 IP 访问 22 端口 | sudo ufw allow from 192.168.1.100 to any port 22 |
| 删除某条规则 | sudo ufw delete allow 8080/tcp |
| 关闭防火墙(不推荐) | sudo ufw disable |
开放了防火墙端口,但外部还是连不上?最常见的原因是服务只监听了 127.0.0.1(本地回环),没有监听 0.0.0.0(所有网卡)。
检查方法:
bash# 查看当前系统所有正在监听的端口和地址
ss -tuln
# 或者
netstat -tuln
127.0.0.1:8080,说明只有本机能访问。0.0.0.0:8080 或 *:8080,说明所有网卡都能访问。解决方法: 这取决于你运行的具体服务(如 Nginx、Docker、Node.js 等)。例如:
listen 8080;。-p 8080:8080(而不是 -p 127.0.0.1:8080:8080)。--host 0.0.0.0。如果你是在阿里云、腾讯云、AWS等云服务器上操作,除了 Ubuntu 的 UFW 防火墙,你还需要在云厂商的 Web 控制台里,找到“安全组”或“防火墙”设置,手动放行对应端口。否则,请求在到达你的服务器之前就被云平台拦截了。
建议你现在的操作顺序:
sudo ufw allow <你的端口>/tcp 开放你需要的端口。ss -tuln 检查服务是否监听了 0.0.0.0。在 vim 里保存退出,记住这个核心操作:
按 O(大写字母 O),这会在当前行的上方插入一个新行,并进入插入模式
先按 Esc,再输入 :wq,然后按回车。
| 目的 | 操作 |
|---|---|
| 保存并退出 | Esc → :wq → 回车 |
| 保存并退出(等价) | Esc → :x → 回车 |
| 不保存,强制退出 | Esc → :q! → 回车 |
| 只保存,不退出 | Esc → :w → 回车 |
| 没修改,只想退出 | Esc → :q → 回车 |
| 保存退出(快捷键) | Esc → 按 ZZ(Shift+z 两次) |
Q:安装后无法通过 SSH 连接?
A:确认安装时已勾选 OpenSSH server,并检查防火墙是否放行了 22 端口:sudo ufw allow ssh。
Q:终端出现中文乱码?
A:这是因为安装时选择了 English。可安装中文字体并配置 locale:sudo apt install language-pack-zh-hans fonts-wqy-zenhei。
Q:如何修改镜像源?
A:编辑 /etc/apt/sources.list.d/ubuntu.sources,将 archive.ubuntu.com 替换为国内镜像地址即可。
以上步骤涵盖了 Ubuntu Server 26.04 LTS 从准备到初始配置的完整流程。如在安装过程中遇到具体报错,可以提供详细信息进一步排查。
本文作者:张京
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!