挂载引导卷修复 OCI 实例
在系统无法启动或登录时,将 OCI 引导卷作为数据卷附加到救援实例,按只读优先方式修复配置并安全重挂。
[!danger] 高风险操作 停机、分离和重新附加错误的引导卷可能造成更长停机或数据损坏。操作前按 OCID 确认源实例、卷和救援实例,创建可用备份,并禁止使用硬编码的
/dev/sdb2猜设备。
挂载引导卷修复 OCI 实例
目标
在普通 SSH、Run Command 和控制台连接都无法恢复时:
- 安全停止故障实例;
- 把引导卷作为数据卷附加到救援实例;
- 先只读识别分区和数据;
- 备份后修复 SSH、网络、fstab 或防火墙配置;
- 卸载、分离并重新作为原实例引导卷;
- 启动并完成回归验证。
前置条件
- 救援实例与引导卷位于兼容的 Availability Domain;
- 救援实例可以正常 SSH;
- 有块存储附加/分离权限;
- 故障实例的 Boot Volume OCID 已记录;
- 有最新备份或接受停机风险;
- 对 Linux 分区、mount 和权限有基本理解。
1. 保存证据并创建备份
记录:
Broken instance OCID:
Boot volume OCID:
Rescue instance OCID:
Availability Domain:
Original attachment type:
Original device/path:
Failure time and last change:
如果平台允许,先创建引导卷手动备份。备份是 crash-consistent,不保证应用一致,但比直接修改唯一卷安全。
2. 停止故障实例
在 Compute 控制台执行 Stop,等待状态明确变为 Stopped。不要在仍运行时强制分离引导卷。
3. 分离引导卷
进入故障实例的 Boot Volume 资源页,按 OCID 确认目标后 Detach。等待 attachment 状态变为 Detached。
4. 作为数据卷附加到救援实例
在 Boot Volume 详情选择 Attach to instance,将其附加到救援实例:
- 优先 Paravirtualized,除非场景要求 iSCSI;
- 初始能选择只读访问时优先只读;
- 不替换救援实例自己的引导卷;
- 等待 Attached 后再进入系统。
5. 在救援机识别新设备
附加前后比较:
lsblk -o NAME,SIZE,FSTYPE,UUID,MOUNTPOINTS,MODEL
sudo blkid
sudo dmesg --ctime | tail -n 80
根据大小、UUID、分区表和附加时间识别,不根据论坛示例猜 /dev/sdb2。
设置变量示例:
RESCUE_PARTITION=/dev/sdb2 # 必须替换为实际确认的分区
sudo install -d -m 700 /mnt/oci-rescue
6. 只读挂载和检查
ext4:
sudo mount -o ro,noload "$RESCUE_PARTITION" /mnt/oci-rescue
XFS:
sudo mount -o ro,norecovery "$RESCUE_PARTITION" /mnt/oci-rescue
检查:
findmnt /mnt/oci-rescue
sudo ls -la /mnt/oci-rescue
sudo sed -n '1,160p' /mnt/oci-rescue/etc/fstab
sudo find /mnt/oci-rescue/etc/ssh -maxdepth 2 -type f -printf '%p\n'
先复制重要配置和数据到独立备份,再决定读写修复。
7. 切换读写并修复
卸载只读挂载,再按确认的文件系统读写挂载:
sudo umount /mnt/oci-rescue
sudo mount "$RESCUE_PARTITION" /mnt/oci-rescue
修复 SSH 配置
stamp=$(date +%Y%m%d-%H%M%S)
sudo cp -a /mnt/oci-rescue/etc/ssh "/mnt/oci-rescue/etc/ssh.rescue-$stamp"
sudoedit /mnt/oci-rescue/etc/ssh/sshd_config
sudo find /mnt/oci-rescue/etc/ssh/sshd_config.d -maxdepth 1 -type f -print 2>/dev/null
重点检查非法端口、重复 Include、AllowUsers、密钥认证和语法错误。不要删除整个 SSH 目录。
恢复公钥
以 operator 为例:
sudo install -d -m 700 -o 1000 -g 1000 /mnt/oci-rescue/home/operator/.ssh
printf '%s\n' 'ssh-ed25519 AAAA... trusted-client' | sudo tee /mnt/oci-rescue/home/operator/.ssh/authorized_keys >/dev/null
sudo chmod 600 /mnt/oci-rescue/home/operator/.ssh/authorized_keys
sudo chown -R 1000:1000 /mnt/oci-rescue/home/operator/.ssh
先从 /mnt/oci-rescue/etc/passwd 查实际 UID/GID,不盲用 1000。只写入本地已有公钥,绝不把私钥复制到服务器。
修复 fstab
错误 UUID 会让系统进入 emergency mode。用 blkid 与 fstab 对照,注释非关键错误挂载时保留备份和原因。
文件系统检查
fsck 必须在分区未挂载时执行,并先有备份:
sudo umount /mnt/oci-rescue
sudo fsck -fn "$RESCUE_PARTITION" # 只读检查
只有理解报告和风险后才进行写修复。
8. 卸载并分离
sync
sudo umount /mnt/oci-rescue
lsblk -o NAME,MOUNTPOINTS
确认目标分区没有挂载,再从 OCI 控制台把该卷从救援实例 Detach。
9. 重挂原实例并启动
按照 Oracle 官方 Boot Volume Attachment 流程,把卷重新作为故障实例的引导卷附加。确认 attachment 状态和 OCID 后启动实例。
先观察 Console History,再测试 SSH。
回归验证
- 实例完成启动且无文件系统错误
- SSH 新会话成功
- sudo 成功
-
sshd -t通过 - 网络、UFW 和服务符合预期
- 数据完整且应用启动
- 救援机没有残留挂载或敏感数据
- 临时公钥和宽松规则已清理
- 创建新的已知良好备份
Related notes
- 所属 MOC:甲骨文云服务器 MOC
- 恢复阶梯:OCI 服务器生命周期与恢复阶梯
- 控制台恢复:使用控制台连接恢复 OCI 实例
- 官方文档:Attaching a Boot Volume