服务器重装实操 (OS Reinstallation SOP)¶
[!WARNING] 高危操作:DD 脚本会完全抹除当前硬盘的所有数据。执行前请确认数据已备份。 适用环境:Oracle Cloud Always Free (AMD 1G / ARM都可以)。 目标系统:Debian 13 (Trixie) 或 Debian 12 (Bookworm)。
1. 准备工作¶
- 备份数据:确认关键数据 (Docker Volume, Configs) 已离线备份。
- Oracle 控制台访问:确保你能登录 Oracle Cloud Console,以便在 SSH 挂掉时通过 "Cloud Shell" 救急。
- 获取 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 更友好。
执行后现象¶
- 终端会显示一堆 Log,最后提示
Rebooting...。 - SSH 必定断开。
- 等待时间: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 系统层优化¶
- 更新系统:
apt update && apt upgrade -y - 启用 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
4.2 创建日常运维用户 (Recommended)¶
- 新建用户 (例如
ops):adduser ops passwd root: BI7DHPjMqn*Mob&S kanon: YDp&V8fy86Hlnecd mahiru: TD*UX4%P82JFkaAe # 💡 密码策略提醒: # - Root 密码:用于 VNC/Console 救急 (必须复杂,存入密码管理器)。 # - Ops 密码:用于 sudo 提权 (日常频繁使用,建议设置好记但安全的,或者配置 NOPASSWD)。 # 结论:两个密码都需要妥善保存。 - 授予 sudo 权限:
usermod -aG sudo ops - 配置免密 sudo (可选,推荐熟练工):
如果你不想每次输命令都敲密码,可以配置 NOPASSWD。
- 风险: 一旦 SSH Key 被盗,黑客直接获得 Root 权限(少了最后一道防线)。
- 命令:
echo "ops ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ops chmod 440 /etc/sudoers.d/ops
- 切换到新用户配置 SSH Key:
su - ops mkdir -p ~/.ssh nano ~/.ssh/authorized_keys # 粘贴你的公钥 (id_ed25519.pub) chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh - 验证 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:(配置后请退出 SSH 会话并重新连接以使权限生效)sudo usermod -aG docker ops
5. 常见问题 (FAQ)¶
- Q: 只有 1G 内存,Debian 13 跑得动吗?
- A: 只要不装 GUI,Debian 13 裸机仅占 ~80MB 内存,非常适合。强烈建议开启 Swap。
- Q: 脚本卡在 "Downloading" 不动了?
- A: Oracle 的网络有时连 Github 慢。可以尝试 Ctrl+C 重新运行,或指定国内镜像源 (脚本支持
-mirror参数,但在海外机器通常不需要)。
- A: Oracle 的网络有时连 Github 慢。可以尝试 Ctrl+C 重新运行,或指定国内镜像源 (脚本支持
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
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
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 后台操作)¶
- 分离救援机:
- 在 Oracle 后台,对挂载在 救援机 (Instance B) 上的卷点击 Detach。等待状态变回
Detached。
- 在 Oracle 后台,对挂载在 救援机 (Instance B) 上的卷点击 Detach。等待状态变回
- 挂载回故障机:
- 回到 故障机 (Instance A) 页面。
- 点击 Resources -> Boot volume -> Attach boot volume。
- 选择刚才那个引导卷。
- 开机:
- 点击 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 为根,请自行调整数字)