记一次无显示屏的Ubuntu24重装

tangsong404 2026-09-06 21:47 1

起因是毕业后室友各奔东西,我把当时合资买的服务器搬到了现工作地,想重装一下让它继续发光发热。


但是发现显示卡好像坏了,原来的系统是win server,且远程桌面的证书过期了,我还真没有在这样的情况装过系统。


设备情况:一张450G的NVMe,一个30G的U盘,一个网口,一个AI用多了生锈的脑子


烧引导盘重装本身还是简单的,但我完全不清楚怎么走接下来的usernamepassword设置,以及安装后的sshd怎么起来


实现步骤如下


1.生成密码哈希,值用于替换下方user-data中的password


openssl passwd -6 -salt '<salt value>' '<password>'

执行以下指令,该命令输出的参数用于下方build.sh中第5步的参数设置


xorriso -indev ubuntu-24.04.3-live-server-amd64.iso -report_system_area as_mkisofs

2.维护这样一个目录


autoinstall-build/
├── ubuntu-24.04.3-live-server-amd64.iso
├── build.sh
├── user-data
└── meta-data

user-data文件是构建的关键,它实现了autoinstall的配置


#cloud-config
autoinstall:
version: 1
locale: en_US.UTF-8
keyboard:
layout: us
timezone: Asia/Shanghai
identity:
hostname: ubuntu-server
username: ubuntu
password: "$6$Qb.jQGhe9u9453ce$vLXHVzS[crazyThursdayKFCVIVO50]fZZZ6W1nHKrQE14GVLHNXGurICur03jET40y5gmKgCyw9FAWxtdlkB/"
ssh:
install-server: true
allow-pw: true
storage:
layout:
name: direct
apt:
geoip: false
primary:
- arches: [default]
uri: "http://mirrors.aliyun.com/ubuntu/"
shutdown: poweroff

meta-data如下,随便定一个id


instance-id: ubuntu-server-autoinstall-01

构建脚本build.sh如下


#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SRC_ISO="$SCRIPT_DIR/ubuntu-24.04.3-live-server-amd64.iso"
OUT_ISO="$SCRIPT_DIR/ubuntu-24.04.3-live-server-amd64-autoinstall.iso"
WORK="$HOME/autobuild"

echo ">> [0/5] Copying original ISO to workdir..."
mkdir -p "$WORK"
[ -f "$SRC_ISO" ] || { echo "ERROR: original ISO not found: $SRC_ISO"; exit 1; }
cp "$SRC_ISO" orig.iso

echo ">> [1/5] Extracting original ISO..."
rm -rf iso
7z x -y -oiso orig.iso -x'![BOOT]' > /dev/null

echo ">> [2/5] Injecting autoinstall config..."
[ -f "$SCRIPT_DIR/user-data" ] && [ -f "$SCRIPT_DIR/meta-data" ] || { echo "ERROR: user-data / meta-data not found"; exit 1; }
mkdir -p iso/autoinstall
cp "$SCRIPT_DIR/user-data" "$SCRIPT_DIR/meta-data" iso/autoinstall/

echo ">> [3/5] Patching grub boot parameters..."
sed -i 's|casper/vmlinuz ---|casper/vmlinuz autoinstall ds=nocloud\\;s=/cdrom/autoinstall/ ---|' iso/boot/grub/grub.cfg
grep -q 'autoinstall ds=nocloud' iso/boot/grub/grub.cfg || { echo "ERROR: failed to patch grub.cfg"; exit 1; }

echo ">> [4/5] Regenerating md5sum.txt..."
(cd iso && find . -type f ! -name md5sum.txt -print0 | sort -z | xargs -0 md5sum > md5sum.txt)

echo ">> [5/5] Repacking ISO with original boot layout..."
dd if=orig.iso of=efi-part.img bs=512 skip=6441216 count=10160 status=none
xorriso -as mkisofs -r \
-V 'Ubuntu-Server 24.04.3 LTS amd64' \
--grub2-mbr --interval:local_fs:0s-15s:zero_mbrpt,zero_gpt:'orig.iso' \
--protective-msdos-label \
-partition_cyl_align off \
-partition_offset 16 \
--mbr-force-bootable \
-append_partition 2 28732ac11ff8d211ba4b00a0c93ec93b --interval:local_fs:0d-10159d::'efi-part.img' \
-appended_part_as_gpt \
-iso_mbr_part_type a2a0d0ebe5b9334487c068b6b72699c7 \
-c '/boot.catalog' \
-b '/boot/grub/i386-pc/eltorito.img' \
-no-emul-boot -boot-load-size 4 -boot-info-table \
--grub2-boot-info \
-eltorito-alt-boot \
-e '--interval:appended_partition_2:::' \
-no-emul-boot -boot-load-size 10160 \
-o autoinstall.iso \
iso

cp autoinstall.iso "$OUT_ISO"
sync

3.执行构建,打包出新的iso文件


wsl -d Ubuntu-24.04 -u root -- bash /mnt/c/.../build.sh


我使用的烧录工具是balenaEtcher,把新的iso写入U 盘,然后上电,值得注意的是NVMe上最好不要带引导,否则在没有键盘的情况下可能没法进U盘的引导


4.通过webhook查看进度[可选]


接收端随便起一个8000端口的web服务保存POST请求传来的文件即可,注意放行防火墙


服务器作为发送端要启用该功能,则在user-data中添加


reporting:
install:
type: webhook
endpoint: "http://<receiver ip>:8000/subiquity"
level: debug
late-commands:
- "sh -c 'cd /var/log && tar czf /tmp/instlogs.tgz installer syslog 2>/dev/null; wget -q -O - --post-file=/tmp/instlogs.tgz http://<receiver ip>:8000/logs || true'"

如此如此,这般这般,服务器就重装完成了


最后我想请教下佬友们,我现在是在深圳的公寓中,用的是公寓开出的网,这种情况下能否向服务商要到公网IP,用什么话术,如果不行的话,用什么工具能最低成本穿透出去。

最新回复 (2)
  • 冬马99 09-06 22:23
    1

    没有显示屏是怎么输入命令的?我有点无法理解。不是直接SSH登录吗?怎么确认登录成功的?盲打?

  • PPKun 09-06 22:25
    2

    wsl里写好配置文件,Ubuntu的live cd是支持根据配置文件自动安装的,直接配置好接收进度就好了

* 帖子来源Linux.do
返回