{"id":464,"date":"2026-08-31T03:09:08","date_gmt":"2026-08-31T01:09:08","guid":{"rendered":"https:\/\/nutanix.ma\/?p=464"},"modified":"2026-08-31T03:09:08","modified_gmt":"2026-08-31T01:09:08","slug":"creating-a-vm-and-installing-linux-os-and-enabling-ngt-on-it","status":"publish","type":"post","link":"https:\/\/nutanix.ma\/index.php\/2026\/08\/31\/creating-a-vm-and-installing-linux-os-and-enabling-ngt-on-it\/","title":{"rendered":"Creating a VM and Installing Linux OS and enabling NGT on it"},"content":{"rendered":"<p>Creating a VM on AHV, installing a guest OS on it and then enabling Nutanix Guest Tools is one of those end-to-end tasks that comes up on nearly every engagement. It&#8217;s straightforward once you&#8217;ve done it a few times, but there are a couple of places where the order of operations matters \u2014 particularly attaching the installation media before first boot, and getting NGT onto the guest afterwards. This post walks through the whole sequence on a Linux VM, with screenshots from the actual project (customer identifiers, host names and IP addresses have been redacted throughout).<\/p>\n<h2>Step 1 \u2014 Create the VM<\/h2>\n<p>Everything starts from Prism Element&#8217;s VM view, where &#8220;+ Create VM&#8221; opens the configuration form. The General Configuration section covers the basics: a name and description, and a timezone. It&#8217;s worth pausing on the timezone note Prism shows here \u2014 use UTC for Linux VMs and local time for Windows VMs. Below that, Compute Details sets the vCPU count and cores per vCPU; this VM was built as a small web server, so two vCPUs was plenty.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-01.webp\" alt=\"Prism Element Create VM dialog showing the General Configuration section with name, description, timezone and vCPU fields\"\/><figcaption>Creating the VM \u2014 name, timezone and compute sizing in one form.<\/figcaption><\/figure>\n<h2>Step 2 \u2014 Attach the installation media<\/h2>\n<p>Scrolling further down the same form reaches the Disks section. A new VM comes with an empty IDE CD-ROM already attached, which is exactly what the OS installer needs to boot from.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-02.webp\" alt=\"Create VM form showing the Disks section with an empty IDE CD-ROM attached by default\"\/><figcaption>The default empty CD-ROM \u2014 this is what gets pointed at the installer ISO.<\/figcaption><\/figure>\n<p>Editing that CD-ROM opens the Update Disk dialog. Setting the operation to &#8220;Clone from Image Service&#8221; and picking the Ubuntu Server image from the dropdown mounts the ISO to the VM. This assumes the ISO has already been uploaded to the cluster&#8217;s Image Service \u2014 if it hasn&#8217;t, that&#8217;s a prerequisite to sort out before creating the VM.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-03.webp\" alt=\"Update Disk dialog set to Clone from Image Service with an Ubuntu Server image selected on the IDE bus\"\/><figcaption>Pointing the CD-ROM at the Ubuntu Server image held in the Image Service.<\/figcaption><\/figure>\n<h2>Step 3 \u2014 Add the data disk<\/h2>\n<p>Next, &#8220;Add New Disk&#8221; creates the actual virtual disk the OS will install onto. The type is DISK, the operation is &#8220;Allocate on Storage Container&#8221;, and the bus type is SCSI \u2014 which is the right choice for a Linux guest on AHV, since the VirtIO SCSI driver is built into modern kernels. After choosing the storage container and setting the size (500 GiB here), the index can be left on &#8220;Next Available&#8221;.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-04.webp\" alt=\"Add Disk dialog allocating a 500 GiB SCSI disk on a storage container\"\/><figcaption>Allocating the 500 GiB SCSI disk the guest OS will be installed on.<\/figcaption><\/figure>\n<p>With both in place, the Disks list shows the two entries side by side: the CD-ROM now holding the installer ISO, and the empty 500 GiB SCSI disk.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-05.webp\" alt=\"Disks list showing a populated CD-ROM on ide.0 and a 500 GiB disk on scsi.0\"\/><figcaption>Both disks attached \u2014 installer media on IDE, the target disk on SCSI.<\/figcaption><\/figure>\n<h2>Step 4 \u2014 Add a network adapter<\/h2>\n<p>The last piece of the VM definition is the NIC. &#8220;Add New NIC&#8221; asks for a subnet, and once one is picked Prism displays its VLAN ID, IPAM mode and the virtual switch backing it. With the network left unmanaged, no address is handed out by Prism and the guest is responsible for its own IP configuration \u2014 which is why Private IP Assignment shows NONE here.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-06.webp\" alt=\"Create NIC dialog showing subnet selection with VLAN ID, IPAM mode, virtual switch and connection state\"\/><figcaption>Adding the NIC \u2014 on an unmanaged subnet, addressing is left to the guest.<\/figcaption><\/figure>\n<h2>Step 5 \u2014 Install the OS from the console<\/h2>\n<p>Saving the VM and powering it on, then launching the console, boots straight into the Ubuntu Server installer. The first prompt is the keyboard layout \u2014 worth setting correctly rather than accepting the default, because it&#8217;s the layout you&#8217;ll be typing the root password with a few screens later.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-07.webp\" alt=\"Ubuntu installer keyboard configuration screen with a layout selected\"\/><figcaption>Keyboard layout \u2014 set this properly, you&#8217;ll be typing a password with it shortly.<\/figcaption><\/figure>\n<p>The installer then offers a choice between the full Ubuntu Server install and the minimized variant. The minimized build strips out tooling that isn&#8217;t needed on machines people don&#8217;t log into interactively; for a general-purpose server the full install is the more comfortable option. There&#8217;s also a checkbox here for searching third-party drivers, which isn&#8217;t needed on AHV since the VirtIO drivers are already in the kernel.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-08.webp\" alt=\"Ubuntu installer screen choosing between Ubuntu Server and Ubuntu Server minimized\"\/><figcaption>Choosing the full Ubuntu Server install over the minimized variant.<\/figcaption><\/figure>\n<p>Network configuration comes next. The VirtIO NIC shows up as <code>ens3<\/code>, correctly identified as a Red Hat Virtio network device. On an unmanaged subnet with no DHCP there&#8217;s nothing for the installer to pick up automatically, so this environment continued without network and had addressing configured after the install.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-09.webp\" alt=\"Ubuntu installer network configuration screen showing the ens3 VirtIO interface disabled with an option to continue without network\"\/><figcaption>The VirtIO NIC is detected as ens3 \u2014 with no DHCP on the subnet, the install continues offline.<\/figcaption><\/figure>\n<p>Because there&#8217;s no network yet, the next two screens \u2014 proxy configuration and the Ubuntu archive mirror \u2014 are both left at their defaults. The installer even notes that it can&#8217;t validate the mirror, since it has no connectivity to test it with.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-10.webp\" alt=\"Ubuntu installer proxy configuration screen left blank\"\/><figcaption>No proxy in this environment, so the field stays empty.<\/figcaption><\/figure>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-11.webp\" alt=\"Ubuntu installer archive mirror configuration screen noting the mirror cannot be checked without a network\"\/><figcaption>The mirror can&#8217;t be validated without connectivity \u2014 the default is fine.<\/figcaption><\/figure>\n<h2>Storage layout<\/h2>\n<p>The guided storage screen is where the 500 GiB SCSI disk finally gets used. &#8220;Use an entire disk&#8221; with &#8220;Set up this disk as an LVM group&#8221; ticked is the sensible default for a server \u2014 LVM makes it far easier to grow filesystems later without touching the partition table. LUKS encryption is offered here too, and was left off in this case.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-12.webp\" alt=\"Ubuntu guided storage configuration using an entire 500 GB disk set up as an LVM group\"\/><figcaption>Guided storage on the full disk, with LVM enabled.<\/figcaption><\/figure>\n<p>The resulting summary is worth reading carefully, because the installer&#8217;s default is easy to miss: it creates a volume group across the whole disk but only allocates 100 GiB to the root logical volume, leaving nearly 400 GiB unallocated. That&#8217;s not a mistake \u2014 it&#8217;s free headroom that can be handed to <code>\/<\/code> or to new logical volumes later with <code>lvextend<\/code>. If you actually wanted the whole disk as root from day one, this is the screen to change it on.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-13.webp\" alt=\"Ubuntu storage configuration summary showing a 100 GiB root logical volume, a 2 GiB boot partition and free space remaining in the volume group\"\/><figcaption>Root gets 100 GiB by default \u2014 the rest of the volume group stays free for later.<\/figcaption><\/figure>\n<p>Confirming the layout triggers the usual destructive-action warning. Past this point the disk gets formatted and there&#8217;s no going back to previous screens.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-14.webp\" alt=\"Ubuntu installer confirm destructive action dialog warning that continuing will format the selected disks\"\/><figcaption>The point of no return \u2014 everything after this writes to disk.<\/figcaption><\/figure>\n<h2>Profile, updates and remote access<\/h2>\n<p>Profile configuration sets the server&#8217;s hostname along with the first user account and its password. That password matters even on a key-based setup, since it&#8217;s what <code>sudo<\/code> will ask for.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-15.webp\" alt=\"Ubuntu installer profile configuration screen with fields for name, server name, username and password\"\/><figcaption>Setting the hostname and the first user account.<\/figcaption><\/figure>\n<p>The Ubuntu Pro screen follows. It needs an internet connection to enable, so on an offline install it&#8217;s skipped \u2014 it can always be attached later once the machine has connectivity.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-16.webp\" alt=\"Ubuntu Pro upgrade screen with the skip option selected\"\/><figcaption>Ubuntu Pro needs connectivity, so it&#8217;s skipped at install time.<\/figcaption><\/figure>\n<p>SSH is the one screen not to click past. Ticking &#8220;Install OpenSSH server&#8221; is what makes the VM reachable without the Prism console afterwards \u2014 and on a machine with no network configured yet, forgetting it means going back through the console to install it by hand.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-17.webp\" alt=\"Ubuntu installer SSH configuration screen with Install OpenSSH server selected\"\/><figcaption>Installing OpenSSH server during setup saves a trip back through the console later.<\/figcaption><\/figure>\n<p>Once the installation finishes and the VM reboots, the console lands on a normal login prompt and the usual Ubuntu message of the day \u2014 kernel version, resource usage and update status.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-18.webp\" alt=\"First boot of the installed Ubuntu 24.04 LTS server showing the login prompt and system information summary\"\/><figcaption>First boot \u2014 Ubuntu 24.04 LTS installed and running on AHV.<\/figcaption><\/figure>\n<h2>Step 6 \u2014 Enabling Nutanix Guest Tools<\/h2>\n<p>With the OS up, the last job is NGT. It&#8217;s what gives the cluster in-guest visibility and enables application-consistent snapshots, guest-level VSS\/quiescing, self-service file restore and in-place guest shutdown \u2014 so on a production VM it isn&#8217;t really optional. NGT is enabled for the VM from Prism, which attaches the NGT ISO to the VM&#8217;s CD-ROM; the console&#8217;s own &#8220;Mount ISO&#8221; control does the same job from the console window.<\/p>\n<p>From there the rest happens inside the guest. The ISO is mounted (it may already be mounted automatically), and the installer lives under the <code>installer\/linux<\/code> directory on it:<\/p>\n<pre><code>sudo mount \/dev\/sr0 \/mnt\ncd \/mnt\/installer\/linux\/\nsudo .\/install_ngt.py<\/code><\/pre>\n<p>Listing that directory first is a useful sanity check \u2014 <code>install_ngt.py<\/code>, <code>install_ngt_core.py<\/code> and the matching uninstall scripts should all be there. Running <code>install_ngt.py<\/code> with sudo then installs the guest agent and the self-service restore components.<\/p>\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/nutanix.ma\/wp-content\/uploads\/2026\/08\/creating-vm-linux-ngt-19.webp\" alt=\"Guest console showing the NGT ISO mounted and the install_ngt.py script being run from the installer linux directory\"\/><figcaption>Mounting the NGT ISO inside the guest and running the installer.<\/figcaption><\/figure>\n<p>That&#8217;s the full path from an empty cluster slot to a running, managed Linux VM: define the VM with its media, disk and NIC, install the OS through the console, then enable NGT so the cluster can actually see and protect what&#8217;s inside it. The only step that regularly gets skipped is the last one \u2014 and it&#8217;s the one that matters most the first time you try to take an application-consistent snapshot.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Creating a VM on AHV, installing a guest OS on it and then enabling Nutanix Guest Tools is one of those end-to-end tasks that comes up on nearly every engagement. It&#8217;s straightforward once you&#8217;ve done it a few times, but there are a couple of places where the order of operations matters \u2014 particularly attaching [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-464","post","type-post","status-publish","format-standard","hentry","category-nutanix"],"_links":{"self":[{"href":"https:\/\/nutanix.ma\/index.php\/wp-json\/wp\/v2\/posts\/464","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nutanix.ma\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nutanix.ma\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nutanix.ma\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nutanix.ma\/index.php\/wp-json\/wp\/v2\/comments?post=464"}],"version-history":[{"count":1,"href":"https:\/\/nutanix.ma\/index.php\/wp-json\/wp\/v2\/posts\/464\/revisions"}],"predecessor-version":[{"id":465,"href":"https:\/\/nutanix.ma\/index.php\/wp-json\/wp\/v2\/posts\/464\/revisions\/465"}],"wp:attachment":[{"href":"https:\/\/nutanix.ma\/index.php\/wp-json\/wp\/v2\/media?parent=464"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nutanix.ma\/index.php\/wp-json\/wp\/v2\/categories?post=464"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nutanix.ma\/index.php\/wp-json\/wp\/v2\/tags?post=464"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}