感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!
如有转载,请保留源作者博客信息。
如需交流,欢迎大家博客留言。
if live and not rebuild and not flavor: self._live_migrate(context, instance, scheduler_hint, block_migration, disk_over_commit) elif not live and not rebuild and flavor: instance_uuid = instance['uuid'] with compute_utils.EventReporter(context, self.db, 'cold_migrate', instance_uuid): self._cold_migrate(context, instance, flavor, scheduler_hint['filter_properties'], reservations) |
virsh使用qemu+tcp访问远程libvirtd
修改文件
vim /usr/local/libvirt/etc/sysconfig/libvirtd
用来启用tcp的端口(本环境中由于libvirt升级过,配置文件目录不一致,默认为/etc/sysconfig/libvirtd)
1 2 3 | LIBVIRTD_CONFIG=/usr/local/libvirt/etc/libvirt/libvirtd.conf LIBVIRTD_ARGS="--listen" |
修改文件
vim /usr/local/libvirt/etc/libvirt/libvirtd.conf
1 2 3 4 5 6 7 8 9 | listen_tls = 0 listen_tcp = 1 tcp_port = "16509" listen_addr = "0.0.0.0" auth_tcp = "none" |
运行 libvirtd
1 | service libvirtd restart |
Configuration option = Default value | Description |
---|---|
[DEFAULT] | |
live_migration_retry_count = 30 | (IntOpt) Number of 1 second retries needed in live_migration |
[libvirt] | |
live_migration_bandwidth = 0 | (IntOpt) Maximum bandwidth to be used during migration, in Mbps |
live_migration_flag = VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED | (StrOpt) Migration flags to be set for live migration |
live_migration_uri = qemu+tcp://%s/system | (StrOpt) Migration target URI (any included "%s" is replaced with the migration target hostname) |
def _live_migration(self, context, instance, dest, post_method, recover_method, block_migration=False, migrate_data=None): """Do live migration. :param context: security context :param instance: nova.db.sqlalchemy.models.Instance object instance object that is migrated. :param dest: destination host :param post_method: post operation method. expected nova.compute.manager.post_live_migration. :param recover_method: recovery method when any exception occurs. expected nova.compute.manager.recover_live_migration. :param block_migration: if true, do block migration. :param migrate_data: implementation specific params """ # Do live migration. try: if block_migration: flaglist = CONF.libvirt.block_migration_flag.split(',') else: flaglist = CONF.libvirt.live_migration_flag.split(',') flagvals = [getattr(libvirt, x.strip()) for x in flaglist] logical_sum = reduce(lambda x, y: x | y, flagvals) dom = self._lookup_by_name(instance["name"]) LOG.error('1-start------------------------------------------') LOG.error('dom==%s' % dom) LOG.error('live_migration_uri==%s' % CONF.libvirt.live_migration_uri) LOG.error('dest==%s' %dest) LOG.error('logical_sum==%s' % logical_sum) LOG.error('live_migration_bandwidth==%s' % CONF.libvirt.live_migration_bandwidth) LOG.error('1-end------------------------------------------') dom.migrateToURI(CONF.libvirt.live_migration_uri % dest, logical_sum, None, CONF.libvirt.live_migration_bandwidth) except Exception as e: with excutils.save_and_reraise_exception(): LOG.error(_("Live Migration failure: %s"), e, instance=instance) recover_method(context, instance, dest, block_migration) |
LIBVIRT_DEBUG=1 virsh list --all
virsh -c qemu+tcp://node32/system |
virsh migrate --live --verbose --direct --p2p 5 qemu+tcp://node32/system
def wait_for_live_migration(): """waiting for live migration completion.""" try: self.get_info(instance)['state'] #此处一直获取实例状态,当实例被迁移走了,就会出现异常,说明迁移成功 except exception.InstanceNotFound: timer.stop() post_method(context, instance, dest, block_migration, migrate_data) |
if (not is_shared_storage) or (CONF.libvirt.images_type == 'rbd') : |
def wait_for_live_migration(): """waiting for live migration completion.""" try: self.get_info(instance)['state'] #此处一直获取实例状态,当实例被迁移走了,就会出现异常,说明迁移成功 except exception.InstanceNotFound: timer.stop() post_method(context, instance, dest, block_migration, migrate_data) |
def wait_for_live_migration(): """waiting for live migration completion.""" try: self.get_info(instance)['state'] except exception.InstanceNotFound: #add by ttx 2014-10-30 if (CONF.libvirt.images_type == 'rbd' and os.path.exists(inst_base)): utils.execute('rm', '-rf', inst_base) timer.stop() post_method(context, instance, dest, block_migration, migrate_data) timer.f = wait_for_live_migration timer.start(interval=0.5).wait() |
1 安装libvirt1.1.2
- openstack安装脚本openstack_init_env.sh中去掉libvirt的安装,当openstack_init_env.sh执行完之后,手动安装libvirt-1.1.2,安装完之后再执行后续的自动部署脚本。
- 安装libvirt-1.1.2:
解压libvirt-1.1.2源码安装包,进入源码目录
yum install -y libpciaccess-devel device-mapper-devel libnl-devel yajl-devel yajl ./configure --prefix=/usr/local/libvirt/ make make install mkdir -p /var/run/libvirt mkdir -p /usr/local/libvirt/var/lock/subsys cp -rf /usr/local/libvirt/bin/* /usr/bin/ cp -rf /usr/local/libvirt/sbin/* /usr/sbin/ cp -rf /usr/local/libvirt/libexec/* /usr/libexec/ cp -rf /usr/local/libvirt/etc/rc.d/init.d/* /etc/rc.d/init.d/ cp -rf /etc/init.d/functions /usr/local/libvirt/etc/rc.d/init.d/ cp -rf /usr/local/libvirt/lib64/python2.6/site-packages/* /usr/lib64/python2.6/site-packages/ cp -rf /usr/local/libvirt/etc/sysconfig/* /etc/sysconfig/ cp -rf /usr/local/libvirt/var/run/libvirt/* /var/run/libvirt check_file_exist "/usr/local/libvirt/etc/libvirt/libvirtd.conf" sed -i "/^[[:blank:]]*#[[:blank:]]*unix_sock_group/s/#unix_sock_group/unix_sock_group/g" /usr/local/libvirt/etc/libvirt/libvirtd.conf sed -i "/^[[:blank:]]*#[[:blank:]]*unix_sock_ro_perms/s/#unix_sock_ro_perms/unix_sock_ro_perms/g" /usr/local/libvirt/etc/libvirt/libvirtd.conf sed -i "/^[[:blank:]]*#[[:blank:]]*unix_sock_rw_perms/s/#unix_sock_rw_perms/unix_sock_rw_perms/g" /usr/local/libvirt/etc/libvirt/libvirtd.conf sed -i "/^[[:blank:]]*#[[:blank:]]*auth_unix_ro/s/#auth_unix_ro/auth_unix_ro/g" /usr/local/libvirt/etc/libvirt/libvirtd.conf sed -i "/^[[:blank:]]*#[[:blank:]]*auth_unix_rw/s/#auth_unix_rw/auth_unix_rw/g" /usr/local/libvirt/etc/libvirt/libvirtd.conf groupadd libvirt service libvirtd start |
- 继续执行剩余的自动部署脚本。
2、 配置libvirt1.1.2
修改文件
vim /usr/local/libvirt/etc/sysconfig/libvirtd
用来启用tcp的端口(本环境中由于libvirt升级过,配置文件目录不一致,默认为/etc/sysconfig/libvirtd)
1 2 3 | LIBVIRTD_CONFIG=/usr/local/libvirt/etc/libvirt/libvirtd.conf LIBVIRTD_ARGS="--listen" |
修改文件
vim /usr/local/libvirt/etc/libvirt/libvirtd.conf
1 2 3 4 5 6 7 8 9 | listen_tls = 0 listen_tcp = 1 tcp_port = "16509" listen_addr = "0.0.0.0" auth_tcp = "none" |
运行 libvirtd
1 | service libvirtd restart |