<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Yonle</title>
    <link>https://pen.waltuh.cyou/yonle/</link>
    <description>A self taught programmer &amp; sysadmin from Indonesia that hosts stuff.</description>
    <pubDate>Sun, 04 Oct 2026 03:35:13 +0000</pubDate>
    <item>
      <title>ZTE B860H: Getting Armbian into it</title>
      <link>https://pen.waltuh.cyou/yonle/zte-b860h-getting-armbian-into-it</link>
      <description>&lt;![CDATA[This blog will cover the Armbian installation guide for B860H V1 / V2.&#xA;&#xA;  Caution: This model MUST not be confused with V5, as both revision have an entirely different hardware inside.&#xA;&#xA;B860H V1 STB Top&#xA;B860H V1 STB Bottom&#xA;&#xA;The method that&#39;s used here will not be requiring the set top box to be already rooted, or at most, outside of the stock rom. Assuming that the STB is still in the stock.&#xA;&#xA;At best, It&#39;s recommended to do all of the flashing in Linux desktop, Otherwise the Windows equivalent exists, which i will talk about later.&#xA;&#xA;Requirements&#xA;Installation&#xA;  Flashing the Armbian&#xA;  Flashing the U-Boot&#xA;  Flashing TL;DR&#xA;To the box...&#xA;Installing to eMMC&#xA;Extra: Setting up zram&#xA;Extra: Setting up irqbalance&#xA;Trivia&#xA;Baffled?&#xA;&#xA;This guide also works on FiberHome HG680P box (however, check Trivia).&#xA;&#xA;---&#xA;&#xA;Requirements&#xA;&#xA;A Personal Computer with microSD slot (otherwise, use microSD-USB adapter. These will work)&#xA;A microSD card (Use class 10 microSD card if you&#39;re going to use this as main)&#xA;A specifcally made HDMI Boot Dongle which you can made yourself or by purchasing an already premade one via online store (id: Shopee Indonesia | global: Tindie)&#xA;The actual box itself (B860H) that can still be powered on regardless the boot state (LED is orange, or green, or whatever. does not matter it&#39;s rooted, still in stock, or not).&#xA;Not copy and pasting blindly the attached commands&#xA;&#xA;---&#xA;&#xA;Installation&#xA;&#xA;The B860H must use the HG680P U-Boot bootloader to work, Which you can obtain it from here (save it as u-boot.bin).&#xA;&#xA;The following steps must be done in order.&#xA;&#xA;1. Flashing the Armbian&#xA;&#xA;You can obtain the Armbian image from ophub/amlogic-s9xxx-armbian, With each consisting of different distros. For example, as of the time of this writing:&#xA;resolute is a Ubuntu edition of Armbian OS&#xA;trixie is a Debian edition of Armbian OS.&#xA;&#xA;You will want to look for a release with the two keywords: s905x, and b860h. For example:&#xA;Armbian26.11.0amlogics905x-b860htrixie6.18.51server2026.09.14.img.gz&#xA;&#xA;Once you have downloaded it, Uncompress it:&#xA;gzip -k -d -v Armbian26.11.0amlogics905x-b860htrixie6.18.51server2026.09.14.img.gz&#xA;&#xA;  Note: Adjust the filename with the release that you have downloaded.&#xA;&#xA;Insert a microSD card to be flashed on, check where it was located:&#xA;yonle@yonle:/mnt$ lsblk&#xA;NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS&#xA;mmcblk0     179:0    0  58.6G  0 disk &#xA;├─mmcblk0p1 179:1    0   511M  0 part&#xA;└─mmcblk0p2 179:2    0  58.1G  0 part &#xA;&#xA;In this case, it&#39;s /dev/mmcblk0&#xA;&#xA;  Special: If you&#39;re using an SDcard USB adapter, These usually are named with sd[a...c] prefix (example: sdb). It must not be confused with an existing main SATA drive. &#xA;&#xA;and then flash the Armbian image to the card:&#xA;sudo dd if=Armbian26.11.0amlogics905x-b860htrixie6.18.51server2026.09.14.img of=/dev/mmcblk0 bs=4M status=progress&#xA;&#xA;sync&#xA;&#xA;(yes, sync IS a command)&#xA;&#xA;Adjust /dev/mmcblk0 to the path to your microSD slot, Which you can check via lsblk command.&#xA;&#xA;  Caution: Doing this will wipe ALL the datas that&#39;s in the microSD card. Please back up important stuff if there&#39;s one before proceeding.&#xA;&#xA;---&#xA;&#xA;There is no need to alter the BOOT partition after flashing as these will be done automatically during boot stage.&#xA;&#xA;2. Flashing the U-Boot&#xA;&#xA;On Windows, Doing this step is essentially done by using a program called Amlogic Bootcard Maker.&#xA;&#xA;Similarly, we can do the same on Linux.&#xA;&#xA;Head to the directory where the earlier u-boot.bin is downloaded, for example:&#xA;cd ~/Downloads&#xA;&#xA;Then flash it:&#xA;&#xA;sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=1 count=442&#xA;sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=512 skip=1 seek=1&#xA;&#xA;sync&#xA;&#xA;And finally, Yeet the microSD card out.&#xA;&#xA;Flashing TL;DR&#xA;&#xA;To put it simply, The above tasks is simply:&#xA;sudo dd if=Armbian26.11.0amlogics905x-b860htrixie6.18.51server2026.09.14.img of=/dev/mmcblk0 bs=4M status=progress&#xA;sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=1 count=442&#xA;sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=512 skip=1 seek=1&#xA;&#xA;sync&#xA;&#xA;To the box...&#xA;&#xA;the box, already on Linux&#xA;&#xA;You can determine whenever the box is already hacked or not, And it&#39;s usually determined via the LED indicator:&#xA;If it&#39;s green, Chances are it&#39;s running Android.&#xA;If it&#39;s orange, It&#39;s not using a regular android bootloader or is in emergency download mode&#xA;&#xA;On a box with the factory Android rom inside, You usually cannot just insert the microSD right into the box, and then hopes it will boot immediately to what&#39;s on the microSD card. The stock bootloader will immediately boot to the Android OS anyway and then indirectly alter the BOOT partition, which is probably not what you wanted.&#xA;&#xA;the specialized HDMI dongle&#xA;&#xA;A specialized HDMI dongle is made specifically to make the bootloader on this box to boot whatever that&#39;s in the microSD card, supposedly for emergency / download mode.&#xA;&#xA;---&#xA;&#xA;To check whenever this HDMI dongle is exactly what we wanted, We can use i2cdetect (installable via i2c-tools) to check the HDMI bus:&#xA;&#xA;First, we will want to know which bus is the bus for the HDMI port in my laptop:&#xA;yonle@yonle:~$ sudo i2cdetect -l&#xA;i2c-0&#x9;i2c       &#x9;Synopsys DesignWare I2C adapter &#x9;I2C adapter&#xA;i2c-1&#x9;i2c       &#x9;Synopsys DesignWare I2C adapter &#x9;I2C adapter&#xA;i2c-2&#x9;i2c       &#x9;i915 gmbus dpa                  &#x9;I2C adapter&#xA;i2c-3&#x9;i2c       &#x9;i915 gmbus dpb                  &#x9;I2C adapter&#xA;i2c-4&#x9;i2c       &#x9;i915 gmbus dpc                  &#x9;I2C adapter&#xA;&#xA;On the above example, My bus is at i2c-2, Which is i915 gmbus dpa (notice the dpX prefix). From the 2 at the end of the i2c-2, Add it by +1, Which then: 3.&#xA;&#xA;So now we plug our HDMI dongle to our HDMI port in our laptop:&#xA;&#xA;yonle@yonle:~$ sudo i2cdetect -y -r 3&#xA;     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&#xA;00:                         -- -- -- -- -- -- -- -- &#xA;10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &#xA;20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &#xA;30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &#xA;40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &#xA;50: -- -- 52 -- -- -- -- -- -- -- -- -- -- -- -- -- &#xA;60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &#xA;70: -- -- -- -- -- -- -- --   &#xA;&#xA;If this dongle is what we are looking for, In 0x50, There should have 52 in the third column just like shown above.&#xA;&#xA;Then verify what&#39;s inside:&#xA;yonle@yonle:~$ sudo i2cdump -y -r 0xf8-0xff 3 0x52&#xA;No size specified (using byte-data access)&#xA;     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&#xA;f0:                         62 6f 6f 74 40 53 44 43            boot@SDC&#xA;&#xA;The string value must be boot@SDC.&#xA;&#xA;---&#xA;&#xA;Now that we know that the dongle is exactly what we&#39;re looking for, Let&#39;s begin the installation process:&#xA;&#xA;Now unplug the box from any power source,&#xA;Insert the microSD card that we flashed earlier to the microSD card slot,&#xA;Plug the HDMI dongle to the box&#xA;&#xA;Then plug it to the power source, and pay attention to the power LED indicator, The green indicator must have turned into orange on this phase.&#xA;&#xA;Keep in mind that the indicator MUST STAY on orange LED light for as long as 15 seconds (it mustn&#39;t turn green on this phase, If it did, Then you&#39;re flashing it wrong!).&#xA;&#xA;If after 15 seconds passed the LED is staying orange, You can now unplug the HDMI dongle and plug a HDMI cable from your TV/Monitor/CaptureCard to your box, You must see something resembling TTY:&#xA;&#xA;the screen&#xA;&#xA;From there, Once you get into a phase where Armbian asks you for setup, There&#39;s two method you can do this:&#xA;Keyboard way: Plug your keyboard to the STB, and do set up from here&#xA;Networking: You want to set this box up via ssh: Plug a LAN cable from your router to the box, Check for it&#39;s IP address on the router page, and ssh into it:&#xA;&#xA;ssh root@10.42.x.x&#xA;&#xA;The default password is 1234. You will be asked for setup and a new password setup.&#xA;&#xA;The default ARMBian experience&#xA;&#xA;Once you&#39;re done, Then that&#39;s it. You&#39;re done installing Armbian to your microSD via your box, However you will still need to use that HDMI dongle to force it using U-Boot.&#xA;&#xA;Making U-Boot permanent&#xA;&#xA;Just like earlier, Send the earlier u-boot.bin to the box via network:&#xA;scp u-boot.bin root@10.42.xx.xx:u-boot.bin&#xA;&#xA;Get into the shell, and check which MMC is our eMMC:&#xA;root@armbian:~# lsblk&#xA;NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS&#xA;mmcblk1      179:0    0 58.6G  0 disk &#xA;├─mmcblk1p1  179:1    0  511M  0 part /boot&#xA;└─mmcblk1p2  179:2    0 58.1G  0 part /&#xA;mmcblk2      179:32   0  7.3G  0 disk &#xA;├─mmcblk2p1  179:33   0  511M  0 part &#xA;└─mmcblk2p2  179:34   0  6.1G  0 part &#xA;mmcblk2boot0 179:64   0    4M  1 disk &#xA;mmcblk2boot1 179:96   0    4M  1 disk &#xA;&#xA;In this case, Since we&#39;re booting from SDcard, mmcblk2 is our target, So:&#xA;&#xA;sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442&#xA;sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1&#xA;&#xA;  Caution: This will permanently wipe the android bootloader in the eMMC. If you plan to install Armbian to eMMC, Do armbian-install and reflash U-Boot to the eMMC via steps above again&#xA;&#xA;Installing to eMMC&#xA;&#xA;  Caution: Doing the following will wipe what&#39;s in the eMMC, Which includes the Android base itself.&#xA;&#xA;Assuming you have been in the shell, run armbian-install as root:&#xA;root@armbian:~# armbian-install &#xA;[ STEPS ] Installing Armbian to internal eMMC...&#xA;[ STEPS ] Checking dependencies...&#xA;[ INFO ] Dependency check completed. Proceeding installation...&#xA;[ STEPS ] Initializing the environment...&#xA;[ INFO ] Use mainline u-boot: [ no ]&#xA;[ INFO ] Use ampart tool: [ no ]&#xA;[ INFO ] Show all devices: [ no ]&#xA;[ INFO ] Detected eMMC device: [ /dev/mmcblk2 ]&#xA;[ STEPS ] Start selecting device...&#xA;-----------------------------------------------------------------------------------------------------&#xA;ID    SOC        MODEL                                         DTB                                               &#xA;-----------------------------------------------------------------------------------------------------&#xA;101   s905d      Phicomm-N1                                    meson-gxl-s905d-phicomm-n1.dtb                    &#xA;102   s905d      Phicomm-N1(DMA-thresh)                        meson-gxl-s905d-phicomm-n1-thresh.dtb             &#xA;103   s905d      MECOOL-KI-Pro                                 meson-gxl-s905d-mecool-ki-pro.dtb                 &#xA;104   s905d      SML-5442TW                                    meson-gxl-s905d-sml5442tw.dtb                     &#xA;105   s905x      HG680P                                        meson-gxl-s905x-p212.dtb                          &#xA;106   s905x      B860H                                         meson-gxl-s905x-b860h.dtb                         &#xA;107   s905x      Nexbox-a95x                                   meson-gxl-s905x-nexbox-a95x.dtb                   &#xA;108   s905x      TX9                                           meson-gxl-s905x-tx9.dtb                           &#xA;109   s905x      T95,XiaoMI-3S,X96,BTV9                        meson-gxl-s905x-p212.dtb                          &#xA;110   s905x      TBee                                          meson-gxl-s905x-tbee.dtb                          &#xA;-----------------------------------------------------------------------------------------------------&#xA;111   s905w      TX3-Mini,MeCool-m8s-pro-W                     meson-gxl-s905w-tx3-mini.dtb                      &#xA;112   s905w      W95                                           meson-gxl-s905w-p281.dtb                          &#xA;113   s905w      X96-Mini                                      meson-gxl-s905w-x96-mini.dtb                      &#xA;114   s905w      X96W,FunTV,MXQ-Pro-4K                         meson-gxl-s905w-x96w.dtb                          &#xA;115   s905l      UNT402A,M201-S,MiBox-4C,IP108H,B860AV2.1      meson-gxl-s905l3b-m302a.dtb                       &#xA;116   s905l      MG101,Mibox-4,E900V21C,XiaoMI-4C              meson-gxl-s905l-venz-v10.dtb                      &#xA;117   s905l      Tencent-Aurora-1s                             meson-gxl-s905x-p212.dtb                          &#xA;118   s905l      ZXV10-B860AV2.1U,HM201                        meson-gxl-s905x-tx9.dtb                           &#xA;119   s905l2     MGV2000,MGV3000,M301A,CM201-1,IP108H          meson-gxl-s905l2-x7-5g.dtb                        &#xA;120   s905l2     E900v21E,MGV2000-K,e900v21d                   meson-gxl-s905l2-x7-5g.dtb                        &#xA;-----------------------------------------------------------------------------------------------------&#xA;121   s905l2     Wojia-TV-IPBS9505                             meson-gxl-s905l2-ipbs9505.dtb                     &#xA;122   s905l3     CM311-1,HG680-LC,M401A,UNT402A,CM201-1-6-YS   meson-gxl-s905l2-x7-5g.dtb                        &#xA;123   s905l3     CM211-1,M411A,B860AV3.2M,B860AV2.1U,M301A     meson-gxl-s905l3b-m302a.dtb                       &#xA;124   s905l3     UNT400G1,E900V22D-2,UNT400G,IP108H            meson-gxl-s905l2-x7-5g.dtb                        &#xA;125   s905l3     UNT402A,UNT400G                               meson-gxl-s905l3b-m302a.dtb                       &#xA;126   s905l3b    E900V21E,E900V22E,MGV2000/CW,M411A            meson-gxl-s905l3b-e900v22e.dtb                    &#xA;127   s905l3b    M302A,M304A,CM201-1,CM211-1,CM311-1           meson-gxl-s905l3b-m302a.dtb                       &#xA;128   s905l3b    UNT403A                                       meson-gxl-s905l3b-m302a.dtb                       &#xA;129   s905l3b    RG020ET-CA                                    meson-gxl-s905l3b-e900v22e.dtb                    &#xA;130   s905l3b    IP103H,TY1608,BV310,B860AV-2.1M               meson-gxl-s905l3b-m302a.dtb                       &#xA;-----------------------------------------------------------------------------------------------------&#xA;131   s905l3b    E900V22D,TY1608                               meson-gxl-s905l2-x7-5g.dtb                        &#xA;132   s905l3b    E900V21D,B860AV2.1-A                          meson-gxl-s905l2-x7-5g.dtb                        &#xA;133   s905mb     S65                                           meson-gxl-s905x-p212.dtb                          &#xA;134   s905lb     BesTV-R3300L,SumaVision-Q7,MG101              meson-gxl-s905x-p212.dtb                          &#xA;135   s905lb     Q96-mini                                      meson-gxl-s905x-p212.dtb                          &#xA;136   s905lb     IPBS9505                                      meson-gxl-s905l2-x7-5g.dtb                        &#xA;0     Other      Customize                                     Enter-custom-dtb-name                             &#xA;-----------------------------------------------------------------------------------------------------&#xA;[ OPTIONS ] Please Input ID: 106&#xA;&#xA;Pick 106, or B860H.&#xA;&#xA;Pressing enter will tell you to pick filesystem type:&#xA;&#xA;[ INFO ] Input Box ID: [ 106 ]&#xA;[ INFO ] Model Name: [ B860H ]&#xA;[ INFO ] FDTFILE: [ meson-gxl-s905x-b860h.dtb ]&#xA;[ INFO ] MAINLINEUBOOT: [  ]&#xA;[ INFO ] BOOTLOADERIMG:  [  ]&#xA;[ INFO ] UBOOTOVERLOAD: [ u-boot-p212.bin ]&#xA;[ INFO ] NEEDOVERLOAD: [ no ]&#xA;[ STEPS ] Selecting root filesystem type...&#xA;-----------------------------------------------&#xA;  ID   TYPE&#xA;-----------------------------------------------&#xA;  1    ext4&#xA;  2    btrfs&#xA;-----------------------------------------------&#xA;[ OPTIONS ] Please Input ID (1/2): &#xA;&#xA;Depending on your workload, you can use either ext4 or btrfs for your eMMC. But if you&#39;re unsure, I&#39;d recommend ext4.&#xA;&#xA;It has received plenty of improvements over the years, so it&#39;s not the same ext4 people might remember from years ago. It&#39;s still a very solid choice for eMMC.&#xA;&#xA;From there, It will install the system to the eMMC from SDcard, which will take several minutes until it&#39;s finished.&#xA;&#xA;After it&#39;s finished, Reflash U-Boot to the eMMC like how we flash it to microSD:&#xA;sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442&#xA;sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1&#xA;&#xA;sync&#xA;&#xA;So:&#xA;[ INFO ] Copying ROOTFS partition data...&#xA;[ INFO ] Copying [ etc ] ...&#xA;[ INFO ] Copying [ home ] ...&#xA;[ INFO ] Copying [ opt ] ...&#xA;[ INFO ] Copying [ root ] ...&#xA;[ INFO ] Copying [ selinux ] ...&#xA;[ INFO ] Copying [ srv ] ...&#xA;[ INFO ] Copying [ usr ] ...&#xA;[ INFO ] Copying [ var ] ...&#xA;[ INFO ] Generate the new fstab file.&#xA;[ INFO ] Update parameters related to the releases file.&#xA;[ SUCCESS ] Installation completed successfully. Run [ poweroff ], remove the installation media, then re-insert the power supply to boot the new system.&#xA;root@armbian:~# sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442&#xA;442+0 records in&#xA;442+0 records out&#xA;442 bytes copied, 0.00554292 s, 79.7 kB/s&#xA;root@armbian:~# sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1&#xA;4095+0 records in&#xA;4095+0 records out&#xA;2096640 bytes (2.1 MB, 2.0 MiB) copied, 0.1678 s, 12.5 MB/s&#xA;root@armbian:~# &#xA;&#xA;After these are all done, Run poweroff. Once it&#39;s off (the LED light will turn to green, Don&#39;t worry), Unplug from power source, now you can also unplug the microSD card.&#xA;&#xA;And now let it boot into it&#39;s own glory by plugging the power source back, And lo and behold, Look. It runs without the microSD card!:&#xA;&#xA;The Linux boot sequence&#xA;&#xA;Extra: Setting up zram&#xA;&#xA;This can save us some room in our RAM.&#xA;&#xA;sudo apt update &amp;&amp; sudo apt install systemd-zram-generator&#xA;sudo nano /etc/systemd/zram-generator.conf &#xA;&#xA;Put:&#xA;[zram0]&#xA;zram-size = ram&#xA;compression-algorithm = lzo-rle zstd(level=3) (type=idle)&#xA;&#xA;Save it (CTRL+S), Exit (CTRL+X), and load it:&#xA;sudo systemctl daemon-reload&#xA;sudo systemctl start systemd-zram-setup@zram0.service&#xA;&#xA;Extra: Setting up irqbalance&#xA;&#xA;yonle@armbian:~$ cat /proc/interrupts&#xA;           CPU0       CPU1       CPU2       CPU3       &#xA;  9:          0          0          0          0    GICv2  25 Level     vgic&#xA; 11:   26055984   26123490   25924591   25663238    GICv2  30 Level     archtimer&#xA; 12:          0          0          0          0    GICv2  27 Level     kvm guest vtimer&#xA; 14:          0          0          0          0    GICv2  58 Edge      ttyAML6&#xA; 15:        109          0          0          0    GICv2 225 Edge      ttyAML0&#xA; 16:          0          0          0          0    GICv2 231 Edge      c8100100.cec&#xA; 17:          0          0          0          0    GICv2 249 Level     d0072000.mmc&#xA; 18:          0          0          0          0    GICv2 220 Edge      gxl-crypto&#xA; 19:          0          0          0          0    GICv2 221 Edge      gxl-crypto&#xA; 20:         89          0          0          0    GICv2 248 Level     d0070000.mmc&#xA; 21:     124767          0          0          0    GICv2 250 Level     d0074000.mmc&#xA; 23:      86139          0          0          0    GICv2 241 Edge      platformmhulink&#xA; 24:     903241          0          0          0    GICv2 242 Edge      platformmhulink&#xA; 25:          2          0          0          0    GICv2 105 Edge      c1108680.adc&#xA; 26:          0          0          0          0    GICv2 169 Level     arm-pmu&#xA; 27:          0          0          0          0    GICv2 170 Level     arm-pmu&#xA; 28:          0          0          0          0    GICv2 185 Level     arm-pmu&#xA; 29:          0          0          0          0    GICv2 186 Level     arm-pmu&#xA; 30:       1301          0          0          0    GICv2  35 Edge      meson&#xA; 31:       2056          0          0          0    GICv2  89 Edge      dwhdmitopirq, c883a000.hdmi-tx&#xA; 32:         21          0          0    3029612    GICv2  40 Level     eth0&#xA; 33:          0          0          0          0    GICv2  63 Level     c9100000.usb, c9100000.usb&#xA; 34:       2503          0   11186225          0    GICv2  62 Level     xhci-hcd:usb1&#xA; 35:         26          0          0          0    GICv2  41 Level     mdiomux-0.1:08&#xA; 38:         16          0          0          0    GICv2 228 Edge      mesonir&#xA; 39:          0          0          0          0    GICv2  76 Edge      vdec-mbox1&#xA; 40:          0          0          0          0    GICv2  64 Edge      esparserirq&#xA; 42:          0          0          0          0    GICv2 193 Level     gpmmu&#xA; 43:          0          0          0          0    GICv2 197 Level     ppmmu0&#xA; 44:          0          0          0          0    GICv2 199 Level     ppmmu1&#xA; 45:          0          0          0          0    GICv2 201 Level     ppmmu2&#xA; 46:          0          0          0          0    GICv2 192 Level     gp&#xA; 47:          0          0          0          0    GICv2 196 Level     pp0&#xA; 48:          0          0          0          0    GICv2 198 Level     pp1&#xA; 49:          0          0          0          0    GICv2 200 Level     pp2&#xA; 50:          0          0          0          0    GICv2 194 Level     ppbcast&#xA;IPI0:     43769      44509      51827      43352       Rescheduling interrupts&#xA;IPI1:   1981654    2376448     760236    3324099       Function call interrupts&#xA;IPI2:         0          0          0          0       CPU stop interrupts&#xA;IPI3:         0          0          0          0       CPU stop NMIs&#xA;IPI4:         0          0          0          0       Timer broadcast interrupts&#xA;IPI5:     58603     293691      50386      56088       IRQ work interrupts&#xA;IPI6:         0          0          0          0       CPU backtrace interrupts&#xA;IPI7:         0          0          0          0       KGDB roundup interrupts&#xA;Err:          0&#xA;&#xA;At some point, During it&#39;s workflows, One of the CPU core could be overworking than the rest of the other, Especially when it&#39;s doing certain workflows that involves what&#39;s on the hardware &amp; software itself (eg. wifi, lan, NFS, USB, etc).&#xA;&#xA;And you probably want something like irqbalance to be set up and running on your box:&#xA;sudo apt install irqbalance&#xA;sudo systemctl enable --now irqbalance&#xA;&#xA;---&#xA;&#xA;Trivia&#xA;&#xA;Given how similar the hardware that&#39;s in B860H V1 and HG680P, Especially the SOC (you can flash the same u-boot.bin and it will still boots!), You can probably follow this guide alongside the same HDMI dongle trickery on HG680P too&#xA;&#xA;especially when it&#39;s bootloader is broken (which i saw most HG680P had on), you can force Amlogic to boot the bootloader in microSDcard via the HDMI dongle like what i did here.&#xA;&#xA;They will still boot and will work, But the device tree for the hardware will be partially different and might conflict to each other, So during armbian-install, You must instead chose this:&#xA;105   s905x      HG680P                                        meson-gxl-s905x-p212.dtb                          &#xA;&#xA;Alternatively, if you don&#39;t have the HDMI dongle, you can bypass the eMMC boot on the HG680P and make the device boot from the SD card by shorting R162, 4C6, and GND on the motherboard simultaneously. The USB port can be used as the ground point. A pair of tweezers or a similar conductive tool can be used to make the connection (found by Jimed-rand).&#xA;&#xA;A similar method can be used on the B860H V1/V2 by shorting R87 to enter boot/recovery mode.&#xA;&#xA;Baffled?&#xA;&#xA;There&#39;s a YouTube Video that i made specifically for this. The video won&#39;t reexplain what has been mentioned on this page, So feel free to watch how it was done in raw.]]&gt;</description>
      <content:encoded><![CDATA[<p>This blog will cover the Armbian installation guide for B860H V1 / V2.</p>

<blockquote><p><strong>Caution</strong>: This model <strong>MUST not be confused</strong> with V5, as both revision have an entirely different hardware inside.</p></blockquote>

<p><img src="https://fedimedia.waltuh.cyou/media/bdf8086f0030eefb2e86241d9bfd9e1e9ce25e42edf31d691dec67600fe4f708.png" alt="B860H V1 STB Top">
<img src="https://fedimedia.waltuh.cyou/media/ca9fbbb48488e1a058f54a51067250d153fd09e6c4ac002f97b7d19bf9ee5dbf.png" alt="B860H V1 STB Bottom"></p>

<p>The method that&#39;s used here will not be requiring the set top box to be already rooted, or at most, outside of the stock rom. Assuming that the STB is still in the stock.</p>

<p>At best, It&#39;s recommended to do all of the flashing in Linux desktop, Otherwise the Windows equivalent exists, which i will talk about later.</p>
<ul><li><a href="#requirements" rel="nofollow">Requirements</a></li>
<li><a href="#installation" rel="nofollow">Installation</a>
<ul><li><a href="#1-flashing-the-armbian" rel="nofollow">Flashing the Armbian</a></li>
<li><a href="#2-flashing-the-u-boot" rel="nofollow">Flashing the U-Boot</a></li>
<li><a href="#flashing-tldr" rel="nofollow">Flashing TL;DR</a></li></ul></li>
<li><a href="#to-the-box" rel="nofollow">To the box...</a></li>
<li><a href="#installing-to-emmc" rel="nofollow">Installing to eMMC</a></li>
<li><a href="#extra-setting-up-zram" rel="nofollow">Extra: Setting up zram</a></li>
<li><a href="#extra-setting-up-irqbalance" rel="nofollow">Extra: Setting up <code>irqbalance</code></a></li>
<li><a href="#trivia" rel="nofollow">Trivia</a></li>
<li><a href="#baffled" rel="nofollow">Baffled?</a></li></ul>

<p>This guide also works on <strong>FiberHome HG680P</strong> box (however, check <a href="#trivia" rel="nofollow">Trivia</a>).</p>

<hr>

<h2 id="requirements">Requirements</h2>
<ul><li>A Personal Computer with microSD slot (otherwise, use microSD&lt;–&gt;USB adapter. These will work)</li>
<li>A microSD card (Use class 10 microSD card if you&#39;re going to use this as main)</li>
<li>A <a href="https://github.com/superna9999/linux/wiki/Amlogic-HDMI-Boot-Dongle" rel="nofollow">specifcally made HDMI Boot Dongle</a> which you can made yourself or by purchasing an already premade one via online store (id: <a href="https://shopee.co.id/search?keyword=hdmi%20fw%20bejat" rel="nofollow">Shopee Indonesia</a> | global: <a href="https://www.tindie.com/products/superna9999/meson-hdmi-recovery-boot-plug/" rel="nofollow">Tindie</a>)</li>
<li>The actual box itself (B860H) that can still be powered on regardless the boot state (LED is orange, or green, or whatever. does not matter it&#39;s rooted, still in stock, or not).</li>
<li><strong>Not copy and pasting blindly the attached commands</strong></li></ul>

<hr>

<h2 id="installation">Installation</h2>

<p>The B860H must use the HG680P U-Boot bootloader to work, Which you can obtain it from <a href="https://fedimedia.waltuh.cyou/media/7cfeb72fc6cc1b63af0c415de9e9117e88fb0e30c53c347b9cf6e008e62ac339.bin" rel="nofollow">here</a> (save it as <code>u-boot.bin</code>).</p>

<p>The following steps must be done in order.</p>

<h3 id="1-flashing-the-armbian">1. Flashing the Armbian</h3>

<p>You can obtain the Armbian image from <a href="https://github.com/ophub/amlogic-s9xxx-armbian/releases" rel="nofollow">ophub/amlogic-s9xxx-armbian</a>, With each consisting of different distros. For example, as of the time of this writing:
– <code>resolute</code> is a Ubuntu edition of Armbian OS
– <code>trixie</code> is a Debian edition of Armbian OS.</p>

<p>You will want to look for a release with the two keywords: <code>s905x</code>, and <code>b860h</code>. For example:</p>

<pre><code>Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img.gz
</code></pre>

<p>Once you have downloaded it, Uncompress it:</p>

<pre><code>gzip -k -d -v Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img.gz
</code></pre>

<blockquote><p><strong>Note</strong>: Adjust the filename with the release that you have downloaded.</p></blockquote>

<p>Insert a microSD card to be flashed on, check where it was located:</p>

<pre><code>yonle@yonle:/mnt$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk0     179:0    0  58.6G  0 disk 
├─mmcblk0p1 179:1    0   511M  0 part
└─mmcblk0p2 179:2    0  58.1G  0 part 
</code></pre>

<p>In this case, it&#39;s <code>/dev/mmcblk0</code></p>

<blockquote><p><strong>Special:</strong> If you&#39;re using an SDcard USB adapter, These usually are named with <code>sd[a...c]</code> prefix (example: <code>sdb</code>). It <strong>must not be confused with an existing main SATA drive</strong>.</p></blockquote>

<p>and then flash the Armbian image to the card:</p>

<pre><code>sudo dd if=Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img of=/dev/mmcblk0 bs=4M status=progress

sync
</code></pre>

<p>(yes, <code>sync</code> <strong>IS a command</strong>)</p>

<p>Adjust <code>/dev/mmcblk0</code> to the path to your microSD slot, Which you can check via <code>lsblk</code> command.</p>

<blockquote><p><strong>Caution:</strong> Doing this will wipe ALL the datas that&#39;s in the microSD card. Please back up important stuff if there&#39;s one before proceeding.</p></blockquote>

<hr>

<p>There is no need to alter the BOOT partition after flashing as these will be done automatically during boot stage.</p>

<h3 id="2-flashing-the-u-boot">2. Flashing the U-Boot</h3>

<p>On Windows, Doing this step is essentially done by using a program called <strong><a href="https://wiki.coreelec.org/coreelec:aml_burncard" rel="nofollow">Amlogic Bootcard Maker</a></strong>.</p>

<p>Similarly, we can do the same on Linux.</p>

<p>Head to the directory where the earlier <code>u-boot.bin</code> is downloaded, for example:</p>

<pre><code>cd ~/Downloads
</code></pre>

<p>Then flash it:</p>

<pre><code>sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=512 skip=1 seek=1

sync
</code></pre>

<p>And finally, <strong>Yeet the microSD card out</strong>.</p>

<h3 id="flashing-tl-dr">Flashing TL;DR</h3>

<p>To put it simply, The above tasks is simply:</p>

<pre><code>sudo dd if=Armbian_26.11.0_amlogic_s905x-b860h_trixie_6.18.51_server_2026.09.14.img of=/dev/mmcblk0 bs=4M status=progress
sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk0 conv=fsync,notrunc bs=512 skip=1 seek=1

sync
</code></pre>

<h2 id="to-the-box">To the box...</h2>

<p><img src="https://fedimedia.waltuh.cyou/media/545e2e970beb6593993ec6a5ac8556bb675119704031c7674bb6670c5441fa9d.jpg" alt="the box, already on Linux"></p>

<p>You can determine whenever the box is already hacked or not, And it&#39;s usually determined via the LED indicator:
– If it&#39;s green, Chances are it&#39;s running Android.
– If it&#39;s orange, It&#39;s not using a regular android bootloader or is in emergency download mode</p>

<p>On a box with the factory Android rom inside, You usually <strong>cannot</strong> just insert the microSD right into the box, and then hopes it will boot immediately to what&#39;s on the microSD card. The stock bootloader will immediately boot to the Android OS anyway and then <strong>indirectly alter the BOOT partition</strong>, which is probably not what you wanted.</p>

<p><img src="https://fedimedia.waltuh.cyou/media/82f9ab3d32064e2692692734935ec6956f5d1edd4248367a0c4d6041d472e7cc.jpg" alt="the specialized HDMI dongle"></p>

<p>A specialized HDMI dongle is made specifically to make the bootloader on this box to boot whatever that&#39;s in the microSD card, supposedly for <strong>emergency / download mode</strong>.</p>

<hr>

<p>To check whenever this HDMI dongle is exactly what we wanted, We can use <code>i2cdetect</code> (installable via <code>i2c-tools</code>) to check the HDMI bus:</p>

<p>First, we will want to know which bus is the bus for the HDMI port in my laptop:</p>

<pre><code>yonle@yonle:~$ sudo i2cdetect -l
i2c-0	i2c       	Synopsys DesignWare I2C adapter 	I2C adapter
i2c-1	i2c       	Synopsys DesignWare I2C adapter 	I2C adapter
i2c-2	i2c       	i915 gmbus dpa                  	I2C adapter
i2c-3	i2c       	i915 gmbus dpb                  	I2C adapter
i2c-4	i2c       	i915 gmbus dpc                  	I2C adapter
</code></pre>

<p>On the above example, My bus is at <code>i2c-2</code>, Which is <code>i915 gmbus dpa</code> (notice the <code>dpX</code> prefix). From the <code>2</code> at the end of the <code>i2c-2</code>, Add it by <code>+1</code>, Which then: <code>3</code>.</p>

<p>So now we plug our HDMI dongle <strong>to our HDMI port in our laptop</strong>:</p>

<pre><code>yonle@yonle:~$ sudo i2cdetect -y -r 3
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- 52 -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --   
</code></pre>

<p>If this dongle is what we are looking for, In 0x50, There should have <code>52</code> in the third column just like shown above.</p>

<p>Then verify what&#39;s inside:</p>

<pre><code>yonle@yonle:~$ sudo i2cdump -y -r 0xf8-0xff 3 0x52
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
f0:                         62 6f 6f 74 40 53 44 43            boot@SDC
</code></pre>

<p>The string value must be <code>boot@SDC</code>.</p>

<hr>

<p>Now that we know that the dongle is exactly what we&#39;re looking for, Let&#39;s begin the installation process:</p>

<p>Now unplug the box from any power source,
– Insert the microSD card that we flashed earlier to the microSD card slot,
– Plug the HDMI dongle to the box</p>

<p>Then plug it to the power source, and <strong>pay attention to the power LED indicator</strong>, The green indicator must have turned into orange on this phase.</p>

<p>Keep in mind that the indicator <strong>MUST STAY on orange LED light</strong> for as long as <strong>15 seconds</strong> (it mustn&#39;t turn green on this phase, If it did, Then <strong>you&#39;re flashing it wrong!</strong>).</p>

<p>If after 15 seconds passed the LED is staying orange, You can now unplug the HDMI dongle and plug a HDMI cable from your TV/Monitor/CaptureCard to your box, You must see something resembling TTY:</p>

<p><img src="https://fedimedia.waltuh.cyou/media/472cbb7af8927860fa65a3c67f22afb440692f74d67bceea900a0b40ddac07dc.png" alt="the screen"></p>

<p>From there, Once you get into a phase where Armbian asks you for setup, There&#39;s two method you can do this:
1. Keyboard way: Plug your keyboard to the STB, and do set up from here
2. Networking: You want to set this box up via <code>ssh</code>: Plug a LAN cable from your router to the box, Check for it&#39;s IP address on the router page, and ssh into it:</p>

<pre><code>ssh root@10.42.x.x
</code></pre>

<p>The default password is <code>1234</code>. You will be asked for setup and a new password setup.</p>

<p><img src="https://fedimedia.waltuh.cyou/media/cbc2ea12755014669b6f06ab221e682c4c67a9221a0063679981efa82ae8b6ca.png" alt="The default ARMBian experience"></p>

<p>Once you&#39;re done, Then that&#39;s it. You&#39;re done installing Armbian to your microSD via your box, However <strong>you will still need to use that HDMI dongle to force it using U-Boot</strong>.</p>

<h2 id="making-u-boot-permanent">Making U-Boot permanent</h2>

<p>Just like earlier, Send the earlier <code>u-boot.bin</code> to the box via network:</p>

<pre><code>scp u-boot.bin root@10.42.xx.xx:u-boot.bin
</code></pre>

<p>Get into the shell, and check which MMC is our eMMC:</p>

<pre><code>root@armbian:~# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
mmcblk1      179:0    0 58.6G  0 disk 
├─mmcblk1p1  179:1    0  511M  0 part /boot
└─mmcblk1p2  179:2    0 58.1G  0 part /
mmcblk2      179:32   0  7.3G  0 disk 
├─mmcblk2p1  179:33   0  511M  0 part 
└─mmcblk2p2  179:34   0  6.1G  0 part 
mmcblk2boot0 179:64   0    4M  1 disk 
mmcblk2boot1 179:96   0    4M  1 disk 
</code></pre>

<p>In this case, Since we&#39;re booting from SDcard, <code>mmcblk2</code> is our target, So:</p>

<pre><code>sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1
</code></pre>

<blockquote><p><strong>Caution:</strong> This will permanently wipe the android bootloader in the eMMC. If you plan to install Armbian to eMMC, Do <code>armbian-install</code> and reflash U-Boot to the eMMC via steps above again</p></blockquote>

<h2 id="installing-to-emmc">Installing to eMMC</h2>

<blockquote><p><strong>Caution</strong>: Doing the following will <strong>wipe what&#39;s in the eMMC</strong>, Which includes the Android base itself.</p></blockquote>

<p>Assuming you have been in the shell, run <code>armbian-install</code> as root:</p>

<pre><code>root@armbian:~# armbian-install 
[ STEPS ] Installing Armbian to internal eMMC...
[ STEPS ] Checking dependencies...
[ INFO ] Dependency check completed. Proceeding installation...
[ STEPS ] Initializing the environment...
[ INFO ] Use mainline u-boot: [ no ]
[ INFO ] Use ampart tool: [ no ]
[ INFO ] Show all devices: [ no ]
[ INFO ] Detected eMMC device: [ /dev/mmcblk2 ]
[ STEPS ] Start selecting device...
-----------------------------------------------------------------------------------------------------
ID    SOC        MODEL                                         DTB                                               
-----------------------------------------------------------------------------------------------------
101   s905d      Phicomm-N1                                    meson-gxl-s905d-phicomm-n1.dtb                    
102   s905d      Phicomm-N1(DMA-thresh)                        meson-gxl-s905d-phicomm-n1-thresh.dtb             
103   s905d      MECOOL-KI-Pro                                 meson-gxl-s905d-mecool-ki-pro.dtb                 
104   s905d      SML-5442TW                                    meson-gxl-s905d-sml5442tw.dtb                     
105   s905x      HG680P                                        meson-gxl-s905x-p212.dtb                          
106   s905x      B860H                                         meson-gxl-s905x-b860h.dtb                         
107   s905x      Nexbox-a95x                                   meson-gxl-s905x-nexbox-a95x.dtb                   
108   s905x      TX9                                           meson-gxl-s905x-tx9.dtb                           
109   s905x      T95,XiaoMI-3S,X96,BTV9                        meson-gxl-s905x-p212.dtb                          
110   s905x      TBee                                          meson-gxl-s905x-tbee.dtb                          
-----------------------------------------------------------------------------------------------------
111   s905w      TX3-Mini,MeCool-m8s-pro-W                     meson-gxl-s905w-tx3-mini.dtb                      
112   s905w      W95                                           meson-gxl-s905w-p281.dtb                          
113   s905w      X96-Mini                                      meson-gxl-s905w-x96-mini.dtb                      
114   s905w      X96W,FunTV,MXQ-Pro-4K                         meson-gxl-s905w-x96w.dtb                          
115   s905l      UNT402A,M201-S,MiBox-4C,IP108H,B860AV2.1      meson-gxl-s905l3b-m302a.dtb                       
116   s905l      MG101,Mibox-4,E900V21C,XiaoMI-4C              meson-gxl-s905l-venz-v10.dtb                      
117   s905l      Tencent-Aurora-1s                             meson-gxl-s905x-p212.dtb                          
118   s905l      ZXV10-B860AV2.1U,HM201                        meson-gxl-s905x-tx9.dtb                           
119   s905l2     MGV2000,MGV3000,M301A,CM201-1,IP108H          meson-gxl-s905l2-x7-5g.dtb                        
120   s905l2     E900v21E,MGV2000-K,e900v21d                   meson-gxl-s905l2-x7-5g.dtb                        
-----------------------------------------------------------------------------------------------------
121   s905l2     Wojia-TV-IPBS9505                             meson-gxl-s905l2-ipbs9505.dtb                     
122   s905l3     CM311-1,HG680-LC,M401A,UNT402A,CM201-1-6-YS   meson-gxl-s905l2-x7-5g.dtb                        
123   s905l3     CM211-1,M411A,B860AV3.2M,B860AV2.1U,M301A     meson-gxl-s905l3b-m302a.dtb                       
124   s905l3     UNT400G1,E900V22D-2,UNT400G,IP108H            meson-gxl-s905l2-x7-5g.dtb                        
125   s905l3     UNT402A,UNT400G                               meson-gxl-s905l3b-m302a.dtb                       
126   s905l3b    E900V21E,E900V22E,MGV2000/CW,M411A            meson-gxl-s905l3b-e900v22e.dtb                    
127   s905l3b    M302A,M304A,CM201-1,CM211-1,CM311-1           meson-gxl-s905l3b-m302a.dtb                       
128   s905l3b    UNT403A                                       meson-gxl-s905l3b-m302a.dtb                       
129   s905l3b    RG020ET-CA                                    meson-gxl-s905l3b-e900v22e.dtb                    
130   s905l3b    IP103H,TY1608,BV310,B860AV-2.1M               meson-gxl-s905l3b-m302a.dtb                       
-----------------------------------------------------------------------------------------------------
131   s905l3b    E900V22D,TY1608                               meson-gxl-s905l2-x7-5g.dtb                        
132   s905l3b    E900V21D,B860AV2.1-A                          meson-gxl-s905l2-x7-5g.dtb                        
133   s905mb     S65                                           meson-gxl-s905x-p212.dtb                          
134   s905lb     BesTV-R3300L,SumaVision-Q7,MG101              meson-gxl-s905x-p212.dtb                          
135   s905lb     Q96-mini                                      meson-gxl-s905x-p212.dtb                          
136   s905lb     IPBS9505                                      meson-gxl-s905l2-x7-5g.dtb                        
0     Other      Customize                                     Enter-custom-dtb-name                             
-----------------------------------------------------------------------------------------------------
[ OPTIONS ] Please Input ID: 106
</code></pre>

<p>Pick <code>106</code>, or B860H.</p>

<p>Pressing enter will tell you to pick filesystem type:</p>

<pre><code>[ INFO ] Input Box ID: [ 106 ]
[ INFO ] Model Name: [ B860H ]
[ INFO ] FDTFILE: [ meson-gxl-s905x-b860h.dtb ]
[ INFO ] MAINLINE_UBOOT: [  ]
[ INFO ] BOOTLOADER_IMG:  [  ]
[ INFO ] UBOOT_OVERLOAD: [ u-boot-p212.bin ]
[ INFO ] NEED_OVERLOAD: [ no ]
[ STEPS ] Selecting root filesystem type...
-----------------------------------------------
  ID   TYPE
-----------------------------------------------
  1    ext4
  2    btrfs
-----------------------------------------------
[ OPTIONS ] Please Input ID (1/2): 
</code></pre>

<p>Depending on your workload, you can use either <code>ext4</code> or <code>btrfs</code> for your eMMC. But if you&#39;re unsure, I&#39;d recommend <code>ext4</code>.</p>

<p>It has received plenty of improvements over the years, so it&#39;s not the same ext4 people might remember from years ago. It&#39;s still a very solid choice for eMMC.</p>

<p>From there, It will install the system to the eMMC from SDcard, which will take several minutes until it&#39;s finished.</p>

<p>After it&#39;s finished, Reflash U-Boot to the eMMC like how we flash it to microSD:</p>

<pre><code>sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442
sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1

sync
</code></pre>

<p>So:</p>

<pre><code>[ INFO ] Copying ROOTFS partition data...
[ INFO ] Copying [ etc ] ...
[ INFO ] Copying [ home ] ...
[ INFO ] Copying [ opt ] ...
[ INFO ] Copying [ root ] ...
[ INFO ] Copying [ selinux ] ...
[ INFO ] Copying [ srv ] ...
[ INFO ] Copying [ usr ] ...
[ INFO ] Copying [ var ] ...
[ INFO ] Generate the new fstab file.
[ INFO ] Update parameters related to the releases file.
[ SUCCESS ] Installation completed successfully. Run [ poweroff ], remove the installation media, then re-insert the power supply to boot the new system.
root@armbian:~# sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=1 count=442
442+0 records in
442+0 records out
442 bytes copied, 0.00554292 s, 79.7 kB/s
root@armbian:~# sudo dd if=u-boot.bin of=/dev/mmcblk2 conv=fsync,notrunc bs=512 skip=1 seek=1
4095+0 records in
4095+0 records out
2096640 bytes (2.1 MB, 2.0 MiB) copied, 0.1678 s, 12.5 MB/s
root@armbian:~# 
</code></pre>

<p>After these are all done, Run <code>poweroff</code>. Once it&#39;s off (the LED light will turn to green, Don&#39;t worry), Unplug from power source, <strong>now you can also unplug the microSD card</strong>.</p>

<p>And now let it boot into it&#39;s own glory by plugging the power source back, And lo and behold, Look. It runs <strong>without the microSD card!</strong>:</p>

<p><img src="https://fedimedia.waltuh.cyou/media/54b75ff1c293805d31f41b6d3af9cec25be725ee7a50f23add413517630fe3fa.png" alt="The Linux boot sequence"></p>

<h2 id="extra-setting-up-zram">Extra: Setting up zram</h2>

<p>This can save us some room in our RAM.</p>

<pre><code>sudo apt update &amp;&amp; sudo apt install systemd-zram-generator
sudo nano /etc/systemd/zram-generator.conf 
</code></pre>

<p>Put:</p>

<pre><code>[zram0]
zram-size = ram
compression-algorithm = lzo-rle zstd(level=3) (type=idle)
</code></pre>

<p>Save it (CTRL+S), Exit (CTRL+X), and load it:</p>

<pre><code>sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0.service
</code></pre>

<h2 id="extra-setting-up-irqbalance">Extra: Setting up <code>irqbalance</code></h2>

<pre><code>yonle@armbian:~$ cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       
  9:          0          0          0          0    GICv2  25 Level     vgic
 11:   26055984   26123490   25924591   25663238    GICv2  30 Level     arch_timer
 12:          0          0          0          0    GICv2  27 Level     kvm guest vtimer
 14:          0          0          0          0    GICv2  58 Edge      ttyAML6
 15:        109          0          0          0    GICv2 225 Edge      ttyAML0
 16:          0          0          0          0    GICv2 231 Edge      c8100100.cec
 17:          0          0          0          0    GICv2 249 Level     d0072000.mmc
 18:          0          0          0          0    GICv2 220 Edge      gxl-crypto
 19:          0          0          0          0    GICv2 221 Edge      gxl-crypto
 20:         89          0          0          0    GICv2 248 Level     d0070000.mmc
 21:     124767          0          0          0    GICv2 250 Level     d0074000.mmc
 23:      86139          0          0          0    GICv2 241 Edge      platform_mhu_link
 24:     903241          0          0          0    GICv2 242 Edge      platform_mhu_link
 25:          2          0          0          0    GICv2 105 Edge      c1108680.adc
 26:          0          0          0          0    GICv2 169 Level     arm-pmu
 27:          0          0          0          0    GICv2 170 Level     arm-pmu
 28:          0          0          0          0    GICv2 185 Level     arm-pmu
 29:          0          0          0          0    GICv2 186 Level     arm-pmu
 30:       1301          0          0          0    GICv2  35 Edge      meson
 31:       2056          0          0          0    GICv2  89 Edge      dw_hdmi_top_irq, c883a000.hdmi-tx
 32:         21          0          0    3029612    GICv2  40 Level     eth0
 33:          0          0          0          0    GICv2  63 Level     c9100000.usb, c9100000.usb
 34:       2503          0   11186225          0    GICv2  62 Level     xhci-hcd:usb1
 35:         26          0          0          0    GICv2  41 Level     mdio_mux-0.1:08
 38:         16          0          0          0    GICv2 228 Edge      meson_ir
 39:          0          0          0          0    GICv2  76 Edge      vdec-mbox1
 40:          0          0          0          0    GICv2  64 Edge      esparserirq
 42:          0          0          0          0    GICv2 193 Level     gpmmu
 43:          0          0          0          0    GICv2 197 Level     ppmmu0
 44:          0          0          0          0    GICv2 199 Level     ppmmu1
 45:          0          0          0          0    GICv2 201 Level     ppmmu2
 46:          0          0          0          0    GICv2 192 Level     gp
 47:          0          0          0          0    GICv2 196 Level     pp0
 48:          0          0          0          0    GICv2 198 Level     pp1
 49:          0          0          0          0    GICv2 200 Level     pp2
 50:          0          0          0          0    GICv2 194 Level     pp_bcast
IPI0:     43769      44509      51827      43352       Rescheduling interrupts
IPI1:   1981654    2376448     760236    3324099       Function call interrupts
IPI2:         0          0          0          0       CPU stop interrupts
IPI3:         0          0          0          0       CPU stop NMIs
IPI4:         0          0          0          0       Timer broadcast interrupts
IPI5:     58603     293691      50386      56088       IRQ work interrupts
IPI6:         0          0          0          0       CPU backtrace interrupts
IPI7:         0          0          0          0       KGDB roundup interrupts
Err:          0
</code></pre>

<p>At some point, During it&#39;s workflows, One of the CPU core could be overworking than the rest of the other, Especially when it&#39;s doing certain workflows that involves what&#39;s on the hardware &amp; software itself (eg. wifi, lan, NFS, USB, etc).</p>

<p>And you probably want something like <code>irqbalance</code> to be set up and running on your box:</p>

<pre><code>sudo apt install irqbalance
sudo systemctl enable --now irqbalance
</code></pre>

<hr>

<h2 id="trivia">Trivia</h2>

<p>Given how similar the hardware that&#39;s in B860H V1 and HG680P, Especially the SOC (you can flash the same <code>u-boot.bin</code> and it will still boots!), You can probably follow this guide alongside the same HDMI dongle trickery on HG680P too</p>

<p>especially when it&#39;s bootloader is broken (which i saw most HG680P had on), you can force Amlogic to boot the bootloader in microSDcard via the HDMI dongle like what i did here.</p>

<p>They will still boot and will work, But the device tree for the hardware will be partially different and might conflict to each other, So during <code>armbian-install</code>, You must instead chose this:</p>

<pre><code>105   s905x      HG680P                                        meson-gxl-s905x-p212.dtb                          
</code></pre>

<p>Alternatively, if you don&#39;t have the HDMI dongle, you can bypass the eMMC boot on the HG680P and make the device boot from the SD card by shorting <strong>R162</strong>, <strong>4C6</strong>, and <strong>GND</strong> on the motherboard simultaneously. The USB port can be used as the ground point. A pair of tweezers or a similar conductive tool can be used to make the connection (found by <a href="https://en.opensuse.org/User:Jimed-rand" rel="nofollow">Jimed-rand</a>).</p>

<p>A similar method can be used on the <strong>B860H V1/V2</strong> by shorting <strong>R87</strong> to enter boot/recovery mode.</p>

<h1 id="baffled">Baffled?</h1>

<p>There&#39;s a <a href="https://www.youtube.com/watch?v=fvw97b-9Ag8" rel="nofollow">YouTube Video</a> that i made specifically for this. The video won&#39;t reexplain what has been mentioned on this page, So feel free to watch how it was done in raw.</p>
]]></content:encoded>
      <guid>https://pen.waltuh.cyou/yonle/zte-b860h-getting-armbian-into-it</guid>
      <pubDate>Mon, 14 Sep 2026 20:20:35 +0000</pubDate>
    </item>
    <item>
      <title>the reason i still keep making small tools and publishing it.</title>
      <link>https://pen.waltuh.cyou/yonle/the-reason-i-still-keep-making-small-tools-and-publishing-it</link>
      <description>&lt;![CDATA[I have one funny reason that still keeps me up doing it despite being a bit lazy.&#xA;&#xA;I encountered a problem that has no optional fix around it that i wanted so i had to create one to solve the damn problem in any way myself. To be frank, i moved on and had a burnout a lot, but even so, i still began to create another kind of tool for myself, and if that still interests me, i often try to maintain it.&#xA;&#xA;the thing is that, open source or foss stuff is not really my first passion to begin with when the first time i managed to code stuff by myself (that was before chatgpt even existed, god lord!)&#xA;&#xA;and to this day, even though it seems like that i contribute to the open source / foss spaces with my own code being published for free, i wasn&#39;t here to contribute to the environment actually. i simply made a tool, once found it usable for myself, i simply share it as both archival/preservation and for other to be able to use my thing. because i do not like it when the thing that i code wasn&#39;t being used by anyone other than myself.&#xA;&#xA;i might looked like helping some project by sending PR to them to fix certain bug, I might do helping them, yes. But the initial idea is still pretty much because i use their thing, and their thing is problematic, then finally it&#39;s technically resolveable, and somehow that&#39;s the healthier position for me.&#xA;&#xA;Thing is, i liked creating and then expecting people to use it.&#xA;&#xA;Because i do not like making a project that had no user.&#xA;&#xA;and because i want to have people use my tools, i tend to make some of my projects flexible and controllable while still being easy to use.&#xA;&#xA;for example, vsink, a project of mine that does some stuff with virtual pulseaudio sink, have these options:&#xA;$ vsink -help&#xA;Usage of vsink:&#xA;  -bypass string&#xA;    &#x9;Comma-separated application names to bypass capture&#xA;  -defaultSinkMode&#xA;    &#x9;Set the virtual sink as default sink. May help with some apps, but can cause issues with volume control.&#xA;  -monitor string&#xA;    &#x9;Comma-separated application names whose recordings should use the capture sink monitor&#xA;  -noLoopback&#xA;    &#x9;Disable loopback. Any app in the virtual sink will not be played back to the main speaker (except bypassed apps)&#xA;  -onlyCapture string&#xA;    &#x9;Comma-separated application names to exclusively capture into the capture sink&#xA;  -vSinkName string&#xA;    &#x9;The name of the virtual sink (default &#34;SystemCaptureSink&#34;)&#xA;&#xA;also, go-bwhero, an image compressor/thumbnailer proxy have these options:&#xA;$ ./go-bwhero -help&#xA;2026/08/20 13:28:14 bwhero, rewritten backend.&#xA;Usage of ./go-bwhero:&#xA;  -animSizeLimit int&#xA;    &#x9;Original animation size limit in bytes (default -1)&#xA;  -imgSizeLimit int&#xA;    &#x9;Original image size limit in bytes (default -1)&#xA;  -listen string&#xA;    &#x9;Listen address (default &#34;localhost:8080&#34;)&#xA;  -userAgent string&#xA;    &#x9;User agent that go-bwhero should use. (default &#34;Mozilla/5.0; go-bwhero [https://github.com/Yonle/bwhero]&#34;)&#xA;  -videoSizeLimit int&#xA;    &#x9;Original video size limit in bytes (default -1)&#xA;  -vipsConcurrencyLevel int&#xA;    &#x9;libvips concurrency level to use&#xA;  -workers int&#xA;    &#x9;Amount of workers to spawn (default 8)&#xA;&#xA;and the most obvious one, unlockata, a tool for doing ATA security on ATA storage drives, have these options too:&#xA;$ unlockata -help&#xA;Usage of unlockata:&#xA;  -device string&#xA;    &#x9;ATA device (&#34;list&#34; to list ATA devices)&#xA;  -master&#xA;    &#x9;use the ATA master password instead of the user password&#xA;  -maximum&#xA;    &#x9;use maximum security level&#xA;  -noreadpart&#xA;    &#x9;do not reread the partition table after the ATA command&#xA;  -op string&#xA;    &#x9;ATA security operation (&#34;help&#34; to list supported operations) (default &#34;unlock&#34;)&#xA;  -passwd string&#xA;    &#x9;Path to 32-byte binary password file&#xA;  -serial string&#xA;    &#x9;ATA device serial number (&#34;list&#34; to list ATA devices)&#xA;  -verbose&#xA;    &#x9;show CDB and Payload bytes being transmitted to the ATA drive.&#xA;&#xA;$ unlockata -device test -op help&#xA;Available ATA security operations:&#xA;  set              SECURITY SET PASSWORD (0xf1)&#xA;  unlock           SECURITY UNLOCK (0xf2)&#xA;  freeze           SECURITY FREEZE LOCK (0xf5)&#xA;  erase            SECURITY ERASE UNIT (0xf4)&#xA;  erase-prepare    SECURITY ERASE PREPARE (0xf3)&#xA;  disable          SECURITY DISABLE PASSWORD (0xf6)&#xA;&#xA;from there you can really see which part i really tried my best to convince people to use it in the most indirect way possible.&#xA;&#xA;---&#xA;&#xA;despite all of that, i do have one very common problem though. if the tool that i create already has a perfect code that then i had no idea what to add or what to fix let alone improve, most of the times, these became pretty much a stall,&#xA;&#xA;which is funnily what happened with most of my go projects. but i don&#39;t think i should worry these though given how safe go already is (compared to javascript, heh)&#xA;&#xA;well. with all that being said, now you know why i&#39;m still around and still interested experimenting random things.&#xA;&#xA;but yes. the fact that i use go is deadly for everyone.&#xA;&#xA;cuz i have no longer need to suffer through python, node, c, c++, c##, lua, perl, java, erlang, or even rust problems just to fight one problem]]&gt;</description>
      <content:encoded><![CDATA[<p>I have one funny reason that still keeps me up doing it despite being a bit lazy.</p>

<p>I encountered a problem that has no optional fix around it that i wanted so i had to create one to solve the damn problem in any way myself. To be frank, i moved on and had a burnout a lot, but even so, i still began to create another kind of tool for myself, and if that still interests me, i often try to maintain it.</p>

<p>the thing is that, open source or foss stuff is not really my first passion to begin with when the first time i managed to code stuff by myself (that was before chatgpt even existed, god lord!)</p>

<p>and to this day, even though it seems like that i contribute to the open source / foss spaces with my own code being published for free, i wasn&#39;t here to contribute to the environment actually. i simply made a tool, once found it usable for myself, i simply share it as both archival/preservation and for other to be able to use my thing. because i do not like it when the thing that i code wasn&#39;t being used by anyone other than myself.</p>

<p>i might looked like helping some project by sending PR to them to fix certain bug, I might do helping them, yes. But the initial idea is still pretty much because i use their thing, and their thing is problematic, then finally it&#39;s technically resolveable, and somehow that&#39;s the healthier position for me.</p>

<p>Thing is, i liked creating and then expecting people to use it.</p>

<p>Because i do not like making a project that had no user.</p>

<p>and because i want to have people use my tools, i tend to make some of my projects flexible and controllable while still being easy to use.</p>

<p>for example, <a href="https://github.com/Yonle/vsink" rel="nofollow">vsink</a>, a project of mine that does some stuff with virtual pulseaudio sink, have these options:</p>

<pre><code>$ vsink -help
Usage of vsink:
  -bypass string
    	Comma-separated application names to bypass capture
  -defaultSinkMode
    	Set the virtual sink as default sink. May help with some apps, but can cause issues with volume control.
  -monitor string
    	Comma-separated application names whose recordings should use the capture sink monitor
  -noLoopback
    	Disable loopback. Any app in the virtual sink will not be played back to the main speaker (except bypassed apps)
  -onlyCapture string
    	Comma-separated application names to exclusively capture into the capture sink
  -vSinkName string
    	The name of the virtual sink (default &#34;SystemCaptureSink&#34;)
</code></pre>

<p>also, <a href="https://github.com/Yonle/go-bwhero" rel="nofollow">go-bwhero</a>, an image compressor/thumbnailer proxy have these options:</p>

<pre><code>$ ./go-bwhero -help
2026/08/20 13:28:14 bwhero, rewritten backend.
Usage of ./go-bwhero:
  -animSizeLimit int
    	Original animation size limit in bytes (default -1)
  -imgSizeLimit int
    	Original image size limit in bytes (default -1)
  -listen string
    	Listen address (default &#34;localhost:8080&#34;)
  -userAgent string
    	User agent that go-bwhero should use. (default &#34;Mozilla/5.0; go-bwhero [https://github.com/Yonle/bwhero]&#34;)
  -videoSizeLimit int
    	Original video size limit in bytes (default -1)
  -vipsConcurrencyLevel int
    	libvips concurrency level to use
  -workers int
    	Amount of workers to spawn (default 8)
</code></pre>

<p>and the most obvious one, <a href="https://github.com/Yonle/unlockata" rel="nofollow">unlockata</a>, a tool for doing ATA security on ATA storage drives, have these options too:</p>

<pre><code>$ unlockata -help
Usage of unlockata:
  -device string
    	ATA device (&#34;list&#34; to list ATA devices)
  -master
    	use the ATA master password instead of the user password
  -maximum
    	use maximum security level
  -noreadpart
    	do not reread the partition table after the ATA command
  -op string
    	ATA security operation (&#34;help&#34; to list supported operations) (default &#34;unlock&#34;)
  -passwd string
    	Path to 32-byte binary password file
  -serial string
    	ATA device serial number (&#34;list&#34; to list ATA devices)
  -verbose
    	show CDB and Payload bytes being transmitted to the ATA drive.

$ unlockata -device test -op help
Available ATA security operations:
  set              SECURITY SET PASSWORD (0xf1)
  unlock           SECURITY UNLOCK (0xf2)
  freeze           SECURITY FREEZE LOCK (0xf5)
  erase            SECURITY ERASE UNIT (0xf4)
  erase-prepare    SECURITY ERASE PREPARE (0xf3)
  disable          SECURITY DISABLE PASSWORD (0xf6)
</code></pre>

<p>from there you can really see which part i really tried my best to convince people to use it in the most indirect way possible.</p>

<hr>

<p>despite all of that, i do have one very common problem though. if the tool that i create already has a perfect code that then i had no idea what to add or what to fix let alone improve, most of the times, these became pretty much a stall,</p>

<p>which is funnily what happened with most of my go projects. but i don&#39;t think i should worry these though given how safe go already is (compared to javascript, heh)</p>

<p>well. with all that being said, now you know why i&#39;m still around and still interested experimenting random things.</p>

<p>but yes. the fact that i use go is deadly for everyone.</p>

<p>cuz i have no longer need to suffer through python, node, c, c++, c##, lua, perl, java, erlang, or even rust problems just to fight one problem</p>
]]></content:encoded>
      <guid>https://pen.waltuh.cyou/yonle/the-reason-i-still-keep-making-small-tools-and-publishing-it</guid>
      <pubDate>Thu, 20 Aug 2026 06:24:42 +0000</pubDate>
    </item>
    <item>
      <title>The monthly journal of youth me: #3</title>
      <link>https://pen.waltuh.cyou/yonle/the-monthly-journal-of-youth-me-3</link>
      <description>&lt;![CDATA[I do not like to be forced to explain something that i&#39;m personally not comfortable to talk about. And when that happens, I always hung up the phone immediately. That&#39;s exactly what happened to me this week.&#xA;&#xA;My Mum dialed me and asked whenever the tuition has been paid. It has been a week, But it hasn&#39;t. I told her that, and then hung up immediately as i knew that she will ask me many thousands of times and then teach me how to &#34;scold my Dad to do it immediately&#34;.&#xA;&#xA;And as i guessed, She called me back. But the moment i hear the first 3 words of the same thing, I hung up immediately, again. Several minutes after i write this, She dialed. Again. Was about to ask the same question again, Which then i hung up again. Immediately.&#xA;&#xA;I did tell her several weeks ago, Or many times that i do not like to be forced to answer some of his questions. But she doesn&#39;t like that answer and then said that i&#39;m basically the same as my Dad, and &#34;his Big Son doesn&#39;t like her&#34;.&#xA;&#xA;So that&#39;s basically another reason on why i always hung up my phone immediately and always reconsider myself every time i was planning to go back to my hometown. Because if i did so, She will go with that same darn heavy set of lines once again. That includes when i refuse his solution. too.&#xA;&#xA;Well. It&#39;s always been like that. At some other day, His instict to always corner my Dad to send her money (which is normal, basically. I can&#39;t blame her) nearly everyday 3 times a day basically led my Dad to literally block his number immediately.&#xA;&#xA;He wasn&#39;t really refusing to send money to my Mum. I did send some sum of money that my Dad told me to sent to my Mom via my Uncle&#39;s Bank account (since we&#39;re in remote town), But when she heard that i&#39;m the one that send it to her, She&#39;s very dead picky and refuse to accept the money and insisted that i should keep it for myself (while that money is actually reserved for her. Not me).&#xA;&#xA;Speaking of which, The same situation that she already led into already causes me to block her 2 times for 2 straight months before. And that&#39;s me being called &#34;dark-minded&#34;, &#34;disobedient&#34;, and then the most legendary &#34;why should you even exists if i knew you will grow like this&#34; and finally &#34;if i were reborn once again, I swear to myself that i do not want to have a husband and a child&#34;.&#xA;&#xA;From there, You can see why i hung up my phone on her immediately.&#xA;&#xA;and there you have it.&#xA;&#xA;This is basically the everyday life of mine. But whenever i accept myself to become some kind of beggar is something else.]]&gt;</description>
      <content:encoded><![CDATA[<p>I do not like to be forced to explain something that i&#39;m personally not comfortable to talk about. And when that happens, I always hung up the phone immediately. That&#39;s exactly what happened to me this week.</p>

<p>My Mum dialed me and asked whenever the tuition has been paid. It has been a week, But it hasn&#39;t. I told her that, and then hung up immediately as i knew that she will ask me many thousands of times and then teach me how to “scold my Dad to do it immediately”.</p>

<p>And as i guessed, She called me back. But the moment i hear the first 3 words of the same thing, I hung up immediately, again. Several minutes after i write this, She dialed. Again. Was about to ask the same question again, Which then i hung up again. Immediately.</p>

<p>I did tell her several weeks ago, Or many times that i do not like to be forced to answer some of his questions. But she doesn&#39;t like that answer and then said that i&#39;m basically the same as my Dad, and “his Big Son doesn&#39;t like her”.</p>

<p>So that&#39;s basically another reason on why i always hung up my phone immediately and always reconsider myself every time i was planning to go back to my hometown. Because if i did so, She will go with that same darn heavy set of lines once again. That includes when i refuse his solution. too.</p>

<p>Well. It&#39;s always been like that. At some other day, His instict to always corner my Dad to send her money (which is normal, basically. I can&#39;t blame her) nearly everyday 3 times a day basically led my Dad to literally block his number immediately.</p>

<p>He wasn&#39;t really refusing to send money to my Mum. I did send some sum of money that my Dad told me to sent to my Mom via my Uncle&#39;s Bank account (since we&#39;re in remote town), But when she heard that i&#39;m the one that send it to her, She&#39;s very dead picky and refuse to accept the money and insisted that i should keep it for myself (while that money is actually reserved for her. Not me).</p>

<p>Speaking of which, The same situation that she already led into already causes me to block her 2 times for 2 straight months before. And that&#39;s me being called “dark-minded”, “disobedient”, and then the most legendary “why should you even exists if i knew you will grow like this” and finally <strong>“if i were reborn once again, I swear to myself that i do not want to have a husband and a child”</strong>.</p>

<p>From there, You can see why i hung up my phone on her immediately.</p>

<p>and there you have it.</p>

<p>This is basically the everyday life of mine. But whenever i accept myself to become some kind of beggar is something else.</p>
]]></content:encoded>
      <guid>https://pen.waltuh.cyou/yonle/the-monthly-journal-of-youth-me-3</guid>
      <pubDate>Sun, 16 Aug 2026 07:17:29 +0000</pubDate>
    </item>
    <item>
      <title>sepucuk pendapat pribadi: siswa, dan sekolah</title>
      <link>https://pen.waltuh.cyou/yonle/sepucuk-pendapat-pribadi-siswa-dan-sekolah</link>
      <description>&lt;![CDATA[sepucuk pendapat pribadi: siswa, dan sekolah&#xA;&#xA;jika kamu pikir-pikir, keadaan siswa-siswi Indonesia yang kebanyakan tidak dapat menyerap banyak ilmu maupun pengetahuan dari sekolahnya cenderung akan lebih tolol lagi jika pemblokiran wikipedia benar-benar terjadi. kamu lihat:&#xA;&#xA;kurikulum yang tidak jelas, tidak realistis&#xA;&#xA;saat aku pegang kedua buku yang berbeda, satu dari berbasis kurikulum 2013, dan satunya dari kurikulum merdeka, perbedaannya sangat menonjol:&#xA;&#xA;dalam buku kurikulum k13 tersebut, penjelasan materi cenderung lebih luas daripada sebuah tugas per bab. Setiap tugas yang diberikan di dalam buku itu mereferensikan dengan apa yang sudah dijabarkan kepada siswa, Mau itu telah dijelaskan oleh guru maupun tidak, semua jawaban dan pengetahuan dapat didapatkan dari satu buku ini secara otodidak oleh siswa.&#xA;&#xA;perhatikan lampiran 2 halaman ini, lalu simpulkan sendiri:&#xA;gambar&#xA;gambar&#xA;&#xA;sedangkan pada buku kurikulum merdeka, penjelasan pada sebuah materi hampir cenderung nihil pada buku mata pelajaran masing-masing. jika tugas-tugas ini dijelaskan oleh guru terlebih dahulu, mungkin masuk akal, namun jika orang tua yang menjelaskan kepada anaknya, maka kenapa siswa harus masuk sekolah dari awal?&#xA;&#xA;kejadian di lapangan menunjukkan bahwa kebanyakan guru cenderung jarang memberikan penjelasan pada jam kelas dan terkadang hanya dijelaskan pada saat les, dan walaupun itu dibantu dengan memperpanjang waktu sekolah siswa yang awalnya dari jam 6 pagi sampai jam 12 (atau 1 siang) menjadi jam 6 pagi (lebih awal) sampai jam 3:45.&#xA;&#xA;masalahnya, begini:&#xA;penyampaian materi pada buku-buku ini cenderung kompleks, dan bahkan demikian saat lapangan menunjukkan bahwa di Sekolah Dasar pun memiliki masalah seperti ini.&#xA;guru di lapangan yang baru terjun di mata pelajaran ini justru kewalahan dengan kompleksitivitas metode penyampaian materi yang disampaikan. ini seharusnya sudah tidak terjadi di beberapa wilayah, namun hasil di lapangan pun menunjukkan bahwa guru baru pun tetap memiliki masalah serupa.&#xA;kebanyakan guru di lapangan cenderung tidak melakukan penjelasan, dan justru memberikan tugas lalu kemudian, begitu saja (keluar dari kelas saat belum istirahat, memberikan siswa jam kosong).&#xA;siswa yang tidak mengerti dengan materi yang disampaikan cenderung terjebak dengan materi yang diberikan jika tidak ada semacam les, atau pengajaran di rumah&#xA;orang tua terbebankan oleh tugas-tugas anaknya yang dimana seharusnya sudah dijelaskan oleh guru&#xA;&#xA;dan sebenarnya? beberapa sekolah cenderung mengkeep beberapa mata pelajaran agar tetap mengajarkan beberapa dari kurikulum 2013.&#xA;&#xA;kita sudah melihatnya di lapangan, dan konsenkuensinya, bukan main&#xA;&#xA;perhatikan, lalu buka peramban internetmu sendiri:&#xA;beberapa murid-murid SMA pun tidak dapat membaca, atau bahkan menghitung aritmatika dasar (tambah, kurang, kali, bagi) yang dimana seharusnya sudah bisa&#xA;masih sma, tidak dapat baca jam dinding?? apa kabar dengan gurunya sebelumnya? apakah di lingkungannya tidak pernah ajari cara membaca jam dinding sama sekali??&#xA;&#xA;lalu, begini masalahnya:&#xA;jika kita sebut guru-guru molor pada tugasnya di lapangan, sebenarnya ada faktor yang memperjelaskan keadaan guru:&#xA;&#xA;guru kita underpaid. serius.&#xA;&#xA;jika kita lihat keadaan di lapangan, beberapa guru hanya digaji sekitaran 200 ribu ataupun hanya 150 ribu perbulan.&#xA;&#xA;iya. sebanyak uang kas yang kita keluarkan setiap 4 hari.&#xA;&#xA;sebenarnya, beberapa pihak sudah mendesak pemerintah untuk menaikkan gaji guru, namun pemerintah condong ke MBG yang secara bersamaan menyebabkan inflasi harga sembako di beberapa kota beserta tutupnya beberapa UMKM di wilayah sekolah. dan secara bersamaan, gaji guru dipotong di situasi yang bersamaan.&#xA;&#xA;sekarang, sudah lihat kan?&#xA;&#xA;---&#xA;&#xA;mungkin itu saja dariku.&#xA;&#xA;jika terdapat kesalahan, buatlah pos yang mengkoreksi artikelku ini.&#xA;&#xA;sekian,&#xA;&#xA;seorang mantan siswa yang melihat transisi k13 ke kurikulum merdeka.]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="sepucuk-pendapat-pribadi-siswa-dan-sekolah">sepucuk pendapat pribadi: siswa, dan sekolah</h2>

<p>jika kamu pikir-pikir, keadaan siswa-siswi Indonesia yang kebanyakan tidak dapat menyerap banyak ilmu maupun pengetahuan dari sekolahnya cenderung akan lebih tolol lagi jika <a href="https://id.wikipedia.org/wiki/Wikipedia:Pernyataan_resmi_komunitas_Wikipedia_bahasa_Indonesia_terhadap_pembatasan_akses_auth.wikimedia.org_di_Indonesia" rel="nofollow">pemblokiran wikipedia</a> benar-benar terjadi. kamu lihat:</p>

<h2 id="kurikulum-yang-tidak-jelas-tidak-realistis">kurikulum yang tidak jelas, tidak realistis</h2>

<p>saat aku pegang kedua buku yang berbeda, satu dari berbasis kurikulum 2013, dan satunya dari kurikulum merdeka, perbedaannya sangat menonjol:</p>

<p>dalam buku kurikulum k13 tersebut, penjelasan materi cenderung lebih luas daripada sebuah tugas per bab. Setiap tugas yang diberikan di dalam buku itu mereferensikan dengan apa yang sudah dijabarkan kepada siswa, Mau itu telah dijelaskan oleh guru maupun tidak, semua jawaban dan pengetahuan dapat didapatkan dari satu buku ini secara otodidak oleh siswa.</p>

<p>perhatikan lampiran 2 halaman ini, lalu simpulkan sendiri:
<a href="https://media.fedinet.waltuh.cyou/media/aa394e454a4d5d5f8cefef8d9bf56fd80d5b8bfd8c19b2a5c1d07cf243655b56.png" rel="nofollow"><img src="https://media.fedinet.waltuh.cyou/media/aa394e454a4d5d5f8cefef8d9bf56fd80d5b8bfd8c19b2a5c1d07cf243655b56.png" alt="gambar"></a>
<a href="https://media.fedinet.waltuh.cyou/media/09bc31780c586e0710d767f0f4eae92a22626784cd1c34ea818cfa405b5fd19c.png" rel="nofollow"><img src="https://media.fedinet.waltuh.cyou/media/09bc31780c586e0710d767f0f4eae92a22626784cd1c34ea818cfa405b5fd19c.png" alt="gambar"></a></p>

<p>sedangkan pada buku kurikulum merdeka, penjelasan pada sebuah materi hampir cenderung nihil pada buku mata pelajaran masing-masing. jika tugas-tugas ini dijelaskan oleh guru terlebih dahulu, mungkin masuk akal, namun jika orang tua yang menjelaskan kepada anaknya, <strong>maka kenapa siswa harus masuk sekolah dari awal?</strong></p>

<p>kejadian di lapangan menunjukkan bahwa kebanyakan guru cenderung <strong>jarang</strong> memberikan penjelasan pada jam kelas dan terkadang hanya dijelaskan pada saat les, dan walaupun itu dibantu dengan memperpanjang waktu sekolah siswa yang awalnya dari jam 6 pagi sampai jam 12 (atau 1 siang) menjadi jam 6 pagi (lebih awal) <strong>sampai jam 3:45</strong>.</p>

<p>masalahnya, begini:
– penyampaian materi pada buku-buku ini cenderung kompleks, dan bahkan demikian saat lapangan menunjukkan bahwa di Sekolah Dasar pun memiliki masalah seperti ini.
– guru di lapangan yang baru terjun di mata pelajaran ini <strong>justru kewalahan dengan kompleksitivitas</strong> metode penyampaian materi yang disampaikan. ini seharusnya sudah tidak terjadi di beberapa wilayah, namun hasil di lapangan pun menunjukkan bahwa <strong>guru baru pun tetap memiliki masalah serupa</strong>.
– kebanyakan guru di lapangan cenderung <strong>tidak melakukan penjelasan</strong>, dan justru memberikan tugas lalu kemudian, <em>begitu saja</em> (keluar dari kelas saat belum istirahat, memberikan siswa jam kosong).
– siswa yang tidak mengerti dengan materi yang disampaikan cenderung terjebak dengan materi yang diberikan jika tidak ada semacam les, atau pengajaran di rumah
– <strong>orang tua terbebankan oleh tugas-tugas anaknya yang dimana seharusnya sudah dijelaskan oleh guru</strong></p>

<p>dan sebenarnya? beberapa sekolah cenderung meng<em>keep</em> beberapa mata pelajaran agar tetap mengajarkan beberapa dari kurikulum 2013.</p>

<h2 id="kita-sudah-melihatnya-di-lapangan-dan-konsenkuensinya-bukan-main">kita sudah melihatnya di lapangan, dan konsenkuensinya, <strong>bukan main</strong></h2>

<p>perhatikan, lalu buka peramban internetmu sendiri:
– beberapa murid-murid SMA pun <strong>tidak dapat membaca</strong>, atau bahkan <strong>menghitung aritmatika dasar (tambah, kurang, kali, bagi)</strong> yang dimana seharusnya sudah bisa
– <strong>masih sma, tidak dapat baca jam dinding??</strong> apa kabar dengan gurunya sebelumnya? apakah di lingkungannya tidak pernah ajari cara membaca jam dinding sama sekali??</p>

<p>lalu, begini masalahnya:
– jika kita sebut guru-guru <strong>molor</strong> pada tugasnya di lapangan, sebenarnya ada faktor yang memperjelaskan keadaan guru:</p>

<h2 id="guru-kita-underpaid-serius">guru kita underpaid. serius.</h2>

<p>jika kita lihat keadaan di lapangan, beberapa guru hanya digaji sekitaran 200 ribu ataupun hanya 150 ribu <strong>perbulan</strong>.</p>

<p>iya. sebanyak uang kas yang kita keluarkan setiap 4 hari.</p>

<p>sebenarnya, beberapa pihak sudah mendesak pemerintah untuk menaikkan gaji guru, namun pemerintah condong ke MBG yang secara bersamaan menyebabkan inflasi harga sembako di beberapa kota beserta tutupnya beberapa UMKM di wilayah sekolah. dan secara bersamaan, <strong>gaji guru dipotong</strong> di situasi yang bersamaan.</p>

<p>sekarang, sudah lihat kan?</p>

<hr>

<p>mungkin itu saja dariku.</p>

<p>jika terdapat kesalahan, <strong>buatlah pos yang mengkoreksi artikelku ini</strong>.</p>

<p>sekian,</p>

<p>seorang mantan siswa yang melihat transisi k13 ke kurikulum merdeka.</p>
]]></content:encoded>
      <guid>https://pen.waltuh.cyou/yonle/sepucuk-pendapat-pribadi-siswa-dan-sekolah</guid>
      <pubDate>Thu, 23 Apr 2026 10:27:02 +0000</pubDate>
    </item>
    <item>
      <title>A messy little rambling of mine. Might be gibberish</title>
      <link>https://pen.waltuh.cyou/yonle/a-messy-little-rambling-of-mine</link>
      <description>&lt;![CDATA[Well, Look. Since i&#39;ve said this before in the VC, So i might wanna make things clear a bit since i spoke all of that during my little jogging that i can&#39;t really focus on my words.&#xA;&#xA;Caution to reader: This might sounded misogynistic at first, But it&#39;s actually not. If you still thought so, Close this tab.&#xA;&#xA;---&#xA;&#xA;To begin with, I literally didn&#39;t care if you&#39;re a male or female to begin with. If one completely acted like a cunt to the point i can&#39;t even hold my fury, then so be it.&#xA;&#xA;Like any usual middle high schoolers, There&#39;s always that one person that literally despise you for no reason but then will need you for something else, and that kind of person is always here. I would like to say this, though. I really don&#39;t want to have debates to begin with, But given the amount of volumes of BS that i get everyday from these individuals, That same exact incident changed exactly who i am since that very day.&#xA;&#xA;Please remember: I talk about one specific person. It doesn&#39;t even mean that i will treat everyone exactly the same treatment. There&#39;s a reason for why the following happens.&#xA;&#xA;There&#39;s that one girl who since the last year of middle school will always cut me off everytime i talk to teacher or my close friend (rare, but it occurs), or during group discussion. These cuts are not even polite or anything, but rather pure disrespect.&#xA;&#xA;There are time where i literally had enough to that girl that i literally slam my hands onto the table to shut that one person off due to constant cutting off and the disrespect that she put,&#xA;&#xA;When she fight back with words, This time i snapped and shouted back at her, It&#39;s all going on back and forth until a classmate stop both of us.&#xA;&#xA;---&#xA;&#xA;Well, This is basically a messy rambling that i try to recall on my brain that then ended up being messy.&#xA;&#xA;To be frank, I do not really want to be a debater to begin with, But i guess there&#39;s so many factors to the point that I literally became one.]]&gt;</description>
      <content:encoded><![CDATA[<p>Well, Look. Since i&#39;ve said this before in the VC, So i might wanna make things clear a bit since i spoke all of that during my little jogging that i can&#39;t really focus on my words.</p>

<p><strong>Caution to reader</strong>: This might sounded <a href="https://dictionary.cambridge.org/us/dictionary/english/misogynistic" rel="nofollow">misogynistic</a> at first, But it&#39;s actually not. If you still thought so, <strong><a href="https://google.com" rel="nofollow">Close this tab</a></strong>.</p>

<hr>

<p>To begin with, I literally didn&#39;t care if you&#39;re a male or female to begin with. If one completely acted like a cunt to the point i can&#39;t even hold my fury, then so be it.</p>

<p>Like any usual middle high schoolers, There&#39;s always that one person that literally despise you for no reason but then will need you for something else, and that kind of person is always here. I would like to say this, though. I really don&#39;t want to have debates to begin with, But given the amount of volumes of BS that i get everyday from these individuals, That same exact incident changed exactly who i am since that very day.</p>

<p>Please remember: <strong>I talk about one specific person</strong>. It doesn&#39;t even mean that i will treat everyone exactly the same treatment. There&#39;s a reason for why the following happens.</p>

<p>There&#39;s that one girl who since the last year of middle school will always cut me off everytime i talk to teacher or my close friend (rare, but it occurs), or during group discussion. These cuts are not even polite or anything, but rather pure disrespect.</p>

<p>There are time where i literally had enough to that girl that i literally slam my hands onto the table to shut that one person off due to constant cutting off and the disrespect that she put,</p>

<p>When she fight back with words, This time i snapped and shouted back at her, It&#39;s all going on back and forth until a classmate stop both of us.</p>

<hr>

<p>Well, This is basically a messy rambling that i try to recall on my brain that then ended up being messy.</p>

<p>To be frank, I do not really want to be a debater to begin with, But i guess there&#39;s so many factors to the point that I literally became one.</p>
]]></content:encoded>
      <guid>https://pen.waltuh.cyou/yonle/a-messy-little-rambling-of-mine</guid>
      <pubDate>Mon, 20 Apr 2026 19:45:15 +0000</pubDate>
    </item>
    <item>
      <title>iommu with sr-iov: gpu accelerated windows vm on a linux laptop that has only igpu</title>
      <link>https://pen.waltuh.cyou/yonle/iommu-with-sr-iov-gpu-accelerated-windows-vm-on-a-linux-laptop-that-has-only</link>
      <description>&lt;![CDATA[screenshot of a windows 11 vm guest with gpu hardware acceleration&#xA;smallscreenshot of a windows 11 vm guest with gpu hardware acceleration/small&#xA;&#xA;the first thing that came to my mind when you need to have a gpu passthrough, Often it requires another secondary dedicated graphics card that&#39;s unused by the host. if not that, then paravirtualization solution such as virtualbox/vmware/spice guest tools, or virgl3d.&#xA;&#xA;but then we have sr-iov which specially targets a intel processor computer that let us create a virtual function (VF) of Intel UHD Graphics iGPU. This lets us to be able to do gpu passthrough to our VM without needing to have it being unused. in this blog, i will talk on how i set this up&#xA;&#xA;disclaimer: sriov is still considered experimental. things might break here if you&#39;re unlucky, but it shouldn&#39;t be.&#xA;&#xA;setting up&#xA;&#xA;you will need to ensure that the intel processor that you are using is Gen 9.5 and newer for the best experience as possible. Ensure that both VT-x and VT-d are enabled on the bios settings so you can use IOMMU for hardware passthrough, otherwise you will still limited in paravirtualization.&#xA;&#xA;the operating system that i use at the time of this writing is arch linux. kernel is the default arch kernel. since sriov hasn&#39;t getting mainstreamed yet, so we just install the i915-sriov dkms module via aur:&#xA;yay -S i915-sriov-dkms&#xA;&#xA;or manually install it from source:&#xA;git clone --depth=1 https://github.com/strongtz/i915-sriov-dkms&#xA;doas dkms add ./i915-sriov-dkms&#xA;&#xA;install the module&#xA;doas dkms install i915-sriov-dkms/2026.05.06&#xA;&#xA;then rebuild your initramfs&#xA;&#xA;smallreplace 2026.05.06 with the current version of the module/small&#xA;&#xA;just to make it compatible with other kernel, i will use the dkms variant since it&#39;s easier to maintain and switch kernel back and forth just in case.&#xA;&#xA;for your convenience, please add yourself to kvm group: usermod -aG kvm you&#xA;&#xA;kernel&#xA;&#xA;continuing, we begin by explicitly making the kernel to enable intel iommu by adding this to the kernel boot param. 1 VFs is generally enough. you can pick which driver you will want to use in between the two:&#xA;&#xA;i915:&#xA;inteliommu=on i915.enableguc=3 i915.maxvfs=1 moduleblacklist=xe&#xA;&#xA;xe (the new experimental driver. you will need it if you have for like, Intel Arc/Iris):&#xA;inteliommu=on xe.maxvfs=1 xe.forceprobe=device-id moduleblacklist=i915&#xA;smallYou can also try to use xe on iGPU, however given how new this driver is, it might be unstable/small&#xA;&#xA;To get device-id, You can obtain it by executing lspci -nn | grep -i vga and then obtain the 16 bit hexadecimal digit of the iGPU id:&#xA;&#xA;[yonle@yonle ~]$ lspci -nn | grep -i vga&#xA;0000:00:02.0 VGA compatible controller [0300]: Intel Corporation Alder Lake-UP3 GT1 [UHD Graphics] [8086:46b3] (rev 0c)&#xA;&#xA;as you see here, the device id of my iGPU is 46b3, which then you will use this for the boot param above and later on.&#xA;&#xA;now reboot, and then check dmesg to see whenever SR-IOV is actually loaded properly:&#xA;[yonle@yonle ~]$ doas dmesg | grep -i sriov&#xA;[    5.169765] i915: You are using the i915-sriov-dkms module, a ported version of the i915/xe module with SR-IOV support.&#xA;[    5.169767] i915: Please file any bug report at https://github.com/strongtz/i915-sriov-dkms/issues/new.&#xA;[    5.169768] i915: Module Homepage: https://github.com/strongtz/i915-sriov-dkms&#xA;[    5.289502] intelsriovcompat: loaded&#xA;smallreplace &#34;doas&#34; as &#34;sudo&#34; if you use sudo./small&#xA;&#xA;if you saw intelsriovcompat: loaded, you&#39;re good to go.&#xA;&#xA;making the virtual function&#xA;&#xA;technically, you can manually load it via command line. but for some reason it might give you more works than necessary to get your things working.&#xA;&#xA;so, assuming you&#39;re on arch linux, make a systemd-tmpfiles config specifically to make just 1 vf. edit /etc/tmpfiles.d/i915-set-sriov-numvfs.conf:&#xA;Path                                              Mode UID  GID  Age Argument&#xA;Uncomment the next line and change the argument to the number of VFs you want&#xA;w /sys/devices/pci0000:00/0000:00:02.0/sriovnumvfs -    -    -    -   1&#xA;&#xA;and then, make a udev rules to block vf (except host) to be used as a main by host (eg, your main de/wm). edit /etc/udev/rules.d/99-i915-vf-vfio.rules:&#xA;ACTION==&#34;add&#34;, SUBSYSTEM==&#34;pci&#34;, KERNEL==&#34;0000:00:02.1&#34;, ATTR{vendor}==&#34;0x8086&#34;, ATTR{device}==&#34;0x46b3&#34;, DRIVER!=&#34;vfio-pci&#34;, RUN+=&#34;/bin/sh -c &#39;echo \$kernel   /sys/bus/pci/devices/\$kernel/driver/unbind; echo vfio-pci   /sys/bus/pci/devices/\$kernel/driveroverride; modprobe vfio-pci; echo \$kernel   /sys/bus/pci/drivers/vfio-pci/bind&#39;&#34;&#xA;&#xA;note: replace 46b3 with your gpu device id that you obtained above.&#xA;&#xA;then, reboot.&#xA;&#xA;you must see 2 iGPU now when running lspci now:&#xA;[yonle@yonle module]$ lspci | grep -i vga&#xA;0000:00:02.0 VGA compatible controller: Intel Corporation Alder Lake-UP3 GT1 [UHD Graphics] (rev 0c)&#xA;0000:00:02.1 VGA compatible controller: Intel Corporation Alder Lake-UP3 GT1 [UHD Graphics] (rev 0c)&#xA;&#xA;remember: your guest must only use the vf one, in this case, it&#39;s 0000:00:02.1&#xA;&#xA;kvmfr&#xA;&#xA;as we&#39;re also going to use looking glass, let&#39;s prepare kvmfr for the shared memory.&#xA;&#xA;first, ensure that your kernel header has been installed properly before installing the dkms module.&#xA;&#xA;installing manually&#xA;&#xA;obtain the source code tarball from here, and then extract module folder, and then,&#xA;&#xA;cd module&#xA;doas dkms install .&#xA;&#xA;caution: you must rebuild the DKMS on each kernel update / when you switch to different kernel.&#xA;&#xA;installing via AUR&#xA;&#xA;yay -S looking-glass-module-dkms&#xA;&#xA;👍&#xA;&#xA;configuring kvmfr&#xA;&#xA;you should be able to load kvmfr now:&#xA;doas modprobe kvmfr staticsizemb=32&#xA;&#xA;the looking glass docs has a fantastic explanation on how do you determine a shared memory for your DMA, which you should read.&#xA;&#xA;now, let&#39;s make this module gets loaded automatically on boot. First we need to set the default kvmfr load param by editing  /etc/modprobe.d/kvmfr.conf, then putting this:&#xA;options kvmfr staticsizemb=32&#xA;&#xA;then edit /etc/modules-load.d/kvmfr.conf and add this:&#xA;kvmfr&#xA;&#xA;now, we make a udev rule to ensure that the device got a proper permission. edit /etc/udev/rules.d/99-kvmfr.rules:&#xA;SUBSYSTEM==&#34;kvmfr&#34;, OWNER=&#34;user&#34;, GROUP=&#34;kvm&#34;, MODE=&#34;0660&#34;&#xA;&#xA;replace user with your username.&#xA;&#xA;to apply the udev permission immediately, do&#xA;doas chown you:kvm /dev/kvmfr0&#xA;doas chmod 660 /dev/kvmfr0&#xA;&#xA;now edit /etc/libvirt/qemu.conf, and uncomment cgroupdeviceacl and add /dev/kvm and /dev/kvmfr0 in it:&#xA;cgroupdeviceacl = [&#xA;    &#34;/dev/null&#34;, &#34;/dev/full&#34;, &#34;/dev/zero&#34;,&#xA;    &#34;/dev/random&#34;, &#34;/dev/urandom&#34;,&#xA;    &#34;/dev/ptmx&#34;, &#34;/dev/userfaultfd&#34;,&#xA;    &#34;/dev/kvm&#34;, &#34;/dev/kvmfr0&#34;&#xA;]&#xA;&#xA;then restart libvirtd daemon.&#xA;&#xA;make a vm&#xA;&#xA;we will use libvirt with virt-manager as the client.&#xA;&#xA;the vm that we will create will be a Microsoft Windows 11 VM.&#xA;&#xA;before you begin your installation, Do a customization first. On [Overview]&#39;s XML, Replace the following top:&#xA;domain type=&#34;kvm&#34;&#xA;&#xA;with this:&#xA;domain xmlns:qemu=&#34;http://libvirt.org/schemas/domain/qemu/1.0&#34; type=&#34;kvm&#34;&#xA;&#xA;and then, add the following inside the domain field:&#xA;  qemu:commandline&#xA;    qemu:arg value=&#34;-device&#34;/&#xA;    qemu:arg value=&#34;{&#39;driver&#39;:&#39;ivshmem-plain&#39;,&#39;id&#39;:&#39;lg&#39;,&#39;memdev&#39;:&#39;looking-glass&#39;}&#34;/&#xA;    qemu:arg value=&#34;-object&#34;/&#xA;    qemu:arg value=&#34;{&#39;qom-type&#39;:&#39;memory-backend-file&#39;,&#39;id&#39;:&#39;looking-glass&#39;,&#39;mem-path&#39;:&#39;/dev/kvmfr0&#39;,&#39;size&#39;:33554432,&#39;share&#39;:true}&#34;/&#xA;  /qemu:commandline&#xA;&#xA;replace 33554432 with your calculated shared memory.&#xA;&#xA;then, [Add Hardware] -  [PCI Host Device], Look for your VF iGPU (from the previous lspci, it must be 0000:00:02.1)&#xA;&#xA;remove the existing keyboard and tablet input, and make new inputs for both things with virtio bus in it. Additionally, If there&#39;s &#34;EvTouch&#34; or anything outside of &#34;ps2&#34; and &#34;virtio&#34; inputs, you may also want to attach it too.&#xA;&#xA;and then proceed installation with vga as usual until you finished installing the OS with Intel Graphics Driver and Windows Virtio Drivers installed.&#xA;&#xA;Since i&#39;m in Gen 12th alder lake, I installed the ones with version 32.0.101.7085 as of the time of this writing (or, &#34;Intel® 11th – 14th Gen Processor Graphics - Windows*&#34;).&#xA;&#xA;you should only need to install Intel Graphics Driver and that&#39;s all it takes to work. after installation, reboot to ensure that the driver is actually being loaded properly and then check via device manager (right click on the start button and then go from here). it should look like this:&#xA;&#xA;device manager&#xA;smallnote: i will guide you on setting up Virtual Display Driver from here/small&#xA;&#xA;until looking glass and VDD has been configured, you must not turn VGA to None until you finished following the steps below&#xA;&#xA;Virtual Display Driver (VDD)&#xA;&#xA;usually, you use a dummy HDMI or DP adapter to make GPU start drawing a screen. Since we can&#39;t do that via VF, We basically make a screen of our own here. &#xA;&#xA;open your terminal, and execute&#xA;winget install --id=VirtualDrivers.Virtual-Display-Driver -e --source winget&#xA;&#xA;once succesfully installing it, open new terminal tab, and type&#xA;&amp; &#39;VDD Control.exe&#39;&#xA;&#xA;It will launch new window looking like this:&#xA;&#xA;virtual display driver window&#xA;&#xA;Press [Install Driver] and proceed driver installation. If succeed, The OS will make an animation as if a secondary monitor has got plugged in.&#xA;&#xA;Looking Glass&#xA;&#xA;Now, Install looking glass on your host machine:&#xA;yay -S looking-glass&#xA;&#xA;and then on your VM, Install the Looking Glass Host, which you can obtain from here,&#xA;&#xA;after getting looking glass host started in VM, try connecting it on the host machine by just typing looking-glass.&#xA;&#xA;if you saw the virtual display monitor from here, then congrats. your setup works properly.&#xA;&#xA;looking glass&#xA;&#xA;now, power off your VM, and then set VGA to None. and then start the VM. The console display won&#39;t be visible, then launch Looking Glass on your host machine again.&#xA;&#xA;after you finished configuring the display here, it should look like this now:&#xA;&#xA;looking glass, after configuring&#xA;&#xA;audio enhancement&#xA;&#xA;the default ich9 sound driver suffer through latency issues if got bombarded with a lot of things all at once, especially rhythm games that requires low latency.&#xA;&#xA;we can use scream audio driver here. but do the following first:&#xA;ensure that the network card is virtio, if not, switch to it&#xA;remove ich9 audio card&#xA;&#xA;for arch linux, you can get scream receiver via aur:&#xA;yay -S scream-git&#xA;&#xA;and then just launch the receiver in the background:&#xA;scream -u -i virbr0 -o jack&#xA;&#xA;the command above should be enough for everyday usage. the audio latency is low and is fairly balanced enough for daily usecase.&#xA;&#xA;if you wanna go to the lowest possible latency:&#xA;scream -u -i virbr0 -o raw | pw-cat --playback --format=s32 --rate=48000 --channels=2 --raw --latency 128 -&#xA;&#xA;you may adjust the latency flag value if 128 wasn&#39;t doing well. ensure that the samplerate, channels, and pcm format matches to what you are configuring in the Windows VM.&#xA;&#xA;you can check the latency by checking pw-top.&#xA;&#xA;note: this assumes that your setup is using pipewire.&#xA;&#xA;while it&#39;s chilling in the background, let&#39;s set up the windows driver for it.&#xA;&#xA;first, turn on test mode. open terminal as administrator (right click start -  Terminal (Admin)), run:&#xA;bcdedit /set testsigning on&#xA;&#xA;then restart the vm. You must see [Test Mode] on the bottom-right corner of your wallpaper.&#xA;&#xA;download the non-source zip (Usually named in ScreamX.X.zip) from here, extract it, Navigate to scream folder/Install/driver/x64/ and open terminal as an admin here, then run:&#xA;pnputil /add-driver .\Scream.inf /install&#xA;&#xA;before we finally disable test mode:&#xA;bcdedit /set testsigning off&#xA;&#xA;configure the scream audio driver via registry editor. in this case, it can be done via command line below:&#xA;REG ADD HKLM\SYSTEM\CurrentControlSet\Services\Scream\Options /v UnicastIPv4 /t REGSZ /d &#34;192.168.122.1&#34; /f&#xA;REG ADD HKLM\SYSTEM\CurrentControlSet\Services\Scream\Options /v UnicastPort /t REGDWORD /d 4010 /f&#xA;&#xA;Replace 192.168.122.1 to your local address of your host that&#39;s being assigned by your virtual bridge, eg virbr0.&#xA;&#xA;and then reboot.&#xA;&#xA;caveats&#xA;&#xA;if you only loaded i915 with xe blacklisted, any activities on the host (except the guest) that has involvement of vulkan may start slowly / temporarily stall the entire drm. this can be fixed by trying to use the xe driver instead, however&#xA;xe can get both OpenGL and Vulkan properly, but might stall the entire drm once the vm finished booting&#xA;&#xA;loading both drivers simultaneously does not currently resolve these problems.&#xA;&#xA;if these issues become annoying, consider adding a separate bootloader entry that disables SR-IOV and IOMMU entirely. This allows you to boot into a normal configuration when you don&#39;t plan to run a VM.&#xA;&#xA;extra&#xA;&#xA;my windows 11 VM desktop with task manager&#xA;&#xA;if necessary, you can try debloat your windows VM by using these tools:&#xA;raphire/Win11Debloat to remove most of the bloats&#xA;es3n1n/defendnot to disable windows defender by pretending there&#39;s other antivirus in order to reduce load&#xA;&#xA;cpu usage:&#xA;cpu usage&#xA;&#xA;ram usage:&#xA;ram usage&#xA;&#xA;extra note: if at some point you plan to do gaming here, including low latency gaming, consider attaching your input devices (keyboard, mouse) into your VM via passthrough, as the existing input grabber is meant for a normal workstation purpose.&#xA;&#xA;extra note2: given that you have installed virtio drivers above, switch your VM network card to virtio for best performance.&#xA;&#xA;extra note3: if you&#39;re still overwhelmed by both visual and audio latency even with solutions above, consider using dGPU passing and passing external soundcard into VM instead.&#xA;&#xA;---&#xA;&#xA;if you need to see how the config looks like on the system, you can check on my dotfiles to see what has been configured here and there.&#xA;&#xA;troubleshooting&#xA;&#xA;looking glass suddenly stuck on [The host application seems to not be running]&#xA;&#xA;the VF of your iGPU could have been overwhelmed probably due to multiple reusage (eg, constant reboot, you suspended your laptop while VF is still in effect, etc). to fix this, try reboot your host. if this still didn&#39;t fix the problem, then try reinstalling the intel graphics driver inside the VM.&#xA;&#xA;mouse sensitivity is way too high on looking glass&#xA;&#xA;trying to navigate the display without capturing your mouse will have this kind of behavior by default. enable capture mode by pressing the looking glass&#39;s escape key (the default is scrolllock. you can change this by setting -m KEYKEY when launching looking glass via command line).&#xA;&#xA;error code 43&#xA;&#xA;try disable &#34;memory isolation&#34; in windows security:&#xA;screenshot of windows security on &#34;Memory Isolation&#34; part, disabled&#xA;&#xA;and reboot.&#xA;&#xA;if error 43 still occurs, try check the intel driver. The suggested version is above v32. if it goes below that (especially windows update default, 31), It might not be able to recognize the hw properly, so try reinstall the intel driver and try again.&#xA;&#xA;---&#xA;&#xA;aand that&#39;s it.&#xA;&#xA;for references:&#xA;Looking Glass B7 Installation Documentation&#xA;i915-sriov-dkms docs&#xA;Libvirt: Domain XML Format documentation&#xA;Github: Scream audio driver README&#xA;&#xA;honorable mention: My best friend RionWijaya for informing me with his experiments and then help me a bit&#xA;&#xA;happy VM-ing once again.&#xA;&#xA;p.s.: you can try to apply the same logic if you have a spare dGPU by skipping the intel sr-iov &amp; iommu step]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://media.fedinet.waltuh.cyou/media/65780ee459ab9fb521dcb3c7bdd4313df09fde97768ee42aa5ec1b4fe06f1cb7.png" alt="screenshot of a windows 11 vm guest with gpu hardware acceleration">
<small>screenshot of a windows 11 vm guest with gpu hardware acceleration</small></p>

<p>the first thing that came to my mind when you need to have a gpu passthrough, Often it requires another secondary dedicated graphics card that&#39;s unused by the host. if not that, then paravirtualization solution such as virtualbox/vmware/spice guest tools, or virgl3d.</p>

<p>but then we have <a href="https://github.com/strongtz/i915-sriov-dkms" rel="nofollow">sr-iov</a> which specially targets a intel processor computer that let us create a virtual function (VF) of Intel UHD Graphics iGPU. This lets us to be able to do gpu passthrough to our VM without needing to have it being unused. in this blog, i will talk on how i set this up</p>

<p><strong>disclaimer</strong>: sriov is still considered experimental. things might break here if you&#39;re unlucky, but it shouldn&#39;t be.</p>

<h2 id="setting-up">setting up</h2>

<p>you will need to ensure that the intel processor that you are using is <strong>Gen 9.5 and newer</strong> for the best experience as possible. Ensure that both <strong>VT-x and VT-d</strong> are enabled on the bios settings so you can use IOMMU for hardware passthrough, otherwise you will still limited in paravirtualization.</p>

<p>the operating system that i use at the time of this writing is arch linux. kernel is the default arch kernel. since sriov hasn&#39;t getting mainstreamed yet, so we just install the i915-sriov dkms module via aur:</p>

<pre><code>yay -S i915-sriov-dkms
</code></pre>

<p>or manually install it from source:</p>

<pre><code class="language-bash">git clone --depth=1 https://github.com/strongtz/i915-sriov-dkms
doas dkms add ./i915-sriov-dkms

# install the module
doas dkms install i915-sriov-dkms/2026.05.06

# then rebuild your initramfs
</code></pre>

<p><small>replace <code>2026.05.06</code> with the current version of the module</small></p>

<p>just to make it compatible with other kernel, i will use the dkms variant since it&#39;s easier to maintain and switch kernel back and forth just in case.</p>

<p>for your convenience, please add yourself to <code>kvm</code> group: <code>usermod -aG kvm you</code></p>

<h2 id="kernel">kernel</h2>

<p>continuing, we begin by explicitly making the kernel to enable intel iommu by adding this to the kernel boot param. 1 VFs is generally enough. you can pick which driver you will want to use in between the two:</p>

<p>i915:</p>

<pre><code>intel_iommu=on i915.enable_guc=3 i915.max_vfs=1 module_blacklist=xe
</code></pre>

<p>xe (the new experimental driver. you will need it if you have for like, Intel Arc/Iris):</p>

<pre><code>intel_iommu=on xe.max_vfs=1 xe.force_probe=device-id module_blacklist=i915
</code></pre>

<p><small>You can also try to use xe on iGPU, however given how new this driver is, it might be unstable</small></p>

<p>To get <code>device-id</code>, You can obtain it by executing <code>lspci -nn | grep -i vga</code> and then obtain the 16 bit hexadecimal digit of the iGPU id:</p>

<pre><code>[yonle@yonle ~]$ lspci -nn | grep -i vga
0000:00:02.0 VGA compatible controller [0300]: Intel Corporation Alder Lake-UP3 GT1 [UHD Graphics] [8086:46b3] (rev 0c)
</code></pre>

<p>as you see here, the device id of my iGPU is <code>46b3</code>, which then you will use this for the boot param above and later on.</p>

<p>now reboot, and then check dmesg to see whenever SR-IOV is actually loaded properly:</p>

<pre><code>[yonle@yonle ~]$ doas dmesg | grep -i sriov
[    5.169765] i915: You are using the i915-sriov-dkms module, a ported version of the i915/xe module with SR-IOV support.
[    5.169767] i915: Please file any bug report at https://github.com/strongtz/i915-sriov-dkms/issues/new.
[    5.169768] i915: Module Homepage: https://github.com/strongtz/i915-sriov-dkms
[    5.289502] intel_sriov_compat: loaded
</code></pre>

<p><small>replace “doas” as “sudo” if you use sudo.</small></p>

<p>if you saw <code>intel_sriov_compat: loaded</code>, you&#39;re good to go.</p>

<h2 id="making-the-virtual-function">making the virtual function</h2>

<p>technically, you can manually load it via command line. but for some reason it might give you more works than necessary to get your things working.</p>

<p>so, assuming you&#39;re on arch linux, make a systemd-tmpfiles config specifically to make just 1 vf. edit <code>/etc/tmpfiles.d/i915-set-sriov-numvfs.conf</code>:</p>

<pre><code>#Path                                              Mode UID  GID  Age Argument
#Uncomment the next line and change the argument to the number of VFs you want
w /sys/devices/pci0000:00/0000:00:02.0/sriov_numvfs -    -    -    -   1
</code></pre>

<p>and then, make a udev rules to block vf (except host) to be used as a main by host (eg, your main de/wm). edit <code>/etc/udev/rules.d/99-i915-vf-vfio.rules</code>:</p>

<pre><code>ACTION==&#34;add&#34;, SUBSYSTEM==&#34;pci&#34;, KERNEL==&#34;0000:00:02.1&#34;, ATTR{vendor}==&#34;0x8086&#34;, ATTR{device}==&#34;0x46b3&#34;, DRIVER!=&#34;vfio-pci&#34;, RUN+=&#34;/bin/sh -c &#39;echo \$kernel &gt; /sys/bus/pci/devices/\$kernel/driver/unbind; echo vfio-pci &gt; /sys/bus/pci/devices/\$kernel/driver_override; modprobe vfio-pci; echo \$kernel &gt; /sys/bus/pci/drivers/vfio-pci/bind&#39;&#34;
</code></pre>

<p><strong>note</strong>: replace <code>46b3</code> with your gpu device id that you obtained above.</p>

<p>then, reboot.</p>

<p>you must see 2 iGPU now when running <code>lspci</code> now:</p>

<pre><code>[yonle@yonle module]$ lspci | grep -i vga
0000:00:02.0 VGA compatible controller: Intel Corporation Alder Lake-UP3 GT1 [UHD Graphics] (rev 0c)
0000:00:02.1 VGA compatible controller: Intel Corporation Alder Lake-UP3 GT1 [UHD Graphics] (rev 0c)
</code></pre>

<p><strong>remember</strong>: your guest <strong>must</strong> only use the vf one, in this case, it&#39;s <code>0000:00:02.1</code></p>

<h2 id="kvmfr">kvmfr</h2>

<p>as we&#39;re also going to use <a href="https://looking-glass.io/docs/B7/" rel="nofollow">looking glass</a>, let&#39;s prepare kvmfr for the shared memory.</p>

<p>first, ensure that your kernel header has been installed properly before installing the dkms module.</p>

<h3 id="installing-manually">installing manually</h3>

<p>obtain the source code tarball from <a href="https://github.com/gnif/LookingGlass/releases/tag/B7" rel="nofollow">here</a>, and then extract <code>module</code> folder, and then,</p>

<pre><code>cd module
doas dkms install .
</code></pre>

<p><strong>caution</strong>: you <strong>must</strong> rebuild the DKMS on each kernel update / when you switch to different kernel.</p>

<h3 id="installing-via-aur">installing via AUR</h3>

<pre><code>yay -S looking-glass-module-dkms
</code></pre>

<p>👍</p>

<h3 id="configuring-kvmfr">configuring kvmfr</h3>

<p>you should be able to load kvmfr now:</p>

<pre><code>doas modprobe kvmfr static_size_mb=32
</code></pre>

<p>the looking glass docs has a <a href="https://looking-glass.io/docs/B7/install_libvirt/#libvirt-determining-memory" rel="nofollow">fantastic explanation</a> on how do you determine a shared memory for your DMA, which you should read.</p>

<p>now, let&#39;s make this module gets loaded automatically on boot. First we need to set the default <code>kvmfr</code> load param by editing  <code>/etc/modprobe.d/kvmfr.conf</code>, then putting this:</p>

<pre><code>options kvmfr static_size_mb=32
</code></pre>

<p>then edit <code>/etc/modules-load.d/kvmfr.conf</code> and add this:</p>

<pre><code>kvmfr
</code></pre>

<p>now, we make a udev rule to ensure that the device got a proper permission. edit <code>/etc/udev/rules.d/99-kvmfr.rules</code>:</p>

<pre><code>SUBSYSTEM==&#34;kvmfr&#34;, OWNER=&#34;user&#34;, GROUP=&#34;kvm&#34;, MODE=&#34;0660&#34;
</code></pre>

<p>replace <code>user</code> with your username.</p>

<p>to apply the udev permission immediately, do</p>

<pre><code>doas chown you:kvm /dev/kvmfr0
doas chmod 660 /dev/kvmfr0
</code></pre>

<p>now edit <code>/etc/libvirt/qemu.conf</code>, and uncomment <code>cgroup_device_acl</code> and add <code>/dev/kvm</code> and <code>/dev/kvmfr0</code> in it:</p>

<pre><code>cgroup_device_acl = [
    &#34;/dev/null&#34;, &#34;/dev/full&#34;, &#34;/dev/zero&#34;,
    &#34;/dev/random&#34;, &#34;/dev/urandom&#34;,
    &#34;/dev/ptmx&#34;, &#34;/dev/userfaultfd&#34;,
    &#34;/dev/kvm&#34;, &#34;/dev/kvmfr0&#34;
]
</code></pre>

<p>then restart <code>libvirtd</code> daemon.</p>

<h2 id="make-a-vm">make a vm</h2>

<p>we will use libvirt with virt-manager as the client.</p>

<p>the vm that we will create will be a Microsoft Windows 11 VM.</p>

<p>before you begin your installation, Do a customization first. On <strong>[Overview]</strong>&#39;s XML, Replace the following top:</p>

<pre><code class="language-xml">&lt;domain type=&#34;kvm&#34;&gt;
</code></pre>

<p>with this:</p>

<pre><code class="language-xml">&lt;domain xmlns:qemu=&#34;http://libvirt.org/schemas/domain/qemu/1.0&#34; type=&#34;kvm&#34;&gt;
</code></pre>

<p>and then, add the following inside the <code>&lt;domain&gt;</code> field:</p>

<pre><code class="language-xml">  &lt;qemu:commandline&gt;
    &lt;qemu:arg value=&#34;-device&#34;/&gt;
    &lt;qemu:arg value=&#34;{&#39;driver&#39;:&#39;ivshmem-plain&#39;,&#39;id&#39;:&#39;lg&#39;,&#39;memdev&#39;:&#39;looking-glass&#39;}&#34;/&gt;
    &lt;qemu:arg value=&#34;-object&#34;/&gt;
    &lt;qemu:arg value=&#34;{&#39;qom-type&#39;:&#39;memory-backend-file&#39;,&#39;id&#39;:&#39;looking-glass&#39;,&#39;mem-path&#39;:&#39;/dev/kvmfr0&#39;,&#39;size&#39;:33554432,&#39;share&#39;:true}&#34;/&gt;
  &lt;/qemu:commandline&gt;
</code></pre>

<p>replace <code>33554432</code> with your calculated shared memory.</p>

<p>then, <strong>[Add Hardware]</strong> –&gt; <strong>[PCI Host Device]</strong>, Look for your VF iGPU (from the previous <code>lspci</code>, it must be <code>0000:00:02.1</code>)</p>

<p>remove the existing keyboard and tablet input, and make new inputs for both things with <code>virtio</code> bus in it. Additionally, If there&#39;s “EvTouch” or anything outside of “ps2” and “virtio” inputs, <strong>you may also want to attach it too</strong>.</p>

<p>and then proceed installation with vga as usual until you finished installing the OS with <a href="https://www.intel.com/content/www/us/en/search.html#sortCriteria=@lastmodifieddt%20descending&amp;cf-tabfilter=Downloads&amp;cf-downloadsppth=Graphics" rel="nofollow">Intel Graphics Driver</a> and <a href="https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers" rel="nofollow">Windows Virtio Drivers</a> installed.</p>

<p>Since i&#39;m in Gen 12th alder lake, I installed the ones with version <code>32.0.101.7085</code> as of the time of this writing (or, “Intel® 11th – 14th Gen Processor Graphics – Windows*“).</p>

<p>you should only need to install <strong>Intel Graphics Driver</strong> and that&#39;s all it takes to work. after installation, reboot to ensure that the driver is actually being loaded properly and then check via device manager (right click on the start button and then go from here). it should look like this:</p>

<p><img src="https://media.fedinet.waltuh.cyou/media/b8d7e9c7bce110d0a756a1ff4def0cd0b23f01f786cd04622ce8296fa29b7158.png" alt="device manager">
<small>note: i will guide you on setting up Virtual Display Driver from here</small></p>

<p><strong>until looking glass and VDD has been configured, you must not turn VGA to <code>None</code> until you finished following the steps below</strong></p>

<h2 id="virtual-display-driver-https-github-com-virtualdrivers-virtual-display-driver-tab-readme-ov-file-vdd"><a href="https://github.com/VirtualDrivers/Virtual-Display-Driver?tab=readme-ov-file" rel="nofollow">Virtual Display Driver</a> (VDD)</h2>

<p>usually, you use a dummy HDMI or DP adapter to make GPU start drawing a screen. Since we can&#39;t do that via VF, We basically make a screen of our own here.</p>

<p>open your terminal, and execute</p>

<pre><code>winget install --id=VirtualDrivers.Virtual-Display-Driver -e --source winget
</code></pre>

<p>once succesfully installing it, open new terminal tab, and type</p>

<pre><code>&amp; &#39;VDD Control.exe&#39;
</code></pre>

<p>It will launch new window looking like this:</p>

<p><img src="https://media.fedinet.waltuh.cyou/media/44cb02c675d303cdf61cfca97eda20b5aa3faa728dc51108f31dd16756ad304f.png" alt="virtual display driver window"></p>

<p>Press <strong>[Install Driver]</strong> and proceed driver installation. If succeed, The OS will make an animation as if a secondary monitor has got plugged in.</p>

<h2 id="looking-glass">Looking Glass</h2>

<p>Now, Install looking glass on your host machine:</p>

<pre><code>yay -S looking-glass
</code></pre>

<p>and then on your VM, Install the Looking Glass Host, which you can obtain from <a href="https://looking-glass.io/downloads" rel="nofollow">here</a>,</p>

<p>after getting looking glass host started in VM, try connecting it on the host machine by just typing <code>looking-glass</code>.</p>

<p>if you saw the virtual display monitor from here, then congrats. your setup works properly.</p>

<p><img src="https://media.fedinet.waltuh.cyou/media/89f86a36ad9c8435dedde54f73d2eda1844f8344cea5607a1cb86a8c4a13f56b.png" alt="looking glass"></p>

<p>now, power off your VM, and then set VGA to <code>None</code>. and then start the VM. <strong>The console display won&#39;t be visible</strong>, then launch Looking Glass on your host machine again.</p>

<p>after you finished configuring the display here, it should look like this now:</p>

<p><img src="https://media.fedinet.waltuh.cyou/media/19242d081d01e6b3bb52f616ecfed55c44f8e8d152285f2845ee97c70fffa942.png" alt="looking glass, after configuring"></p>

<h2 id="audio-enhancement">audio enhancement</h2>

<p>the default ich9 sound driver suffer through latency issues if got bombarded with a lot of things all at once, especially rhythm games that requires low latency.</p>

<p>we can use <a href="https://github.com/duncanthrax/scream" rel="nofollow">scream</a> audio driver here. but do the following first:
– ensure that the network card is <code>virtio</code>, if not, switch to it
– <strong>remove ich9 audio card</strong></p>

<p>for arch linux, you can get scream receiver via aur:</p>

<pre><code>yay -S scream-git
</code></pre>

<p>and then just launch the receiver in the background:</p>

<pre><code>scream -u -i virbr0 -o jack
</code></pre>

<p>the command above should be enough for everyday usage. the audio latency is low and is fairly balanced enough for daily usecase.</p>

<p>if you wanna go to the lowest possible latency:</p>

<pre><code>scream -u -i virbr0 -o raw | pw-cat --playback --format=s32 --rate=48000 --channels=2 --raw --latency 128 -
</code></pre>

<p>you may adjust the <code>latency</code> flag value if <code>128</code> wasn&#39;t doing well. <strong>ensure that the samplerate, channels, and pcm format matches to what you are configuring in the Windows VM</strong>.</p>

<p>you can check the latency by checking <code>pw-top</code>.</p>

<p><strong>note</strong>: this assumes that your setup is using pipewire.</p>

<p>while it&#39;s chilling in the background, let&#39;s set up the windows driver for it.</p>

<p>first, turn on test mode. open terminal as administrator (right click start –&gt; Terminal (Admin)), run:</p>

<pre><code>bcdedit /set testsigning on
</code></pre>

<p>then restart the vm. You must see [Test Mode] on the bottom-right corner of your wallpaper.</p>

<p>download the non-source zip (Usually named in <code>ScreamX.X.zip</code>) from <a href="https://github.com/duncanthrax/scream/releases" rel="nofollow">here</a>, extract it, Navigate to <code>&lt;scream folder&gt;/Install/driver/x64/</code> and open terminal as an admin here, then run:</p>

<pre><code>pnputil /add-driver .\Scream.inf /install
</code></pre>

<p>before we finally disable test mode:</p>

<pre><code>bcdedit /set testsigning off
</code></pre>

<p>configure the scream audio driver via registry editor. in this case, it can be done via command line below:</p>

<pre><code>REG ADD HKLM\SYSTEM\CurrentControlSet\Services\Scream\Options /v UnicastIPv4 /t REG_SZ /d &#34;192.168.122.1&#34; /f
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\Scream\Options /v UnicastPort /t REG_DWORD /d 4010 /f
</code></pre>

<p>Replace <code>192.168.122.1</code> to your local address of your host that&#39;s being assigned by your virtual bridge, eg <code>virbr0</code>.</p>

<p>and then reboot.</p>

<h2 id="caveats">caveats</h2>
<ul><li>if you only loaded <code>i915</code> with <code>xe</code> blacklisted, any activities on the host (except the guest) that has involvement of vulkan may start slowly / temporarily stall the entire drm. this can be fixed by trying to use the <code>xe</code> driver instead, however</li>
<li><code>xe</code> can get both OpenGL and Vulkan properly, but might stall the entire drm once the vm finished booting</li></ul>

<p>loading both drivers simultaneously does not currently resolve these problems.</p>

<p>if these issues become annoying, consider adding a separate bootloader entry that disables SR-IOV and IOMMU entirely. This allows you to boot into a normal configuration when you don&#39;t plan to run a VM.</p>

<h2 id="extra">extra</h2>

<p><img src="https://media.fedinet.waltuh.cyou/media/3b01c40f744434fe0f90d6a56ea7f229e65d980ada3f886528078dafcf806734.png" alt="my windows 11 VM desktop with task manager"></p>

<p>if necessary, you can try debloat your windows VM by using these tools:
– <a href="https://github.com/raphire/win11debloat" rel="nofollow">raphire/Win11Debloat</a> to remove most of the bloats
– <a href="https://github.com/es3n1n/defendnot" rel="nofollow">es3n1n/defendnot</a> to disable windows defender by pretending there&#39;s other antivirus in order to reduce load</p>

<p>cpu usage:
<img src="https://media.fedinet.waltuh.cyou/media/0f84a2f56681550bed41b055d8c9d99987386814776a2c85b0c4d626e945f2c3.png" alt="cpu usage"></p>

<p>ram usage:
<img src="https://media.fedinet.waltuh.cyou/media/1941b380f5e5a702d6fbecc3dd58474f0e73a1651430e268821dd736e6347f6b.png" alt="ram usage"></p>

<p><strong>extra note</strong>: if at some point you plan to do gaming here, including low latency gaming, consider <strong>attaching your input devices</strong> (keyboard, mouse) into your VM via passthrough, as the existing input grabber is meant for a normal workstation purpose.</p>

<p><strong>extra note2</strong>: given that you have installed virtio drivers above, switch your VM network card to <code>virtio</code> for best performance.</p>

<p><strong>extra note3</strong>: if you&#39;re still overwhelmed by both visual and audio latency even with solutions above, consider using dGPU passing and passing external soundcard into VM instead.</p>

<hr>

<p>if you need to see how the config looks like on the system, you can check on my <a href="https://codeberg.org/Yonle/dotfiles" rel="nofollow">dotfiles</a> to see what has been configured here and there.</p>

<h2 id="troubleshooting">troubleshooting</h2>

<p><strong>looking glass suddenly stuck on [The host application seems to not be running]</strong></p>

<p>the VF of your iGPU could have been overwhelmed probably due to multiple reusage (eg, constant reboot, you suspended your laptop while VF is still in effect, etc). to fix this, <strong>try reboot your host</strong>. if this still didn&#39;t fix the problem, then try reinstalling the intel graphics driver inside the VM.</p>

<p><strong>mouse sensitivity is way too high on looking glass</strong></p>

<p>trying to navigate the display without capturing your mouse will have this kind of behavior by default. enable capture mode by pressing the looking glass&#39;s escape key (the default is <code>scrolllock</code>. you can change this by setting <code>-m KEY_&lt;KEY&gt;</code> when launching looking glass via command line).</p>

<p><strong>error code 43</strong></p>

<p>try disable “memory isolation” in windows security:
<img src="https://media.fedinet.waltuh.cyou/media/520f86d73c03f9dd636d3c8bf11482b00c98d6a29c5d36de11745b27a1447952.png" alt="screenshot of windows security on &#34;Memory Isolation&#34; part, disabled"></p>

<p>and reboot.</p>

<p>if error 43 still occurs, try check the intel driver. The suggested version is above v32. if it goes below that (especially windows update default, 31), It might not be able to recognize the hw properly, so try reinstall the intel driver and try again.</p>

<hr>

<p>aand that&#39;s it.</p>

<p>for references:
– <a href="https://looking-glass.io/docs/B7/install/" rel="nofollow">Looking Glass B7 Installation Documentation</a>
– <a href="https://github.com/strongtz/i915-sriov-dkms/tree/master/docs" rel="nofollow">i915-sriov-dkms docs</a>
– <a href="https://libvirt.org/formatdomain.html" rel="nofollow">Libvirt: Domain XML Format documentation</a>
– <a href="https://github.com/duncanthrax/scream" rel="nofollow">Github: Scream audio driver README</a></p>

<p><strong>honorable mention</strong>: My best friend <strong>RionWijaya</strong> for informing me with his experiments and then help me a bit</p>

<p>happy VM-ing once again.</p>

<p><strong>p.s.</strong>: you can try to apply the same logic if you have a spare dGPU by skipping the intel sr-iov &amp; iommu step</p>
]]></content:encoded>
      <guid>https://pen.waltuh.cyou/yonle/iommu-with-sr-iov-gpu-accelerated-windows-vm-on-a-linux-laptop-that-has-only</guid>
      <pubDate>Tue, 14 Apr 2026 15:28:05 +0000</pubDate>
    </item>
    <item>
      <title>&#34;Representative&#34;</title>
      <link>https://pen.waltuh.cyou/yonle/representative</link>
      <description>&lt;![CDATA[there are times when i join a group of some sort just to hang out with these folks, literally have zero goal of being their &#34;member&#34; or &#34;part of their goals&#34; or something.&#xA;&#xA;but then i got dragged.&#xA;&#xA;years ago, when some of the people from that group saw me somewhere outside of the platform that i was in to talk to these folks, first thing that happen to me when these folk saw me first is basically,&#xA;&#xA;  are you XXXXXXXX member?&#xA;&#xA;wasn&#39;t once, twice. if you know that was me,&#xA;can you just, not drag that to where i was in&#xA;&#xA;as if i am being the representative of the organization that I literally have zero goal on being participating with? to put on top of that, despite the requirement, i literally never joined or requested for joining their github org.&#xA;&#xA;honestly, it felt like i was being watched. one thing that&#39;s obvious here, i really despise someone who literally take any kind of member to be their organization representative like literal, where if one did bad thing, then they got relentlessly fucked to death to the point they reach out to the irl stuff.&#xA;&#xA;ever since i disconnect myself from that place, it never felt anything better. for one, there&#39;s someone who just realized why i despise a lot of things from them and then afraid of me hating them for eternity. &#34;you just gave me a new lesson&#34;, they say. does their trial and errors is all done for the sake of &#34;lesson&#34; that would be only better to them? the scratch is still on my mind.&#xA;&#xA;i accepted their apologize.&#xA;but i remain despising how it all went.&#xA;&#xA;it&#39;s simply no good.]]&gt;</description>
      <content:encoded><![CDATA[<p>there are times when i join a group of some sort just to hang out with these folks, literally have zero goal of being their “member” or “part of their goals” or something.</p>

<p>but then i got dragged.</p>

<p>years ago, when some of the people from that group saw me somewhere outside of the platform that i was in to talk to these folks, first thing that happen to me when these folk saw me first is basically,</p>

<blockquote><p>are you XXXXXXXX member?</p></blockquote>

<p>wasn&#39;t once, twice. if you know that was me,
can you just, not drag that to where i was in</p>

<p>as if i am being the representative of the organization that I literally have zero goal on being participating with? to put on top of that, despite the requirement, i literally never joined or requested for joining their github org.</p>

<p>honestly, it felt like i was being watched. one thing that&#39;s obvious here, i really despise someone who literally take any kind of member to be their organization representative like literal, where if one did bad thing, then they got relentlessly fucked to death to the point they reach out to the irl stuff.</p>

<p>ever since i disconnect myself from that place, it never felt anything better. for one, there&#39;s someone who just realized why i despise a lot of things from them and then afraid of me hating them for eternity. “you just gave me a new lesson”, they say. does their trial and errors is all done for the sake of “lesson” that would be only better to them? the scratch is still on my mind.</p>

<p>i accepted their apologize.
but i remain despising how it all went.</p>

<p>it&#39;s simply no good.</p>
]]></content:encoded>
      <guid>https://pen.waltuh.cyou/yonle/representative</guid>
      <pubDate>Mon, 13 Apr 2026 15:27:45 +0000</pubDate>
    </item>
    <item>
      <title>College. first year - April 9th 2026</title>
      <link>https://pen.waltuh.cyou/yonle/college</link>
      <description>&lt;![CDATA[College. first year - April 9th 2026&#xA;&#xA;right now just majoring CS in my College. Still on the first year so i don&#39;t expect much or even thinking that i would success on this one.&#xA;&#xA;Simply said, i&#39;m in the college simply just wanna learn new things. If i can&#39;t really finish some of the assignments properly, then so be it.&#xA;&#xA;the first semester score of mine is lower than everyone else compared. quite surprising, but i don&#39;t really mind as i know why that is as it&#39;s mostly all my fault&#xA;&#xA;wish i can be careful on this one.]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="college-first-year-april-9th-2026">College. first year – April 9th 2026</h2>

<p>right now just majoring CS in my College. Still on the first year so i don&#39;t expect much or even thinking that i would success on this one.</p>

<p>Simply said, i&#39;m in the college simply just wanna learn new things. If i can&#39;t really finish some of the assignments properly, then so be it.</p>

<p>the first semester score of mine is lower than everyone else compared. quite surprising, but i don&#39;t really mind as i know why that is as it&#39;s mostly all my fault</p>

<p>wish i can be careful on this one.</p>
]]></content:encoded>
      <guid>https://pen.waltuh.cyou/yonle/college</guid>
      <pubDate>Thu, 09 Apr 2026 07:48:11 +0000</pubDate>
    </item>
    <item>
      <title>short journal: January 13th 2026</title>
      <link>https://pen.waltuh.cyou/yonle/short-journal-january-13th-2026</link>
      <description>&lt;![CDATA[short journal: January 13th 2026&#xA;&#xA;It&#39;s January 13th 2026 as of the time i am writing this.&#xA;&#xA;This year, is different. Now I basically live independently from the previous high school years where i was close with my mom, continuing study by going to a rather simple college. I must be honest here, I did not perform really well and ended up repeating what i did during mid and high school: Ignoring assignments, which now i had a bunch of them stacked which makes me never stop thinking about it.&#xA;&#xA;Since i move to a city, I learned lots of things on my own with the help of various technologies that we basically knew, And also listened to some of my friends about what his past life was, and how he&#39;s doing today, and what he learn from what he experienced, etc.&#xA;&#xA;Meanwhile, I still have no job yet. I do plan to make my own little business with the skills that i have, But i really have zero experience on doing business at all. So it&#39;s between wanting to had a job or making a little business by my own will.&#xA;&#xA;I am still financially funded by my Dad. I do plan to be independent... I actually know many ways to earn it but i am the one who refused to do it... Simply said, I am really stubborn. Quietly stubborn. To be honest, I really need to control myself to be not so picky.&#xA;&#xA;Well, I wish i can get myself a little better and achieve what i am trying to accomplish... But for now it seems impossible.&#xA;&#xA;That&#39;s all from now. Until the next time.&#xA;&#xA;Yonle&#xA;January 13th 2026]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="short-journal-january-13th-2026">short journal: January 13th 2026</h2>

<p>It&#39;s January 13th 2026 as of the time i am writing this.</p>

<p>This year, is different. Now I basically live independently from the previous high school years where i was close with my mom, continuing study by going to a rather simple college. I must be honest here, I did not perform really well and ended up repeating what i did during mid and high school: Ignoring assignments, which now i had a bunch of them stacked which makes me never stop thinking about it.</p>

<p>Since i move to a city, I learned lots of things on my own with the help of various technologies that we basically knew, And also listened to some of my friends about what his past life was, and how he&#39;s doing today, and what he learn from what he experienced, etc.</p>

<p>Meanwhile, I still have no job yet. I do plan to make my own little business with the skills that i have, But i really have zero experience on doing business at all. So it&#39;s between wanting to had a job or making a little business by my own will.</p>

<p>I am still financially funded by my Dad. I do plan to be independent... I actually know many ways to earn it but i am the one who refused to do it... Simply said, I am really stubborn. Quietly stubborn. To be honest, I really need to control myself to be not so picky.</p>

<p>Well, I wish i can get myself a little better and achieve what i am trying to accomplish... But for now it seems impossible.</p>

<p>That&#39;s all from now. Until the next time.</p>

<p>Yonle
January 13th 2026</p>
]]></content:encoded>
      <guid>https://pen.waltuh.cyou/yonle/short-journal-january-13th-2026</guid>
      <pubDate>Sat, 04 Apr 2026 21:17:09 +0000</pubDate>
    </item>
    <item>
      <title>sepucuk pendapat pribadi: thinkpad</title>
      <link>https://pen.waltuh.cyou/yonle/sepucuk-pendapat-pribadi-thinkpad</link>
      <description>&lt;![CDATA[laptop lamaku&#xA;smallfoto: laptop lamaku/small&#xA;&#xA;sebelumnya, saat saya sedang mari laptop untuk menggantikan laptop lamaku yang Pentium T4400, gw ketemu juga sama laptop-laptop ThinkPad, terutama di mall-mall di Batam seperti di Nagoya Hill. Setiap ThinkPad yang ada disini berbeda-beda modelnya, namun setelah ku lihat,&#xA;&#xA;sebenarnya tidak ada satupun laptop yang dijual memiliki spek yang kurang nanggung untuk harga yang sama dengan laptop yang aku pakai saat ini.&#xA;&#xA;rata-rata processor yang dipakai di Thinkpad ini berkisaran i3 sampai i5 yang hanya terbatas pada gen dari 6 sampai 10. Itupun dengan RAMnya kadang nanggung juga speknya tak peduli jika ku pakaikan linux ke laptopnya.&#xA;&#xA;pada akhirnya, aku beli MSI Modern 14 C12MO yang memiliki prosesor i3-1215u (alder lake, gen 12), dengan NVME Phison 256 GB &amp; RAM sekitaran 8 GB. Walaupun RAMnya masih nanggung, namun untuk harga dan pilihan yang ada, kira-kira inilah yang cocok untuk kerjaanku yang dimana lagipula, Gw bukan seorang gamer yang sering ngegame berat.&#xA;&#xA;&#34;[brand] punya masalah engsel&#34;&#xA;&#xA;awalnya kenalan kuliahku infokan bahwa laptop MSI condong rentan sama masalah engsel, namun menurutku ini masalah yang sebenarnya biasa di semua laptop jenis engsel verleher 2. Jadi maupun aku beli yang bermerek ASUS vivobook pun, secara durabilitas sama saja.&#xA;&#xA;pemakaian dengan arch linux sudah lebih dari 6 bulan, dan syukurlah masih awet.&#xA;&#xA;kebetulan, ada orang yang beli laptop asus atau thinkpad karena sparepartnya mudah dicari, namun menurutku,&#xA;&#xA;semakin tua umur sebuah laptop, maka semakin langka pula sebuah sparepart untuk bagian-bagian laptopnya. Merek apapun laptop itu, Sparepartnya tetap sulit dijangkau walaupun stoknya banyak.&#xA;&#xA;framework, walau secara desain memang modular, Secara spesifikasi &amp; modal sebenarnya nanggung. Itu pula belum termasuk biaya bea cukai / pajak dll sebagainya yang dikirim antar benua.&#xA;&#xA;jadinya, laptop apapun itu, sebaiknya dijaga sebaik mungkin apapun mereknya. walau sparepartnya ada, kadang ngeservisnya yang bakalan ribet atau justru nanggung sampai di titik dimana lebih waras menabung untuk menggantikan laptop dengan laptop baru.&#xA;&#xA;---&#xA;&#xA;pokoknya poinku begini: fokus pragmatis dulu. jangan beli gegara gengsi atau branding atau janji-janji segala macem kalau ujung-ujungnya bakalan sama aja kayak hardware lainnya.&#xA;&#xA;---&#xA;&#xA;sepucuk tips sederhana.&#xA;&#xA;jika ada sebuah model sebelahan yang memiliki spek yang 2x lipat lebih besar dengan harga yang 10% lebih mahal daripada opsi yang kamu kejar, lain kali tabunglah untuk mesin itu.&#xA;&#xA;kadang ada kalanya kamu mungkin awalnya agak terganggu sama dompet yang kering, tapi lama kelamaan hasilnya tidak akan mengecewakan. karena sebenarnya, kadang beli yang kecil lebih mengecewakan dan kandang malah merugikan.]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://media.fedinet.waltuh.cyou/media/752330e7eb5bb92e75c328df916ae6c0d9e5f017da499d6d5d620a2136b59009.jpg" alt="laptop lamaku">
<small>foto: laptop lamaku</small></p>

<p>sebelumnya, saat saya sedang mari laptop untuk menggantikan laptop lamaku yang Pentium T4400, gw ketemu juga sama laptop-laptop ThinkPad, terutama di mall-mall di Batam seperti di Nagoya Hill. Setiap ThinkPad yang ada disini berbeda-beda modelnya, namun setelah ku lihat,</p>

<p>sebenarnya tidak ada satupun laptop yang dijual memiliki spek yang kurang nanggung untuk harga yang sama dengan laptop yang aku pakai saat ini.</p>

<p>rata-rata processor yang dipakai di Thinkpad ini berkisaran i3 sampai i5 yang hanya terbatas pada gen dari 6 sampai 10. Itupun dengan RAMnya kadang nanggung juga speknya tak peduli jika ku pakaikan linux ke laptopnya.</p>

<p>pada akhirnya, aku beli MSI Modern 14 C12MO yang memiliki prosesor i3-1215u (alder lake, gen 12), dengan NVME Phison 256 GB &amp; RAM sekitaran 8 GB. Walaupun RAMnya masih nanggung, namun untuk harga dan pilihan yang ada, kira-kira inilah yang cocok untuk kerjaanku yang dimana lagipula, Gw bukan seorang gamer yang sering ngegame berat.</p>

<h2 id="brand-punya-masalah-engsel">“[brand] punya masalah engsel”</h2>

<p>awalnya kenalan kuliahku infokan bahwa laptop MSI condong rentan sama masalah engsel, namun menurutku ini masalah yang sebenarnya biasa di semua laptop jenis engsel verleher 2. Jadi maupun aku beli yang bermerek ASUS vivobook pun, secara durabilitas sama saja.</p>

<p>pemakaian dengan arch linux sudah lebih dari 6 bulan, dan syukurlah masih awet.</p>

<p>kebetulan, ada orang yang beli laptop asus atau thinkpad karena sparepartnya mudah dicari, namun menurutku,</p>

<p>semakin tua umur sebuah laptop, maka semakin langka pula sebuah sparepart untuk bagian-bagian laptopnya. Merek apapun laptop itu, Sparepartnya tetap sulit dijangkau walaupun stoknya banyak.</p>

<p>framework, walau secara desain memang modular, Secara spesifikasi &amp; modal sebenarnya nanggung. Itu pula belum termasuk biaya bea cukai / pajak dll sebagainya yang dikirim antar benua.</p>

<p>jadinya, laptop apapun itu, sebaiknya dijaga sebaik mungkin apapun mereknya. walau sparepartnya ada, kadang ngeservisnya yang bakalan ribet atau justru nanggung sampai di titik dimana lebih waras menabung untuk menggantikan laptop dengan laptop baru.</p>

<hr>

<p>pokoknya poinku begini: fokus pragmatis dulu. jangan beli gegara gengsi atau branding atau janji-janji segala macem kalau ujung-ujungnya bakalan sama aja kayak hardware lainnya.</p>

<hr>

<h2 id="sepucuk-tips-sederhana">sepucuk tips sederhana.</h2>

<p>jika ada sebuah model sebelahan yang memiliki spek yang 2x lipat lebih besar dengan harga yang 10% lebih mahal daripada opsi yang kamu kejar, lain kali tabunglah untuk mesin itu.</p>

<p>kadang ada kalanya kamu mungkin awalnya agak terganggu sama dompet yang kering, tapi lama kelamaan hasilnya tidak akan mengecewakan. karena sebenarnya, kadang beli yang kecil lebih mengecewakan dan kandang malah merugikan.</p>
]]></content:encoded>
      <guid>https://pen.waltuh.cyou/yonle/sepucuk-pendapat-pribadi-thinkpad</guid>
      <pubDate>Tue, 31 Mar 2026 15:44:59 +0000</pubDate>
    </item>
  </channel>
</rss>