nova rescue原理笔记
说明:场景示例,虚机的启动盘的一个文件被误删除了导致无法再次启动了,或者 admin 的密码忘记了。Rescue 功能提供一个解决这类问题的手段。
备注:21.0.0版本前,不能rescue 一个 volume-backed instance
需要确认rescure前的云主机为runing状态,rescure途中不能进行关机,重启,挂亲等操作
前提
默认情况下,实例从提供的救援映像或新的映像启动 原始实例映像的副本(如果未提供救援映像)。根源 磁盘和可选的重新生成的配置驱动器也连接到实例 用于数据恢复。 从 21.0.0 版本开始,可以使用额外的稳定设备救援模式。 此模式现在支持卷备份实例的救援。 要执行实例救援,请使用 openstack server rescue 命令: openstack server rescue SERVER 当实例运行在rescue模式时,不可执行Pause, suspend, 与stop 操作,这些行为会造成实例原始状态丢失,并且会导致无法对实例unrescue. 在运行 openstack server rescue 命令时, 实例首先执行软关闭。这意味着 客户机会先关闭操作系统再关闭电源。 关机行为由可在nova.conf文件中的shutdown_timeout字段配置。 它的值代表允许客户机操作系统完成关闭时间。 os_shutdown_timeout字段可以基于每个映像覆盖超时值 通过它是一个图像元数据 允许不同类型的操作系统指定的设置 他们需要多少时间才能彻底关闭。 要拯救从卷启动的实例,您需要使用 2.87 微版本或更高版本。 openstack --os-compute-api-version 2.87 server rescue SERVER 如果要使用特定映像来拯救实例,而不是 默认一个,使用参数:--image openstack server rescue --image IMAGE_ID SERVER 要从普通启动盘重新启动实例,请运行以下命令 命令: openstack server unrescue SERVER
执行 nova rescue 命令后的主要过程是:
(1)保存目前domain 的 xml 配置到 unrescue.xml 文件
(2)根据 image 重新生成启动盘 disk.swap (大小不受 falvor.root_disk_size 控制,尽可能小的一个文件)
(3)构造一个新的 domain 的 xml 配置,使用 disk.rescue 做启动盘,将原来的 disk 挂载到该 domain,其他的盘和volume不会被挂载
(4)将原来的 domain destroy 掉 (virt_dom.destroy)
(5)定义新的 domain (conn.defineXML(xml))
(6)启动新的 domain (domain.createWithFlags)
至此,nova rescue 的过程完成。用户可以 ssh 到新的虚机,修改 “Vdb“分区中的受损害的文件。然后执行 ”nova unrescue“命令。其主要过程是:
(1)读取之前保存的 unrescue.xml 文件
(2)将 rescued domain destroy 掉
(3)定义和启动新的domain(同上面5和6)
(4)删除 unrescue.xml 文件
注意,这时候文件夹中的 libvirt.xml 文件和新运行的 domain 的 xml 不一致,因为代码中没有将新的 domain 的xml 写到该文件。
参考:nova Rescue 和 Unrescue - allcloud - 博客园 (cnblogs.com)
Rescue an instance — nova 29.1.0.dev15 documentation (openstack.org)