한가지 놓친 부분이 있네요.. 타입말고도 더 비교하는 부분이 있습니다. Qcow2 타입일 경우 instance path 가 공유되는 위치라면 아래의 값은 True 라서 is_shared_storage 는 True 가 됩니다. dest_check_data.get('is_shared_instance_path') or self.image_backend.backend().is_file_in_instance_path()): 이미지 형태에 따라 값이 달라지니 경우에 따라 소스를 따라가 보세요. 여기서 image_backend.backend() 는 nova/virt/libvirt/imagebackend.py 의 Backend 클래스에서 이미지의 값에 따라 정의됩니다. -----Original Message----- From: "안승규"<dappy@naver.com> To: <openstack-ko@lists.openstack.org>; Cc: Sent: 2015-03-08 (일) 22:49:32 Subject: Re: [openstack-ko] live migration 관련 질문 안녕하세요. 5040 라인에 답이 있네요.. self._is_shared_block_storage(instance, dest_check_data)}) 위 메소드를 들어가보면 백엔드를 쓰는데 conf 의 [ libvirt ] 에서 images_type 이 rbd 가 아니면 is_shared_block_storage 값이 모두 false 네요. Qcow2, Lvm, Ploop 타입은 false, Rbd 만 True 결국 Ceph 의 rbd 타입이 아니면 is_shared_block_storage 값은 false 입니다. block migration 옵션 안주고 하실려면 소스 수정하세요.. -----Original Message----- From: "김정석(Cloud운영기술팀)"<ironman.kim@kt.com> To: "openstack-ko@lists.openstack.org"<openstack-ko@lists.openstack.org>; Cc: "송덕한(Cloud운영기술팀)"<ascacults@kt.com>; "안선희(차세대Cloud개발팀)"<sunhee.ahn@kt.com>; "최성삼(Cloud운영기술팀)"<choi.sungsam@kt.com>; Sent: 2015-03-06 (금) 16:08:03 Subject: [openstack-ko] live migration 관련 질문 페이스북에 질문 하면 답변 안해준다고 하니 메일링으로 쏩니다 ^^ NFS 볼륨으로 구축한 Openstack Juno버전에서 Live Migration 을 실행해보니 Shared볼륨이 아니라서 마이그레이션을 할 수 없다는 에러가 발생 하여 관련 소스를 좀 열어 봤습니다. 혹시나 해서 Grizzly, Icehouse, Juno 를 모두 비교 해보고 있는데 Juno는 소스가 많이 바뀌었네요 /usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py" # Grizzly 2885 # Checking shared storage connectivity 2886 # if block migration, instances_paths should not be on shared storage. 2887 source = CONF.host 2888 filename = dest_check_data["filename"] 2889 block_migration = dest_check_data["block_migration"] 2890 is_volume_backed = dest_check_data.get('is_volume_backed', False) 2891 2892 shared = self._check_shared_storage_test_file(filename) 2893 2894 if block_migration: 2895 if shared: 2896 reason = _("Block migration can not be used " 2897 "with shared storage.") 2898 raise exception.InvalidLocalStorage(reason=reason, path=source) 2899 self._assert_dest_node_has_enough_disk(ctxt, instance_ref, 2900 dest_check_data['disk_available_mb'], 2901 dest_check_data['disk_over_commit']) 2902 2903 elif not shared and not is_volume_backed: 2904 reason = _("Live migration can not be used " 2905 "without shared storage.") 2906 raise exception.InvalidSharedStorage(reason=reason, path=source) 2907 dest_check_data.update({"is_shared_storage": shared}) 2908 return dest_check_data 2909 # Icehouse 4279 # Checking shared storage connectivity 4280 # if block migration, instances_paths should not be on shared storage. 4281 source = CONF.host 4282 filename = dest_check_data["filename"] 4283 block_migration = dest_check_data["block_migration"] 4284 is_volume_backed = dest_check_data.get('is_volume_backed', False) 4285 has_local_disks = bool( 4286 jsonutils.loads(self.get_instance_disk_info(instance['name']))) 4287 4288 shared = self._check_shared_storage_test_file(filename) 4289 4290 if block_migration: 4291 if shared: 4292 reason = _("Block migration can not be used " 4293 "with shared storage.") 4294 raise exception.InvalidLocalStorage(reason=reason, path=source) 4295 self._assert_dest_node_has_enough_disk(context, instance, 4296 dest_check_data['disk_available_mb'], 4297 dest_check_data['disk_over_commit']) 4298 4299 elif not shared and (not is_volume_backed or has_local_disks): 4300 reason = _("Live migration can not be used " 4301 "without shared storage.") 4302 raise exception.InvalidSharedStorage(reason=reason, path=source) 4303 dest_check_data.update({"is_shared_storage": shared}) # Juno 5031 # Checking shared storage connectivity 5032 # if block migration, instances_paths should not be on shared storage. 5033 source = CONF.host 5034 5035 dest_check_data.update({'is_shared_instance_path': 5036 self._check_shared_storage_test_file( 5037 dest_check_data['filename'])}) 5038 5039 dest_check_data.update({'is_shared_block_storage': 5040 self._is_shared_block_storage(instance, dest_check_data)}) 5041 5042 if dest_check_data['block_migration']: 5043 if (dest_check_data['is_shared_block_storage'] or 5044 dest_check_data['is_shared_instance_path']): 5045 reason = _("Block migration can not be used " 5046 "with shared storage.") 5047 raise exception.InvalidLocalStorage(reason=reason, path=source) 5048 self._assert_dest_node_has_enough_disk(context, instance, 5049 dest_check_data['disk_available_mb'], 5050 dest_check_data['disk_over_commit']) 5051 5052 elif not (dest_check_data['is_shared_block_storage'] or 5053 dest_check_data['is_shared_instance_path']): 5054 reason = _("Live migration can not be used " 5055 "without shared storage.") 5056 raise exception.InvalidSharedStorage(reason=reason, path=source) 현재 Juno 버전에서 Exception이 발생하는곳이 마지막 줄에서 걸린 것으로 확인 됩니다. 혹시 dest_check_data['is_shared_block_storage']의 값을 어디서 가져와서 if 구문을 처리하는지 아시는분 계시나요 ? _______________________________________________ openstack-ko mailing list openstack-ko@lists.openstack.org http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-ko