<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>VMs and Containers on Ivon's Blog</title><link>https://ivonblog.com/en-us/categories/vms-and-containers/</link><description>Recent content in VMs and Containers on Ivon's Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>infoivonblog.nkfjt@aleeas.com (Ivon Huang)</managingEditor><webMaster>infoivonblog.nkfjt@aleeas.com (Ivon Huang)</webMaster><copyright>You are welcome to share articles of Ivon's Blog (ivonblog.com). Please include the original URL when citing articles, and abide by CC BY-NC-ND 4.0 license. For commercial use, please write an e-mail to me.</copyright><lastBuildDate>Thu, 15 Aug 2024 22:00:00 +0800</lastBuildDate><atom:link href="https://ivonblog.com/en-us/categories/vms-and-containers/index.xml" rel="self" type="application/rss+xml"/><item><title>Install ReDroid for playing Android games in Docker containers on Linux PC, with GPU acceleration</title><link>https://ivonblog.com/en-us/posts/redroid-android-docker/</link><pubDate>Thu, 15 Aug 2024 22:00:00 +0800</pubDate><author>infoivonblog.nkfjt@aleeas.com (Ivon Huang)</author><guid>https://ivonblog.com/en-us/posts/redroid-android-docker/</guid><description>&lt;p&gt;&lt;a href="https://ivonblog.com/posts/redroid-android-docker/" target="_blank" rel="noreferrer"&gt;中文版&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ReDroid (Remote anDroid) is an open source and self-hosting &amp;ldquo;cloud phone&amp;rdquo; solution. By running Android in containers on Linux PC, we could access Android desktop by using Scrcpy. And the container could be accessed remotely.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/posts/redroid-android-docker/images/FQXt3GC.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Here is my demonstration of what &amp;ldquo;self-hosting cloud Android phone&amp;rdquo; looks like. In this video, I install Scrcpy client on iPhone and connect to Linux PC using Zerotier to play Android games remotely. (sorry my video is in Chinese)&lt;/p&gt;




&lt;div style="position: relative; padding-bottom: 56.25%; overflow: hidden;"&gt;
 &lt;iframe style="position: absolute; width: 100%; height: 100%;"
 src="http://www.youtube.com/embed/nRe2GL7yf9c" allowfullscreen frameborder="0" loading="lazy"&gt;
 &lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;ReDroid is also one of the few solutions to run Android APP on Linux with &lt;strong&gt;open source software&lt;/strong&gt;. Many Android simulators, not to mention cloud phones, are &lt;strong&gt;closed source&lt;/strong&gt;. In contrast, ReDroid is an open source solution except for the ARM translator. Even better, ReDroid supports GPU acceleration plus ARM translations, so you can play more mobile 3D games!&lt;/p&gt;
&lt;p&gt;ReDroid is much light-weight and easy to deploy than &lt;a href="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/" target="_blank" rel="noreferrer"&gt;Android-x86 VM&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you ask me, there is already a similar, container-based solution, which is known as &lt;a href="https://docs.waydro.id/" target="_blank" rel="noreferrer"&gt;Waydroid&lt;/a&gt; for playing Android games. Why do I choose ReDroid over Waydroid? Well freak Nvidia. Waydroid does not work on Nvidia GPU.&lt;/p&gt;
&lt;p&gt;In this article, I will discuss how to use ReDroid to play mobile games on Linux PC. We will setup a ReDroid container, and add ARM translator + Google Service Framework to the ReDroid image for the best experience.&lt;/p&gt;

&lt;h2 class="relative group"&gt;1. Requirements
 &lt;div id="1-requirements" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#1-requirements" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Any Linux distribution should be fine.&lt;/p&gt;
&lt;p&gt;It is recommended to use a Linux PC with x86 architecture to run Redroid. The ARM architecture support is not very good.&lt;/p&gt;
&lt;p&gt;If you have a x86 PC, it can only run x86 architecture Android APPs. However, many mobile games only have ARM architecture versions, so you needs to install the ARM translator (libndk or libhoudini) in the ReDroid container.&lt;/p&gt;
&lt;p&gt;To play mobile games, it is recommended that the computer has at least 8GB of RAM, because sometimes ARM takes up a lot of RAM when translating it into x86 instructions.&lt;/p&gt;
&lt;p&gt;For GPU acceleration, it is recommended to use Intel or AMD GPUs. 3D acceleration is available out of the box. Nvidia is not recommended.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Regarding the Android version, the &lt;code&gt;redroid:11.0.0-latest&lt;/code&gt; and &lt;code&gt;redroid:12.0.0-latest&lt;/code&gt; image files released by the Redroid developer have built-in ARM translator libndk developed by Google. I have tried only Android 11 which is relatively stable. GApps It can also be used, so in this article I will uses the Android 11 image .&lt;/p&gt;

&lt;h2 class="relative group"&gt;2. Install dependencies
 &lt;div id="2-install-dependencies" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#2-install-dependencies" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;ReDroid&amp;rsquo;s &lt;a href="https://github.com/remote-android/redroid-doc/blob/master/deploy/README.md" target="_blank" rel="noreferrer"&gt;Github&lt;/a&gt; has installation instructions for other Linux distributions. I used the Ubuntu.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First, prepare the binder kernel module. On Ubuntu 24.04 execute the following commands to install the kernel modules:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install linux-modules-extra-&lt;span class="sb"&gt;`&lt;/span&gt;uname -r&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo modprobe binder_linux &lt;span class="nv"&gt;devices&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;binder,hwbinder,vndbinder&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Make the modules load automatically at boot&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOT &amp;gt;&amp;gt; /etc/modules-load.d/redroid.conf
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;binder_linux
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;options binder_linux devices=&amp;#34;binder,hwbinder,vndbinder&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;a href="https://ivonblog.com/posts/install-docker-engine-on-linux/" target="_blank" rel="noreferrer"&gt;Docker&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the &lt;a href="https://developer.android.com/tools/releases/platform-tools?hl=zh-tw" target="_blank" rel="noreferrer"&gt;ADB&lt;/a&gt; tool&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally install &lt;a href="https://github.com/Genymobile/scrcpy/blob/master/doc/linux.md" target="_blank" rel="noreferrer"&gt;Scrcpy&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you want to integrate the graphical Scrcpy interface with key mapping, you can modify &lt;a href="https://ivonblog.com/posts/android-qtscrcpy-usage/" target="_blank" rel="noreferrer"&gt;QtScrcpy&lt;/a&gt;. You can also try the web version of &lt;a href="https://ivonblog.com/posts/ws-scrcpy/" target="_blank" rel="noreferrer"&gt;ws-scrcpy&lt;/a&gt;.&lt;/p&gt;</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ivonblog.com/en-us/posts/redroid-android-docker/featured.webp"/></item><item><title>How to install Linux desktop on WSL2 on Windows 11</title><link>https://ivonblog.com/en-us/posts/run-linux-desktop-on-wsl/</link><pubDate>Sun, 19 Nov 2023 07:00:00 +0800</pubDate><author>infoivonblog.nkfjt@aleeas.com (Ivon Huang)</author><guid>https://ivonblog.com/en-us/posts/run-linux-desktop-on-wsl/</guid><description>&lt;p&gt;&lt;a href="https://ivonblog.com/en-us/posts/run-linux-desktop-on-wsl/" &gt;閱讀中文版文章&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Running a Linux desktop environment and playing audio in Windows WSL.&lt;/p&gt;
&lt;p&gt;WSL supports running graphics programs through WSLg. For example, if you install the firefox package in WSL, type &lt;code&gt;firefox&lt;/code&gt; command, the program will open in Windows, and you can enjoy GPU hardware acceleration.&lt;/p&gt;
&lt;p&gt;Furthermore, you can also use WSL to run GNOME, XFCE, KDE, LXQT, Cinnamon and other desktop environments to experience the feeling of using a Linux computer.&lt;/p&gt;
&lt;p&gt;For example, the picture below shows KDE Plasma desktop is running on WSL Ubuntu. You can seamlessly switch between Windows and Ubuntu, and the performance is better than that of a virtual machine.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/run-linux-desktop-on-wsl/images/202355510.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Video demo




&lt;div style="position: relative; padding-bottom: 56.25%; overflow: hidden;"&gt;
 &lt;iframe style="position: absolute; width: 100%; height: 100%;"
 src="http://www.youtube.com/embed/OMtoG87qVgw" allowfullscreen frameborder="0" loading="lazy"&gt;
 &lt;/iframe&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Please note that there are lots of differences between the desktop functions in WSL and the actual Linux machine, and various weird bugs may occur.&lt;/p&gt;
&lt;p&gt;If you want to experience the complete Ubuntu desktop, I still recommend that you install Ubuntu on a physical machine, such as &lt;a href="https://ivonblog.com/posts/windows11-ubuntu2204-dual-boot" &gt; dual booting Windows 11 and Ubuntu&lt;/a&gt;&lt;/p&gt;

&lt;h2 class="relative group"&gt;1. Environment
 &lt;div id="1-environment" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#1-environment" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11 22H2&lt;/li&gt;
&lt;li&gt;WSL 2.0.9.0&lt;/li&gt;
&lt;li&gt;WSL Ubuntu 22.04&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By default, WSL allocates half of your computer&amp;rsquo;s RAM to Linux. If you want to run a graphics environment, it may be resource intensive. It is recommended to leave at least 4GB of RAM for Linux. You can adjust &lt;a href="https://learn.microsoft.com/zh-tw/windows/wsl/wsl-config" target="_blank" rel="noreferrer"&gt;wslconfig&lt;/a&gt; to allow WSL to allocate more hardware resources.&lt;/p&gt;

&lt;h2 class="relative group"&gt;2. Description
 &lt;div id="2-description" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#2-description" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Please first look at the WSLg architecture diagram provided by Microsoft.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/run-linux-desktop-on-wsl/images/diagram-description-automatically-generated.png"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Why not just use WSLg to display the Linux desktop? Well&amp;hellip; WSLg uses the Wayland display protocol and already has its own window manager. It can only launch &amp;ldquo;single window&amp;rdquo; programs such as Firefox mentioned at the beginning of the article, but cannot launch new desktop environments.&lt;/p&gt;
&lt;p&gt;When you start Firefox, the window will be &amp;ldquo;snatched&amp;rdquo; by WSLg. But I hope that after opening a Linux desktop environment window, all Linux programs will stay in that window.&lt;/p&gt;
&lt;p&gt;So it is better to run a separate X server. All X programs run in the same window.&lt;/p&gt;
&lt;p&gt;There are three choices for X server:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run independent X server programs such as VcXsrv and X410 outside WSL&lt;/li&gt;
&lt;li&gt;Running Xephyr in WSL&lt;/li&gt;
&lt;li&gt;Running XWayland within WSL&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I choose to run Xephyr or XWayland within WSL. This is equivalent to running a nested X server in WSL&amp;rsquo;s Walyand.&lt;/p&gt;
&lt;p&gt;For the audio, since it is very complex to run standalone Pulse Aduio sever on Windows, we will use the built-in audio server of WSLg to play WSL audio.&lt;/p&gt;
&lt;p&gt;Since WSLg uses Wayland, below we will use environment variables to force all Linux programs to use X instead of Wayland display to prevent them from running in WSLg windows.&lt;/p&gt;

&lt;h2 class="relative group"&gt;3. Install desktop environment packages
 &lt;div id="3-install-desktop-environment-packages" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#3-install-desktop-environment-packages" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Log in to WSL Ubuntu and use APT to install the package.&lt;/p&gt;</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ivonblog.com/en-us/posts/run-linux-desktop-on-wsl/featured.webp"/></item><item><title>[Guide] Playing Android games on Linux PC with Android-x86 VM + QtScrcpy</title><link>https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/</link><pubDate>Thu, 20 Oct 2022 20:15:46 +0800</pubDate><author>infoivonblog.nkfjt@aleeas.com (Ivon Huang)</author><guid>https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/</guid><description>&lt;p&gt;&lt;a href="https://ivonblog.com/posts/android-x86-virgl-libhoudini/" target="_blank" rel="noreferrer"&gt;🇹🇼 中文版&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This guide is about installing Android-x86 9.0 QEMU virtual machine on x86_64 Linux host, so you can play Android games with 3D acceleration, keymappings on Linux PC. Google Play is also included.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/XufOmWb.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Tested on &lt;code&gt;Gentoo Linux&lt;/code&gt; (gentoo-kernel-bin 5.19.16) and &lt;code&gt;Arch Linux&lt;/code&gt; (linux-zen-6.0.3) .&lt;/p&gt;

&lt;h2 class="relative group"&gt;1. Prerequisites
 &lt;div id="1-prerequisites" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#1-prerequisites" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A x86_64 Linux PC&lt;/li&gt;
&lt;li&gt;4-cores CPU&lt;/li&gt;
&lt;li&gt;Intel or AMD GPU. Nvidia proprietary driver does not support VirGL (virtual OpenGL renderer).&lt;/li&gt;
&lt;li&gt;8GB+ RAM&lt;/li&gt;
&lt;li&gt;64GB+ storage&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;2. Install required packages
 &lt;div id="2-install-required-packages" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#2-install-required-packages" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Install &lt;code&gt;QEMU&lt;/code&gt;, &lt;code&gt;Libvirt&lt;/code&gt;, &lt;code&gt;Virt Manager&lt;/code&gt; on your Linux host.&lt;/p&gt;
&lt;p&gt;Enable libvirtd services:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now libvirtd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Make sure &lt;code&gt;KVM&lt;/code&gt; modules are loaded:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsmod &lt;span class="p"&gt;|&lt;/span&gt; grep kvm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 class="relative group"&gt;3. Install Android-x86 VM
 &lt;div id="3-install-android-x86-vm" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#3-install-android-x86-vm" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Note: You can try advanced &lt;a href="https://blissos.org/" target="_blank" rel="noreferrer"&gt;Bliss OS&lt;/a&gt; instead of vanilla Android-x86. The installation procedure is similar to each other.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download Android-x86 ISO from &lt;a href="https://www.android-x86.org/download.html" target="_blank" rel="noreferrer"&gt;official website&lt;/a&gt;. Choose Android 9.0-r2 64bit.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/6vdNyKF.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Launch Virt Manager. Clcik &lt;code&gt;Creat a new VM&lt;/code&gt;.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/3bANiMb.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select Manual Install
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/Nm2tDYm.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select Androd-x86 9.0
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/nrsgPV1.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allocate 8GB RAM (minimum 4GB) and 4 cores.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/gkGadub.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a 64GB hard drive
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/oWKpmGA.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check &lt;code&gt;Customize configuration before install&lt;/code&gt;
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/6Vww1y6.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;code&gt;Overview&lt;/code&gt;. Select &lt;code&gt;Q35&lt;/code&gt; for &lt;code&gt;Chipset&lt;/code&gt; and &lt;code&gt;UEFI x64 OVMF_CODE&lt;/code&gt; for &lt;code&gt;Firmware&lt;/code&gt;. Apply.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/XbDRx5P.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;code&gt;IDE Disk&lt;/code&gt;, switch Disk bus to &lt;code&gt;VirtIO&lt;/code&gt;. Apply.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/nzEenIa.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;code&gt;NIC&lt;/code&gt;, switch Device model to &lt;code&gt;virtio&lt;/code&gt;. Apply.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/sA2NSHB.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;code&gt;Display Spice&lt;/code&gt;. Swtich &lt;code&gt;Listen Type&lt;/code&gt; to &lt;code&gt;None&lt;/code&gt;. Check &lt;code&gt;OpenGL&lt;/code&gt; and select Intel GPU. Apply.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/F7T1eaH.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;code&gt;Video QXL&lt;/code&gt;, switch to &lt;code&gt;Virtio&lt;/code&gt;. Check &lt;code&gt;3D acceleration&lt;/code&gt;. Apply.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/i8JuW64.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;code&gt;Add Hardware&lt;/code&gt;, click &lt;code&gt;Storage&lt;/code&gt;, switch &lt;code&gt;Device Type&lt;/code&gt; to &lt;code&gt;CDROM&lt;/code&gt;. Switch &lt;code&gt;Bus Type&lt;/code&gt; to &lt;code&gt;SATA&lt;/code&gt;. Click &lt;code&gt;Manage&lt;/code&gt; and select Android-x86 ISO. Finish.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/Wywnsst.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;code&gt;Boot options&lt;/code&gt;. Change boot order to &lt;code&gt;SATA CDROM&lt;/code&gt;.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/Xerpgzr.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;code&gt;Begin Installation&lt;/code&gt;. Use keyboard arrows to move selection. First move to &lt;code&gt;Installation&lt;/code&gt;, enter.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/tKYzcBs.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Create/Modify partitions&lt;/code&gt;
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/VPDhTkA.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use GPT
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/mQYwWhH.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Move selection to [New], enter.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/5FbGAdU.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter. Next type &lt;code&gt;+512M&lt;/code&gt;
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/Do4wiqm.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Type &lt;code&gt;ef00&lt;/code&gt; then name the parition &lt;code&gt;EFI&lt;/code&gt;
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/zZkeVuA.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next, move selection to the third one. Select [New], enter for 3 times.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/sEAdZMR.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Name the partition &lt;code&gt;Android&lt;/code&gt;.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/Rbufv3L.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Move the selection to [Write], type &lt;code&gt;yes&lt;/code&gt;. Then move to [Quit].
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/jK2SUeg.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;vda2&lt;/code&gt;
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/0hQ3fIA.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Format vda2 to EXT4
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/sgoI1KZ.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install EFI GRUB
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/2VVLsNZ.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Format the EFI partition
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/p3bFLY2.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Yes&lt;/code&gt;. Make /system mounted as Read &amp;amp; Write.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/FYLy4UI.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Boot into Android-x86.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/cHB4byQ.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Conect to &lt;code&gt;VirtWifi&lt;/code&gt;. Setup the Android-x86 device.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/69SxRCd.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Launch &lt;code&gt;Terminal Emualtor&lt;/code&gt; in Android-x86 VM. Type &lt;code&gt;su&lt;/code&gt;, grant root permission:
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/34AeNVu.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Type &lt;code&gt;dmesg | grep virgl&lt;/code&gt; to check if VirGL is loaded.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/Screenshot-TEST-android-x86-9-0-t-2022-10-20-22-47-17.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click bulb icon, remove CDROM from Hardware list.
&lt;figure&gt;
 &lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/images/qCaMNq2.webp"
 onerror="this.onerror=null;this.src='https://ivonblog.com/images/cannotloadimage.avif'"
 &gt;&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 class="relative group"&gt;4. Install libhoudini for Android-x86
 &lt;div id="4-install-libhoudini-for-android-x86" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#4-install-libhoudini-for-android-x86" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s recommened to install x86 APK for stability, Google Play would filter x86 apps for you. However many games only support ARM architecture. In order to run ARM apps on a x86 machine, we need a ARM translator/Native bridge.&lt;/p&gt;</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ivonblog.com/en-us/posts/android-x86-virgl-libhoudini/featured.webp"/></item></channel></rss>