<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Get DevOps Pro</title>
    <description>The latest articles on Forem by Get DevOps Pro (@getdevopspro).</description>
    <link>https://forem.com/getdevopspro</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F10567%2F8d4f9e8f-100f-451e-9200-b953678cd159.png</url>
      <title>Forem: Get DevOps Pro</title>
      <link>https://forem.com/getdevopspro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/getdevopspro"/>
    <language>en</language>
    <item>
      <title>Building a K3s Cluster with Armbian on Orange Pi 5 Plus: A Step-by-Step Guide</title>
      <dc:creator>Job Céspedes Ortiz</dc:creator>
      <pubDate>Mon, 13 Nov 2023 15:47:24 +0000</pubDate>
      <link>https://forem.com/getdevopspro/building-a-k3s-cluster-with-armbian-on-orange-pi-5-plus-a-step-by-step-guide-18b</link>
      <guid>https://forem.com/getdevopspro/building-a-k3s-cluster-with-armbian-on-orange-pi-5-plus-a-step-by-step-guide-18b</guid>
      <description>&lt;p&gt;In this blog post, I'll be sharing my hands-on experience in building a K3s Cluster on the Orange Pi 5 Plus (opi5+) using Armbian as the Operating System (OS) and Ansible. The post is meant as a straightforward guide for anyone looking to replicate the process. I hope it proves helpful for your own setup.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please consider that in some sections, there are references to external guides containing the respective steps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Armbian?
&lt;/h2&gt;

&lt;p&gt;After &lt;a href="https://dev.to/jobcespedes/building-a-k3s-cluster-with-fedora-coreos-on-orange-pi-5-plus-lessons-from-my-unsuccessful-attempt-2hf"&gt;my failed attempt using Fedora CoreOS&lt;/a&gt;, Armbian + K3s was one of the options I considered. Among the reasons behind selecting Armbian as the OS, there are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wide Hardware Support&lt;/strong&gt;: Armbian provides support for a wide range of ARM-based single-board computers (SBCs), giving you flexibility in choosing hardware for your K3s cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stability and Reliability&lt;/strong&gt;: Armbian is known for its stability and reliability, making it a suitable choice for building robust and resilient K3s clusters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimized for ARM Architecture&lt;/strong&gt;: Armbian is optimized specifically for ARM architecture, ensuring efficient performance on ARM-based devices commonly used for SBCs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regular Updates&lt;/strong&gt;: Armbian releases regular updates and security patches, helping you keep your system up-to-date and secure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low Resource Footprint&lt;/strong&gt;: Armbian is designed to be resource-efficient, making it suitable for resource-constrained environments common in SBCs, which is ideal for setting up cost-effective K3s clusters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community Support&lt;/strong&gt;: Being an open-source project, Armbian has an active community that provides support, documentation, and troubleshooting assistance, which can be valuable when setting up and maintaining a K3s cluster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Warning
&lt;/h2&gt;

&lt;p&gt;There are a couple of things you should be aware of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is a laboratory environment.&lt;/li&gt;
&lt;li&gt;Some steps involve commands that will erase data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Assumptions
&lt;/h2&gt;

&lt;p&gt;The following assumptions have been made:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Device is Orange Pi 5+ version.&lt;/li&gt;
&lt;li&gt;There is another laptop/PC for preparations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preparations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Items
&lt;/h3&gt;

&lt;p&gt;The items used for this task are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1x SD Card with at least 4GB&lt;/li&gt;
&lt;li&gt;3x &lt;a href="https://www.aliexpress.com/item/1005005775077219.html" rel="noopener noreferrer"&gt;Orange Pi5 Plus 16G + 256G EMMC Module with US 5V4A Type C Power&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;3x &lt;a href="https://www.aliexpress.com/item/1005005626040665.html" rel="noopener noreferrer"&gt;Geekworm Orange Pi 5 Plus Cluster Acrylic Case with Fan and Heatsink Kit&lt;/a&gt;. Please note:

&lt;ul&gt;
&lt;li&gt;The included heatsink may not fit perfectly and might require some force to install.&lt;/li&gt;
&lt;li&gt;One of the screws on the fan may touch a clip on the heatsink and lift the top cover on one side. To address this, you can remove that specific fan screw, leaving only 3 of the 4, to prevent any unevenness in the top stack.&lt;/li&gt;
&lt;li&gt;There is no step-by-step manual or video guide available.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;1x &lt;a href="https://aliexpress.com/item/1005005118650350.html" rel="noopener noreferrer"&gt;HORACO 8 Port 2.5G Ethernet Switch&lt;/a&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Other items
&lt;/h4&gt;

&lt;p&gt;Two additional items were acquired, specifically for a Linux storage server and not intended for the K3s cluster. Below are the details of these items in case they serve as a reference. Kindly note that they are not meant or required for the K3s Cluster:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1x &lt;a href="https://www.aliexpress.com/item/1005002276380808.html" rel="noopener noreferrer"&gt;25G SFP28 SFP+ DAC Cable - 25GBASE-CR SFP28 to SFP28 Passive Direct Attach Copper&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;1x ConnectX-4 Lx EN CX4121A-ACAT 2-Port 10/25GbE SFP28 PCI-E&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install Armbian
&lt;/h2&gt;

&lt;p&gt;To install Armbian, follow &lt;a href="https://docs.armbian.com/User-Guide_Getting-Started/" rel="noopener noreferrer"&gt;Armbian Quickstart&lt;/a&gt;. The steps include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Downloading Armbian image for opi5+&lt;/li&gt;
&lt;li&gt;Installing Armbian image in the SD Card&lt;/li&gt;
&lt;li&gt;Booting from SD card, do basic config, and install image in opi5+ eMMC with: &lt;code&gt;armbian-install&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Powering off&lt;/li&gt;
&lt;li&gt;Removing SD card&lt;/li&gt;
&lt;li&gt;Booting into eMMC and Armbian&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Other Basic Config
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Remove the SD card&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Boot into eMMC and configure basic settings before proceeding further. Access using SSH keys without asking for a password is required for installing K3s using ansible. The other steps are optional:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get root access&lt;/li&gt;
&lt;li&gt;Change root password&lt;/li&gt;
&lt;li&gt;Change user password&lt;/li&gt;
&lt;li&gt;Upgrade OS and packages&lt;/li&gt;
&lt;li&gt;Allow sudo without password&lt;/li&gt;
&lt;li&gt;Allow auth using SSH keys&lt;/li&gt;
&lt;li&gt;Customize /etc/hosts&lt;/li&gt;
&lt;li&gt;Create network teaming/bonding&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Below are the commands to perform the steps listed above. Change variable values according to your context. Replicate them in each of the other devices. Remember you need root access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## as root.&lt;/span&gt;
&lt;span class="c"&gt;# sudo bash&lt;/span&gt;

&lt;span class="c"&gt;## change passwords&lt;/span&gt;
&lt;span class="c"&gt;# passwd root&lt;/span&gt;
&lt;span class="c"&gt;# passwd ${opi_hostname}&lt;/span&gt;

&lt;span class="c"&gt;## upgrade pkgs&lt;/span&gt;
apt update
&lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;## vars /CHANGE_THEM&lt;/span&gt;
&lt;span class="nv"&gt;opi_username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;changeme
&lt;span class="nv"&gt;opi_hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;changeme-01
&lt;span class="nv"&gt;opi_domain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;change.me
&lt;span class="nv"&gt;opi_fqdn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_hostname&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_domain&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;opi_cidr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.10/24
&lt;span class="nv"&gt;opi_gw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.1
&lt;span class="nv"&gt;opi_dns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'8.8.8.8 8.8.4.4'&lt;/span&gt;
&lt;span class="nv"&gt;opi_ssh_authorized_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ssh-rsa CHANGEME'&lt;/span&gt;

&lt;span class="c"&gt;## sudo&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;_EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; /etc/sudoers.d/10-opi5-user
# User rules for &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_username&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;
&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_username&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt; ALL=(ALL) NOPASSWD:ALL
&lt;/span&gt;&lt;span class="no"&gt;_EOF

&lt;/span&gt;&lt;span class="c"&gt;## ssh&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /home/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_username&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/.ssh
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;_EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; /home/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_username&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/.ssh/authorized_keys
ssh-rsa &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_ssh_authorized_key&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;
&lt;/span&gt;&lt;span class="no"&gt;_EOF
&lt;/span&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;0700 &lt;span class="nt"&gt;-R&lt;/span&gt; /home/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_username&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/.ssh
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_username&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;:&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_username&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; /home/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_username&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/.ssh
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s@#PasswordAuthentication.*@PasswordAuthentication no@"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  /etc/ssh/sshd_config
systemctl restart ssh

&lt;span class="c"&gt;## /etc/hosts&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;_EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; /etc/hosts
127.0.0.1   localhost
127.0.1.1   &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_fqdn&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt; &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_hostname&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;
::1         localhost ip6-localhost ip6-loopback &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_fqdn&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt; &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_hostname&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;
fe00::0     ip6-localnet
ff00::0     ip6-mcastprefix
ff02::1     ip6-allnodes
ff02::2     ip6-allrouters
&lt;/span&gt;&lt;span class="no"&gt;_EOF

&lt;/span&gt;&lt;span class="c"&gt;## hostname&lt;/span&gt;
hostnamectl set-hostname &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_hostname&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;## lock root password&lt;/span&gt;
passwd &lt;span class="nt"&gt;-l&lt;/span&gt; root

&lt;span class="c"&gt;## network bonding&lt;/span&gt;
&lt;span class="c"&gt;# workaround: https://github.com/coreos/fedora-coreos-tracker/issues/919&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;_EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; /etc/systemd/network/98-bond-inherit-mac.link
[Match]
Type=bond

[Link]
MACAddressPolicy=none
&lt;/span&gt;&lt;span class="no"&gt;_EOF

&lt;/span&gt;&lt;span class="c"&gt;# add bond interface&lt;/span&gt;
&lt;span class="c"&gt;# this could cause disconection&lt;/span&gt;
nmcli connection add &lt;span class="nb"&gt;type &lt;/span&gt;bond con-name bond0 ifname bond0 &lt;span class="se"&gt;\&lt;/span&gt;
  bond.options &lt;span class="s2"&gt;"mode=balance-alb,miimon=1000"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ipv4.addresses &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_cidr&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; ipv4.gateway &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_gw&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ipv4.dns &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_dns&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; ipv4.dns-search &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opi_domain&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ipv4.method manual bond.options &lt;span class="s2"&gt;"mode=balance-alb,miimon=1000"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  mtu 9000
&lt;span class="c"&gt;# add current devices&lt;/span&gt;
nmcli connection add &lt;span class="nb"&gt;type &lt;/span&gt;ethernet slave-type bond &lt;span class="se"&gt;\&lt;/span&gt;
  con-name bond0-port1 ifname enP3p49s0 master bond0 mtu 9000
nmcli connection add &lt;span class="nb"&gt;type &lt;/span&gt;ethernet slave-type bond &lt;span class="se"&gt;\&lt;/span&gt;
  con-name bond0-port2 ifname enP4p65s0 master bond0 mtu 9000
&lt;span class="c"&gt;# delete old connections&lt;/span&gt;
nmcli connection delete &lt;span class="s2"&gt;"Wired connection 1"&lt;/span&gt;
nmcli connection delete &lt;span class="s2"&gt;"Wired connection 2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install K3s
&lt;/h2&gt;

&lt;p&gt;Now you are ready to install K3s, using Ansible and &lt;a href="https://github.com/PyratLabs/ansible-role-k3s" rel="noopener noreferrer"&gt;a K3s role&lt;/a&gt;. Perform the following steps on a system other than your Opi5+ devices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; and the &lt;a href="https://github.com/PyratLabs/ansible-role-k3s" rel="noopener noreferrer"&gt;K3s role&lt;/a&gt;.

&lt;ul&gt;
&lt;li&gt;For &lt;a href="https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html" rel="noopener noreferrer"&gt;installing Ansible&lt;/a&gt;, you could run &lt;code&gt;pip install ansible&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;For installing the &lt;a href="https://github.com/PyratLabs/ansible-role-k3s" rel="noopener noreferrer"&gt;K3s role&lt;/a&gt;, you could run &lt;code&gt;ansible-galaxy role install xanmanning.k3s&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Install a Highly Available (HA) K3s Cluster with embedded etcd, following &lt;a href="https://github.com/PyratLabs/ansible-role-k3s/blob/main/documentation/quickstart-ha-cluster.md" rel="noopener noreferrer"&gt;these steps&lt;/a&gt;. They include:

&lt;ul&gt;
&lt;li&gt;Creating an inventory with your opi5+ devices&lt;/li&gt;
&lt;li&gt;Creating a playbook, using that inventory and &lt;a href="https://github.com/PyratLabs/ansible-role-k3s" rel="noopener noreferrer"&gt;the K3s role&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Running the playbook&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Enjoy!
&lt;/h2&gt;

&lt;p&gt;To wrap it up, building the K3s Cluster on the Orange Pi 5 Plus was a hands-on experience. Now I will use it to develop and test &lt;a href="https://krestomatio.com/" rel="noopener noreferrer"&gt;Moodle™ instances managed by Krestomatio&lt;/a&gt; &lt;a href="https://github.com/krestomatio/" rel="noopener noreferrer"&gt;operators for Kubernetes&lt;/a&gt;. I hope this guide makes it easy for you to do the same. Good luck with your K3s Cluster setup on the Orange Pi 5 Plus, and I hope you too have fun!&lt;/p&gt;

</description>
      <category>orangepi</category>
      <category>armbian</category>
      <category>kubernetes</category>
      <category>krestomatio</category>
    </item>
    <item>
      <title>Building a K3s Cluster with Fedora CoreOS on Orange Pi 5 Plus: Lessons from My Unsuccessful Attempt</title>
      <dc:creator>Job Céspedes Ortiz</dc:creator>
      <pubDate>Mon, 13 Nov 2023 15:43:17 +0000</pubDate>
      <link>https://forem.com/getdevopspro/building-a-k3s-cluster-with-fedora-coreos-on-orange-pi-5-plus-lessons-from-my-unsuccessful-attempt-2hf</link>
      <guid>https://forem.com/getdevopspro/building-a-k3s-cluster-with-fedora-coreos-on-orange-pi-5-plus-lessons-from-my-unsuccessful-attempt-2hf</guid>
      <description>&lt;p&gt;This blog post summarizes my unsuccessful attempt to build a K3s Cluster on the Orange Pi 5 Plus (opi5+) using Fedora CoreOS (FCOS). It also outlines the steps taken before arriving at that conclusion and presents a list of possible alternatives to achieve a similar result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Fedora CoreOS?
&lt;/h2&gt;

&lt;p&gt;The main reasons behind selecting FCOS as the Operating System (OS) were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automatic Updates&lt;/strong&gt;: Fedora CoreOS follows an automated update model, and reboots can also be orchestrated using Zincati.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Immutable OS&lt;/strong&gt;: The operating system is designed to be immutable, meaning that changes are made by replacing the entire OS image rather than modifying the existing system. This helps improve stability and reproducibility.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Container-Optimized&lt;/strong&gt;: It is optimized for running containers and container orchestration platforms like Kubernetes. This makes it well-suited for modern cloud-native applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RPM-OSTree&lt;/strong&gt;: Fedora CoreOS uses RPM-OSTree, which allows for atomic updates and rollbacks, making it easier to maintain system consistency and recover from issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;: Frequent updates and immutability contribute to a more secure system. Security patches are quickly applied to minimize vulnerabilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community, Ecosystem, and Open Source&lt;/strong&gt;: Being part of the Fedora Project and Open Source, Fedora CoreOS benefits from a vibrant community and a rich ecosystem of tools and applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't start from scratch&lt;/strong&gt;: As part of &lt;a href="https://krestomatio.com/" rel="noopener noreferrer"&gt;Krestomatio tools for automating infrastructure&lt;/a&gt;, a &lt;a href="https://registry.terraform.io/modules/krestomatio/butane-snippets/ct/latest/submodules/k3s" rel="noopener noreferrer"&gt;terraform module&lt;/a&gt; was developed to help the deployment of a K3s Cluster using FCOS. The module outputs ignitions (ign) files required, just by setting some variables.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Warning
&lt;/h2&gt;

&lt;p&gt;There are a couple of things you should be aware of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is a laboratory environment.&lt;/li&gt;
&lt;li&gt;Ensure that you use the correct official images and URL for your device model, where aplicable. For instance, the opi5+ images and urls differs from the opi5 ones.&lt;/li&gt;
&lt;li&gt;Some steps involve commands that will erase data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Assumptions
&lt;/h2&gt;

&lt;p&gt;The following assumptions have been made:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Device is Orange Pi 5+ version.&lt;/li&gt;
&lt;li&gt;There is another Fedora-based laptop/PC for preparations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preparations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Items
&lt;/h3&gt;

&lt;p&gt;The items used for this task are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1x SD Card with at least 4GB&lt;/li&gt;
&lt;li&gt;1x USB Drive with at least 4GB&lt;/li&gt;
&lt;li&gt;1x Orange Pi5 Plus 16G + 256G EMMC&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SD Card
&lt;/h3&gt;

&lt;p&gt;For the SD card:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check SD card requirements in &lt;a href="http://www.orangepi.org/" rel="noopener noreferrer"&gt;opi5+ manual&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install OS image, following the &lt;a href="http://www.orangepi.org/" rel="noopener noreferrer"&gt;opi5 official docs for burning it to the SD&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  USB Drive
&lt;/h3&gt;

&lt;p&gt;In the USB drive;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy &lt;a href="https://github.com/edk2-porting/edk2-rk3588/releases" rel="noopener noreferrer"&gt;EDK2 latest release&lt;/a&gt;, naming it &lt;code&gt;edk2-firmware.img&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy FCOS image, generate it with the step below, naming it &lt;code&gt;fcos.img&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  FCOS image
&lt;/h3&gt;

&lt;p&gt;To prepare the FCOS image:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an ignition file and store it in &lt;code&gt;/tmp/config.ign&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create FCOS image
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create FCOS image&lt;/span&gt;
&lt;span class="nv"&gt;STREAM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;next &lt;span class="c"&gt;# CHANGEME: `stable` or `testing` or `next`&lt;/span&gt;
&lt;span class="nv"&gt;FCOS_IMG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fcos.img
&lt;span class="nv"&gt;IGN_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/config.ign &lt;span class="c"&gt;# CHANGEME&lt;/span&gt;
&lt;span class="nv"&gt;CONTAINER_BUILDER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;podman &lt;span class="c"&gt;# CHANGEME: `podman` or `docker`&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;losetup &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FCOS_IMG&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;truncate&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; 3GB &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FCOS_IMG&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;losetup &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FCOS_IMG&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nv"&gt;$CONTAINER_BUILDER&lt;/span&gt; run &lt;span class="nt"&gt;--pull&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;always &lt;span class="nt"&gt;--privileged&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /dev:/dev &lt;span class="nt"&gt;-v&lt;/span&gt; /run/udev:/run/udev &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;$IGN_FILE&lt;/span&gt;:&lt;span class="nv"&gt;$IGN_FILE&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  quay.io/coreos/coreos-installer:release &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--firstboot-args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;console&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tty0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"metal"&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; aarch64 &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nv"&gt;$STREAM&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;$IGN_FILE&lt;/span&gt; /dev/loop0
&lt;span class="nb"&gt;sudo sync
sudo &lt;/span&gt;losetup &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  First Boot
&lt;/h2&gt;

&lt;p&gt;Once preparations are done, continue:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Insert and boot from SD Card&lt;/li&gt;
&lt;li&gt;Insert USB drive and mount it to &lt;code&gt;/mnt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy EDK2 to SPI, following steps below
&lt;/li&gt;
&lt;li&gt;Copy FCOS image to eMMC, following steps below
&lt;/li&gt;
&lt;li&gt;Power off&lt;/li&gt;
&lt;li&gt;Remove SD Card&lt;/li&gt;
&lt;li&gt;Boot from eMMC&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  EDK2 to SPI
&lt;/h3&gt;

&lt;p&gt;To install EDK2 to SPI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Erase SPI&lt;/li&gt;
&lt;li&gt;Copy EDK2 to SPI
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# erase SPI
sudo dd if=/dev/zero of=/dev/mtdblock0
sudo sync
# copy EDK2 to SPI
sudo dd if=edk2-firmware.img of=/dev/mtdblock0
sudo sync
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  FCOS image to eMMC
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Identify eMMC device&lt;/li&gt;
&lt;li&gt;Erase eMMC device&lt;/li&gt;
&lt;li&gt;Copy FCOS image to eMMC
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# identify emmc device. Ex: /dev/mmcblk1
ls /dev/mmcblk*boot0 | cut -c1-12
# erase
sudo dd bs=1M if=/dev/zero of=/dev/mmcblk1 count=1000 status=progress
sudo sync
# copy
sudo dd bs=1M if=fcos.img of=/dev/mmcblk1 count=1000 status=progress
sudo sync
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Remember to power off and remove the SD card. Then test booting from FCOS image in eMMC on the opi5+.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The generic FCOS image does not work out of the box. It throws the error &lt;code&gt;Timed out wating for device&lt;/code&gt; for boot and root devices and then enters emergency mode. Attempts to run using F39 and F40 were made, with the same result though. I suspect that the eMMC is not being recognized. I did not proceed beyond this point. Instead, I began considering alternatives to achieve my goal of building a K3s cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternatives
&lt;/h2&gt;

&lt;p&gt;After this result, there are at least four (4) alternatives I am considering to build a K3s Cluster using opi5+ devices. Those are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use official or third party images + K3s&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://github.com/Joshua-Riek/ubuntu-rockchip#installation" rel="noopener noreferrer"&gt;Ubuntu + Libvirt&lt;/a&gt; + Fedora CoreOS VM + K3s&lt;/li&gt;
&lt;li&gt;Build a custom Fedora CoreOS, with &lt;a href="https://github.com/orangepi-xunlong/linux-orangepi" rel="noopener noreferrer"&gt;Orange Pi linux Kernel&lt;/a&gt; + K3s&lt;/li&gt;
&lt;li&gt;Wait for full &lt;a href="https://gitlab.collabora.com/hardware-enablement/rockchip-3588/notes-for-rockchip-3588/-/blob/main/mainline-status.md" rel="noopener noreferrer"&gt;RK3588 Mainline Kernel support&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>orangepi</category>
      <category>fedora</category>
      <category>kubernetes</category>
      <category>krestomatio</category>
    </item>
    <item>
      <title>Running Virtual Machines on Orange Pi 5 with Libvirt and Ubuntu</title>
      <dc:creator>Job Céspedes Ortiz</dc:creator>
      <pubDate>Thu, 09 Nov 2023 21:49:11 +0000</pubDate>
      <link>https://forem.com/getdevopspro/running-virtual-machines-on-orange-pi-5-with-libvirt-and-ubuntu-3n33</link>
      <guid>https://forem.com/getdevopspro/running-virtual-machines-on-orange-pi-5-with-libvirt-and-ubuntu-3n33</guid>
      <description>&lt;p&gt;In this guide, we'll walk through the steps to install libvirt on the Single Board Computer (SBC) Orange Pi 5 (opi5) for running virtual machines (VMs). I've compiled these steps after dealing with the opi5 instructions, searching on the internet and communities, and my own experience. I hope this guide helps someone accomplish this task more quickly than I did initially.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Orange Pi 5
&lt;/h2&gt;

&lt;p&gt;The first step is to install an Operating System (OS) on the opi5. You have several options here: you can use official images, third-party images, or build your own. In this case, I used a third-party image, &lt;a href="https://github.com/Joshua-Riek/ubuntu-rockchip" rel="noopener noreferrer"&gt;Ubuntu&lt;/a&gt;. Additionally, I used a PCIe NVMe SSD for storage. Here are the installation steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/Joshua-Riek/ubuntu-rockchip#installation" rel="noopener noreferrer"&gt;Install Ubuntu&lt;/a&gt; on the NVMe, following the &lt;a href="http://www.orangepi.org/" rel="noopener noreferrer"&gt;opi5 official docs for burning it to the SSD&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Apply basic configurations, including:

&lt;ul&gt;
&lt;li&gt;Network&lt;/li&gt;
&lt;li&gt;Locale&lt;/li&gt;
&lt;li&gt;Keyboard&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Perform a package update/upgrade.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Installing Libvirt
&lt;/h2&gt;

&lt;p&gt;To install libvirt, you will need to install some other related packages and add a user to the libvirt group. You may also consider applying a workaround for running UEFI VMs. Afterward, you can easily test with a Cirros VM. Follow these steps to accomplish this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## `--no-install-recommends` for avoiding recommended pkgs in a server&lt;/span&gt;
&lt;span class="c"&gt;## alternative or additional pkgs&lt;/span&gt;
&lt;span class="c"&gt;## `qemu-system`  for all qemu architecture or&lt;/span&gt;
&lt;span class="c"&gt;## `qemu-efi-arm` for arm 32bits efi&lt;/span&gt;
&lt;span class="c"&gt;## `u-boot-qemu` if planning to use uboot&lt;/span&gt;
&lt;span class="c"&gt;# install pkgs in ubuntu 22.04&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-install-recommends&lt;/span&gt; libvirt-daemon &lt;span class="se"&gt;\&lt;/span&gt;
  libvirt-daemon-system libvirt-clients qemu-kvm qemu-system-arm &lt;span class="se"&gt;\&lt;/span&gt;
  qemu-utils qemu-efi-aarch64 qemu-efi-arm arm-trusted-firmware &lt;span class="se"&gt;\&lt;/span&gt;
  seabios bridge-utils virtinst dnsmasq-base ipxe-qemu

&lt;span class="c"&gt;# add user to libvirt group&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;adduser &lt;span class="nv"&gt;$USER&lt;/span&gt; libvirt
newgrp libvirt
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LIBVIRT_DEFAULT_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;qemu:///system

&lt;span class="c"&gt;# workaround&lt;/span&gt;
&lt;span class="c"&gt;# set `60-edk2-aarch64.json` as the default uefi configuration&lt;/span&gt;
&lt;span class="c"&gt;# using a symlink to place the descritor file first&lt;/span&gt;
&lt;span class="c"&gt;# https://bugzilla.redhat.com/show_bug.cgi?id=1564270&lt;/span&gt;
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;  /usr/share/qemu/firmware/60-edk2-aarch64.json &lt;span class="se"&gt;\&lt;/span&gt;
  /usr/share/qemu/firmware/00-edk2-aarch64.json

&lt;span class="c"&gt;# test cirros VM&lt;/span&gt;
&lt;span class="c"&gt;## download cirros image&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;wget http://download.cirros-cloud.net/0.5.2/cirros-0.5.2-aarch64-disk.img &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-P&lt;/span&gt; /var/lib/libvirt/images
&lt;span class="c"&gt;## create root qcow2 from image&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;qemu-img create &lt;span class="nt"&gt;-b&lt;/span&gt; /var/lib/libvirt/images/cirros-0.5.2-aarch64-disk.img &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; qcow2 &lt;span class="nt"&gt;-f&lt;/span&gt; qcow2 /var/lib/libvirt/images/test.qcow2
&lt;span class="c"&gt;## autostart default net&lt;/span&gt;
virsh net-autostart &lt;span class="nt"&gt;--network&lt;/span&gt; default
virsh net-start default
&lt;span class="c"&gt;## install test VM in ubuntu host&lt;/span&gt;
virt-install &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--memory&lt;/span&gt; 1024 &lt;span class="nt"&gt;--arch&lt;/span&gt; aarch64 &lt;span class="nt"&gt;--vcpus&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--disk&lt;/span&gt; /var/lib/libvirt/images/test.qcow2,device&lt;span class="o"&gt;=&lt;/span&gt;disk,bus&lt;span class="o"&gt;=&lt;/span&gt;virtio &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--os-variant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;cirros0.5.2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--nographic&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--boot&lt;/span&gt; &lt;span class="nv"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/AAVMF/AAVMF_CODE.fd,loader.readonly&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;yes&lt;/span&gt;,loader.type&lt;span class="o"&gt;=&lt;/span&gt;pflash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  On Debian?
&lt;/h2&gt;

&lt;p&gt;I attempted to install libvirt on a Debian image on the opi5, but I was not successful. I subsequently switched to Ubuntu. Here are the steps that I used to install libvirt on Debian, in case anyone wants to explore that route.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-install-recommends&lt;/span&gt; qemu-system-arm libvirt-clients &lt;span class="se"&gt;\&lt;/span&gt;
  libvirt-daemon-system bridge-utils virtinst libvirt-daemon qemu-utils &lt;span class="se"&gt;\&lt;/span&gt;
  qemu-efi-aarch64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Have Fun
&lt;/h2&gt;

&lt;p&gt;Originally, my goal with a Single Board Computer (SBC) was to unwind and take a break from the usual work routine. I opted for an opi5 in the way. However, lo and behold, here I am, enabling virtualization, almost like it's a rarity in my line of work over at &lt;a href="https://krestomatio.com/" rel="noopener noreferrer"&gt;Krestomatio&lt;/a&gt;! It's been a fun experience, nonetheless.&lt;/p&gt;

</description>
      <category>orangepi</category>
      <category>virtualization</category>
      <category>ubuntu</category>
      <category>krestomatio</category>
    </item>
  </channel>
</rss>
