云计算国产化之路 vnc登录 文件系统直通(virtio-9p) 扩展qemu接口 gpg WARNING 珍藏博客 虚拟内存情况dommemstat分析 免密码自动登录脚本 Linux网桥 测试网段IP占用情况 Linux 进程状态 systemc强制依赖 调试openstack ut uefi p2v 重做ubuntu内核 virsh创建虚拟机简介 virtio IO路径 虚拟化层升级后磁盘无法卸载卷 vmtouch使用 Taint flags 主机和虚拟机文件共享处理的几种方法 kvm分析工具 kvm中对磁盘的io cache 虚拟化不同导致的guestos中软件安装差异(未解决) 设备直通(PCI Assignment)到底是咋整的 virtio到底是咋整的 内核启动参数 虚拟化实时性提升(零)之配置步骤 中断虚拟化(pic)到底是咋整的 中断虚拟化(apic)到底是咋整的 Raid卡配置丢失导致服务器无法启动 tainted kernels cpu stuck for 23s问题分析 虚拟化实时性提升(一)之hostOS切换为强实时系统 内存虚拟化到底是咋整的 qemu-kvm中vcpu虚拟化到底是咋整的 风河虚拟化技术点分析 使用qga的好处 qemu迁移代码分析 虚拟机串口配置及其导出到主机pts和console.log System-based I/O vs. Raw I/O 虚拟机使用Hugepage(大页) 硬件辅助分页(hardware assisted paging) 修改centos7默认启动项目 virtio的工作流程——kernel中virtio-pci初始化(2) virtio的工作流程——qemu中virtio-backend初始化(1) qmp ceilometer取不到memory.usage指标 Virtio-Balloon超详细分析 slabtop输出 虚拟机磁盘cache导致的host os kernel崩溃 虚拟机cpu和memory性能优化测评 PCI配置空间(PCI Configuration Space) centos下网卡设备直通(VT-dpci passthrough)遇到的问题及其解决思路 libguestfs详解 yum卸载软件包及其依赖 通过原始Centos ISO来定制自己的ISO centos下网卡设备直通(VT-d,pci passthrough) (占位符)window虚拟机中拔盘如何通知到libvirt和qemu后端的 cirrus漏洞分析CVE-2017-2615 XSA-208 qcow2随笔 控制寄存器概览 ceilometer对接postgresql 解压initrd和vmlinuz qemu guest agent验证 QEMU升级指南(待续) ubuntu中kdump的配置 qemu(2.3)接口梳理 热迁移导致的FC存储场景下的multipath卷残留问题分析 virsh命令(4)secret,snapshot,pool,volume部分 virsh命令(3)之interface,filter,network virsh命令(2)monitor,host,nodedev部分 virsh命令(1)之domain部分 QEMU内存管理之FlatView模型(QEMU2.0.0) ovirt基于sanock的高可用(主机粒度HA) Sanlock防脑裂场景功能测试用例 gnocchi配置及与ceilometer对接指南 make patch for libvirt in centos centos使用sanlock指导 高可用nfs资料 ubuntu14中使用sanlock指导 LVM操作指南 sanlock相关功能验证流程汇总 make patch for libvirt in ubuntu libvirt.so.0-version `LIBVIRT_PRIVATE_1.2.7' not found gdb debug libvirt 基于ubuntu社区源码包编译libvirt compile libvirt(centos) No PCI buses available nfs lead to Linux halt nfs install and config anti-virus for cloud platform nova fetch image from glance(something about _base) token auth process ovs入门指南 virt software anti-virus something about ceilometer disk sample context interview questions openstack vm injection openstack Restful and RPC murano 概览 创建虚拟机流程(compute节点)之网络创建 创建虚拟机流程之compute_api之虚拟机实例填充之配额检测 创建虚拟机流程之compute_api之基本参数生成 创建虚拟机流程之compute_api 创建虚拟机流程(主) 创建虚拟机之image 创建虚拟机流程之准备网桥 创建虚拟机流程之virt 创建虚拟机流程之compute节点 CI/CD研发流程之工程创建 CI/CD研发流程之代码合入 CI/CD研发流程之UT(单元测试) 向openstack社区合入代码记 openstack/ceilometer/gnocchi杂谈 影子页表原理 mem_add(exec.c) qemu编译安装调试 openstack/ceilometer/gnocchi之Grafana简介 openstack wiki etcd openstack计量ceilometer openstack计费cloudKitty enventlet backdoor USB 安装VMWARE ESX pycharm设置指南 无法执行modprobe -a kvm-intel解决办法 QEMU配置项 网络不通小记 libvirt之XML(虚拟机定义文件) openstack-horizon 证书认证 ceilometer与ceph对接 openstack定时任务剖析(TODO) 服务器重启后mongodb进程无法启动 ubuntu14下新增openstack服务到service的导引 ERROR 1045(28000)-数据库连不上 Python两个内置函数—locals和globals unknown exit, hardware reason 31

vm actions

2016年05月26日

本文基于这篇博文整理

boot

启动一个虚拟机

delete

关闭和删除一个虚拟机

  1. dom.destory
  2. dom.undefineFlags

resize-confirm

确认resize操作

resize-revert

取消resize操作

reboot

分为soft_boot和hard_boot

sof_reboot

依赖于guest os及其ACPI。

  1. Shutdown domain (domain.shutdown)
    shutdown domain 以后,客户机的磁盘存储处于可用状态,而且该 API 在命令发给 Guest OS 后立即返回
    客户程序需要不断检查其状态来判断是否shutdown 成功
  2. _create_domain
  3. Launch domain (domain.createWithFlags)

hard_reboot

  1. Destroy domain (virt_dom.destroy())
    而 destroy API 执行后,客户机的所有资源都会被归还给 Hypervisor
    (all resources used by it are given back to the hypervisor)
    它的过程是首先给客户机发送一个terminate 指令比如SIGTERM,如果在一定的时间内未成功则直接发送 SIGKILL 指令将虚机杀掉。
  2. 根据 domain 的信息,重新生成 domain 的配置 xml
  3. 根据 image 重新生成各镜像文件(包括 disk,disk.local 和 disk.swap)
  4. 连接各个 volume
  5. 将各个 interface 挂到 OVS 上
  6. 重新生成和应用 iptales 规则
  7. Define domain (conn.defineXML)
  8. Launch domain (domain.createWithFlags)

root-password

没有实现

resize

迁移虚拟机或者改变规格(flavor)

rebuild

重建虚拟机,可以用来撤离虚拟机或者实现HA等

  1. driver.destroy
    (destroy domain,detach volume connections,unplug VIF)
  2. driver.spawn

image-create

快照

start

启动虚拟机

  1. driver.hard

stop

停止虚拟机

  1. dom.destroy

pause

暂停虚拟机(数据存储于内存)

  1. dom.suspend

unpause

取消暂停

  1. dom.resume

suspend

挂起虚拟机(会将虚拟机数据同步到磁盘)

  1. _detach_pci_devices
  2. _detach_sriov_ports
  3. dom.managedSave(0)

resume

恢复挂起

  1. get domain xml
  2. _create_domain_and_network
  3. attach pci devices
  4. attach sriov port

migrate

迁移虚拟机

injectNetworkInfo

注:这个在命令行中没有,在rest接口中有
Set up basic filtering (MAC, IP, and ARP spoofing protection)
调用 _conn.nwfilterDefineXML(xml)

lock

直接在数据库中 instance 上面设置 lock = true

unlock

直接在数据库中 instance 上面设置 lock = false

backup

同 createImage
可以指定类型(daily 或者 weekly),和保存的 image 的最大数目
老的image会被删除 {“backup_type”: “daily”, “rotation”: “2”, “name”: “bk”}

live-migration

热迁移

reset-state

传入 state 参数,直接修改数据库中 instance 的状态

get-vnc-console

  1. 用户查询 VNC 的访问 URL | nova get-vnc-console
  2. 过 RPC 调用虚机所在的 node 上的 Nova 生成一个 UUID(长度为 4)格式的 token以及格式为 ‘?token=’ 的 Access URL。
  3. 本地Nova 调用 libvirt driver 从 domain xml 中获取 port
  4. 以及从 confi.vncserver_proxyclient_address 获取 host
  5. 通过 RPC,调用 consoleauth 的 authorize_console 方法,它将 Access URL, host,port 保存到 memcached。
  6. 返回 Access URL 给客户端,比如

    http://192.168.1.20:6080/vnc_auto.html?token=8dc6f7cb-2e2d-4fbe-abab-3334fe3a19dc

  7. 在客户端浏览器上打开 Access URL,由 Controller 上的 nova-novncproxy 接收并处理
  8. nova-novncproxy 通过 RPC 调用 consoleauth.check_token() 方法
    获取 console_type 和 port 等 connect info。期间还会到目的node上去校验这些信息。
  9. 连接到目的 node,握手,开始 proxying。

console-log

读取 虚机的 console.log 文件并返回其内容;
如果没有这文件的话,则使用 “pty”,将其内容写入到 consolue文件并返回其内容。

restore

Restore a previously deleted (but not reclaimed) instance。直接修改数据库。

force-delete

有 snapshot,则全部删除;然后从 DB 中删除 instance.

evacuate

从 DB 中读取 instance 数据,在一个新的主机上 rebuild。
它尽可能地将原来的虚机在新的主机上恢复:

  • 虚机的配置:从 DB 中获取,包括 image,block,network 等
  • 虚机的数据:如果使用共享存储,则使用共享存储上的虚机数据;如果不使用共享存储,则无法恢复数据
  • 内存状态:无法恢复

详细见本人其他博文,这里

flavor-access-add/flavor-access-remove

修改 DB 中flavor表
新版本,在nova_api这个database下的flavors表中
不再在nova这个database的instance_types这个表中了(真能折腾)

floating-ip-create/loating-ip-delete

分别调用network_api.associate_floating_ip和network_api.disassociate_floating_ip

fixed-ip-reserve

  1. network_api.add_fixed_ip_to_instance
  2. firewall_driver.setup_basic_filtering

fixed-ip-unreserve

  1. network_api.remove_fixed_ip_from_instance
  2. firewall_driver.setup_basic_filtering(instance, nw_info)

disassociate_host

注:这个在命令行中没有,在rest接口中有
Associate or disassociate host or project to network。

  1. network_api.associate

network-disassociate

  1. network_api.associate

network-associate-host

  1. network_api.associate

rescue

使用场景是,虚机的启动盘的一个文件被误删除了导致无法再次启动了,或者 admin 的密码忘记了。
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)

unrescue

  1. 读取之前保存的 unrescue.xml 文件
  2. 将 rescued domain destroy 掉
  3. 定义和启动新的domain(同上面5和6)
  4. 删除 unrescue.xml 文件

add-secgroup

  1. security_group_rpcapi.refresh_security_group_rules

secgroup-delete

  1. security_group_rpcapi.refresh_security_group_rules

shelve

当一个虚机不需要使用的时候,可以将其 shelve 起来。
该操作会创建该虚机的一个快照并传到 Glance 中,然后在 Hypervisor 上将该虚机删除,从而释放其资源。
其主要过程为:

  1. destroy 虚机 (virt_dom.destroy())
  2. snapshot 该 domain
  3. 如果 CONF.shelved_offload_time == 0 的话,将domain 的各种资源(interface,volume,实例文件等)
  4. undefine (virt_dom.undefine())

存在于数据库中,可以通过nova-list查看 存在于glance中,可以通过glance image-list查看

shelve-offload

移除shelve的虚拟机

unshelve

  1. 从 DB 中获取 network_info 和 block_d
  2. evice_info
  3. 从 Glance 中获取 image
  4. 象新建一个虚拟那样 spawn 新的虚机
  5. 调用 image API 将 image 删除