{"id":7651,"date":"2015-04-09T16:06:24","date_gmt":"2015-04-09T14:06:24","guid":{"rendered":"http:\/\/blog.zhaw.ch\/icclab\/?p=7651"},"modified":"2015-05-07T15:06:05","modified_gmt":"2015-05-07T13:06:05","slug":"tunneled-hybrid-live-migration","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/","title":{"rendered":"Tunneled Hybrid Live Migration"},"content":{"rendered":"<p>In our previous blog posts we mostly focused on virtual machine live migration performance comparing <a href=\"http:\/\/en.wikipedia.org\/wiki\/Live_migration#Pre-copy_memory_migration\">pre-copy<\/a>, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Live_migration#Post-copy_memory_migration\">post-copy<\/a> and hybrid approaches in an <a href=\"https:\/\/www.openstack.org\/\">Openstack<\/a> context rather than exploring other live migration features. <a href=\"http:\/\/libvirt.org\/\">Libvirt<\/a> together with the <a href=\"http:\/\/wiki.qemu.org\/Main_Page\">Qemu<\/a> hypervisor provides many migration configuration options. One of these options is a possibility to use tunneled live migration. Recently we found that the current libvirt tunneling implementation is not supported in post-copy migration. Consequently, In order to make the post-copy patch more production ready we decided to support the community and add support for post-copy tunneled live migration to libvirt on our own. This blog post describes the whole story of immersing ourselves into the open source community and hacking an established open source project since we believe this experience can be generalized.<!--more--><\/p>\n<p>Since live migration is essentially a process of transferring complete virtual machine RAM, the constituent data stream can contain sensitive and confidential user information; consequently, it is necessary to separate this traffic from the other guest network traffic. In many Openstack environments physical network separation or <a href=\"http:\/\/en.wikipedia.org\/wiki\/Virtual_LAN\">VLAN<\/a> tagging is used to isolate different traffic types. In the cases where traffic separation is not possible libvirt\u2019s tunneling feature can be used instead. However since tunneling uses extra libvirtd-to-Qemu and Qemu-to-libvirtd data handling on both the source and the destination side it may perform worse than native live migration. <a href=\"https:\/\/libvirt.org\/internals\/rpc.html#security\">Libvirt RPC protocol<\/a> used for tunneled LM provides, amongst the other, data encryption. Also, using tunneling, there is no need for any hypervisor specific network and firewall configuration since only one port per host is used no matter how many simultaneous parallel migrations are in progress. In contrast using the native direct guest-to-guest migration Qemu opens a new connection on a new port for each migration separately. So, there are some good reasons why the tunneled approach could be considered in preference to the native approach.<\/p>\n<figure id=\"attachment_7652\" aria-describedby=\"caption-attachment-7652\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-7652 size-medium\" src=\"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1-300x115.png\" alt=\"Untitled Diagram (1)\" width=\"300\" height=\"115\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1-300x115.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1-500x192.png 500w, https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1.png 532w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-7652\" class=\"wp-caption-text\">Fig 1. &#8211; Native post-copy live migration code flow<\/figcaption><\/figure>\n<p>To enable tunneled live migration in an Openstack context just add the VIR_MIGRATE_TUNNELLED flag to your current live_migration_flags in the nova.conf file, restart the nova-compute service and you are all set for tunneled live migration in most cases. Unfortunately, if you want to use tunneling for post-copy live migration this will not work. The reason why tunneled post-copy live migration doesn\u2019t work is simple &#8211; the post-copy algorithm by its very nature requires bi-directional communication between the source and the destination virtual machine while libvirt currently supports only unidirectional tunnels (which are sufficient for pre-copy live migration). The channel from the source to the destination is used for transferring of VM\u2019s memory pages. The other direction, from the destination to the source is used by the post-copy algorithm for requesting particular missing memory pages. (If you don\u2019t understand why, you need to read up a bit more on <a href=\"http:\/\/en.wikipedia.org\/wiki\/Live_migration#Post-copy_memory_migration\">post-copy live migration<\/a>.)<\/p>\n<figure id=\"attachment_7653\" aria-describedby=\"caption-attachment-7653\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-7653 size-medium\" src=\"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-3-300x115.png\" alt=\"Post-copy live migration data flow\" width=\"300\" height=\"115\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-3-300x115.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-3-500x192.png 500w, https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-3.png 532w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-7653\" class=\"wp-caption-text\">Fig 2. &#8211; Tunneled post-copy live migration code flow<\/figcaption><\/figure>\n<p>Unfortunately libvirt\u2019s post-copy patch currently doesn\u2019t come with code providing bi-directional tunneling; therefore there are two options: a) don\u2019t use tunneled post-copy live migration or b) get pulled into the libvirt\u2019s code and implement this feature on your own.<\/p>\n<p>Due to the fact we really like working with post-copy live migration and we would love to see it finally upstream we decided for option b) implement bi-directional tunneling into the libvirt project &#8211; sounds simple, right? Not quite!<\/p>\n<p>The libvirt migration tunnel (the connection between source and destination libvirt daemons) is represented by the \u2018<a href=\"http:\/\/libvirt.org\/html\/libvirt-libvirt-stream.html\">virStream<\/a>\u2019 object from <a href=\"http:\/\/libvirt.org\/html\/libvirt-libvirt-stream.html\">libvirt-stream module<\/a>. This provides the functionality to handle standard stream events such as \u201cstream readable\u201d \/ \u201cstream writable\u201d occurring on both sides of the tunnel. These stream structures support \u00a0general data transfers (also out of the live migration context) and consequently have a number of different possible configurations: to support bidirectional communications, it was necessary to modify the migration related streams to operate in non-blocking mode using the \u2018VIR_STREAM_NONBLOCK\u2019 flag.<\/p>\n<p>Once the stream is able to both send and receive data the corresponding event handlers providing communication between the libvirt daemon and Qemu need to be modified as well. The uni-directional implementation uses unix <a href=\"http:\/\/pubs.opengroup.org\/onlinepubs\/009695399\/functions\/pipe.html\">pipe<\/a>s to transfer migration traffic between Qemu and libvirt daemon as it is simple and reliable tool for interprocess communication. To support bi-directional communication it was necessary to replace unidirectional pipes with bidirectional <a href=\"http:\/\/linux.die.net\/man\/2\/socketpair\">socketpair<\/a>s. Libvirt <a href=\"http:\/\/libvirt.org\/html\/libvirt-libvirt-event.html\">module libvirt-event<\/a> allows to handle events occurring on the FDs in the similar fashion as in the previous case with the streams.<\/p>\n<p>Although the basic building blocks are now in place to support bidirectional communications, the logic that sits on top of this must be added. The pre-copy implementation in \u2018qemuMigrationIOFunc\u2019 function awaits the data from source Qemu and repeatedly passes those to the migration stream until the migration process is finished completely. Post-copy needs to be able also read the data from the migration stream and send them back to the source Qemu. To do so we replaced the original function with two callback functions (\u2018qemuMigrationEventOnFD\u2019 and \u2018qemuMigrationEventOnStream\u2019) handling standard data events in both directions. To avoid blocking we also added two data buffers that are shown in Fig. 3. The bi-directional communication mechanism implemented can be summed up as follows:<\/p>\n<ul>\n<li>\u2018qemuMigrationEventOnFD\u2019 handles events on the Qemu FD (socket) by:\n<ul>\n<li>A) If the FD is readable, read the data and write those to the \u201cSource To Destination\u201d buffer.<\/li>\n<li>D) If the FD is writable and \u201cDestination To Source\u201d buffer contains data, write those to the FD.<\/li>\n<\/ul>\n<\/li>\n<li>\u2018qemuMigrationEventOnStream\u2019 handles events on the stream by:\n<ul>\n<li>B) If the stream is writable and \u201cSource To Destination\u201d buffer contains data, write those to the stream.<\/li>\n<li>C) If the stream is readable, read the data and write those to the \u201cDestination To Source\u201d buffer.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<figure id=\"attachment_7654\" aria-describedby=\"caption-attachment-7654\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-6.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-7654 size-medium\" src=\"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-6-300x176.png\" alt=\"Source side live migration data handling\" width=\"300\" height=\"176\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-6-300x176.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-6.png 483w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-7654\" class=\"wp-caption-text\">Fig 3. &#8211; Source side live migration data handling<\/figcaption><\/figure>\n<p>That\u2019s very much so regarding modification in libvirt in order to enable tunnelled post-copy live migration. Although, retrospectively all the modifications don\u2019t seem to require much coding effort, the biggest challenge here was to understand and modify a part of very complex and relatively large project. Also, due to the nature of the problem, it was difficult to debug and diagnose problems. There is still a long way transferring this modification into the part of libvirt as it makes sense only in the post-copy live migration context. However we believe this modification can help to push post-copy live migration closer to production which would ultimately make live migration much more robust.<\/p>\n<p>Note that this modification is very much based on the post-copy live migration work of Cristian Klein; <del datetime=\"2015-05-07T12:56:58+00:00\">we are currently looking at how the code can be published in the public domain<\/del>. Also I\u2019d like to thank to all who helped developing this modification, particularly the guys at Umea University, and also for all valuable comments pushing this forward.<\/p>\n<p>* UPDATE 7.5.2015 *<br \/>\nThe source code is now available as a fork of the libvirt&#8217;s wp3-postcopy branch in our <a href=\"https:\/\/github.com\/icclab\/libvirt\/tree\/wp3-postcopy\">github repository<\/a>. Any comments are welcome!<\/p>\n<div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/juno\/\">juno<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/libvirt\/\">libvirt<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/live-migration\/\">live migration<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/openstack\/\">openstack<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/post-copy\/\">post-copy<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/qemu\/\">qemu<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/tunnel\/\">tunnel<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/tunneled-live-migration\/\">tunneled live migration<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>In our previous blog posts we mostly focused on virtual machine live migration performance comparing pre-copy, post-copy and hybrid approaches in an Openstack context rather than exploring other live migration features. Libvirt together with the Qemu hypervisor provides many migration configuration options. One of these options is a possibility to use tunneled live migration. Recently [&hellip;]<\/p>\n","protected":false},"author":155,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[5],"tags":[524,515,450,240,516,514,571,580],"features":[],"class_list":["post-7651","post","type-post","status-publish","format-standard","hentry","category-articles","tag-juno","tag-libvirt","tag-live-migration","tag-openstack","tag-post-copy","tag-qemu","tag-tunnel","tag-tunneled-live-migration"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Tunneled Hybrid Live Migration - Service Engineering (ICCLab &amp; SPLab)<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tunneled Hybrid Live Migration\" \/>\n<meta property=\"og:description\" content=\"In our previous blog posts we mostly focused on virtual machine live migration performance comparing pre-copy, post-copy and hybrid approaches in an Openstack context rather than exploring other live migration features. Libvirt together with the Qemu hypervisor provides many migration configuration options. One of these options is a possibility to use tunneled live migration. Recently [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Engineering (ICCLab &amp; SPLab)\" \/>\n<meta property=\"article:published_time\" content=\"2015-04-09T14:06:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-05-07T13:06:05+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1-300x115.png\" \/>\n<meta name=\"author\" content=\"cima\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"cima\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/\"},\"author\":{\"name\":\"cima\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/bfb29453d69d6e8260cbfc3ff86df20b\"},\"headline\":\"Tunneled Hybrid Live Migration\",\"datePublished\":\"2015-04-09T14:06:24+00:00\",\"dateModified\":\"2015-05-07T13:06:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/\"},\"wordCount\":1189,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1-300x115.png\",\"keywords\":[\"juno\",\"libvirt\",\"live migration\",\"openstack\",\"post-copy\",\"qemu\",\"tunnel\",\"tunneled live migration\"],\"articleSection\":[\"Articles\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/\",\"name\":\"Tunneled Hybrid Live Migration - Service Engineering (ICCLab &amp; SPLab)\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1-300x115.png\",\"datePublished\":\"2015-04-09T14:06:24+00:00\",\"dateModified\":\"2015-05-07T13:06:05+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/bfb29453d69d6e8260cbfc3ff86df20b\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#primaryimage\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1.png\",\"contentUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1.png\",\"width\":532,\"height\":204},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/icclab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tunneled Hybrid Live Migration\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/\",\"name\":\"Service Engineering (ICCLab &amp; SPLab)\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/bfb29453d69d6e8260cbfc3ff86df20b\",\"name\":\"cima\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/8d7cb1dd9511a1465510abf53f139c259c510dbce26f647ee43e3771f65a7143?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8d7cb1dd9511a1465510abf53f139c259c510dbce26f647ee43e3771f65a7143?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8d7cb1dd9511a1465510abf53f139c259c510dbce26f647ee43e3771f65a7143?s=96&d=mm&r=g\",\"caption\":\"cima\"},\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/author\/cima\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Tunneled Hybrid Live Migration - Service Engineering (ICCLab &amp; SPLab)","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/","og_locale":"en_US","og_type":"article","og_title":"Tunneled Hybrid Live Migration","og_description":"In our previous blog posts we mostly focused on virtual machine live migration performance comparing pre-copy, post-copy and hybrid approaches in an Openstack context rather than exploring other live migration features. Libvirt together with the Qemu hypervisor provides many migration configuration options. One of these options is a possibility to use tunneled live migration. Recently [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/","og_site_name":"Service Engineering (ICCLab &amp; SPLab)","article_published_time":"2015-04-09T14:06:24+00:00","article_modified_time":"2015-05-07T13:06:05+00:00","og_image":[{"url":"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1-300x115.png","type":"","width":"","height":""}],"author":"cima","twitter_card":"summary_large_image","twitter_misc":{"Written by":"cima","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/"},"author":{"name":"cima","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/bfb29453d69d6e8260cbfc3ff86df20b"},"headline":"Tunneled Hybrid Live Migration","datePublished":"2015-04-09T14:06:24+00:00","dateModified":"2015-05-07T13:06:05+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/"},"wordCount":1189,"commentCount":0,"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1-300x115.png","keywords":["juno","libvirt","live migration","openstack","post-copy","qemu","tunnel","tunneled live migration"],"articleSection":["Articles"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/","url":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/","name":"Tunneled Hybrid Live Migration - Service Engineering (ICCLab &amp; SPLab)","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1-300x115.png","datePublished":"2015-04-09T14:06:24+00:00","dateModified":"2015-05-07T13:06:05+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/bfb29453d69d6e8260cbfc3ff86df20b"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#primaryimage","url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1.png","contentUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2015\/02\/Untitled-Diagram-1.png","width":532,"height":204},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/icclab\/tunneled-hybrid-live-migration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/icclab\/"},{"@type":"ListItem","position":2,"name":"Tunneled Hybrid Live Migration"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/icclab\/#website","url":"https:\/\/blog.zhaw.ch\/icclab\/","name":"Service Engineering (ICCLab &amp; SPLab)","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/bfb29453d69d6e8260cbfc3ff86df20b","name":"cima","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/8d7cb1dd9511a1465510abf53f139c259c510dbce26f647ee43e3771f65a7143?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/8d7cb1dd9511a1465510abf53f139c259c510dbce26f647ee43e3771f65a7143?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8d7cb1dd9511a1465510abf53f139c259c510dbce26f647ee43e3771f65a7143?s=96&d=mm&r=g","caption":"cima"},"url":"https:\/\/blog.zhaw.ch\/icclab\/author\/cima\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/7651","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/users\/155"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/comments?post=7651"}],"version-history":[{"count":7,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/7651\/revisions"}],"predecessor-version":[{"id":8144,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/7651\/revisions\/8144"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/media?parent=7651"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/categories?post=7651"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/tags?post=7651"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/features?post=7651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}