• tangsong404

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

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

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

    烧引导盘重装本身还是简单的,但我完全不清楚怎么走接下来的username和password设置,以及安装后的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/&quot;
    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,用什么话术,如果不行的话,用什么工具能最低成本穿透出去。

    主楼
  • 冬马99

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

    #1
  • PPKun

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

    #2

发表回复

登录后回复