Ubuntu 22.04 on the ODroid N2+

Best read here: https://www.sevarg.net/2023/01/14/odroid-n2-plus-and-ubuntu-22-04/

I’ve talked about the N2+ before a bit, in the Battle of the Boards 2023 post, but they’ve recently started taking over as “desktops in my office.” For a variety of reasons, I’ve been trying to make the random ARM SBCs function as computers, and for my needs, the ODroid N2+ is a better system than the Raspberry Pi. Part of this is that the 8GB Pi4 I had was going for $tupid amounts of money on eBay so I sold it, but partly, I’m just sick and tired of USB SSDs for desktops, and SD cards still suck.

The Raspberry Pi 4 comes with a cluster of 4x A72 cores running at 1.5GHz (or 1.8Ghz in the -400). The N2+ has a cluster of 4x A73s at 2.4GHz, plus a pair of A53s at 2.0GHz. There’s quite a bit more CPU performance to be had, though the memory systems still more or less suck… nobody is going to mistake this for one of the Apple Silicon M1s.

But, for me, they’re more useful systems. I like having the onboard eMMC plus an SD card reader, because that means I can easily blow images onto uSD cards for other systems (if it seems like I use small ARM systems to troubleshoot, install, and mess with other small ARM systems, that’s quite fair). Plus, the CPU performance boost is nice, though there are still things that I’d like more RAM for.

Anymore, I just use these sorts of things as desktops. A number of my older posts were about making “Light Desktops” with Pis, but that era has passed. I still apply some of those tweaks, but these? These are just desktops anymore. They can’t do everything, but they continue getting closer and closer over time. They’ve got a decent set of ports, a GPIO header, and, nicely, a proper barrel plug for power. I’ve fought too many voltage drop issues with USB power to appreciate micro USB, though USB-C is getting better. A barrel plug. Use it!

If you’re digging around for used hardware and can only find the N2s, don’t worry too much about it. The only real difference is clock speeds - the N2+ big cores run at 2.4GHz vs 1.8GHz, and the little cores get a bump from 1.9GHz to 2.0GHz. That said, the jump in clocks on the big cores does make a real difference in performance, and I use the N2+ boards for most of my needs.

Initial Setup and Install

When you get a N2+, the first thing you’ll want to do is get the firmware updated. They typically have older Petitboot images on them. Conveniently for some, the firmware will grab an IP address and you can update things over the network - it’s quite nice. You don’t actually need another computer to get an OS installed on the N2+, and that’s fun! I believe the new Pi4 firmware can do the same tricks.

Plug the N2+ in, attach your assorted cables, set the boot switch to SPI, and you should see a boot menu. Exit to the shell, and run pb-update - it should, if all goes well, spend a few minutes in the firmware update process. If it tells you Petitboot is up-to-dated, you’re good! If your firmware is too old to have pb-update, just go download an image to an SD card, it’ll work.

If you don’t get video, try turning your monitor off and back on. This resolves some weird video issues on one of my monitors that doesn’t quite get along with the N2+ until the full GUI is up. They’re a bit picky about HDMI, and I’ve not found a way to improve it yet.

After rebooting, drop to the shell again and run netboot_default - it will spit some IP information out and drop you back to the shell. Now exit (ctrl-d ought to do it), and you should see a bunch of Netboot Installers up at the top of the screen. Yes, you’re about to netboot an installer across the internet - the future, on occasion, does turn out some pretty neat tricks!

Screw it, we’re doing it live. Select 22.04 and rock on. It’s beta, but it has better GPU support than most of the other versions. Also, as of the time I’m writing this, 20.04 won’t install, 21.10 has broken GPU support (white text on white backgrounds), and Debian 11 has the same issue. Those who’ve expressed some concern of the “brokenness” of some of the small ARM boards I use with are onto something…

It will take a while to suck stuff down from the network and start booting. If it doesn’t work, try powercycling and try again… but it should eventually boot to something familiar!

Go through the install process, installing to the eMMC module. If it works, great! Go on your way. There are some other ways to install, but this method really has worked well for me.

You’ll want to avoid installing a desktop environment quite yet - it doesn’t quite work right with the netinstaller for some reason. Don’t select anything during the installer. After the system reboots to a console, install the desktop with sudo apt install ubuntu-desktop^ after the install finishes and you reboot. Reboot again, you should be good! You’ll, ideally, have a working desktop without much installed, running on Wayland (which is required for the GPU drivers - don’t ask me how or why, that’s just what works properly).

Further Tweaks

You’ll want to modify your /etc/fstab to include the “discard” option for your root filesystem, per some research I did.

And if you’re on a N2+, you’ll want to push your clocks up to the rated “overclock” speeds and set the performance governor. If you don’t have an /etc/default/cpufrequtils, make one. If you do, set it to this.

GOVERNOR=performance
MIN_SPEED="1000MHZ"
MAX_SPEED="2400MHZ"

If you really want to push things, you could push the GPU to 1GHz in /etc/default/gpufrequtils… but I can’t say I recommend it.

On certain versions of Ubuntu (20.04 is one), you’ll want to run sudo systemctl disable ondemand after this to disable setting things back to ondemand, but this shouldn’t be required on 22.04.

You’ll want to add zswap and a good bit more swapfile…

sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
sudo mkswap /swapfile
sudo swapon /swapfile

Now edit /etc/defaults/flash-kernel and add zswap.enabled=1 zswap.max_pool_percent=20 zswap.zpool=z3fold to the LINUX_KERNEL_CMDLINE line.

Then sudo flash-kernel to write the changes in a way that the kernel will pick them up, and reboot!

Update Your Kernel!

There is a lot of active work in the kernel for these various little ARM SBCs, so you’ll want to most likely run the latest, most bleeding edge kernel you can - trust me, it’ll work better this way, mad though it seems. Search for the latest kernel and install it.

apt-cache search odroid | grep linux
sudo apt -y install linux-image-6.0.0-odroid-arm64 linux-support-6.0.0-odroid

Reboot, and… ideally, stuff will still be working, but better than before!

Browsers and snaps

While it pains me greatly, it seems most browsers now come in snap form on Ubuntu, which is obnoxious for a variety of reasons. However, they do work, so… feel free to use them. This would be a serious argument for getting away from Ubuntu, though.

sudo apt install firefox chromium-browser

If you’re on a system with only 4GB RAM, though, you can’t just let it run every bit of Javascript that comes down the pipeline, willy nilly. That’ll chew your RAM in a hurry! Either use a Pihole for DNS, Ghostery, Noscript, or something to try to filter at least some of the crap coming down the pipeline. Otherwise, they work fine. Firefox seems a bit lighter on ARM lately, but they trade back and forth often enough, and it’s worth having both laying around for use. You probably won’t have much luck running both at the same time, given RAM limits.

Greyscale Your Monitor

One of the things that’s been a bit annoying to me over the years is the lack of a consistent way to desaturate the display on Linux to give a nice calming greyscale. Someone made one, though!

sudo apt install gnome-tweaks git
mkdir -p ~/.local/share/gnome-shell/extensions/
cd /tmp
git clone https://github.com/laerne/desaturate_all.git
mv desaturate_all ~/.local/share/gnome-shell/extensions/desaturate_all\@nicolas.brack.mail.be

Now, because nothing is ever easy, you have to apply some changes from https://github.com/laerne/desaturate_all/pull/11/files - to make it work.

In extensions.js, change x_fill to x_expand, same for y_fill to y_expand, and in metadata.json, add version "42.0" to the list of valid versions. Log out and back in, run gnome-extensions-app, and you should be able to enable it. You’ll get a cute little painting icon in the top right of your screen - click it, and all the colors should flee! I’m a big fan of greyscale for devices.

Spotify on ARM

For Spotify support (you need a paid account though), I’ve been greatly enjoying the command line client ncspot. You can follow the build directions from the install page (install Rust first), but something like this should get you going too:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
sudo apt install libncursesw5-dev libdbus-1-dev libpulse-dev \
libssl-dev libxcb1-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev
cargo install ncspot -j 3

Why -j 3 on a six core system? Mostly because if you let it use all 6 cores, you stand a good chance of running out of RAM.

This will, of course, inevitably fail with some sort of esoteric error relating to how things are being compiled… and at that point, you use rustup to pick a version of the rust compile that isn’t broken on ARM. Unless it doesn’t, at which point, consider yourself lucky and run ncspot!

You’ll probably need to flip through the key references, because it’s not the most obvious thing in the world to use, but once you learn how to use it, it works quite well, and is far lighter on resources than the full client - which doesn’t run on ARM anyway. It’s amazing how much lighter the terminal clients for things are than the full “browser and web app” variety.

For local music, though, use cmus. It’s a command line music player for local stuff (I just mount my server’s storage array), and it works great.

Remaining Quirks

Despite all this, there are certainly some quirks that remain. One of the bigger ones I’ve run into relates to memory pressure and the GPU - if you’ve got enough stuff running, some programs struggle to create a new window (or menus flicker, or… just weird things). Close a few other things, and they work. I’m reasonably convinced this is related to the Contiguous Memory Allocator (CMA) on Linux being “nice” and not carving off space for its own use, and having other stuff intrude in - but I don’t have any great fixes yet. You can reduce the CMA region size and it seems to help a tiny bit (less intrusion, perhaps), but I’ve not found a bulletproof way to solve the issue yet. When you run the GPU out of memory, things lock up for a bit - or just crash entirely. It depends. These aren’t the most reliable systems I’ve ever found, though the issues are software, not hardware. Newer kernels really do seem to help here - the problems have gotten progressively less-bad with newer kernels - but if you see this behavior, this is sort of how things work under serious memory pressure on this system.

It took some time for me to warm to this box - the older kernels tended really bad on it, and desktop use required constant rebooting. This has improved dramatically over time, and at this point, other than the RAM, it’s a well enough behaved little aarch64 desktop - for an awful lot less money than you can actually get a Pi for, with better performance in the deal. GPU performance isn’t great, but I also don’t really care for my needs.

On the other hand, if you just want a media player, an N2 with CoreElec on it makes for a wonderful little media box! Flash an image and go - and it’s a low power, high performance, always-on little media center.

Download an image, blast it out onto an SD card, and boot. Then log into your assorted accounts and use it!

I will suggest that asking it to decode 4k H.265 is more than the CPU/GPU can do (at least in Plex). It tends to struggle with that sort of source material, and while it can play it, the output frame rate leaves a lot to be desired. So either prevent it from getting H.265 streams, or limit the resolution to 1080p. One of the two should solve your problems.

The Butt Dyno

As long as you don’t go blasting past the 4GB of RAM, these are decent enough little systems. I use a few in my office for random web work, and if you’re booting from eMMC with the system accessible, the presence of a SD reader on the top is quite nice. Slap a uSD card in, and you’ve got full access to it with a high performance reader. Being ARM, the usual annoyances exist in terms of web playback of anything DRM’d, but at least for Spotify, ncspot does a decent job of it, and I mostly don’t care about the rest of the DRM’d content on the web.

You won’t mistake it for a super high performance x86 box, but neither does it lag like a Pi3 used to when you bothered it to do anything of interest. I’ve had a N2 (slightly slower clocks) as a “utility desktop” in my office for most of a year running my IRC client, Element, a browser, a metric crapton of terminals to talk to the rest of the world, and… it just does it. I occasionally have lockups related to too many tabs in the browser, but with ad blocking running, it’s not painfully slow to use, and it has matured into a fairly boring system over the past year or so.

Should You Get One?

At this point in the review, you’re probably expecting me to go on about how you should get one, set it up, use it, etc… but I just can’t broadly recommend this system quite yet. If you want to appreciate how seamless the Pi ecosystem is and how stuff “just works,” yeah - use one of these for a while and you’ll probably want a Pi again. In the time I’ve been using them, the reliability has gotten better, but it still feels a bit like a glass tower at times - use it for certain things, and life is fine, really load it up and it will fall over in weird ways that require a power cycle. The eMMC onboard is nice, the CPU performance is good, but with only 4GB of RAM, you rapidly run into RAM issues (especially with a 64-bit OS), and the GPU issues I’ve fought with just aren’t much fun. Having windows randomly fail to appear, or fail to appear properly until you reboot, gets old in a hurry. And I’d say once every week or so, even with just light, limited use, I run into something that requires a reboot. It’s not awful, but neither does it match the reliability of the Pis for desktop use. The “always-on” one, running a couple browser tabs, Hexchat, Element, and a bunch of terminals is just fine, though. So set your expectations properly and it might work.

It’s a board series worth keeping an eye on, and it’s a fine little media player, but these are just better suited to being headless little boxes doing something CPU heavy and RAM light than a desktop. Again, there’s no one specific thing I can point to, they’re just… not as enjoyable to use as a lot of other systems. The PineBook Pro, with the updated trackpad firmware, is finally a joy to use, and I simply don’t feel that way about the N2+ boards.

If you enjoyed this post and want to be notified about new posts, follow by email! I post this sort of content roughly every two weeks.


This is a companion discussion topic for the original entry at https://www.sevarg.net/2023/01/14/odroid-n2-plus-and-ubuntu-22-04/

Very interesting, but I’m not giving up my Pi just yet :stuck_out_tongue: In fact, this just makes me appreciate the friendliness and stability of the Pi ecosystem. I do like to tinker though, maybe I’ll add one (or five) to my homelab.

Have you considered though running a “lighter” DE on top such as Xfce or LXQt? These come stock with Xubuntu and Lubuntu, respectively, but can be installed to vanilla Ubuntu as well. These alternative environments are (of course) not as flashy or feature-rich as Gnome, but much improved from when I first started in '08 or so. This should alleviate some (if not most) of the memory suck.

One adjustment you would have to make would be to find an alternative greyscale effect for your new DE. Speaking of, if anyone else uses KDE, go to System Settings > Workspace Behavior > Desktop Effects > Get New Desktop Effects and search for “Grayscale Effect”. This will bring up a KDE equivalent which works flawlessly so far.

Oh, the stability of the Pi ecosystem is nice. They’re just pretty badly behind on CPU performance, and, unfortunately, unobtanium these days. I’ve sold almost all my Pis, because $180 for an 8GB Pi4 is hard to turn down when I have alternatives.

I don’t find the DE to be a major problem, though I’m sure I could use a lighter one if I really wanted. It works fine for what I need. I’ve mostly been moving more of my computing to Qubes, which isn’t yet compatible with ARM.