Linode Rescue Mode 与 Rebuild:救援磁盘、检查文件系统和恢复数据
Linode 无法正常启动时,可以先用 Rescue Mode 读取现有磁盘、复制数据或修复配置。Rescue Mode 会启动临时 Finnix 环境,不会主动删除实例磁盘。Rebuild 则会删除当前磁盘并重新部署系统。
Rebuild 会删除当前磁盘,删除后的数据无法找回。没有经过验证的实例外备份时,不要把 Rebuild 当成普通排障按钮。
先判断应该走哪条恢复路径
| 现象 | 优先动作 |
|---|---|
| 实例在运行,但公网或 SSH 不通 | 先查 Cloud Manager 状态、Lish、Cloud Firewall、主机防火墙和 SSH 日志 |
| 系统无法启动、配置损坏或需要离线检查磁盘 | 进入 Rescue Mode |
| 已有可用备份 | 优先恢复到测试实例,验证后再决定切换 |
| 疑似未经授权的入侵 | 新建全新实例,只迁移经过检查的数据与密钥,不继续信任旧系统 |
| 已完成实例外备份且决定从零部署 | 最后才考虑 Rebuild |
Rescue Mode 适合离线检查,不会自动判断根因。先保存 Cloud Manager 的 Activity Feed、启动日志、当前 Configuration Profile、磁盘名称与挂载关系,避免排障时失去原始证据。
进入 Rescue Mode 前的检查
- 在 Cloud Manager 验证 Launch Console / Lish 能打开。
- 记录正常启动所用的 Configuration Profile,以及每个磁盘对应的
/dev/sda、/dev/sdb等位置。 - 若仍能读取数据,先创建实例外备份;同一故障磁盘上的压缩包不是备份。
- 记录 Block Storage、加密、Cloud Firewall 和应用依赖,避免只恢复系统盘却遗漏数据盘。
如果只是忘记密码或 SSH 配置错误,Lish 可能已经足够。不要为了一个可以在线修复的问题直接进入 Rebuild。
启动 Rescue Mode 并确认磁盘映射
在 Cloud Manager 的 Rescue 表单中,将磁盘分配到与正常 Configuration Profile 相同的设备位置,并记下本次映射,例如系统盘被分配为 /dev/sda。
Akamai 当前文档说明,Rescue Mode 最多可分配多个磁盘,Finnix 自身使用单独设备。设备名不匹配可能使 chroot 按错误的 /etc/fstab 位置挂载磁盘,因此不要沿用旧教程里的 /dev/xvda 假设。
点击 Reboot into Rescue Mode,等待实例重新显示为 Running,再通过 Lish 进入 Finnix。先读取实际状态:
lsblk -f
blkid
findmnt
把 Cloud Manager 的磁盘标签、容量、文件系统和这里的输出逐项对应。本文后续用 /dev/sda 举例;只有本次 Rescue 映射与 lsblk -f 都确认它是目标系统盘时,才可使用。
先只读挂载并复制重要数据
先把设备保存为变量,避免后续命令混用不同磁盘。若实际设备不是 /dev/sda,先替换右侧值,并确认它尚未挂载:
ROOT_DEVICE=/dev/sda
if findmnt --source "$ROOT_DEVICE" >/dev/null; then
echo '目标设备仍在挂载,停止操作' >&2
exit 1
fi
blockdev --setro "$ROOT_DEVICE"
test "$(blockdev --getro "$ROOT_DEVICE")" -eq 1 || exit 1
lsblk -f "$ROOT_DEVICE"
普通的 mount -o ro 仍可能让 ext3/ext4 回放 journal。确认 FSTYPE 是 ext2、ext3 或 ext4 后,使用 noload 禁止回放,再挂载:
mkdir -p /mnt/linode-root
mount -o ro,noload "$ROOT_DEVICE" /mnt/linode-root
findmnt /mnt/linode-root
blockdev --setro 让块设备拒绝写入,ro,noload 避免 ext journal 恢复。XFS、Btrfs、LVM、加密盘或其他类型应停止使用这个挂载示例,改查对应文件系统的只读且不恢复日志选项。
挂载成功后,先检查业务数据、数据库文件、配置与日志是否存在。优先把不可替代的数据复制到另一台服务器、对象存储或本地设备,再尝试会写入磁盘的修复。
ls -la /mnt/linode-root
du -sh /mnt/linode-root/home /mnt/linode-root/var 2>/dev/null
需要整个磁盘镜像时,使用通过 SSH 复制 Linode 磁盘;不要把镜像写回同一块源磁盘。
文件系统检查只在未挂载时执行
e2fsck 只适用于 ext2/ext3/ext4 文件系统,并且只能对未挂载的目标设备执行。先核对 lsblk -f 的 FSTYPE,卸载目标盘,并确认它没有任何挂载点:
umount /mnt/linode-root || { echo '卸载失败,停止文件系统检查' >&2; exit 1; }
if findmnt --source "$ROOT_DEVICE" >/dev/null; then
echo '目标设备仍在挂载,停止文件系统检查' >&2
exit 1
fi
e2fsck -n "$ROOT_DEVICE"
findmnt 没有输出,才表示该设备当前未挂载。e2fsck -n 只做不写入的初步检查;它不能代替备份,也不能保证文件内容完整。
如果确认是 ext 文件系统、实例外数据副本已完成,并决定修复,再运行交互式检查:
blockdev --setrw "$ROOT_DEVICE"
test "$(blockdev --getro "$ROOT_DEVICE")" -eq 0 || exit 1
e2fsck -f "$ROOT_DEVICE"
逐项阅读修复提示,不要机械添加 -y。XFS、Btrfs 或其他文件系统必须使用各自官方工具,不能运行 e2fsck。
仅在确有需要时启用 Rescue SSH
Finnix 默认不接受 SSH。只有 SFTP、rsync 或整盘复制确实需要网络传输时,才从 Lish 设置临时密码并启动 Rescue 环境的 SSH:
passwd
service ssh start
Finnix 的 root 密码只属于本次临时救援环境,不会修改原系统磁盘上的 root 密码。Cloud Firewall 应只允许当前管理来源访问实际 SSH 端口,不要把 Rescue root 登录开放给整个互联网。
传输完成后停止临时 SSH,并删除为 Rescue 临时增加的防火墙规则:
service ssh stop
返回正常启动并验证
结束前同步写入并卸载仍然挂载的磁盘:
sync
if findmnt /mnt/linode-root >/dev/null; then
umount /mnt/linode-root || { echo '卸载失败,停止退出 Rescue' >&2; exit 1; }
fi
if findmnt --source "$ROOT_DEVICE" >/dev/null; then
echo '目标设备仍在挂载,停止退出 Rescue' >&2
exit 1
fi
blockdev --setrw "$ROOT_DEVICE"
上面的 findmnt 条件应不成立;若卸载失败,应先处理占用进程,不能带着未完成的写入直接启动。随后在 Cloud Manager 关机,明确选择原 Configuration Profile 再启动。
通过 Lish 观察启动日志。实例显示 Running 后,还要确认系统和服务确实恢复正常。
至少验证根文件系统、网络地址、SSH、失败服务、数据库和真实业务请求。若验证失败,再次进入 Rescue Mode 时保持相同设备映射,并依据已保存的证据回滚配置或恢复备份。
什么时候才使用 Rebuild
只有数据已经复制到实例外、备份可恢复,且明确接受删除当前磁盘时才使用 Rebuild。更稳妥的做法通常是在新实例恢复并验证,再切换流量,而不是先破坏唯一源盘。
疑似入侵时不要在旧系统上“修好后继续用”。应新建全新实例,轮换密码、SSH 密钥、API Token 与应用密钥,只迁移经过审查的数据,并保留旧实例用于取证或受控清理。
iVPSer 使用边界
iVPSer 控制台可用于查看当前可选实例方案;Rescue、磁盘映射、文件系统修复、应用恢复和数据验证由使用者在 Akamai Cloud Manager 与实例内完成。库存、系统和实例能力以实时控制台为准。