CINXE.COM
What is virtualisation? The basics | Snapcraft
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>What is virtualisation? The basics | Snapcraft</title> <!-- Preconnect to establish early connections to important third-party origins --> <link rel="preconnect" href="https://www.google-analytics.com"> <link rel="preconnect" href="https://assets.ubuntu.com"> <link rel="preconnect" href="https://munchkin.marketo.net"> <link rel="preload" href="https://assets.ubuntu.com/v1/9689339a-snapcraft-hero-background--light.png" as="image"> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-KCGXHQS');</script> <!-- End Google Tag Manager --> <link rel="stylesheet" href="/static/css/styles.css?v=824fb30" /> <script src="/static/js/modules/raven.min.js?v=daf037c" defer></script> <script> window.addEventListener("DOMContentLoaded", function() { Raven.config('https://1e82fd54e08142c9978f623cb746b965@sentry.is.canonical.com//3', { whitelistUrls: ['staging.snapcraft.io/static/js', 'snapcraft.io/static/js/'], ignoreUrls: ['staging.snapcraft.io/static/js/modules', 'snapcraft.io/static/js/modules'], ignoreErrors: ['AbortError'], release: 'commit_id', environment: 'production' }).install(); }); </script> <script src="/static/js/dist/base.js?v=3c45e64" defer></script> <script src="/static/js/dist/blog.js?v=52acc20" defer></script> <script src="https://assets.ubuntu.com/v1/703e23c9-lazysizes+noscript+native-loading.5.1.2.min.js" defer></script> <meta name="description" content="Virtualisation plays a huge role in almost all of today’s fastest-growing software-based industries. It is the foundation for most cloud computing, the go-to methodology for cross-platform development, and has made its way all the way to ‘the edge’; the eponymous IoT. This article is the first in a series where we explain what virtualisat […]"> <meta name="copydoc" content=""> <meta name="google-site-verification" content="Y1JayrP2iS6jS6Rd7uGX3Kzgm0oD8rV5R6TkzteLbQg" /> <meta property="og:title" content="What is virtualisation? The basics | Snapcraft"/> <meta property="og:site_name" content="Snapcraft"/> <meta property="og:type" content="article"/> <meta property="og:description" content="Virtualisation plays a huge role in almost all of today’s fastest-growing software-based industries. It is the foundation for most cloud computing, the go-to methodology for cross-platform development, and has made its way all the way to ‘the edge’; the eponymous IoT. This article is the first in a series where we explain what virtualisat […]"/> <meta property="og:image" content="https://ubuntu.com/wp-content/uploads/2b35/virtualisationimage.jpg" /> <meta property="og:image:width" content="1200" /> <meta property="og:image:height" content="630" /> <meta property="og:image:alt" content="Snapcraft banner" /> <meta property="og:url" content="https://snapcraft.io/blog/what-is-virtualisation-the-basics" /> <meta property="twitter:card" content="summary_large_image" /> <meta property="twitter:site" content="@snapcraftio" /> <meta property="twitter:creator" content="@snapcraftio" /> <meta property="twitter:image" content="https://ubuntu.com/wp-content/uploads/2b35/virtualisationimage.jpg" /> <meta property="twitter:url" content="https://snapcraft.io/blog/what-is-virtualisation-the-basics" /> <meta property="og:type" content="article" /> <meta property="article:published_time" content="2021-02-26T11:13:53" /> <meta property="article:author" content="Rhys Davies" /> <link rel="canonical" href="https://snapcraft.io/blog/what-is-virtualisation-the-basics" /> <link rel="icon" type="image/png" href="https://assets.ubuntu.com/v1/d4ca039f-favicon_16px.png" sizes="16x16" /> <link rel="icon" type="image/png" href="https://assets.ubuntu.com/v1/841d0bcf-favicon_32px.png" sizes="32x32" /> <link rel="icon" type="image/png" href="/static/snapcraft-favicon.png?v=055e94b" sizes="144x144" /> <link rel="author" href="/humans.txt" /> </head> <body class="has-sticky-footer"> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KCGXHQS" height="0" width="0" style="display: none; visibility: hidden;"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <!-- JS that is needed right away --> <script src="/static/js/dist/cookie-policy.js?v=dd76a21"></script> <header id="navigation" class="p-navigation is-dark"> <div class="p-navigation__row "> <div class="p-navigation__banner"> <div class="p-navigation__tagged-logo"> <a class="p-navigation__link" href="/"> <div class="p-navigation__logo-tag"> <img class="p-navigation__logo-icon" src="https://assets.ubuntu.com/v1/11ff571b-snapcraft.svg" alt=""> </div> <span class="p-navigation__logo-title" >Canonical Snapcraft</span> </a> </div> <a href="#navigation" class="p-navigation__toggle--open" title="menu">Menu</a> <a href="#navigation-closed" class="p-navigation__toggle--close" title="close menu">Close menu</a> </div> <nav class="p-navigation__nav"> <ul class="p-navigation__items" role="menu"> <li class="p-navigation__item " role="menuitem" > <a class="p-navigation__link" href="/store"> Snap Store </a> </li> <li class="p-navigation__item " role="menuitem" > <a class="p-navigation__link" href="/about"> About <span class="u-hide--large">Snapcraft</span> </a> </li> <li class="p-navigation__item--dropdown-toggle " id="learn-link" role="menuitem" > <a class="p-navigation__link" href="#learn-menu" aria-controls="learn-menu"> Learn </a> <ul class="p-navigation__dropdown" id="learn-menu" aria-hidden="true"> <li> <a class="p-navigation__dropdown-item" href="/blog"> Blog </a> </li> <li> <a class="p-navigation__dropdown-item" href="/build"> Build </a> </li> <li> <a class="p-navigation__dropdown-item" href="/docs/"> Docs </a> </li> <li> <a class="p-navigation__dropdown-item" href="/docs/snap-tutorials"> Tutorials </a> </li> </ul> </li> <li class="p-navigation__item " role="menuitem" > <a class="p-navigation__link" href="/iot"> IoT </a> </li> <li class="p-navigation__item" role="menuitem"> <a class="p-navigation__link " href="https://forum.snapcraft.io/">Forum</a> </li> </ul> <ul class="p-navigation__items js-nav-account global-nav" role="menu"> <li class="p-navigation__item--dropdown-toggle js-nav-account--authenticated u-hide" role="menuitem" id="link-1"> <a class="p-subnav__toggle p-navigation__link js-account--name" aria-controls="account-menu" aria-expanded="false"> My account </a> <ul class="p-navigation__dropdown--right" id="account-menu" aria-hidden="true"> <li> <a href="/account/snaps" class="p-navigation__dropdown-item">My published snaps</a> </li> <li> <a href="/validation-sets" class="p-navigation__dropdown-item">My validation sets</a> </li> <li class="js-nav-account--stores u-hide"> <a href="/admin" class="p-navigation__dropdown-item">My stores</a> </li> <li> <a href="/admin/account" class="p-navigation__dropdown-item">Account details</a> </li> <li> <a href="/logout" class="p-navigation__dropdown-item">Sign out</a> </li> </ul> </li> <li class="p-navigation__item js-nav-account--notauthenticated u-hide" role="menuitem"> <a class="p-navigation__link" href="/snaps"> Sign in <i class="p-icon--user is-light"></i> </a> </li> </ul> </nav> </div> </header> <section id="main-content" class="p-strip"> <div class="row"> <div class="col-8 p-blog-post"> <h1 class="p-heading--2">What is virtualisation? The basics</h1> <p>by Rhys Davies on 26 February 2021</p> <p>Virtualisation plays a huge role in almost all of today’s fastest-growing software-based industries. It is the foundation for most cloud computing, the go-to methodology for cross-platform development, and has made its way all the way to ‘the edge’; the eponymous IoT. This article is the first in a series where we explain what virtualisation is and how it works. Here, we start with the broad strokes. Anything that goes beyond the scope of a 101 article will be covered in subsequent blog posts. Let’s get into it. </p> <figure class="wp-block-image"> <div class="lazyload" data-noscript=""> <noscript> <img alt="" height="408" loading="lazy" src="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_700,h_408/https://ubuntu.com/wp-content/uploads/2b35/virtualisationimage.jpg" srcset="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_1400,h_816/https://ubuntu.com/wp-content/uploads/2b35/virtualisationimage.jpg 2x" width="700"/> </noscript> </div> </figure> <h2 class="wp-block-heading">What is virtualisation?</h2> <p>Virtualisation technology creates virtualised hardware environments. It uses software to create an ‘abstraction layer’ on top of hardware to divide up parts of a single computer’s resources, such as processors, memory, storage, etc, between multiple virtual computers. The result can be virtual machines (VMs) or containers. Both allow you to create isolated, secure environments for testing, debugging, legacy software, and for specific needs that do not require all of the resources on the physical hardware. </p> <p>Today, virtualization is a standard practice in enterprise IT architectures, software development and at the edge. You can virtualise numerous parts of a computers ‘stack’ for a myriad of reasons. You can virtualise:</p> <ul><li>Desktops </li><li>Networks</li><li>Storage</li><li>Data</li><li>Applications</li><li>Data centres </li><li>CPUs</li><li>GPUs</li><li>Linux</li><li>Clouds </li></ul> <p>Each of these scenarios enables providers to serve users, or individual VMs, and means users only need the exact computational resources necessary for a given workload. This could be anything from virtualising single machines to more complex setups like full virtual data centre environments. </p> <h2 class="wp-block-heading">What is a virtual machine?</h2> <p>A virtual machine is a resource that uses software to run workloads and deploy apps. Each VM runs its own operating system (OS) (the guest OS), and behaves like an independent computer utilising a portion of the underlying computer’s resources (the host). VMs allow users to run numerous different operating systems on one machine, each with potentially different applications and libraries inside. There are numerous tools and methodologies for managing VMs in different places, the first layer of management comes from either a ‘hypervisor’ or ‘application virtualisation’. </p> <div class="wp-block-image"><figure class="aligncenter is-resized"> <div class="lazyload" data-noscript=""> <noscript> <img alt="" height="365" loading="lazy" src="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_435,h_365/https://ubuntu.com/wp-content/uploads/9f0c/virtualmachine.png" srcset="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_870,h_730/https://ubuntu.com/wp-content/uploads/9f0c/virtualmachine.png 2x" width="435"/> </noscript> </div> </figure></div> <h3 class="wp-block-heading">What is a hypervisor?</h3> <p>A hypervisor is a layer of software that sits between VMs and hardware to manage resource allocation, general VM to hardware communications, and to make sure VMs don’t interfere with each other. There are two types of hypervisors:</p> <ul><li>Type 1: ‘Bare-metal’ hypervisors which interact directly with the underlying hardware and become the OS, except that you only really interact with them through the virtualisation tool. Some examples are: VMware ESXi, Microsoft Hyper-V, and Apple Boot Camp. </li></ul> <ul><li>Type 2: Hypervisors that run as an application on top of the existing OS. Some examples are: Parallels Desktop for Mac, QEMU and VirtualBox.</li></ul> <p>Each operating system, macOS, Windows, Linux, and so on, use different hypervisors for different things. MacOS ships with Hyperkit, Windows with Hyper-V and Linux with KVM as their built-in ‘type 1’ hypervisors. But there are lots of organisations that offer type 1 and type 2 solutions. For example, Virtual box is a type 2 hypervisor that is popular on both Windows and macOS. VMware specialises in all different kinds of virtualisation; server, desktop, networking and storage, with different hypervisor offerings for each. The details of how hypervisors work is beyond the scope of this article. </p> <figure class="wp-block-image"> <div class="lazyload" data-noscript=""> <noscript> <img alt="" height="518" loading="lazy" src="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_1246,h_518/https://ubuntu.com/wp-content/uploads/39be/hypervisor.png" srcset="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_2492,h_1036/https://ubuntu.com/wp-content/uploads/39be/hypervisor.png 2x" width="1246"/> </noscript> </div> </figure> <h3 class="wp-block-heading">What is application-virtualisation?</h3> <p>Application-based virtualisation uses an application (such as Parallels RAS) to effectively stream applications to a virtual environment on another server or host system. Instead of logging into a host computer, users gain access to the application virtually, separating applications from the operating system and allowing the user to run almost any application on other hardware. In this way users don’t have to worry about local storage and multiple applications can be run in this way with barely touching the host system.</p> <h3 class="wp-block-heading">What is virtual networking?</h3> <p>A key part of virtualisation is allowing virtual machines to talk to the rest of the world. VMs need the ability to talk to other VMs, internally with the host, and externally, with things outside of the virtual environment. This is done with a virtual network between the virtual machine(s) and the host OS. The network is a line of communication that goes between the VMs, and the hardware in the physical environment. There is lots more to it than that but the details are beyond the scope of this particular article. </p> <p>There are many ways to implement a virtual network, two of the most common are “bridged networking” and “network address translation” (NAT). Using NAT, virtual machines are represented on external networks using the IP address of the host system. In this way virtual machines in the virtual environment are not visible to the outside, this is why virtual machines behind NAT are considered protected. . When a connection is made between an address inside and outside of the virtual environment the NAT system forwards the connection to the correct VM. </p> <p>Bridged networking connects the VMs directly onto the physical network that the host is using. The DHCP server can then assign each VM its own IP address and is visible on the network. Once connected the VM is accessible over the network and can access other machines on the network as if it were a physical machine. </p> <h2 class="wp-block-heading">What are containers?</h2> <p>Containers are standardised units of software that bundle code and all its dependencies into one modular package. While each VM brings its own OS, containers can share the OS of the host machine or bring their own in separate containers. As a result, they are more lightweight, you can deploy a lot more at once, and they are low(er) maintenance, with everything you need in one place. We typically recommend three types of containers for different use cases:</p> <figure class="wp-block-image is-resized"> <div class="lazyload" data-noscript=""> <noscript> <img alt="" height="333" loading="lazy" src="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_500,h_333/https://ubuntu.com/wp-content/uploads/9c65/container.png" srcset="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_1000,h_666/https://ubuntu.com/wp-content/uploads/9c65/container.png 2x" width="500"/> </noscript> </div> </figure> <h3 class="wp-block-heading">Linux containers</h3> <p>Linux containers focus on being system containers. Containers which create an environment as close to a VM as possible without the overhead of running a kernel and virtualising the hardware. These are considered more robust because they are closer to being a machine with all the services in place, and so are used in a lot of traditional operations. Linux containers come from the <a href="https://linuxcontainers.org/">Linux containers project (LXC)</a>, an open source container platform that is a userspace interface for the tools, templates, libraries and bindings to allow for the creation and management of containers. </p> <div class="wp-block-image"><figure class="aligncenter is-resized"> <div class="lazyload" data-noscript=""> <noscript> <img alt="" height="201" loading="lazy" src="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_218,h_201/https://ubuntu.com/wp-content/uploads/8f91/lxc.png" srcset="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_436,h_402/https://ubuntu.com/wp-content/uploads/8f91/lxc.png 2x" width="218"/> </noscript> </div> </figure></div> <h3 class="wp-block-heading">Docker containers</h3> <p>Docker containers are the most popular kind of container among developers for cross-platform deployments in data centres or serverless environments. Docker containers use <a href="https://www.docker.com/products/container-runtime">Docker Engine </a>and numerous other container technologies, including LXC, to create developer-friendly environments that are reproducible regardless of the underlying infrastructure. They are standalone executable packages that include everything needed to run an application: code, runtime, system tools, libraries and settings. </p> <div class="wp-block-image"><figure class="aligncenter is-resized"> <div class="lazyload" data-noscript=""> <noscript> <img alt="" height="283" loading="lazy" src="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_396,h_283/https://ubuntu.com/wp-content/uploads/14ee/docker.png" srcset="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_792,h_566/https://ubuntu.com/wp-content/uploads/14ee/docker.png 2x" width="396"/> </noscript> </div> </figure></div> <h3 class="wp-block-heading">Snaps</h3> <p>Snaps are containerised software packages that focus on being singular application containers. Where LXC could be seen as a machine container, Docker as a process container, snaps can be seen as application containers. Snaps package code and dependencies in a similar way to containers to keep the application content isolated and immutable. They have a writable area that is separated from the rest of the system, but are visible to the host via user application-defined interfaces and behave more like traditional Debian apt packages.</p> <p>Snaps are designed for when you want to deploy to a single machine. Applications are built and packaged as snaps using <a href="https://snapcraft.io">a tool called snapcraft</a> that incorporates different container technologies to create a secure and easy-to-update way to package applications for workstations or for fleets of IoT devices. There are a few ways to develop snaps. Developers can configure snap to even run unconfined while they put it together and containerise everything later when pushing to production. Read more about the different way snaps can be <a href="https://snapcraft.io/blog/demystifying-snap-confinement">configured in another article</a>. </p> <div class="wp-block-image"><figure class="aligncenter is-resized"> <div class="lazyload" data-noscript=""> <noscript> <img alt="" height="283" loading="lazy" src="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_417,h_283/https://ubuntu.com/wp-content/uploads/2404/snap.png" srcset="https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_834,h_566/https://ubuntu.com/wp-content/uploads/2404/snap.png 2x" width="417"/> </noscript> </div> </figure></div> <h2 class="wp-block-heading">Virtual machines vs Containers</h2> <p>Whether you should use a VM or a container depends on your use case. They’re both great technologies for separate reasons, not necessarily competitors. Virtual machines allow users to run multiple OSes on the same hardware, and containers allow users to deploy multiple applications on the same OS, on a single machine. </p> <h3 class="wp-block-heading">Pros and cons of VMs</h3> <p>The benefits of using a VM include, but are not limited to: </p> <ul><li>Teams being more efficient with computational resources.</li><li>Support for larger, more complex applications that need full OS functionality on a single server.</li><li>The ability to turn one server into many</li><li>Potentially risky work can be isolated from the host environment.</li><li>Running multiple versions of the same OS environments on the same machine. </li><li>VMs support and run legacy applications that only work on outdated OSes.</li><li>VMs can provide disaster recovery features that abstract important data from problems on the host.</li></ul> <p>And of course there are several caveats that include, but are also not limited to:</p> <ul><li>Running multiple VMs on a single host can cause unstable performance and overload the host’s resources if unconstrained.</li><li>From some providers, especially at scale you may need to endure licensing costs for each VM.</li><li>Virtualisation has inherent performance differences simply as a result of the abstraction from hardware and can pose problems troubleshooting time-based/dependent issues.</li><li>Hosts without hardware extensions in the CPU may not allow access to specific resources. This is known as paravirtualisation, but is beyond the scope of this article.</li></ul> <h3 class="wp-block-heading">Pros and cons of containers</h3> <p>The benefits of containers include but are not limited to: </p> <ul><li>Security; dy default containers limit what is exposed to the host system and the internet, plus, with the extra layer provided by the container the level of security is increased. </li><li>Scalability; large applications and services can be broken down to run in isolated containers that can be spread across multiple resources.</li><li>Manageability; when applications are broken down into containers developers can focus on features and individual aspects of the application rather than worrying about the whole thing. </li><li>Portability; containers run on any architecture and can be used most anywhere in the stack so the same container environment can be used from development to production. </li></ul> <p>And of course there are several caveats that include, but are also not limited to:</p> <ul><li>Setup and organisation can be difficult because users need to develop a strategy around how they want to operate their particular environment. </li><li>The compartmentalised approach of containers can lead to issues where changes in one container have a negative impact on the rest of the application. </li><li>Support and maintenance of applications, or application parts, inside containers becomes more difficult the more applications are broken down.</li><li>Since containers can share the same operating system, they share all the security threats and vulnerabilities of that OS too. </li></ul> <h2 class="wp-block-heading">Conclusion</h2> <p>Virtualisation can exist anywhere computation is important. It is used to isolate whatever is being done from the host computer and to utilise specific resources more efficiently. There are two major kinds of virtualisation: virtual machines, and containers. Each has its pros and cons and can be used independently or together but both have the aim of providing flexibility and efficiency in deploying and managing applications. In our next article we will talk about some of the topics touched on here in more detail. </p> <p></p> </div> <div class="col-4"> <div class="p-card"> <h5 class="p-muted-heading">Newsletter Signup</h5> <hr class="u-sv1" /> <div class="p-card__content js-newsletter-signup"> <form action="https://pages.canonical.com/index.php/leadCapture/save" method="post" class="p-form" id="mktoForm_3376"> <div class="p-form__group"> <label for="Email" class="u-no-padding--top">Email:*</label> <input id="Email" name="Email" maxlength="255" type="email" required /> </div> <div class="p-form__group"> <label for="canonicalUpdatesOptIn" class="p-checkbox"> <input name="canonicalUpdatesOptIn" id="canonicalUpdatesOptIn" type="checkbox" value="Receive updates" class="p-checkbox__input"/> <span class="p-checkbox__label">I agree to receive information about Canonical’s products and services.</span> </label> </div> <p> <small> In submitting this form, I confirm that I have read and agree to <a href="https://www.ubuntu.com/legal/dataprivacy" target="_blank" id="">Canonical's Privacy Policy</a> </small> </p> <p class="u-no-margin--bottom"> <input type="hidden" name="Consent_to_Processing__c" value="Yes" /> <button type="submit" class="p-button--positive u-no-margin--bottom">Subscribe now</button> </p> <input type="hidden" name="formid" value="3376" /> <input type="hidden" name="lpId" value="" /> <input type="hidden" name="subId" value="" /> <input type="hidden" name="munchkinId" value="066-EOV-335" /> <input type="hidden" name="lpurl" value="" /> <input type="hidden" name="ret" value="https://snapcraft.io/blog/what-is-virtualisation-the-basics?newsletter=true" /> <input type="hidden" name="cr" value="" /> <input type="hidden" name="kw" value="" /> <input type="hidden" name="q" value="" /> </form> </div> </div> </div> </div> </section> <section class="p-strip is-shallow"> <div class="u-fixed-width"> <h3> Related posts </h3> </div> <div class="row p-divider"> <div class="col-4 p-divider__block"> <h4> <a href="/blog/managing-software-snap-store-proxy"> Managing software in complex network environments: the Snap Store Proxy </a> </h4> <p>As enterprises grapple with the evolving landscape of security threats, the need to safeguard internal networks from the broader internet is increasingly important. In environments with restricted internet access, it can be difficult to manage software updates in an easy, reliable way. When managing devices in the field, change management […]</p> </div> <div class="col-4 p-divider__block"> <h4> <a href="/blog/improving-snap-maintenance-with-automation"> Improving snap maintenance with automation </a> </h4> <p>Co-written with Sergio Costas Rodríguez. As the number of snaps increases, the need for automation grows. Any automation to help us maintain a group of snaps is welcome and necessary for us to be able to scale. The solution detailed in this article has two main benefits: Any users of snaps that have adopted this […]</p> </div> <div class="col-4 p-divider__block"> <h4> <a href="/blog/snapcraft-8-0-and-the-respectable-end-of-core18"> Snapcraft 8.0 and the respectable end of core18 </a> </h4> <p>‘E’s not pinin’! ‘E’s passed on! This base is no more! He has ceased to be! ‘E’s expired and gone to meet ‘is maker! ‘E’s a stiff! Bereft of life, ‘e rests in peace! If you hadn’t nailed ‘im to the perch ‘e’d be pushing up the daisies! ‘Is software processes are now ‘istory! ‘E’s […]</p> </div> </div> </section> <script type="text/template" id="blog-series-item-template"> <li class="p-list__item"> <h5> <a href="/blog/${slug}" class="p-blog-list__item ${className}"> ${title} </a> </h5> </li> </script> <footer class="p-strip--dark p-sticky-footer" id="footer"> <div class="row"> <div class="col-9"> <p> <a class="p-link--inverted" href="#">Back to top <i class="p-icon--chevron-up is-light"></i></a> </p> <p> © 2024 Canonical Ltd. <br/> Ubuntu and Canonical are registered trademarks of Canonical Ltd. <br/> Powered by <a href="https://www.ubuntu.com/kubernetes">Charmed Kubernetes</a> </p> <p class="u-no-limit"> <small> <a href="https://forum.snapcraft.io/">Join the forum</a>, contribute to or report problems with, <a href="https://bugs.launchpad.net/snapd" >snapd</a>, <a href="https://bugs.launchpad.net/snapcraft" >Snapcraft</a>, or <a href="https://github.com/canonical/snapcraft.io/issues/new">this site</a>. </small> </p> </div> <div class="col-3"> <ul class="p-inline-list u-align--right"> <li class="p-inline-list__item"> <a href="https://twitter.com/snapcraftio" class="p-icon--twitter">Share on Twitter</a> </li> <li class="p-inline-list__item"> <a href="https://www.facebook.com/snapcraftio" class="p-icon--facebook">Share on Facebook</a> </li> <li class="p-inline-list__item"> <a href="https://www.youtube.com/snapcraftio" class="p-icon--youtube">Share on YouTube</a> </li> </ul> </div> </div> <div class="u-fixed-width"> <ul class="p-inline-list--middot u-no-margin--bottom"> <li class="p-inline-list__item"> <a class="p-link--inverted" href="https://ubuntu.com/legal/terms-and-policies/snap-store-terms"><small>Terms of Service</small></a> </li> <li class="p-inline-list__item"> <a class="p-link--inverted" href="https://www.ubuntu.com/legal/data-privacy"><small>Data privacy</small></a> </li> <li class="p-inline-list__item"> <a class="p-link--inverted js-revoke-cookie-manager" href=""><small>Manage your tracker settings</small></a> </li> <li class="p-inline-list__item"> <a class="p-link--inverted" href="https://status.snapcraft.io/"><small>Service status</small></a> </li> <li class="p-inline-list__item"> <a class="p-link--inverted" href="https://dashboard.snapcraft.io/"><small>Other functions</small></a> </li> <li class="p-inline-list__item"> <a class="p-link--inverted" href="/about/contact-us" data-js="contact-form-trigger" data-formid="2639"> Contact us </a> </li> </ul> </div> </footer> <div class="p-modal u-hide" id="contact-form-modal"> <section class="p-modal__dialog" role="dialog" aria-modal="true" aria-labeledby="modal-title"> <header class="p-modal__header"> <h2 class="p-modal__title">Contact us</h2> <button class="p-modal__close" aria-label="Close active modal" aria-controls="modal" data-js="close-modal-control">Close</button> </header> <div id="modal-body"></div> </section> </div> <script type="text/template" id="contactFormTemplate"> <form action="https://ubuntu.com/marketo/submit" method="post" id="mktoForm_{{formid}}"> <fieldset class="u-no-margin--bottom"> <legend class="u-off-screen">About you</legend> <h2 class="p-heading--3">About you</h2> <ul class="p-list"> <li class="p-list__item"> <label for="firstName">First name:</label> <input required id="firstName" name="firstName" maxlength="255" type="text" /> </li> <li class="p-list__item"> <label for="lastName">Last name:</label> <input required id="lastName" name="lastName" maxlength="255" type="text" /> </li> <li class="p-list__item"> <label for="email">Email address:</label> <input required id="email" name="email" maxlength="255" type="email" pattern="^[^ ]+@[^ ]+\.[a-z]{2,26}$" /> </li> <li class="p-list__item"> <label for="phone">Mobile/cell phone number:</label> <input required id="phone" name="phone" maxlength="255" type="tel" /> </li> <li class="p-list__item"> <label for="country">Country:</label> <select required id="country" name="country" > <option value="">Select...</option ><option value="FR">France</option ><option value="DE">Germany</option ><option value="JP">Japan</option ><option value="GB">United Kingdom</option ><option value="US">United States of America</option ><option disabled>——————————————————</option ><option value="AF">Afghanistan</option ><option value="AX">Åland Islands</option ><option value="AL">Albania</option ><option value="DZ">Algeria</option ><option value="AS">American Samoa</option ><option value="AD">Andorra</option ><option value="AO">Angola</option ><option value="AI">Anguilla</option ><option value="AQ">Antarctica</option ><option value="AG">Antigua and Barbuda</option ><option value="AR">Argentina</option ><option value="AM">Armenia</option ><option value="AW">Aruba</option ><option value="AU">Australia</option ><option value="AT">Austria</option ><option value="AZ">Azerbaijan</option ><option value="BS">Bahamas</option ><option value="BH">Bahrain</option ><option value="BD">Bangladesh</option ><option value="BB">Barbados</option ><option value="BY">Belarus</option ><option value="BE">Belgium</option ><option value="BZ">Belize</option ><option value="BJ">Benin</option ><option value="BM">Bermuda</option ><option value="BT">Bhutan</option ><option value="BO">Bolivia (Plurinational State of)</option ><option value="BQ">Bonaire, Sint Eustatius and Saba</option ><option value="BA">Bosnia and Herzegovina</option ><option value="BW">Botswana</option ><option value="BV">Bouvet Island</option ><option value="BR">Brazil</option ><option value="IO">British Indian Ocean Territory</option ><option value="BN">Brunei Darussalam</option ><option value="BG">Bulgaria</option ><option value="BF">Burkina Faso</option ><option value="BI">Burundi</option ><option value="KH">Cambodia</option ><option value="CM">Cameroon</option ><option value="CA">Canada</option ><option value="CV">Cabo Verde</option ><option value="KY">Cayman Islands</option ><option value="CF">Central African Republic</option ><option value="TD">Chad</option ><option value="CL">Chile</option ><option value="CN">China</option ><option value="CX">Christmas Island</option ><option value="CC">Cocos (Keeling) Islands</option ><option value="CO">Colombia</option ><option value="KM">Comoros</option ><option value="CG">Congo</option ><option value="CD">Congo (Democratic Republic of the)</option ><option value="CK">Cook Islands</option ><option value="CR">Costa Rica</option ><option value="CI">Côte d'Ivoire</option ><option value="HR">Croatia</option ><option value="CU">Cuba</option ><option value="CW">Curaçao</option ><option value="CY">Cyprus</option ><option value="CZ">Czech Republic</option ><option value="DK">Denmark</option ><option value="DJ">Djibouti</option ><option value="DM">Dominica</option ><option value="DO">Dominican Republic</option ><option value="EC">Ecuador</option ><option value="EG">Egypt</option ><option value="SV">El Salvador</option ><option value="GQ">Equatorial Guinea</option ><option value="ER">Eritrea</option ><option value="EE">Estonia</option ><option value="ET">Ethiopia</option ><option value="FK">Falkland Islands (Malvinas)</option ><option value="FO">Faroe Islands</option ><option value="FJ">Fiji</option ><option value="FI">Finland</option ><option value="FR">France</option ><option value="GF">French Guiana</option ><option value="PF">French Polynesia</option ><option value="TF">French Southern Territories</option ><option value="GA">Gabon</option ><option value="GM">Gambia</option ><option value="GE">Georgia</option ><option value="DE">Germany</option ><option value="GH">Ghana</option ><option value="GI">Gibraltar</option ><option value="GR">Greece</option ><option value="GL">Greenland</option ><option value="GD">Grenada</option ><option value="GP">Guadeloupe</option ><option value="GU">Guam</option ><option value="GT">Guatemala</option ><option value="GG">Guernsey</option ><option value="GN">Guinea</option ><option value="GW">Guinea-Bissau</option ><option value="GY">Guyana</option ><option value="HT">Haiti</option ><option value="HM">Heard Island and McDonald Islands</option ><option value="VA">Holy See</option ><option value="HN">Honduras</option ><option value="HK">Hong Kong</option ><option value="HU">Hungary</option ><option value="IS">Iceland</option ><option value="IN">India</option ><option value="ID">Indonesia</option ><option value="IR">Iran (Islamic Republic of)</option ><option value="IQ">Iraq</option ><option value="IE">Ireland</option ><option value="IM">Isle of Man</option ><option value="IL">Israel</option ><option value="IT">Italy</option ><option value="JM">Jamaica</option ><option value="JP">Japan</option ><option value="JE">Jersey</option ><option value="JO">Jordan</option ><option value="KZ">Kazakhstan</option ><option value="KE">Kenya</option ><option value="KI">Kiribati</option ><option value="KP">Korea (Democratic People's Republic of)</option ><option value="KR">Korea (Republic of)</option ><option value="KW">Kuwait</option ><option value="KG">Kyrgyzstan</option ><option value="LA">Lao People's Democratic Republic</option ><option value="LV">Latvia</option ><option value="LB">Lebanon</option ><option value="LS">Lesotho</option ><option value="LR">Liberia</option ><option value="LY">Libya</option ><option value="LI">Liechtenstein</option ><option value="LT">Lithuania</option ><option value="LU">Luxembourg</option ><option value="MO">Macao</option ><option value="MK">Macedonia (the former Yugoslav Republic of)</option ><option value="MG">Madagascar</option ><option value="MW">Malawi</option ><option value="MY">Malaysia</option ><option value="MV">Maldives</option ><option value="ML">Mali</option ><option value="MT">Malta</option ><option value="MH">Marshall Islands</option ><option value="MQ">Martinique</option ><option value="MR">Mauritania</option ><option value="MU">Mauritius</option ><option value="YT">Mayotte</option ><option value="MX">Mexico</option ><option value="FM">Micronesia (Federated States of)</option ><option value="MD">Moldova (Republic of)</option ><option value="MC">Monaco</option ><option value="MN">Mongolia</option ><option value="ME">Montenegro</option ><option value="MS">Montserrat</option ><option value="MA">Morocco</option ><option value="MZ">Mozambique</option ><option value="MM">Myanmar</option ><option value="NA">Namibia</option ><option value="NR">Nauru</option ><option value="NP">Nepal</option ><option value="NL">Netherlands</option ><option value="NC">New Caledonia</option ><option value="NZ">New Zealand</option ><option value="NI">Nicaragua</option ><option value="NE">Niger</option ><option value="NG">Nigeria</option ><option value="NU">Niue</option ><option value="NF">Norfolk Island</option ><option value="MP">Northern Mariana Islands</option ><option value="NO">Norway</option ><option value="OM">Oman</option ><option value="PK">Pakistan</option ><option value="PW">Palau</option ><option value="PS">Palestine, State of</option ><option value="PA">Panama</option ><option value="PG">Papua New Guinea</option ><option value="PY">Paraguay</option ><option value="PE">Peru</option ><option value="PH">Philippines</option ><option value="PN">Pitcairn</option ><option value="PL">Poland</option ><option value="PT">Portugal</option ><option value="PR">Puerto Rico</option ><option value="QA">Qatar</option ><option value="RE">Réunion</option ><option value="RO">Romania</option ><option value="RU">Russian Federation</option ><option value="RW">Rwanda</option ><option value="BL">Saint Barthélemy</option ><option value="SH">Saint Helena, Ascension and Tristan da Cunha</option ><option value="KN">Saint Kitts and Nevis</option ><option value="LC">Saint Lucia</option ><option value="MF">Saint Martin (French part)</option ><option value="PM">Saint Pierre and Miquelon</option ><option value="VC">Saint Vincent and the Grenadines</option ><option value="WS">Samoa</option ><option value="SM">San Marino</option ><option value="ST">Sao Tome and Principe</option ><option value="SA">Saudi Arabia</option ><option value="SN">Senegal</option ><option value="RS">Serbia</option ><option value="SC">Seychelles</option ><option value="SL">Sierra Leone</option ><option value="SG">Singapore</option ><option value="SX">Sint Maarten (Dutch part)</option ><option value="SK">Slovakia</option ><option value="SI">Slovenia</option ><option value="SB">Solomon Islands</option ><option value="SO">Somalia</option ><option value="ZA">South Africa</option ><option value="GS">South Georgia and the South Sandwich Islands</option ><option value="SS">South Sudan</option ><option value="ES">Spain</option ><option value="LK">Sri Lanka</option ><option value="SD">Sudan</option ><option value="SR">Suriname</option ><option value="SJ">Svalbard and Jan Mayen</option ><option value="SZ">Swaziland</option ><option value="SE">Sweden</option ><option value="CH">Switzerland</option ><option value="SY">Syrian Arab Republic</option ><option value="TW">Taiwan</option ><option value="TJ">Tajikistan</option ><option value="TZ">Tanzania, United Republic of</option ><option value="TH">Thailand</option ><option value="TL">Timor-Leste</option ><option value="TG">Togo</option ><option value="TK">Tokelau</option ><option value="TO">Tonga</option ><option value="TT">Trinidad and Tobago</option ><option value="TN">Tunisia</option ><option value="TR">Turkey</option ><option value="TM">Turkmenistan</option ><option value="TC">Turks and Caicos Islands</option ><option value="TV">Tuvalu</option ><option value="UG">Uganda</option ><option value="UA">Ukraine</option ><option value="AE">United Arab Emirates</option ><option value="GB">United Kingdom</option ><option value="US">United States of America</option ><option value="UM">United States Minor Outlying Islands</option ><option value="UY">Uruguay</option ><option value="UZ">Uzbekistan</option ><option value="VU">Vanuatu</option ><option value="VE">Venezuela (Bolivarian Republic of)</option ><option value="VN">Viet Nam</option ><option value="VG">Virgin Islands (British)</option ><option value="VI">Virgin Islands (U.S.)</option ><option value="WF">Wallis and Futuna</option ><option value="EH">Western Sahara</option ><option value="YE">Yemen</option ><option value="ZM">Zambia</option ><option value="ZW">Zimbabwe</option> </select> </li> </ul> </fieldset> <fieldset class="u-no-margin--bottom"> <legend class="u-off-screen">About your company</legend> <h2 class="p-heading--3">About your company</h2> <ul class="p-list"> <li class="p-list__item"> <label for="company">Company name:</label> <input required id="company" name="company" maxlength="255" type="text" /> </li> <li class="p-list__item"> <label for="job-title">Job title:</label> <input required id="job-title" name="title" maxlength="255" type="text" /> </li> </ul> </fieldset> <fieldset class="u-no-margin--bottom"> <legend class="u-off-screen">Your comments</legend> <h2 class="p-heading--3">Your comments</h2> <ul class="p-list"> <li class="p-list__item"> <label for="Comments_from_lead__c">What would you like to talk to us about?</label> <textarea required id="Comments_from_lead__c" name="Comments_from_lead__c" rows="5" maxlength="2000"></textarea> </li> <li class="p-list__item"> <label class="p-checkbox"> <input class="p-checkbox__input" value="yes" aria-labelledby="canonicalUpdatesOptIn" name="canonicalUpdatesOptIn" type="checkbox"> <span class="p-checkbox__label" id="canonicalUpdatesOptIn">I agree to receive information about Canonical's products and services.</span> </label> </li> <li class="p-list__item">In submitting this form, I confirm that I have read and agree to <a href="/legal/data-privacy/contact">Canonical's Privacy Notice</a> and <a href="/legal/data-privacy">Privacy Policy</a>.</li> <li class="u-off-screen"> <label class="website" for="website">Website:</label> <input name="website" type="text" class="website" autocomplete="off" value="" id="website" tabindex="-1" /> </li> <li class="u-off-screen"> <label class="name" for="name">Name:</label> <input name="name" type="text" class="name" autocomplete="off" value="" id="name" tabindex="-1" /> </li> <li class="p-list__item"> <button type="submit" class="p-button--positive" onclick="dataLayer.push({'event' : 'GAEvent', 'eventCategory' : 'Form', 'eventAction' : 'iot contact-us', 'eventLabel' : 'snapcraft.ioappstore', 'eventValue' : undefined });">Submit</button> </li> </ul> <input type="hidden" aria-hidden="true" aria-label="hidden field" name="formid" value="{{formid}}" /> <input type="hidden" aria-hidden="true" aria-label="hidden field" name="returnURL" value="https://snapcraft.io/about/thank-you" /> <input type="hidden" aria-hidden="true" aria-label="hidden field" name="Consent_to_Processing__c" value="yes" /> <input type="hidden" aria-hidden="true" aria-label="hidden field" name="utm_campaign" id="utm_campaign" value="" /> <input type="hidden" aria-hidden="true" aria-label="hidden field" name="utm_medium" id="utm_medium" value="" /> <input type="hidden" aria-hidden="true" aria-label="hidden field" name="utm_source" id="utm_source" value="" /> <input type="hidden" aria-hidden="true" aria-label="hidden field" name="utm_content" id="utm_content" value="" /> <input type="hidden" aria-hidden="true" aria-label="hidden field" name="utm_term" id="utm_term" value="" /> <input type="hidden" aria-hidden="true" aria-label="hidden field" name="GCLID__c" id="GCLID__c" value="" /> <input type="hidden" aria-hidden="true" aria-label="hidden field" name="Facebook_Click_ID__c" id="Facebook_Click_ID__c" value="" /> <input type="hidden" aria-hidden="true" aria-label="hidden field" id="preferredLanguage" name="preferredLanguage" maxlength="255" value="" /> </fieldset> </form> </script> <script> window.addEventListener("DOMContentLoaded", function() { Raven.context(function () { snapcraft.public.blog.newsletter(); }); }); </script> <script src="/static/js/dist/global-nav.js?v=22a6ad8"></script> <script type="application/ld+json"> { "@context": "http://schema.org/", "@id": "https://snapcraft.io/#organization", "@type": "Organization", "name": "Snapcraft", "logo": "https://assets.ubuntu.com/v1/e635d1ef-snapcraft_green-red_hex.png", "url": "https://snapcraft.io", "sameAs": [ "https://developer.ubuntu.com/snapcraft", "https://github.com/snapcore/snapcraft", "https://en.wikipedia.org/wiki/Snappy_(package_manager)", "https://twitter.com/snapcraftio", "https://www.facebook.com/snapcraftio/", "https://www.youtube.com/snapcraftio" ] } </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@id": "https://snapcraft.io/#website", "@type": "WebPage", "name": "Snapcraft", "url": "https://snapcraft.io/blog/what-is-virtualisation-the-basics" } </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@id": "https://snapcraft.io/#article", "@type": "Article", "name": "", "author": { "@type": "Person", "name": "Rhys Davies" }, "datePublished": "2021-02-26T11:13:53", "image": "https://ubuntu.com/wp-content/uploads/2b35/virtualisationimage.jpg", "url": "https://snapcraft.io/blog/what-is-virtualisation-the-basics", "publisher": { "@type": "Organization", "name": "Snapcraft" } } </script> </body> </html>