{"@attributes":{"version":"2.0"},"channel":{"title":"goos.blog","link":"http:\/\/goos.blog\/","description":"goos.blog","generator":"Hugo -- gohugo.io","language":"en-us","lastBuildDate":"Sun, 31 Aug 2025 00:00:00 +0000","item":[{"title":"Cisco 1572 series wifi APs","link":"http:\/\/goos.blog\/2025\/08\/outdoor-aps\/","pubDate":"Sun, 31 Aug 2025 00:00:00 +0000","guid":"http:\/\/goos.blog\/2025\/08\/outdoor-aps\/","description":"<h4 id=\"protip-to-oems-make-your-ca-last-for-40-years\" ><em>protip to oems: make your ca last for 40 years<\/em>\n<span>\n<a href=\"#protip-to-oems-make-your-ca-last-for-40-years\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>I recently acquired four cisco 1572EAC wifi APs for uh&hellip;. like 40$ a radio.<\/p>\n<p>I run a cisco 9800-CL vWLC at home for my wifi. The existing APs in my infra are a mix of 2802i and 3802i&rsquo;s, and on WLC version 17.16.01 they work just fine.\nAdding new APs has literally been as simple as adding the s\/n to the allow list and plugging the AP into a switchport.<\/p>\n<p>Until I got these 1572&rsquo;s.<\/p>\n<p>They refused to join with the message &ldquo;AP Auth Failed&rdquo;.<\/p>\n<p>Given that these were &ldquo;new open box&rdquo; i figured they had ancient firmware on them, and I was right.<\/p>\n<p>tl;dr they were failing to join because of this issue:<\/p>\n<p><a href=\"https:\/\/www.cisco.com\/c\/en\/us\/support\/docs\/field-notices\/639\/fn63942.html\">Field Notice: FN63942 Cisco Wireless Lightweight Access Points and WLAN Controllers Fail to Create CAPWAP Connections Due to Certificate Expiration<\/a><\/p>\n<p>The link title really says it all. Certs were baked into the firmware at manufacturing time, and they&rsquo;ve since expired.\nIf a radio was kept up to date over the years, it wouldn&rsquo;t be an issue. BUT. Mine weren&rsquo;t.<\/p>\n<p>The official solution to this is to just ratchet back the clock on the WLC to sometime before December 2022.<\/p>\n<p>Naturally, this doesn&rsquo;t work.<\/p>\n<p>My next option is to tftp in <a href=\"https:\/\/software.cisco.com\/download\/home\/286283419\/type\/280775090\/release\/15.3.3-JPT3?i=!pp\">newer firmware<\/a> that has newer certs. Having done many a switch in my day, I feel confident.<\/p>\n<p>Out comes the serial cable and I reach for my knockoff Knipex to crack open the console port cover plug.<\/p>\n<p>I plug &rsquo;er in and uh&hellip;&hellip; how do you update a cisco lwap from tftp again?? There&rsquo;s no copy command, no archive command, nothing???<\/p>\n<p>A google turned up this: <code>debug capwap console cli<\/code> which enabled a lot of the cli commands I&rsquo;m used to.<\/p>\n<p>HOWEVER. Even though I could ping my tftp server (which was on the same L2 domain as the radio), I couldn&rsquo;t actually tftp files from it. Even after setting <code>ip tftp source-interface<\/code> and stuff. Weirdness.<\/p>\n<p>I remembered that modern Cisco bootloaders have tftp support too. I decided to try that.<\/p>\n<p>A few googles and some frustration later and I had this working set of commands:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># Interrupt boot at bootloader with BREAK signal (delete on macos using screen)<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>set IP_ADDR 192.168.20.250\n<\/span><\/span><span style=\"display:flex;\"><span>set NETMASK 255.255.255.0\n<\/span><\/span><span style=\"display:flex;\"><span>set DEFAULT_ROUTER 192.168.20.1\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>tftp_init\n<\/span><\/span><span style=\"display:flex;\"><span>ether_init\n<\/span><\/span><span style=\"display:flex;\"><span>flash_init\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>format flash:\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>tar -xtract tftp:\/\/192.168.20.254\/c1570-k9w8-tar.153-3.JPT3.tar flash:\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>set BOOT flash:\/c1570-k9w8-tar.153-3.JPT3\/c1570-k9w8-tar.153-3.JPT3\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>unset IP_ADDR\n<\/span><\/span><span style=\"display:flex;\"><span>unset NETMASK\n<\/span><\/span><span style=\"display:flex;\"><span>unset DEFAULT_ROUTER\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>boot\n<\/span><\/span><\/code><\/pre><\/div><p>This worked, and worked well. The APs came up and joined the controller.<\/p>\n<p>I&rsquo;d hate to think about what I&rsquo;d do if I had hundreds of these things though&hellip;&hellip;.<\/p>"},{"title":"Changing the ipv6 pools on a rke2 k8s cluster","link":"http:\/\/goos.blog\/2025\/08\/a-new-address\/","pubDate":"Sat, 23 Aug 2025 00:00:00 -0400","guid":"http:\/\/goos.blog\/2025\/08\/a-new-address\/","description":"<h4 id=\"theres-no-place-like-1\" ><em>there&rsquo;s no place like ::1<\/em>\n<span>\n<a href=\"#theres-no-place-like-1\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>A short one today to get me back into it:<\/p>\n<p>As part of my rework of my home network and various services, I&rsquo;ve been moving more and more things into various k8s clusters. <br>\nI started this process by re-using <code>fd16:feed:f00d::\/64<\/code> as the pod network in a few different clusters. <br>\nNow that I&rsquo;ve decided to use <code>fd00::\/8<\/code> for LAN as well, I decided to give these clusters different subnets - I might want to do weird mesh networking in the future<\/p>\n<p>I started with the cluster that backs <code>auth.thegoos.cloud<\/code>, my Authentik instance. A quick few googles showed that the general process for this was to:<\/p>\n<ul>\n<li>Update <code>\/etc\/rancher\/rke2\/config.yaml<\/code> with the new subnets<\/li>\n<li>Update the CNI config with the new subnets (Cilium in this case)<\/li>\n<li>Purge and re-add nodes to the cluster one at a time<\/li>\n<\/ul>\n<p>The first point was ezpz. Update a vars file and re-run some ansible. Working for a cloud provider is teaching me good habits and I like it.<\/p>\n<p>The second point was easy enough too. Cilium in multi-pool mode has a CR for each pool - I simply edited the <code>default<\/code> one to suit.<\/p>\n<p>This last point surfaced itself as kube-controller-manager failing to start, complaining that the node configured cidr didn&rsquo;t fall within the cluster cidr. <br>\nI tried to just <code>kubectl edit node thenode<\/code> and change the cidr, but the k8s api rejected any changes to this field that I tried.<\/p>\n<p>So. I just purged and re-added the nodes, juggling dns entires so <code>rke2-server.chi.auth.thegoos.cloud<\/code> always pointed at a live member.<\/p>\n<p>All that remained to do was kick a few pods that had gone into crashloopbackoff state, and I was done.<\/p>"},{"title":"I'm not dead (yet)","link":"http:\/\/goos.blog\/2025\/08\/im-not-dead\/","pubDate":"Fri, 22 Aug 2025 00:00:00 -0400","guid":"http:\/\/goos.blog\/2025\/08\/im-not-dead\/","description":"<h4 id=\"fizz-buzz-fizzbuzz\" ><em>fizz. buzz. fizzbuzz.<\/em>\n<span>\n<a href=\"#fizz-buzz-fizzbuzz\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>So. It&rsquo;s been a while since I had this repo open. Here I am again though. I never truly left you, loyal reader.<\/p>\n<p>I&rsquo;ve been busy. I bought a CVPI and kinda-crashed the Miata, I survived another winter, I moved back to the homeland.<\/p>\n<p>Now that things have settled out a bit, I want to get back to this. Stay tuned.<\/p>\n<p>- honk<\/p>"},{"title":"Starting over","link":"http:\/\/goos.blog\/2024\/05\/telinit-6\/","pubDate":"Sun, 05 May 2024 00:00:00 -0400","guid":"http:\/\/goos.blog\/2024\/05\/telinit-6\/","description":"<h4 id=\"i-got-a-job\" ><em>I got a job!<\/em>\n<span>\n<a href=\"#i-got-a-job\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>Hello loyal readers. I haven&rsquo;t been writing much here lately,\nbut then to be fair I haven&rsquo;t been doing any cool nerd shit lately.<\/p>\n<p>Back in August of &lsquo;23 I finally got a new job, for a staffing agency, working for a big name cloud provider.\nIn November they converted me into a real boy, and I haven&rsquo;t looked back.<\/p>\n<p>Getting back into the swing of things took a while. But here I am again.<\/p>\n<p>I&rsquo;m doing nerd shit again. I&rsquo;m planning a complete overhaul of my home network and all services I provide out of my closet.<\/p>\n<p>Expect a bunch of posts about that. I ordered a trio of Lenovo P330 Tiny boxen, and I&rsquo;m planning on some wacky things with k8s, kubevirt, and opnsense (maybe involving sr-iov). Stay tuned.<\/p>"},{"title":"The Chromebook `Kevin`","link":"http:\/\/goos.blog\/2023\/10\/chromebook-kevin\/","pubDate":"Sat, 14 Oct 2023 00:00:00 -0400","guid":"http:\/\/goos.blog\/2023\/10\/chromebook-kevin\/","description":"<h4 id=\"the-aarch64-obsession-continues\" ><em>the aarch64 obsession continues<\/em>\n<span>\n<a href=\"#the-aarch64-obsession-continues\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p><em>Disclaimer: I wrote most of this about a month after the fact, and am just finishing it up now several months after the initial draft. Details have been forgotten to prevent the innocent.<\/em><\/p>\n<p>Almost a year ago I picked up a samsung chromebook plus v1 (or something like that), hardware codename <code>gru-kevin<\/code><\/p>\n<p>It has a really nice highdpi square-ish screen, good battery life, usb-c&hellip; what more do you need?<\/p>\n<p>I gave chromeos a fair try, and it was kinda nice.<\/p>\n<p>Fair number of complaints though:<\/p>\n<ul>\n<li>Running a full ass vm just for a linux env is ugly and slow on the rk3399 inside <code>kevin<\/code> <br>\n(that&rsquo;s right, our old friend from rockchip is back)<\/li>\n<li>The current state of chromebrew on aarch64 is kinda gross (on top of the existing grossness of chromebrew to begin with)<\/li>\n<li>General google-ness of the device overall (probably the biggest yuck of them all)<\/li>\n<\/ul>\n<h2 id=\"goodbye-chromeos\" >goodbye chromeos\n<span>\n<a href=\"#goodbye-chromeos\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>So, as I&rsquo;m sure you guessed, I decided to put a normal linux on it. <br>\nA good amount of googling lead me to\n<a href=\"https:\/\/github.com\/Maccraft123\/Cadmium\">Cadmium<\/a>, a set of image building tools for aarch64 chromebooks. <br>\nActual :shock:, kevin is on the support list!<\/p>\n<p>I cloned the repo and started poking at it. <br>\nThere hadn&rsquo;t been a release in a few years, and autobuilds were broken.\nIt didn&rsquo;t look good but it was a starting point so I dove in.\nA few hours of pain later and I had an image of the right size and shape.<\/p>\n<p>Would it boot? I dd&rsquo;d it over to a thumbdrive, ready to give it a try.\nBut first I had to enable developer mode in chromeos so I could boot from usb in the first place.<\/p>\n<p>A few incantations later, my laptop was making a (very) loud BOOP BOOP at startup and showed a very scary looking warning screen saying the firmware was unlocked. I guess whatever I did worked.<\/p>\n<p>A few attempts at catching the <code>^d<\/code> usb boot trigger later and I&rsquo;m at a login screen.<\/p>\n<p>Some dd to copy the kernel and rootfs partitions from the thumbdrive to the emmc and I have a persistent ubuntu to boot to.<\/p>\n<p>I installed the ubuntu-desktop metapackage, logged in, setup my stuff. It all worked, but it was pretty slow. Still though. ARM64 laptop!<\/p>\n<h2 id=\"please-make-it-stop\" >please make it stop\n<span>\n<a href=\"#please-make-it-stop\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>There were a few annoyances though, listed here in descending order&hellip;<\/p>\n<ol>\n<li>That BOOP BOOP at startup. I cannot stress just how loud this was.<\/li>\n<li>The fact that it still ran a google built firmware<\/li>\n<li>The microsd card slot didn&rsquo;t work (with chromebook firmware in dev mode it&rsquo;s a jtag)<\/li>\n<li>The weird A+B chromeos partition layout that I had to conform to<\/li>\n<\/ol>\n<p>So. What can we do about that. The sdcard slot not working smells like a device tree issue. The rest of it I&rsquo;m not yet sure if I can even address&hellip;<\/p>\n<p>First though. I&rsquo;ve run through cadmium&rsquo;s build process a few times now, and it&rsquo;s&hellip;. annoying. No offense. We all just like to do things our own way I guess.<\/p>\n<p>So, naturally, I did. A medium amount of bash scripting later lead to the birth of <a href=\"https:\/\/github.com\/potassium-os\/potassium\">Potassium-OS<\/a>.\nThis allowed me to break the build into better segmented stages.\nWith this tooling in hand I was able to easily rebuild just the device tree and kernel, or just the rootfs, or both.<\/p>\n<p>Some amount of messing with the device tree later and I didn&rsquo;t have the sdcard slot working yet. Bummer, as I had visions of storing multiple different os builds on different sdcards, and switching between them at will. At some point I read a mailing list or commit message or something that mentioned that the sdcard slot on kevin is converted into a jtag of some sort when some bit is set in the eeprom. These feature bits are programmed by the firmware, and while I can read them from the os, trying to edit them doesn&rsquo;t do anything.<\/p>\n<p>I resigned myself to having a mostly-working aarch64 laptop.<br>\nCool enough for me, right?<\/p>\n<h2 id=\"never-good-enough\" >never good enough\n<span>\n<a href=\"#never-good-enough\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Nah.<\/p>\n<p>I wasn&rsquo;t going to give up until at least item 1 from above was gone.\nWasn&rsquo;t sure how to approach this, I did load up the google firmware in a hex editor to see&hellip;. nothing. I can&rsquo;t really operate on that low a level.<\/p>\n<p>Then I remembered that coreboot\/libreboot\/etc is a thing, especially for chromebooks. However all their attention in the past had been focused on x86 support, and I&rsquo;m over here with a &ldquo;rare&rdquo; aarch64 device. <br>\nNo chance libreboot is gonna support this.<\/p>\n<p>Right?<\/p>\n<p>It turns out that libreboot had <em><strong>just<\/strong><\/em> merged one of their forks back in. A fork that was focused on adding aarch64 support to libreboot. I can&rsquo;t find the news post as of this writing, but it had happened like a week before I got the laptop and started on this adventure.<\/p>\n<p>It was&hellip; shockingly easy to get libreboot built for <code>gru-kevin<\/code>. <br>\nThe board configs were already there. I just tweaked a few small things to suit my preferences, typed make, and was given a binary blob to flash.<\/p>\n<h2 id=\"adventures-in-spi\" >adventures in spi\n<span>\n<a href=\"#adventures-in-spi\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Fun fact, (most) chromebooks have a firmware write protect screw. Remove the screw, and you can flash the firmware from inside the running os. Pretty cool, right?<\/p>\n<p>Except&hellip;. where is it? There&rsquo;s no WP screw visible on the top side of the board, even though the actual flash chip is right there:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2023\/10\/chromebook-kevin\/IMG_3759.jpeg\" alt=\"gru-kevin firmware spi flash\"><\/p>\n<blockquote>\n<p>There it is, now if only I could write to it<\/p>\n<\/blockquote>\n<p>A few dozen googles lead me to a mailing list thread where someone mentioned that the WP screw is <em><strong>UNDER THE HEATSINK<\/strong><\/em> on the gru-kevin mainboard.<\/p>\n<p>Normally this would be acceptable. Except that on kevin, the heatsink is riveted in place. It&rsquo;s not coming off without an amount of effort I&rsquo;m not going to put into it.<\/p>\n<blockquote>\n<blockquote>\n<p>EDIT 2024.07.03: a more adventurous reader pulled the board out of their kevin,\nand discovered that the heatsink is in fact screwed on from the other side, making it easy to remove.<\/p>\n<\/blockquote>\n<\/blockquote>\n<p>So I looked into manually flashing the spi bios chip guy. It wasn&rsquo;t actually that difficult or scary of a process, despite what the internet tells you. You&rsquo;re just flashing a spi chip. That&rsquo;s all.<\/p>\n<p>First I read the firmware inband from inside the os. About 10 times. And I sha256&rsquo;d each copy to make sure they were all the same. AND remembered to copy it elsewhere. Then I dug through the parts bin and found a chip clip for our soic-8 spi flash friend. <br>\nI thought about using an arduino as a flasher (I had in the past for a parallel access flash chip) until I remembered that raspberry pi&rsquo;s are a thing and they have spi lanes and gpio as well. Way easier.<\/p>\n<p>A quick check of the pinout and some soldering\/crimping later and I had this kinda thing happening:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2023\/10\/chromebook-kevin\/IMG_3811.jpeg\" alt=\"a raspberry pi setup as a spi flasher hooked up to a gru-kevin mainboard\"><\/p>\n<blockquote>\n<p>Peep that brains:battery ratio tho<\/p>\n<\/blockquote>\n<p>As of this writing I neither remember what software I used to flash or where that flasher assembly is, RIP. I feel like I wrote a small wrapper to set CS and WE on the spi chip properly before\/after flashing.<\/p>\n<p>The first flashing was exciting but uneventful. I read in the flash a few times, shasum&rsquo;ed it against the blobs I had pulled from inband, they matched. I type the incantation to flash the chip, and it flashes. I read it back again, and it shasums to the same as my libreboot output.<\/p>\n<p>Woohoo!<\/p>\n<p>I plug the battery back in and hit the power button. <br>\nA few seconds pass and I see the kernel startup. <br>\nNo BOOP BOOP this time! No scary big red box on the screen!<\/p>\n<h2 id=\"make-it-modern\" >make it modern\n<span>\n<a href=\"#make-it-modern\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>That wasn&rsquo;t enough though.<\/p>\n<p>My sdcard slot still wasn&rsquo;t working, and I still had to stick to the chromeos 2-kernel-1-rootfs layout.<\/p>\n<p>Turns out that libreboot was shipping this sorta setup for my firmware:<\/p>\n<ul>\n<li>coreboot as 1st stage<\/li>\n<li>uboot as a payload of coreboot<\/li>\n<li>uboot was configured to boot a chromeos partition layout<\/li>\n<\/ul>\n<p>So. It&rsquo;s u-boot. I know how to configure that. <br>\nA few menuconfigs and flashes and &ldquo;why u no boot&rdquo;&rsquo;s later, and I had u-boot providing a uefi enviroment that then booted an efi kernel stub (although I could have used grub2 or similar).<\/p>\n<p>Somewhere in this the sdcard slot started working. Either right when I flashed libreboot the first time (which could have disabled the dev-mode that exposed jtag pins on that socket, as that was being enabled by chromeos firmware in dev mode), or somewhere in u-boot\/coreboot configuration I saw the option to disable the jtag on it. Either way my sdcard slot was working.<\/p>\n<p>At this point I had what equated to any other laptop with modern firmware.\nI didn&rsquo;t have a boot menu yet as I hadn&rsquo;t taken the time to set one up in u-boot. But I could boot from emmc, usb, sdcard, even usb nic pxe.<\/p>\n<h2 id=\"next-steps-further-annoyances\" >next steps, further annoyances\n<span>\n<a href=\"#next-steps-further-annoyances\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Now that we can boot reliably and in a modern way, let&rsquo;s fix up some of the annoyances in lolbuntu. Wayland was remarkably stable, more stable than x11 on this hardware even! However, fractional scaling made the gpu hurt, bad. Anything graphically intensive ran at slideshow speeds. <br>\nThis kinda sucked, as I had really hoped to use this as a notes-taking tablet most of the time. Another use case was tuning the megasquirt in my na6. While it has enough stronk to run tunerstudio, the update rate on the gauges and datalogging was horrible. Maybe 5 frames per second. Not nearly enough.<\/p>\n<p>Kevin was plenty for light laptopping but not quite enough for what I wanted here.<\/p>\n<h2 id=\"can-you-close-for-me\" >can you close for me\n<span>\n<a href=\"#can-you-close-for-me\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>I&rsquo;ll be honest, <code>kevin<\/code> has been turned back into a chromebook and given to my parents.<\/p>\n<p>I ended up buying another aarch64 laptop (Samsung galaxy book go 5G), this one has a Qualcomm 8cx gen2 in it.<\/p>\n<p>Quite a step up from the rk3399 in kevin. It&rsquo;s still running samsung firmware (which does provide a uefi) and windows 11 (yuck), but that might change soon.<\/p>\n<p>What will I do with Potassium now? I think I&rsquo;ll clean up the repos, get my libreboot changes into a repo, fix up uboot to be more friendly, and then archive it all.<\/p>\n<p>I think in the future I&rsquo;ll use that org for other aarch64 things, so keep an eye on it for fun things to come.<\/p>"},{"title":"I'm doing Science and I'm still alive","link":"http:\/\/goos.blog\/2023\/06\/still-alive\/","pubDate":"Sun, 18 Jun 2023 00:00:00 -0400","guid":"http:\/\/goos.blog\/2023\/06\/still-alive\/","description":"<h4 id=\"i-really-need-a-new-dayjob\" ><em>I really need a new dayjob<\/em>\n<span>\n<a href=\"#i-really-need-a-new-dayjob\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>Don&rsquo;t worry, loyal blag-o-blag readers. <br>\nI haven&rsquo;t forgotten about you.<\/p>\n<p>I&rsquo;ve just been. Not busy. Not not-busy. In busy limbo, I guess.<\/p>\n<p>The na6 is running great and I&rsquo;ve been installing all the dumb mods that you do to a miata:<\/p>\n<ul>\n<li>coolant reroute<\/li>\n<li>oil filter relocate<\/li>\n<li>clutch line<\/li>\n<li>brake lines<\/li>\n<\/ul>\n<p>Both boats sit in the same place they started winter in. <br>\nPretty sad, they&rsquo;re going to get some love soon hopefully.<\/p>\n<p>The job search has begun in earnest. The resume canon has been fired several times now. If you&rsquo;re looking for a nerd to hire, drop me a line.<\/p>\n<p>I&rsquo;m writing blog posts again. <br>\nI&rsquo;m finishing up one about that chromebook I bought, and I have a few others started.<\/p>\n<p>Stay tuned, point your rss reader <a href=\"https:\/\/goos.blog\/index.xml\">here<\/a>, and keep an eye on the skies.<\/p>"},{"title":"systemctl status goos.service","link":"http:\/\/goos.blog\/2022\/11\/systemctl-status\/","pubDate":"Sat, 26 Nov 2022 00:00:00 -0400","guid":"http:\/\/goos.blog\/2022\/11\/systemctl-status\/","description":"<h4 id=\"dont-quit-your-dayjob\" ><em>don&rsquo;t quit your dayjob<\/em>\n<span>\n<a href=\"#dont-quit-your-dayjob\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>Some updates:<\/p>\n<ul>\n<li>I bought a 93 Miata, and was able to drive it for all of two weeks before the snow hit<\/li>\n<li>I orderd an android based head unit for either the ranger or the miata<\/li>\n<li>I bought hardware for a BLE app-drive camera shutter release \/ intervalometer<\/li>\n<li>I was given a 2nd gen iPad to use for MagicMirror and had to do some fun things to get it working<\/li>\n<li>I bought a chromebook, codename <code>kevin<\/code>, and am writing build tools for it\n<ul>\n<li>Yes, Cadmium exists, and yes I did use it to build a working ubuntu image<\/li>\n<\/ul>\n<\/li>\n<li>I&rsquo;m weeks if not days away from quitting my dayjob\n<ul>\n<li>I plan to take some time away from having a dayjob to work on projects<\/li>\n<li>I have 1099 work to keep me solvent for now<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>tl;dw life goes on. Stay tuned, subscribe via RSS, etc.<\/p>"},{"title":"OPNsense on the NanoPi R4SE","link":"http:\/\/goos.blog\/2022\/09\/opnsense-nanopi-r4se\/","pubDate":"Sun, 25 Sep 2022 00:00:00 -0400","guid":"http:\/\/goos.blog\/2022\/09\/opnsense-nanopi-r4se\/","description":"<h4 id=\"tldr-s0x820000000x83000000-but-not-really\" ><em>tl;dr s\/0x82000000\/0x83000000&hellip; but not really<\/em>\n<span>\n<a href=\"#tldr-s0x820000000x83000000-but-not-really\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>As I write this, I&rsquo;m \/still\/ (48hr and counting) waiting for a freebsd\/opnsense build to finish. <br>\nI&rsquo;m not sure what it&rsquo;s doing, looks like it&rsquo;s building every damn package in the ports tree. <br>\nI&rsquo;m impatient, so while we&rsquo;re waiting for that to cook (I hope it caches them for later use), let&rsquo;s get someone elses opnsense image working!<\/p>\n<h2 id=\"first-attempts\" >first attempts\n<span>\n<a href=\"#first-attempts\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>A good amount of google brought me to the <a href=\"https:\/\/opensource.rock-chips.com\/wiki_Partitions\">rockchip partition table info<\/a> which gave me the typical offsets that prebuilt images would look for. <br>\n<a href=\"https:\/\/opensource.rock-chips.com\/wiki_Boot_option\">This page<\/a> helped as well.<\/p>\n<p>I knew that I&rsquo;d need a different DTB for this board to get emmc working. I figured the boards were similar enough that I could just copy the one for the R4S, change the model strings to match the new board, and rm the &ldquo;disable emmc&rdquo; section.<\/p>\n<p>Spoiler alert&hellip; This almost worked.<\/p>\n<h2 id=\"a-shot-in-the-dark\" >a shot in the dark\n<span>\n<a href=\"#a-shot-in-the-dark\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>I don&rsquo;t remember how many combinations and permutations of partition layout, vendor uboot vs freebsd uboot, trying to load in my own dtb via the freebsd bootloader shell, etc screwball things I tried. <br>\nAt one point I was combining the uboot provided by friendlyelec alongside the openwrt image with an opnsense 22.1.10 image. <br>\nThis got me into useland but there were other issues - if I let it go all the way to freebsd&rsquo;s multiuser runlevel it would kernel panic when the &ldquo;device manager&rdquo; was started. <br>\nI could boot into singleuser mode without a panic but eth1 was missing. <br>\nI dove into friendlyelec&rsquo;s horribly disorganized sources looking for the dts for the r4se. Didn&rsquo;t find it anywhere. <br>\n<del>If you&rsquo;re able to find the one they use, send me an email.<\/del> nvm I found it <br>\nI eventually found and started using <a href=\"https:\/\/raw.githubusercontent.com\/DHDAXCW\/lede-rockchip\/22da83e80131a9883714f747e13b6f4d4cc343c9\/package\/boot\/uboot-rockchip\/src\/arch\/arm\/dts\/rk3399-nanopi-r4se.dts\">this dts<\/a>, but it hasn&rsquo;t gotten me any further.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/09\/opnsense-nanopi-r4se\/rkdevtool.PNG\" alt=\"rkdevtool screenshot\"><\/p>\n<p>Gah.<\/p>\n<h2 id=\"do-the-easy-things-last\" >do the easy things last\n<span>\n<a href=\"#do-the-easy-things-last\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>I spent way too much time trying lots of stupid things before i finally just did <code>git clone uboot<\/code>. <br>\nI got further and learned more in the hour after that than the 6 before.<\/p>\n<p>After poking around the uboot sources I had a shaky grasp on how things worked. <br>\nI copied in my dtb and hit the build button. <br>\nAfter gcc did its thing and copying the output to my rkdevtool directory, I hit the maskrom button for what feels like the 10000000th time today. <br>\nA few minutes later and I&rsquo;m back into singleuser mode, this time without having to shuffle baudrates 4 times and manually load the dtb at the loader prompt.<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">root@:\/ # dmesg | grep pci\nrk_pcie_phy0: &lt;Rockchip RK3399 PCIe PHY&gt; mem 0-0xff76ffff,0-0xffff on rk_grf1\npcib0: &lt;Rockchip PCIe controller&gt; mem 0xf8000000-0xf9ffffff,0xfd000000-0xfdffffff irq 6,7,8 on ofwbus0\npcib0: At least memory range should be defined in DT.\ndevice_attach: pcib0 attach returned 6\n<\/code><\/pre><blockquote>\n<p>sussy af. someone go hit the emergency meeting button<\/p>\n<\/blockquote>\n<p>2am. Time to make this a tomorrow thing.<\/p>\n<p>After figuring out the freebsd equiv of <code>lsmod<\/code> (it&rsquo;s <code>kldstat<\/code>), I noticed that the re module wasn&rsquo;t even loaded. Device won&rsquo;t show up if the kmod isn&rsquo;t there, derp. <br>\nAnother trip through the workflow to get a force load added to loader.conf and&hellip;.<\/p>\n<p>It still panic&rsquo;ed. But. BUT. Different error!<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">Launching the init system...done.\nInitializing...........done.\nStarting device manager...Fatal data abort:\nx0: 0\nx1: ffffa00006358580\nx2: 3\nx3: ffff0000d994f650 (re_netmap_txsync.__cnt + d866d4dc)\nx4: ffff0000d994f5d8 (re_netmap_txsync.__cnt + d866d464)\nx5: 0\nx6: 0\nx7: ffff0000d994faa0 (re_netmap_txsync.__cnt + d866d92c)\n&lt;snip&gt;\n<\/code><\/pre><p>Before it was a generic vmem abort. Now I have some confirmation that it is indeed the pcie nic causing issues. <br>\nI went digging into the friendlyelec uboot repo. It \/had\/ to be a device tree fuckup. <br>\nFinally, after checking 4 different branches, I found the vendor dtb sources.<\/p>\n<h2 id=\"well-defined-spaghetti\" >well-defined spaghetti\n<span>\n<a href=\"#well-defined-spaghetti\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Immediately I found my smoking gun (I thought&hellip;):<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">&amp;pcie0 {\nmax-link-speed = &lt;1&gt;;\nnum-lanes = &lt;1&gt;;\nvpcie3v3-supply = &lt;&amp;vcc3v3_sys&gt;;\npcie@0 {\nreg = &lt;0x00000000 0 0 0 0&gt;;\n#address-cells = &lt;3&gt;;\n#size-cells = &lt;2&gt;;\nr8169: pcie@0,0 {\nreg = &lt;0x000000 0 0 0 0&gt;;\nlocal-mac-address = [ 00 00 00 00 00 00 ];\n};\n};\n};\n<\/code><\/pre><p>Up until now I had this in that section:<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">&amp;pcie0 {\nmax-link-speed = &lt;1&gt;;\nnum-lanes = &lt;1&gt;;\nvpcie3v3-supply = &lt;&amp;vcc3v3_sys&gt;;\n};\n<\/code><\/pre><p>The rest of that must be defining that there&rsquo;s actually a device there. <br>\nYet another trip through the workflow and&hellip;. Nothing. <br>\nI forgot to set the model string on the latest ^c^v&rsquo;ing of the dts. <br>\nFixed that, reflashed yet again, reset the board, waited for it to boot, and&hellip;.<\/p>\n<p>Kernel panic.<\/p>\n<p>Kernel panic.<\/p>\n<p>Kernel panic.<\/p>\n<p>Finally googled the right thing.<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">handle_el0_sync()\n<\/code><\/pre><h2 id=\"closing-unable-to-tie-cause-to-effect\" >closing: unable to tie cause to effect\n<span>\n<a href=\"#closing-unable-to-tie-cause-to-effect\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>That brought me to an old forum thread saying that <code>if_bridge<\/code> causes panics if <code>VNET<\/code> is enabled in the kernel. <br>\nSo like, I&rsquo;ll blocklist the bridge module, and it&rsquo;ll justwerk, right?<\/p>\n<p>Turns out there is no freebsd equiv of the <code>blacklist some_module<\/code> directive that exists in linux.<\/p>\n<p>At this point I wanted to see what was going on with the R4S (non-emmc) images I had. <br>\nI burned the 22.1.9 image from personalbsd and booted it up. <br>\nImmediately I noticed this:<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">pcib0: &lt;Rockchip PCIe controller&gt; mem 0xf8000000-0xf9ffffff,0xfd000000-0xfdffffff irq 6,7,8 on ofwbus0\npci0: &lt;PCI bus&gt; on pcib0\npcib1: &lt;PCI-PCI bridge&gt; at device 0.0 on pci0\npcib0: failed to reserve resource for pcib1\npcib1: failed to allocate initial memory window: 0-0xfffff\npci1: &lt;PCI bus&gt; on pcib1\nre0: &lt;RealTek 8168\/8111 B\/C\/CP\/D\/DP\/E\/F\/G PCIe Gigabit Ethernet&gt; at device 0.0 on pci1\nre0: Using 1 MSI-X message\nre0: turning off MSI enable bit.\nre0: Chip rev. 0x54000000\nre0: MAC rev. 0x00100000\n<\/code><\/pre><p>There&rsquo;s a bridge. There&rsquo;s a pcie bridge at node 0. Back to the dts for the R4SE.<\/p>\n<p>But first, let&rsquo;s do a quick sanity check. I flashed the vendor openwrt image and&hellip;. no eth1 <br>\n?!?!?!?! <br>\nDid I burn out the nic on this poor little guy? <br>\nI&rsquo;m using the other emmc one as my firewall at this moment&hellip;. <br>\nTime to setup the non-emmc with opnsense so I can use that as the firewall for now.<\/p>\n<p>It works. But having to shuffle my console baudrate is annoying. <br>\nMainline u-boot has it set to 1500000bps for some reason. <br>\nI dd the new uboot onto the sdcard with a working opnsense install, popped it into the R4S, and&hellip;..<\/p>\n<p>Kernel panic.<\/p>\n<p>This is with mainline u-boot dtb sources. I&rsquo;m starting to question my own sanity. <br>\nWhat dts are other people using??? I fired off a fourm post asking for help, then I found <a href=\"https:\/\/github.com\/S199pWa1k9r\/ports\/tree\/master\/sysutils\/u-boot-nanopi-r4s-2020.07\/files\">the repo<\/a> with the dtb sources for the opnsense images I&rsquo;ve been working with.<\/p>\n<p>They were. The same. As. The. Vendor. Sources. (they weren&rsquo;t)<\/p>\n<p>4am this time. I&rsquo;m just now thinking &ldquo;what if I could pull the live device tree from a working openwrt install on a r4se, decompile that shit, and cherrypick out what we need to make this work?&rdquo;<\/p>\n<p>Turns out that&rsquo;s a 1-liner:<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">dtc -I dtb -O dts \/sys\/firmware\/fdt -o r4se.dts\n<\/code><\/pre><p>On a hunch I decompiled the compiled dtb that I was trying to use and compared the two. <br>\nImmediately I saw two things:<\/p>\n<ul>\n<li>\n<p>Address ranges on vendor start at 0x82000000, whereas mine is starting at 0x83000000<\/p>\n<ul>\n<li>sus af<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>&ldquo;compatible&rdquo; field set to <code>nanopi-r4s<\/code>. I have been using <code>nanopi-r4se<\/code>&hellip;<\/p>\n<ul>\n<li>super sus, especially as the dtb would not load when I had forgotten to add the E<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Anyway. Back to the R4SE. I rebuild uboot again without any changes to have a baseline, and&hellip;<\/p>\n<h2 id=\"oh-no\" >oh no\n<span>\n<a href=\"#oh-no\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p><del>Kernel Panic<\/del><\/p>\n<p>Just kidding, although I wish I wasn&rsquo;t:<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">GUID Partition Table Header signature is wrong: 0x0 != 0x5452415020494645\nfind_valid_gpt: *** ERROR: Invalid Backup GPT ***\nGUID Partition Table Entry Array CRC is wrong: 0x307a16bd != 0xbae994fc\nfind_valid_gpt: *** ERROR: Invalid GPT ***\nGUID Partition Table Header signature is wrong: 0x0 != 0x5452415020494645\nfind_valid_gpt: *** ERROR: Invalid Backup GPT ***\nGUID Partition Table Entry Array CRC is wrong: 0x307a16bd != 0xbae994fc\nfind_valid_gpt: *** ERROR: Invalid GPT ***\n<\/code><\/pre><p>I tried a few things, did a few googles, didn&rsquo;t find much info about anything. <br>\nTime for a sanity check.<\/p>\n<p>I flashed vendor openwrt and it booted right up. EMMC is fine. Yay! <br>\nBut why won&rsquo;t it boot my image anymore??? <br>\nOn a hunch I flashed first the image, then my u-boot over it.<\/p>\n<p>Kernel panic.<\/p>\n<p>Okay, at least I can get back to that state again.<\/p>\n<p>I don&rsquo;t know why but I tried removing the &rsquo;e&rsquo; from &lsquo;r4se&rsquo; in the <code>compatible<\/code> field in the dts.<\/p>\n<p>The board booted.<\/p>\n<p>No kernel panic.<\/p>\n<p>I noted that I was using vendor dts. Switched to mainline. Kernel panic.<\/p>\n<h2 id=\"vindication\" >vindication\n<span>\n<a href=\"#vindication\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Then I saw it:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/09\/opnsense-nanopi-r4se\/diff.png\" alt=\"theres_yar_problem\"><\/p>\n<p>See it there? Open up the image in a new tab if you need to. <br>\n<del>Someone fatfingered the address range when they were rewriting the dts (why did they do that? vendor dts is fine?)<\/del><\/p>\n<p>I had just spent more time than I&rsquo;d care to admit trying all manner of different things. <br>\nAnd it came down to this. PCIe address ranges. <br>\nWasn&rsquo;t the model string (derp), wasn&rsquo;t the finer grained pcie stanzas in the toplevel dts, wasn&rsquo;t busted emmc or chipsets. <br>\nAddress. Ranges.<\/p>\n<p><a href=\"https:\/\/github.com\/friendlyarm\/kernel-rockchip\/commit\/8efe01b4386ab38a36b99cfdc1dc02c38a8898c3\">This commit<\/a> validated my experiences of the past 2 days. Apparently this was an issue in linux with some nvme disks? <br>\nIt&rsquo;s clearly a Big Issue in freebsd.<\/p>\n<p>Because of the way freebsd set things up, someone needs to update binaries in the ports tree (you heard me) with this fixed.<\/p>\n<h2 id=\"a-new-lost-hope\" >a <del>new<\/del> lost hope\n<span>\n<a href=\"#a-new-lost-hope\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>After a lot of fucking around and a little bit of finding out, I went back to the non-emmc R4S. <br>\nI wanted opnsense at home. Really bad. <br>\nThankfully it boots right up. I do the thing and configure it. The way I have my network laid out physically lends itself well to warm-swapping firewalls.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/09\/opnsense-nanopi-r4se\/IMG_3416.jpg\" alt=\"the board of networking\"><\/p>\n<blockquote>\n<p>A dumbswitch + mac spoofing on wan means my v4 doesn&rsquo;t change that often. <br>\nAlthough whenever I want a new one verizon will just shit one out. <br>\n&hellip;on a whole new subnet most of the time. Kinda annoying actually.<\/p>\n<\/blockquote>\n<p>30 seconds or so of downtime as arp\/fdb tables clear\/refresh and I&rsquo;m back online.<\/p>\n<p>Within 5 minutes I was experiencing the infamous re driver watchdog timeouts. <br>\nI tried a few combinations of offload on\/off, etc. <br>\nTried the realtek provided driver too - that instapaniced when the config manager added vlan interfaces. <br>\nWoo. <br>\nNo matter what I did I couldn&rsquo;t get it to be stable for more than a few minutes at a time. <br>\nThat&rsquo;s&hellip; Unacceptable. And a big sad. I really wanted HA at home, and there&rsquo;s nothing like pfsync (yet).<\/p>\n<h2 id=\"back-to-linux-where-i-belong\" >back to linux, where I belong\n<span>\n<a href=\"#back-to-linux-where-i-belong\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>At this point I accepted that freebsd\/openwrt on these guys in my configuration was basically a lost cause. <br>\nMaybe if I wasn&rsquo;t running vlans it&rsquo;d be okay. It certainly seemed that way in my initial testing.<\/p>\n<p>My next step from here is to get a decent build of openwrt going for my own use. <br>\nThen, I need to redirect this effort into plonkfw. The world deserves better.<\/p>"},{"title":"NanoPi R4SE","link":"http:\/\/goos.blog\/2022\/08\/nanopi-r4se\/","pubDate":"Tue, 30 Aug 2022 00:00:00 -0400","guid":"http:\/\/goos.blog\/2022\/08\/nanopi-r4se\/","description":"<h4 id=\"adorable-just-adorable-but-also-i-hate-you\" ><em>adorable. just. adorable. but also I hate you.<\/em>\n<span>\n<a href=\"#adorable-just-adorable-but-also-i-hate-you\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>About a month ago I ordered both the <a href=\"https:\/\/wiki.friendlyelec.com\/wiki\/index.php\/NanoPi_R4S\">r4s<\/a> and <a href=\"https:\/\/wiki.friendlyelec.com\/wiki\/index.php\/NanoPi_R5S\">r5s<\/a> from nanopi. <br>\nThen a week or two after that they released the <a href=\"https:\/\/wiki.friendlyelec.com\/wiki\/index.php\/NanoPi_R4SE\">r4se<\/a>, which is the same platform as the r4s but with 32gb of emmc onboard. <br>\nI ordered two of those. <br>\nThis post is about openwrt on the r4se. I&rsquo;m also playing around with opnsense on the r4s, there&rsquo;ll be posts about that later.<\/p>\n<h2 id=\"initial-thoughts\" >Initial thoughts\n<span>\n<a href=\"#initial-thoughts\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p><img src=\"http:\/\/goos.blog\/2022\/08\/nanopi-r4se\/IMG_3343.jpg\" alt=\"two nanopie r4se units\"><\/p>\n<p>This thing is is heavy, chunky, and very solid feeling. Build quality is excellent, all the ports line up perfectly with their openings. <br>\nThe silkscreened labels line up perfectly with their respective openings\/lights. <br>\nOverall a very nice unit.<\/p>\n<p>The power supply they bundled isn&rsquo;t the best looking thing, but it doesn&rsquo;t get hot under load and it&rsquo;s rated for 4 amps (r4s rated draw is 3a), so I&rsquo;m happy with it.<\/p>\n<h2 id=\"the-firmware\" >The Firmware\n<span>\n<a href=\"#the-firmware\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>The newest official firmware from friendlyelec is based on openwrt 21.02. <br>\nThat&rsquo;s a little old for my liking, thankfully they have a testing image based on 22.03. <br>\nFlashing the firmware to the emmc using rkdevtool took a bit of brain-ing to figure out, but I got there.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/08\/nanopi-r4se\/rkdevtool.png\" alt=\"rkdevtool\"><\/p>\n<h2 id=\"setting-up\" >Setting up\n<span>\n<a href=\"#setting-up\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>First thing I did was add allow rules for tcp\/80 and tcp\/22 on the wan interface so I can access the DUT from my desktop. <br>\nAfter that I edited <code>\/etc\/hotplug.d\/net\/40-net-smp-affinity<\/code> to pin the rps for each interface to the fast a72 cores.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>friendlyelec,nanopi-r4s<span style=\"color:#f92672\">)<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> set_interface_core <span style=\"color:#ae81ff\">10<\/span> <span style=\"color:#e6db74\">&#34;eth0&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> echo <span style=\"color:#ae81ff\">10<\/span> &gt; \/sys\/class\/net\/eth0\/queues\/rx-0\/rps_cpus <span style=\"color:#75715e\"># was 3f<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> set_interface_core <span style=\"color:#ae81ff\">20<\/span> <span style=\"color:#e6db74\">&#34;eth1&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> echo <span style=\"color:#ae81ff\">20<\/span> &gt; \/sys\/class\/net\/eth1\/queues\/rx-0\/rps_cpus <span style=\"color:#75715e\"># was 3f<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> ;;\n<\/span><\/span><\/code><\/pre><\/div><p>For some reason they were spread across all cores by default, even though they were pinning the irqs to the a72&rsquo;s. <br>\nFinally I set the cpu gov. to performance in the webui. This only affected the a53 cores for some reason, so I put this in <code>\/etc\/rc.local<\/code> to force the cpu freq to max.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>echo <span style=\"color:#ae81ff\">1512000<\/span> &gt; \/sys\/devices\/system\/cpu\/cpu0\/cpufreq\/scaling_min_freq\n<\/span><\/span><span style=\"display:flex;\"><span>echo <span style=\"color:#ae81ff\">1512000<\/span> &gt; \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_min_freq\n<\/span><\/span><span style=\"display:flex;\"><span>echo <span style=\"color:#ae81ff\">1512000<\/span> &gt; \/sys\/devices\/system\/cpu\/cpu2\/cpufreq\/scaling_min_freq\n<\/span><\/span><span style=\"display:flex;\"><span>echo <span style=\"color:#ae81ff\">1512000<\/span> &gt; \/sys\/devices\/system\/cpu\/cpu3\/cpufreq\/scaling_min_freq\n<\/span><\/span><span style=\"display:flex;\"><span>echo <span style=\"color:#ae81ff\">2016000<\/span> &gt; \/sys\/devices\/system\/cpu\/cpu4\/cpufreq\/scaling_min_freq\n<\/span><\/span><span style=\"display:flex;\"><span>echo <span style=\"color:#ae81ff\">2016000<\/span> &gt; \/sys\/devices\/system\/cpu\/cpu5\/cpufreq\/scaling_min_freq\n<\/span><\/span><\/code><\/pre><\/div><p>Worth noting is that on the 21.x series, the max configurable frequency of the a72&rsquo;s is lower, 19xx-something vs 2016000 on 22.x.<\/p>\n<h2 id=\"wheres-my-eth1\" >Where&rsquo;s my eth1?\n<span>\n<a href=\"#wheres-my-eth1\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>After a soft retoot, eth1 had disappeared! Smells like typical realtek shit. I wish they had spent the extra 5 bucks on intel chipsets. <br>\nMakes me wanna design my own tiny router&hellip;. not that I&rsquo;ll ever do that. <br>\nA hard powercycle brought it back. :thonk: <br>\nI rebooted a bunch more times, and eth1 disappeared about 1\/5 of the time. <br>\nThat&rsquo;s acceptable for use at my home, but it means I wouldn&rsquo;t really trust it anywhere remote. <br>\nBut yeah. Imagine like. A really fast arm cpu with a lot of ddr4 memory. Dual nvme slots so you can raid 1. Good intel nics, like the i350 for four ports. <br>\nSure, such a thing would have to be a bit bigger. And more expensive. But still. It&rsquo;d be nice. <br>\nMaybe we&rsquo;ll start seeing arm thin clients with pcie slots. That&rsquo;d be almost perfect.<\/p>\n<h2 id=\"list-of-benchmarks-to-run\" >List of benchmarks to run:\n<span>\n<a href=\"#list-of-benchmarks-to-run\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">\/\/ Typical home network traffic\nlan &lt;-&gt; wan outbound nat\n\/\/ Inbound port forwards\nwan &lt;-&gt; lan inbound nat\n\/\/ LAN to the device itself - NAS, etc\nlan\/wan &lt;-&gt; r4s\n\/\/ We&#39;ll run these later on (probably in a different post)\n\/\/ Openvpn\nwan (openvpn client) &lt;-&gt; lan\n\/\/ Wireguard\nwan (wireguard client) &lt;-&gt; lan\n<\/code><\/pre><h2 id=\"testing-methodology\" >Testing methodology:\n<span>\n<a href=\"#testing-methodology\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>We&rsquo;ll run our tests using iperf3 and T-Rex.<\/p>\n<p>If you&rsquo;ve been reading my posts about T-Rex, you already know about our traffic generator. <br>\nIt&rsquo;s a dell optiplex 7040 with an i7 and a x710-DA2. <br>\nWe already know that it can generate 10gig line rate at 64b on-frame, far more than our DUT can do.<\/p>\n<h2 id=\"cursory-speedtestnet-testing\" >Cursory speedtest.net testing\n<span>\n<a href=\"#cursory-speedtestnet-testing\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>speedtest-cli from my laptop on the lan port shows about 300\/300, which is about what I get here (yay fios). <br>\nSo we know the r4s can NAT at least that much.<\/p>\n<h2 id=\"benchmark-the-first-lan---wan-w-nat\" >Benchmark the first: LAN &lt;-&gt; WAN w\/ NAT\n<span>\n<a href=\"#benchmark-the-first-lan---wan-w-nat\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Some cursory benchmarking with T-Rex in stateless mode yielded some&hellip; Interesting results:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/08\/nanopi-r4se\/mult1-dur80-2022-08-29T18-42-45.890Z-bits.png\" alt=\"a graph showing odd traffic patterns\"><\/p>\n<p>This was very repeatable with stateless profiles and scaled with load. I&rsquo;d get a few seconds of about 30% drop, and then it&rsquo;d go to near 100% drop.<\/p>\n<h2 id=\"why-you-do-that\" >Why you do that?\n<span>\n<a href=\"#why-you-do-that\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>I started by examining my test setup. My thought was that some weirdness was happening with buffers. <br>\nIf not there then maybe something at layer4 or higher&hellip;<\/p>\n<p>First i looked at the network buffers and some other maximums on the DUT:<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">root@FriendlyWrt:~# cat \/proc\/sys\/net\/netfilter\/nf_conntrack_max\n65535\nroot@FriendlyWrt:~# sysctl net.ipv4.tcp_rmem\nnet.ipv4.tcp_rmem = 8192 262144 67108864\nroot@FriendlyWrt:~# sysctl net.ipv4.tcp_wmem\nnet.ipv4.tcp_wmem = 8192 262144 67108864\nroot@FriendlyWrt:~# sysctl net.core.rmem_max\nnet.core.rmem_max = 67108864\nroot@FriendlyWrt:~# sysctl net.core.wmem_max\nnet.core.wmem_max = 67108864\n<\/code><\/pre><p>Those look reasonable to me. So why it do that?<\/p>\n<h2 id=\"wireshark-time\" >Wireshark time\n<span>\n<a href=\"#wireshark-time\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Spoiler alert - this didn&rsquo;t tell me shit other than confirming that:<\/p>\n<ul>\n<li>my packets are the size on-wire that I thought they were (yay, no more math!)<\/li>\n<li>the DUT was properly doing nat<\/li>\n<\/ul>\n<p>Had I been a bit more observant here, I would have saved some time. But let&rsquo;s not spoil the surprise.<\/p>\n<p>This is getting into weird territory. I&rsquo;m going to get opnsense working on the r4s (non-emmc) and see how it handles these tests.<\/p>\n<p>But first&hellip;<\/p>\n<h2 id=\"lets-try-astf\" >Let&rsquo;s try ASTF\n<span>\n<a href=\"#lets-try-astf\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>I mean, that&rsquo;s what we&rsquo;re supposed to be using, given that this lil guy is doing NAT. <br>\nHere&rsquo;s a run of 64b on-wire frames. I think I&rsquo;m near the limits of what this DUT can handle at this packet size.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/08\/nanopi-r4se\/mult100000-dur60-2022-08-30T12-07-32.043Z-bits.png\" alt=\"bps graph of astf profile\">\n<img src=\"http:\/\/goos.blog\/2022\/08\/nanopi-r4se\/mult100000-dur60-2022-08-30T12-07-32.043Z-packets.png\" alt=\"pps graph of astf profile\"><\/p>\n<h2 id=\"its-always-dns-arp\" >It&rsquo;s always <del>DNS<\/del> ARP\n<span>\n<a href=\"#its-always-dns-arp\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>So with ASTF profiles looking normal-ish, let&rsquo;s go back to STL and see why that&rsquo;s doing what it does. <br>\nI started doing a google for anything network io cache or timeout related. <br>\nOn a hunch, I started this on the DUT: <code>while true; do clear; ip neigh; sleep 0.5; done<\/code> , fired off a STL profile and waited.<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">11.11.11.2 dev eth1 lladdr 3c:fd:fe:c6:06:10 STALE\n10.15.41.1 dev eth0 lladdr a0:36:9f:83:b5:58 REACHABLE\n12.12.12.2 dev eth0 INCOMPLETE\n<\/code><\/pre><h2 id=\"wait-what\" >Wait, what?\n<span>\n<a href=\"#wait-what\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Our configuration for t-rex itself looks like this:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span>- <span style=\"color:#f92672\">version<\/span>: <span style=\"color:#ae81ff\">2<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">interfaces<\/span>: [<span style=\"color:#e6db74\">&#39;01:00.0&#39;<\/span>, <span style=\"color:#e6db74\">&#39;01:00.1&#39;<\/span>]\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">port_info<\/span>: <span style=\"color:#75715e\"># 0 = client, right, 1 = server, left<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> - <span style=\"color:#f92672\">ip<\/span>: <span style=\"color:#ae81ff\">11.11.11.2<\/span> <span style=\"color:#75715e\"># phy port 0, client subnet is routed through this address<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">default_gw<\/span>: <span style=\"color:#ae81ff\">11.11.11.1<\/span> <span style=\"color:#75715e\"># r4s lan port<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> - <span style=\"color:#f92672\">ip<\/span>: <span style=\"color:#ae81ff\">12.12.12.2<\/span> <span style=\"color:#75715e\"># phy port 1, server subnet is routed through this address<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">default_gw<\/span>: <span style=\"color:#ae81ff\">12.12.12.1<\/span> <span style=\"color:#75715e\"># r4s wan port<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>On the DUT we have secondary addresses configured on &ldquo;WAN&rdquo; and &ldquo;LAN&rdquo; of 12.12.12.1\/30 and 11.11.11.1\/30 respectively. <br>\nThen we have routes:<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">16.0.0.0\/8 via 11.11.11.2\n48.0.0.0\/8 via 12.12.12.2\n<\/code><\/pre><p>So when the stateless profile starts:<\/p>\n<ul>\n<li>t-rex sends out a garp for 11.11.11.2 and 12.12.12.2<\/li>\n<li>openwrt sees this and installs the neighbor entry<\/li>\n<li>traffic flows for a while<\/li>\n<li>t-rex hasn&rsquo;t sent another garp and isn&rsquo;t responding to arp<\/li>\n<li>openwrt ages out the arp entry<\/li>\n<li>traffic dies off<\/li>\n<li>goos is confused<\/li>\n<\/ul>\n<p>My googling brought me to many interesting pages including some functions in the python library that I can&rsquo;t figure out how to replicate, <br>\nincluding one <code>c.arp()<\/code> which appears to send a garp on demand.<\/p>\n<h2 id=\"so-how-do-we-fix-it\" >So how do we fix it?\n<span>\n<a href=\"#so-how-do-we-fix-it\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>We go back to the old ways and set static neighbor entries.<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">ip neigh add 11.11.11.2 lladdr 3c:fd:fe:c6:06:10 dev eth1 nud permanent\nip neigh add 12.12.12.2 lladdr 3c:fd:fe:c6:06:11 dev eth0 nud permanent\n<\/code><\/pre><p><img src=\"http:\/\/goos.blog\/2022\/08\/nanopi-r4se\/mult1-dur60-2022-08-30T19-23-31.191Z-bits.png\" alt=\"bps graph of stl profile\">\n<img src=\"http:\/\/goos.blog\/2022\/08\/nanopi-r4se\/mult1-dur60-2022-08-30T19-23-31.191Z-packets.png\" alt=\"pps graph of stl profile\"><\/p>\n<blockquote>\n<p>64b packets hurt, but it&rsquo;s like. working now.<\/p>\n<\/blockquote>\n<h2 id=\"still-reading\" >Still reading?\n<span>\n<a href=\"#still-reading\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>This is getting pretty long, and I haven&rsquo;t done 10% of what I wanted to. <br>\nI&rsquo;ll leave you with this: <br>\nWhenever you have connectivity problems. Check address resolution first. <br>\nIf that&rsquo;s DNS, ARP, some service discovery like consul, whatever. <br>\nCheck that things know where things are before doing a deep dive.<\/p>"},{"title":"Cisco T-Rex: Further down the rabbit hole...","link":"http:\/\/goos.blog\/2022\/08\/trex-down-the-rabbit-hole\/","pubDate":"Thu, 25 Aug 2022 00:00:00 -0400","guid":"http:\/\/goos.blog\/2022\/08\/trex-down-the-rabbit-hole\/","description":"<h4 id=\"why-not-just-learn-python-dude\" ><em>why not just learn python dude&hellip;.<\/em>\n<span>\n<a href=\"#why-not-just-learn-python-dude\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>Because I can&rsquo;t stand it, that&rsquo;s why. <br>\nPlus I really do like nodejs. <br>\nPlus everything Cisco has provided is an absolute mess.<\/p>\n<p>I&rsquo;m already doing my graphing and analysis in js, and I&rsquo;m thinking now it&rsquo;d be Really Cool to have a webui of some sort in the future. <br>\n<a href=\"https:\/\/trex-tgn.cisco.com\/trex\/doc\/trex_rpc_server_spec.html\">The zmq rpc documetation<\/a> is pretty accurate. There&rsquo;s a few gaps but nothing too horrible.<\/p>\n<h2 id=\"the-library\" >the library\n<span>\n<a href=\"#the-library\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p><a href=\"https:\/\/github.com\/velocipacktor\/jsrex\">https:\/\/github.com\/velocipacktor\/jsrex<\/a><\/p>\n<p>Here&rsquo;s the node lib for the t-rex zmq server. There&rsquo;s a few examples under the <code>examples\/<\/code> directory, <br>\nI&rsquo;m going to move them into their own repo soon though (will updoot this post with a link).<\/p>\n<h2 id=\"the-conversion-tool\" >the conversion tool\n<span>\n<a href=\"#the-conversion-tool\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>All the sample ASTF profiles that Cisco provides are in python. This is great and all because the JSON format is pure aids to read, but I do need the profile in json format in order to run it with my js tooling.<\/p>\n<p>The python lib &ldquo;compiles&rdquo; the profile template into json before submitting it to the t-rex server. <br>\nThe bad news here is that replicating the json conversion ourselves would be a Lot of work.<\/p>\n<p>Thankfully the <code>ASTFTemplate<\/code> class in the python lib actually exposes a <a href=\"https:\/\/github.com\/cisco-system-traffic-generator\/trex-core\/blob\/master\/scripts\/automation\/trex_control_plane\/interactive\/trex\/astf\/trex_astf_profile.py#L1921\">to_json_str()<\/a> function that we can just call.<\/p>\n<p>It took some googling and playing around but I was able to get it working in a reasonable amount of time.<\/p>\n<p>The resulting conversion ended up looking like this:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-python\" data-lang=\"python\"><span style=\"display:flex;\"><span>module <span style=\"color:#f92672\">=<\/span> importlib<span style=\"color:#f92672\">.<\/span>import_module(file, package<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;.\/&#39;<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span>profile <span style=\"color:#f92672\">=<\/span> module<span style=\"color:#f92672\">.<\/span>register()<span style=\"color:#f92672\">.<\/span>get_profile(<span style=\"color:#e6db74\">&#39;&#39;<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span>profile<span style=\"color:#f92672\">.<\/span>to_json_str()\n<\/span><\/span><\/code><\/pre><\/div><p>There&rsquo;s a howto in <a href=\"https:\/\/github.com\/velocipacktor\/pyastf-json-convertor\">the repo<\/a><\/p>\n<h2 id=\"making-some-graphs\" >making some graphs\n<span>\n<a href=\"#making-some-graphs\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>It was easier to capture data now that everything was being done in one process. <br>\nI started to rewrite my benchmark sequencer to make use of jsrex. <br>\nI added the ability to load profile templates as es6 imports, native t-rex json, and as python templates. <br>\nThat last one was important as there are a lot of sample templates provided by Cisco that I want to be able to easily use. <br>\nIn the short\/mid term it&rsquo;ll also be easier for me to cook my own profiles in python - the python lib has a lot of helper functions to build the profile.<\/p>\n<blockquote>\n<p><a href=\"https:\/\/github.com\/velocipacktor\/trex-benchmark-sequence\/blob\/main\/profiles\/stl\/udp_linerate_4_streams.py\">udp_linerate_4_streams.py<\/a>:<\/p>\n<\/blockquote>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-python\" data-lang=\"python\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">from<\/span> trex_stl_lib.api <span style=\"color:#f92672\">import<\/span> <span style=\"color:#f92672\">*<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">import<\/span> argparse\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">class<\/span> <span style=\"color:#a6e22e\">STLS1<\/span>(object):\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">def<\/span> <span style=\"color:#a6e22e\">create_stream<\/span> (self, src_addr, dst_addr, size, load):\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">return<\/span> STLStream(\n<\/span><\/span><span style=\"display:flex;\"><span> packet <span style=\"color:#f92672\">=<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> STLPktBuilder(\n<\/span><\/span><span style=\"display:flex;\"><span> pkt <span style=\"color:#f92672\">=<\/span> Ether()<span style=\"color:#f92672\">\/<\/span>IP(src<span style=\"color:#f92672\">=<\/span>src_addr,dst<span style=\"color:#f92672\">=<\/span>dst_addr)<span style=\"color:#f92672\">\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> UDP(dport<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">12<\/span>,sport<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">1025<\/span>)<span style=\"color:#f92672\">\/<\/span>(size<span style=\"color:#f92672\">*<\/span><span style=\"color:#e6db74\">&#39;x&#39;<\/span>) <span style=\"color:#75715e\"># build packets filled with &#39;size * x&#39; <\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> ),\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#75715e\"># fill the pipe<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> mode <span style=\"color:#f92672\">=<\/span> STLTXCont( percentage <span style=\"color:#f92672\">=<\/span> load <span style=\"color:#f92672\">\/<\/span> <span style=\"color:#ae81ff\">4<\/span> ))\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">def<\/span> <span style=\"color:#a6e22e\">get_streams<\/span> (self, tunables, <span style=\"color:#f92672\">**<\/span>kwargs):\n<\/span><\/span><span style=\"display:flex;\"><span> parser <span style=\"color:#f92672\">=<\/span> argparse<span style=\"color:#f92672\">.<\/span>ArgumentParser(description<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#39;Argparser for <\/span><span style=\"color:#e6db74\">{}<\/span><span style=\"color:#e6db74\">&#39;<\/span><span style=\"color:#f92672\">.<\/span>format(os<span style=\"color:#f92672\">.<\/span>path<span style=\"color:#f92672\">.<\/span>basename(__file__)),\n<\/span><\/span><span style=\"display:flex;\"><span> formatter_class<span style=\"color:#f92672\">=<\/span>argparse<span style=\"color:#f92672\">.<\/span>ArgumentDefaultsHelpFormatter)\n<\/span><\/span><span style=\"display:flex;\"><span> parser<span style=\"color:#f92672\">.<\/span>add_argument(<span style=\"color:#e6db74\">&#39;--load&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span> type<span style=\"color:#f92672\">=<\/span>int,\n<\/span><\/span><span style=\"display:flex;\"><span> default<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">64<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span> help<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#34;&#34;&#34;define how much to load the link.&#34;&#34;&#34;<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span> parser<span style=\"color:#f92672\">.<\/span>add_argument(<span style=\"color:#e6db74\">&#39;--size&#39;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span> type<span style=\"color:#f92672\">=<\/span>int,\n<\/span><\/span><span style=\"display:flex;\"><span> default<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">64<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span> help<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#34;&#34;&#34;define the packet&#39;s size in the stream.&#34;&#34;&#34;<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span> args <span style=\"color:#f92672\">=<\/span> parser<span style=\"color:#f92672\">.<\/span>parse_args(tunables)\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#75715e\"># create 4 streams<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">return<\/span> [\n<\/span><\/span><span style=\"display:flex;\"><span> self<span style=\"color:#f92672\">.<\/span>create_stream(<span style=\"color:#e6db74\">&#34;16.0.0.1&#34;<\/span>, <span style=\"color:#e6db74\">&#34;48.0.0.1&#34;<\/span>, args<span style=\"color:#f92672\">.<\/span>size, args<span style=\"color:#f92672\">.<\/span>load),\n<\/span><\/span><span style=\"display:flex;\"><span> self<span style=\"color:#f92672\">.<\/span>create_stream(<span style=\"color:#e6db74\">&#34;16.0.0.2&#34;<\/span>, <span style=\"color:#e6db74\">&#34;48.0.0.2&#34;<\/span>, args<span style=\"color:#f92672\">.<\/span>size, args<span style=\"color:#f92672\">.<\/span>load),\n<\/span><\/span><span style=\"display:flex;\"><span> self<span style=\"color:#f92672\">.<\/span>create_stream(<span style=\"color:#e6db74\">&#34;16.0.0.3&#34;<\/span>, <span style=\"color:#e6db74\">&#34;48.0.0.3&#34;<\/span>, args<span style=\"color:#f92672\">.<\/span>size, args<span style=\"color:#f92672\">.<\/span>load),\n<\/span><\/span><span style=\"display:flex;\"><span> self<span style=\"color:#f92672\">.<\/span>create_stream(<span style=\"color:#e6db74\">&#34;16.0.0.4&#34;<\/span>, <span style=\"color:#e6db74\">&#34;48.0.0.4&#34;<\/span>, args<span style=\"color:#f92672\">.<\/span>size, args<span style=\"color:#f92672\">.<\/span>load),\n<\/span><\/span><span style=\"display:flex;\"><span> ]\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># dynamic load - used for trex console or simulator<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">def<\/span> <span style=\"color:#a6e22e\">register<\/span>():\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">return<\/span> STLS1()\n<\/span><\/span><\/code><\/pre><\/div><h2 id=\"nice-documentation\" >nice documentation\n<span>\n<a href=\"#nice-documentation\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>I then discovered some documentation on how the simulation tools can just. Print the json for me. <br>\n<a href=\"https:\/\/trex-tgn.cisco.com\/trex\/doc\/trex_astf.html\">^f &ldquo;Adding &ndash;json displays the details of the JSON profile&rdquo;<\/a> <br>\n<a href=\"https:\/\/trex-tgn.cisco.com\/trex\/doc\/trex_stateless.html\">^f &ldquo;Adding &ndash;json displays the details of the JSON command for adding a stream&rdquo;<\/a><\/p>\n<p>So. Cool. Glad I found that just now. Glad I spent the time digging into the python api figuring out how to print the json from a py profile. <br>\nGuess I can archive the pyastf-json-convertor repo and just call those commands from my benchmarking tools. <br>\nDoing this proved somewhat problematic, I ended up needing to use <code>node-pty<\/code>&hellip; Might rewrite to pipe the convertor stdout to readline. <br>\nKeep an eye on <a href=\"https:\/\/github.com\/velocipacktor\/trex-benchmark-sequence\">this repo<\/a>.<\/p>\n<h2 id=\"digging-myself-in-even-deeper\" >digging myself in even deeper\n<span>\n<a href=\"#digging-myself-in-even-deeper\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>The thought hit me - browsers can&rsquo;t zmq. So I need a http gateway to t-rex if I want a webui. Fun. <br>\nEnter stage left: <a href=\"https:\/\/github.com\/velocipacktor\/velocipacktor\">velocipacktor<\/a>.<\/p>\n<p>What is it? Right now it&rsquo;s a very minimal http control interface for t-rex. <br>\nIt can:<\/p>\n<ul>\n<li>Start t-rex in stl or astf mode<\/li>\n<li>Stop t-rex<\/li>\n<li>See if t-rex is running<\/li>\n<\/ul>\n<p>In the future, I hope it can:<\/p>\n<ul>\n<li>provide a feature complete api for the t-rex zmq api<\/li>\n<li>have websocket endpoints for streaming realtime stats<\/li>\n<li>expose a webui with live graphs<\/li>\n<\/ul>\n<p>Writing a http gateway does make sense though. It&rsquo;s easier to proxy and authenticate http\/s than zmq, for one thing. <br>\nDockerizing the whole stack and having a cute webui will lower the barrier to entry of t-rex (it&rsquo;s a good thing).<\/p>\n<h2 id=\"how-fast-is-fast-enough\" >how fast is fast enough?\n<span>\n<a href=\"#how-fast-is-fast-enough\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>I have a lot of work to do on velocipacktor still. But, in its current state, I can generate repeatable benchmarks and graphs and such. <br>\nI now need to see what my test bench hardware is capable of. <br>\nHardware:<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">- Chassis: Dell Optiplex 7040\n- CPU: Intel i7-6700k\n- RAM: 8GB DDR4 2133\n- NIC: Intel X710-DA2 (yep, I got the one that goes to 11)\n- DUT: 6in twinax sfp+ DAC (loopback between the two ports)\n<\/code><\/pre><p>Using <a href=\"https:\/\/github.com\/velocipacktor\/trex-benchmark-sequence\/blob\/main\/profiles\/stl\/udp_linerate_4_streams.py\">udp_linerate_4_streams.py<\/a>, I am able to saturate the interface with ease at any packet size.<\/p>\n<p><a href=\"https:\/\/www.fmad.io\/blog\/what-is-10g-line-rate\">This post<\/a> goes into detail on the math behind what &ldquo;line rate&rdquo; actually is. <br>\nI can say with some confidence that this card in this system is capable of doing line rate with 64b on-wire packets:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/08\/trex-down-the-rabbit-hole\/mult1-dur30-2022-08-25T04-51-39.531Z-packets.png\" alt=\"packets per second graph at 64byte packet size\"><\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/08\/trex-down-the-rabbit-hole\/mult1-dur30-2022-08-25T04-51-39.531Z-bits.png\" alt=\"bits per second graph at 64byte packet size\"><\/p>\n<p>Given that all my current DUTs are 1gig and 2.5gig that&rsquo;s more than good enough. <br>\nI haven&rsquo;t tested the rj45 sfp+ modules yet, but I don&rsquo;t forsee any issues with them.<\/p>\n<p>And that&rsquo;s where I&rsquo;ll leave this one off for now. <br>\nStay tuned, there will be more.<\/p>"},{"title":"Cisco T-Rex","link":"http:\/\/goos.blog\/2022\/08\/learning-trex\/","pubDate":"Wed, 10 Aug 2022 00:00:00 -0400","guid":"http:\/\/goos.blog\/2022\/08\/learning-trex\/","description":"<h4 id=\"yet-another-wonderful-cisco-product\" ><em>yet another wonderful cisco product<\/em>\n<span>\n<a href=\"#yet-another-wonderful-cisco-product\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>I kid. <a href=\"https:\/\/trex-tgn.cisco.com\/\">T-Rex<\/a> is actually pretty cool.<\/p>\n<p>I&rsquo;m writing a post right now about the <a href=\"https:\/\/wiki.friendlyelec.com\/wiki\/index.php\/NanoPi_R5S\">NanoPi R5S<\/a>.\nAll the other reviews \/ benchmarks (including those from friendlyelec) I&rsquo;ve seen on these have been uh&hellip; Kinda useless (no offense to those authors). <br>\nThey&rsquo;re routers, we care about how much traffic they can <em><strong>pass<\/strong><\/em>, not how much they can ingest\/generate.<\/p>\n<p>Anyway, getting off topic, back to t-rex itself.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/08\/learning-trex\/trex-logo.png\" alt=\"trex logo\"><\/p>\n<p>So. T-Rex is a pretty cool suite.\nOut of the box it has several traffic profiles which cover most of what I want to test on these little guys. <br>\nI might cook some profiles of my own, cs:go gameserver traffic would be interesting to test. <br>\nProfiles are basically pcaps to replay and a yaml to define how they&rsquo;re replayed. Pretty simple.<\/p>\n<h2 id=\"dpdk-pain\" >dpdk pain\n<span>\n<a href=\"#dpdk-pain\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>My hardware is an Optiplex 7040 with a 4-port Intel i350 card.\nThe chipset is listed on the supported list for t-rex, so I thought it&rsquo;d all be good.\nI load up derpbian, download the thing, install the deps, and try to run it&hellip;. <br>\nOnly&hellip; no traffic is actually passed over the loopback&hellip; dmesg is flooded with dmar errors&hellip; <em>sigh<\/em> <br>\nI tried a few iommu kernel params that had resolved dmar errors in the past without much luck. It looked like this was a versioning problem with dpdk stuff. RIP me.<\/p>\n<h2 id=\"striking-a-deal-with-the-devil\" >striking a deal with the devil\n<span>\n<a href=\"#striking-a-deal-with-the-devil\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Centos it is. I find a 7.6 iso at vault.centos.org and install that. <br>\nNow it works, and I spent some time messing around with the many parameters of trex. <br>\nAt this point I&rsquo;m working with a hardware loopback (port 0 is connected to port 2 with a short patch cable).<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/08\/learning-trex\/trex-screenshot-01.png\" alt=\"trex-screenshot-01\"><\/p>\n<blockquote>\n<p><code>.\/t-rex-64 -f cap2\/https.yaml -m 1000 -d 30<\/code> <br>\nI think I&rsquo;m doing this right&hellip;<\/p>\n<\/blockquote>\n<h2 id=\"must-go-faster\" >must. go. faster.\n<span>\n<a href=\"#must-go-faster\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>I am able to run a number of tests that saturate the phy bandwidth, but some others are cpu bottlenecked (smol packets, lots of simulated client\/servers, etc). <br>\nGiven that this box has some i5 in it with 4c\/4t, a cpu upgrade felt natural. <br>\nSome googling told me that the i7-6700K would work on my 7040. It has 4c\/8t at 4.0 ~ 4.2ghz. <br>\nNot bad. <br>\nWhile I wait for that to show up let&rsquo;s play with trex more and see if I can get some graphable output from it.<\/p>\n<p>It was at this point I discovered that &ldquo;stateful&rdquo; mode was basically deprech, and I should be using &ldquo;ASTF&rdquo; mode instead. <br>\nASTF is basically stateful but instead of yaml and local running, you run a daemon in astf mode and connect to it over zmq. <br>\nThere&rsquo;s only one library to make this sane&hellip; And it&rsquo;s in python. <br>\nThis however turned out to be not too horrible in the end.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/08\/learning-trex\/trex-screenshot-02.png\" alt=\"trex-screenshot-02\"><\/p>\n<blockquote>\n<p>trex-console has a cute tui mode<\/p>\n<\/blockquote>\n<h2 id=\"down-the-rabbit-hole-we-go\" >down the rabbit hole we go\n<span>\n<a href=\"#down-the-rabbit-hole-we-go\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Bit more googling lead me to this:\n<a href=\"https:\/\/github.com\/cisco-system-traffic-generator\/trex-core\/blob\/master\/scripts\/automation\/trex_control_plane\/interactive\/trex\/examples\/astf\/astf_example.py\">astf_example.py<\/a><\/p>\n<p>I can kinda work with this.\nIf I can get those stats on some interval&hellip;<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-python\" data-lang=\"python\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">while<\/span> c<span style=\"color:#f92672\">.<\/span>is_traffic_active():\n<\/span><\/span><span style=\"display:flex;\"><span> stats <span style=\"color:#f92672\">=<\/span> c<span style=\"color:#f92672\">.<\/span>get_stats()\n<\/span><\/span><span style=\"display:flex;\"><span> timestamp <span style=\"color:#f92672\">=<\/span> time<span style=\"color:#f92672\">.<\/span>mktime(datetime<span style=\"color:#f92672\">.<\/span>datetime<span style=\"color:#f92672\">.<\/span>now()<span style=\"color:#f92672\">.<\/span>timetuple()) <span style=\"color:#f92672\">*<\/span> <span style=\"color:#ae81ff\">1000<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> statsArray<span style=\"color:#f92672\">.<\/span>append(JsonOutput(timestamp, stats))\n<\/span><\/span><span style=\"display:flex;\"><span> time<span style=\"color:#f92672\">.<\/span>sleep(<span style=\"color:#ae81ff\">0.5<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span>outputFile <span style=\"color:#f92672\">=<\/span> open(outputPath, <span style=\"color:#e6db74\">&#34;w&#34;<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span>outputFile<span style=\"color:#f92672\">.<\/span>write(json<span style=\"color:#f92672\">.<\/span>dumps(statsArray, default<span style=\"color:#f92672\">=<\/span>vars))\n<\/span><\/span><\/code><\/pre><\/div><blockquote>\n<p>:neat: <br>\nDon&rsquo;t judge my dogshit python abilities <br>\nI <em>think<\/em> I got the math right when I modified that function&hellip; <br>\nIt ain&rsquo;t matter though b\/c that&rsquo;s just for my human-readable while the test is running<\/p>\n<\/blockquote>\n<h2 id=\"time-to-make-it-clean\" >time to make it clean\n<span>\n<a href=\"#time-to-make-it-clean\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Before making graphs I wanted to isolate and repo-ize my work so far. <br>\nThis ended up being a lot harder than it should have been. <br>\nI&rsquo;m probably violating licenses, but whatever, this is nonprofit.<\/p>\n<h2 id=\"graphs-glorious-graphs\" >graphs, glorious graphs\n<span>\n<a href=\"#graphs-glorious-graphs\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Now to figure out how to make pretty graphs with all this data. <br>\nIt didn&rsquo;t take too long to get something with chart.js and canvas working.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/08\/learning-trex\/trex-test-graph-01.png\" alt=\"trex-test-graph-01\"><\/p>\n<blockquote>\n<p>Ugly, for now.<\/p>\n<\/blockquote>\n<p>After a fair amount of farting around with graph params and other small things, I had myself a lil nodejs (yes, js. yes, the actual api is in python. no I will not be answering your questions at this time.) blob that would take a hjson file of profiles and settings to run and generate graphs for, and like, run it. <br>\nThe way I ended up doing it was gross at every step. But. It works. <br>\nFeelsgood.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/08\/learning-trex\/emix2-mult_400-dur_600-1660148778698.png\" alt=\"prettier trex graph\"><\/p>\n<blockquote>\n<p>The <a href=\"https:\/\/github.com\/cisco-system-traffic-generator\/trex-core\/blob\/master\/scripts\/astf\/emix2.py\">emix2 profile<\/a>\nis killer. <br>\n<a href=\"http:\/\/goos.blog\/2022\/08\/learning-trex\/json\/emix2-mult_400-dur_600-1660148778698.json\">full json stats here<\/a><\/p>\n<\/blockquote>\n<p>As you can see (I&rsquo;m assuming you clicked the json link), there&rsquo;s plenty of stats that I&rsquo;m not even looking at yet.<\/p>\n<h2 id=\"next-steps\" >next steps\n<span>\n<a href=\"#next-steps\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>I&rsquo;ve bundled up all the code used in this post <a href=\"https:\/\/github.com\/velocipacktor\/trex-benchmark-sequence\">in this repo<\/a>. <br>\nDo with it what you will. I only ask that if you use this in a commercial product, you give me a free copy. Otherwise I&rsquo;m going to pirate it.<\/p>\n<p>I still need to run a suite of profiles through loopback to determine the &ldquo;best&rdquo; parameters for each given my test hardware. <br>\nAfter that I can actually run some repeatable tests on a real device!<\/p>\n<p>It&rsquo;d be neat to add a realtime graph in the cli, test duration progress bars, etc. <br>\nMaybe I&rsquo;ll do that later today&hellip; Keep an eye on that repo for changes.<\/p>\n<p>Oh, and I have that new cpu on the way! <br>\nI&rsquo;ll probably do a part 2 with finalized benchmark sets when that comes in.<\/p>"},{"title":"On A Dime - Part 1","link":"http:\/\/goos.blog\/2022\/05\/on-a-dime-pt-1\/","pubDate":"Mon, 30 May 2022 00:00:00 -0400","guid":"http:\/\/goos.blog\/2022\/05\/on-a-dime-pt-1\/","description":"<h4 id=\"why-not-just-make-it-out-of-fiberglass-dude\" ><em>why not just make it out of fiberglass dude?<\/em>\n<span>\n<a href=\"#why-not-just-make-it-out-of-fiberglass-dude\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>Over the past few <del>weeks<\/del> months I&rsquo;ve been working to get Arcadia (Slipper 17 by Starboard Yachts) ready for the water.<\/p>\n<p>I&rsquo;ve only owned the boat for a year now, and was only able to take it out twice last season. Haven&rsquo;t even gone on a proper shakedown cruise yet.<\/p>\n<p>When I first bought the boat, I noticed a small shallow crack in the rudder neck.\nI figured I could V it out later and fill it with epoxy, so I didn&rsquo;t think much of it at the time.<\/p>\n<p>Winter had other ideas though.<\/p>\n<p>I was getting ready to polish\/wax the stern, so I dismounted the rudder and set it aside.\nTaking the time to examine the crack, I found some Bad News - the crack had grown.\nA lot. Water probably got in there and froze over the winter.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/05\/on-a-dime-pt-1\/IMG_2932.jpeg\" alt=\"Big Crack\"><\/p>\n<blockquote>\n<p>Not the best place for it to nearly break half in two<\/p>\n<\/blockquote>\n<p>Lots of googling and forum reading told me three things<\/p>\n<ol>\n<li>The airfoil shape of the rudder blade is somewhat critical to good performance<\/li>\n<li>I should make a foam or balsa core and then fiberglass over it<\/li>\n<li>Another option would be to laminate cedar strips into a thiq blank and cut the rudder from that.<\/li>\n<\/ol>\n<p>Some more googling brought me to <a href=\"http:\/\/airfoiltools.com\/plotter\/index\">this tool<\/a> which worked very well to select and plot and print out a profile curve.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/05\/on-a-dime-pt-1\/profile_settings.PNG\" alt=\"profile settings\"><\/p>\n<blockquote>\n<p>This is what I ended up with, approx 3&quot; thick at the widest<\/p>\n<\/blockquote>\n<p>Now, I don&rsquo;t know fiberglass that well.\nI&rsquo;ve never really worked with it before, and I didn&rsquo;t really want to start now.\nI&rsquo;ve never really undertaken any big wood projects either, but the material is much more forgiving.<\/p>\n<p>I had the beginnings of a plan at this point:<\/p>\n<ol>\n<li>Form a blank out of cedar 2x4&rsquo;s<\/li>\n<li>Somehow cut the profile out<\/li>\n<li>Soak it in penetrating epoxy<\/li>\n<li>Coat it in regular epoxy<\/li>\n<li>Coat it in spar varnish for UV protection<\/li>\n<\/ol>\n<p>Step 1 was easy enough:<\/p>\n<ul>\n<li>Acquire lumber (ouch my wallet!)<\/li>\n<li>Chop it up<\/li>\n<li>Glue it together<\/li>\n<\/ul>\n<p><img src=\"http:\/\/goos.blog\/2022\/05\/on-a-dime-pt-1\/IMG_2954.jpeg\" alt=\"glued and clamped\"><\/p>\n<blockquote>\n<p>Not as much squeezeout as I&rsquo;d have liked to see but we&rsquo;re drowning it in epoxy later on \u00af\\<em>(\u30c4)<\/em>\/\u00af<\/p>\n<\/blockquote>\n<p>Step 2 was a little daunting, but after a good sit &rsquo;n stink about it I had an idea.\nWith a set of profile guides, I could use bar clamps as rails for a router to slide across the long axis of the blank.\nThis would get me pretty close, and then the rest of it could be sanded \/ planed away.<\/p>\n<p>First I drew up the fixturing in cad. This proved extremely valuable as I could reference dimensions live as I built the fixture.\n(It didn&rsquo;t come to me until halfway through that I would need to mirror the fixture angle to do the other side&hellip; I would have designed it a little differently had I realized that.)<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/05\/on-a-dime-pt-1\/onshape.PNG\" alt=\"onshape\"><\/p>\n<blockquote>\n<p>Onshape is like solidworks lite, I really like it<\/p>\n<\/blockquote>\n<p>After building the fixture I was ready to start router-ing away the bulk of the material to remove.\nThe first few passes were really light, but pretty quickly I was taking very heavy passes.\nTo its credit, the &lsquo;ol Craftsman router did very well.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/05\/on-a-dime-pt-1\/IMG_3006.jpeg\" alt=\"in progress\"><\/p>\n<blockquote>\n<p>5\/8&quot; round nose top bearing carbide bit, 1\/2&quot; stepover. Cedar is wonderful to work with.<\/p>\n<\/blockquote>\n<p>Some work with the power hand planer brought us to this:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/05\/on-a-dime-pt-1\/IMG_3016.jpeg\" alt=\"rough form completed\"><\/p>\n<blockquote>\n<p>outline of old rudder traced on, will probably make the back edge less swoop-ey<\/p>\n<\/blockquote>\n<p>And that&rsquo;s where I leave you for today.<\/p>\n<p>I still need to finish sanding it to final form.\nAfter that comes epoxy.<\/p>\n<p>Lots of epoxy.<\/p>"},{"title":"The gaming server","link":"http:\/\/goos.blog\/2022\/04\/gaming-vm\/","pubDate":"Mon, 18 Apr 2022 11:24:00 -0400","guid":"http:\/\/goos.blog\/2022\/04\/gaming-vm\/","description":"<h3 id=\"a-somewhat-elegant-solution-to-a-nonexistant-problem\" ><em>a somewhat elegant solution to a nonexistant problem<\/em>\n<span>\n<a href=\"#a-somewhat-elegant-solution-to-a-nonexistant-problem\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>MacOS is nice. Really nice. Really good. At most things&hellip;<\/p>\n<p>Gaming, not so much. Windows still leads that pack (duh), with linux trailing closely behind these days.\nSo what does a man with a hackintosh on the desktop and some big iron in the closet do?\nSlap a gpu in the iron and stream all the games to both the desktop and a steam link on the teevee!<\/p>\n<h3 id=\"so-many-games-so-little-time\" >so many games, so little time\n<span>\n<a href=\"#so-many-games-so-little-time\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>After the rx580 came in and was installed last night, I was ready to setup the vm that would consume it.\nFirst I isolate the vm with vfio. tl;dr <code>vfio-pci.ids=1002:67df,1002:aaf0<\/code> is all you need on modern kernels.\nThen a standard winderp install, q35, omvf, etc. Fight my way through the horrible oobe and I&rsquo;m finally at the desktop.\nAttach the gpu, detach the qemu display, and I&rsquo;m done&hellip; Kinda.<\/p>\n<p>This gpu has hardware encode (unlike my 1030), so I could use parsec for remote desktop while setting it up.\nIt&rsquo;s a bit nicer than reemo overall. I like the h265 support and 2fa.\nI don&rsquo;t really like how it signed me out of the client between last night and today.\nI get steam setup and click install on a bunch of games in my &ldquo;play eventually&rdquo; collection.<\/p>\n<h3 id=\"a-mostly-uneventful-process\" >a mostly uneventful process\n<span>\n<a href=\"#a-mostly-uneventful-process\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>After a few games finished downloading on the vm, I fired up steam on my desktop for a quick test.\nI plug in my dualshock3, run <a href=\"https:\/\/github.com\/libsdl-org\/SDL\/issues\/4923#issuecomment-966722634\">ds3activate<\/a> (thanks apple for dropping support for it in Monterey&hellip;), and launch one of my favorite kill-5-minutes games, The Ramp.\nUnsurprisingly, it fires right up and justwerks. Thanks valve!<\/p>\n<h3 id=\"what-about-that-300gb-of-emulator-games-tho\" >what about that 300gb of emulator games tho?\n<span>\n<a href=\"#what-about-that-300gb-of-emulator-games-tho\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>Over time I&rsquo;ve built up quite a few emulator games. Sure, 200 of that 300gb is taken up by like four ps3 games, but there&rsquo;s quite a few retro, ngc, wii, etc games as well.<\/p>\n<p><a href=\"https:\/\/github.com\/SteamGridDB\/steam-rom-manager\">Steam-rom-manager<\/a> helps a <em><strong>lot<\/strong><\/em> with managing that.<\/p>\n<p>It needs some manual overrides and massaging, but in the end I get a nice list of steam custom shortcuts for all my emul games.<\/p>\n<p>&ldquo;Ready to play&rdquo; was looking pretty gross at this point:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/gaming-vm\/so_many_games.png\" alt=\"steam game list\"><\/p>\n<blockquote>\n<p>I think I&rsquo;m going to remove a lot of these roms that I don&rsquo;t actually play.<\/p>\n<\/blockquote>\n<p>I&rsquo;m considering trying to make a collection manager, so I can have a collection that&rsquo;s <code>not emulated<\/code>.\nOr, valve could add the NOT operator to dynamic collections. That&rsquo;d be cool too.<\/p>\n<p>Another annoyance - categories for non-steam applications don&rsquo;t carry between computers&hellip; Although they do show up on the steam link (as you&rsquo;d expect).<\/p>\n<p>So instead of having this nice organization structure, I have this mess:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/gaming-vm\/collections.png\" alt=\"steam filters\"><\/p>\n<blockquote>\n<p>vm on left, desktop on right (I rm&rsquo;d some of the roms I was never going to play)<\/p>\n<\/blockquote>\n<p>From what I&rsquo;ve read online, collections are stored <em><strong>in the cloud<\/strong><\/em>, not a local vdf file like shortcuts.\nProbably have to interact with the api to copy them, but a quick search on valvo&rsquo;s documentation page didn&rsquo;t show any publicly documented endpoints.\nOh well. At least I have search on my desktop.<\/p>\n<p>A thought - what if there was a desktop steam link client?<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/gaming-vm\/ouchie.png\" alt=\"steam message\"><\/p>\n<blockquote>\n<p><a href=\"https:\/\/store.steampowered.com\/app\/353380\/Steam_Link\/\">Turns out there is&hellip; Rather was<\/a>&hellip; <a href=\"https:\/\/steamcommunity.com\/app\/353380\/discussions\/9\/3108017414028756807\/\">But maybe there&rsquo;s hope?<\/a><\/p>\n<\/blockquote>\n<p>With apple dropping i386 support back in catalina, I&rsquo;m SOL. Again. Woo.<\/p>\n<p>Yeah yeah I can just remote in with parsec and browse\/play that way - and I might end up with that workflow.\nI&rsquo;ll try both and see how it goes.<\/p>\n<h3 id=\"a-new-hope\" >a new hope\n<span>\n<a href=\"#a-new-hope\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>Some time passes. I cook dinner, feed the cats, take out the trash.<\/p>\n<p>Then I think <em>&ldquo;I never checked the actual apple app store, did I?&rdquo;<\/em><\/p>\n<p>Sure enough:\n<img src=\"http:\/\/goos.blog\/2022\/04\/gaming-vm\/oh_look.png\" alt=\"apple app store\"><\/p>\n<blockquote>\n<p>There it is!<\/p>\n<\/blockquote>\n<p>This is perfect for my needs. Thanks valve!<\/p>\n<h3 id=\"cpu--node-pinning\" >cpu \/ node pinning\n<span>\n<a href=\"#cpu--node-pinning\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>I should probably pin this vm to cpu0\/node0.<\/p>\n<p>A few <code>numactl<\/code> commands to see how my iron is laid out and I&rsquo;m ready to ^c^v his hook script and config entries.\nAs I turn my dev vms back on, I&rsquo;ll want to pin them to cpu1, so i create both a <code>pin-numa0.sh<\/code> and <code>pin-numa1.sh<\/code><\/p>\n<p>This didn&rsquo;t quite work though.\nThe cpu pinning script was working (albeit with one failure call to taskset failing, not sure why yet), but the memory pinning wasn&rsquo;t.\nAdditionally, the <code>qm start<\/code> command was timing out every now and then. There is a <code>--timeout<\/code> flag, but it&rsquo;d be nice if this was in the vm config instead so the webui would reflect this too.<\/p>\n<p>Tossing this in the hookscript fixed the memory pinning. Yeah, kinda gross to flush page cache every time I start a pinned vm, but whatever:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">if<\/span> <span style=\"color:#f92672\">[[<\/span> <span style=\"color:#e6db74\">&#34;<\/span>$2<span style=\"color:#e6db74\">&#34;<\/span> <span style=\"color:#f92672\">==<\/span> <span style=\"color:#e6db74\">&#34;pre-start&#34;<\/span> <span style=\"color:#f92672\">]]<\/span>; <span style=\"color:#66d9ef\">then<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> echo <span style=\"color:#ae81ff\">1<\/span> &gt; \/proc\/sys\/vm\/drop_caches\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">fi<\/span>\n<\/span><\/span><\/code><\/pre><\/div><h3 id=\"final-thoughts\" >final thoughts\n<span>\n<a href=\"#final-thoughts\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>Should you do something like this? Well, maybe.\nIf you have the extra hardware and the use case, go for it.\nIt&rsquo;s not that hard anymore, and the bennies are pretty nice.\nI don&rsquo;t have to tie up a desktop for the steam link anymore, and I don&rsquo;t need to boot to windows for casual gaming.<\/p>"},{"title":"Armitage upgrades - gpu, nvme, blikvm","link":"http:\/\/goos.blog\/2022\/04\/updoots-part-1\/","pubDate":"Sun, 17 Apr 2022 06:00:00 -0400","guid":"http:\/\/goos.blog\/2022\/04\/updoots-part-1\/","description":"<h3 id=\"when-packing-this-order-to-ship-our-inventory-was-off-on-these-we-have-4-of-the-8-sticks-we-can-refund-you-for-4-and-send-out-the-other-4-or-we-can-cancel-the-whole-order-sorry-for-the-mix-up\" ><em>When packing this order to ship our inventory was off on these, we have 4 of the 8 sticks. We can refund you for 4 and send out the other 4, or we can cancel the whole order. Sorry for the mix-up.<\/em>\n<span>\n<a href=\"#when-packing-this-order-to-ship-our-inventory-was-off-on-these-we-have-4-of-the-8-sticks-we-can-refund-you-for-4-and-send-out-the-other-4-or-we-can-cancel-the-whole-order-sorry-for-the-mix-up\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p><img src=\"http:\/\/goos.blog\/2022\/04\/updoots-part-1\/nerd_shit.jpg\" alt=\"packages\"><\/p>\n<blockquote>\n<p>I arrived home to four bits of nerd shit in my mailbox<\/p>\n<\/blockquote>\n<p>I have several upgrades in mind for my lab box.<\/p>\n<h3 id=\"blikvm\" >blikvm\n<span>\n<a href=\"#blikvm\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>A while back I ordered a blikvm (I liked the board layout more than the pi-kvm, and that it uses a cm4) for this box, but I was unable to get video capture working at all.\nI messed around with edid settings on the capture device for days with no joy. Tried several cables, different gpus even. Nothing.\n<code>\/sys\/class\/drm\/whatever<\/code> showed disconnected on the output each time.\nFeeling somewhat desperate, I ordered a vga -&gt; hdmi adapter. Spoiler alert, it kinda works. I have video in bios, grub, and initramfs, but after that&hellip; nothing.\nI&rsquo;ll have to play with edid settings again now that I have the adapter in play.\nI&rsquo;m probably going to order an inline hdmi edid emulator to see if that works better, as a bonus it&rsquo;ll be more compact.<\/p>\n<p>I also found a remote power switch header on the board (thanks dell!) so I even have power button control. That&rsquo;ll be handy, I&rsquo;m sure.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/updoots-part-1\/pikvm_webui.png\" alt=\"pikvm webui\"><\/p>\n<blockquote>\n<p>INTEL (R) CPU 0000<br>\nthat&rsquo;s what you get for buying qa samples I guess<\/p>\n<\/blockquote>\n<h3 id=\"gpu\" >gpu\n<span>\n<a href=\"#gpu\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>With kvm access finally working, I moved on to the gpu - a sexy dell rx580 with 8gb of vwam. Why dell \/ reference blower layout?\nThere&rsquo;s only about a half inch of space above the top of the pcie slots. Thanks dell&hellip; When I first got this box, I had to cut some supports out of the lid to fix my 660 in there.\nThis gpu will be passed through to my <em><strong>GAMING VM<\/strong><\/em>, which will be covered in a future post.<\/p>\n<h3 id=\"nvme\" >nvme\n<span>\n<a href=\"#nvme\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>A few years back I acquired 4x 1tb intel nvme without realizing it was in 22110 form factor. Whoops, that won&rsquo;t fit in anything.\nI was too lazy to return it, so into the parts bin it went.\nUntil one day, I was quoting a new (to us) server for work, and I saw this card was a thing that existed:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/updoots-part-1\/0NTRCY.jpg\" alt=\"dell 0NTRCY\"><\/p>\n<blockquote>\n<p>dell p\/n 0NTRCY<\/p>\n<\/blockquote>\n<p>It takes 2x 22110 (or smaller) nvme bois and lets you plug them into a x8 slot - although you do require bifurcation support as there is no plx chip.\nI only ordered one of the two that I&rsquo;ll need because I am unsure if armitage even supports bifurcation - there&rsquo;s nothing in the bios, but I&rsquo;ve seen automagic bifurcation in the past.<\/p>\n<p>Does it work? I&rsquo;m about to find out! <em>hits enter on grub2<\/em><\/p>\n<p>It sure does!<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">root@armitage:~# lsblk | grep nvme\nnvme0n1 259:0 0 931.5G 0 disk\nnvme1n1 259:1 0 931.5G 0 disk\n<\/code><\/pre><p>So now I just need to create a zfs pool for this and start setting up vms on it.<\/p>\n<h3 id=\"fan-controller\" >fan controller\n<span>\n<a href=\"#fan-controller\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>This is a simple one that I&rsquo;d recommend for any dell workstation.\nApparently exhaust fans aren&rsquo;t required on a dual socket workstation.\nHP has a different opinion on this, as do I.\nSo I added some exhaust fans. 2x 80mm delta somethings.\nAt full 12v, they&rsquo;re rather loud. They&rsquo;re the loudest fans in this system, by a noticeable margin.\n$5 fan controller kit fixes that. Not much more to say about it.<\/p>\n<h3 id=\"up-next\" >up next\n<span>\n<a href=\"#up-next\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>I need to order another of those dell carrier cards, and the balance of the ram.\nThe ram seller messaged me saying they only had 4 of the 8 sticks I wanted.\nGiant sadface, now I need to buy from 3 different vendors to get the remaining 4 sticks.\nAfter that, I think I&rsquo;ll be done upgrading armitage for a while.\nThe only other thing I really want to do is to trade the 4x2.5 bay for a 6x2.5, and run boot\/root off full size satabois.\nRight now it boots from a pair of msata cards on a startech.com carrier.\nIt&rsquo;s&hellip;. acceptable. Not performant by any measure. dist-upgrades are pretty painful.<\/p>\n<h3 id=\"edit---oops\" >edit - oops\n<span>\n<a href=\"#edit---oops\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>Got tired of not having hardware encode on the 1030 for the hammer vm. That can live inside a dell business desktop I have anyway.\nSo I did this:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/updoots-part-1\/oops.png\" alt=\"rx 550 order page\"><\/p>\n<p>Amd cards are easier to passthrough anyway.<\/p>"},{"title":"Hammer VM (Or: How I Learned To Hate the Quadro k2000)","link":"http:\/\/goos.blog\/2022\/04\/hammer-time\/","pubDate":"Thu, 14 Apr 2022 00:00:00 -0400","guid":"http:\/\/goos.blog\/2022\/04\/hammer-time\/","description":"<h3 id=\"so-i-just-passthrough-the-quadro-to-another-windows-vm-for-hammer-and-stuff\" ><em>so i just passthrough the quadro to another windows vm for hammer and stuff<\/em>\n<span>\n<a href=\"#so-i-just-passthrough-the-quadro-to-another-windows-vm-for-hammer-and-stuff\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>Sometimes I like making CS:GO Surf maps. I&rsquo;ve only released <a href=\"https:\/\/steamcommunity.com\/sharedfiles\/filedetails\/?id=2404967658\">one<\/a>, but I have grand ideas for several more.<\/p>\n<h2 id=\"the-need\" >The need\n<span>\n<a href=\"#the-need\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>In order to support this now that I&rsquo;m running Monterey on my desktop, I needed a winderp env.\nI could combine this with the <strong>GAMING VM<\/strong> I have planned, but no, I don&rsquo;t want to.\nI have a halfway-decent quadro k2000, so passing it through to a vm on Armitage should be easy enough, right?<\/p>\n<p>I&rsquo;ve passed this card through on this host before (albeit on cpu1 instead of cpu0), so I start out pretty confident. I click the buttons, add the pci device to the host config, make sure it&rsquo;s bound by vfio-pci, etc.<\/p>\n<h2 id=\"oh-no\" >Oh No\n<span>\n<a href=\"#oh-no\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Except&hellip; The moment I start the vm, the host console is FLOODED with mcelog events, leading to an eventual panic and cpu reset.<\/p>\n<p>Not Good. Along with the kernel panic there was some amount of human panic. Was Armitage dying (right after I spent lossa money on new goodies for it)?<\/p>\n<p>The errors are logged to bios (this is a workstation with ecc after all), so I swap the stick of wam in question over to another slot.\nAfter doing that though, the system just crashed even faster, and didn&rsquo;t log the problem stick to bios. I pulled the plug and went to bed.<\/p>\n<h2 id=\"trying-again\" >Trying again\n<span>\n<a href=\"#trying-again\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>I wake up the next day with a clear head and some fresh ideas.\nFirst thing, I booted the vm without the quadro card attached. It came up just fine, and the host was happy.\n:thonking:<\/p>\n<p>I then created a vm that would allocate 126 of the 128gb of wam on the host. It came up just fine, and the host was still happy.<\/p>\n<p>Was I imagining the mce events? No, they&rsquo;re right there in the bios log still&hellip; Odd.\nI attached the quadro to the winderp vm and started it again. Instant mcepanic and reset.<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">[ 510.749751] DMAR: DRHD: handling fault status reg 2\n[ 510.749757] DMAR: [DMA Read] Request device [03:00.0] PASID ffffffff fault addr fffffff000 [fault reason 06] PTE Read access is not set\n[ 510.837379] DMAR: DRHD: handling fault status reg 102\n[ 510.837384] DMAR: [DMA Read] Request device [03:00.0] PASID ffffffff fault addr fffffff000 [fault reason 06] PTE Read access is not set\n[ 510.847689] DMAR: DRHD: handling fault status reg 202\n[ 510.847693] DMAR: [DMA Read] Request device [03:00.0] PASID ffffffff fault addr fffffff000 [fault reason 06] PTE Read access is not set\n[ 510.847720] DMAR: DRHD: handling fault status reg 302\n<\/code><\/pre><p>This fun stuff was logged at vm start and right before the mce explosion. It also logged whenever I did a reset of the gpu from inside the guest.\nIt was starting to smell like a rom-bar type issue. I don&rsquo;t know what address that is referenced in those dma errors, but it sure smells like the guest is trying (and failing) to read the vbios.<\/p>\n<p>On a hunch, I swapped the quadro with the boot graphics. The quadro had been in the blue slot, which is probably the &ldquo;primary&rdquo; pcie slot.\nNow it was in a x4 slot, which in theory would restrict performance, but who cares, I just need it to drive some light opengl shit.<\/p>\n<p>I was no longer getting mcedeath each time I started the vm, but I was still getting error 43&rsquo;d in the guest. I tried with <code>rombar=0<\/code>, however that lead to a full host lockup.<\/p>\n<p>I <em>really<\/em> wish my pi-kvm was working. Hopefully that vga -&gt; hdmi adapter I ordered works. If not I guess I can try an inline edid emulator. More on that later though.<\/p>\n<p>I decided to try passing the vbios to the guest as a <code>romfile=<\/code> param. This didn&rsquo;t log any errors, but did rather quickly lead to a whole host lockup, probably right around the time the guest activated the gpu.<\/p>\n<h2 id=\"giving-up-for-now\" >Giving up (for now)\n<span>\n<a href=\"#giving-up-for-now\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>It was at this point I gave up and removed the quadro from Armitage.\nI&rsquo;m not sure if the card itself is bad, or if it just hates the pcie layout on the t7910.\nI can use spice\/qxl and it should be enough.\nIf not, I&rsquo;ll order a firepro or something. I&rsquo;m done with nvidia. At least for today.<\/p>\n<h2 id=\"virt-viewer-on-macos\" >virt-viewer on macos\n<span>\n<a href=\"#virt-viewer-on-macos\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>For the qxl driver, you really need a proper spice client.\nThere&rsquo;s an official .app these days, but I wasn&rsquo;t able to get it to ingest the spice file that pve generated.\nAdditionally, it wasn&rsquo;t providing the .vv extension with the download, so I couldn&rsquo;t associate it that way.\nI ended up installing virt-viewer via homebrew.\nI found <a href=\"https:\/\/gist.github.com\/tomdaley92\/789688fc68e77477d468f7b9e59af51c\">this post<\/a>, and decided to setup an automator.app to launch it directly, instead of feeding it the downloaded .vv file from pve.\nI ended up hardcoding the vmid, as this is (for now) the only vm on armitage using qxl.\nIf there are any more in the future I&rsquo;ll probably do the same, I like having direct shortcuts.<\/p>\n<h2 id=\"hammer-time-stop\" >Hammer Time. Stop.\n<span>\n<a href=\"#hammer-time-stop\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Now that I had a working vm, I needed hammer and friends. I download steam and do the thing, then I copy over hammer++ (which is now available for csgo!).\nSmall problem though: The mouse in the 3d preview&hellip; is kinda screwy.\nEven after dropping the sensitivity to the lowest, it&rsquo;s still basically unusable.\nI feel like this would be resolved with a gpu and using vnc or rdp. It would also probably allow me to run csgo to quickly test maps.<\/p>\n<p>Digging through the junk bins, I found two more gpus to try. A radeon 7570, and a nvidia gt1030.\nGiven that the 1030 is several years newer than both the radeon and the quadro, I decided to try that first.\nThe vm booted right up with nothing scary printed to host dmesg. That&rsquo;s a good start.\nAfter removing the quadro drivers and installing consumer ones, the gpu started right up.<\/p>\n<p>Hammer was much smoother and better behaved now.\nI could even play csgo at a good enough framerate for testing maps, if I could find a remote desktop setup that wasn&rsquo;t so latent.<\/p>\n<h2 id=\"remote-desktop-that-doesnt-suck\" >Remote Desktop that Doesn&rsquo;t Suck\n<span>\n<a href=\"#remote-desktop-that-doesnt-suck\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Up until this point I&rsquo;ve been accessing the guest using vnc and rdp, both of which kinda suck for high-framerate things.\nSadly, the GT1030 does <em>not<\/em> have nvenc or hardware encode of any sort. That nixes Parsec and Moonlight.\nRainway worked, but it captured the mouse HARD and didn&rsquo;t let it go. That&rsquo;s no bueno for a remote desktop.\nTime to try the radeon card. (spoiler alert: it didn&rsquo;t work for parsec either).<\/p>\n<p>Given that the 1030 had given me usable framerates in csgo, I decided to swap that back in.\nAfter editing \/etc\/modprobe.d\/vfio.conf for the 10,000th time today, the vm was back up and running with the 1030.<\/p>\n<p>I also tried out (and really liked) reemo for remote desktop. I think this is the winner.\nIt has the option to switch between relative and absolute mouse modes, which I haven&rsquo;t seen before.\nThis completely fixes my 3d preview issues in hammer, which is really nice.<\/p>\n<p>Now that I have hammer running in a dedicated environment, I feel motivated to work on maps again.\nI also have one less reason to ever reboot into my winderp install.<\/p>"},{"title":"The HP Revolve 810 G1","link":"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/","pubDate":"Wed, 13 Apr 2022 06:00:00 -0400","guid":"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/","description":"<h4 id=\"wow-thats-a-cute-laptop-too-bad-it-runs-windows\" ><em>wow that&rsquo;s a cute laptop, too bad it runs windows<\/em>\n<span>\n<a href=\"#wow-thats-a-cute-laptop-too-bad-it-runs-windows\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>I was given this laptop with a dead battery and a keyboard sans Lshift.<br>\nIt looks like a macbook, so lets turn it into one before fixing it!<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/revolve-810-g1.jpg\" alt=\"HP Revolve 810 Stock Photo\"><\/p>\n<h2 id=\"dont-panic\" >Don&rsquo;t Panic\n<span>\n<a href=\"#dont-panic\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>This hardware is older and more specialized, this won&rsquo;t be nearly as straightforward as my desktop was.\nBecause of this I&rsquo;ll be going a bit more in depth on the weirder things. You can take that as a bad thing or a good thing, your choice.<\/p>\n<h3 id=\"the-setup\" >The setup\n<span>\n<a href=\"#the-setup\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>Like before, we start with the installer.\nSpoiler ahead, I already tried this with Monterey and failed, so I&rsquo;ll be typing this as I attempt it with Big Sur 11.6.5\nI&rsquo;ll gloss over how to create the installer as dortania&rsquo;s documentation is plenty.<\/p>\n<p>Our first stop is into a linux livecd to collect some info on our hardware. The debian live+nonfree is in my urlbar history, so that&rsquo;s what I grabbed for this.\nAnything with lspci and lshw will be fine.<\/p>\n<pre tabindex=\"0\"><code class=\"language-none\" data-lang=\"none\">root@debian:~# grep -i &#34;model name&#34; \/proc\/cpuinfo\nmodel name : Intel(R) Core(TM) i7-3687U CPU @ 2.10GHz\nmodel name : Intel(R) Core(TM) i7-3687U CPU @ 2.10GHz\nmodel name : Intel(R) Core(TM) i7-3687U CPU @ 2.10GHz\nmodel name : Intel(R) Core(TM) i7-3687U CPU @ 2.10GHz\nroot@debian:~# lspci | grep -i vga\n00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)\nroot@debian:~# dmidecode -t baseboard\n# dmidecode 3.3\nGetting SMBIOS data from sysfs.\nSMBIOS 2.7 present.\nHandle 0x0002, DMI type 2, 16 bytes\nBase Board Information\nManufacturer: Hewlett-Packard\nProduct Name: 18F8\nVersion: KBC Version 51.27\nSerial Number: PDMQT1A2F4J0SU\nAsset Tag: Not Specified\nFeatures:\nBoard is a hosting board\nBoard is replaceable\nLocation In Chassis:\nChassis Handle: 0x0003\nType: Unknown\nContained Object Handles: 0\nHandle 0x0005, DMI type 10, 6 bytes\nOn Board Device Information\nType: Video\nStatus: Enabled\nDescription: 64\nHandle 0x0006, DMI type 41, 11 bytes\nOnboard Device\nReference Designation: 64\nType: Video\nStatus: Enabled\nType Instance: 1\nBus Address: 0000:00:02.0\nHandle 0x0007, DMI type 41, 11 bytes\nOnboard Device\nReference Designation: WLAN\nType: Ethernet\nStatus: Enabled\nType Instance: 1\nBus Address: 0000:03:00.0\nroot@debian:~# dmesg | grep -i input\n[ 2.485380] input: AT Translated Set 2 keyboard as \/devices\/platform\/i8042\/serio0\/input\/input0\n[ 2.762604] input: Sleep Button as \/devices\/LNXSYSTM:00\/LNXSYBUS:00\/PNP0C0E:00\/input\/input5\n[ 2.762682] input: Lid Switch as \/devices\/LNXSYSTM:00\/LNXSYBUS:00\/PNP0C0D:00\/input\/input6\n[ 2.762729] input: Power Button as \/devices\/LNXSYSTM:00\/LNXPWRBN:00\/input\/input7\n[ 3.003341] input: Video Bus as \/devices\/LNXSYSTM:00\/LNXSYBUS:00\/PNP0A08:00\/LNXVIDEO:01\/input\/input12\n[ 4.026364] input: Atmel Atmel maXTouch Digitizer Touchscreen as \/devices\/pci0000:00\/0000:00:1a.0\/usb1\/1-1\/1-1.1\/1-1.1:1.0\/0003:03EB:840B.0001\/input\/input13\n[ 4.026449] input: Atmel Atmel maXTouch Digitizer as \/devices\/pci0000:00\/0000:00:1a.0\/usb1\/1-1\/1-1.1\/1-1.1:1.0\/0003:03EB:840B.0001\/input\/input14\n[ 4.026553] hid-generic 0003:03EB:840B.0001: input,hiddev0,hidraw0: USB HID v1.11 Device [Atmel Atmel maXTouch Digitizer] on usb-0000:00:1a.0-1.1\/input0\n[ 4.026683] hid-generic 0003:03EB:840B.0002: hiddev1,hidraw1: USB HID v1.11 Device [Atmel Atmel maXTouch Digitizer] on usb-0000:00:1a.0-1.1\/input1\n[ 4.027623] hid-generic 0003:0483:91D1.0003: hiddev2,hidraw2: USB HID v1.10 Device [\u0409 \u0409] on usb-0000:00:1d.0-1.6\/input0\n[ 4.287256] input: AlpsPS\/2 ALPS GlidePoint as \/devices\/platform\/i8042\/serio4\/input\/input11\n[ 9.390753] input: HP Wireless hotkeys as \/devices\/virtual\/input\/input15\n[ 9.658174] input: PC Speaker as \/devices\/platform\/pcspkr\/input\/input17\n[ 9.668017] input: HP WMI hotkeys as \/devices\/virtual\/input\/input16\n[ 9.769920] input: Atmel Atmel maXTouch Digitizer as \/devices\/pci0000:00\/0000:00:1a.0\/usb1\/1-1\/1-1.1\/1-1.1:1.0\/0003:03EB:840B.0001\/input\/input18\n[ 9.772380] input: Atmel Atmel maXTouch Digitizer Stylus as \/devices\/pci0000:00\/0000:00:1a.0\/usb1\/1-1\/1-1.1\/1-1.1:1.0\/0003:03EB:840B.0001\/input\/input19\n[ 9.772731] hid-multitouch 0003:03EB:840B.0001: input,hiddev0,hidraw0: USB HID v1.11 Device [Atmel Atmel maXTouch Digitizer] on usb-0000:00:1a.0-1.1\/input0\nroot@debian:~# lspci | grep -i network\n00:19.0 Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (Lewisville) (rev 04)\n03:00.0 Network controller: Intel Corporation Centrino Advanced-N 6235 (rev 24)\nroot@debian:~#\n<\/code><\/pre><p>Now that we know what hardware we have we can gather up the stuff we need to boot into the installer (we&rsquo;ll figure out the rest after).<\/p>\n<p>First I run <code>installinstallmacos.py<\/code> again, this time selecting Big Sur 11.6.5.\nIt took quite a while to download:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/hide_the_pain.png\" alt=\"Screenshot of wget\"><\/p>\n<p>And even longer to flash. Maybe my usb3 ports&hellip; aren&rsquo;t usb3.<\/p>\n<p><em>hey siri, remind me tomorrow to look into usb mapping<\/em><\/p>\n<p>I then took a quick run through the &ldquo;gathering files&rdquo; section of the opencore install guide.\nI felt pretty confident that I kinda knew what I was doing, so I speedran the kexts and acpi sections (this will bite me later, I&rsquo;m sure).<\/p>\n<p>At this point my efi looked like this:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/efi_take1.png\" alt=\"Screenshot of EFI Folder\"><\/p>\n<p>I plugged the drive in and attempted to boot. The boot menu came up, but after passing to the initramfs or whatever (how does macos boot work anyway?) the framebuffer was out of sync.\nLooked like the horizontal signal wasn&rsquo;t quite right.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/wut.jpg\" alt=\"Picture of screen tearing\"><\/p>\n<blockquote>\n<p>I decided to let it cook.<\/p>\n<\/blockquote>\n<p>After a few minutes, I was presented with the Big Sur recovery\/installer screen&hellip;. In Russian.<\/p>\n<p>For some reason, OpenCore defaults to Russian for the locale. Probably because most of the big nerds in the hackintosh world are from over there.\nI was aware of this, and had flipped the necessary bits in my opencore config. For some reason though, this didn&rsquo;t work on the wee laptop.<\/p>\n<p>It was now the wrong side of 5am (again!). I went to sleep.<\/p>\n<h3 id=\"why-the-f-is-the-installer-still-in-russian\" >Why the f*!$ is the installer still in russian?\n<span>\n<a href=\"#why-the-f-is-the-installer-still-in-russian\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p><img src=\"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/best_friend.png\" alt=\"Screenshot of MountEFI application\"><\/p>\n<blockquote>\n<p>Here I am again my old friend. Mounting an ESP to make yet another change to a <code>config.plist<\/code>.<\/p>\n<\/blockquote>\n<p>I fire up ProperTree for what must be the 200th time (they should add an hour meter), and confirmed what I knew last night: I had indeed changed the language entry.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/if_this_doesnt_work.png\" alt=\"Screenshot of ProperTree application\"><\/p>\n<p>Frustrated at that not working, I threw in an entry that would delete that parameter, forcing opencore to rebuild it.\nI think that&rsquo;s what this does at least. Time to go back to the laptop and see if it boots.<\/p>\n<p>After too long a time, I&rsquo;m presented with the installer again. This time, it&rsquo;s in english!\nI (try to) fire up terminal.app to see what&rsquo;s what (does my disk show up?), but my trackpad doesn&rsquo;t work.\nSadface, but that&rsquo;s on me for not pulling in the right kexts.\nWe&rsquo;ll fix that later, for now I plugged in a mouse into the other usb port. Trackpads suck anyway, trackpoint4lyfe.<\/p>\n<p>Thankfully, the keyboard did work. A quick <code>diskutil list<\/code> showed that indeed I did have a <code>\/dev\/disk0<\/code> of the right size and shape. Time to install!<\/p>\n<p>But first, I needed a partition name. After a few minutes of thinking, I decided to take the lazy out and just name it <code>macos-root<\/code>.\nAPFS is neat. It smells like LVM, and probably acts somewhat like it. I should learn more. Although to be fair I don&rsquo;t know much about ntfs or ext4 either.\nI&rsquo;m a ceph (and zfs) person, smol volumes have never mattered much to me.<\/p>\n<p>I click through the installer and got comfy, this could take a while. I like how macos has the installer log right there.\nI also like how it&rsquo;s basically just <code>dmesg -w<\/code>, so if you turn up the verbosity you can see all the kernel output.\nWait. 1 pm already? It was noon when I woke up, and I&rsquo;ve done basically nothing today!<\/p>\n<p>After about 20 minutes the first stage of the install was complete, and the laptop rebooted itself (as intended).\nIt continued on, framebuffer still broken for kernel <code>-v<\/code> output, but whatever. Another half hour or so and it should be done!<\/p>\n<p>While waiting for that, I did a little online shopping - this time I was looking for a passthrough edid faker for my blikvm (more on that in a later post).\nThe tl;dr there is that it refuses to capture video from everything I&rsquo;ve tried - except for another raspi. Go figure.\nAnd yes, I&rsquo;ve tried dozens of different edid settings on the csi capture card - no avail. The target just acts like there&rsquo;s no cable connected.\nAny ideas? Shoot me an email (please).<\/p>\n<p>Been at <em>About 7 minutes remaining<\/em> for half an hour now&hellip; How much longer will this take?<\/p>\n<p>Oh. There it goes. <del>Four<\/del> Five <em>long<\/em> reboots later and I have the OOBE to click through.<\/p>\n<p>After that, I land at the desktop. Woohoo!<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/great_success.png\" alt=\"Screenshot of Big Sur desktop\"><\/p>\n<p>First things first, let&rsquo;s dd our esp over so we don&rsquo;t need the install usb anymore:<br>\n<code>dd if=\/dev\/disk2s1 of=\/dev\/disk0s1<\/code><\/p>\n<h2 id=\"making-all-the-things-work\" >Making all the things work\n<span>\n<a href=\"#making-all-the-things-work\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h2><p>Let&rsquo;s take inventory of what works and what doesn&rsquo;t.<\/p>\n<h4 id=\"not-working\" >Not working:\n<span>\n<a href=\"#not-working\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><ul>\n<li>Wifi (needs a kext)<\/li>\n<li>Webcam<\/li>\n<li>Audio (needs applealc + layout)<\/li>\n<li>Trackpad multi touch (surprising that it works at all , as it didn&rsquo;t work in the installer)<\/li>\n<li>Lshift key (this is getting very annoying very fast)<\/li>\n<li>Touchscreen<\/li>\n<li>Battery info and other sensors<\/li>\n<li>Volume keys<\/li>\n<li>s3 sleep<\/li>\n<\/ul>\n<h4 id=\"working\" >Working:\n<span>\n<a href=\"#working\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><ul>\n<li>Ethernet (took a minute to warm up but it did start working)<\/li>\n<li>External displayport connector (suprising)<\/li>\n<li>Bluetooth (without any kexts!)<\/li>\n<\/ul>\n<p>I turned on screen sharing so I didn&rsquo;t have to stare at a 11&quot; screen. This is just vnc so it&rsquo;s not very sekure.\n<em>hey siri, remind me to turn off vncd on lady3jane<\/em>\nYeah, I came up with a hostname cooler than what i use on my desktop. Do you know what book(s) I&rsquo;m taking names from?<\/p>\n<p>It didn&rsquo;t take long to get the basics setup. Firefox (with &ldquo;tree tabs&rdquo; extension), xcode tools for git and friends, propertree, etc.<\/p>\n<p>After some more reading and downloading, this is what my efi looked like:<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/efi_take2.png\" alt=\"Screenshot of efi directory\"><\/p>\n<blockquote>\n<p>Note that I&rsquo;ve replaced VoodooPS2Controller.kext with <a href=\"https:\/\/github.com\/BAndysc\/VoodooPS2\">this fork<\/a>, which gives me proper right-click behavior.<\/p>\n<\/blockquote>\n<p>I added stuff for wifi, battery, and other sensors. I didn&rsquo;t do audio yet because I don&rsquo;t know my alc codec (yet).\nI reboot annnnd&hellip; Boot device not found? Seems my boot entry has dropped off the firmware.\nNo problem, HP is a bro and provides a &ldquo;boot from efi file&rdquo; option which gets me back into big sur.\nBattery info is still not displaying - I wonder if this is because it doesn&rsquo;t detect the battery (linux showed no battery connected too), or if I have the wrong kext.\nGuess I&rsquo;ll have to just buy a new one and hope it works.<\/p>\n<p>But first. Benchmarks.<\/p>\n<p>Let&rsquo;s see what this old ivy bridge can do. Remember that we&rsquo;re calling ourselves a MacBookAir6,1 but we actually have a i7-3687u under the hood.\nI&rsquo;m not expecting much, but that&rsquo;s not a bad thing.<\/p>\n<p>While the benchmarks were running, I went looking for fixes for the little things. I had the trackpad working properly now, but that was about it.<\/p>\n<p><a href=\"https:\/\/github.com\/scarymen1325\/opencore_hp_810_g2\/tree\/BigSur\/OC\/Kexts\">This repo<\/a> helped me find what kexts I might need (it&rsquo;s for the gen2, but appears to be pretty close to the gen1)<\/p>\n<p>Here&rsquo;s the benchmark results. Better than what i was expecting:<\/p>\n<p><a href=\"https:\/\/browser.geekbench.com\/v5\/cpu\/14297688\">cpu benchmark results<\/a><\/p>\n<p><a href=\"https:\/\/browser.geekbench.com\/v5\/compute\/4659524\">opencl benchmark results<\/a><\/p>\n<p>Now a quick trip into a linux liveusb to determine our audio layout. I have the 92hd91bxx in this system, which gives me a list of layouts to pick from.\nWhile I&rsquo;m in here I should fix the bootloader firmware entry:<\/p>\n<p><code>efibootmgr -c -d \/dev\/sda -p 1 -L &quot;MacOS&quot; -l '\\efi\\oc\\opencore.efi'<\/code><\/p>\n<p>Except&hellip; That didn&rsquo;t work. Neither do my new kexts, the boot won&rsquo;t progress past 50%.\nPart of determining that was to enable csm support - this allowed me to see the progress bar.\nWill it fix the text framebuffer of verbose mode as well?<\/p>\n<p>Back into the liveusb we go to add <code>-v<\/code> back to our boot args!<\/p>\n<p>And hey, turning on csm did fix the text framebuffer! Some good news.<\/p>\n<p>Oh. I remember now. You&rsquo;re supposed to disable injection of one of the intel bluetooth kexts. Derp.\nBack into the liveusb. Again. I fire off the efibootmgr command again to no avail. Maybe I need to clear nvram again? I wonder if there&rsquo;s any bios updates for this lil guy&hellip;<\/p>\n<p>There is a bios update available, I should apply that at some point.<\/p>\n<p>Meanwhile, everything but audio and battery display is working! I think I can blame the battery display on the battery itself - linux was saying &ldquo;bro no battery at all&rdquo; as well.\nAudio though, that&rsquo;s probably just the AppleALC layout&hellip;<\/p>\n<p>This last trip into the liveusb I found my coded, it&rsquo;s a IDT92HD91BXX\nALC Layout 3 no joy. Let&rsquo;s try 84 (<a href=\"https:\/\/github.com\/acidanthera\/AppleALC\/blob\/master\/Resources\/IDT92HD91BXX\/Info.plist#L47\">why?<\/a>) (spoiler alert: it didn&rsquo;t work either)\nNeither 12, 13, or 33 worked either. Sadface. Now we have to boot into a liveusb again to run ssdttime and get a proper acpi mapping.<\/p>\n<p>I really need to roll a custom liveusb with all these tools preinstalled&hellip;<\/p>\n<p>Back in the liveusb, I run ssdttime and generate all my ssdts and patches. For the 300th time, I open propertree and add them to my config.plist.\nThe system boots afterwards, but none of my input devices work anymore. Grr. At least I don&rsquo;t have to setup the liveusb with propertree and friends again.\nThe culprit behind input devices failing was <code>SSDT-EC-LAPTOP.aml<\/code>. I think. After reverting from the generated one back to the generic one inputs work again.\nStill no sound though.<\/p>\n<p>After some messing around with ssdts, I have working audio!\nThe issue was, I was including the entire DSDT.aml thinking that was da wae. After removing that, the system boots and has audio and input.\nI realize now that I did this on my desktop as well, and took a few minutes to fix that. I wonder if it&rsquo;ll improve performance at all?<\/p>\n<p>At this point the only things left to do are to sign in with my apple account and get s3 sleep working.\nS3 sleep is probably going to take some manual ssdt editing, which I <em>really<\/em> don&rsquo;t feel like doing right now.\nIt only takes a few seconds to boot, so for now I can live without it.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/revolve-810-g1\/greater_success.png\" alt=\"Screenshot of about this mac and neofetch\"><\/p>\n<p>Next up: Getting it to run Monterey.<\/p>"},{"title":"Armitage upgrades","link":"http:\/\/goos.blog\/2022\/04\/armitage-upgrades\/","pubDate":"Wed, 13 Apr 2022 05:38:14 -0400","guid":"http:\/\/goos.blog\/2022\/04\/armitage-upgrades\/","description":"<h4 id=\"the-armitage-personality-was-constructed-as-part-of-experimental-computer-mediated-psychotherapy\" ><em>&hellip;the &ldquo;Armitage&rdquo; personality was constructed as part of experimental &ldquo;computer-mediated psychotherapy&rdquo;&hellip;<\/em>\n<span>\n<a href=\"#the-armitage-personality-was-constructed-as-part-of-experimental-computer-mediated-psychotherapy\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p><img src=\"http:\/\/goos.blog\/2022\/04\/armitage_upgrades\/monolith.jpg\" alt=\"Armitage front view\">\nThis is armitage, my Dell t7910.<br>\nIt runs all sorts of long-lived and short-lived vms.<\/p>\n<h3 id=\"current-specs\" >Current specs\n<span>\n<a href=\"#current-specs\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><ul>\n<li>Two E5-2667v4&rsquo;s<\/li>\n<li>64gb of ram per socket<\/li>\n<li>VM Storage: LSI SAS3008\n<ul>\n<li>4x Intel SSDSC2BB016T4 (1.6TB)<\/li>\n<li>4x HGST HE10 (10TB Helium)<\/li>\n<\/ul>\n<\/li>\n<li>Boot Storage: Startech.com 2x mSata carrier card with Marvell chipset\n<ul>\n<li>2x 64gb Sandisk whatevers<\/li>\n<\/ul>\n<\/li>\n<li>Boot graphics: Old radeon 5450 or something<\/li>\n<li>Workload graphics: Quadro K2000<\/li>\n<\/ul>\n<h3 id=\"planned-upgrades\" >Planned upgrades\n<span>\n<a href=\"#planned-upgrades\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p><img src=\"http:\/\/goos.blog\/2022\/04\/armitage_upgrades\/goodbye_money.png\" alt=\"eBay purchase history\"><\/p>\n<p>I&rsquo;m going to double the amount of ram, add a modest gaming gpu, and spin up a new nvme storage pool - assuming the motherboard supports bifurcation like the internet says it does.<\/p>\n<p>If reddit is right, I&rsquo;ll order another of those dell cards for a total of 4x 1TB intel datacenter something nvme.<\/p>\n<p>If not, I&rsquo;ll have to get a card with a PLX switch. <a href=\"https:\/\/www.amazon.com\/Supermicro-AOC-SHG3-4M2P-Full-Height-Quad-Port\/dp\/B07PNR1YSG\/\">One from supermicro runs around 200 bones.<\/a><\/p>\n<p>On another note, I&rsquo;m not the biggest fan of the msata carrier card for boot\/root.\nI might get a <a href=\"https:\/\/www.amazon.com\/ICY-DOCK-Mobile-Comparable-Tray-less\/dp\/B01M0BIPYC\/\">6-bay adapter<\/a> for the ssds and move boot\/root to 2.5&quot; disks.\nKinda spense tho.\nIt would allow me to have two 2-slot gpus in the future though&hellip; If I&rsquo;m ever able to upgrade my desktop graphics I could have <em><strong>two<\/strong><\/em> rx580s in there.\nWhich would play great into my gaming server plans.<\/p>\n<p>Why have one when you can have two, amirite?<\/p>"},{"title":"Adventures with MacOS","link":"http:\/\/goos.blog\/2022\/04\/macos-adventures\/","pubDate":"Wed, 13 Apr 2022 00:00:01 -0400","guid":"http:\/\/goos.blog\/2022\/04\/macos-adventures\/","description":"<h4 id=\"why-not-just-install-linux-dude\" ><em>why not just install linux dude?<\/em>\n<span>\n<a href=\"#why-not-just-install-linux-dude\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>I&rsquo;ve always liked <del>OSX<\/del> MacOS, dating back to when we had iMac G1s (and later G4s) in our school computer lab.<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/macos_adventures\/imac-g4-imac-g3-comparison.jpg\" alt=\"iMac G1 in Aqua\"><\/p>\n<p>Remember those? They were really nice. We should go back.<\/p>\n<p>Back when I was in uni I used some suuuuper sketchy patched installers to run Mavericks (iirc) on my FX-4350 based system.\nBack then documentation was nonexistent, you had to read through scammy-looking forums for answers, etc etc etc bullshit.\nBut you know what? It worked. It worked surprisingly well. I even played quite a bit of Team Fortress 2 on it.\nFor whatever reason I eventually I switched to Arch+KDE4 (remember tabbing together arbitrary windows?), but I&rsquo;ve always fondly remembered those osx days.<\/p>\n<p>I&rsquo;m not sure what inspired me to try running <del>OSX<\/del> MacOS this time around, but I&rsquo;m very happy to report that the situation has improved quite a bit.\nIt&rsquo;s like adults have taken over the whole ecosystem. Most things are documented, everything is on Github instead of totally-not-a-virus.com, etc.<\/p>\n<p>My current build is a 5600x with an rx580 (wanna sell me something better at msrp?). I certainly didn&rsquo;t plan this build for macos, but I&rsquo;ll be damned if I can&rsquo;t get it working.\nAfter all, if I could do it when I was dumb enough to go to uni, I should be able to do it now, right?<\/p>\n<h3 id=\"the-starting-lineup\" >The Starting Lineup\n<span>\n<a href=\"#the-starting-lineup\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>First things first, take a careful inventory of your system, note down the exact hardware ids you have, blah blah blah.<br>\nDon&rsquo;t forget to read all 50000 pages of the <a href=\"https:\/\/dortania.github.io\/OpenCore-Install-Guide\/\">OpenCore Documentation<\/a>.<br>\nAfter that you need to do this that and the other thing.<\/p>\n<p>Screw that, lets dive right in.<\/p>\n<h3 id=\"the-plan-initially\" >The Plan (initially)\n<span>\n<a href=\"#the-plan-initially\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>My plan at first was to install Monterey as a vm on <a href=\"https:\/\/www.proxmox.com\/en\/proxmox-ve\">Proxmox VE<\/a>.\nI&rsquo;ve been using PVE for years both at work and on my personal iron, and I&rsquo;m no stranger to PCI passthrough, so I figured this would be a cinch.\n<a href=\"https:\/\/www.nicksherlock.com\/2021\/10\/installing-macos-12-monterey-on-proxmox-7\/\">This guide<\/a> made it look pretty easy, and it was.<\/p>\n<p>GPU passthrough was straightforward. Enable iommu, setup some vfio stuff, and you&rsquo;re done.<\/p>\n<p>Emboldened by the almost effortless gpu passthough, I passed through the usb3 controllers. <em>&ldquo;There&rsquo;s no way this works, right?&rdquo;<\/em><\/p>\n<p>It did. It literally justwerked\u2122, no kexts or device-id changes required.<\/p>\n<p>Apparently Apple likes AMD these days? Or maybe these usb3 controllers are uh, class compliant? Is that even a thing for things that live in the chipset?<\/p>\n<p>In the past I&rsquo;ve had good luck switching between different Windows and Linux vms, moving the gpu around in a digital game of hot potato.\nKnowing that I wouldn&rsquo;t really be able to game on MacOS no matter how stronk my hardware, I had this workflow pictured:<\/p>\n<ul>\n<li>Monterey, Windows, and Linux (possibly multiple, more below) vms on the same host<\/li>\n<li>Suspend-to-disk the current vm<\/li>\n<li>Switch to a different vm<\/li>\n<li>The gpu gets released by the old vm and picked up by the new one<\/li>\n<li>It all justwerks, I don&rsquo;t have to do a full reboot, and because I&rsquo;m suspending to disk, I don&rsquo;t even have to re-open all my programs!<\/li>\n<\/ul>\n<p>Of course, it&rsquo;s never quite as easy as you think it will be.\nIn my case, it <em>almost<\/em> completely worked.\nGoing from MacOS -&gt; (Linux, Windows) worked perfectly (after I installed the <a href=\"https:\/\/github.com\/gnif\/vendor-reset\">Vendor Reset kernel module<\/a>).<\/p>\n<p>Going back to Monterey though&hellip; Didn&rsquo;t work. MacOS just wouldn&rsquo;t pick up and reactivate the gpu. Sadface.<\/p>\n<p>I was also faced with the vm not grabbing the gpu on first startup. I had to do this each time the host booted, and it was annoying:<\/p>\n<p><code>qm start 3001 &amp;&amp; sleep 5 &amp;&amp; qm stop 3001 &amp;&amp; sleep 5 &amp;&amp; qm start 3001<\/code><\/p>\n<p>I&rsquo;m sure someone could figure it all out, but I&rsquo;m not a hardware hacker by any means (the last time I wrote C was pen on paper in CS101).<\/p>\n<p>I had gotten a fresh taste of the MacOS life, and I wasn&rsquo;t going to settle for Windows or Open Sores on my desktop.\nIt was time for a different plan.<\/p>\n<h3 id=\"the-plan-reality-check\" >The Plan (reality check)\n<span>\n<a href=\"#the-plan-reality-check\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>Knowing that I was getting pretty deep into the black magik voodoo tier of host\/guest interaction, I decided to take a step back.<\/p>\n<p><em>&ldquo;It isn&rsquo;t that bad restarting programs, it&rsquo;s really just a few terminal windows and discord, I guess we can do a true multi-boot&hellip;\nYeah performance inside the vm is okay, but I want native power management and stuff like that.\nMight as well install on iron.<\/em><\/p>\n<p>Reality checked, I did a quick <code>zfs send | ssh root@maelcum zfs recv<\/code> to save my Monterey vm on my nas just in case I had to go back, and started actually reading OpenCore&rsquo;s documentation.<\/p>\n<p>First things first, we need some install media for MacOS. The guide recommends starting with Big Sur or something old like that.\nHere at goos.blog, we don&rsquo;t use old software, ever. Hardware, sure, that&rsquo;s just cheaper. But all software is free (if you try hard enough), so why use old things?<\/p>\n<p>Remembering how long it took the macos netinstall to run from a minimal boot usb, I created a full one.\nIt took well over three hours (a good hour longer than the netinstall took on the vm) to download and flash to a reasonably good usb3 thumbdrive from inside the vm. Second sadface.\nThat was the easy part.<\/p>\n<p>Not that any of this was particularly hard, but that was the easy part.<\/p>\n<p>I&rsquo;ll spare you the boredom of going through the opencore configuration, if you&rsquo;re trying to do this you should be reading the documentation, not a blog post.\nI ended up booting a livecd on my laptop to run ProperTree because I still cba to figure out how to mount an esp on Windows.\nIt didn&rsquo;t take much for me to get to a working installer, some kexts here, some patches there, about 10 roundtrips back into the vm to make edits, and here we go!\nOh&hellip; Wait&hellip; Why aren&rsquo;t any of my disks showing up?<\/p>\n<p>Like always, I had forgotten something.\nThis time around the &ldquo;something&rdquo; was an entire section of the documentation detailing how some sata controllers aren&rsquo;t supported and need an additional kernel extension.\nEasy fix, just annoying that I had glazed over yet another thing.<\/p>\n<p>At this point it was 5am (from the wrong direction). I went to bed.<\/p>\n<h3 id=\"the-aftermath\" >The Aftermath\n<span>\n<a href=\"#the-aftermath\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>I awoke at noon, somewhat refreshed, still buzzing on the &ldquo;did a cool thing&rdquo; high.<\/p>\n<p>Going into my office, I see that the desktop is in s3 sleep. <em>&ldquo;Huh, didn&rsquo;t think that&rsquo;d work out of the box&rdquo;<\/em><\/p>\n<p>I tap ctrl a few times and to my delight the system wakes up and I&rsquo;m presented with a login screen.<\/p>\n<p>It didn&rsquo;t take long to get things setup. Firefox, plex, vscode, my various email accounts (apple mail &gt; outlook \/ thunderbird), and I&rsquo;m good to go.\nI do most of my development and testing work in vms on armitage, my stronk dual socket system with lots of wam and ssd, so my actual dev envs are pretty portable.<\/p>\n<h3 id=\"the-current-state-of-things\" >The Current State Of Things\n<span>\n<a href=\"#the-current-state-of-things\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h3><p>As I type this on the Monterey side of my desktop <em>&hellip;tabs over to ebay tracking and hits refresh&hellip;<\/em>\nI&rsquo;m waiting on another RX580 to come in the mail. This one is going to go into armitage (dell t7910) and is going to be used for a <em><strong>GAMING SERVER<\/strong><\/em>\n(I&rsquo;ve been jealous of <a href=\"https:\/\/lo.calho.st\/posts\/gaming-vm\/\">tmick0&rsquo;s setup<\/a> ever since I pointed him in the right directions on it).\nLike him, I use a steam link on my teevee, and I&rsquo;ll also be able to stream games to my desktop.\nOnce that&rsquo;s setup the only time I&rsquo;ll have to leave macos is for playing CS:GO - it <em>runs<\/em> on macos, but uh&hellip; shittily.\nI have grand ideas for a boot-to-csgo linux install, we&rsquo;ll see if I find a roundtuit for that project.<\/p>\n<p>Was it all worth it?<\/p>\n<p>Yes (even though I&rsquo;ve spent $700 in the past two days on more wam and a gpu for armitage).<\/p>\n<p>Could I have just stuck with winderp or installed a linux?<\/p>\n<p>Sure. But where&rsquo;s the fun in that?<\/p>\n<p><img src=\"http:\/\/goos.blog\/2022\/04\/macos_adventures\/great_success.png\" alt=\"Screenshot of &ldquo;About this Mac&rdquo; and &ldquo;Neofetch&rdquo;\"><\/p>"},{"title":"Initial Commit","link":"http:\/\/goos.blog\/2022\/04\/initial-commit\/","pubDate":"Tue, 12 Apr 2022 00:00:01 -0400","guid":"http:\/\/goos.blog\/2022\/04\/initial-commit\/","description":"<h4 id=\"you-should-start-a-nerd-blog-man---tmick0-2022\" ><em>you should start a nerd blog man - tmick0, 2022<\/em>\n<span>\n<a href=\"#you-should-start-a-nerd-blog-man---tmick0-2022\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h4><p>And so here we are. Furthering the pollution of the web with more nerd shit.<\/p>\n<p>After about 5 minutes of searching I settled on <a href=\"https:\/\/gohugo.io\/\">Hugo<\/a> with the <a href=\"https:\/\/github.com\/Mitrichius\/hugo-theme-anubis\">Anubis<\/a> theme.<\/p>\n<p>I like that it takes markdown and renders it into static html, even if the output is a little gross.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>brew install hugo\n<\/span><\/span><span style=\"display:flex;\"><span>mkdir -p ~\/Documents\/repos\/goos.blog\n<\/span><\/span><span style=\"display:flex;\"><span>cd ~\/Documents\/repos\/goos.blog\n<\/span><\/span><span style=\"display:flex;\"><span>hugo new site hugo\n<\/span><\/span><span style=\"display:flex;\"><span>hugo server -D &amp;\n<\/span><\/span><span style=\"display:flex;\"><span>vscode .\n<\/span><\/span><\/code><\/pre><\/div><p>Who am I? I&rsquo;m just a dude, man. Doing my thing, typing my commands, sailing my boat.<\/p>"},{"title":{},"link":"http:\/\/goos.blog\/about\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"http:\/\/goos.blog\/about\/","description":"<h1 id=\"honk\" >HONK!\n<span>\n<a href=\"#honk\">\n<svg viewBox=\"0 0 28 23\" height=\"100%\" width=\"19\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-width=\"2\"\/><\/svg>\n<\/a>\n<\/span>\n<\/h1><pre tabindex=\"0\"><code>I&#39;m a goose\nNo not really\nI&#39;m a people just like you\n<\/code><\/pre>"}]}}