<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>The Virtual Horizon</title>
	<atom:link href="https://thevirtualhorizon.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://thevirtualhorizon.com</link>
	<description>Virtualization, Automation, and End-User Computing</description>
	<lastBuildDate>Tue, 20 Aug 2024 11:48:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<atom:link rel="search" type="application/opensearchdescription+xml" href="https://thevirtualhorizon.com/osd.xml" title="The Virtual Horizon" />
	<atom:link rel='hub' href='https://thevirtualhorizon.com/?pushpress=hub'/>
	<item>
		<title>Why You Should Attend the First EUC World Conference&#8230;</title>
		<link>https://thevirtualhorizon.com/2024/08/20/why-you-should-attend-the-first-euc-world-conference/</link>
		
		<dc:creator><![CDATA[seanpmassey]]></dc:creator>
		<pubDate>Tue, 20 Aug 2024 13:30:00 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://thevirtualhorizon.com/?p=2563</guid>

					<description><![CDATA[If you’re in the EUC space, you have probably heard about EUC World: Independence.&#160; A couple of weeks ago, the World of EUC announced their first conference that will be taking place on October 22nd and 23rd in Silver Springs, Maryland.&#160;&#160; So after hearing that name, you’re probably wondering a few things.&#160; Why is “Independence” &#8230; <a href="https://thevirtualhorizon.com/2024/08/20/why-you-should-attend-the-first-euc-world-conference/" class="more-link">Continue reading <span class="screen-reader-text">Why You Should Attend the First EUC World Conference&#8230;</span></a>]]></description>
										<content:encoded><![CDATA[
<p>If you’re in the EUC space, you have probably heard about EUC World: Independence.&nbsp;</p>



<p>A couple of weeks ago, the World of EUC announced their first conference that will be taking place on October 22nd and 23rd in Silver Springs, Maryland.&nbsp;&nbsp;</p>



<p>So after hearing that name, you’re probably wondering a few things.&nbsp; Why is “Independence” called out so strongly in the name? And probably most importantly, why should I attend?&nbsp;</p>



<h3 class="wp-block-heading">The Independent EUC Conference</h3>



<p>Independence is a big part of what EUC World will be.&nbsp; But why does independence matter?&nbsp; And why have we made it a big part of the conference name?</p>



<p>The EUC World: Independence Mission Statement is:</p>



<p><em>To empower the EUC community through open collaboration and knowledge sharing, fostering innovation and driving industry standards that prioritize user experience and technological inclusivity.</em></p>



<p>Most IT conferences are organized by a vendor or software company.&nbsp; They set the agenda, messaging, and tone of the event.&nbsp; Everything revolves around that vendor because its their event.</p>



<p>EUC World: Independence is fundamentally different in two ways:</p>



<p><strong>Platform-agnostic discussion:</strong> We welcome diverse perspectives and technologies, ensuring no single vendor dictates the conversation.</p>



<p><strong>Community-driven content:</strong> Attendees shape the agenda through contributions, workshops, and presentations, reflecting the collective knowledge and needs of the EUC landscape.</p>



<p>Collective influence: By uniting experts and IT professionals, we aim to guide the EUC industry towards a future that prioritizes user-centric solutions and equitable access to technology.</p>



<p>EUC World is an event organized by the EUC Community for the EUC Community.&nbsp; It is a conference featuring community in everything it does, including:</p>



<ul class="wp-block-list">
<li>Keynotes by notable community members Brian Madden, Shawn Bass, and Gabe Knuth</li>



<li>Technical sessions by Dane Young, Shane Kleinert, Sven Huisman, Esther Bartel, and Chris Hildrebrandt</li>



<li>An “EUC Unplugged” style unconference event on the afternoon of the 2nd day of the conference. This is an event where attendees will submit and vote on the Day 2 agenda on the first day of the conference.</li>
</ul>



<p>As you can see, the community is at the heart of EUC World.</p>



<p>That doesn’t mean we won’t have sponsors.&nbsp; EUC World’s four premier sponsors are <a href="https://www.liquidware.com" target="_blank" rel="noreferrer noopener">Liquidware</a>, <a href="https://www.nerdio.com" target="_blank" rel="noreferrer noopener">Nerdio</a>, <a href="https://www.nvidia.com" target="_blank" rel="noreferrer noopener">NVIDIA</a>, and <a href="https://www.omnissa.com" target="_blank" rel="noreferrer noopener">Omnissa</a>, and the other announced conference sponsors at the time of this post are <a href="https://www.10zig.com/" target="_blank" rel="noreferrer noopener">10ZiG</a>, <a href="https://www.apporto.com/" target="_blank" rel="noreferrer noopener">Apporto</a>, <a href="https://goliathtechnologies.com/" target="_blank" rel="noreferrer noopener">Goliath Technologies</a>, <a href="https://www.sonet.io/" target="_blank" rel="noreferrer noopener">Sonet.io</a>, and <a href="https://www.stratodesk.com/" target="_blank" rel="noreferrer noopener">Stratodesk</a>.</p>



<h3 class="wp-block-heading">How to Attend EUC World: Independence</h3>



<p>This probably sounds like a great event to attend if you work with EUC products or are in the EUC community.&nbsp;&nbsp;</p>



<p>You can see the full conference schedule, list of speakers, and register at <a href="https://worldofeuc.org/eucworld2024">https://worldofeuc.org/eucworld2024</a>.&nbsp;</p>



<p>If you register by August 31st, 2024, you will receive the early bird rate of $150 for the event.&nbsp; The price goes up to $200 on September 1st.&nbsp; After registering, you will also receive an event code to book your hotel room at the Doubletree by Hilton Washington DC using our discounted rate of $169 per night.&nbsp;</p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/75ff08ce290eed6b2bb45153574afdf35f3d5b7aae83d1d3add359b31bea93d5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">seanpmassey</media:title>
		</media:content>
	</item>
		<item>
		<title>Omnissa Horizon Load Balancing Overview</title>
		<link>https://thevirtualhorizon.com/2024/06/17/omnissa-horizon-load-balancing-overview/</link>
		
		<dc:creator><![CDATA[seanpmassey]]></dc:creator>
		<pubDate>Mon, 17 Jun 2024 15:22:18 +0000</pubDate>
				<category><![CDATA[omnissa]]></category>
		<category><![CDATA[Omnissa Horizon]]></category>
		<category><![CDATA[VMware View]]></category>
		<category><![CDATA[horizon]]></category>
		<category><![CDATA[Load Balancing]]></category>
		<category><![CDATA[Unified Access Gateway]]></category>
		<guid isPermaLink="false">http://thevirtualhorizon.com/?p=2558</guid>

					<description><![CDATA[I’ve been spending a lot of time in the “VMware Horizon*” sub-Reddit lately where I’ve been trying to help others with their Horizon questions. One common theme that keeps popping up is regarding load balancing, and I decided that it would be easier to write a blog post to address the common load balancing scenarios &#8230; <a href="https://thevirtualhorizon.com/2024/06/17/omnissa-horizon-load-balancing-overview/" class="more-link">Continue reading <span class="screen-reader-text">Omnissa Horizon Load Balancing&#160;Overview</span></a>]]></description>
										<content:encoded><![CDATA[
<p>I’ve been spending a lot of time in the “VMware Horizon*<sup data-fn="34d7064a-f4e0-4153-a234-6b6d8f86dcb1" class="fn"><a href="#34d7064a-f4e0-4153-a234-6b6d8f86dcb1" id="34d7064a-f4e0-4153-a234-6b6d8f86dcb1-link">1</a></sup>” sub-Reddit lately where I’ve been trying to help others with their Horizon questions. One common theme that keeps popping up is regarding load balancing, and I decided that it would be easier to write a blog post to address the common load balancing scenarios and use cases than rewriting or pasting a long-winded reply in each thread.</p>



<p>Load balancing is an important part of designing and deploying a Horizon environment. It is an important consideration for service availability and scalability, and there are multiple Techzone articles that talk about load balancing. I have links to some of these articles at the end of this post.</p>



<h3 class="wp-block-heading">How load balancing fits into a Horizon deployment</h3>



<p>Horizon can utilize a load balancer in three different ways. These are:</p>



<ul class="wp-block-list">
<li>load balancing the Horizon 8 Connection Servers </li>



<li>load balancing the Unified Access Gateways in Horizon 8 deployments</li>



<li>load balancing App Volumes Managers.</li>
</ul>



<p>While App Volumes can also benefit from a load balancer, I won’t be covering that topic in this post. I also won’t be covering global load balancing or multi-site load balancing, and I won’t be doing a comparison of different load balancers. If your question is “which load balancer should I use?” my answer is “yes” followed by “what are your requirements?”</p>



<p>Load balancing for Horizon Connection Servers (CS) and Unified Access Gateways (UAG) seems pretty simple. At least, it seems simple on the surface. But every load balancer or load balancer-as-a-service is implemented differently, and this may require different architectures to achieve the same outcome.</p>



<p>This post is going to focus on load balancing Internet-facing Unified Access Gateways in external access scenarios as this is what most people seem to struggle with.</p>



<h3 class="wp-block-heading">Why Deploy A Load Balancer With Horizon</h3>



<p>So let’s get the first question out of the way.  Why should you load balance your Horizon deployment?  What benefits does it provide?  </p>



<p>There are two reasons to deploy a load balancer, and they are somewhat related.  The first reason is to improve service availability, and the second reason is to support additional user sessions. Both of these are accomplished the same way &#8211; horizontally scaling the environment by adding additional CSes or UAGs. </p>



<p>Adding additional CSs and UAGs increases the number of concurrent sessions that our environment can support, and it increases the availability of the Horizon service. With proper health checks enabled, you can maintain service availability even if a CS or UAG goes offline because the load balancer will just direct new sessions to other components that are available.</p>



<p>We can also provide a consistent user experience by using a single URL to access the service so users do not need to know the URL for each Connection Server or UAG.</p>



<p>Some load balancers can do more than just load balancing between components. Many load balancers can provide SSL offloading services. Some load balancers add security features, real-time analytics, web application catalogs, or other features. Those are out-of-scope for this guide, but it is important to understand what capabilities your load balancer solution can provide as this can shape your desired outcome.</p>



<h3 class="wp-block-heading">Understanding Horizon Connectivity Flows</h3>



<p>Before we talk about load balancing options for Horizon, it’s important to understand traffic flows between the Horizon Client, Unified Access Gateway, Connection Server, and the agent that is deployed on the virtual desktop or RDSH server.</p>



<p>Horizon uses two main protocols.  These are:</p>



<ul class="wp-block-list">
<li>XML-API over HTTPS: This is the protocol used for authentication and session management. The documentation considers this the “primary protocol.”</li>



<li>Session Protocol Traffic: This is the protocol used for communication between the Horizon Client and Agent. Horizon has two protocols, PCoIP and Blast, and can use an HTTPS tunnel for side channel traffic like Client Drive Redirection (CDR) and Multimedia Redirection (MMR). The documentation refers to these protocols as “secondary protocols.”</li>
</ul>



<p>Horizon also requires session affinity. When connecting to an environment, a load balancer will direct the user to a UAG or Connection Server to authenticate.  All subsequent primary and secondary traffic must be with that UAG or Connection Server. If you do not have session affinity, then a user will be required to reauthenticate when the load balancer directs their session to a new UAG or Connection Server, and it can interrupt their access to their sessions.</p>



<p>There are multiple ways to set up session affinity including Source IP Persistence, using multiple VIPs with one VIP mapped to each UAG, and providing a public IP for each UAG.</p>



<p>So what does session traffic flow look like?  The Omnissa Techzone page has a really good explanation that you can read <a href="https://techzone.omnissa.com/resource/understand-and-troubleshoot-horizon-connections#primary-and-secondary-protocols">here</a>.</p>



<figure class="wp-block-image"><a href="https://techzone.omnissa.com/resource/understand-and-troubleshoot-horizon-connections#external-connections"><img src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfdh_BiaemvEAqR-QK6kPjpa2iWHJ65MrYo8gXg1QHyE7KGI08snOuhgO00dmiHOGUh467V0NvqKL1xqDEhy2aZZ-3VSe2Ob9L82gFsowiLMl1scC3ytqZFpZt0_a_Io_xwrjr6gGiSjEQowzKe9Vq9K0Y?key=TRq03j0D03gVz2gfb4A3PQ" alt="" /></a></figure>



<p><strong>Figure 1</strong>: Horizon Traffic Flow with UAGs and Load Balancers (Retrieved from <a href="https://techzone.omnissa.com/resource/understand-and-troubleshoot-horizon-connections#external-connections" rel="nofollow">https://techzone.omnissa.com/resource/understand-and-troubleshoot-horizon-connections#external-connections</a>)</p>



<h3 class="wp-block-heading">High-Level Horizon Load Balancer Architectures</h3>



<p>There are two deployment architectures I’ve regularly encountered when designing for external access.  </p>



<p>The first, which I will refer to as N+1, is to just use the load balancer for XML-API over HTTPS traffic.  In this scenario, the XML-API over HTTPS traffic will be sent through the load balancer, and any session protocol (or secondary) traffic will occur directly with the UAG.  When configuring your UAGs in an N+1 scenario, you need to provide a unique URL for the Blast Secure Gateway or a unique public IP address for the PCoIP Secure Gateway, and your SSL certificate needs to contain subject alternative names for the load balanced URL and the UAG’s unique URL. </p>



<p>(<a href="https://docs.omnissa.com/bundle/UnifiedAccessGatewayDeployandConfigureV2312/page/UnifiedAccessGatewaySupportforHTTPHostRedirect.html">The Unified Access Gateway also supports HTTP Host Redirection for Horizon environments</a>, but this is only used in some specific load balancer scenarios.)</p>



<p>The second deployment architecture is having all Horizon traffic pass through the load balancer. This includes both the XML-API over HTTPS and session protocol traffic.  This deployment option is typically used in environments where there is a limited number of public IP addresses.  </p>



<p>Session Affinity and throughput are the biggest concerns when using this approach.  The load balancer appliance can become a traffic bottleneck, and it needs to be sized to handle the number of concurrent sessions.  Session affinity is also a concern as an improperly configured load balancer can result in disconnects or failure to launch a session. </p>



<h3 class="wp-block-heading">Load Balancing Options for Horizon</h3>



<p>At a high level, here are three categories of load balancers that can be used with Horizon.  These are:</p>



<ul class="wp-block-list">
<li>3rd-Party external load balancers like NSX Advanced Load Balancer (Avi), F5, Netscaler, Kemp and others. This can also include open-source solutions like Nginx or HAProxy.</li>



<li>Cloud Load Balancer Services</li>



<li><a href="https://docs.omnissa.com/bundle/UnifiedAccessGatewayDeployandConfigureV2306/page/UnifiedAccessGatewayHighAvailability.html">Unified Access Gateway High-Availability</a></li>
</ul>



<h3 class="wp-block-heading">Unified Access Gateway High Availability</h3>



<p>I want to talk about the Unified Access Gateway High-Availability feature first.  This is probably the most misunderstood option, and while it can be a great solution for some customers, it will not be a good fit for many customers. <a href="https://docs.omnissa.com/bundle/UnifiedAccessGatewayDeployandConfigureV2306/page/UnifiedAccessGatewayHighAvailability.html">It’s worth reading the documentation on this feature</a> if you’re considering this option.  </p>



<p>When deployed for Horizon, UAG HA uses Round Robin with Source IP Affinity for directing traffic between UAGs. But unlike other options, it can only provides high availability for the XML-API over HTTPs traffic.  It does not provide high availability for session protocol traffic like Blast or PCoIP.  </p>



<p>If you are looking to use this feature in an Internet-facing scenario, you would need N+1 public IP addresses and DNS names, where N is the number of UAGs you are deploying or plan to deploy plus one for the load balanced VIP shared by all of the UAGs. This is because the Horizon Client needs to be able to reach the UAG that it authenticated on for session traffic.</p>



<p>Unified Access Gateway High Availability may also not work in some public cloud scenarios where you are deploying into a native public cloud.</p>



<h3 class="wp-block-heading">External 3rd-Party Load Balancers</h3>



<p>The next option is the 3rd-party external load balancer. This is your traditional load balancer.  It can provide the most deployment flexibility, and most vendors have a guide for deploying their solution with Horizon.  </p>



<p>Third-party load balancers may also provide their own value-added features on top of basic load balancing. F5, for example, can integrate into Horizon when using their iApp, and the Avi documentation contains deployment guides for multiple customer deployment scenarios.</p>



<p>There are also open-source options here &#8211; NGINX and HAProxy being the two most common in my experience &#8211; but there may be some tradeoffs. Open-source HAProxy only supports TCP traffic with UDP load balancing included in their paid enterprise product. Open-source NGINX can support TCP and UDP traffic, but active health checks are part of the paid product (although there are ways to work around that &#8211; I just haven’t tested them any).</p>



<h3 class="wp-block-heading">Cloud Native Load Balancer-as-a-Service</h3>



<p>The final option to consider is Cloud Native Load Balancer-as-a-Service options.  These are useful if you are deploying into a cloud-based VMware SDDC Service like Google Cloud VMware Engine, Azure VMware Solution, or Oracle Cloud VMware, or into a native public cloud like Amazon Web Services for Horizon on Amazon Workspaces Core and EC2.</p>



<p>There are many varieties of cloud-native load balancer services. These come with different feature sets, supported network topologies, and price points. Some load balancing services only support HTTP and HTTPs, others can support all TCP and UDP traffic. Some only work with services that are in the same VCP or vNET as the load balancer while others can provide load balancing to services in other networks or even endpoints in remote data centers over a WAN or VPN connection.  </p>



<p>Public cloud scenarios are usually good for the N+1 IP deployment model.  Public cloud providers have large pools of IPv4 addresses that you can borrow from for a very small monthly fee.</p>



<h3 class="wp-block-heading">Do I Need a Load Balancer Between My Unified Access Gateways and Connection Servers?</h3>



<p>One of the benefits the UAG had over the old Horizon Security Server was that you didn’t need to map each UAG to a Connection Server. You could point them at a load balanced internal URL, and if a Connection Server went offline, the internal load balancer would just direct new sessions to a different Connection Server.</p>



<p>This was much easier than trying to load balance Security Servers, where complicated health check rules were required to detect when a Connection Server was down and take the Security Server offline.</p>



<p>But do you need a load balancer between the UAGs and Connection Servers?</p>



<p>Surprisingly, the answer is no.  While this is a supported deployment, it isn’t required. And it doesn’t require any complex health check setups.  </p>



<p>When configuring a load balancer health check for Horizon, you should point to favicon.ico. The UAG is a reverse proxy, and it proxies the favicon.ico file from the Connection Server (or load balanced set of Connection Servers).  If the Connection Server goes offline, the UAG health check will fail and the load balancer will mark it as down.</p>



<h3 class="wp-block-heading">Questions to Ask When Getting Started with Horizon Load Balancers</h3>



<p>Before we can start architecting a load balancer solution for Horizon, we have to define what our requirements and outcomes are. These should be defined during your discovery or design phase by asking the following questions:</p>



<ol class="wp-block-list">
<li>Where are you deploying or hosting the environment?</li>



<li>What load balancers do you have in place today for other services? What sort of traffic types do your existing load balancers support? How much throughput can they handle?</li>



<li>What do your internal and external user traffic flows look like (or what do you want them to look like)? Are you currently or planning on sending both internal and external user sessions through UAGs or just external users?</li>



<li>Do you have any requirements around multi-factor authentication, Smart Card support, or TrueSSO?</li>



<li>What requirements does your security team have?</li>



<li>What is your budget?</li>



<li>How many public IP addresses do you have access to or are available to you for external access?</li>
</ol>



<p>The answers to these questions will help define the load balancer and external access architecture. </p>



<h3 class="wp-block-heading">Learning More</h3>



<p>If you want to learn more about load balancing Horizon environments, you can check out the following resources from Omnissa and VMware by Broadcom.  You should also check with your preferred load balancer vendor to see if they have any Horizon configuration guides or reference architectures.</p>



<ul class="wp-block-list">
<li><a href="https://techzone.omnissa.com/resource/load-balancing-unified-access-gateway-horizon#purpose-of-this-tutorial">https://techzone.omnissa.com/resource/load-balancing-unified-access-gateway-horizon#purpose-of-this-tutorial</a></li>



<li><a href="https://techzone.omnissa.com/resource/understand-and-troubleshoot-horizon-connections#primary-and-secondary-protocols">https://techzone.omnissa.com/resource/understand-and-troubleshoot-horizon-connections#primary-and-secondary-protocols</a></li>



<li><a href="https://docs.vmware.com/en/VMware-NSX-Advanced-Load-Balancer/30.1/Solutions-Guide/GUID-643672EE-CA22-44EF-AB34-74E7881E5BA0.html">https://docs.vmware.com/en/VMware-NSX-Advanced-Load-Balancer/30.1/Solutions-Guide/GUID-643672EE-CA22-44EF-AB34-74E7881E5BA0.html</a></li>



<li><a href="https://docs.omnissa.com/bundle/UnifiedAccessGatewayDeployandConfigureV2312/page/UnifiedAccessGatewaySupportforHTTPHostRedirect.html">https://docs.omnissa.com/bundle/UnifiedAccessGatewayDeployandConfigureV2312/page/UnifiedAccessGatewaySupportforHTTPHostRedirect.html</a></li>
</ul>


<ol class="wp-block-footnotes"><li id="34d7064a-f4e0-4153-a234-6b6d8f86dcb1">Yes…I am aware that the new name will be Omnissa Horizon, but this is the name of the channel until someone with admin rights changes it. I don’t want to hear it, Rob… <a href="#34d7064a-f4e0-4153-a234-6b6d8f86dcb1-link"><img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></li></ol>]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/75ff08ce290eed6b2bb45153574afdf35f3d5b7aae83d1d3add359b31bea93d5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">seanpmassey</media:title>
		</media:content>

		<media:content url="https://lh7-us.googleusercontent.com/docsz/AD_4nXfdh_BiaemvEAqR-QK6kPjpa2iWHJ65MrYo8gXg1QHyE7KGI08snOuhgO00dmiHOGUh467V0NvqKL1xqDEhy2aZZ-3VSe2Ob9L82gFsowiLMl1scC3ytqZFpZt0_a_Io_xwrjr6gGiSjEQowzKe9Vq9K0Y?key=TRq03j0D03gVz2gfb4A3PQ" medium="image" />
	</item>
		<item>
		<title>How to Configure the NVIDIA vGPU Drivers, CUDA Toolkit and Container Toolkit on Debian 12</title>
		<link>https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/</link>
		
		<dc:creator><![CDATA[seanpmassey]]></dc:creator>
		<pubDate>Fri, 31 May 2024 19:03:03 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[NVIDIA]]></category>
		<category><![CDATA[VMWare]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[gpu]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NVAIE]]></category>
		<category><![CDATA[Private AI]]></category>
		<category><![CDATA[vGPU]]></category>
		<guid isPermaLink="false">http://thevirtualhorizon.com/?p=2529</guid>

					<description><![CDATA[As I&#8217;ve started building more GPU-enabled workloads in my home lab, I&#8217;ve found myself repeating a few steps to get the required software installed. It involved multiple tools, and I was referencing multiple sources in the vendor documentation. I wanted to pull everything together into one document &#8211; both to document my process so I &#8230; <a href="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/" class="more-link">Continue reading <span class="screen-reader-text">How to Configure the NVIDIA vGPU Drivers, CUDA Toolkit and Container Toolkit on Debian&#160;12</span></a>]]></description>
										<content:encoded><![CDATA[
<p>As I&#8217;ve started building more GPU-enabled workloads in my home lab, I&#8217;ve found myself repeating a few steps to get the required software installed. It involved multiple tools, and I was referencing multiple sources in the vendor documentation.</p>



<p>I wanted to pull everything together into one document &#8211; both to document my process so I can automate it and also to share so I can help others who are looking at the same thing.</p>



<p>So this post covers the steps for installing and configuring the NVIDIA drivers, CUDA toolkit, and/or the Container Toolkit on vSphere virtual machines.</p>



<h3 class="wp-block-heading"><strong>Install NVIDA Driver Prequisites</strong></h3>



<p>There are a few prerequisites required before installing the NVIDIA drivers. &nbsp;This includes installing kernel headers, the programs required to compile the NVIDIA drivers, and disabling Nouveau. We will also install the NVIDIA CUDA Repo.</p>



<pre class="wp-block-code"><code>#Install Prerequisites
sudo apt-get install xfsprogs wget git python3 python3-venv python3-pip p7zip-full build-essential -y
sudo apt-get install linux-headers-$(uname -r) -y

#Disable Nouveau
lsmod | grep nouveau

cat &lt;&lt;EOF | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
EOF
sudo update-initramfs -u</code></pre>



<p>Reboot the system after the initramfs build completes.</p>



<pre class="wp-block-code"><code>sudo reboot</code></pre>



<h3 class="wp-block-heading"><strong>Install the NVIDIA Drivers</strong></h3>



<p>NVIDIA includes .run and .deb installer options for Debian-based operating systems. &nbsp;I use the .run option because that is what I am most familiar with. &nbsp;The run file will need to be made executable as it does not have these permissions by default. I also install using the&nbsp;<code>--dkms</code>&nbsp;flag so the driver will be recompiled automatically if the kernel is updated.</p>



<p>The vGPU drivers are distributed through the NVIDIA Enterprise Software Licensing portal through the NVIDIA Virtual GPU or AI Enterprise product sets and require a license to use &nbsp;&nbsp;If you are using PCI Passthrough instead of GRID,&nbsp;you can download the NVIDIA Data Center/Tesla Drivers from the <a href="https://www.nvidia.com/Download/index.aspx?lang=en-us">data center driver download page</a>.&nbsp;</p>



<figure class="wp-block-image size-large"><img width="1024" height="474" data-attachment-id="2550" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/nvidia-data-center-driver-downloads/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/nvidia-data-center-driver-downloads.png" data-orig-size="1466,680" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="nvidia-data-center-driver-downloads" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/nvidia-data-center-driver-downloads.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/nvidia-data-center-driver-downloads.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/nvidia-data-center-driver-downloads.png?w=1024" alt="" class="wp-image-2550" /></figure>



<p>I am using the NVAIE product set for some of my testing, so I will be installing a vGPU driver.  The steps to install the Driver, CUDA Toolkit, and Container Toolkit are the same whether you are using a regular data center driver or the vGPU driver.  You will not need to configure any licensing when using PCI Passthrough.</p>



<p>The drivers need to be downloaded, copied over to the virtual machine, and have the executable flag set on the file. </p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<pre class="wp-block-code"><code>sudo chmod +X NVIDIA-Linux-x86_64-550.54.15-grid.run
sudo bash ./NVIDIA-Linux-x86_64-550.54.15-grid.run --dkms</code></pre>
</div></div>
</div></div>



<p>Click OK for any messages that are displayed during install. &nbsp;Once the installation is complete, reboot the server.</p>



<p>After the install completes, type the following command to verify that the driver is installed properly.</p>



<pre class="wp-block-code"><code>nvidia-smi</code></pre>



<p>You should receive an output similar to the following:&nbsp;</p>



<figure class="wp-block-image size-large"><img width="1024" height="508" data-attachment-id="2532" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/nvidia-smi/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/nvidia-smi.png" data-orig-size="1356,674" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="nvidia-smi" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/nvidia-smi.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/nvidia-smi.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/nvidia-smi.png?w=1024" alt="" class="wp-image-2532" /></figure>



<h3 class="wp-block-heading"><strong>Installing the CUDA Toolkit</strong></h3>



<p>Like the GRID Driver installer, NVIDIA distributes the CUDA Toolkit as both a .run and .deb installer. For this step, I&#8217;ll be using the .deb installer as it works with Debian&#8217;s built-in package management, can handle upgrades when new CUDA versions are released, and contains a multiple&nbsp;<a href="https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#meta-packages">meta package installation options that are documented in the CUDA installation documentation</a>.</p>



<p>By default, the CUDA toolkit installer will try to install an NVIDIA driver. &nbsp;Since this deployment is using a vGPU driver, we don&#8217;t want to use the driver included with CUDA. &nbsp;NVIDIA is very prescriptive about which driver versions work with vGPU, and installing a different driver, even if it is the same version, will result in errors. &nbsp;</p>



<p>The first step is to install the CUDA keyring and enable the contrib repository. &nbsp;The keyring file contains the repository information and the GPG signing key. &nbsp;Use the following commands to complete this step:</p>



<pre class="wp-block-code"><code>wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo add-apt-repository contrib</code></pre>



<p>The next step is to update our Apt-Get repos and install the CUDA Toolkit. The CUDA toolkit requires a number of additional packages that will be installed alongside the main application.</p>



<pre class="wp-block-code"><code>sudo apt-get update &amp;&amp; sudo apt-get -y install cuda-toolkit-12-5</code></pre>



<figure class="wp-block-image size-large"><img width="1024" height="473" data-attachment-id="2548" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/cuda-toolkit-install/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-toolkit-install.png" data-orig-size="2990,1384" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="cuda-toolkit-install" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-toolkit-install.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-toolkit-install.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-toolkit-install.png?w=1024" alt="" class="wp-image-2548" /></figure>



<p>The package installer does not add CUDA to the system PATH variable, so we need to do this manually. &nbsp;The way I&#8217;ve done this is to create a login script that applies for all users using the following command. &nbsp;The CUDA folder path is versioned, so this script to set the PATH variable will need to be updated when the CUDA version changes.</p>



<pre class="wp-block-code"><code>cat &lt;&lt;EOF | sudo tee /etc/profile.d/nvidia.sh
export PATH="/usr/local/cuda-12.5/bin${PATH:+:${PATH}}"
EOF
sudo chmod +x /etc/profile.d/nvidia.sh</code></pre>



<p>Once our script is created, we need to apply the updated PATH variable and test our CUDA Toolkit installation to make sure it is working properly. &nbsp;</p>



<pre class="wp-block-code"><code>source /etc/profile.d/nvidia.sh
nvcc --version</code></pre>



<p>You should receive the following output if the&nbsp;PATH&nbsp;variable is updated properly.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="692" height="180" data-attachment-id="2533" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/cuda-testing_1/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-testing_1.png" data-orig-size="692,180" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="cuda-testing_1" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-testing_1.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-testing_1.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-testing_1.png?w=692" alt="" class="wp-image-2533" /></figure>



<p>If you receive a command not found error, then the&nbsp;PATH&nbsp;variable has not been set properly, and you need to review and rerun the script that contains your&nbsp;EXPORT&nbsp;command.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="656" height="62" data-attachment-id="2535" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/cuda-testing_2/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-testing_2.png" data-orig-size="656,62" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="cuda-testing_2" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-testing_2.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-testing_2.png?w=656" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-testing_2.png?w=656" alt="" class="wp-image-2535" /></figure>



<h3 class="wp-block-heading"><strong>NVIDIA Container Toolkit</strong></h3>



<p>If you are planning to use container workloads with your GPU, you will need to install the NVIDIA Container Toolkit. &nbsp;The Container Toolkit provides a container runtime library and utilities to configure containers to utilize NVIDIA GPUs. &nbsp;The Container Toolkit is distributed from an apt repository.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note: The CUDA toolkit is not required if you are planning to only use container workloads with the GPU. &nbsp;An NVIDIA driver is still required on the host or VM.</strong></p>
</blockquote>



<p>The first step for installing the NVIDIA Container Toolkit on Debian is to import the Container Toolkit apt repository.</p>



<pre class="wp-block-code"><code>curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  &amp;&amp; curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb &#091;signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="77" data-attachment-id="2538" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/container-toolkit-repo/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-repo.png" data-orig-size="2400,182" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="container-toolkit-repo" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-repo.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-repo.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-repo.png?w=1024" alt="" class="wp-image-2538" /></figure>



<p>Update the apt repository packages lists and install the container toolkit.</p>



<pre class="wp-block-code"><code>sudo apt-get update &amp;&amp; sudo apt-get install nvidia-container-toolkit</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="482" data-attachment-id="2540" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/container-toolkit-install/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-install.png" data-orig-size="1456,686" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="container-toolkit-install" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-install.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-install.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-install.png?w=1024" alt="" class="wp-image-2540" /></figure>



<p>Docker needs to be configured and restarted after the container toolkit is installed. &nbsp;</p>



<pre class="wp-block-code"><code>sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="165" data-attachment-id="2542" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/container-toolkit-config/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-config.png" data-orig-size="1136,184" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="container-toolkit-config" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-config.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-config.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-config.png?w=1024" alt="" class="wp-image-2542" /></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note: Other container runtimes are supported. &nbsp;Please see the documentation to see the supported container runtimes and their configuration instructions.</strong></p>
</blockquote>



<p>After restarting your container runtime, you can run a test workload to make sure the container toolkit is installed properly.</p>



<pre class="wp-block-code"><code>sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="643" data-attachment-id="2541" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/container-toolkit-test/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-test.png" data-orig-size="1280,804" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="container-toolkit-test" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-test.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-test.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-test.png?w=1024" alt="" class="wp-image-2541" /></figure>



<h3 class="wp-block-heading"><strong>Using NVIDIA GPUs with Docker Compose</strong></h3>



<p>GPUs can be utilized with container workloads managed by Docker Compose. &nbsp;You will need to add the following lines, modified to fit your environment, to the container definition in your Docker Compose file. &nbsp;Please see the&nbsp;<a href="https://docs.docker.com/compose/gpu-support/">Docker Compose documentation</a>&nbsp;for more details.</p>



<pre class="wp-block-code"><code>deploy:
 resources:
   reservations:
     devices:
       - driver: nvidia
         count: 1
         capabilities:
           - gpu</code></pre>



<h3 class="wp-block-heading"><strong>Configuring NVIDIA vGPU Licensed Features</strong></h3>



<p>Your machine will need to check out a license if NVIDIA vGPU or NVAIE are being used, and the NVIDIA vGPU driver will need to be configured with a license server. &nbsp;The steps for setting up a cloud or local instance of the NVIDIA License System are beyond the scope of this post, but they can be found in the&nbsp;<a href="https://docs.nvidia.com/license-system/latest/index.html">NVIDIA License System documentation</a>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note: You do not need to complete these steps if you are using the Data Center Driver with PCI Passthrough.  Licensing is only required if you are using vGPU or NVAIE features.</strong></p>
</blockquote>



<p>A client configuration token will need to be configured once the license server instance has been set up. &nbsp;The steps for downloading the client configuration token can be found&nbsp;<a href="https://docs.nvidia.com/license-system/latest/nvidia-license-system-quick-start-guide/index.html#generating-client-configuration-token-for-cls-instance">here for CLS, or cloud-hosted, instances</a>&nbsp;and&nbsp;<a href="https://docs.nvidia.com/license-system/latest/nvidia-license-system-quick-start-guide/index.html#generating-client-configuration-token-for-dls-instance">here for DLS, or delegated local, instances</a>.</p>



<p>After generating and downloading the client configuration token, it will need to be placed onto your virtual machine. The file needs to be copied from your local machine to the <code>/etc/nvidia/ClientConfigToken</code> directory. &nbsp;This directory is locked down by default, and it requires root or sudo access to perform any file operations here. So you may need to copy the token file to your local home directory and use sudo to copy it into the ClientConfigToken directory. &nbsp;Or you can place the token file on a local web server and use wget/cURL to download it.</p>



<p>In my lab, I did the following:</p>



<pre class="wp-block-code"><code>sudo wget https://web-server-placeholder-url/NVIDIA/License/client_configuration_token_05-22-2024-22-41-58.tok</code></pre>



<p>The token file needs to be made readable by all users after downloading it into the <code>/etc/nvidia/ClientConfigToken</code> directory.</p>



<pre class="wp-block-code"><code>sudo chmod 744 /etc/nvidia/ClientConfigToken/client_configuration_token_*.tok</code></pre>



<p>The final step is to configure vGPU features. &nbsp;This is done by editing the gridd.conf file and enabling vGPU. &nbsp;The first step is to copy the gridd.conf.template file using the following command.</p>



<pre class="wp-block-code"><code>sudo cp /etc/nvidia/gridd.conf.template /etc/nvidia/gridd.conf</code></pre>



<p>The next step is to edit the file, find the line called FeatureType, and change the value&nbsp;from&nbsp;0&nbsp;to&nbsp;1.</p>



<pre class="wp-block-code"><code>sudo nano /etc/nvidia/gridd.conf</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="990" height="288" data-attachment-id="2544" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/grid-license-config/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/grid-license-config.png" data-orig-size="990,288" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="grid-license-config" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/grid-license-config.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/grid-license-config.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/grid-license-config.png?w=990" alt="" class="wp-image-2544" /></figure>



<p>Finally, restart the NVIDIA GRID daemon.</p>



<pre class="wp-block-code"><code>sudo systemctl restart nvidia-gridd</code></pre>



<p>You can check the service status with the&nbsp;<code>sudo systemctl status nvidia-gridd</code>&nbsp;command to see if a license was successfully checked out. &nbsp;You can also log into your license service portal and review the logs to see licensing activity.</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="246" data-attachment-id="2545" data-permalink="https://thevirtualhorizon.com/2024/05/31/how-to-configure-the-nvidia-vgpu-drivers-cuda-toolkit-and-container-toolkit-on-debian-12/grid-license-status/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/grid-license-status.png" data-orig-size="2490,600" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="grid-license-status" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/grid-license-status.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/05/grid-license-status.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/05/grid-license-status.png?w=1024" alt="" class="wp-image-2545" /></figure>



<h3 class="wp-block-heading"><strong>Sources</strong></h3>



<p>While creating this post, I pulled from the following links and sources. </p>



<p><a href="https://docs.nvidia.com/cuda/cuda-installation-guide-linux">https://docs.nvidia.com/cuda/cuda-installation-guide-linux</a></p>



<p><a href="https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#meta-packages">https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#meta-packages</a></p>



<p><a href="https://docs.nvidia.com/grid/17.0/grid-vgpu-user-guide/index.html#installing-vgpu-drivers-linux-from-run-file">https://docs.nvidia.com/grid/17.0/grid-vgpu-user-guide/index.html#installing-vgpu-drivers-linux-from-run-file</a></p>



<p><a href="https://docs.nvidia.com/grid/17.0/grid-vgpu-user-guide/index.html#installing-vgpu-drivers-linux-from-debian-package">https://docs.nvidia.com/grid/17.0/grid-vgpu-user-guide/index.html#installing-vgpu-drivers-linux-from-debian-package</a></p>



<p><a href="https://docs.nvidia.com/ai-enterprise/deployment-guide-vmware/0.1.0/nouveau.html">https://docs.nvidia.com/ai-enterprise/deployment-guide-vmware/0.1.0/nouveau.html</a></p>



<p><a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/">https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/</a></p>



<p><a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html">https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html</a></p>



<p><a href="https://docs.docker.com/compose/gpu-support/">https://docs.docker.com/compose/gpu-support/</a></p>



<p><a href="https://docs.nvidia.com/license-system/latest/index.html">https://docs.nvidia.com/license-system/latest/index.html</a></p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/75ff08ce290eed6b2bb45153574afdf35f3d5b7aae83d1d3add359b31bea93d5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">seanpmassey</media:title>
		</media:content>

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/nvidia-data-center-driver-downloads.png?w=1024" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/nvidia-smi.png?w=1024" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-toolkit-install.png?w=1024" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-testing_1.png?w=692" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/cuda-testing_2.png?w=656" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-repo.png?w=1024" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-install.png?w=1024" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-config.png?w=1024" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/container-toolkit-test.png?w=1024" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/grid-license-config.png?w=990" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/05/grid-license-status.png?w=1024" medium="image" />
	</item>
		<item>
		<title>I&#8217;m Finally Building My AI Lab&#8230;</title>
		<link>https://thevirtualhorizon.com/2024/05/24/im-finally-building-my-ai-lab/</link>
		
		<dc:creator><![CDATA[seanpmassey]]></dc:creator>
		<pubDate>Fri, 24 May 2024 13:54:25 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[artificial-intelligence]]></category>
		<category><![CDATA[gpu]]></category>
		<category><![CDATA[NVIDIA]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[vGPU]]></category>
		<guid isPermaLink="false">http://thevirtualhorizon.com/?p=2524</guid>

					<description><![CDATA[When I wrote a Home Lab update post back in January 2020, I talked about AI being one of the technologies that I wanted to focus on in my home lab.&#160;&#160; At that time, AI had unlimited possibilities but was hard to work with. Frameworks like PyTorch and Tensorflow existed, but they required a Python &#8230; <a href="https://thevirtualhorizon.com/2024/05/24/im-finally-building-my-ai-lab/" class="more-link">Continue reading <span class="screen-reader-text">I&#8217;m Finally Building My AI&#160;Lab&#8230;</span></a>]]></description>
										<content:encoded><![CDATA[
<p>When I wrote a Home Lab update post back in January 2020, I talked about AI being one of the technologies that I wanted to focus on in my home lab.&nbsp;&nbsp;</p>



<p>At that time, AI had unlimited possibilities but was hard to work with. Frameworks like PyTorch and Tensorflow existed, but they required a Python programming background and possibly an advanced mathematics or computer science degree to actually do something with them.&nbsp; Easy-to-deploy self-hosted options like Stable Diffusion and Ollama were still a couple of years away.</p>



<p>Then the rest of 2020 happened.&nbsp; Since I’m an EUC person by trade, my attention was diverted away from anything that wasn’t supporting work-from-home initiatives and recovering from the burnout that followed.</p>



<p>GPU accelerated computing and AI were starting to come back on my radar in 2022.&nbsp; We had a few cloud provider partners asking about building GPU-as-a-Service with VMware Cloud Director.&nbsp;&nbsp;</p>



<p>Those conversations exploded when OpenAI released their technical marvel, technology demonstrator, and extremely expensive and sophisticated toy &#8211; ChatGPT.&nbsp; That kickstarted the “AI ALL THE THINGS” hype cycle.</p>



<p>Toy might be too strong of a word there.&nbsp; An incredible amount of R&amp;D went into building ChatGPT.&nbsp; OpenAI’s GPT models are an incredible technical achievement, and it showcases the everyday power and potential of artificial intelligence.&nbsp; But it was a research preview that people were meant to use and play with. So my feelings about this only extend to the free and public ChatGPT service itself, not the GPT language models, large language models in general, or AI as a whole.</p>



<p>After testing out ChatGPT a bit, I pulled back from AI technology.&nbsp; Part of this was driven by trying to find use cases for experimenting with AI, and part of it was driven by an anti-hype backlash.&nbsp; But that anti-hype backlash, and my other thoughts on AI, is a story for another blog.</p>



<h2 class="wp-block-heading">Finding my Use Case</h2>



<p>Whenever I do something in my lab, I try to anchor it in a use case.&nbsp; I want to use the technology to solve a problem or challenge that I have.&nbsp; And when it came to AI, I really struggled with finding a use case.</p>



<p>At least…at first.</p>



<p>But last year, Hasbro decided that they would burn down their community in an attempt to squeeze more money out of their customers.&nbsp; I found myself with a growing collection of Pathfinder 2nd Edition and 3rd-party Dungeons and Dragons 5th Edition PDFs as I started to play the game with my son and some family friends. And I had a large PDF backlog of other gaming books from the old West End Games Star Wars D6 RPG and Battletech.</p>



<p>This started me down an AI rabbithole.&nbsp; At first, I just wanted to create some character art to go along with my character sheet.&nbsp;&nbsp;</p>



<p>Then I started to design my own fantasy and sci-fi settings, and I wanted to create some concept art for the setting I was building.&nbsp; I had a bit of a vision, and I wanted to see it brought to life.</p>



<p>I tried Midjourney first, and after a month and using most of my credits, I decided to look at self-hosting options.&nbsp; That led me to Stable Diffusion, which I tested out on my Mac and my Windows desktop.</p>



<p>I had a realization while trying to manage space on my Macbook.&nbsp; Stable Diffusion is resource heavy and can use a lot of storage when you start experimenting with models. The user interfaces are basically web applications built on the Gradio framework. And I had slightly better GPUs sitting in one of my lab hosts.</p>



<p>So why not virtualize it to take advantage of my lab resources? And if I’m going to virtualize these AI projects, why not try out a few more things like using an LLM to talk to my game book PDFs.</p>



<h2 class="wp-block-heading">My Virtual AI Lab and Workloads</h2>



<p>When I decided to build an AI lab, I wanted to start with resources I already had available.&nbsp;</p>



<p>Back in 2015, I convinced my wife to let me buy a brand new PowerEdge R730 and a used NVIDIA GRID K1 card. I had to buy a brand new server because I wanted to test out the brand new (at the time) GPU virtualization in my lab VDI environment, and the stock servers were not configured to support GPUs. GPUs typically need 1100 watt power supplies and an enablement kit to deliver power to the GPU that aren’t part of the standard server BOM. Most GPUs that you’d find in a data center are also passively cooled, so the server needs high CFM-fans and hi-speed fan settings to increase airflow over them.</p>



<p>That R730 has a pair of Intel E5-2620 v3 CPUs, 192GB of RAM, and uses ESXi for the hypervisor.&nbsp; Back in 2018, I upgraded the GRID K1 card to a pair of <a href="https://images.nvidia.com/content/pdf/tesla/184457-Tesla-P4-Datasheet-NV-Final-Letter-Web.pdf">NVIDIA Tesla P4 GPUs</a>.&nbsp; The Tesla P4 is basically a data center version of a GTX 1080 &#8211; it has the same GP104 graphics processor and 8GB of video memory (also referred to as framebuffer) as the GTX 1080.&nbsp; The main differences are that it is passively cooled and it only draws 75 watts, so it can draw all of its power from the PCIe slot without any additional power cabling.&nbsp;&nbsp;</p>



<p>My first virtualized AI workload was the Forge WebUI for Stable Diffusion.&nbsp; I deployed this on a Debian 12 VM and used PCI passthrough to present one of the P4 cards to the VM.&nbsp; Image generation times were about 2-3 minutes per image, which is fine for a lab.&nbsp;&nbsp;</p>



<p>I started to run into issues pretty quickly.&nbsp; As I said before, P4 only has 8GB of framebuffer, and I would start to hit out-of-memory errors when generating larger images, upscaling images, or attempting to use LORAs or other fine-tuned models.&nbsp;</p>



<p>When I was researching LLMs, it seemed like the P4 would not be a good fit for even the smallest models. It didn’t have enough framebuffer, poor fp16 performance, and no support for flash attention.&nbsp; So the P4 gives an all-around bad experience.</p>



<p>So I decided that I need to do a couple of upgrades.&nbsp; First, I ordered a brand new <a href="https://nvdam.widen.net/s/rvq98gbwsw/l4-datasheet-2595652">NVIDIA L4 datacenter</a> GPU.&nbsp; The L4 is an Ada Lovelace generation datacenter GPU.&nbsp; It’s a single-slot, 24GB of framebuffer GPU that only draws 75 watts.&nbsp; It’s the most modern evolution of the P4 form factor.&nbsp;&nbsp;</p>



<p>But the L4 took a while to ship, and I was getting impatient.&nbsp; So I went onto eBay and found a great deal on a pre-owned <a href="https://www.nvidia.com/en-us/data-center/tesla-t4/">NVIDIA Tesla T4.</a> The T4 is a Turing generation datacenter GPU, and it is the successor to the P4. It has 16GB of framebuffer, and most importantly, it has significantly improved performance and support for features like flash attention.&nbsp; And it also only draws 75 watts.&nbsp;&nbsp;</p>



<p>The T4 and L4 were significant improvements over the P4.&nbsp; I didn’t do any formal benchmarking, but image generation times went from 2-3 minutes to less than a minute and a half.&nbsp; And I was able to start building out an LLM lab using Ollama and Open-WebUI.&nbsp;&nbsp;</p>



<h2 class="wp-block-heading">What’s Next</h2>



<p>The initial version of this lab used PCI Passthrough to present the GPUs to my VMs.&nbsp; I’m now in the process of moving to NVIDIA AI Enterprise (NVAIE) to take advantage of vGPU features.&nbsp; NVIDIA has provided me with NFR licensing through the NGCA program, so thank you to NVIDIA for enabling this in my lab.&nbsp;&nbsp;</p>



<p>NVAIE will allow me to create virtual GPUs using only a slice of the physical resources as some of my VMs don’t need a full GPU, and it will allow me to test out some different setups with services running on different VMs.&nbsp;&nbsp;</p>



<p>I’m also in the process of building out and exploring my LLM environment.&nbsp; The first iteration of this is being built using Ollama and Open-WebUI.&nbsp; Open-WebUI seems like an easy on-ramp to testing out Retrieval Augmented Generation (RAG), and I’m trying to wrap my head around that.</p>



<p>I’m building my use case around Pathfinder 2nd Edition.&nbsp; I’m using Pathfinder because it is probably the most complete ruleset that I have in PDF form.&nbsp; Paizo, the Pathfinder publisher, also provides a website where all the game’s core rules are available for free (under a fairly permissive license), so I have a source I can scrape to supplement my PDFs.&nbsp;</p>



<p>This has been kind of a fun challenge as I learn how to convert PDFs into text, chunk them, and import them into a RAG.&nbsp; I also want to look at other RAG tools and possibly try to build a knowledge graph around this content.</p>



<p>This has turned into fun, but also frustrating at times, project.&nbsp; I’ve learned a lot, and I’m going to keep digging into it.</p>



<h2 class="wp-block-heading">Side Notes and Disclosures&nbsp;</h2>



<p>Before I went down the AI Art road, I did try to hire a few artists I knew or who had been referred to me.  They either didn’t do that kind of art or they didn’t get back to me…so I just started creating art for personal use only. I know how controversial AI Art is in creative spaces, so if I ever develop and publish these settings commercially, I would hire artists and the AI art would serve as concept art.</p>



<p>In full disclosure, one of the Tesla P4s was provided by NVIDIA as part of the NGCA program.&nbsp; I purchased the other P4.</p>



<p>NVIDIA has provided NFR versions of their vGPU and NVAIE license skus through the NGCA program. My vSphere licensing is provided through the VMware by Broadcom vExpert program.&nbsp; Thank you to NVIDIA and Broadcom for providing licensing.</p>



<p></p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/75ff08ce290eed6b2bb45153574afdf35f3d5b7aae83d1d3add359b31bea93d5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">seanpmassey</media:title>
		</media:content>
	</item>
		<item>
		<title>Introducing Omnissa &#8211; The Future Home of Horizon and Workspace ONE Launches Today!</title>
		<link>https://thevirtualhorizon.com/2024/05/06/introducing-omnissa-the-future-home-of-horizon-and-workspace-one-launches-today/</link>
		
		<dc:creator><![CDATA[seanpmassey]]></dc:creator>
		<pubDate>Mon, 06 May 2024 23:21:25 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[horizon]]></category>
		<category><![CDATA[omnissa]]></category>
		<category><![CDATA[VMWare]]></category>
		<guid isPermaLink="false">http://thevirtualhorizon.com/?p=2514</guid>

					<description><![CDATA[Back in December 2023, Hock Tan announced that he would be looking to divest the entity that is the &#8220;soon-to-be-formerly-known-as the VMware EUC Business Unit.&#8221; Speculation ran rampant about possible buyers until the end of February when KKR announced that they had agreed to buy the EUC business for $3.8 billion USD and that it &#8230; <a href="https://thevirtualhorizon.com/2024/05/06/introducing-omnissa-the-future-home-of-horizon-and-workspace-one-launches-today/" class="more-link">Continue reading <span class="screen-reader-text">Introducing Omnissa &#8211; The Future Home of Horizon and Workspace ONE Launches&#160;Today!</span></a>]]></description>
										<content:encoded><![CDATA[
<p>Back in December 2023, Hock Tan announced that he would be looking to divest the entity that is the &#8220;soon-to-be-formerly-known-as the VMware EUC Business Unit.&#8221; Speculation ran rampant about possible buyers until the end of February when KKR announced that they had agreed to buy the EUC business for $3.8 billion USD and that it would become a standalone business.</p>



<p>That also led to a new round of speculation.  What would the new entity be called? When would they stand on their own? How would Broadcom&#8217;s &#8220;Day 2&#8221; impact EUC during the divestiture process?</p>



<p>The future of &#8220;the business unit formerly known as VMware EUC&#8221; is now starting to come into focus as we get answers to these questions.  While the divestiture is still in process and the expected closing date is unknown, we now formally know the new company&#8217;s name &#8211; Omnissa.  </p>



<p>The Omnissa name (which is pronounced ahm-NISS-uh) was <a href="https://www.omnissa.com/introducing-omnissa-the-former-vmware-end-user-computing-business">formally announced in a blog post by End-User Computing Vice President of Product and Technical Marketing Renu Upadhyay on April 25th, 2024.</a>  The blog post also includes the Omnissa vision statement and some background on how the name was selected.</p>



<p>Today (Monday, May 6th 2024), the Omnissa website and other selected sites have started to go live.  While the acquisition has not closed, Broadcom has started the process of migrating the legacy VMware systems into Broadcom&#8217;s systems, and the EUC systems will be migrated into standalone systems to help support the future independent organization.  Broadcom has posted a KB for this here: <a href="https://knowledge.broadcom.com/external/article?legacyId=97841">https://knowledge.broadcom.com/external/article?legacyId=97841</a></p>



<p>The following sites are live as of the time of this post, although not all features and functionality might be working.</p>



<ul class="wp-block-list">
<li>Omnissa Homepage: <a href="https://www.omnissa.com">https://www.omnissa.com</a></li>



<li>Techzone: <a href="https://techzone.omnissa.com">https://techzone.omnissa.com</a></li>



<li>Customer Connect: <a href="https://customerconnect.omnissa.com">https://customerconnect.omnissa.com</a></li>



<li>Product Documentation: <a href="https://docs.omnissa.com">https://docs.omnissa.com</a></li>



<li>Knowledge Base: <a href="https://kb.omnissa.com/">https://kb.omnissa.com/</a></li>
</ul>



<p>In addition to the above links, redirects from the VMware website are being put in place for Horizon and Workspace ONE focused pages so that old URLs will continue to work.</p>



<p>So what do I think of the new branding?  The first time I heard the name, I wondered who the Warhammer 40K fan was on the marketing team as Omnissa sounds a lot like the name of something from that game universe. </p>



<p>The more I think about the name and the branding that was announce today, the more I like it.  It feels all-encompassing&#8230;like it pulls together all of the former VMware EUC products.  And I am a big fan of the Omnissa Mission Statement.  It is very customer and end-user focused, and I think it directly ties back to the product portfolio and the capabilities they can deliver.</p>



<p>So congratulations to the Omnissa team on the first step of your new brand launch.  I&#8217;m looking forward to seeing more as you take the next steps on your independent journey.</p>



<p>(Note: I am not a Warhammer 40K fan&#8230;but as a general science-fiction and speculative fiction fan, I am familiar with some of that series lore.  The only Warhammer I like comes from a completely different science fiction universe.)</p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/75ff08ce290eed6b2bb45153574afdf35f3d5b7aae83d1d3add359b31bea93d5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">seanpmassey</media:title>
		</media:content>
	</item>
		<item>
		<title>The Home Lab Update 2024</title>
		<link>https://thevirtualhorizon.com/2024/02/16/the-home-lab-update-2024/</link>
		
		<dc:creator><![CDATA[seanpmassey]]></dc:creator>
		<pubDate>Fri, 16 Feb 2024 17:29:36 +0000</pubDate>
				<category><![CDATA[Home Lab]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[grafana]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[prometheus]]></category>
		<category><![CDATA[VMWare]]></category>
		<guid isPermaLink="false">http://thevirtualhorizon.com/?p=2507</guid>

					<description><![CDATA[Back in August 2023, I had the pleasure of presenting two VMware Explore sessions about home labs.&#160; While preparing for those sessions, I realized that I hadn’t done a home lab update post in a long time.&#160; In fact, my last update post was four years ago in February 2020. And a lot has changed &#8230; <a href="https://thevirtualhorizon.com/2024/02/16/the-home-lab-update-2024/" class="more-link">Continue reading <span class="screen-reader-text">The Home Lab Update&#160;2024</span></a>]]></description>
										<content:encoded><![CDATA[
<p>Back in August 2023, I had the pleasure of presenting two VMware Explore sessions about home labs.&nbsp; While preparing for those sessions, I realized that I hadn’t done a home lab update post in a long time.&nbsp; In fact, my last update post was four years ago in February 2020.</p>



<p>And a lot has changed in my lab. The use cases, architecture, the hardware, and even my areas of focus have changed significantly in the last four years.&nbsp; With VMware being acquired by Broadcom and my desire to retool and expand my skillsets, my home lab will be more important than ever.&nbsp; I will be using it as a tool to help achieve my goals and find my next path.</p>



<p>And while I was originally going to write about the lab infrastructure changes, I decided that my original post just wasn’t right.&nbsp; My home lab is practically a private cloud, and the tone of the post unintentionally came off as bragging.</p>



<p>That didn’t sit right with me, so I decided to scrap that post and start over. I want to focus on workloads and applications instead of hardware and infrastructure solutions, and I want to elevate some of the open-source projects that I’m using as learning tools.</p>



<p>And when I talk about hardware or infrastructure, it’s going to be about how that hardware supports the specific application or workload.</p>



<h3 class="wp-block-heading">Home Lab Use Cases</h3>



<p>I think it’s very important to talk about my lab use cases.&nbsp;</p>



<p>I had a slide that I used in two of my <s>VMworld</s> VMware Explore sessions that summed up my home lab use cases:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="936" height="528" data-attachment-id="2510" data-permalink="https://thevirtualhorizon.com/2024/02/16/the-home-lab-update-2024/image/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2024/02/image.png" data-orig-size="936,528" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2024/02/image.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2024/02/image.png?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2024/02/image.png?w=936" alt="" class="wp-image-2510" srcset="https://thevirtualhorizon.com/wp-content/uploads/2024/02/image.png 936w, https://thevirtualhorizon.com/wp-content/uploads/2024/02/image.png?w=150 150w, https://thevirtualhorizon.com/wp-content/uploads/2024/02/image.png?w=300 300w, https://thevirtualhorizon.com/wp-content/uploads/2024/02/image.png?w=768 768w" sizes="(max-width: 936px) 100vw, 936px" /></figure>



<p>I really want to focus on the last two use cases on that slide: self-hosting open-source solutions and Minecraft.&nbsp; The latter has really driven the “roadmap” for my lab by forcing me to look for open-source solutions.&nbsp; I don’t have a budget, so I’ve been forced to look at open-source solutions to support my kids’ Minecraft servers.</p>



<p>Minecraft isn’t the only thing I’m self-hosting, though.&nbsp; I’ve found some awesome tools thanks to the r/self-hosted sub-Reddit, and I’ve used some of the tools there to fill in the gaps in my infrastructure.</p>



<p>Most of these solutions are containerized or offer a container-based option.&nbsp; I’m using containers whenever possible because it makes deploying and maintaining the application and its dependencies much easier than managing binary installs. Each application stack gets its own Debian-based VM, and I am using Traefik as my reverse proxy and SSL offload manager of choice.</p>



<p>I haven’t jumped into Kubernetes yet as I’m still getting comfortable with containers, and self-hosting Kubernetes adds another layer of complexity to my lab.&nbsp; It is on my to-do list.</p>



<p>All the solutions I’m using would be deserving of their own posts, but in the interest of time and wordcount, I’ll keep it fairly high level today.</p>



<h3 class="wp-block-heading">Vaultwarden</h3>



<p>There was a time, a long time ago, when I was a Lastpass family customer.&nbsp; It got harder to justify the yearly cost of Lastpass when self-hosted alternatives like Bitwarden were available (and…if I’m being honest…my family was not using the service). The Lastpass breach and security issues came to light about six months after I had cancelled my subscription and migrated my vault out, but it only justified my decision to move on.</p>



<p>I was originally using the self-hosted Bitwarden container.&nbsp; But I recently switched to <a href="https://github.com/dani-garcia/vaultwarden">Vaultwarden</a> so I could start offering password vaults to the rest of my family as they are seeing the need for a password vault service.</p>



<p>Vaultwarden is one of the most important services in my lab.&nbsp; This service contains critical data, and I need to make sure it is backed up. I’m using a combination of <a href="https://github.com/Bruceforce/vaultwarden-backup">this Vaultwarden&nbsp; backup container</a> and Restic to protect the data in this application.</p>



<h3 class="wp-block-heading">MinIO</h3>



<p><a href="https://min.io/">MinIO</a> is one of the few applications that I’ve deployed with infrastructure dependencies.&nbsp; I originally deployed MinIO in my lab when I was testing VMware Data Services Manager (DSM) as that product required S3-compatible storage.&nbsp;</p>



<p>I have a 3-node MinIO cluster in my lab.&nbsp; Each MinIO node has two data volumes, so I have a total of 6 data disks across my 3 nodes.&nbsp;</p>



<p>This is one of the few applications in my lab that is tied to specific hosts and hardware.&nbsp; Each MinIO node data volume is sitting on a dedicated local SSD, so each node is tied to an ESXi host in a workload cluster.&nbsp; This setup allows me to use erasure coding and provides some degree of data redundancy, but it makes host management operations a little more complex because I must shut down the MinIO node on a host before I can perform any maintenance operations.&nbsp;</p>



<p>Even though I’m no longer testing DSM in my lab, I still have MinIO deployed.&nbsp; I’m using it as the backend for other services in my lab that I will be talking about later in this post.&nbsp;</p>



<h3 class="wp-block-heading">Wiki.JS</h3>



<p>Home labs are rarely documented.&nbsp; This is something I’m trying to improve on with my lab as I’ve had a few processes that I’ve had to figure out or reverse engineer from looking at my shell/command history.&nbsp; I used to use Confluence SaaS free tier for documenting my home network, but SSO was a $30 per month add-on.&nbsp;</p>



<p>I also wanted a self-hosted option.&nbsp; I looked at a few wiki options, including Bookstacks, Dokuwiki, and a few others.&nbsp; But I’m also kind of picky about my requirements and wanted something that supported SSO out of the box and used PostgreSQL.</p>



<p>So I settled on <a href="https://js.wiki/">wiki.js</a> as my solution because it is open source, met all my technical requirements, and it fit in my budget.</p>



<p>I’m not taking full advantage of WikiJS yet.&nbsp; My focus has been importing content from Confluence and testing out the SSO features.&nbsp; But I plan to add more lab documentation and use it for some of my programming and lab side projects in the future.&nbsp;</p>



<h3 class="wp-block-heading">Grafana Loki and Promtail</h3>



<p>I’ve needed a log management solution for my fleet of Minecraft servers for a while now.&nbsp; Log management has been an issue on those, and some method to easily search the logs is kind of a requirement before I let my kids share the servers with their friends.</p>



<p>There are a lot of open-source solutions in this space, but I am settling on the <a href="https://grafana.com/oss/">Grafana stack</a>.&nbsp; I’m starting with this stack because it seems to be a well-integrated stack for performance monitoring, log aggregation, and creating dashboards. Time will tell on that as I am just getting started with <a href="https://grafana.com/oss/loki/">Grafana Loki</a>.&nbsp; I have a small instance deployed today to get my Promtail config ironed out, and I will be redeploying it as I roll it out to the rest of my lab.</p>



<p>One thing I like about some of the newer log management systems is that they can use S3-compatible storage for log data.&nbsp; Loki isn’t the only solution that can do this but being a part of the Grafana stack set it apart in my mind and helped make it my first choice.</p>



<p>I’m using the Promtail binary for my Minecraft servers, and getting that config set up properly has been a pain.&nbsp; The documentation is very high level, and as far as I can tell, doesn’t include very many example configs to start from.&nbsp; Some of the issues I had to work through are scraping the systemctl journal, which required adding the promtail service user to a systemctl-journald group and getting the hostname and IP address added to all forwarded logs.&nbsp; The documentation covered some of what I needed, but there were some significant gaps in my opinion.&nbsp; It took a lot of trial, error, and experimentation to get where I wanted to be.</p>



<p>I need to write a longer blog post to talk about my setup and how I worked around some of the issues I faced once I get this rolled out into “production” and get some dashboards built.&nbsp; I will also be looking at Grafana’s version of Prometheus for performance monitoring in a later phase.</p>



<h3 class="wp-block-heading">OwnCloud Infinite Scale</h3>



<p>Have you ever exceeded the limits of the free tiers that Microsoft and Google offer on OneDrive or Google Drive?&nbsp; Or needed a Dropbox-like service that was self-hosted to meet data sovereignty or compliance requirements?&nbsp;</p>



<p><a href="https://owncloud.com/infinite-scale-4-0">OwnCloud Infinite Scale</a> (OCIS) is an <a href="https://github.com/owncloud/ocis">open-source</a> ground-up rewrite of OwnCloud Server using the Go programming language.&nbsp; It is a drop-in replacement for OneDrive, Google Drive, Dropbox and similar solutions.&nbsp; The client app supports files-on-demand (although this feature is experimental on MacOS).&nbsp; The server supports integration with multiple web-based office suites, OpenID Connect for SSO, and S3-compatible storage.</p>



<p>I use it for some of my file storage needs, especially the stuff that I don’t want to put on OneDrive or transferring data from my laptop to my lab. I expect to use the Spaces feature to replace some of my lab file servers and QNAP virtual appliances in my lab. &nbsp;</p>



<h3 class="wp-block-heading">DDNS-Route53</h3>



<p><a href="https://crazymax.dev/ddns-route53/">DDNS-Route53</a> is a Go application that allows you to build your own Dynamic DNS service using AWS Route53. I was getting tired of having multiple dynamic DNS services tied to different domains, and I’ve started to standardize all my domains on Route53 and use this service to replace the few dynamic DNS services that I currently use.</p>



<h3 class="wp-block-heading">Conclusion</h3>



<p>These are just a few of the open-source projects I’ve been using in my lab.&nbsp; I have a few more that I’ve been testing out that I will talk about in future posts.&nbsp;</p>



<p>Open-source solutions are a great way to get more utilization out of your home lab while building or enhancing your technical skills.&nbsp; I’ll be talking more about this topic at the Wisconsin VMUG Usercon in April 2024.&nbsp; If you’re going to be there, please stop by my session.</p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/75ff08ce290eed6b2bb45153574afdf35f3d5b7aae83d1d3add359b31bea93d5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">seanpmassey</media:title>
		</media:content>

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2024/02/image.png?w=936" medium="image" />
	</item>
		<item>
		<title>How I Automated Minecraft Server Builds</title>
		<link>https://thevirtualhorizon.com/2023/01/26/how-i-automated-minecraft-server-builds/</link>
		
		<dc:creator><![CDATA[seanpmassey]]></dc:creator>
		<pubDate>Thu, 26 Jan 2023 16:27:00 +0000</pubDate>
				<category><![CDATA[Automation]]></category>
		<category><![CDATA[Minecraft]]></category>
		<category><![CDATA[Packer]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hashicorp Packer]]></category>
		<guid isPermaLink="false">http://thevirtualhorizon.com/?p=2488</guid>

					<description><![CDATA[If you have kids that are old enough to game on any sort of device with a screen, you&#8217;ve probably been asked about virtual Lego kits. And I don&#8217;t mean the various branded video games like LEGO Worlds or the LEGO Star Wars games. No, I&#8217;m talking about something far more addictive &#8211; Minecraft. My &#8230; <a href="https://thevirtualhorizon.com/2023/01/26/how-i-automated-minecraft-server-builds/" class="more-link">Continue reading <span class="screen-reader-text">How I Automated Minecraft Server&#160;Builds</span></a>]]></description>
										<content:encoded><![CDATA[
<p>If you have kids that are old enough to game on any sort of device with a screen, you&#8217;ve probably been asked about virtual Lego kits. And I don&#8217;t mean the various branded video games like LEGO Worlds or the LEGO Star Wars games. No, I&#8217;m talking about something far more addictive &#8211; Minecraft.</p>



<p>My kids are Minecraft fanatics. They could play for hours on end while creative how-tos and &#8220;Let&#8217;s Play&#8221; YouTube videos loop non-stop in the background. And they claim they want to play Minecraft together, although that&#8217;s more theory than actual practice in the end. They also like to experiment and try to build the different things they see on YouTube. They wanted multiple worlds to use as playgrounds for their different ideas.</p>



<p>And they even got me to play a few times.</p>



<p>So during the summer of 2020, I started looking into how I could build Minecraft server appliances. I had built a few Minecraft servers by hand before that, but they were difficult to maintain and keep up-to-date with Minecraft Server dot releases and general operating system maintenance.</p>



<p>I thought a virtual appliance would be the best way to do this, and this is my opinionated way of building a Minecraft server.</p>



<p><a href="https://github.com/seanpmassey/minecraft-appliance-packer" target="_blank" rel="noreferrer noopener">TL;DR: Here is the link to my GitHub repo with the Packer files and scripts that I use.</a></p>



<h2 class="wp-block-heading">A little bit of history</h2>



<p>The initial version of the virtual appliance was built on Photon. Photon is a stripped down version of Linux created by my employer for virtual appliances and running container workloads. <a href="https://williamlam.com/2019/11/packer-reference-for-building-photonos-virtual-appliance-using-ovf-properties.html">William Lam has some great content on how to create a Photon-based virtual appliance using Packer.</a></p>



<p>This setup worked pretty well until Minecraft released version 1.17, also known as the Caves and Cliffs version, in the summer of 2021.</p>



<p>There are a couple of versions of Minecraft. The two main ones are Bedrock, which is geared towards Windows, mobile devices, and video game consoles, and Java, which uses Java and only runs on Windows, Linux, and Mac.</p>



<p>My kids play Java edition, and up until this point, Minecraft Java edition servers used the Java8 JDK. Minecraft 1.17, however, required the Java16 JDK. And that led to a second problem. The only JDK in the Photon repositories at the time was for Java8.</p>



<p>Now this doesn&#8217;t seem like a problem, or at least it isn&#8217;t on a small scale. There are a few open-source OpenJDK implementations that I could adopt. I ended up going with Adoptium&#8217;s Temurin OpenJDK. But after building a server or two, I didn&#8217;t really feel like maintaining a manual install process. I wanted the ease of use that came with a installing and updating from a package repository, and that wasn&#8217;t available for Photon.</p>



<p>So I needed a different Linux distribution. CentOS would have been my first choice, but I didn&#8217;t want something that was basically a rolling release candidate. My colleague Timo Sugliani spoke very highly of Debian, and <a href="https://github.com/tsugliani/packer-vsphere-debian-appliances">he released a set of Packer templates for building lightweight Debian virtual appliances on GitHub</a>. I modified these templates to use the Packer vSphere-ISO plugin and started porting over my appliance build process.</p>



<h2 class="wp-block-heading">Customizing the Minecraft Experience</h2>



<p>Do you want a flat world or something without mob spawns? Or try out a custom world seed? You can set that during the appliance deployment. I wanted the appliance to be self-configuring so I spent some time extending William Lam&#8217;s OVF properties XML file to include all of the Minecraft server attributes that you can configure in the Server.Properties file. This allows you to deploy the appliance and configure the Minecraft environment without having to SSH into it to manually edit the file.</p>



<p>One day, I may trust my kids enough to give them limited access to vCenter to deploy their own servers. This would make it easier for them.</p>



<p>Unfortunately, that day is not today. But this still makes my life easier.</p>



<h2 class="wp-block-heading">Installing and Configuring Minecraft</h2>



<p>The OVF file does not contain the Minecraft Server binaries. It actually gets installed during the appliance&#8217;s first boot. There are few reasons for this. First, the Minecraft EULA does not allow you to distribute the binaries. At least that was my understanding of it.</p>



<p>Second, and more importantly, you may not always want the latest and greatest server version, especially if you&#8217;re planning to develop or use mods. Mods are often developed against specific Minecraft versions, and they have a lengthy interoperability chart.</p>



<p>The appliance is not built to utilize mods out of the box, but there is nothing stopping someone from installing Forge, Fabric, or other modified binaries. I just don&#8217;t feel like taking on that level of effort, and my kids have so far resisted learning important life skills like the Bash CLI.</p>



<p>And finally, there isn&#8217;t much difference between downloading and installing the server binary on first boot and downloading and installing an updated binary. Minecraft Java edition is distributed as a JAR file, so I only really need to download it and place it in the correct folder.</p>



<p>I have a pair of PowerShell scripts that make these processes pretty easy. Both scripts have the same core function &#8211; query an online version manifest that is used by the Minecraft client and download the specified version to the local machine. The update script also has some extra logic in it to check if the service is running and gracefully stop it before downloading the updated server.jar file.</p>



<p>You can find these scripts in the files directory on GitHub.</p>



<h2 class="wp-block-heading">Running Minecraft as a systemd Service</h2>



<p>Finally, I didn&#8217;t want to have to deal with manually starting or restarting the Minecraft service. So I Googled around, and I found a bunch of systemd sample files. I did a lot of testing with these samples (and I apologize, I did not keep track of the links I used when creating my service file) to cobble together one of my own.</p>



<p>My service file has an external dependency. The MCRCON tool is required to shut down the service. While I was testing this, I ran into a number of issues where I could stop Minecraft, but it wouldn&#8217;t kill the Java process that spawned with it. It also didn&#8217;t guarantee that the world was properly saved or that users were alerted to the shutdown.</p>



<p>By using MCRCON, we can alert users to the shutdown, save the world, and gracefully exit all of the processes through a server shutdown command.</p>



<p>I also have the Minecraft service set to restart on failure. My kids have a tendency to crash the server by blowing up large stacks of TNT in a cave or other crazy things they see on YouTube, and that tends to crash the binary. This saves me a little headache by restarting the process.</p>



<h2 class="wp-block-heading">Prerequisites</h2>



<p>Before we begin, you&#8217;ll want to have a couple of prerequisites. These are:</p>



<ul class="wp-block-list">
<li>The latest copy of HashiCorp&#8217;s Packer tool installed on your build machine</li>



<li>The latest copy of the Debian 11 NetInstall ISO</li>



<li>OVFTool</li>
</ul>



<p>There are a couple of files that you should edit to match your environment before you attempt the build process these are:</p>



<ul class="wp-block-list">
<li>Debian.auto.pkrvars.hcl &#8211; variables for the build process</li>



<li>debian-minecraft.pkr.hcl file &#8211; the iso_paths line includes part of a hard-coded path that may not reflect your environment, and you may want to change the CPUs or RAM allocated to the VM.</li>



<li>Preseed.cfg file located in the HTTP folder: localization information and root password</li>
</ul>



<p>This build process uses the Packer vsphere-iso build process, so it talks to vCenter. It does not use the older vmware-iso build process.</p>



<h2 class="wp-block-heading">The Appliance Build Process</h2>



<p>As I mentioned above, I use Packer to orchestrate this build process. There is a Linux shell script in the public GitHub repo called build.sh that will kick off this build process.</p>



<p>The first step, obviously, is to install Debian. This step is fully automated and controlled by the preseed.cfg file that is referenced in the packer file.</p>



<p>Once Debian is installed, we copy over a default Bash configuration and our init-script that will run when the appliance boots for the first time to configure the hostname and networking stack.</p>



<p>After these are files are copied over, the Packer build begins to configure the appliance. The steps that it takes are:</p>



<ul class="wp-block-list">
<li>Run an apt-get update &amp; apt-get upgrade to upgrade any outdated installed packages</li>



<li>Install our system utilities, including UFW</li>



<li>Configure UFW to allow SSH and enable it</li>



<li>Install VMware Tools</li>



<li>Set up the Repos for and install PowerShell and the Temurin OpenJDK</li>



<li>Configure the rc.local file that runs on first boot</li>



<li>Disable IPv6 because Java will default to communicating over IPv6 if it is enabled</li>
</ul>



<p>After this, we do our basic Minecraft setup. This step does the following:</p>



<ul class="wp-block-list">
<li>creates our Minecraft service user and group</li>



<li>sets up our basic folder structure in /opt/Minecraft</li>



<li>downloads MCRCON into the /opt/Minecraft/tools/mcrcon directory.</li>



<li>Copy over the service file and scripts that will run on first boot</li>
</ul>



<p>The last three steps of the build are to run a cleanup script, export the appliance to OVF, and create the OVA file with the configurable OVF properties. The cleanup script cleans out the local apt cache and log files and zeroes out the free space to reduce the size of the disks on export.</p>



<p>The configurable OVF properties include all of the networking settings, the root password and SSH key, and, as mentioned above, the configurable options in the Minecraft server.properties file. OVFTool and William Lam&#8217;s script are required to create the OVA file and inject the OVF properties, and the process is outlined in this blog post.</p>



<p>The XML file with the OVF Properties is located in the postprocess-ova-properties folder in my GitHub repo.</p>



<p>The outcome of this process is a ready-to-deploy OVA file that can be uploaded to a content library.</p>



<h2 class="wp-block-heading">First Boot</h2>



<p>So what happens after you deploy the appliance and boot it for the first time.</p>



<p>First, the debian-init.py script will run to configure the basic system identity. This includes the IP address and network settings, root password, and SSH public key for passwordless login.</p>



<p>Second, we will regenerate the host SSH keys so each appliance will have a unique key. If we don&#8217;t do this step, every appliance we deploy will have the same SSH host keys as the original template. This is handled by the debian-regeneratesshkeys.sh script that is based on various scripts that I found on other sites.</p>



<p>Our third step is to install and configure the Minecraft server using the debian-minecraftinstall.sh script. This has a couple of sub-steps. These are:</p>



<ul class="wp-block-list">
<li>Retrieve our Minecraft-specific OVF Properties</li>



<li>Call our PowerShell script to download the correct Minecraft server version to /opt/Minecraft/bin</li>



<li>Initialize the Minecraft server to create all of the required folders and files</li>



<li>Edit eula.txt to accept the EULA. The server will not run and let users connect without this step</li>



<li>Edit the server.properties file and replace any default values with the OVFProperties values</li>



<li>Edit the systemd file and configure the firewall to use the Minecraft and RCON ports</li>



<li>Reset permissions and ownership on the /opt/Minecraft folders</li>



<li>Enable and start Minecraft</li>



<li>Configure our Cron job to automatically install system and Minecraft service updates</li>
</ul>



<p>The end result is a ready-to-play Minecraft VM.</p>



<p><a rel="noreferrer noopener" href="https://github.com/seanpmassey/minecraft-appliance-packer" target="_blank">All of the Packer files and scripts are available in my GitHub repository.</a> Feel free to check it out and adapt it to your needs. </p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/75ff08ce290eed6b2bb45153574afdf35f3d5b7aae83d1d3add359b31bea93d5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">seanpmassey</media:title>
		</media:content>
	</item>
		<item>
		<title>Getting Back to Blogging</title>
		<link>https://thevirtualhorizon.com/2023/01/18/getting-back-to-blogging/</link>
		
		<dc:creator><![CDATA[seanpmassey]]></dc:creator>
		<pubDate>Wed, 18 Jan 2023 20:23:44 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://thevirtualhorizon.com/?p=2485</guid>

					<description><![CDATA[As you&#8217;ve probably noticed, I&#8217;ve been pretty quite lately. I haven&#8217;t actually posted anything in about two years. So I decided to write a quick update, especially since I&#8217;m not as active on social media as I used to be. Yes, I am still alive. I&#8217;m not on Twitter anymore. I&#8217;ve moved to Mastodon, and &#8230; <a href="https://thevirtualhorizon.com/2023/01/18/getting-back-to-blogging/" class="more-link">Continue reading <span class="screen-reader-text">Getting Back to&#160;Blogging</span></a>]]></description>
										<content:encoded><![CDATA[
<p>As you&#8217;ve probably noticed, I&#8217;ve been pretty quite lately. I haven&#8217;t actually posted anything in about two years. So I decided to write a quick update, especially since I&#8217;m not as active on social media as I used to be.</p>



<p>Yes, I am still alive. I&#8217;m not on Twitter anymore. I&#8217;ve moved to Mastodon, and if you&#8217;re looking for a Mastodon instance, I would highly recommend vmst.io.</p>



<p>COVID was hard. Burnout kind of kicked in during the pandemic, and it hit home shortly after I decided to start a YouTube channel. I had a few things in the production pipeline before I went on vacation, and then I decided to take a longer break. I even took a bit of a break from creating content for VMUG. </p>



<p>I played a lot of Pokemon instead.</p>



<p>But I&#8217;m trying to get back into the swing of things. Recently, <a href="https://vmc.techzone.vmware.com/multi-cloud">I helped my team launch a Multi-Cloud page on the VMware Cloud Techzone site</a>. And that has me back in the content creating mood.</p>



<p>I will be posting stuff again soon. I have some thing in the pipeline that I&#8217;ve been kicking around for a while. I&#8217;ll be putting out a home lab update, and I owe everyone a post about the Minecraft appliance OVA template that I built for my kids. And some other stuff around identity management in a multi-cloud world.</p>



<p>So hit that subscribe button and ring the bell to be notified when new content is posted. </p>



<p>Wait&#8230;that only works for YouTube.</p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/75ff08ce290eed6b2bb45153574afdf35f3d5b7aae83d1d3add359b31bea93d5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">seanpmassey</media:title>
		</media:content>
	</item>
		<item>
		<title>What&#8217;s In The Studio &#8211; Pivoting Community Involvement to Video</title>
		<link>https://thevirtualhorizon.com/2021/01/14/whats-in-the-studio-pivoting-community-involvement-to-video/</link>
		
		<dc:creator><![CDATA[seanpmassey]]></dc:creator>
		<pubDate>Thu, 14 Jan 2021 14:00:00 +0000</pubDate>
				<category><![CDATA[Home Lab]]></category>
		<category><![CDATA[video]]></category>
		<guid isPermaLink="false">http://thevirtualhorizon.com/?p=2405</guid>

					<description><![CDATA[As we all start off 2021, I wanted to talk a little about video. As we all know, 2020 put the kibosh on large, in-person events. This included all of the vendor conferences, internal conferences, and community events like the VMware User Group UserCons and other user groups. Most of these events transitioned to online &#8230; <a href="https://thevirtualhorizon.com/2021/01/14/whats-in-the-studio-pivoting-community-involvement-to-video/" class="more-link">Continue reading <span class="screen-reader-text">What&#8217;s In The Studio &#8211; Pivoting Community Involvement to&#160;Video</span></a>]]></description>
										<content:encoded><![CDATA[
<p>As we all start off 2021, I wanted to talk a little about video.  </p>



<p>As we all know, 2020 put the kibosh on large, in-person events.  This included all of the vendor conferences, internal conferences, and community events like the VMware User Group UserCons and other user groups.  Most of these events transitioned to online events with presenters delivering recorded sessions.  It also meant more webinars, Zoom meetings, and video conferences.</p>



<p>And it doesn&#8217;t look like this will be changing for at least the first half of 2021.  </p>



<p>I&#8217;ve seen a number of blog and Twitter posts recently about home studios (for example, <a href="https://vhojan.nl/home-studio-setup/">this great post</a> by <a href="https://twitter.com/vhojan">Johan van Amersfoort</a> or this <a href="https://twitter.com/Lost_Signal/status/1346328303146303488?s=20">Twitter thread </a>from <a href="https://twitter.com/Lost_Signal">John Nicholson</a>), and I thought I would share my setup.</p>



<h3 class="wp-block-heading">Background</h3>



<p>I was not entirely unprepared to transition to video last year.  I had been a photographer since high school, and I made the jump to digital photography in college when Canon released the Digital Rebel.  I mainly focused on sports that are played in venues that are a step or two above dimly lit caves.  After college, I kind of put the camera down (except for a couple of vacations and trying my hand at a wedding or two which was not my thing).  At the beginning of 2020, I decided it was time to get back into photography, thinking I might as well get back into photography since I was traveling (  <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f602.png" alt="😂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ), and pick up a used Canon 6D that was opportunisticly priced.  And it also could record video in 1080p.</p>



<div class="wp-block-jetpack-slideshow aligncenter" data-effect="slide"><div class="wp-block-jetpack-slideshow_container swiper-container"><ul class="wp-block-jetpack-slideshow_swiper-wrapper swiper-wrapper"><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" width="480" height="640" alt="" class="wp-block-jetpack-slideshow_image wp-image-2418" data-id="2418" src="https://thevirtualhorizon.com/wp-content/uploads/2021/01/mg_6833.jpg?w=480" srcset="https://thevirtualhorizon.com/wp-content/uploads/2021/01/mg_6833.jpg 480w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/mg_6833.jpg?w=113 113w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/mg_6833.jpg?w=225 225w" sizes="(max-width: 480px) 100vw, 480px" /></figure></li><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" width="512" height="320" alt="" class="wp-block-jetpack-slideshow_image wp-image-2419" data-id="2419" src="https://thevirtualhorizon.com/wp-content/uploads/2021/01/baseball1.jpg?w=512" srcset="https://thevirtualhorizon.com/wp-content/uploads/2021/01/baseball1.jpg 512w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/baseball1.jpg?w=150 150w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/baseball1.jpg?w=300 300w" sizes="(max-width: 512px) 100vw, 512px" /></figure></li><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" width="800" height="600" alt="" class="wp-block-jetpack-slideshow_image wp-image-2420" data-id="2420" src="https://thevirtualhorizon.com/wp-content/uploads/2021/01/carnivaloperator.jpg?w=800" srcset="https://thevirtualhorizon.com/wp-content/uploads/2021/01/carnivaloperator.jpg 800w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/carnivaloperator.jpg?w=150 150w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/carnivaloperator.jpg?w=300 300w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/carnivaloperator.jpg?w=768 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure></li><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" width="640" height="480" alt="" class="wp-block-jetpack-slideshow_image wp-image-2422" data-id="2422" src="https://thevirtualhorizon.com/wp-content/uploads/2021/01/hipcheck.jpg?w=640" srcset="https://thevirtualhorizon.com/wp-content/uploads/2021/01/hipcheck.jpg 640w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/hipcheck.jpg?w=150 150w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/hipcheck.jpg?w=300 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure></li><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" width="640" height="480" alt="" class="wp-block-jetpack-slideshow_image wp-image-2423" data-id="2423" src="https://thevirtualhorizon.com/wp-content/uploads/2021/01/playatfirst.jpg?w=640" srcset="https://thevirtualhorizon.com/wp-content/uploads/2021/01/playatfirst.jpg 640w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/playatfirst.jpg?w=150 150w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/playatfirst.jpg?w=300 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure></li><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" width="480" height="640" alt="" class="wp-block-jetpack-slideshow_image wp-image-2424" data-id="2424" src="https://thevirtualhorizon.com/wp-content/uploads/2021/01/whitemonkey.jpg?w=480" srcset="https://thevirtualhorizon.com/wp-content/uploads/2021/01/whitemonkey.jpg 480w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/whitemonkey.jpg?w=113 113w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/whitemonkey.jpg?w=225 225w" sizes="(max-width: 480px) 100vw, 480px" /></figure></li><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" width="640" height="480" alt="" class="wp-block-jetpack-slideshow_image wp-image-2426" data-id="2426" src="https://thevirtualhorizon.com/wp-content/uploads/2021/01/countryusa-0880.jpg?w=640" srcset="https://thevirtualhorizon.com/wp-content/uploads/2021/01/countryusa-0880.jpg 640w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/countryusa-0880.jpg?w=150 150w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/countryusa-0880.jpg?w=300 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure></li><li class="wp-block-jetpack-slideshow_slide swiper-slide"><figure><img loading="lazy" width="800" height="640" alt="" class="wp-block-jetpack-slideshow_image wp-image-2427" data-id="2427" src="https://thevirtualhorizon.com/wp-content/uploads/2021/01/octopusbw.jpg?w=800" srcset="https://thevirtualhorizon.com/wp-content/uploads/2021/01/octopusbw.jpg 800w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/octopusbw.jpg?w=150 150w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/octopusbw.jpg?w=300 300w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/octopusbw.jpg?w=768 768w" sizes="(max-width: 800px) 100vw, 800px" /></figure></li></ul><a class="wp-block-jetpack-slideshow_button-prev swiper-button-prev swiper-button-white" role="button"></a><a class="wp-block-jetpack-slideshow_button-next swiper-button-next swiper-button-white" role="button"></a><a aria-label="Pause Slideshow" class="wp-block-jetpack-slideshow_button-pause" role="button"></a><div class="wp-block-jetpack-slideshow_pagination swiper-pagination swiper-pagination-white"></div></div></div>



<p class="has-text-align-center has-small-font-size">Slideshow: Some of my photos from years past.</p>



<p>Video was new ground for me, and it resulted in a <s>little</s> lot of experimentation and purchasing in order to get things right.  This was also happening at the beginning of the lockdowns when my whole family was at home all day and almost everything I needed was delayed or backordered.  Some of this was driven by equipment limitations, which I will cover below, and some of it was driven by other factors.</p>



<p>And as I went through this, I spent a lot of time learning what worked and what didn&#8217;t work for me.  For example, I found that sitting in front of my laptop trying to record in Zoom didn&#8217;t work for me.  When recording for a VMUG or VMworld, I wanted to stand and have room to move around because that was what felt natural to me.  </p>



<p>Before I go into my setup, I want to echo one point that Johan made in his post.  The audio and video gear is there to support the message and enable remote delivery.  If you are new to presenting, spend some time learning the craft of storytelling and presentation design.  Johan recommended two books by Nancy Duarte &#8211; resonate and Slide:ology.  I highly recommend these books as well.  If you&#8217;re new to presenting in general, I also recommend finding a mentor and learning how to use PowerPoint as the graphics capabilities are powerful but intimidating.  There are a number of good YouTube videos, for example, on how to do different things in PowerPoint.</p>



<h3 class="wp-block-heading">Requirements and Constraints</h3>



<p>I have primarily used my video gear two different ways.  The first was for video conferencing.  Whether it was Zoom, Teams, or “Other,” video became a major part of meetings to replace in-person meetings and workshops.  The second use case case was the one I probably focused on more &#8211; producing recorded content for user groups and conferences, and my goal here was to try and replicate some of the feel of presenting live while taking advantage of the capabilities that video offers.  </p>



<p>Most of the recorded video content was for VMUG UserCons.  These sessions were 40 minutes long, and they wanted to have presenters on camera along with the slides.</p>



<p>There is a third use case, which didn&#8217;t really apply for 2020.  This use case was live events such as webinars and video podcast recordings, although my studio kit can be used for this.</p>



<p>I had a few things I needed to consider when planning out my setup.  The first was space.  I had a few limiting factors when it came to having a space to record.  My office was not set up properly for keeping the gear set up permanently, and the furniture arrangement was dictated by where the one outlet was located.  (I have installed additional outlets in my office and rearranged.)  I also wanted a space that I could record while standing.  Both of these factors meant that I would be using common areas to record, so my gear selections would have to be something portable and easy to assemble.  </p>



<p>Most of my recording was originally done in my kid&#8217;s playroom in my basement.</p>



<p>The second consideration was trying to keep this budget friendly.  The key word here is trying.  I may have failed there.</p>



<p>I already had a lot of Canon gear from my photography days, so I wanted to reuse it as much as possible.  I already had a Canon EOS 6D, and that could record 1080p HD video.  Although I did upgrade my camera bodies by trading in old gear, I stayed in the Canon ecosystem as I didn&#8217;t want to invest in all new lenses.    </p>



<p>I had a copy of Camtasia for screen recording, but combining the Camtasia capture with video recorded in camera would require additional workflow to get the final video together.  This would require some sort of video editing software.  And I would also need audio and lighting gear.  This gear had to fit the requirements and constraints laid out above and be both cost effective and portable.</p>



<h3 class="wp-block-heading">Studio Gear</h3>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="768" data-attachment-id="2414" data-permalink="https://thevirtualhorizon.com/img_1629/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2021/01/img_1629.jpg" data-orig-size="4032,3024" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone XR&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1608586669&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.25&quot;,&quot;iso&quot;:&quot;64&quot;,&quot;shutter_speed&quot;:&quot;0.0083333333333333&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="img_1629" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2021/01/img_1629.jpg?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2021/01/img_1629.jpg?w=676" tabindex="0" role="button" src="https://thevirtualhorizon.com/wp-content/uploads/2021/01/img_1629.jpg?w=1024" alt="" class="wp-image-2414" srcset="https://thevirtualhorizon.com/wp-content/uploads/2021/01/img_1629.jpg?w=1024 1024w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/img_1629.jpg?w=2048 2048w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/img_1629.jpg?w=150 150w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/img_1629.jpg?w=300 300w, https://thevirtualhorizon.com/wp-content/uploads/2021/01/img_1629.jpg?w=768 768w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>My studio setup in my office.</figcaption></figure>



<p><em>Note: I will be linking to Amazon, Adorama, and other sites in this section.  These are <strong>NOT</strong> affiliate links.  I have not monetized my site, and I make no money off of any purchases you choose to make.</em></p>



<h4 class="wp-block-heading">Cameras and Lenses</h4>



<p><strong><a href="https://www.adorama.com/car6.html">Canon EOS R6</a></strong> with <strong><a href="https://www.adorama.com/ca5014afu.html">Canon EF 50mm F/1.4 USM Lens</a></strong> and <strong><a href="https://www.amazon.com/gp/product/B01D68YXOQ/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&amp;psc=1">DC Adapter</a></strong> &#8211; Primary Camera</p>



<p><strong><a href="https://www.adorama.com/icasl3.html">Canon EOS Rebel SL3</a></strong> with <strong><a href="https://www.adorama.com/ca4028a.html">Canon EF 40mm F/2.8 STM Lens</a></strong> and <a href="https://www.amazon.com/gp/product/B074K181L8/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&amp;psc=1"><strong>DC Adapter</strong></a> &#8211; Secondary/Backup Camera</p>



<p><em>Note: Both cameras use DC Adapters when set up in the studio because these cameras will eat through their batteries when doing video. Yes, I&#8217;ve lost a few hours while waiting for all of my battery packs to recharge.</em></p>



<h4 class="wp-block-heading">Audio</h4>



<p><strong><a href="https://www.adorama.com/sywmict1.html">Synco Audio WMic-T1 Wireless Lavalier Microphone System</a></strong> (x2) &#8211; primary audio</p>



<p><strong><a href="https://www.amazon.com/gp/product/B07L8YNH6N/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&amp;psc=1">Comica CVM-V30 Pro Shotgun Microphone</a></strong> &#8211; Secondary audio</p>



<p><strong><a href="https://www.amazon.com/gp/product/B00N1YPXW2/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&amp;psc=1">Blue Yeti USB Mic</a></strong> &#8211; <em>(Note: This is at my desk, but I only use it for recording voiceovers or while on Zoom/Teams/etc calls.  If I ever restart my podcast, I will use this for that as well.)</em></p>



<h4 class="wp-block-heading">Lighting</h4>



<p><a href="https://www.amazon.com/gp/product/B08D6HMGTR/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&amp;psc=1"><strong>Neewer 288 Large LED Video Light Panel (x2)</strong></a></p>



<p><a href="https://www.amazon.com/gp/product/B07C9ZNY17/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&amp;psc=1"><strong>Viltrox VL-162T Video Light (x2)</strong></a></p>



<p><strong><a href="https://www.amazon.com/gp/product/B074VMTP68/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&amp;psc=1">Amazon Basics Light Stands (x2)</a></strong></p>



<h4 class="wp-block-heading">Other Hardware and Software</h4>



<p><strong><a href="https://www.adorama.com/bmatemminiso.html">Blackmagic Design ATEM Mini Pro ISO</a></strong> &#8211; See Below</p>



<p><strong><a href="https://www.blackmagicdesign.com/products/davinciresolve/">Davinci Resolve</a> </strong>(<em>Note: Davinci Resolve is a free, full featured video editing suite. There is also a paid version, Davinci Resolve Studio, that has a one-time cost of $299.  Yes.  It&#8217;s a perpetual license.)</em></p>



<p><a href="https://www.techsmith.com/video-editor.html"><strong>Camtasia</strong></a></p>



<h4 class="wp-block-heading">A note on why I&#8217;m using the ATEM Mini Pro ISO</h4>



<p>When I started, I was using Camtasia to record my screen while I recorded my presentation using my camera.  Creating the final output required a lot of post-processing work to line up the audio and video across multiple sources.</p>



<p>The ATEM Mini Pro ISO allows me to bring together all my audio and video sources into a single device and record each input. So I can bring both cameras, my microphones, and any computers that I&#8217;m displaying content on (such as slides or demos) and record all of these inputs to disk. This allows me to record everything on one disk, so I don&#8217;t have to worry about managing data on multiple memory cards, and it simplifies my post-production workflow because I don&#8217;t have to synchronize everything manually.</p>



<p>There is a second benefit that I haven&#8217;t covered.  It also allows me to get around a video recording limit built into modern cameras.</p>



<p>Most DSLRs and mirrorless cameras are have a video recording time limit when recording to internal cards.  Video segments are limited to approximately 29 minutes and 59 seconds.  This limit isn&#8217;t due to file size or hardware limitations (although some cameras have shorter time limits due to heat dissipation issues).  <a href="https://www.borrowlenses.com/blog/video-recording-limits-in-mirrorless-and-dslr-cameras/">It&#8217;s an artificial limit due to import-duty restrictions that the European Union put on video cameras</a>.  </p>



<p>VMUG UserCon sessions are 40 minutes, and I was burned by the 30 minute time limit on a couple of occassions.  </p>



<p>That recording time limit only applies when recording to the internal card, though.  It does not apply to external devices like the ATEM Mini.  In order to use this with a DSLR or mirrorless camera, you need a one that supports sending a clean video feed over HDMI (Clean HDMI Out). Canon has a good video that explains it <a href="https://www.youtube.com/watch?v=PoG6iqusrkM&amp;feature=youtu.be">here</a>.  (<em>Note: There are also USB webcam drivers for many modern DSLR and mirrorless cameras that allow you to do the same type of thing with tools like OBS.)</em></p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/75ff08ce290eed6b2bb45153574afdf35f3d5b7aae83d1d3add359b31bea93d5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">seanpmassey</media:title>
		</media:content>

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2021/01/mg_6833.jpg?w=480" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2021/01/baseball1.jpg?w=512" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2021/01/carnivaloperator.jpg?w=800" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2021/01/hipcheck.jpg?w=640" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2021/01/playatfirst.jpg?w=640" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2021/01/whitemonkey.jpg?w=480" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2021/01/countryusa-0880.jpg?w=640" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2021/01/octopusbw.jpg?w=800" medium="image" />

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2021/01/img_1629.jpg?w=1024" medium="image" />
	</item>
		<item>
		<title>Horizon 8.0 Part 10: Deploying the Unified Access Gateway</title>
		<link>https://thevirtualhorizon.com/2020/12/31/horizon-8-0-part-10-deploying-the-unified-access-gateway/</link>
		
		<dc:creator><![CDATA[seanpmassey]]></dc:creator>
		<pubDate>Thu, 31 Dec 2020 17:16:54 +0000</pubDate>
				<category><![CDATA[VDI]]></category>
		<category><![CDATA[VMware View]]></category>
		<guid isPermaLink="false">http://thevirtualhorizon.com/?p=2151</guid>

					<description><![CDATA[And we&#8217;re back&#8230;this week with the final part of deploying a Horizon 2006 environment &#8211; deploying the Unified Access Gateway to enable remote access to desktops. Before we go into the deployment process, let&#8217;s dive into the background on the appliance. The Unified Access Gateway (also abbreviated as UAG) is a purpose built virtual appliance &#8230; <a href="https://thevirtualhorizon.com/2020/12/31/horizon-8-0-part-10-deploying-the-unified-access-gateway/" class="more-link">Continue reading <span class="screen-reader-text">Horizon 8.0 Part 10: Deploying the Unified Access&#160;Gateway</span></a>]]></description>
										<content:encoded><![CDATA[<p>And we&#8217;re back&#8230;this week with the final part of deploying a Horizon 2006 environment &#8211; deploying the Unified Access Gateway to enable remote access to desktops.</p>
<p>Before we go into the deployment process, let&#8217;s dive into the background on the appliance.</p>
<p>The Unified Access Gateway (also abbreviated as UAG) is a purpose built virtual appliance that is designed to be the remote access component for VMware Horizon and Workspace One.&nbsp; The appliance is hardened for deployment in a DMZ scenario, and it is designed to only pass authorized traffic from authenticated users into a secure network.</p>
<p>As of Horizon 2006, the UAG is the primary remote access component for Horizon.&nbsp; This wasn&#8217;t always the case &#8211; previous Horizon releases the Horizon Security Server.&nbsp; The Security Server was a Windows Server running a stripped-down version of the Horizon Connection Server, and this component was deprecated and removed with Horizon 2006.</p>
<p>The UAG has some benefits over the Security Server.&nbsp; First, it does not require a Windows license.&nbsp; The UAG is built on Photon, VMware&#8217;s lightweight Linux distribution, and it is distributed as an appliance.&nbsp; Second, the UAG is not tightly coupled to a connection server, so you can use a load balancer between the UAG and the Connection Server to eliminate single points of failure.</p>
<p>And finally, multifactor authentication is validated on the UAG in the DMZ.&nbsp; When multi-factor authentication is enabled, users are prompted for that second factor first, and they are only prompted for their Active Directory credentials if this authentication is successful.&nbsp; The UAG can utilize multiple forms of MFA, including RSA, RADIUS, and SAML-based solutions, and setting up MFA on the UAG does not require any changes to the connection servers.</p>
<p>There have also been a couple of 3rd-party options that could be used with Horizon. I won&#8217;t be covering any of the other options in this post.</p>
<p>If you want to learn more about the Unified Access Gateway, including a deeper dive on its capabilities, sizing, and deployment architectures, please check out the <a href="https://techzone.vmware.com/resource/unified-access-gateway-architecture">Unified Access Gateway Architecture guide on VMware Techzone</a>.</p>
<h3>Deploying the Unified Access Gateway</h3>
<p>There are two main ways to deploy the UAG.&nbsp; The first is a manual deployment where the UAG&#8217;s OVA file is manually deployed through vCenter, and then the appliance is configured through the built-in Admin interface.&nbsp; The second option is the PowerShell deployment method, where a PowerShell script and OVFTool are used to automatically deploy the OVA file, and the appliance&#8217;s configuration is injected from an INI file during deployment.</p>
<p>Typically, I prefer using the PowerShell deployment method.&nbsp; This method consists of a <a href="https://communities.vmware.com/docs/DOC-30835">PowerShell Deployment Script</a> and an INI file that contains the configuration for each appliance that you&#8217;re deploying.&nbsp; I like the PowerShell script over deploying the appliance through vCenter because the appliance is ready to use on first boot. It also allows administrators to track all configurations in a source control system such as Github, which provides both documentation for the configuration and change tracking.&nbsp; This method makes it easy to redeploy or upgrade the Unified Access Gateway because I rerun the script with my config file and the new OVA file.</p>
<p>The PowerShell script requires the OVF Tool to be installed on the server or desktop where the PowerShell script will be executed.&nbsp; The latest version of the OVF Tool can be downloaded from MyVMware.&nbsp; PowerCLI is not required when deploying the UAG as OVF Tool will be deploying the appliance and injecting the configuration.</p>
<p>The zip file that contains the PowerShell scripts includes sample templates for different use cases.&nbsp; This includes Horizon use cases with RADIUS and RSA-based multifactor authentication.&nbsp; You can also find the reference guide for all options <a href="https://communities.vmware.com/t5/Horizon-Documents/Using-PowerShell-to-Deploy-VMware-Unified-Access-Gateway/ta-p/2782995#toc-hId--1487630311">here</a>.</p>
<p>If you haven&#8217;t deployed a UAG before, are implementing a new feature on the UAG, or you&#8217;re not comfortable creating the INI configuration file from scratch, then you can use the manual deployment method to configure your appliance and then export the configuration in the INI file format that the PowerShell deployment method can consume.&nbsp; This exported configuration only contains the appliance&#8217;s Workspace ONE or Horizon configuration &#8211; you would still have to add in your vSphere and SSL Certificate configuration.</p>
<p>You can export the configuration from the UAG admin interface.&nbsp; It is the last item in the Support Settings section.</p>
<p><img loading="lazy" data-attachment-id="2400" data-permalink="https://thevirtualhorizon.com/2020/12/31/horizon-8-0-part-10-deploying-the-unified-access-gateway/uag-config-export/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2020/12/uag-config-export.png" data-orig-size="1080,240" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="UAG-Config-Export" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2020/12/uag-config-export.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2020/12/uag-config-export.png?w=676" tabindex="0" role="button" class="alignnone size-full wp-image-2400" src="https://thevirtualhorizon.com/wp-content/uploads/2020/12/uag-config-export.png" alt="UAG-Config-Export" width="1080" height="240" srcset="https://thevirtualhorizon.com/wp-content/uploads/2020/12/uag-config-export.png 1080w, https://thevirtualhorizon.com/wp-content/uploads/2020/12/uag-config-export.png?w=150&amp;h=33 150w, https://thevirtualhorizon.com/wp-content/uploads/2020/12/uag-config-export.png?w=300&amp;h=67 300w, https://thevirtualhorizon.com/wp-content/uploads/2020/12/uag-config-export.png?w=768&amp;h=171 768w, https://thevirtualhorizon.com/wp-content/uploads/2020/12/uag-config-export.png?w=1024&amp;h=228 1024w" sizes="(max-width: 1080px) 100vw, 1080px"></p>
<p>One other thing that can trip people up when creating their first UAG deployment file is the deployment path used by OVFTool.&nbsp; This is not always straightforward, and vCenter has some &#8220;hidden&#8221; objects that need to be included in the path.&nbsp; OVFTool can be used to discover the path where the appliance will be deployed.</p>
<p>You can use OVFTool to connect to your vCenter with a partial path, and then view the objects in that location.&nbsp; It may require multiple connection attempts with OVFTool to build out the path.&nbsp; You can see an example of this over at the <a href="http://www.vmwarearena.com/export-vm-to-ova-or-ovf-using-ovf-tool/">VMwareArena blog on how to export a VM with OVFTool</a> or in question 8 in the troubleshooting section of the <a href="https://communities.vmware.com/t5/Horizon-Documents/Using-PowerShell-to-Deploy-VMware-Unified-Access-Gateway/ta-p/2782995">Using PowerShell to Deploy the Unified Access Gateway</a> guide.</p>
<p>Before deploying the UAG, we need to get some prerequisites in place.&nbsp; These are:</p>
<ol>
<li>Download the Unified Access Gateway OVA file, PowerShell deployment script zip file, and the latest version of OVFTool from <a href="https://my.vmware.com">MyVMware</a>.</li>
<li>Right click on the PowerShell zip file and select Properties.</li>
<li>Click Unblock.&nbsp; This step is required because the file was downloaded from the Internet, and is untrusted by default, and this can prevent the scripts from executing after we unzip them.</li>
<li>Extract the contents of the downloaded ZIP file to a folder on the system where the deployment script will be run.&nbsp; The ZIP file contains multiple files, but we will only be using the uagdeploy.ps1 script file and the uagdeploy.psm1 module file.&nbsp; The other scripts are used to deploy the UAG to Hyper-V, Azure, and AWS EC2.The zip file will also contain a number of default templates.&nbsp; When deploying the access points for Horizon, I recommend starting with the UAG2-Advanced.ini template.&nbsp; This template provides the most options for configuring Horizon remote access and networking.&nbsp; Once you have the UAG deployed successfully, I recommend copying the relevant portions of the SecurID or RADIUS auth templates into your working AP template.&nbsp; This allows you to test remote access and your DMZ networking and routing before adding in MFA.</li>
<li>Before we start filling out the template for our first access point, there are some things we&#8217;ll need to do to ensure a successful deployment. These steps are:
<ol>
<li>Ensure that the OVF Tool is installed on your deployment machine.</li>
<li>Locate the UAG&#8217;s OVA file and record the full file path.&nbsp; The OVA file can be placed on a network share.</li>
<li>We will need a copy of the certificate, including any intermediate and root CA certificates, and the private key in PFX or PEM format.&nbsp; Place these files into a folder on the local or network folder and record the full path.If you are using PEM files, the certificate files should be concatenated so that the certificate and any CA certificates in the chain are in one file, and the private key should not have a password on it.&nbsp; If you are using PFX files, you will be prompted for a password when deploying the UAG.</li>
<li>We need to create the path to the vSphere resources that OVF Tool will use when deploying the appliance.&nbsp; This path looks like: vi://user@PASSWORD:vcenter.fqdn.orIP/DataCenter Name/host/Host or Cluster Name/OVF Tool is case sensitive, so make sure that the datacenter name and host or cluster names are entered as they are displayed in vCenter.
<p>The uppercase PASSWORD in the OVFTool string is a variable that prompts the user for a password before deploying the appliance.&nbsp; If you are automating your deployment, you can replace this with the password for the service account that will be used for deploying the UAG.</p>
<p><strong style="font-size:inherit;">Note: I don&#8217;t recommend saving the service account password in the INI files. If you plan to do this, remember best practices around saving passwords in plaintext files and ensure that your service account only has the required permissions for deploying the UAG appliances.</strong></p>
<p><strong style="font-size:inherit;"><br />
</strong><strong style="font-size:inherit;"></strong></li>
<li>Generate the passwords that&nbsp; you will use for the appliance Root and Admin passwords.</li>
<li>Get the SSL Thumbprint for the certificate on your Connection Server or load balancer that is in front of the connection servers.</li>
</ol>
</li>
<li>Fill out the template file.&nbsp; The file has comments for documentation, so it should be pretty easy to fill out. You will need to have a valid port group for all three networks, even if you are only using the OneNic deployment option.</li>
<li>Save your INI file as &lt;UAGName&gt;.ini in the same directory as the deployment scripts.</li>
</ol>
<p>There is one change that we will need to configure on our Connection Servers before we deploy the UAGs &#8211; disabling the Blast and PCoIP secure gateways.&nbsp; If these are not disabled, the UAG will attempt to tunnel the user protocol session traffic through the Connection Server, and users will get a black screen instead of a desktop.</p>
<p>The steps for disabling the gateways are:</p>
<ol>
<li>Log into your Connection Server admin interface.</li>
<li>Go to&nbsp;<strong>Settings -&gt; Servers -&gt; Connection Servers</strong></li>
<li>Select your Connection Server and then click&nbsp;<strong>Edit</strong>.</li>
<li>Uncheck the following options:
<ol>
<li>Use Secure Tunnel to Connect to machine</li>
<li>Use PCoIP Secure Gateway for PCoIP connections to machine</li>
</ol>
</li>
<li>Under Blast Secure Gateway, select&nbsp;<strong>Use Blast Secure Gateway for only HTML Access connections to machine</strong>.&nbsp; This option may reduce the number of certificate prompts that users receive if using the HTML5 client to access their desktop.</li>
<li>Click OK.</li>
</ol>
<p><img loading="lazy" data-attachment-id="2402" data-permalink="https://thevirtualhorizon.com/2020/12/31/horizon-8-0-part-10-deploying-the-unified-access-gateway/connection-server-settings/" data-orig-file="https://thevirtualhorizon.com/wp-content/uploads/2020/12/connection-server-settings.png" data-orig-size="1920,1422" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Connection Server Settings" data-image-description="" data-image-caption="" data-medium-file="https://thevirtualhorizon.com/wp-content/uploads/2020/12/connection-server-settings.png?w=300" data-large-file="https://thevirtualhorizon.com/wp-content/uploads/2020/12/connection-server-settings.png?w=676" tabindex="0" role="button" class="alignnone size-full wp-image-2402" src="https://thevirtualhorizon.com/wp-content/uploads/2020/12/connection-server-settings.png" alt="Connection Server Settings" width="1920" height="1422" srcset="https://thevirtualhorizon.com/wp-content/uploads/2020/12/connection-server-settings.png 1920w, https://thevirtualhorizon.com/wp-content/uploads/2020/12/connection-server-settings.png?w=150&amp;h=111 150w, https://thevirtualhorizon.com/wp-content/uploads/2020/12/connection-server-settings.png?w=300&amp;h=222 300w, https://thevirtualhorizon.com/wp-content/uploads/2020/12/connection-server-settings.png?w=768&amp;h=569 768w, https://thevirtualhorizon.com/wp-content/uploads/2020/12/connection-server-settings.png?w=1024&amp;h=758 1024w" sizes="(max-width: 1920px) 100vw, 1920px"></p>
<p>Once all of these tasks are done, we can start deploying the UAGs.&nbsp; The steps are:</p>
<ol>
<li>Open PowerShell and change to the directory where the deployment scripts are stored.</li>
<li>Run the deployment script.&nbsp; The syntax is .\UAGDeploy.ps1 –inifile &lt;apname&gt;.ini</li>
<li>Enter the appliance root password twice.</li>
<li>Enter the admin password twice.&nbsp; This password is optional, however, if one is not configured, the REST API and Admin interface will not be available.<br />
<strong>Note: The UAG Deploy script has parameters for the root and admin passwords.&nbsp; These can be used to reduce the number of prompts after running the script.</strong></li>
<li>If RADIUS is configured in the INI file, you will be prompted for the RADIUS shared secret.</li>
<li>After the script opens the OVA and validates the manifest, it will prompt you for the password for accessing vCenter.&nbsp; Enter it here.</li>
<li>If a UAG with the same name is already deployed, it will be powered off and deleted.</li>
<li>The appliance OVA will be deployed.&nbsp; When the deployment is complete, the appliance will be powered on and get an IP address from DHCP.</li>
<li>The appliance configuration defined in the INI file will be injected into the appliance and applied during the bootup.&nbsp; It may take a few minutes for configuration to be completed.</li>
</ol>
<p><a href="https://thevirtualhorizon.com/wp-content/uploads/2017/03/image.png"><img style="background-image:none;float:none;padding-top:0;padding-left:0;margin-left:auto;display:block;padding-right:0;margin-right:auto;border:0;" title="image" src="https://thevirtualhorizon.com/wp-content/uploads/2017/03/image_thumb.png" alt="image" width="596" height="438" border="0"></a></p>
<p><strong>Testing the Unified Access Gateway</strong></p>
<p>Once the appliance has finished it&#8217;s deployment and self-configuration, it needs to be tested to ensure that it is operating properly. The best way that I&#8217;ve found for doing this is to use a mobile device, such as a smartphone or cellular-enabled tablet, to access the environment using the Horizon mobile app.&nbsp; If everything is working properly, you should be prompted to sign in, and desktop pool connections should be successful.</p>
<p>If you are not able to sign in, or you can sign in but not connect to a desktop pool, the first thing to check is your firewall rules.&nbsp; Validate that TCP and UDP ports 443, 8443 and 4172 are open between the Internet and your Unified Access Gateway.&nbsp; You may also want to check your Connection Server configuration and ensure that HTTP Secure Gateway, PCoIP Secure Gateway, and Blast Secure Gateway are disabled.</p>
<p>If you&#8217;re deploying your UAGs with multiple NICs and your desktops live in a different subnet than your UAGs and/or your Connection Servers, you may need to statically define routes.&nbsp; The UAG typically has the default route set on the Internet or external interface, so it may not have routes to the desktop subnets unless they are statically defined.&nbsp; An example of a route configuration may look like the following:</p>
<p>routes1 = 192.168.2.0/24 192.168.1.1,192.168.3.0/24 192.168.1.1</p>
<p>If you need to make a routing change, the best way to handle it is to update the ini file and then redeploy the appliance.</p>
<p>Once deployed and tested, your Horizon infrastructure is configured, and you&#8217;re ready to start having users connect to the environment.</p>
]]></content:encoded>
					
		
		
		
		<media:content url="https://1.gravatar.com/avatar/75ff08ce290eed6b2bb45153574afdf35f3d5b7aae83d1d3add359b31bea93d5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">seanpmassey</media:title>
		</media:content>

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2020/12/uag-config-export.png" medium="image">
			<media:title type="html">UAG-Config-Export</media:title>
		</media:content>

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2020/12/connection-server-settings.png" medium="image">
			<media:title type="html">Connection Server Settings</media:title>
		</media:content>

		<media:content url="https://thevirtualhorizon.com/wp-content/uploads/2017/03/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
	</channel>
</rss>
