跳转至

服务器重装实操 (OS Reinstallation SOP)

[!WARNING] 高危操作:DD 脚本会完全抹除当前硬盘的所有数据。执行前请确认数据已备份。 适用环境:Oracle Cloud Always Free (AMD 1G / ARM都可以)。 目标系统:Debian 13 (Trixie) 或 Debian 12 (Bookworm)。


1. 准备工作

  1. 备份数据:确认关键数据 (Docker Volume, Configs) 已离线备份。
  2. Oracle 控制台访问:确保你能登录 Oracle Cloud Console,以便在 SSH 挂掉时通过 "Cloud Shell" 救急。
  3. 获取 ROOT 权限sudo -i

2. 执行 DD 重装

我们使用社区广泛验证的 leitbogioro 脚本。

核心命令 (Copy & Paste)

# 1. 下载脚本
curl -fLO https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh && chmod a+x InstallNET.sh

# 2. 执行重装 (Debian 13 Trixie)
# ⚠️ 请将 'YourStrongPassword' 替换为你自己的强密码!
bash InstallNET.sh -debian 13 -timezone "Asia/Shanghai" -pwd 'YourStrongPassword'

如果求稳 (推荐生产环境): 改用 -debian 12。Debian 13 目前是 Testing 版,虽然新,但也伴随滚动更新的风险。 对于 AMD 1G 小鸡,建议用 12 或 13 区别不大,13 内核更新可能对 BBR 更友好。

执行后现象

  1. 终端会显示一堆 Log,最后提示 Rebooting...
  2. SSH 必定断开
  3. 等待时间:AMD 机器较慢,通常需要 15 ~ 30 分钟。不要急着重启。

3. 重新连接与初始化

3.1 首次登录

  • IP: 原服务器 IP (Oracle IP 不会变)
  • Port: 22 (脚本默认重置为 22)
  • User: root
  • Password: 你刚才设置的 YourStrongPassword
ssh root@<IP>

3.2 紧急补救 (如果 SSH 连不上)

如果超过 40 分钟还需要连,请登录 Oracle Cloud Console: 1. 进入实例详情页 -> Console Connection -> Launch Cloud Shell Connection。 2. 在网页终端里看屏幕报错 (通常是卡在 grub update 或者 DHCP)。


4. 必做的安全加固 (Day 1 Operations)

登录成功后,建议按顺序执行以下操作。不要直接使用 root 裸奔(参考 安全基线与加固)。

4.1 系统层优化

  1. 更新系统
    apt update && apt upgrade -y
    
  2. 启用 BBR (Traffic Control)
    • 作用: 显著优化网络吞吐,尤其是跨国线路 (对代理/科学上网至关重要)。
    • Docker 支持: BBR 是内核特性。宿主机启用后,所有 Docker 容器自动继承 TCP 拥塞控制算法,无需单独配置容器。
      lsmod | grep bbr
      # 如果没有输出,需手动开启:
      # echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
      # echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
      # sysctl -p
      
  1. 新建用户 (例如 ops):
    adduser ops passwd
    
    root: BI7DHPjMqn*Mob&S
    kanon: YDp&V8fy86Hlnecd
    mahiru: TD*UX4%P82JFkaAe
    # 💡 密码策略提醒:
    # - Root 密码:用于 VNC/Console 救急 (必须复杂,存入密码管理器)。
    # - Ops 密码:用于 sudo 提权 (日常频繁使用,建议设置好记但安全的,或者配置 NOPASSWD)。
    # 结论:两个密码都需要妥善保存。
    
  2. 授予 sudo 权限
    usermod -aG sudo ops
    
  3. 配置免密 sudo (可选,推荐熟练工): 如果你不想每次输命令都敲密码,可以配置 NOPASSWD。
    • 风险: 一旦 SSH Key 被盗,黑客直接获得 Root 权限(少了最后一道防线)。
    • 命令:
      echo "ops ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ops
      chmod 440 /etc/sudoers.d/ops
      
  4. 切换到新用户配置 SSH Key
    su - ops
    mkdir -p ~/.ssh
    nano ~/.ssh/authorized_keys
    # 粘贴你的公钥 (id_ed25519.pub)
    chmod 600 ~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    
  5. 验证 sudo
    sudo -v
    # 输入 ops 密码,如果无报错则成功。
    

4.3 SSH 服务加固

确认 ops 用户能登录后,切回 root (exit 回到 root 或 sudo -i) 修改配置:

nano /etc/ssh/sshd_config

推荐配置 (Strict Mode)

Port 22
PermitRootLogin no              # ⛔ 禁止 root 登录 (必须确保 ops 能用 sudo)
PasswordAuthentication no       # ⛔ 禁止密码登录
PubkeyAuthentication yes        # ✅ 允许密钥
AllowUsers ops                  # (可选) 仅允许 ops 用户登录

重启 SSH 服务:

systemctl restart ssh

4.4 安装 Docker (最简方法)

重装完成的基础设施通常直接面临容器化部署需求。这里提供官方推荐的最简一键安装脚本:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

注意:安装完成后,建议将日常运维用户(如 ops)加入 docker 组,以避免每次执行均需 sudo

sudo usermod -aG docker ops
(配置后请退出 SSH 会话并重新连接以使权限生效)


5. 常见问题 (FAQ)

  • Q: 只有 1G 内存,Debian 13 跑得动吗?
    • A: 只要不装 GUI,Debian 13 裸机仅占 ~80MB 内存,非常适合。强烈建议开启 Swap。
  • Q: 脚本卡在 "Downloading" 不动了?
    • A: Oracle 的网络有时连 Github 慢。可以尝试 Ctrl+C 重新运行,或指定国内镜像源 (脚本支持 -mirror 参数,但在海外机器通常不需要)。

6. 另一种DD方法 (救砖神器:分离引导卷重装法)

此方法的核心思路是:把硬盘拔下来,插到另一台正常的电脑上,重做系统后再插回去。

[!TIP] 适用场景: 1. 本机 DD 失败:系统彻底挂了,连 SSH 都进不去。 2. 彻底失联:防火墙配置错误导致无法连接。 3. 跨架构重装:想把 ARM 的引导卷挂到 AMD 机器上处理(反之亦然)。

6.1 准备工作:分离与挂载 (Oracle 后台操作)

假设你有两台机器: * 故障机 (Instance A):需要重装的目标。 * 救援机 (Instance B):一台能正常登录的机器 (AMD/ARM 均可)。

步骤 1:分离故障机的引导卷 1. 登录 Oracle Cloud Console。 2. 进入 Compute -> Instances -> 点击 故障机 (Instance A)。 3. 点击 Stop 关机 (Force stop the instance)。 4. 向下滚动到 Resources 菜单,点击 Boot volume。 5. 点击引导卷名称(例如 Boot Volume 2024...)进入详情页。 6. 点击 Detach (分离),等待状态变为 Detached

步骤 2:挂载到救援机 1. 在刚才的引导卷详情页,点击 Attach to Instance。 2. Attachment type: 选择 iSCSI (推荐,更稳定) 或 Paravirtualized (简单,无需命令)。 * 本教程以 iSCSI 为例,因为现有脚本兼容性更好。 3. Instance: 选择 救援机 (Instance B)。 4. Device path: 保持默认 (通常是 /dev/sdb,如果救援机挂了多个盘可能是 /dev/sdc)。 5. 点击 Attach

步骤 3:在救援机上连接磁盘 (仅 iSCSI 需要) 1. 挂载完成后,点击右侧的 三个点图标 (...) -> iSCSI Commands & Information。 2. 复制 Attach Commands (通常是 3 行 iscsiadm 命令)。 3. SSH 登录 救援机 (Instance B),粘贴并执行这 3 行命令。 4. 执行 lsblk,确认能看到一个新的磁盘(通常是 40GB+),例如 sdb


6.2 执行 DD 覆写 (在救援机上)

⚠️ 警告:请务必确认目标磁盘是 sdb (或你挂载的盘),千万别写错成 sda (当前救援机的系统盘)!

我们将直接对 /dev/sdb 物理层面覆写 Debian 13 云镜像,并手动注入 SSH 公钥。请逐行执行,并注意替换其中的公钥为你自己的。

1. 下载 Debian 13 云镜像

直接拉取 AMD64 架构的 GenericCloud 镜像 (Trixie/Testing):

wget https://cloud.debian.org/images/cloud/trixie/daily/latest/debian-13-genericcloud-amd64-daily.raw
(如果求稳,可替换为 Bookworm/Stable 版)

2. 解除旧盘占用并执行 DD 覆写

确保当前 /dev/sdb 没有任何分区被意外挂载,然后开始无情覆写:

# 1. 卸载可能自动挂载的旧分区(报错未挂载可忽略)
sudo umount /dev/sdb1 /dev/sdb2 2>/dev/null

# 2. 将镜像完整刷入整块磁盘 /dev/sdb
sudo dd if=debian-13-genericcloud-amd64-daily.raw of=/dev/sdb bs=4M status=progress

# 3. 强制把内存缓存写入硬盘,确保数据不丢失(极其重要)
sudo sync

3. 刷新分区表并挂载新系统

刚刚 dd 完,系统内核还以为 /dev/sdb 是老样子,需要强行让它重新读取新刷入的 Debian 13 分区表:

# 1. 重读分区表
sudo partprobe /dev/sdb

> [!CAUTION]
> **常见报错处理 (GPT Warning)**:
> 如果执行 `partprobe` 时看到类似提示:
> `Warning: Not all of the space available to /dev/sdb appears to be used...`
> **这是正常现象**。因为 DD 写入的镜像分区表只认为硬盘有 2GB,而物理硬盘实际很大,GPT 备份表头位置不正确。
>
> **修复方案**(需要 `gdisk` 工具):
> ```bash
> # 1. 安装工具 (如果没有)
> sudo apt update && sudo apt install -y gdisk
>
> # 2. 修复 GPT 表头 (将备份头移至磁盘末尾)
> sudo sgdisk -e /dev/sdb
>
> # 3. 再次重读分区表
> sudo partprobe /dev/sdb
> ```

# 2. 查看新分区结构(此时应该能看到新的 sdb1 和 sdb2)
lsblk /dev/sdb
(注:通常 Debian 云镜像刷入后,sdb1 是 EFI 引导区,sdb2 才是根目录。)

挂载新系统的根目录到 /mnt

sudo mount /dev/sdb2 /mnt

4. 注入 SSH 公钥并开启 Root 登录(核心救砖步骤)

因为云镜像默认不带密码,不塞公钥进去开机必失联。

# 1. 创建 root 用户的 ssh 目录
sudo mkdir -p /mnt/root/.ssh

# 2. 写入你的公钥(⚠️ 务必把引用的内容换成你自己的真实公钥 ⚠️)
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...替换成你的公钥... user@host" | sudo tee /mnt/root/.ssh/authorized_keys

# 3. 赋予正确的权限,否则 SSH 服务会拒绝读取
sudo chmod 600 /mnt/root/.ssh/authorized_keys
sudo chmod 700 /mnt/root/.ssh

# 4. 允许 Root 使用密钥登录(修改 sshd_config)
# 注意这里是修改挂载盘里的配置,不是当前系统的!
sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin prohibit-password/' /mnt/etc/ssh/sshd_config

5. 卸载磁盘并断开 iSCSI 连接

配置搞定,安全撤退:

# 1. 卸载根目录
sudo umount /mnt

# 2. 断开 iSCSI 连接(直接使用你之前提供的 Target 和 Portal,或去 Oracle 后台复制 Detach Commands)
# 或者粗暴一点直接在 Oracle 后台 Detach,然后重启本机也没事,但推荐正确断开:
# sudo iscsiadm -m node -u

6.3 恢复与启动 (Oracle 后台操作)

  1. 分离救援机
    • 在 Oracle 后台,对挂载在 救援机 (Instance B) 上的卷点击 Detach。等待状态变回 Detached
  2. 挂载回故障机
    • 回到 故障机 (Instance A) 页面。
    • 点击 Resources -> Boot volume -> Attach boot volume
    • 选择刚才那个引导卷。
  3. 开机
    • 点击 Start。此时应该能看到 instance running。

6.4 开机后扩容 (Resize Filesystem)

因为 dd 刷入的镜像默认只有 2G 左右大小,开机后你需要手动扩容分区以利用完整硬盘空间。

SSH 登录新系统 (root + key) 后执行:

# 0. (可选) 如果提示 growpart command not found
apt update && apt install -y cloud-guest-utils

# 1. 扩容分区表 (自动检测并扩容根分区)
growpart /dev/sda 2

# 2. 在线扩容文件系统 (ext4)
resize2fs /dev/sda2

# 3. 验证空间
df -h
(注意:如果你的盘是 sda1 为根,请自行调整数字)