<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>It's Pi all the way down... - desktop</title><link href="https://waldorf.waveform.org.uk/" rel="alternate"></link><link href="https://waldorf.waveform.org.uk/feeds/desktop.atom.xml" rel="self"></link><id>https://waldorf.waveform.org.uk/</id><updated>2023-11-06T08:37:40+00:00</updated><entry><title>Making Mantic Magic</title><link href="https://waldorf.waveform.org.uk/2023/making-mantic-magic.html" rel="alternate"></link><published>2023-10-12T00:00:00+01:00</published><updated>2023-11-06T08:37:40+00:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2023-10-12:/2023/making-mantic-magic.html</id><summary type="html">&lt;p class="first last"&gt;Everything you (don&amp;#8217;t) need to do on Mantic to get the most out of
the Pi&amp;nbsp;5&lt;/p&gt;
</summary><content type="html">&lt;div class="figure"&gt;
&lt;img alt="A screenshot of the Ubuntu Mantic desktop, showing the Firefox web browser, a terminal, and the selection of Mantic wallpapers in the settings application in the foreground." src="https://waldorf.waveform.org.uk/images/mantic-screenshot.png" /&gt;
&lt;p class="caption"&gt;Meet the&amp;nbsp;Minotaur!&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;#8217;s around this time of year that a &lt;a class="reference external" href="https://discourse.ubuntu.com/t/mantic-minotaur-release-notes/35534"&gt;new Ubuntu release&lt;/a&gt; comes out (including
images for the Raspberry Pi), and shortly afterwards I pen something on the
subject of how best to tweak it to get the most out of it on your Pi. Past
subjects have included adding a swap file … but that&amp;#8217;s now done out of the box.
Or enabling the &amp;#8220;zswap&amp;#8221; facility … but that&amp;#8217;s now on by default too. Erm …
let&amp;#8217;s see, how to flash the image to an &lt;abbr title="Solid State Drive"&gt;&lt;span class="caps"&gt;SSD&lt;/span&gt;&lt;/abbr&gt;? Nope,
that&amp;#8217;s as easy as an &lt;span class="caps"&gt;SD&lt;/span&gt; card these days, thanks to &lt;a class="reference external" href="https://www.raspberrypi.com/software/"&gt;rpi-imager&lt;/a&gt;. Disabling
multipath to gain a bit more &lt;span class="caps"&gt;RAM&lt;/span&gt; on the Pi Zero? Nope, default now&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;The list is indeed shrinking fast, but it&amp;#8217;s not completely empty yet and the
arrival of the Pi 5 has certainly left a &lt;em&gt;little&lt;/em&gt; opportunity for post-release&amp;nbsp;tweakage!&lt;/p&gt;
&lt;p&gt;Speaking of the 5&amp;nbsp;…&lt;/p&gt;
&lt;div class="section" id="presto"&gt;
&lt;h2&gt;Presto!&lt;/h2&gt;
&lt;p&gt;What&amp;#8217;s it like? How is the Pi 5, and how is Ubuntu on the Pi&amp;nbsp;5?&lt;/p&gt;
&lt;p&gt;Simply put, it&amp;#8217;s an awesome piece of Pi. I&amp;#8217;ll go so far as to say it&amp;#8217;s the
first Pi where, if your computing needs are fairly typical, it will meet them
as well as any cheap &lt;span class="caps"&gt;PC&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;I use Pis for pretty much all my work. All my coding, packaging, emailing,
talking to colleagues online, and &lt;em&gt;much of&lt;/em&gt; my browsing is done on a Pi 4. But
there it is: &amp;#8220;much of&amp;#8221;. Not &amp;#8220;all of&amp;#8221;. Playing videos on Youtube? Painful. A
video call involving a dozen colleagues? Out of the question. For those I turn
to a &lt;span class="caps"&gt;PC&lt;/span&gt;. Often at home, the honking huge thing which doubles as a gaming
platform, but out on the road my little laptop does these&amp;nbsp;duties.&lt;/p&gt;
&lt;p&gt;When I call my laptop &amp;#8220;little&amp;#8221;, I&amp;#8217;m not kidding. I like my diminutive, and
above all &lt;em&gt;cheap&lt;/em&gt;, computers. I really &lt;em&gt;don&amp;#8217;t&lt;/em&gt; like lugging around a thousand
quid&amp;#8217;s worth of easily breakable or nickable gear. So my current laptop is an
&lt;a class="reference external" href="https://www.acer.com/gb-en/laptops/travelmate/travelmate-spin-b1"&gt;Acer Travelmate Spin B1&lt;/a&gt; which has these positively mind-blowing&amp;nbsp;specs:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="13%" /&gt;
&lt;col width="87%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;Component&lt;/th&gt;
&lt;th class="head"&gt;Specification&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;&lt;span class="caps"&gt;CPU&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;Intel Pentium N4200 (ooooh!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Graphics&lt;/td&gt;
&lt;td&gt;Integrated Intel Graphics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;span class="caps"&gt;RAM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="caps"&gt;4GB&lt;/span&gt; (yes, my Pi has more)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;&lt;span class="caps"&gt;64GB&lt;/span&gt; eMMC (again, the Pi has a bigger, faster &lt;span class="caps"&gt;SSD&lt;/span&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Display&lt;/td&gt;
&lt;td&gt;11.6&amp;#8221; 1080p (you guessed it, my Pi has a bigger monitor)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Yet, for all its diminutive capacity, it still breezes past my main Pi 4 at
boot time, and is an eminently more capable desktop machine &lt;a class="footnote-reference" href="#windows" id="footnote-reference-1"&gt;[1]&lt;/a&gt;. In
fact, I run two Pi 4s for my work; one runs the Ubuntu desktop and the other a
customized Ubuntu server image with &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Kmscon"&gt;kmscon&lt;/a&gt; as the console. The &lt;em&gt;vast&lt;/em&gt;
majority of my work (including all email) is done on the latter because the
console is so much faster than the&amp;nbsp;desktop.&lt;/p&gt;
&lt;p&gt;So … enough waffling and delay. &lt;strong&gt;What about the Pi&amp;nbsp;5?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It beats the laptop. Hands down. I know my laptop is nothing to write home
about, but this Pi is, being the first Pi to roundly beat one of my PCs at
being a &amp;#8220;good desktop&amp;#8221;. It boots faster (about 20 seconds from cold for Ubuntu;
we&amp;#8217;re not at the blazing 7 seconds that RaspiOS manages, but Ubuntu&amp;#8217;s a rather
beefier desktop environment). It runs faster (everything launches faster, and
generally &amp;#8220;feels&amp;#8221; faster than on the laptop). It&amp;#8217;s considerably more expandable
(remember the storage on my laptop is a soldered-on eMMC module!). And yet,
it&amp;#8217;s&amp;nbsp;cheaper.&lt;/p&gt;
&lt;p&gt;The &amp;#8220;cheaper&amp;#8221; comparison obviously sounds unfair; the laptop includes a
keyboard, touchpad, battery, screen and so on, and moreover it&amp;#8217;s older
technology (newer technology is typically cheaper per unit of performance than
older). When I bought it refurbished several years ago, it still cost about 300
quid, so let&amp;#8217;s tot up my Raspberry Pi&amp;nbsp;equivalent:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The Pi 5 I&amp;#8217;ve been testing on is the &lt;span class="caps"&gt;8GB&lt;/span&gt; model (kindly provided a couple of
months ago by the folk at Raspberry Pi), which retails for 80&amp;nbsp;quid&lt;/li&gt;
&lt;li&gt;Add in a good power supply (12&amp;nbsp;quid)&lt;/li&gt;
&lt;li&gt;Reasonable keyboard (20 quid &lt;a class="footnote-reference" href="#keyboards" id="footnote-reference-2"&gt;[2]&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Mouse (10&amp;nbsp;quid)&lt;/li&gt;
&lt;li&gt;Monitor (80 quid for a 24&amp;#8221; &lt;span class="caps"&gt;FHD&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;Good &lt;span class="caps"&gt;SD&lt;/span&gt; card (15 quid for a &lt;span class="caps"&gt;128GB&lt;/span&gt;&amp;nbsp;SanDisk)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;217 of your pounds sterling. Yes, definitely &amp;#8220;cheaper&amp;#8221;, and recall we&amp;#8217;re
comparing to a &lt;em&gt;refurbished&lt;/em&gt; laptop, not a new one. It&amp;#8217;s not as portable as the
laptop, but 83 quid probably buys a fair sized power-bank! Alright, that&amp;#8217;s
still not a &lt;em&gt;fair&lt;/em&gt; comparison but I&amp;#8217;m going to make it anyway because my Pis
really do accompany me on the road&amp;nbsp;:-)&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="An image of Dave's hotel room at an engineering sprint. Amidst a collection of socks, a Pi 400 is hooked up to the huge 40-something inch TV in front of the bed. The screen is displaying the Ubuntu logo typically seen during desktop boot. In the left foreground, two toolboxes are open on the bed. On the right, a small table is covered in the detritus of the day: Dave's laptop, empty coffee mug, glasses, a copy of Private Eye, a graphic novel, and several random bits of Pi paraphenalia." src="https://waldorf.waveform.org.uk/images/hotel-4k.jpg" /&gt;
&lt;p class="caption"&gt;Dave&amp;#8217;s &amp;#8220;portable&amp;#8221;&amp;nbsp;setup.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="abracadabra"&gt;
&lt;h2&gt;Abracadabra!&lt;/h2&gt;
&lt;p&gt;What should you do to get the most out of Ubuntu on your Pi 5? Honestly, not a
great deal. Anyone who&amp;#8217;s used Ubuntu desktop on the Pi 4 extensively will be
yelling things like &amp;#8220;active cooling!&amp;#8221; and &amp;#8220;&lt;span class="caps"&gt;SSD&lt;/span&gt; boot for performance!&amp;#8221; at the
screen, but frankly these are optional on the 5 and absolutely unnecessary to
have a system that works&amp;nbsp;&amp;#8220;well&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The pre-release Pi 5 sent to me a few months back (thanks Gordon!) &lt;em&gt;didn&amp;#8217;t&lt;/em&gt;
include the fancy new cooling fan &lt;a class="footnote-reference" href="#cooling" id="footnote-reference-3"&gt;[3]&lt;/a&gt;. The board does get warm,
particularly under load, and it&amp;#8217;s not too difficult to get it to throttle
(watching a video fullscreen in Firefox will do the job). But do I &lt;em&gt;notice&lt;/em&gt; it
throttling? No! And once the video finishes (or the package finishes building,
or what have you) and I go back to doing less computationally intensive things,
the board&amp;#8217;s back to an unthrottled temperature within a couple of seconds …
without any active&amp;nbsp;cooling.&lt;/p&gt;
&lt;p&gt;The other thing the Pi 5 didn&amp;#8217;t arrive with was the official power supply
&lt;a class="footnote-reference" href="#pico-probe-1" id="footnote-reference-4"&gt;[4]&lt;/a&gt;. This is a rather more important piece as, in order to reach its
full potential, the Pi 5 does have rather higher power demands. Specifically,
if you want the &lt;abbr title="Universal Serial Bus"&gt;&lt;span class="caps"&gt;USB&lt;/span&gt;&lt;/abbr&gt; ports to deliver enough
juice to run external storage (and thus to boot from an &lt;span class="caps"&gt;SSD&lt;/span&gt; drive), you need a
supply capable of delivering 5 amps at 5 volts. The &lt;em&gt;vast&lt;/em&gt; majority of
&lt;abbr title="USB Power Delivery"&gt;&lt;span class="caps"&gt;USB&lt;/span&gt;-&lt;span class="caps"&gt;PD&lt;/span&gt;&lt;/abbr&gt; compatible supplies don&amp;#8217;t manage this
(certainly none of the ones I owned could). There are a few third-party power
supplies that do (for example, the &lt;a class="reference external" href="https://docs.radxa.com/en/accessories/pd_30w"&gt;Radxa Power &lt;span class="caps"&gt;PD&lt;/span&gt; 30W&lt;/a&gt;) but my recommendation
to most would be to simply buy a &lt;a class="reference external" href="https://shop.pimoroni.com/products/raspberry-pi-27w-usb-c-power-supply"&gt;Raspberry Pi supply&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll write a bit more about this in a future article but an important aspect
here is that the official supply has a &amp;#8220;captive cable&amp;#8221;. This means that at the
&amp;#8220;business end&amp;#8221; (that sticks into your Pi), it &lt;em&gt;will&lt;/em&gt; deliver 5V. If your supply
requires an external cable, it&amp;#8217;ll presumably deliver its rated 5V at its
socket, but that doesn&amp;#8217;t guarantee it&amp;#8217;ll still be 5V at the business end of the
cable you&amp;#8217;re inserting. Furthermore, to carry 5A, &lt;span class="caps"&gt;USB&lt;/span&gt; cables need an &lt;a class="reference external" href="https://en.wikipedia.org/wiki/USB-C#Cables"&gt;e-marker
chip&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, suffice it to say, I&amp;#8217;m still running my 5 off my old 3A capable supply
(an official power supply is on order!), and even though it may not power
anything beefy off the &lt;span class="caps"&gt;USB&lt;/span&gt; ports, it&amp;#8217;s still managed everything else without
any&amp;nbsp;brown-outs.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="A Raspberry Pi 5 sits on top of a blue-painted desk. Various cables (USB, ethernet, micro-HDMI, and USB-C power cable) are plugged into it, as well as a brown ribbon cable (FFC) leading to a Raspberry Pi camera module. To the left, various jumper leads trail from the GPIO header to a small breadboard containing a rotary encoder with an RGBLED embedded within it." src="https://waldorf.waveform.org.uk/images/pi5-desk.jpg" /&gt;
&lt;p class="caption"&gt;Cool as a very odd&amp;nbsp;cucumber.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;What about storage? Much the same applies. Yes, I run my Pi 4 on an &lt;span class="caps"&gt;SSD&lt;/span&gt;, and
for doing serious work on the Pi 5 I would do exactly the same. But whereas on
the Pi 4 this was about gaining capacity &lt;em&gt;and&lt;/em&gt; performance, on the Pi 5 it&amp;#8217;s
really just down to extra capacity (and possibly reliability). The &lt;span class="caps"&gt;SD&lt;/span&gt; card
interface is so much faster on the 5 (and the &lt;span class="caps"&gt;IO&lt;/span&gt; bandwidth to other components
like memory so much bigger), that there really isn&amp;#8217;t a hard requirement to have
an &lt;span class="caps"&gt;SSD&lt;/span&gt; for good desktop performance. A &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/dealing-the-sd-cards.html"&gt;decent &lt;span class="caps"&gt;SD&lt;/span&gt; card&lt;/a&gt; is perfectly&amp;nbsp;sufficient.&lt;/p&gt;
&lt;p&gt;In summary, a throttled, under-powered, &lt;span class="caps"&gt;SD&lt;/span&gt;-card driven Pi 5 is still a
considerably more comfortable and responsive machine than an unthrottled,
fully-powered, &lt;span class="caps"&gt;SSD&lt;/span&gt;-booted Pi 4. And it&amp;#8217;s still capable of beating my&amp;nbsp;laptop!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ala-peanut-butter-sandwiches"&gt;
&lt;h2&gt;Ala Peanut Butter&amp;nbsp;Sandwiches?&lt;/h2&gt;
&lt;p&gt;So … there&amp;#8217;s &lt;em&gt;nothing&lt;/em&gt; to do? No hardware to add, no software to tinker with to
get the most out of Ubuntu on your shiny new Pi? Perish the thought! Where
would we be without the need of a bit of tinkering? &lt;a class="footnote-reference" href="#rhetorical" id="footnote-reference-5"&gt;[5]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a few major things that we couldn&amp;#8217;t get into the release in time. The
first is the upstream patches for libcamera (this is the reason for the camera
module plugged into the board in the shot above &amp;#8212; still testing!). This is
intended to be delivered as an &lt;abbr title="Stable Release Update"&gt;&lt;span class="caps"&gt;SRU&lt;/span&gt;&lt;/abbr&gt; in Mantic,
which isn&amp;#8217;t too bad given that libcamera isn&amp;#8217;t included in the base image so
users need to download it&amp;nbsp;anyway.&lt;/p&gt;
&lt;p&gt;The second is the mesa patches for full graphical performance. These &lt;em&gt;did&lt;/em&gt; make
it into the base image, so &lt;em&gt;most&lt;/em&gt; applications on the desktop do indeed get the
full benefit of the new Vulkan-compliant drivers. But some desktop applications
(and one rather notable one in particular) don&amp;#8217;t use the system&amp;#8217;s mesa drivers
because they&amp;#8217;re shipped as snaps, so they use the libraries included in the
corresponding content or base snaps (most of which are still from the 22.04&amp;nbsp;era).&lt;/p&gt;
&lt;p&gt;Obviously this includes&amp;nbsp;Firefox.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="In the foreground, the Pi 5 setup from the prior image can be seen (breadboard on the left, Pi 5 in the middle, camera module on the right). Behind the breadboard are some colourful lego bricks with some jumper leads trailing out of them, and a soldering iron barely visible behind them. To the right is the edge of a keyboard, and behind it a set of small drawers containing electronic components. To the rear of the desk can be seen a speaker, a monitor showing Firefox, and the background selections of Ubuntu Mantic. But not much else can be seen because of the black and white cat standing indignantly in the middle of the desk, blocking the view." src="https://waldorf.waveform.org.uk/images/pi5-cat.jpg" /&gt;
&lt;p class="caption"&gt;He&amp;#8217;s not&amp;nbsp;helping.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;For the most part, this doesn&amp;#8217;t matter too much. Browsing the web and even
playing video is still fine because the &lt;span class="caps"&gt;CPU&lt;/span&gt;&amp;#8217;s capable of just powering through
(the Pi 5 really does have a beast of a processor!). However, fire up the
&lt;a class="reference external" href="https://webglsamples.org/aquarium/aquarium.html"&gt;WebGL aquarium&lt;/a&gt; sample and it becomes blindingly obvious. It&amp;#8217;ll barely manage
a paltry 2fps, if you&amp;#8217;re lucky. Replace the Firefox snap with a deb so it&amp;#8217;s
using the system mesa libraries (I won&amp;#8217;t go over the instructions again here,
but you can derive them from &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html#adding-sprinkles"&gt;this post&lt;/a&gt; if you really want to)
and all of a sudden that jumps up to a much more respectable 40fps or so (at
least on my 1080p&amp;nbsp;monitor).&lt;/p&gt;
&lt;p&gt;Naturally, the plan is to include the updated mesa drivers in the base snaps as
soon as we&amp;#8217;re able after launch, so hopefully this should be a short-lived
state of affairs. Also, as noted, this doesn&amp;#8217;t appear to affect the vast
majority of web browsing, only rather niche things like&amp;nbsp;WebGL.&lt;/p&gt;
&lt;p&gt;The other missing bit is a power monitoring daemon, which is something I&amp;#8217;ll be
prioritising in the next cycle. The new power management chip on the Pi 5
allows the &lt;span class="caps"&gt;OS&lt;/span&gt; to determine whether the previous reboot was due to a power
brownout. This is fantastic as brownout issues are notoriously variable and
difficult to diagnose, so having the hardware tell you that this was definitely
the cause, should deal with a whole pile of&amp;nbsp;Heisenbugs.&lt;/p&gt;
&lt;p&gt;Finally, the other major change with the Pi 5 is the means by which
&lt;abbr title="General Purpose Input Output"&gt;&lt;span class="caps"&gt;GPIO&lt;/span&gt;&lt;/abbr&gt; pins are controlled. No longer is
the &lt;abbr title="System on a Chip"&gt;SoC&lt;/abbr&gt; itself driving the GPIOs. The new &lt;a class="reference external" href="https://www.raspberrypi.com/news/rp1-the-silicon-controlling-raspberry-pi-5-i-o-designed-here-at-raspberry-pi/"&gt;&lt;span class="caps"&gt;RP1&lt;/span&gt;
&amp;#8220;southbridge&amp;#8221;&lt;/a&gt; is now in charge instead. This means that the traditional &lt;span class="caps"&gt;GPIO&lt;/span&gt;
libraries like RPi.&lt;span class="caps"&gt;GPIO&lt;/span&gt; no longer work. I&amp;#8217;ve written about this &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2022/the-one-where-dave-breaks-stuff.html"&gt;previously&lt;/a&gt; and thankfully Ubuntu&amp;#8217;s pretty well placed
to weather the storm here. We switched the &lt;span class="caps"&gt;GPIO&lt;/span&gt; Zero back-end over back in
hirsute (21.04) and added &lt;a class="reference external" href="https://rpi-lgpio.readthedocs.io/"&gt;rpi-lgpio&lt;/a&gt; (a RPi.&lt;span class="caps"&gt;GPIO&lt;/span&gt; compatible shim) back in
kinetic (22.10) to ease the&amp;nbsp;transition.&lt;/p&gt;
&lt;p&gt;These pieces needed a few updates &lt;a class="footnote-reference" href="#pinout" id="footnote-reference-6"&gt;[6]&lt;/a&gt; to deal with the Pi 5&amp;#8217;s new
hardware, but that&amp;#8217;s all included in mantic. With a bit of luck most users
either won&amp;#8217;t notice the change, or won&amp;#8217;t have &lt;em&gt;much&lt;/em&gt; difficulty in getting
their circuits to work on their shiny new Pi&amp;nbsp;5.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s all for now. Go grab your copy of Mantic Minotaur (it should be in
&lt;a class="reference external" href="https://www.raspberrypi.com/software/"&gt;rpi-imager&lt;/a&gt; by the time I publish this) and have&amp;nbsp;fun!&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="windows" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Running Windows on it was as awful as you might imagine, but
Ubuntu is still light enough to be perfectly useable on it&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="keyboards" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;At this point, anybody who knows me is spluttering their tea
over the screen; &amp;#8220;twenty quid? Sure you&amp;#8217;re not missing a zero there, Dave?&amp;#8221;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="cooling" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;There weren&amp;#8217;t enough to give one to each alpha tester at that
point, and it wasn&amp;#8217;t necessary for Ubuntu&amp;#8217;s compatibility work&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="pico-probe-1" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-4"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Again, there weren&amp;#8217;t enough to go around. However, I should
add that they did very kindly (and usefully!) ship a &lt;a class="reference external" href="https://www.raspberrypi.com/products/debug-probe/"&gt;Pico Probe&lt;/a&gt; with the
board which was &lt;em&gt;really&lt;/em&gt; useful in debugging things, especially since it
attaches to the separate debug port now, meaning I didn&amp;#8217;t have to unplug
things from the &lt;span class="caps"&gt;GPIO&lt;/span&gt; pins just to get a serial console&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="rhetorical" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-5"&gt;[5]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;That&amp;#8217;s rhetorical :)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="pinout" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-6"&gt;[6]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Try &lt;tt class="docutils literal"&gt;pinout&lt;/tt&gt; on the new Pi 5!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="desktop"></category><category term="pi"></category><category term="mantic"></category></entry><entry><title>The Ubuntu Desktop</title><link href="https://waldorf.waveform.org.uk/2023/the-ubuntu-desktop.html" rel="alternate"></link><published>2023-08-09T00:00:00+01:00</published><updated>2023-11-06T08:37:40+00:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2023-08-09:/2023/the-ubuntu-desktop.html</id><summary type="html">&lt;p class="first last"&gt;Comparing the official desktop with the cloud-init baked&amp;nbsp;flavours&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;: The &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; which links to all the other flavour&amp;nbsp;posts.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;#8217;ll be comparing the official Ubuntu desktop release with all
the flavours we&amp;#8217;ve been baking from &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configurations, on a
Raspberry&amp;nbsp;Pi.&lt;/p&gt;
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#ubuntu" id="toc-entry-1"&gt;Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#sort-it-out" id="toc-entry-2"&gt;Sort it&amp;nbsp;out!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#popping-and-locking" id="toc-entry-3"&gt;Popping and&amp;nbsp;locking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#verdict" id="toc-entry-4"&gt;Verdict&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="ubuntu"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Ubuntu&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Finally we come to the comparison with the official desktop. Obviously I don&amp;#8217;t
need to include any &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; bits here because … you just install the
desktop image on your card and that&amp;#8217;s&amp;nbsp;it.&lt;/p&gt;
&lt;img alt="A screenshot of the classic Ubuntu GNOME-based desktop. The bar at the left contains (from top to bottom) the quick-launch icons (Firefox, Thunderbird, the file-browser, etc.), the icons of launched applications, and the 9-grid of the start button at the bottom. Across the top of the screen is another bar displaying &amp;quot;Activities&amp;quot; (effectively another start button), the current date and time, and finally the system tray. In the main portion of the screen can be seen Firefox show a Raspberry Pi page, part of an integrated component's PDF datasheet in evince, top running in the terminal, a file-browser in the background, and totem failing to play a video." src="https://waldorf.waveform.org.uk/images/desktops-lunar-ubuntu.png" /&gt;
&lt;p&gt;The official desktop has a few other simplicity tricks up its sleeve too: no
need to explicitly select a Wayland-based desktop, you get one by default. The
first-time setup wizard also handles configuring things like the keyboard
layout and initial user without having to deal with &lt;span class="caps"&gt;YAML&lt;/span&gt;. So … points for&amp;nbsp;simplicity?&lt;/p&gt;
&lt;p&gt;The default applications are a mix of the brilliant (the aforementioned
&lt;a class="reference external" href="https://wiki.gnome.org/Apps/Rhythmbox"&gt;Rhythmbox&lt;/a&gt;) and the … not so brilliant. In the screenshot above you can see
&lt;a class="reference external" href="https://gitlab.gnome.org/GNOME/totem"&gt;Totem&lt;/a&gt; failing to play anything (&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/totem/+bug/1998782"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1998782&lt;/a&gt; is the Ubuntu bug, but the
&lt;a class="reference external" href="https://gitlab.gnome.org/GNOME/totem/-/issues/523"&gt;upstream bug&lt;/a&gt; has more
details), so it was back to &lt;tt class="docutils literal"&gt;sudo apt install vlc&lt;/tt&gt;. The incorrect audio
selection bug (&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/pipewire/+bug/1993347"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1993347&lt;/a&gt;) also popped up but is trivial as ever to deal&amp;nbsp;with.&lt;/p&gt;
&lt;p&gt;Everything else is mostly fine: good terminal, fine web-browser, stuff opens
happily even on unmounted network shares, though (as noted before) dragging
files from an archive to extract them doesn&amp;#8217;t work (&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/file-roller/+bug/1923033"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1923033&lt;/a&gt;). Though
this is ultimately due to the Wayland transition, it&amp;#8217;s notable that it &lt;em&gt;does&lt;/em&gt;
work in Kubuntu, even when running Plasma under&amp;nbsp;Wayland.&lt;/p&gt;
&lt;p&gt;One other difference worth noting is that on this distribution I stuck with
using the snap version of Firefox because we may as well do a comparison of
stuff &amp;#8220;as it ships&amp;#8221; here (which we can&amp;#8217;t really do with the other flavours).
Despite being a snap, the Wayland support works (once the
&lt;tt class="docutils literal"&gt;MOZ_ENABLE_WAYLAND=1&lt;/tt&gt; setting is exported), and since &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/evince/+bug/1794064"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1974064&lt;/a&gt; was
fixed &lt;a class="footnote-reference" href="#redo2" id="footnote-reference-1"&gt;[1]&lt;/a&gt; opening links from a standalone &lt;span class="caps"&gt;PDF&lt;/span&gt; reader works&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;Speaking of Wayland, all the desktop animations are generally smooth and don&amp;#8217;t
lag. With the exception of the start&amp;nbsp;menu.&lt;/p&gt;
&lt;p&gt;Oh dear, it&amp;#8217;s rant time&amp;nbsp;…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sort-it-out"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Sort it&amp;nbsp;out!&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The full-screen zoom-out animation is just too large to do smoothly even under
Wayland (sometimes it manages it after a few attempts). However, this doesn&amp;#8217;t
bother me too much because, once it&amp;#8217;s deigned to appear, I can never find stuff
in it&amp;nbsp;anyway.&lt;/p&gt;
&lt;p&gt;Some flavours have a categorical start menu: Lubuntu, Xubuntu, Kubuntu, and
Studio. It&amp;#8217;s a bit dated, but it works: find the category you want, scroll
through the alphabetical list, and pick the application you want. Others take a
more smart-phone-y approach and just have a big alphabetical list of everything
installed to scroll through: Budgie, Unity … &lt;span class="caps"&gt;GNOME&lt;/span&gt;? &lt;span class="caps"&gt;GNOME&lt;/span&gt; has one big list. But
it&amp;#8217;s not&amp;nbsp;alphabetical:&lt;/p&gt;
&lt;img alt="A screenshot of the first page of GNOME's application launcher. Below two mini desktops at the top centre, is a large 6x4 grid of application icons filling the rest of the screen. The icons at first glance appear to be in alphabetical order starting with &amp;quot;Additional Drivers, &amp;quot;AisleRiot Solitaire&amp;quot;, &amp;quot;Calendar&amp;quot;, &amp;quot;GVim&amp;quot;, &amp;quot;Videos&amp;quot;, but then &amp;quot;Language Support&amp;quot;, &amp;quot;Calculator&amp;quot;, &amp;quot;LibreOffice&amp;quot;, &amp;quot;Document Scanner&amp;quot;, and so on. Two dots at the bottom indicate there are two pages of applications, and we are on the first." src="https://waldorf.waveform.org.uk/images/gnome-start-1.png" /&gt;
&lt;p&gt;It&amp;#8217;s not in most-recently-used order either. I have fired up Videos here, but
not GVim for instance. Maybe something weird like installation order? Let&amp;#8217;s
install something and see. I&amp;#8217;ve picked &lt;span class="caps"&gt;GIMP&lt;/span&gt; which, after installation, appears
at the &lt;em&gt;end&lt;/em&gt; of the list on the second screen, after all the other apparently
alphabetically arranged&amp;nbsp;items:&lt;/p&gt;
&lt;img alt="Another screenshot of GNOME's application launcher, showing the second page. This page is alphabetically ordered left-to-right, top-to-bottom, but for the final entry: the freshly installed &amp;quot;GNU Image Manipulation Program&amp;quot; which appears after &amp;quot;Vim&amp;quot;." src="https://waldorf.waveform.org.uk/images/gnome-start-2.png" /&gt;
&lt;p&gt;But, if we logout and login again, our start menu has re-arranged and now &lt;span class="caps"&gt;GIMP&lt;/span&gt;
is &lt;em&gt;before&lt;/em&gt; GVim, in apparently alphabetical order. But no! &amp;#8220;Cheese&amp;#8221; is now
before &amp;#8220;Additional Drivers&amp;#8221; although prior to the reboot it came later in the&amp;nbsp;list!&lt;/p&gt;
&lt;img alt="Back to the first page of GNOME's application launcher. Once again, a 6x4 grid of large launch icons, but in a completely different order to before. Now the list starts &amp;quot;Videos&amp;quot;, &amp;quot;Calculator&amp;quot;, &amp;quot;Document Scanner&amp;quot;, &amp;quot;Settings&amp;quot;, &amp;quot;System Monitor&amp;quot;, &amp;quot;Terminal&amp;quot;, &amp;quot;Utilities&amp;quot;, &amp;quot;Cheese&amp;quot;, &amp;quot;Additional Drivers&amp;quot;, &amp;quot;AisleRiot Solitaire&amp;quot;, &amp;quot;Calendar&amp;quot;, &amp;quot;GNU Image Manipulation Program&amp;quot;, etc." src="https://waldorf.waveform.org.uk/images/gnome-start-3.png" /&gt;
&lt;p&gt;Okay, I give up. I&amp;#8217;ve no idea what the order is here. Maybe it&amp;#8217;s &amp;#8220;whatever you
want it to be&amp;#8221;? You can re-order things manually by dragging them around, or
drag them over each other to form groups (such as the pre-grouped &amp;#8220;Utilities&amp;#8221;).
But this means that if I want a sensible layout (which the default … isn&amp;#8217;t), I
have to laboriously drag things around until they&amp;#8217;re &amp;#8220;just so&amp;#8221;. I have to put
work in (something no other flavour has demanded). Or if you just like them
alphabetical then simply … erm … &lt;a class="reference external" href="https://www.omgubuntu.co.uk/2022/01/gnome-shell-alphabetical-app-grid-extension"&gt;install an extension&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;In essence the starter is a strange mash-up of &amp;#8220;smart-phone home screen&amp;#8221; and
&amp;#8220;smart-phone all-applications list&amp;#8221;, made all the more smart-phone-y by
scrolling sideways because … well, just because. The thing is … this isn&amp;#8217;t a
bug. This is genuinely &lt;span class="caps"&gt;GNOME&lt;/span&gt;&amp;#8217;s idea of &amp;#8220;how a start menu should&amp;nbsp;work&amp;#8221;!&lt;/p&gt;
&lt;p&gt;The mitigation to this is that most flavours these days, including &lt;span class="caps"&gt;GNOME&lt;/span&gt; (but
even some which favour a categorised menu like Kubuntu) allow you to &lt;em&gt;search&lt;/em&gt;
by just opening the start menu, typing a few letters of what you want, then
hitting Enter when it&amp;#8217;s the first in the list. This is how I tend to use the
start menu on &lt;span class="caps"&gt;GNOME&lt;/span&gt; because it&amp;#8217;s the only way it makes any sense. But, for this
purpose I don&amp;#8217;t &lt;em&gt;care&lt;/em&gt; about the icons, and that in turns means I don&amp;#8217;t care
about &lt;em&gt;giant full-screen zooming animations&lt;/em&gt; that lag the entire&amp;nbsp;menu.&lt;/p&gt;
&lt;p&gt;Okay, rant&amp;nbsp;over.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="popping-and-locking"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Popping and&amp;nbsp;locking&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oh, and the screen-saver? Blanks and locks the screen, but fails to suspend the
monitor. I&amp;#8217;ve dug into this before (&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1998716"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1998716&lt;/a&gt;) and all I came away with
was a new-found appreciation for how &lt;a class="reference external" href="https://www.jwz.org/xscreensaver/toolkits.html"&gt;bloody complicated&lt;/a&gt; something as
apparently simple as a screen-saver is, once you begin to understand all that
it&amp;nbsp;does.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="verdict"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Verdict&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s not lightweight, but it is pretty, reasonably responsive, with a decent
selection of apps, and despite a few Wayland transition issues (like drag and
drop) it&amp;#8217;s mostly functional … except for that start menu. Still, it can&amp;#8217;t be
&lt;em&gt;that&lt;/em&gt; bad as it has been my main desktop for the last few&amp;nbsp;years.&lt;/p&gt;
&lt;p&gt;The problem is … now I&amp;#8217;ve used Kubuntu&amp;nbsp;…&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="redo2" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;during the writing of this series in fact — this is another bit
I&amp;#8217;ve had to go back and re-write!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="lunar"></category><category term="pi"></category><category term="cloud-init"></category><category term="desktop"></category></entry><entry><title>The Ubuntu Studio</title><link href="https://waldorf.waveform.org.uk/2023/the-ubuntu-studio.html" rel="alternate"></link><published>2023-08-08T00:00:00+01:00</published><updated>2023-11-06T08:37:40+00:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2023-08-08:/2023/the-ubuntu-studio.html</id><summary type="html">&lt;p class="first last"&gt;Baking an Ubuntu Studio Lunar desktop with&amp;nbsp;cloud-init&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;: The &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; which links to all the other flavour posts.
Skip &lt;a class="reference internal" href="#down-here"&gt;down here&lt;/a&gt; for the configurations&amp;nbsp;used.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;#8217;ll be looking at creating an Ubuntu Studio desktop with a
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, on a Raspberry&amp;nbsp;Pi.&lt;/p&gt;
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#ubuntu-studio" id="toc-entry-1"&gt;Ubuntu&amp;nbsp;Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#verdict" id="toc-entry-2"&gt;Verdict&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#configuration" id="toc-entry-3"&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="ubuntu-studio"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Ubuntu&amp;nbsp;Studio&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Originally, this was not a flavour I was planning to cover. After all Ubuntu
Studio is intended for multimedia creation which is some of the heaviest-duty
work you can put any computer through. However, I was also aware they&amp;#8217;d
recently switched to Plasma (from &lt;span class="caps"&gt;KDE&lt;/span&gt;) as a basis, and that meant Wayland was
supported. After Kubuntu&amp;#8217;s striking performance, I was intrigued to see how (or
if!) it&amp;#8217;d work on a&amp;nbsp;Pi.&lt;/p&gt;
&lt;p&gt;For Ubuntu Studio, the &lt;tt class="docutils literal"&gt;packages&lt;/tt&gt; section in &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;user-data&lt;/span&gt;&lt;/tt&gt; contains an
apparent multitude of&amp;nbsp;packages:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-audio&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-graphics&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-photography&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-video&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-publishing&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;firefox&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The various &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ubuntustudio-*&lt;/span&gt;&lt;/tt&gt; packages &lt;em&gt;other&lt;/em&gt; than &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ubuntustudio-desktop&lt;/span&gt;&lt;/tt&gt;
are all optional depending on what you want to use. For example, if you&amp;#8217;re only
interested in audio work, leave out the graphics, photography, video, and
publishing meta-packages. I would recommend leaving out video because doing
video-editing on a Pi is … &amp;#8220;optimistic&amp;#8221; to say the least. However, one oddity
of Ubuntu Studio is that it does &amp;#8220;assume&amp;#8221; a certain set of installed packages
in the default quick launcher. If you exclude certain meta-packages you may
find a number of blank &amp;#8220;?&amp;#8221; icons in the quick launch bar because of &amp;#8220;missing&amp;#8221;
applications. You can un-pin these items without&amp;nbsp;consequence.&lt;/p&gt;
&lt;p&gt;One other note on default applications: Ubuntu Studio typically ships with
&lt;a class="reference external" href="https://freeshow.app/"&gt;FreeShow&lt;/a&gt; (which seems to be a dead link at the time of writing) from the
corresponding &lt;a class="reference external" href="https://snapcraft.io/freeshow"&gt;snap&lt;/a&gt;. Unfortunately we can&amp;#8217;t
include that here as it&amp;#8217;s another snap that&amp;#8217;s only built for &lt;tt class="docutils literal"&gt;amd64&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s plenty in these meta-packages that won&amp;#8217;t work on a Pi even if it will
install without complaint. For instance, &lt;a class="reference external" href="https://obsproject.com/"&gt;&lt;span class="caps"&gt;OBS&lt;/span&gt; Studio&lt;/a&gt; and &lt;a class="reference external" href="https://www.blender.org/"&gt;Blender&lt;/a&gt; both
require a &lt;span class="caps"&gt;GPU&lt;/span&gt; with OpenGL 3.3 support (the Pi&amp;#8217;s only supports up to 2.1). You
can attempt to override this with &lt;tt class="docutils literal"&gt;MESA_GL_VERSION_OVERRIDE=3.3&lt;/tt&gt; in your
environment, but don&amp;#8217;t expect much in the way of performance (and also don&amp;#8217;t be
surprised if several things, like the surfaces in the Blender preview, don&amp;#8217;t
display at all, assuming you&amp;#8217;re patient enough to wait for it to&amp;nbsp;start).&lt;/p&gt;
&lt;p&gt;That said, we should talk about the performance because, once again, we&amp;#8217;re
dealing with a Plasma desktop running under Wayland (assuming you selected the
Wayland option on the login screen, which I &lt;em&gt;highly&lt;/em&gt; recommend). And, once
again, the performance (for a Pi) is great. Despite it being an environment
replete with little &lt;span class="caps"&gt;UI&lt;/span&gt; animations, they all seem to play smoothly. The
interface never feels laggy in responding to clicks or movements. Sure, there&amp;#8217;s
some delay when launching things but that&amp;#8217;s not the desktop interface; that&amp;#8217;s
the &lt;span class="caps"&gt;SD&lt;/span&gt;&amp;nbsp;card.&lt;/p&gt;
&lt;img alt="A screenshot of the Ubuntu Studio desktop. In contrast to Kubuntu, the application bar is at the top (reminiscent of Xubuntu). Next to the start menu button is a large array of quick-launch icons for myriad applications (Ardour, Krita, GIMP, kdenlive, etc.) and finally at the far right is the system tray. Below the top bar are a variety of Studio's more unique applications: MuseScore showing a few bars of the opening of Scott Joplin's The Entertainer, LMMS showing a (rather bad) recording of a few opening bars of Scott Joplin's The Entertainer, htop running in a terminal, a scribble in Krita that makes XKCD look like high art, and the KDE settings application atop everything showing a summary of the system's hardware." src="https://waldorf.waveform.org.uk/images/desktops-lunar-studio.png" /&gt;
&lt;p&gt;In use Ubuntu Studio is a bit different. For starters, it was the only flavour
here to correctly select the &lt;span class="caps"&gt;HDMI&lt;/span&gt; audio output by default. Perhaps this is
something to do with the rather more complex audio stack? This is no more than
a guess on my part,&amp;nbsp;however.&lt;/p&gt;
&lt;p&gt;Studio is &lt;em&gt;by far&lt;/em&gt; the largest of the flavours here. With all the meta-packages
included above it weighs in at a positively obese &lt;span class="caps"&gt;17GB&lt;/span&gt; on the &lt;span class="caps"&gt;SD&lt;/span&gt; card, so don&amp;#8217;t
even think about trying this on anything less than a &lt;span class="caps"&gt;32GB&lt;/span&gt; card (unless you
leave out some meta-packages). Speaking of storage, the partitions on the &lt;span class="caps"&gt;SD&lt;/span&gt;
card showed up as removable in the file browser (same as in&amp;nbsp;Kubuntu).&lt;/p&gt;
&lt;p&gt;As on Kubuntu, the terminal was the the typically excellent and feature-full
&lt;a class="reference external" href="https://konsole.kde.org/"&gt;Konsole&lt;/a&gt;, and the file-browser is again &lt;a class="reference external" href="https://apps.kde.org/en-gb/dolphin/"&gt;Dolphin&lt;/a&gt;. Still, it feels a bit
churlish to look at my usual set of applications for Ubuntu Studio. No-one&amp;#8217;s
going to be installing Studio just to &lt;em&gt;play&lt;/em&gt; music or fiddle with the terminal;
it&amp;#8217;s a flavour for &lt;em&gt;creators&lt;/em&gt;. So I scoured the house for all the interesting
gear I could find to plug in and see how things went&amp;nbsp;…&lt;/p&gt;
&lt;p&gt;First off, given we&amp;#8217;re dealing with a novel display stack (Wayland), how about
trying to colour-calibrate the monitor? I dug out my trusty old &lt;a class="reference external" href="https://github.com/hughski/colorhug2-firmware"&gt;ColorHug2&lt;/a&gt;
and strapped it to the screen, fired up &lt;a class="reference external" href="https://displaycal.net/"&gt;DisplayCAL&lt;/a&gt; and got to work. No
issues generating the profile: hardware was recognized, the screen-saver was
suppressed for the duration of calibration, and although the calculations took
a while (it is a Pi), it was ultimately successful at generating a profile.
Unfortunately, I couldn&amp;#8217;t get the profile to install at the end of it
(complaints about a timeout, though after a bit of digging I think there&amp;#8217;s
something else going on). Nor, for that matter, did the swapped-red-and-blue
test profile appear to work, so there&amp;#8217;s something else missing here. Oh&amp;nbsp;well.&lt;/p&gt;
&lt;p&gt;What about drawing? I helped myself to the ancient Wacom Intuos 3 tablet
attached to my other half&amp;#8217;s Mac Mini, fired up &lt;a class="reference external" href="https://krita.org/en/"&gt;Krita&lt;/a&gt; and drew some bits that
6 year-old me would&amp;#8217;ve been truly proud of. Ahem. Needless to say, the tablet
Just Worked, including all the fun configuration options for optional hot-keys,
pressure response curves and tool switching depending on the pen tip. I can&amp;#8217;t
say this is terribly surprising, though, as it&amp;#8217;s always worked on every Linux
system I&amp;#8217;ve tried it on for the last 10 years or&amp;nbsp;so.&lt;/p&gt;
&lt;p&gt;How about music composition? I nicked my daughter&amp;#8217;s Yamaha keyboarad, found the
one remaining &lt;span class="caps"&gt;USB&lt;/span&gt;-B cable in the house (that wasn&amp;#8217;t busy serving a &lt;span class="caps"&gt;UPS&lt;/span&gt;), and
hooked it up as a &lt;span class="caps"&gt;MIDI&lt;/span&gt; source. After failing to figure out &lt;a class="reference external" href="https://ardour.org/"&gt;Ardour&lt;/a&gt;, I managed
to rekindle some of my &lt;a class="reference external" href="https://lmms.io/"&gt;&lt;span class="caps"&gt;LMMS&lt;/span&gt;&lt;/a&gt; skills and, with some awkward fumbling around
the sound output configuration, got it recording from (and playing back
through) the keyboard. My formerly formidable piano skills have sadly
bit-rotted over the last 30 years. But I still managed to record a passable
rendition of the opening of Scott Joplin&amp;#8217;s The Entertainer … treble only, at a
positively sedate 45bpm, then the bass line on a separate track, then sped it
all up to 70 to pretend I could still&amp;nbsp;play.&lt;/p&gt;
&lt;p&gt;On the publishing side of things I gave the excellent &lt;a class="reference external" href="https://musescore.org/en"&gt;MuseScore&lt;/a&gt; a whirl,
including the keyboard as &lt;span class="caps"&gt;MIDI&lt;/span&gt; input. It performed happily and I managed to
crank out a vaguely acceptable score for the first bit of The Entertainer again
&lt;a class="footnote-reference" href="#wysiwyg-music" id="footnote-reference-1"&gt;[1]&lt;/a&gt;. Printing remotely worked happily, as did scanning (once I&amp;#8217;d
configured &lt;a class="reference external" href="http://www.sane-project.org/"&gt;&lt;span class="caps"&gt;SANE&lt;/span&gt;&lt;/a&gt; to look on the right host for the&amp;nbsp;scanner).&lt;/p&gt;
&lt;p&gt;I gave the video editing and rendering bits a brief try, but they were pretty
much as one would expect: basically unusable without much beefier&amp;nbsp;hardware.&lt;/p&gt;
&lt;p&gt;Finally, I tried out &lt;a class="reference external" href="https://www.scribus.net/"&gt;Scribus&lt;/a&gt; as well and was rather surprised to find it
very &amp;#8220;laggy&amp;#8221; when dragging things out on the canvas. I pondered if it&amp;#8217;s one of
the applications currently suffering from Wayland transition issues and ran it
instead with &lt;tt class="docutils literal"&gt;QT_QPA_PLATFORM=xcb&lt;/tt&gt; and that &lt;em&gt;largely&lt;/em&gt; fixed things. Still, I
didn&amp;#8217;t dig any further (as I&amp;#8217;d already burned far too much time playing with
this&amp;nbsp;flavour).&lt;/p&gt;
&lt;p&gt;But now for the &lt;em&gt;burning&lt;/em&gt; question: what about the&amp;nbsp;screen-saver?&lt;/p&gt;
&lt;p&gt;It managed to lock the screen (no suspend), and then crashed. It didn&amp;#8217;t crash
back to the desktop (good marks for security), but also didn&amp;#8217;t display a
&amp;#8220;here&amp;#8217;s how to get out of this&amp;#8221; message like Kubuntu. I managed to manually use
the &lt;tt class="docutils literal"&gt;loginctl&lt;/tt&gt; trick from Kubuntu to figure out an unlock from another
console, but I can imagine an ordinary user resorting to the three-finger
shuffle here.&amp;nbsp;Ouch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="verdict"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Verdict&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This isn&amp;#8217;t your regular flavour, and it&amp;#8217;s certain overkill for many. But if
you&amp;#8217;re the creative type it may well be the flavour for you. Provided your
expectations of the platform are reasonable (this is not the box for
&lt;a class="reference external" href="https://www.blender.org/"&gt;Blender&lt;/a&gt;, &lt;a class="reference external" href="https://obsproject.com/"&gt;&lt;span class="caps"&gt;OBS&lt;/span&gt; Studio&lt;/a&gt;, or &lt;a class="reference external" href="https://kdenlive.org/en/"&gt;kdenlive&lt;/a&gt;) it&amp;#8217;s useable for basic music
creation, composition, writing or&amp;nbsp;art.&lt;/p&gt;
&lt;p&gt;Some things aren&amp;#8217;t responsive in all circumstances (when drawing with a tablet
you have to be a bit careful of what&amp;#8217;s visible vs the complexity of the
brushes), but with a bit of patience and effort it works! Studio also has a
really nice menu detailing where to get further help, from documentation to
community&amp;nbsp;support.&lt;/p&gt;
&lt;p&gt;It looks like there&amp;#8217;s still some kinks to work out (particularly around the
Wayland transition) but yet again I&amp;#8217;m very impressed by a &lt;span class="caps"&gt;KDE&lt;/span&gt;-based&amp;nbsp;flavour.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;span id="down-here"&gt;&lt;/span&gt;&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Configuration&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For Ubuntu Studio, the configurations I used were as follows. For the boot
configuration, highlighted lines are those changed from the lunar&amp;nbsp;defaults:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;config.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;&lt;span class="na"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vmlinuz&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="na"&gt;cmdline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;cmdline.txt&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;&lt;span class="na"&gt;initramfs initrd.img followkernel&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="k"&gt;[pi4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;&lt;span class="na"&gt;max_framebuffers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="na"&gt;arm_boost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;&lt;span class="c1"&gt;# Enable the audio output, I2C and SPI interfaces on the GPIO header. As these&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="c1"&gt;# parameters related to the base device-tree they must appear *before* any&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="c1"&gt;# other dtoverlay= specification&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;audio=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;i2c_arm=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;spi=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;&lt;span class="c1"&gt;# Comment out the following line if the edges of the desktop appear outside&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="c1"&gt;# the edges of your display&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="na"&gt;disable_overscan&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="c1"&gt;# If you have issues with audio, you may try uncommenting the following line&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="c1"&gt;# which forces the HDMI output into HDMI mode instead of DVI (which doesn&amp;#39;t&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="c1"&gt;# support audio output)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="c1"&gt;#hdmi_drive=2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="c1"&gt;# Enable the serial pins&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="c1"&gt;#enable_uart=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="c1"&gt;# Autoload overlays for any recognized cameras or displays that are attached&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="c1"&gt;# to the CSI/DSI ports. Please note this is for libcamera support, *not* for&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="c1"&gt;# the legacy camera stack&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;&lt;span class="na"&gt;camera_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="na"&gt;display_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="c1"&gt;# Config settings specific to arm64&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="na"&gt;arm_64bit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="k"&gt;[cm4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="c1"&gt;# Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;&lt;span class="c1"&gt;# such a board)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2,dr_mode=host&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vc4-kms-v3d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the kernel command line, the entire file must consist of a &lt;em&gt;single line of
text&lt;/em&gt; so I would suggest simply copying this&amp;nbsp;wholesale:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;cmdline.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=zstd dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, the highlighted lines are those that you
may wish to change after copying the content. As mentioned above, you may wish
to trim the list of meta-packages&amp;nbsp;highlighted:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;user-data&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="c1"&gt;#cloud-config&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;studio-pi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;&lt;span class="nt"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;en_GB.UTF-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="nt"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Europe/London&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="nt"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pc105&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dave&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;lock_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;gecos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Dave&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Jones&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;plain_text_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;raspberry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALL=(ALL:ALL)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ALL&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="nt"&gt;ssh_import_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lp:waveform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;mozillateam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ppa:mozillateam/ppa&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/etc/apt/preferences.d/firefox&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=LP-PPA-mozillateam&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: 501&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: -1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/home/dave/.profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;append&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;defer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;export MOZ_ENABLE_WAYLAND=1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="nt"&gt;package_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;&lt;span class="nt"&gt;package_upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="nt"&gt;package_reboot_if_required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-47"&gt;&lt;span class="linenos"&gt;47&lt;/span&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-48"&gt;&lt;span class="linenos"&gt;48&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-49"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;49&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-audio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-50"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;50&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-graphics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-51"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;51&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-photography&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-52"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;52&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-video&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-53"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;53&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntustudio-publishing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-54"&gt;&lt;span class="linenos"&gt;54&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-55"&gt;&lt;span class="linenos"&gt;55&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;firefox&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finally, the networking configuration. I used Ethernet for my experiments, and
given the number of packages that need installing I&amp;#8217;d generally recommend that
too. Please see the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; for important information on adjusting the
network configuration to Network Manager post&amp;nbsp;installation:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;network-config&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt;2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt;3&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt;4&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt;5&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt;6&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="wysiwyg-music" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Hang on, if you&amp;#8217;re so gung-ho about hating &lt;a class="reference external" href="https://en.wikipedia.org/wiki/WYSIWYG"&gt;&lt;span class="caps"&gt;WYSIWYG&lt;/span&gt;&lt;/a&gt;,
shouldn&amp;#8217;t you be using &lt;a class="reference external" href="http://lilypond.org/text-input.html"&gt;LilyPond&lt;/a&gt; here? Yes, but that&amp;#8217;s not part of the
Ubuntu Studio audio seed :)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="studio"></category><category term="lunar"></category><category term="pi"></category><category term="cloud-init"></category><category term="desktop"></category></entry><entry><title>The Kubuntu Flavour</title><link href="https://waldorf.waveform.org.uk/2023/the-kubuntu-flavour.html" rel="alternate"></link><published>2023-08-05T00:00:00+01:00</published><updated>2023-11-06T08:37:40+00:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2023-08-05:/2023/the-kubuntu-flavour.html</id><summary type="html">&lt;p class="first last"&gt;Baking a Kubuntu Lunar desktop with&amp;nbsp;cloud-init&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;: The &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; which links to all the other flavour posts.
Skip &lt;a class="reference internal" href="#down-here"&gt;down here&lt;/a&gt; for the configurations&amp;nbsp;used.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;#8217;ll be looking at creating a Kubuntu desktop with a
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, on a Raspberry&amp;nbsp;Pi.&lt;/p&gt;
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#kubuntu" id="toc-entry-1"&gt;Kubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#verdict" id="toc-entry-2"&gt;Verdict&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#configuration" id="toc-entry-3"&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="kubuntu"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Kubuntu&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Kubuntu is the &lt;span class="caps"&gt;KDE&lt;/span&gt;-based spin of Ubuntu. For those unfamiliar, &lt;span class="caps"&gt;KDE&lt;/span&gt; is the other
&amp;#8220;big&amp;#8221; desktop player besides &lt;span class="caps"&gt;GNOME&lt;/span&gt;, and is based on the Qt toolkit. &lt;span class="caps"&gt;KDE&lt;/span&gt;&amp;#8217;s
always had a more &amp;#8220;traditional&amp;#8221; feel in its desktop (almost staid, some might
say). The start bar (with a classical categorised start menu) goes at the
bottom, followed by the application switcher, and system tray. Applications all
have a reasonably common look and feel, and all applications have every
configuration option you could ever hope for scattered throughout their
numerous pages of&amp;nbsp;preferences.&lt;/p&gt;
&lt;p&gt;This is in fairly stark contrast to &lt;span class="caps"&gt;GNOME&lt;/span&gt; which, of late, has been more
experimental and has pursued a deliberate path of &amp;#8220;making it simple&amp;#8221;. To put it
another way, if you sat your elderly mother in front of a modern &lt;span class="caps"&gt;GNOME&lt;/span&gt; system,
it might take them a while to figure out how to get going. But on &lt;span class="caps"&gt;KDE&lt;/span&gt;, they&amp;#8217;d
be up and running right out the gate &lt;a class="footnote-reference" href="#simple" id="footnote-reference-1"&gt;[1]&lt;/a&gt;.&lt;/p&gt;
&lt;img alt="A screenshot of the Kubuntu desktop. The bar at the bottom contains the Kubuntu logo at the far left, showing the opened start menu above it (with categories on the left and applications on the right). Further along the bottom bar are the quick-launch icons, then the icons of open applications, then finally the system tray on the far right. Within the desktop can be seen (from front to back), the media player showing an episode from the BBC's Hitchhikers Guide to the Galaxy TV adaptation (detailing Ford Prefect), the Dolphin file-browser, Firefox showing a page from the OwnCloud website, and in the background a PDF of a Raspberry Pi datasheet." src="https://waldorf.waveform.org.uk/images/desktops-lunar-kubuntu.png" /&gt;
&lt;p&gt;The last time I tried Kubuntu on a Pi, it was &lt;em&gt;laughably&lt;/em&gt; slow, and I was
expecting no different this time. I could not have been more wrong&amp;nbsp;…&lt;/p&gt;
&lt;p&gt;Kubuntu is notably the only other desktop environment here that supports
Wayland out of the box. It defaults to X11, but you can easily select &amp;#8220;Desktop
Session: Plasma (Wayland)&amp;#8221; from the bottom of the &lt;span class="caps"&gt;KDM&lt;/span&gt; login page, and this
selection will persist for future logins. Speaking of logins, there&amp;#8217;s a
bizarrely long delay before the desktop shows up after login. This appears
peculiar to &lt;span class="caps"&gt;KDE&lt;/span&gt; but if you put up with it, the wait is&amp;nbsp;worthwhile!&lt;/p&gt;
&lt;p&gt;When running under Wayland, the environment is buttery-smooth. All the little
animations from the fade-in of the desktop, to the opening slide of the start
menu proceed without jitters or jerks. Don&amp;#8217;t expect any speed up in opening
large applications. This is still a Pi, and I&amp;#8217;m running these experiments off
&lt;span class="caps"&gt;SD&lt;/span&gt; cards which top out at 20Mb/s transfer on a Pi 4. Nonetheless, I was
astonished to find that the desktop I expected to be the heavy-weight laggard
was up there with the best of them in&amp;nbsp;responsiveness!&lt;/p&gt;
&lt;p&gt;The bundled applications largely work well. The file browser is the capable
&lt;a class="reference external" href="https://apps.kde.org/en-gb/dolphin/"&gt;Dolphin&lt;/a&gt; which was happy browsing and opening things from unmounted network
shares, and has a nifty &amp;#8220;multiple-selection&amp;#8221; feature (look for the &amp;#8220;plus&amp;#8221; when
hovering over items). One oddity is that, as under Lubuntu, it considered the
partitions on the &lt;span class="caps"&gt;SD&lt;/span&gt; card &amp;#8220;removable&amp;#8221; (though it mercifully didn&amp;#8217;t offer an
eject button for the root partition). One other thing it notably managed was to
extract files from an archive with drag&amp;#8217;n&amp;#8217;drop. This has been &lt;a class="reference external" href="https://gitlab.gnome.org/GNOME/file-roller/-/issues/4"&gt;broken on
&lt;span class="caps"&gt;GNOME&lt;/span&gt;&lt;/a&gt; (and thus Ubuntu, &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/file-roller/+bug/1923033"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1923033&lt;/a&gt;) for &lt;em&gt;years&lt;/em&gt;&amp;nbsp;now.&lt;/p&gt;
&lt;p&gt;As before, the default audio output is incorrectly selected, but again that&amp;#8217;s a
trivial work-around. Video playback is handled by the &lt;a class="reference external" href="https://apps.kde.org/en-gb/haruna/"&gt;Haruna&lt;/a&gt; media player.
Unfortunately this wasn&amp;#8217;t happy playing things from unmounted network shares
(despite them being accessible from the Open File menu). Otherwise, it proved
one of the more capable bundled players, handling chapter markers and subtitles
with aplomb. The bundled music player is &lt;a class="reference external" href="https://apps.kde.org/en-gb/elisa/"&gt;Elisa&lt;/a&gt; which is a simple,
attractive, and intuitive affair, but sadly doesn&amp;#8217;t support playing (or
indexing) anything other than a mounted&amp;nbsp;file-system.&lt;/p&gt;
&lt;p&gt;Firefox worked well, but now we finally come to something I alluded to at the
start. When installed as a snap it doesn&amp;#8217;t seem able to use the &amp;#8220;full&amp;#8221; Wayland
mode (reverting to XWayland protocol instead). This is the reason for
installing the deb, and also the reason for me re-writing a whole pile of stuff
here &lt;a class="footnote-reference" href="#redo1" id="footnote-reference-2"&gt;[2]&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;The screen-saver works … then sometimes crashes. At this point I was getting
rather used to flakiness in screen-savers but what surprised me was that,
having crashed, it brought up a nice and detailed set of instructions on
securely unlocking the desktop from another terminal. This … seems like an&amp;nbsp;improvement?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="verdict"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Verdict&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What a difference from last&amp;nbsp;time!&lt;/p&gt;
&lt;p&gt;Great performance (after a slow initial login), combined with &lt;span class="caps"&gt;KDE&lt;/span&gt;&amp;#8217;s legendary
configurability. Some reliability issues still (screen-saver, not-so-removable
storage!), but this is a genuinely useful desktop on a Pi&amp;nbsp;now.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s also a ton of nice little &lt;span class="caps"&gt;UI&lt;/span&gt; tweaks that made it genuinely pleasant to
use for several days. The start menu encapsulates all styles (categorical, one
big list, and searchable), the system tray has myriad capabilities that make it
far more useful than most (e.g. selecting the audio output, or bluetooth
devices straight from the tray widgets without launching other&amp;nbsp;things).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;span id="down-here"&gt;&lt;/span&gt;&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Configuration&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For Kubuntu, the configurations I used were as follows. For the boot
configuration, highlighted lines are those changed from the lunar&amp;nbsp;defaults:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;config.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;&lt;span class="na"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vmlinuz&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="na"&gt;cmdline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;cmdline.txt&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;&lt;span class="na"&gt;initramfs initrd.img followkernel&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="k"&gt;[pi4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;&lt;span class="na"&gt;max_framebuffers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="na"&gt;arm_boost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;&lt;span class="c1"&gt;# Enable the audio output, I2C and SPI interfaces on the GPIO header. As these&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="c1"&gt;# parameters related to the base device-tree they must appear *before* any&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="c1"&gt;# other dtoverlay= specification&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;audio=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;i2c_arm=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;spi=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;&lt;span class="c1"&gt;# Comment out the following line if the edges of the desktop appear outside&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="c1"&gt;# the edges of your display&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="na"&gt;disable_overscan&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="c1"&gt;# If you have issues with audio, you may try uncommenting the following line&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="c1"&gt;# which forces the HDMI output into HDMI mode instead of DVI (which doesn&amp;#39;t&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="c1"&gt;# support audio output)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="c1"&gt;#hdmi_drive=2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="c1"&gt;# Enable the serial pins&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="c1"&gt;#enable_uart=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="c1"&gt;# Autoload overlays for any recognized cameras or displays that are attached&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="c1"&gt;# to the CSI/DSI ports. Please note this is for libcamera support, *not* for&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="c1"&gt;# the legacy camera stack&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;&lt;span class="na"&gt;camera_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="na"&gt;display_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="c1"&gt;# Config settings specific to arm64&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="na"&gt;arm_64bit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="k"&gt;[cm4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="c1"&gt;# Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;&lt;span class="c1"&gt;# such a board)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2,dr_mode=host&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vc4-kms-v3d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the kernel command line, the entire file must consist of a &lt;em&gt;single line of
text&lt;/em&gt; so I would suggest simply copying this&amp;nbsp;wholesale:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;cmdline.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=zstd dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, the highlighted lines are those that you
may wish to change after copying the&amp;nbsp;content:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;user-data&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="c1"&gt;#cloud-config&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;kubuntu-pi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;&lt;span class="nt"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;en_GB.UTF-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="nt"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Europe/London&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="nt"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pc105&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dave&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;lock_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;gecos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Dave&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Jones&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;plain_text_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;raspberry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALL=(ALL:ALL)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ALL&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="nt"&gt;ssh_import_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lp:waveform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;mozillateam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ppa:mozillateam/ppa&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/etc/apt/preferences.d/firefox&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=LP-PPA-mozillateam&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: 501&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: -1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/home/dave/.profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;append&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;defer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;export MOZ_ENABLE_WAYLAND=1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="nt"&gt;package_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;&lt;span class="nt"&gt;package_upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="nt"&gt;package_reboot_if_required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-47"&gt;&lt;span class="linenos"&gt;47&lt;/span&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-48"&gt;&lt;span class="linenos"&gt;48&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;kubuntu-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-49"&gt;&lt;span class="linenos"&gt;49&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-50"&gt;&lt;span class="linenos"&gt;50&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;firefox&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finally, the networking configuration. I used Ethernet for my experiments, and
given the number of packages that need installing I&amp;#8217;d generally recommend that
too. Please see the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; for important information on adjusting the
network configuration to Network Manager post&amp;nbsp;installation:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;network-config&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt;2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt;3&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt;4&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt;5&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt;6&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="simple" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I leave it for the reader to judge what this implies about &lt;span class="caps"&gt;GNOME&lt;/span&gt;&amp;#8217;s
drive for simplicity …&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="redo1" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I&amp;#8217;d started off this series doing everything &amp;#8220;by the book&amp;#8221; with
Firefox from a snap, then after discovering that only the deb-based install
supported this, wound up re-doing everything partly to ensure all the
flavours had the best performance I could give them (full Wayland support if
available without too much hacking), and secondly that they were on a level
playing field (all snaps or all debs for Firefox).&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="kubuntu"></category><category term="lunar"></category><category term="pi"></category><category term="cloud-init"></category><category term="desktop"></category></entry><entry><title>The Ubuntu Unity Flavour</title><link href="https://waldorf.waveform.org.uk/2023/the-ubuntu-unity-flavour.html" rel="alternate"></link><published>2023-08-04T00:00:00+01:00</published><updated>2023-08-01T17:02:11+01:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2023-08-04:/2023/the-ubuntu-unity-flavour.html</id><summary type="html">&lt;p class="first last"&gt;Baking an Ubuntu Unity Lunar desktop with&amp;nbsp;cloud-init&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;: The &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; which links to all the other flavour posts.
Skip &lt;a class="reference internal" href="#down-here"&gt;down here&lt;/a&gt; for the configurations&amp;nbsp;used.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;#8217;ll be looking at creating an Ubuntu Unity desktop with a
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, on a Raspberry&amp;nbsp;Pi.&lt;/p&gt;
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#ubuntu-unity" id="toc-entry-1"&gt;Ubuntu&amp;nbsp;Unity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#verdict" id="toc-entry-2"&gt;Verdict&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#configuration" id="toc-entry-3"&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="ubuntu-unity"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Ubuntu&amp;nbsp;Unity&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A blast from the past! This was one I didn&amp;#8217;t manage to test last time, but I&amp;#8217;ve
a major soft spot for good ol&amp;#8217; &lt;a class="reference external" href="https://ubuntuunity.org/"&gt;Unity&lt;/a&gt;, having spent many years with it as my
desktop on the &lt;span class="caps"&gt;PC&lt;/span&gt; back in the pre-Bionic days. So let&amp;#8217;s give it a spin on the&amp;nbsp;Pi!&lt;/p&gt;
&lt;p&gt;For those unfamiliar with Unity, it has some quite different ideas of its own:
the start menu and quick launcher are on the left of the screen (rather than
the traditional top or bottom). If I recall correctly (and I&amp;#8217;m sure someone
will correct me in the comments if I&amp;#8217;m not) this was because most screens have
a wide-screen aspect ratio, so if you&amp;#8217;re going to &amp;#8220;waste&amp;#8221; space with
non-application stuff, better to do it horizontally than vertically (which
sounds pretty reasonable to&amp;nbsp;me).&lt;/p&gt;
&lt;p&gt;In later iterations, and indeed in Unity 7 that we&amp;#8217;re using here, it also
borrows a few tid-bits from MacOS X: the window icons (minimize, maximize,
close) are on the top left, and application menus appear in the bar at the top
of the window rather than within the application window. Again, I &lt;em&gt;think&lt;/em&gt; I&amp;#8217;m
right in stating this was (at least partially) in aid of not wasting vertical&amp;nbsp;real-estate.&lt;/p&gt;
&lt;img alt="A screenshot of the Ubuntu Unity desktop. The quick-launch icons are on the left of the screen below the Ubuntu icon at the top left. At the very top is the grey bar which switches to the application menu when hovered. It also contains the system tray icons at the top right. Within the desktop can be seen Firefox, behind a file-browser, Rhythmbox, VLC playing an old episode of &amp;quot;Spaced&amp;quot;, and htop running in a terminal window." src="https://waldorf.waveform.org.uk/images/desktops-lunar-unity.png" /&gt;
&lt;p&gt;The selection of bundled applications was excellent. &lt;a class="reference external" href="https://www.videolan.org/"&gt;&lt;span class="caps"&gt;VLC&lt;/span&gt;&lt;/a&gt; for video playing,
and &lt;a class="reference external" href="https://wiki.gnome.org/Apps/Rhythmbox"&gt;Rhythmbox&lt;/a&gt; for music. Couldn&amp;#8217;t ask for better. The file browser is
the excellent &lt;a class="reference external" href="https://github.com/linuxmint/nemo"&gt;Nemo&lt;/a&gt; from the Cinnamon desktop. Everything was generally
reliable and worked …&amp;nbsp;eventually.&lt;/p&gt;
&lt;p&gt;Unfortunately, this brings us to the first major issue: performance. As with
all the alternative desktops so far there&amp;#8217;s no Wayland support yet, but even
discounting that performance was &lt;em&gt;painfully&lt;/em&gt; slow. I did note that, as under
Budgie, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cups-browsed&lt;/span&gt;&lt;/tt&gt; was eating 100% of a &lt;span class="caps"&gt;CPU&lt;/span&gt; core again. But even after
killing that, things still felt very sluggish, especially after the snappy
responses of Lubuntu and&amp;nbsp;Xubuntu.&lt;/p&gt;
&lt;p&gt;Integration was also spotty. The menus for &lt;em&gt;most&lt;/em&gt; things appeared in the top
bar. But not Firefox (arguably the most important application on the desktop).
One might argue that Firefox doesn&amp;#8217;t have a menu bar any-more, that it&amp;#8217;s
succumbed to the modern obsession with hiding everything behind a &amp;#8220;burger&amp;#8221;
button but the menus are still there: hit Alt+F and you&amp;#8217;ll see (in fact several
of the menus aren&amp;#8217;t available from the &amp;#8220;burger&amp;#8221; button, which is probably&amp;nbsp;why).&lt;/p&gt;
&lt;p&gt;However, the screen-saver? Works! This is the only other flavour to, out of the
box, reliably suspend my monitor and lock the desktop with no crashes (Lubuntu
being the&amp;nbsp;other).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="verdict"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Verdict&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;d &lt;em&gt;really&lt;/em&gt; love to recommend Unity. Its interface ideas may be novel and
quite different to most other flavours, but they make a good deal of sense (far
more than &lt;span class="caps"&gt;GNOME&lt;/span&gt;&amp;#8217;s do, to me anyway). However, while the reliability is great,
the performance just isn&amp;#8217;t good enough for use on a small&amp;nbsp;platform.&lt;/p&gt;
&lt;p&gt;The theme (whether light or dark) made it rather hard to distinguish window
edges of inactive applications. Looking at the screenshot above, can you see
where the file-browser ends, and the music player or the browser begins? There
are also some strange edges to menu corners as if the environment wanted to
draw shadows there, but&amp;nbsp;forgot:&lt;/p&gt;
&lt;img alt="A close up screen-grab of an open menu under Ubuntu Unity. The menu itself appears in a shade of grey almost indistinguishable from the white of the web-page beneath it. However, the bottom left and right corners of the menu are shaded distinctly darker, as if intended to blend with some shadow rendered around the whole menu, but which is not present." src="https://waldorf.waveform.org.uk/images/desktops-lunar-unity-menu.png" /&gt;
&lt;p&gt;This all gave me an impression that things were not rendering &amp;#8220;as intended&amp;#8221;. Is
there meant to be a shadow border around&amp;nbsp;windows?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;span id="down-here"&gt;&lt;/span&gt;&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Configuration&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For Ubuntu Unity, the configurations I used were as follows. For the boot
configuration, highlighted lines are those changed from the lunar&amp;nbsp;defaults:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;config.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;&lt;span class="na"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vmlinuz&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="na"&gt;cmdline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;cmdline.txt&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;&lt;span class="na"&gt;initramfs initrd.img followkernel&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="k"&gt;[pi4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;&lt;span class="na"&gt;max_framebuffers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="na"&gt;arm_boost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;&lt;span class="c1"&gt;# Enable the audio output, I2C and SPI interfaces on the GPIO header. As these&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="c1"&gt;# parameters related to the base device-tree they must appear *before* any&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="c1"&gt;# other dtoverlay= specification&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;audio=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;i2c_arm=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;spi=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;&lt;span class="c1"&gt;# Comment out the following line if the edges of the desktop appear outside&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="c1"&gt;# the edges of your display&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="na"&gt;disable_overscan&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="c1"&gt;# If you have issues with audio, you may try uncommenting the following line&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="c1"&gt;# which forces the HDMI output into HDMI mode instead of DVI (which doesn&amp;#39;t&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="c1"&gt;# support audio output)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="c1"&gt;#hdmi_drive=2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="c1"&gt;# Enable the serial pins&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="c1"&gt;#enable_uart=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="c1"&gt;# Autoload overlays for any recognized cameras or displays that are attached&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="c1"&gt;# to the CSI/DSI ports. Please note this is for libcamera support, *not* for&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="c1"&gt;# the legacy camera stack&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;&lt;span class="na"&gt;camera_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="na"&gt;display_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="c1"&gt;# Config settings specific to arm64&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="na"&gt;arm_64bit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="k"&gt;[cm4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="c1"&gt;# Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;&lt;span class="c1"&gt;# such a board)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2,dr_mode=host&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vc4-kms-v3d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the kernel command line, the entire file must consist of a &lt;em&gt;single line of
text&lt;/em&gt; so I would suggest simply copying this&amp;nbsp;wholesale:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;cmdline.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=zstd dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, the highlighted lines are those that you
may wish to change after copying the&amp;nbsp;content:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;user-data&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="c1"&gt;#cloud-config&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;unity-pi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;&lt;span class="nt"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;en_GB.UTF-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="nt"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Europe/London&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="nt"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pc105&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dave&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;lock_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;gecos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Dave&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Jones&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;plain_text_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;raspberry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALL=(ALL:ALL)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ALL&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="nt"&gt;ssh_import_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lp:waveform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;mozillateam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ppa:mozillateam/ppa&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/etc/apt/preferences.d/firefox&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=LP-PPA-mozillateam&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: 501&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: -1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/home/dave/.profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;append&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;defer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;export MOZ_ENABLE_WAYLAND=1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="nt"&gt;package_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;&lt;span class="nt"&gt;package_upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="nt"&gt;package_reboot_if_required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-47"&gt;&lt;span class="linenos"&gt;47&lt;/span&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-48"&gt;&lt;span class="linenos"&gt;48&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-unity-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-49"&gt;&lt;span class="linenos"&gt;49&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-50"&gt;&lt;span class="linenos"&gt;50&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;firefox&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finally, the networking configuration. I used Ethernet for my experiments, and
given the number of packages that need installing I&amp;#8217;d generally recommend that
too. Please see the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; for important information on adjusting the
network configuration to Network Manager post&amp;nbsp;installation:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;network-config&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt;2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt;3&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt;4&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt;5&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt;6&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="unity"></category><category term="lunar"></category><category term="pi"></category><category term="cloud-init"></category><category term="desktop"></category></entry><entry><title>The Ubuntu Budgie Flavour</title><link href="https://waldorf.waveform.org.uk/2023/the-ubuntu-budgie-flavour.html" rel="alternate"></link><published>2023-08-03T00:00:00+01:00</published><updated>2023-08-01T17:02:11+01:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2023-08-03:/2023/the-ubuntu-budgie-flavour.html</id><summary type="html">&lt;p class="first last"&gt;Baking an Ubuntu Budgie for Pi desktop with&amp;nbsp;cloud-init&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;: The &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; which links to all the other flavour posts.
Skip &lt;a class="reference internal" href="#down-here"&gt;down here&lt;/a&gt; for the configurations&amp;nbsp;used.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;#8217;ll be looking at creating an Ubuntu Budgie desktop (with
Pi-specific customizations!) with a &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration.&lt;/p&gt;
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#ubuntu-budgie" id="toc-entry-1"&gt;Ubuntu&amp;nbsp;Budgie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#verdict" id="toc-entry-2"&gt;Verdict&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#configuration" id="toc-entry-3"&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="ubuntu-budgie"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Ubuntu&amp;nbsp;Budgie&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Budgie desktop is (was?) based on &lt;span class="caps"&gt;GNOME&lt;/span&gt; but with a more &amp;#8220;traditional&amp;#8221;
desktop feel. The Ubuntu Budgie remix is styled with a brief nod towards MacOS
X with a Dock-like launcher (&lt;a class="reference external" href="https://launchpad.net/plank"&gt;Plank&lt;/a&gt;) centred at the bottom of the screen.
However, that&amp;#8217;s as far as the Mac-allusions go. There&amp;#8217;s no application menu in
the bar at the top, and the window icons are at the top-right instead of&amp;nbsp;top-left.&lt;/p&gt;
&lt;img alt="A screenshot of the Ubuntu Budgie desktop. Under the dark top bar containing the start-menu button, clock, and system tray, a variety of applications are shown including &amp;quot;top&amp;quot; running under the Tilix terminal, The Cult's &amp;quot;Sonic Template&amp;quot; album in the Lollypop music player, an episode of &amp;quot;Hey Duggee&amp;quot; playing in the Parole video player, and Firefox in the background showing a news article. At the bottom center of the screen is the MacOS X Dock-like application showing the icons of all the running applications, and a few others for quick launch." src="https://waldorf.waveform.org.uk/images/desktops-lunar-budgie.png" /&gt;
&lt;p&gt;Despite the &lt;span class="caps"&gt;GNOME&lt;/span&gt; heritage, there&amp;#8217;s no Wayland support yet (although a bit of
googling does suggest that it&amp;#8217;s a high priority for the next release). On first
login, I did need to select &amp;#8220;Budgie Desktop&amp;#8221; in the login manager (&lt;span class="caps"&gt;GDM&lt;/span&gt;) instead
of the &amp;#8220;Ubuntu Desktop&amp;#8221; default, which was a little odd, but it turned out
there was a reason for that which we&amp;#8217;ll come back to later&amp;nbsp;…&lt;/p&gt;
&lt;p&gt;The specific package used to install the Ubuntu Budgie remix
(&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ubuntu-budgie-desktop-raspi&lt;/span&gt;&lt;/tt&gt;) also includes a nice little Pi-specific
customization tool that launches on first login. However, I think some of its
options may be redundant at this point (for instance, when using the &amp;#8220;full&amp;#8221; &lt;span class="caps"&gt;KMS&lt;/span&gt;
overlay there&amp;#8217;s no need to specify a &lt;span class="caps"&gt;GPU&lt;/span&gt; memory size, even if you are using a
camera via the newer libcamera&amp;nbsp;stack).&lt;/p&gt;
&lt;p&gt;Most of the terminals in the various flavours are much of a muchness; all
support multiple tabs, all have scroll-back, and all are essentially decent at
their job. However, Budgie&amp;#8217;s pick for a terminal (&lt;a class="reference external" href="https://gnunn1.github.io/tilix-web/"&gt;Tilix&lt;/a&gt;) stands out as being
the only &lt;span class="caps"&gt;GTK&lt;/span&gt;-based terminal to support tiled panes, that I&amp;#8217;m aware of
&lt;a class="footnote-reference" href="#tiling" id="footnote-reference-1"&gt;[1]&lt;/a&gt;. Last time I tried it (in 2020) the terminal (which may or may not
have been Tilix, I can&amp;#8217;t recall) crashed pretty reliably, but this time around
it was solid as any of the rest, and a stand-out feature of the&amp;nbsp;environment.&lt;/p&gt;
&lt;p&gt;Budgie seems to have a bit of a thing about tiling generally. The desktop&amp;#8217;s got
corner tiling by default (useful on a big monitor), but also has some
fascinating shortcuts for ⅖-⅗ tiling, custom (shortcut activated) layouts,
and arrangement of windows in arbitrarily sized grids. On my little monitor, I
don&amp;#8217;t really need anything more than side-by-side tiling but I can imagine this
being &lt;em&gt;very&lt;/em&gt; handy on &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/4k-60hz-on-a-pi.html"&gt;large-scale high-&lt;span class="caps"&gt;DPI&lt;/span&gt; monitors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sadly, the reliability of the console wasn&amp;#8217;t reflected elsewhere. Things felt a
bit sluggish at times and eventually I figured out &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cups-browsed&lt;/span&gt;&lt;/tt&gt; was sitting
around eating 100% of one of the &lt;span class="caps"&gt;CPU&lt;/span&gt; cores. This &lt;em&gt;might&lt;/em&gt; be a known issue (&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/cups-browsed/+bug/2018504"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;:
#2018504&lt;/a&gt;), but that&amp;#8217;s marked &amp;#8220;fix released&amp;#8221; on Lunar and this was running on
a fully up-to-date system. I&amp;#8217;ll need to try and reproduce it to see if that bug
needs more&amp;nbsp;attention.&lt;/p&gt;
&lt;p&gt;Video playback also proved tricky to test; Budgie bundles the same default
video player as Xubuntu, &lt;a class="reference external" href="https://docs.xfce.org/apps/parole/start"&gt;Parole&lt;/a&gt;, but this crashed the Budgie window manager
process on the couple of occasions I tried it (it happily kept on playing the
video, but the desktop behind flickered out of existence and then restarted!).
The bundled Music player is &lt;a class="reference external" href="https://wiki.gnome.org/Apps/Lollypop"&gt;Lollypop&lt;/a&gt; and, while it seems a capable player,
it didn&amp;#8217;t seem to have any support for any of the music sharing protocols
supported on the home server, so I wound up mounting an &lt;span class="caps"&gt;NFS&lt;/span&gt; share for the
purposes of testing. This worked, but it struggled a bit with the sheer
quantity of albums, eating a good half a gig of &lt;span class="caps"&gt;RAM&lt;/span&gt; by the time it was done
indexing. The audio output default also needed adjusting (as on the other&amp;nbsp;desktops).&lt;/p&gt;
&lt;p&gt;And the screen-saver? Didn&amp;#8217;t appear to do anything at all at first (screen
never blanked, no suspend, no lock). This turned out to be &lt;a class="reference external" href="https://discourse.ubuntubudgie.org/t/lock-screen-no-longer-works-after-22-04-upgrade/6194/5"&gt;an issue&lt;/a&gt;
with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;gnome-shell-common&lt;/span&gt;&lt;/tt&gt; being installed. With that package purged (and …
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ubuntu-budgie-desktop&lt;/span&gt;&lt;/tt&gt; along with it!), the screen-saver managed to lock the
desktop correctly, but still failed to suspend the monitor (same as the
official &lt;span class="caps"&gt;GNOME&lt;/span&gt; desktop). Interestingly, this also uninstalled the &lt;span class="caps"&gt;GDM3&lt;/span&gt; login
greeter, and replaced it with the &lt;a class="reference external" href="https://github.com/linuxmint/slick-greeter"&gt;slick greeter&lt;/a&gt; (familiar to users of
Unity), which resolved having to select &amp;#8220;Budgie Desktop&amp;#8221; at&amp;nbsp;login.&lt;/p&gt;
&lt;p&gt;Still, this begs the question why &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;gnome-shell-common&lt;/span&gt;&lt;/tt&gt; is a transitive
dependency of &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ubuntu-budgie-desktop&lt;/span&gt;&lt;/tt&gt; (purging it does remove the
meta-package)? Is there a reason for this, or is it a&amp;nbsp;bug?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="verdict"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Verdict&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s attractive (nice start menu!), reasonably responsive for a modern desktop,
and has some novel applications (nice to see some Pi specific customizations).
However, it needs a bit of tweaking out of the box for better reliability. I
don&amp;#8217;t like removing seeds that supposedly define the&amp;nbsp;system!&lt;/p&gt;
&lt;p&gt;The tiling capabilities look very interesting for those on large monitors,&amp;nbsp;though.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;span id="down-here"&gt;&lt;/span&gt;&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Configuration&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For Ubuntu Budgie, the configurations I used were as follows. For the boot
configuration, highlighted lines are those changed from the lunar&amp;nbsp;defaults:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;config.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;&lt;span class="na"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vmlinuz&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="na"&gt;cmdline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;cmdline.txt&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;&lt;span class="na"&gt;initramfs initrd.img followkernel&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="k"&gt;[pi4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;&lt;span class="na"&gt;max_framebuffers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="na"&gt;arm_boost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;&lt;span class="c1"&gt;# Enable the audio output, I2C and SPI interfaces on the GPIO header. As these&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="c1"&gt;# parameters related to the base device-tree they must appear *before* any&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="c1"&gt;# other dtoverlay= specification&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;audio=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;i2c_arm=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;spi=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;&lt;span class="c1"&gt;# Comment out the following line if the edges of the desktop appear outside&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="c1"&gt;# the edges of your display&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="na"&gt;disable_overscan&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="c1"&gt;# If you have issues with audio, you may try uncommenting the following line&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="c1"&gt;# which forces the HDMI output into HDMI mode instead of DVI (which doesn&amp;#39;t&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="c1"&gt;# support audio output)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="c1"&gt;#hdmi_drive=2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="c1"&gt;# Enable the serial pins&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="c1"&gt;#enable_uart=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="c1"&gt;# Autoload overlays for any recognized cameras or displays that are attached&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="c1"&gt;# to the CSI/DSI ports. Please note this is for libcamera support, *not* for&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="c1"&gt;# the legacy camera stack&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;&lt;span class="na"&gt;camera_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="na"&gt;display_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="c1"&gt;# Config settings specific to arm64&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="na"&gt;arm_64bit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="k"&gt;[cm4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="c1"&gt;# Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;&lt;span class="c1"&gt;# such a board)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2,dr_mode=host&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vc4-kms-v3d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the kernel command line, the entire file must consist of a &lt;em&gt;single line of
text&lt;/em&gt; so I would suggest simply copying this&amp;nbsp;wholesale:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;cmdline.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=zstd dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, the highlighted lines are those that you
may wish to change after copying the&amp;nbsp;content:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;user-data&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="c1"&gt;#cloud-config&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;budgie-pi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;&lt;span class="nt"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;en_GB.UTF-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="nt"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Europe/London&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="nt"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pc105&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dave&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;lock_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;gecos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Dave&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Jones&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;plain_text_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;raspberry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALL=(ALL:ALL)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ALL&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="nt"&gt;ssh_import_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lp:waveform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;mozillateam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ppa:mozillateam/ppa&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/etc/apt/preferences.d/firefox&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=LP-PPA-mozillateam&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: 501&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: -1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/home/dave/.profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;append&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;defer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;export MOZ_ENABLE_WAYLAND=1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="nt"&gt;package_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;&lt;span class="nt"&gt;package_upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="nt"&gt;package_reboot_if_required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-47"&gt;&lt;span class="linenos"&gt;47&lt;/span&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-48"&gt;&lt;span class="linenos"&gt;48&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-budgie-desktop-raspi&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-49"&gt;&lt;span class="linenos"&gt;49&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-50"&gt;&lt;span class="linenos"&gt;50&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;firefox&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finally, the networking configuration. I used Ethernet for my experiments, and
given the number of packages that need installing I&amp;#8217;d generally recommend that
too. Please see the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; for important information on adjusting the
network configuration to Network Manager post&amp;nbsp;installation:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;network-config&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt;2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt;3&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt;4&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt;5&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt;6&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="tiling" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I specify &lt;span class="caps"&gt;GTK&lt;/span&gt;-based because that tittering you can hear is from
&lt;span class="caps"&gt;KDE&lt;/span&gt;&amp;#8217;s &lt;a class="reference external" href="https://konsole.kde.org/"&gt;Konsole&lt;/a&gt; users, who&amp;#8217;ve had this feature for yonks.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="budgie"></category><category term="lunar"></category><category term="pi"></category><category term="cloud-init"></category><category term="desktop"></category></entry><entry><title>The Xubuntu Flavour</title><link href="https://waldorf.waveform.org.uk/2023/the-xubuntu-flavour.html" rel="alternate"></link><published>2023-08-02T00:00:00+01:00</published><updated>2023-11-06T08:37:40+00:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2023-08-02:/2023/the-xubuntu-flavour.html</id><summary type="html">&lt;p class="first last"&gt;Baking a Lubuntu Lunar desktop with&amp;nbsp;cloud-init&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;: The &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; which links to all the other flavour posts.
Skip &lt;a class="reference internal" href="#down-here"&gt;down here&lt;/a&gt; for the configurations&amp;nbsp;used.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;#8217;ll be looking at creating a Xubuntu desktop with a
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, on a Raspberry&amp;nbsp;Pi.&lt;/p&gt;
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#xubuntu" id="toc-entry-1"&gt;Xubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#verdict" id="toc-entry-2"&gt;Verdict&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#configuration" id="toc-entry-3"&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="xubuntu"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Xubuntu&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Xubuntu is another lightweight flavour of Ubuntu (similar to Lubuntu in this
respect), but based on &lt;span class="caps"&gt;XFCE&lt;/span&gt; (a &lt;span class="caps"&gt;GTK&lt;/span&gt; based environment). Subjectively, I couldn&amp;#8217;t
discern much difference in performance between Lubuntu and Xubuntu. Other than
the positioning of the application bar at the top of the screen (compared to
Lubuntu&amp;#8217;s traditional bottom placement), things felt pretty&amp;nbsp;similar.&lt;/p&gt;
&lt;img alt="A screenshot of the Xubuntu desktop. A small panel sits at the top of the screen showing (from left to right) the small applications menu button, the window switcher, and the small icons in the system tray, followed by the clock. Below are numerous overlapping windows including a PDF showing a Raspberry Pi datasheet, &amp;quot;htop&amp;quot; running in a terminal, &amp;quot;Hey Arnold!&amp;quot; playing in a video player, a file browser, one of Simon Tatham's logic puzzles, and Firefox showing the prior blog post." src="https://waldorf.waveform.org.uk/images/desktops-lunar-xubuntu.png" /&gt;
&lt;p&gt;On the functionality side of things, the incorrect audio output appeared as in
Lubuntu, but was trivial to work around. Out of the box, music playback from
the network worked thanks to the inclusion of the excellent &lt;a class="reference external" href="https://wiki.gnome.org/Apps/Rhythmbox"&gt;Rhythmbox&lt;/a&gt;
&lt;a class="footnote-reference" href="#rhythm" id="footnote-reference-1"&gt;[1]&lt;/a&gt;. Video playback worked well with the &lt;a class="reference external" href="https://docs.xfce.org/apps/parole/start"&gt;Parole&lt;/a&gt; player, but
unfortunately it didn&amp;#8217;t seem able to playback from an &lt;span class="caps"&gt;SMB&lt;/span&gt; network share unless
it was&amp;nbsp;mounted.&lt;/p&gt;
&lt;p&gt;This is one of those &amp;#8220;integration&amp;#8221; things; the file browser (&lt;a class="reference external" href="https://docs.xfce.org/xfce/thunar/start"&gt;Thunar&lt;/a&gt;), and
most file-open dialogs, will happily browse to an &lt;span class="caps"&gt;SMB&lt;/span&gt; share and will &lt;em&gt;appear&lt;/em&gt;
to open the file. But then an error appears or, worse, nothing happens. Of
course, the solution in this case is simple: &lt;tt class="docutils literal"&gt;sudo apt install vlc&lt;/tt&gt; and it
Just&amp;nbsp;Works.&lt;/p&gt;
&lt;p&gt;On the subject of bugs, remember I mentioned screen-savers? The lock-screen
would happily kick in and blank the monitor, but wouldn&amp;#8217;t suspend it
(presumably &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1998716"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1998716&lt;/a&gt; again?). However, attempting to unlock (wiggling
the mouse or hitting a key to bring up the login screen) gave the poor thing
conniptions. The password prompt would briefly flicker into life, then the
screen would blank again. Then flicker into life, then blank. Password entry
wouldn&amp;#8217;t work while all this was going on (something crashing?). After this
happened several (4 or 5?) times, it seemed to get a grip on itself and allow
login once more, but it&amp;#8217;s rather broken! I&amp;#8217;ll try and find some time to dig out
some more useful info for a bug report (like whether this is specific to my&amp;nbsp;monitor).&lt;/p&gt;
&lt;p&gt;Everything else was pretty much as expected: I could read PDFs, print things,
open links, browse the web, manipulate the file-system, use the terminal, all
without issue, and all reasonably&amp;nbsp;smoothly.&lt;/p&gt;
&lt;p&gt;One amusing stand-out I did notice: the choice of bundled desktop games! On
most desktops, this is pretty bland fare. Some variation of Klondike solitaire,
maybe a Minesweeper clone, perhaps a Sudoku implementation. But not here! No,
Xubuntu bundles one single game package &lt;a class="footnote-reference" href="#other-games" id="footnote-reference-2"&gt;[2]&lt;/a&gt;, but it&amp;#8217;s packed with
more fiendishly fun entertainment than all the other default desktop gaming
packages put together: &lt;a class="reference external" href="https://www.chiark.greenend.org.uk/~sgtatham/puzzles/"&gt;Simon Tatham&amp;#8217;s Puzzles&lt;/a&gt; (if you haven&amp;#8217;t played these
before, you owe it to yourself to &lt;tt class="docutils literal"&gt;sudo apt install &lt;span class="pre"&gt;sgt-launcher&lt;/span&gt;&lt;/tt&gt; and give
them a&amp;nbsp;whirl).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="verdict"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Verdict&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s pretty (rather more so that Lubuntu in my opinion), lightweight,
responsive and reasonably functional. However, it&amp;#8217;s got a few more bugs than
Lubuntu (the screen-saver particularly) so given the choice I&amp;#8217;d probably go
with Lubuntu for a light-weight choice. Still … a &lt;em&gt;brilliant&lt;/em&gt; selection of&amp;nbsp;games!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;span id="down-here"&gt;&lt;/span&gt;&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Configuration&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For Xubuntu, the configurations I used were as follows. For the boot
configuration, highlighted lines are those changed from the lunar&amp;nbsp;defaults:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;config.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;&lt;span class="na"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vmlinuz&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="na"&gt;cmdline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;cmdline.txt&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;&lt;span class="na"&gt;initramfs initrd.img followkernel&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="k"&gt;[pi4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;&lt;span class="na"&gt;max_framebuffers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="na"&gt;arm_boost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;&lt;span class="c1"&gt;# Enable the audio output, I2C and SPI interfaces on the GPIO header. As these&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="c1"&gt;# parameters related to the base device-tree they must appear *before* any&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="c1"&gt;# other dtoverlay= specification&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;audio=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;i2c_arm=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;spi=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;&lt;span class="c1"&gt;# Comment out the following line if the edges of the desktop appear outside&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="c1"&gt;# the edges of your display&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="na"&gt;disable_overscan&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="c1"&gt;# If you have issues with audio, you may try uncommenting the following line&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="c1"&gt;# which forces the HDMI output into HDMI mode instead of DVI (which doesn&amp;#39;t&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="c1"&gt;# support audio output)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="c1"&gt;#hdmi_drive=2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="c1"&gt;# Enable the serial pins&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="c1"&gt;#enable_uart=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="c1"&gt;# Autoload overlays for any recognized cameras or displays that are attached&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="c1"&gt;# to the CSI/DSI ports. Please note this is for libcamera support, *not* for&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="c1"&gt;# the legacy camera stack&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;&lt;span class="na"&gt;camera_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="na"&gt;display_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="c1"&gt;# Config settings specific to arm64&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="na"&gt;arm_64bit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="k"&gt;[cm4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="c1"&gt;# Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;&lt;span class="c1"&gt;# such a board)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2,dr_mode=host&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vc4-kms-v3d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the kernel command line, the entire file must consist of a &lt;em&gt;single line of
text&lt;/em&gt; so I would suggest simply copying this&amp;nbsp;wholesale:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;cmdline.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=zstd dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, the highlighted lines are those that you
may wish to change after copying the&amp;nbsp;content:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;user-data&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="c1"&gt;#cloud-config&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;xubuntu-pi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;&lt;span class="nt"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;en_GB.UTF-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="nt"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Europe/London&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="nt"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pc105&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dave&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;lock_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;gecos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Dave&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Jones&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;plain_text_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;raspberry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALL=(ALL:ALL)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ALL&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="nt"&gt;ssh_import_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lp:waveform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;mozillateam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ppa:mozillateam/ppa&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/etc/apt/preferences.d/firefox&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=LP-PPA-mozillateam&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: 501&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: -1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/home/dave/.profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;append&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;defer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;export MOZ_ENABLE_WAYLAND=1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="nt"&gt;package_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;&lt;span class="nt"&gt;package_upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="nt"&gt;package_reboot_if_required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-47"&gt;&lt;span class="linenos"&gt;47&lt;/span&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-48"&gt;&lt;span class="linenos"&gt;48&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;xubuntu-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-49"&gt;&lt;span class="linenos"&gt;49&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-50"&gt;&lt;span class="linenos"&gt;50&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;firefox&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finally, the networking configuration. I used Ethernet for my experiments, and
given the number of packages that need installing I&amp;#8217;d generally recommend that
too. Please see the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; for important information on adjusting the
network configuration to Network Manager post&amp;nbsp;installation:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;network-config&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt;2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt;3&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt;4&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt;5&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt;6&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="rhythm" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Rhythmbox is probably my favourite part of the entire &lt;span class="caps"&gt;GNOME&lt;/span&gt;
project. It&amp;#8217;s genuinely superb: supports every protocol and format I&amp;#8217;ve ever
needed (and several I haven&amp;#8217;t), has a &lt;span class="caps"&gt;UI&lt;/span&gt; that&amp;#8217;s minimal but fantastically
functional, and most of all &lt;em&gt;fast&lt;/em&gt;. Want to navigate your way through ~8000
songs spread over ~500 albums? No problem, even on a Pi! It&amp;#8217;s one of the
four applications that I reliably fire up every single day.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="other-games" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;That I could see; &lt;a class="reference external" href="https://git.launchpad.net/~xubuntu-dev/ubuntu-seeds/+git/xubuntu/tree/desktop#n101"&gt;the seed&lt;/a&gt;
seems to suggest it ships the &lt;span class="caps"&gt;GNOME&lt;/span&gt; implementations of Mines and Sudoku too
but they didn&amp;#8217;t appear in the start menu.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="lubuntu"></category><category term="lunar"></category><category term="pi"></category><category term="cloud-init"></category><category term="desktop"></category></entry><entry><title>The Lubuntu Flavour</title><link href="https://waldorf.waveform.org.uk/2023/the-lubuntu-flavour.html" rel="alternate"></link><published>2023-08-01T00:00:00+01:00</published><updated>2023-08-01T17:02:11+01:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2023-08-01:/2023/the-lubuntu-flavour.html</id><summary type="html">&lt;p class="first last"&gt;Baking a Lubuntu Lunar desktop with&amp;nbsp;cloud-init&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;: The &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; which links to all the other flavour posts.
Skip &lt;a class="reference internal" href="#down-here"&gt;down here&lt;/a&gt; for the configurations&amp;nbsp;used.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;#8217;ll be looking at creating a Lubuntu desktop with a
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, on a Raspberry&amp;nbsp;Pi.&lt;/p&gt;
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#lubuntu" id="toc-entry-1"&gt;Lubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#verdict" id="toc-entry-2"&gt;Verdict&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#configuration" id="toc-entry-3"&gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="lubuntu"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Lubuntu&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lubuntu is a lightweight flavour of Ubuntu, based on LXQt (which is the desktop
environment that RaspiOS is based upon too). It&amp;#8217;s certainly the lightest in
terms of resource usage from all the desktops I&amp;#8217;m comparing, and one of the
most responsive&amp;nbsp;too.&lt;/p&gt;
&lt;img alt="A screenshot of the Lubuntu desktop. A small panel sits at the bottom of the screen showing (from left to right) the small applications menu button (adorned with a bird), the numbers 1 through 4 for the desktop switcher, some quick-launch icons for the file-manager and firefox, the window switcher, and the small icons in the system tray, followed by the clock. Above are numerous overlapping windows including a PDF showing a section of the FreeRTOS manual datasheet, &amp;quot;htop&amp;quot; running in a terminal, &amp;quot;Sintel&amp;quot; playing in VLC, a file browser, and Firefox showing the Lubuntu homepage." src="https://waldorf.waveform.org.uk/images/desktops-lunar-lubuntu.png" /&gt;
&lt;p&gt;It&amp;#8217;s a bit prettier than when I last saw it 3 years ago, but still doesn&amp;#8217;t have
the polish of the &amp;#8220;full&amp;#8221; desktop suites like &lt;span class="caps"&gt;GNOME&lt;/span&gt; or &lt;span class="caps"&gt;KDE&lt;/span&gt;. The interface feels
very responsive but it&amp;#8217;s notable that there&amp;#8217;s no Wayland support yet so the
performance of graphically heavy things is not entirely&amp;nbsp;smooth.&lt;/p&gt;
&lt;p&gt;One issue immediately jumped out, which was the incorrect selection of the
default audio output (the 3.5mm jack output which wasn&amp;#8217;t connected, instead of
&lt;span class="caps"&gt;HDMI&lt;/span&gt;). This is a known issue (&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/pipewire/+bug/1993347"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1993347&lt;/a&gt;), and one that occurs on almost
every other flavour too. Thankfully it&amp;#8217;s a trivial work-around (just pick the
&lt;span class="caps"&gt;HDMI&lt;/span&gt; output instead) and the selection persists across reboots, so it&amp;#8217;s a
one-time&amp;nbsp;fix.&lt;/p&gt;
&lt;p&gt;The applications on Lubuntu are understandably minimal, but surprisingly good!
Most desktop environments try and bundle &amp;#8220;native&amp;#8221; applications for specific
purposes, like a video player. By &amp;#8220;native&amp;#8221; I mean applications that stick
strictly within that desktop&amp;#8217;s base toolkit (whether that&amp;#8217;s &lt;span class="caps"&gt;GTK&lt;/span&gt; or Qt, and
their corresponding media bits), so that the distribution of that desktop
doesn&amp;#8217;t bloat itself out with additional libraries (or whole frameworks) for a
single application. This means you&amp;#8217;ll see things like the &lt;a class="reference external" href="https://docs.xfce.org/apps/parole/start"&gt;Parole&lt;/a&gt; or &lt;a class="reference external" href="https://gitlab.gnome.org/GNOME/totem"&gt;Totem&lt;/a&gt;
video players … right before you open a command line, &lt;tt class="docutils literal"&gt;sudo apt install vlc&lt;/tt&gt;,
and never look&amp;nbsp;back.&lt;/p&gt;
&lt;p&gt;Lubuntu, by contrast, just installs &lt;a class="reference external" href="https://www.videolan.org/"&gt;&lt;span class="caps"&gt;VLC&lt;/span&gt;&lt;/a&gt; saving you a whole step! That said,
&lt;span class="caps"&gt;VLC&lt;/span&gt; is all you get for media playback here and, capable though &lt;span class="caps"&gt;VLC&lt;/span&gt; is with
music, it&amp;#8217;s not set up as an album browser. I&amp;#8217;m too used to having something to
do just that. The distro seed giveth, and the distro seed … leaveth stuff&amp;nbsp;out.&lt;/p&gt;
&lt;p&gt;There were a couple of minor oddities. The two partitions on the &lt;span class="caps"&gt;SD&lt;/span&gt; card show
up as &amp;#8220;removable&amp;#8221; (which they fairly obviously … aren&amp;#8217;t) on the system tray
widget. After one system upgrade and a reboot, the wallpaper disappeared
inexplicably. However, the screen-saver worked perfectly. Locked the screen and
put the monitor in power-saving mode. Why do I mention this? Firstly, I&amp;#8217;ve had
a long-standing issue with the official &lt;span class="caps"&gt;GNOME&lt;/span&gt; desktop not putting my monitor
into power-saving mode (&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1998716"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1998716&lt;/a&gt;). Secondly … screen-saver breakage
became a bit of a theme the further I went on with this series&amp;nbsp;…&lt;/p&gt;
&lt;p&gt;Otherwise, things mostly worked well. The included file browser is &lt;a class="reference external" href="https://wiki.archlinux.org/title/PCManFM"&gt;PCManFM&lt;/a&gt;,
which is capable (and fast!). It&amp;#8217;ll also be familiar to users of RaspiOS as
it&amp;#8217;s the default file browser there too. No issues opening things, including
over unmounted network shares, no problems printing or scanning over the
network, and Firefox worked as&amp;nbsp;normal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="verdict"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Verdict&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s not the prettiest, but it is lightweight, responsive, and has a nice
choice of default apps. In practice it feels functional enough that I&amp;#8217;d be
happy to use it as my desktop, but I&amp;#8217;d definitely miss the ability to easily
&amp;#8220;tile&amp;#8221; applications (maybe there&amp;#8217;s a shortcut for this that I didn&amp;#8217;t&amp;nbsp;find!).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configuration"&gt;
&lt;span id="down-here"&gt;&lt;/span&gt;&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Configuration&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For Lubuntu, the configurations I used were as follows. For the boot
configuration, highlighted lines are those changed from the lunar&amp;nbsp;defaults:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;config.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;&lt;span class="na"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vmlinuz&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="na"&gt;cmdline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;cmdline.txt&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;&lt;span class="na"&gt;initramfs initrd.img followkernel&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="k"&gt;[pi4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;&lt;span class="na"&gt;max_framebuffers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="na"&gt;arm_boost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;&lt;span class="c1"&gt;# Enable the audio output, I2C and SPI interfaces on the GPIO header. As these&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="c1"&gt;# parameters related to the base device-tree they must appear *before* any&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="c1"&gt;# other dtoverlay= specification&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;audio=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;i2c_arm=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;spi=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;&lt;span class="c1"&gt;# Comment out the following line if the edges of the desktop appear outside&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="c1"&gt;# the edges of your display&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="na"&gt;disable_overscan&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="c1"&gt;# If you have issues with audio, you may try uncommenting the following line&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="c1"&gt;# which forces the HDMI output into HDMI mode instead of DVI (which doesn&amp;#39;t&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="c1"&gt;# support audio output)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="c1"&gt;#hdmi_drive=2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="c1"&gt;# Enable the serial pins&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="c1"&gt;#enable_uart=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="c1"&gt;# Autoload overlays for any recognized cameras or displays that are attached&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="c1"&gt;# to the CSI/DSI ports. Please note this is for libcamera support, *not* for&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="c1"&gt;# the legacy camera stack&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;&lt;span class="na"&gt;camera_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="na"&gt;display_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="c1"&gt;# Config settings specific to arm64&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="na"&gt;arm_64bit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="k"&gt;[cm4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="c1"&gt;# Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;&lt;span class="c1"&gt;# such a board)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2,dr_mode=host&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vc4-kms-v3d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the kernel command line, the entire file must consist of a &lt;em&gt;single line of
text&lt;/em&gt; so I would suggest simply copying this&amp;nbsp;wholesale:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;cmdline.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=zstd dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration, the highlighted lines are those that you
may wish to change after copying the&amp;nbsp;content:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;user-data&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="c1"&gt;#cloud-config&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lubuntu-pi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;&lt;span class="nt"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;en_GB.UTF-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="nt"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Europe/London&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="nt"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pc105&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dave&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;lock_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;gecos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Dave&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Jones&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;plain_text_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;raspberry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALL=(ALL:ALL)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ALL&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="nt"&gt;ssh_import_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lp:waveform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;mozillateam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ppa:mozillateam/ppa&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/etc/apt/preferences.d/firefox&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=LP-PPA-mozillateam&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: 501&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: -1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/home/dave/.profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;append&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;defer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;export MOZ_ENABLE_WAYLAND=1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="nt"&gt;package_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;&lt;span class="nt"&gt;package_upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="nt"&gt;package_reboot_if_required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-47"&gt;&lt;span class="linenos"&gt;47&lt;/span&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-48"&gt;&lt;span class="linenos"&gt;48&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lubuntu-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-49"&gt;&lt;span class="linenos"&gt;49&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-50"&gt;&lt;span class="linenos"&gt;50&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;firefox&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finally, the networking configuration. I used Ethernet for my experiments, and
given the number of packages that need installing I&amp;#8217;d generally recommend that
too. Please see the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html"&gt;intro post&lt;/a&gt; for important information on adjusting the
network configuration to Network Manager post&amp;nbsp;installation:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;network-config&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt;2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt;3&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt;4&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt;5&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt;6&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="lubuntu"></category><category term="lunar"></category><category term="pi"></category><category term="cloud-init"></category><category term="desktop"></category></entry><entry><title>We Serve All Flavours!</title><link href="https://waldorf.waveform.org.uk/2023/we-serve-all-flavours.html" rel="alternate"></link><published>2023-07-31T00:00:00+01:00</published><updated>2023-11-06T08:37:40+00:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2023-07-31:/2023/we-serve-all-flavours.html</id><summary type="html">&lt;p class="first last"&gt;More tricks with cloud-init for baking ready-made desktops, and the
index for the forthcoming look at each of the Ubuntu&amp;nbsp;flavours&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;: The &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/desktop-on-a-stick.html"&gt;prior post&lt;/a&gt; in which we learned about the wonders of
automated configuration with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s that time of the decade, again: desktop round-up time! As of writing this
introductory paragraph, I&amp;#8217;ve now finished poking, prodding, and reviewing each
of the Ubuntu flavours. However, the article turned into yet another
small-novella sized piece and the only sensible way I can think to publish this
is by making this one an introductory piece, with a few final &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt;
hints, and an index to the other articles which will be published once a day
over the coming week (and a&amp;nbsp;bit).&lt;/p&gt;
&lt;p&gt;My apologies, dear reader, for keeping you on tenterhooks again&amp;nbsp;…&lt;/p&gt;
&lt;div class="contents topic" id="contents"&gt;
&lt;p class="topic-title"&gt;Contents&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#adding-sprinkles" id="toc-entry-1"&gt;Adding&amp;nbsp;Sprinkles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#flakes" id="toc-entry-2"&gt;99&amp;nbsp;Flakes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#the-taste-test" id="toc-entry-3"&gt;The Taste&amp;nbsp;Test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#the-flavours" id="toc-entry-4"&gt;The&amp;nbsp;Flavours&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="adding-sprinkles"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;Adding&amp;nbsp;Sprinkles&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the interests of &amp;#8220;integration&amp;#8221;, and because I wish to demonstrate yet more
capabilities of &lt;a class="reference external" href="https://cloudinit.readthedocs.io/en/latest/"&gt;cloud-init&lt;/a&gt;, I&amp;#8217;m going to pre-emptively work around a
long-standing bug (&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/evince/+bug/1794064"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1974064&lt;/a&gt;) which I frequently run into, preventing
links in PDFs from opening in the browser. But only if that browser is a snap …
as Firefox is. Furthermore (without giving too much away from future posts in
this series) there still appear to be some integration issues between the
snapped Firefox and Wayland based environments in some of the desktops. So, in
the interests of a level playing field for everyone we&amp;#8217;re going to get
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; to install Firefox from a deb on first&amp;nbsp;boot.&lt;/p&gt;
&lt;p&gt;We need to add an &lt;tt class="docutils literal"&gt;apt&lt;/tt&gt; source (the Firefox stable &lt;span class="caps"&gt;PPA&lt;/span&gt;), and add some
configuration to pin its items higher than the archive&amp;#8217;s. Thankfully, this is
pretty simple to derive from all &lt;a class="reference external" href="https://askubuntu.com/a/1404401"&gt;those&lt;/a&gt;
&lt;a class="reference external" href="https://www.omgubuntu.co.uk/2022/04/how-to-install-firefox-deb-apt-ubuntu-22-04"&gt;guides&lt;/a&gt;
out there showing how to do this on an already running&amp;nbsp;system:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;mozillateam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ppa:mozillateam/ppa&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/etc/apt/preferences.d/firefox&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=LP-PPA-mozillateam&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: 501&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: -1&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we can ditch that weird &lt;tt class="docutils literal"&gt;snap&lt;/tt&gt; section in our configuration, and just
stick &lt;tt class="docutils literal"&gt;firefox&lt;/tt&gt; in the list of packages to&amp;nbsp;install.&lt;/p&gt;
&lt;p&gt;One other tip I&amp;#8217;m going to add here, but which I won&amp;#8217;t be adding to the
experimental configurations as published, because the &lt;em&gt;vast&lt;/em&gt; majority of people
won&amp;#8217;t want this, is configuration for an &lt;tt class="docutils literal"&gt;apt&lt;/tt&gt; proxy (specifically
&lt;a class="reference external" href="https://wiki.debian.org/AptCacherNg"&gt;apt-cacher-ng&lt;/a&gt;). To be clear, for most people I don&amp;#8217;t recommend running this
(a couple of times a month it sends my server into a bit of a tizz and needs
kicking), but if you&amp;#8217;re going to be repeatedly installing the same large
packages (as I frequently do for packaging work, or in this case when
installing several desktop packages which have similar bases) it can save a
huge amount of time and bandwidth. Anyway, this is what the relevant snippet
looks&amp;nbsp;like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="no"&gt;Acquire::http { Proxy &amp;quot;http://myproxy.local:3142&amp;quot;; }&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Obviously, replace &lt;tt class="docutils literal"&gt;myproxy.local&lt;/tt&gt; with the address of your local&amp;nbsp;proxy.&lt;/p&gt;
&lt;p&gt;Below is the full configuration we&amp;#8217;ll be using (minus the apt-cacher
configuration), with a fairly obvious placeholder for the desktop package. I&amp;#8217;ll
publish full configurations (including the &lt;tt class="docutils literal"&gt;config.txt&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;cmdline.txt&lt;/tt&gt;, and
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;network-config&lt;/span&gt;&lt;/tt&gt;, largely derived from the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/desktop-on-a-stick.html"&gt;prior post&lt;/a&gt;) in each section in
case you want to play along at home. Just place these on the boot partition of
an Ubuntu Server for Pi (23.04 or later) card &lt;a class="footnote-reference" href="#arch" id="footnote-reference-1"&gt;[1]&lt;/a&gt; and adjust the
highlighted lines to your&amp;nbsp;tastes:&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;user-data&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="c1"&gt;#cloud-config&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;miss-piggy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;&lt;span class="nt"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;en_GB.UTF-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="nt"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Europe/London&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="nt"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pc105&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ctrl:nocaps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dave&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;lock_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;gecos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Dave&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Jones&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;plain_text_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;raspberry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALL=(ALL:ALL)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ALL&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="nt"&gt;ssh_import_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lp:waveform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;mozillateam&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ppa:mozillateam/ppa&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/etc/apt/preferences.d/firefox&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=LP-PPA-mozillateam&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: 501&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Package: firefox*&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin: release o=Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;Pin-Priority: -1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/home/dave/.profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;append&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;defer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;export MOZ_ENABLE_WAYLAND=1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;&lt;span class="nt"&gt;package_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="nt"&gt;package_upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;&lt;span class="nt"&gt;package_reboot_if_required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-47"&gt;&lt;span class="linenos"&gt;47&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-48"&gt;&lt;span class="linenos"&gt;48&lt;/span&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-49"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;49&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;YOUR-DESKTOP-PACKAGE-HERE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-50"&gt;&lt;span class="linenos"&gt;50&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-51"&gt;&lt;span class="linenos"&gt;51&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;firefox&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Bear in mind your first boot is going to install a &lt;em&gt;lot&lt;/em&gt; of things, and it will
take &lt;em&gt;at least&lt;/em&gt; an hour (more like an hour and a half) even on a good
A1-compliant &lt;span class="caps"&gt;SD&lt;/span&gt;&amp;nbsp;card.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="flakes"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;99&amp;nbsp;Flakes&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One wrinkle I forgot to mention in the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/desktop-on-a-stick.html"&gt;prior post&lt;/a&gt; is that of networking. The
server images we&amp;#8217;re basing this on use &lt;a class="reference external" href="https://netplan.io/"&gt;netplan&lt;/a&gt;, and start off by having it
&amp;#8220;render&amp;#8221; the network configuration via &lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/systemd.network.html"&gt;networkd&lt;/a&gt; (part of&amp;nbsp;systemd).&lt;/p&gt;
&lt;p&gt;However, every Ubuntu desktop flavour ultimately winds up using &lt;a class="reference external" href="https://networkmanager.dev/"&gt;Network
Manager&lt;/a&gt; for its network configuration. While &lt;a class="reference external" href="https://netplan.io/"&gt;netplan&lt;/a&gt; is &lt;em&gt;capable&lt;/em&gt; of
rendering a configuration via Network Manager, that&amp;#8217;s probably &lt;em&gt;not&lt;/em&gt; what you
ultimately want as your network configuration wouldn&amp;#8217;t be editable via the
Network Manager &lt;span class="caps"&gt;GUI&lt;/span&gt; (only the netplan &lt;span class="caps"&gt;YAML&lt;/span&gt; configuration&amp;nbsp;files).&lt;/p&gt;
&lt;p&gt;Why not change the initial netplan configuration to render through Network
Manager instead? This won&amp;#8217;t work because at first boot, the card is just Ubuntu
Server for Pi and doesn&amp;#8217;t contain Network Manager. That only gets installed
along with the chosen desktop flavour, but &lt;em&gt;that&lt;/em&gt; act requires a network to
already be configured. Dependency&amp;nbsp;cycles!&lt;/p&gt;
&lt;p&gt;The fix is simple enough. Once the desktop has booted, and you&amp;#8217;re all snugly
logged in for the first time, run the following to delete the generated netplan
configuration and re-apply the (now empty)&amp;nbsp;settings:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;/etc/netplan/50-cloud-init.yaml
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;netplan&lt;span class="w"&gt; &lt;/span&gt;apply
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;At this point networkd will stop &amp;#8220;managing&amp;#8221; the interfaces and Network Manager
will take them over. In the case of a simple &lt;span class="caps"&gt;DHCP&lt;/span&gt;-based Ethernet connection, it
should reconfigure automatically and you&amp;#8217;ll be back up and running in seconds.
However, if you performed your initial set up over WiFi you&amp;#8217;ll now need to go
into the &lt;span class="caps"&gt;GUI&lt;/span&gt; network settings for your flavour (wherever that is — it can
usually be found from the system-tray though) and re-enter your WiFi&amp;nbsp;credentials.&lt;/p&gt;
&lt;p&gt;This is one of the ways that this Frankenstein-like desktop setup differs from
the official desktop releases. There are a few others (dual seeds, user
creation differences, root-fs sizing, probably a few others that I&amp;#8217;ve
forgotten!), and if anyone&amp;#8217;s interested I can go through them, but this is the
only one that&amp;#8217;s affected the use of the desktop during my&amp;nbsp;explorations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-taste-test"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;The Taste&amp;nbsp;Test&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What should I look for in a desktop? I can&amp;#8217;t define this universally, so I&amp;#8217;ll
just go with what works for me. My personal workflow is probably a strange mix
of deeply anachronistic, and semi-modern. On the one hand, I spend the &lt;em&gt;vast&lt;/em&gt;
majority of my time in a terminal window. On the other, I eschew office
applications in favour of doing office-y work in a web-browser. Google Sheets
for any spreadsheet work (though I have been known to dip into &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Sc_(spreadsheet_calculator)"&gt;sc&lt;/a&gt; for
trivial bits), and when I absolutely &lt;em&gt;have&lt;/em&gt; to touch a word-processor &lt;a class="footnote-reference" href="#word" id="footnote-reference-2"&gt;[2]&lt;/a&gt;,
Google&amp;nbsp;Docs.&lt;/p&gt;
&lt;p&gt;I could &lt;em&gt;almost&lt;/em&gt; get away with working on a Chromebook, but not &lt;em&gt;quite&lt;/em&gt;. If I
have PDFs to deal with (and between Canonical&amp;#8217;s hiring push, and various
hardware data-sheets, I get through quite a few of these), I use an
honest-to-goodness standalone &lt;span class="caps"&gt;PDF&lt;/span&gt; reader, instead of the (usually horribly
slow) built-in &lt;span class="caps"&gt;PDF&lt;/span&gt; readers in browsers. Sometimes I even … brace yourself …
&lt;em&gt;print&lt;/em&gt; them &lt;a class="footnote-reference" href="#printing" id="footnote-reference-3"&gt;[3]&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I also play most of my music, served from the home server, in a standalone
application, and the same goes for most films I watch (there are some good
web-based systems for this, but browsers are &lt;em&gt;heavy&lt;/em&gt; and I work on a Pi so I
tend to try and limit my use of them to text-based duties). Most of my file
manipulation is done from the command line, but sometimes for simpler stuff
(especially involving external storage) I&amp;#8217;ll resort to the file&amp;nbsp;browser.&lt;/p&gt;
&lt;p&gt;So, I&amp;#8217;ll be looking&amp;nbsp;for:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;A decent terminal — this is pretty much a given; it&amp;#8217;d hardly be a Linux
distro without a decent&amp;nbsp;terminal!&lt;/li&gt;
&lt;li&gt;A decent browser — again, pretty much a given as we&amp;#8217;ll be installing Firefox&amp;nbsp;anyway.&lt;/li&gt;
&lt;li&gt;Some decent media applications — music player, video player, a standalone &lt;span class="caps"&gt;PDF&lt;/span&gt;
viewer, preferably a good file browser for managing it&amp;nbsp;all.&lt;/li&gt;
&lt;li&gt;Integration — I want to be able to click a link from my terminal, or in a
&lt;span class="caps"&gt;PDF&lt;/span&gt;, and have it open in the web-browser. I&amp;#8217;d like to be able to open files,
archives, and videos straight from the file-browser, even from network shares
(&lt;em&gt;ideally&lt;/em&gt; without messing around with network mounts). The home server has
all sorts of services for this (&lt;span class="caps"&gt;NFS&lt;/span&gt;, &lt;span class="caps"&gt;SMB&lt;/span&gt;, &lt;span class="caps"&gt;DLNA&lt;/span&gt;, etc. all advertised over
avahi) so there should be plenty of opportunity here. I also want to be able
to print stuff without jumping through tons of hoops (again, the printers
here are network-accessible and advertised over&amp;nbsp;avahi).&lt;/li&gt;
&lt;li&gt;Performance — it&amp;#8217;s a Pi, so I can&amp;#8217;t expect the world here, but the video
player should handle 720p or 1080p sources in full-screen, smoothly. The
music player should play without stuttering, and generally things shouldn&amp;#8217;t
feel (too) sluggish. The browser is an exception here: modern browsers are
ridiculously (over-)complex beasts and I&amp;#8217;ll allow some lee-way for&amp;nbsp;this.&lt;/li&gt;
&lt;li&gt;Reliability — The more bugs I run into, the more points I&amp;#8217;ll dock. Erm … are
we doing points? Well, any bugs I run into I&amp;#8217;ll point out. And possibly
report, if I can figure out what to file &amp;#8216;em&amp;nbsp;against!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, with all that extra gubbins out of the way, on with the&amp;nbsp;tests!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-flavours"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#contents"&gt;The&amp;nbsp;Flavours&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These are the flavours I&amp;#8217;m intending to cover, which will become links to the
relevant&amp;nbsp;article:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/the-lubuntu-flavour.html"&gt;Lubuntu&lt;/a&gt; — the LXQt&amp;nbsp;flavour&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/the-xubuntu-flavour.html"&gt;Xubuntu&lt;/a&gt; — the &lt;span class="caps"&gt;XFCE&lt;/span&gt;&amp;nbsp;flavour&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/the-ubuntu-budgie-flavour.html"&gt;Ubuntu Budgie&lt;/a&gt; — the Budgie&amp;nbsp;flavour&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/the-ubuntu-unity-flavour.html"&gt;Ubuntu Unity&lt;/a&gt; — the Unity&amp;nbsp;flavour&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/the-kubuntu-flavour.html"&gt;Kubuntu&lt;/a&gt; — the &lt;span class="caps"&gt;KDE&lt;/span&gt;&amp;nbsp;flavour&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/the-ubuntu-studio.html"&gt;Ubuntu Studio&lt;/a&gt; — the creator&amp;#8217;s&amp;nbsp;flavour&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/the-ubuntu-desktop.html"&gt;Ubuntu&lt;/a&gt; — comparison to the official &lt;span class="caps"&gt;GNOME&lt;/span&gt;-based&amp;nbsp;image&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="arch" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Side note: theoretically this should work on either armhf or arm64,
however I&amp;#8217;m only testing arm64 here as it&amp;#8217;s all we officially support on the
desktop images anyway.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="word" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;In case it&amp;#8217;s not obvious, I am firmly of the opinion that &lt;a class="reference external" href="https://en.wikipedia.org/wiki/WYSIWYG"&gt;&lt;span class="caps"&gt;WYSIWYG&lt;/span&gt;&lt;/a&gt;
is the work of the devil, and the One True Way is that of the markup
language, beautifully processed by 100% natural, hand-crafted,
hypo-allergenic, non-genetically modified, organically-certified algorithms
into whatever output format you may prefer.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="printing" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I have rarely felt as old as I did a few weeks ago when a
younger colleague casually inquired, &amp;#8220;does anyone still &lt;em&gt;have&lt;/em&gt; a printer?&amp;#8221;
Yes! In my utter extravagance I even have two. One of them does &lt;em&gt;colour&lt;/em&gt;!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="lunar"></category><category term="pi"></category><category term="cloud-init"></category><category term="desktop"></category></entry><entry><title>Desktop on a Stick</title><link href="https://waldorf.waveform.org.uk/2023/desktop-on-a-stick.html" rel="alternate"></link><published>2023-06-30T00:00:00+01:00</published><updated>2023-08-01T17:02:11+01:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2023-06-30:/2023/desktop-on-a-stick.html</id><summary type="html">&lt;p class="first last"&gt;Construct a variety of desktop flavours using cloud-init on the
Raspberry&amp;nbsp;Pi&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;Updated&lt;/strong&gt; to include the per-release quirks channel for the&amp;nbsp;snap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;TL&lt;/span&gt;;&lt;span class="caps"&gt;DR&lt;/span&gt;&lt;/strong&gt;: Skip &lt;a class="reference internal" href="#down-here"&gt;down here&lt;/a&gt; for the final&amp;nbsp;configurations.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s that time of the decade, again: desktop round-up time! But thanks to
a genius notion from Oliver (one of our product managers), I&amp;#8217;m going to be
doing it a bit differently. Previously, my procedure for checking out the
&lt;a class="reference external" href="https://waldorf.waveform.org.uk/2020/ubuntu-desktops-on-the-pi.html"&gt;various Ubuntu desktops on a Raspberry Pi&lt;/a&gt; looked something like&amp;nbsp;this:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Flash a server image (go make&amp;nbsp;coffee)&lt;/li&gt;
&lt;li&gt;Boot the server image (twiddle thumbs for a minute or two while it sorts out
the first time&amp;nbsp;setup)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;apt install &lt;span class="pre"&gt;lubuntu-desktop&lt;/span&gt;&lt;/tt&gt; (go make more&amp;nbsp;coffee)&lt;/li&gt;
&lt;li&gt;Reboot, play with it a bit, install a bunch of stuff (yet more&amp;nbsp;coffee)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To avoid the inevitable caffeine poisoning that results from repeating this
procedure for Lubuntu, Xubuntu, Kubuntu, and Budgie, this time we&amp;#8217;re going to
use … drum roll please&amp;nbsp;…&lt;/p&gt;
&lt;object data="https://waldorf.waveform.org.uk/images/cloud-init.svg" style="width: 50%;" type="image/svg+xml"&gt;The (original) cloud-init logo with the words &amp;#8220;cloud-init&amp;#8221; adjacent.
The logo is the usual Ubuntu-orange circle, within which appears a
very geometrically simplified representation of the fingers of the
left hand. The index finger is extended and appears to be touching
the edge of a large white spark (which in no way suggests someone
electrocuting themselves by touching a live surface). Or it could
be a worm with a large anime hair-do. I&amp;#8217;m not sure.&lt;/object&gt;
&lt;p&gt;If that sounds like a bit of an anti-climax, that&amp;#8217;s just because you haven&amp;#8217;t
played with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; enough. Yes, its one-shot nature makes it painful to
iterate when you get things wrong. Yes, the documentation is painfully obscure
in places. However, once you get a grip on it, it&amp;#8217;s quite astonishingly
flexible. Hopefully, by reading this you can bypass some of that pain and start
from a more useful&amp;nbsp;point!&lt;/p&gt;
&lt;p&gt;But before we get to the fun bits, we need to get the basics done&amp;nbsp;…&lt;/p&gt;
&lt;div class="section" id="ingredients"&gt;
&lt;h2&gt;Ingredients&lt;/h2&gt;
&lt;p&gt;The first step is to get a Pi to test with. You&amp;#8217;ll need a &lt;a class="reference external" href="https://www.raspberrypi.com/products/raspberry-pi-4-model-b/"&gt;Pi 4&lt;/a&gt;, &lt;a class="reference external" href="https://www.raspberrypi.com/products/raspberry-pi-400/"&gt;Pi 400&lt;/a&gt;,
or &lt;a class="reference external" href="https://www.raspberrypi.com/products/compute-module-4/"&gt;&lt;span class="caps"&gt;CM4&lt;/span&gt;&lt;/a&gt; with at least &lt;span class="caps"&gt;4GB&lt;/span&gt; of &lt;span class="caps"&gt;RAM&lt;/span&gt;. At the time of writing, that&amp;#8217;s a slightly
tricky proposition given the supply shortages. The vital &lt;a class="reference external" href="https://rpilocator.com/"&gt;rpilocator&lt;/a&gt; can help
here, but it would appear (at least &lt;a class="reference external" href="https://www.youtube.com/watch?v=-_aL9V0JsQQ"&gt;according to Eben&lt;/a&gt;, who probably knows
what he&amp;#8217;s talking about!) that the shortage should begin to clear during the
second half of&amp;nbsp;2023.&lt;/p&gt;
&lt;p&gt;The second step is to get an image we can play with. I&amp;#8217;m going to be using the
recently released &lt;a class="reference external" href="http://cdimage.ubuntu.com/releases/23.04/release/ubuntu-23.04-preinstalled-server-arm64+raspi.img.xz"&gt;Ubuntu 23.04 (Lunar Lobster) Server for Raspberry Pi
image&lt;/a&gt;, specifically the arm64 variant. You can use &lt;a class="reference external" href="https://www.raspberrypi.com/software/"&gt;rpi-imager&lt;/a&gt; to flash
this to a spare &lt;span class="caps"&gt;SD&lt;/span&gt; card, or even &lt;span class="caps"&gt;SSD&lt;/span&gt; drive attached to a &lt;span class="caps"&gt;USB&lt;/span&gt;&amp;nbsp;adapter.&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="first admonition-title"&gt;Warning&lt;/p&gt;
&lt;p class="last"&gt;A word of caution: don&amp;#8217;t try this with Jammy (22.04). There&amp;#8217;s a reason I&amp;#8217;m
using Lunar (23.04) for this experiment. If you don&amp;#8217;t care about the
reasons, &lt;a class="reference internal" href="#common-stuff"&gt;skip to the next section&lt;/a&gt;. Otherwise, read on&amp;nbsp;…&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Historically, Ubuntu images (including the Ubuntu for Raspberry Pi images) have
been built with a system called &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;livecd-rootfs&lt;/span&gt;&lt;/tt&gt;. This could &lt;em&gt;charitably&lt;/em&gt; be
described as a rough collection of dozens of hooks (and hacks) in the form of
shell scripts, all of them plastered onto the already crufty base of
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;livecd-rootfs&lt;/span&gt;&lt;/tt&gt;, itself a gigantic mess of shell&amp;nbsp;script.&lt;/p&gt;
&lt;p&gt;The result is exactly the hellish nightmare of obscure regex-loaded nonsense
that you might imagine. Worse still, many of the hacks inject configuration
files into the resulting image that are &lt;em&gt;unowned&lt;/em&gt;. That is to say, no Debian
package owns these injected files, and that causes all sorts of fun when it
comes to&amp;nbsp;upgrades.&lt;/p&gt;
&lt;p&gt;My friend William, before he left, made a valiant start on sorting out this
mess by re-writing the old &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ubuntu-image&lt;/span&gt;&lt;/tt&gt; tool. In concert with this effort,
my small contribution was to start migrating hacks from &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;livecd-rootfs&lt;/span&gt;&lt;/tt&gt; into
the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ubuntu-settings&lt;/span&gt;&lt;/tt&gt; package so that in Lunar (and beyond), as much
configuration as possible would be directly under the control of the package
management system (this contribution made a screeching U-turn when, at the last
minute, it was decided we &lt;em&gt;were&lt;/em&gt; going to use &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;livecd-rootfs&lt;/span&gt;&lt;/tt&gt; for lunar after
all, but that&amp;#8217;s another&amp;nbsp;story!).&lt;/p&gt;
&lt;p&gt;This is one of the major reasons it&amp;#8217;s now much simpler to spin up a desktop
image with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt;. Instead of having a write a ton of configuration to
add all the necessary tweaks &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;livecd-rootfs&lt;/span&gt;&lt;/tt&gt; used to do, we can just include
one extra package and (mostly) be&amp;nbsp;done.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="preparing-your-kitchen"&gt;
&lt;span id="common-stuff"&gt;&lt;/span&gt;&lt;h2&gt;Preparing your&amp;nbsp;kitchen&lt;/h2&gt;
&lt;p&gt;Once your &lt;span class="caps"&gt;SD&lt;/span&gt; card (or drive) is flashed, eject it, then re-insert it.
Regardless of the &lt;span class="caps"&gt;OS&lt;/span&gt; you&amp;#8217;re using (Windows, Mac &lt;span class="caps"&gt;OS&lt;/span&gt;, Linux), you should see the
boot partition (labelled &amp;#8220;system-boot&amp;#8221;) appear &lt;a class="footnote-reference" href="#linux-mount" id="footnote-reference-1"&gt;[1]&lt;/a&gt;. We&amp;#8217;re going to
be tweaking several configuration files,&amp;nbsp;specifically:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;config.txt&lt;/tt&gt; &amp;#8212; this is the Pi bootloader&amp;nbsp;configuration&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;cmdline.txt&lt;/tt&gt; &amp;#8212; this is the Linux kernel command&amp;nbsp;line&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;user-data&lt;/span&gt;&lt;/tt&gt; &amp;#8212; this is the main &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; configuration&amp;nbsp;file&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;network-config&lt;/span&gt;&lt;/tt&gt; &amp;#8212; this is the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; network&amp;nbsp;configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;#8217;ll start with &lt;tt class="docutils literal"&gt;config.txt&lt;/tt&gt; because the changes here are universal: they&amp;#8217;ll
be required no matter which desktop we&amp;#8217;re intending to&amp;nbsp;use:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Find the &lt;tt class="docutils literal"&gt;enable_uart=1&lt;/tt&gt; line (it&amp;#8217;s on line 28 by default) and comment it
out by inserting &lt;tt class="docutils literal"&gt;#&lt;/tt&gt; at the start of the line. This simply disables the
serial console which isn&amp;#8217;t &lt;em&gt;strictly&lt;/em&gt; necessary, but if the serial console
is enabled, the Pi&amp;#8217;s &lt;span class="caps"&gt;GPU&lt;/span&gt; clock is locked to low speed and obviously we want
the &lt;span class="caps"&gt;GPU&lt;/span&gt; clock to float higher for our&amp;nbsp;desktop.&lt;/li&gt;
&lt;li&gt;At the end of the file add &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dtoverlay=vc4-kms-v3d&lt;/span&gt;&lt;/tt&gt; to load the &amp;#8220;full&amp;#8221;
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Direct_Rendering_Manager#Kernel_mode_setting"&gt;&lt;span class="caps"&gt;KMS&lt;/span&gt;&lt;/a&gt; device-tree overlay (it should be in the &lt;tt class="docutils literal"&gt;[all]&lt;/tt&gt; section at the end
of the&amp;nbsp;file)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Next we need to tweak the kernel command line in &lt;tt class="docutils literal"&gt;cmdline.txt&lt;/tt&gt;. Again, all
the changes here are common to all desktops. This file consists of a single
line of text; don&amp;#8217;t introduce any line breaks when editing&amp;nbsp;it:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Delete &lt;tt class="docutils literal"&gt;console=serial0,115200&lt;/tt&gt; at the start. This just removes the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Tty_(Unix)"&gt;tty&lt;/a&gt;
associated with the serial console which we disabled above in
&lt;tt class="docutils literal"&gt;config.txt&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Insert &lt;tt class="docutils literal"&gt;zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=zstd&lt;/tt&gt; at the
start. This activates the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2021/6-months-with-the-pi-desktop.html#swap-swap-glorious-zswap"&gt;zswap&lt;/a&gt; system that we use on the&amp;nbsp;desktop.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These changes more or less boil down to the base differences between the Ubuntu
Pi server and desktop images. Most of the other differences (since Lunar, as
discussed above) come down to the selection of packages that are installed&amp;nbsp;…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="picking-your-flavour"&gt;
&lt;h2&gt;Picking your&amp;nbsp;flavour&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s time to learn what we can do with &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt;. The most obvious thing
we want is to have a particular desktop package installed. This is pretty
simple, and achieved by adding the following block to the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;user-data&lt;/span&gt;&lt;/tt&gt; file on
the boot&amp;nbsp;partition:&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;lubuntu-desktop&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;This tells &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; that, on first boot, we want it to try and install
two extra&amp;nbsp;packages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;lubuntu-desktop&lt;/span&gt;&lt;/tt&gt; is the basis of the Lubuntu desktop images; we&amp;#8217;ll
substitute other desktop packages here&amp;nbsp;later&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;&lt;/tt&gt; contains all the little tweaks for the Pi
desktop (ensuring there&amp;#8217;s a swap-file, disabling suspend in Gnome, inserting
the correct modules for zswap into the initrd, setting appropriate
permissions for &lt;span class="caps"&gt;I2C&lt;/span&gt; and &lt;span class="caps"&gt;SPI&lt;/span&gt; interfaces,&amp;nbsp;etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition to these we &lt;em&gt;should&lt;/em&gt; also add the following settings (these aren&amp;#8217;t
mandatory, but highly&amp;nbsp;recommended):&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="nt"&gt;package_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;package_upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;package_reboot_if_required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The first line tells &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; we want it to run &lt;tt class="docutils literal"&gt;apt update&lt;/tt&gt; to refresh
the set of available packages. This is the most important line as, without it,
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; will likely fail at some point because the apt index shipped on
the image will be out of date. The next line demands that &lt;tt class="docutils literal"&gt;apt upgrade&lt;/tt&gt;
should be run to ensure all packages are up to date. The final line indicates
that, if any package indicates a reboot is required, we should carry one out
(this is absolutely the case when installing a desktop, as a display manager
will be installed at the very&amp;nbsp;least).&lt;/p&gt;
&lt;p&gt;Next, while some of the desktops available install a browser by default (by
depending on the Firefox apt package, which in turns installs the Firefox
snap), several don&amp;#8217;t as their official images include the Firefox (or Chromium)
snap directly without the apt &amp;#8220;wrapper&amp;#8221;. To avoid winding up with a desktop
without a browser, we&amp;#8217;ll add another section to install the Firefox snap&amp;nbsp;explicitly:&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="nt"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;snap install --channel=latest/stable/ubuntu-23.04 firefox&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;I&amp;#8217;m not entirely sure why the &lt;tt class="docutils literal"&gt;snap&lt;/tt&gt; section is so different from
&lt;tt class="docutils literal"&gt;packages&lt;/tt&gt;, or why the full &lt;tt class="docutils literal"&gt;snap install &amp;lt;package&amp;gt;&lt;/tt&gt; form is required.
It does appear from the documentation that the &lt;tt class="docutils literal"&gt;snap.commands&lt;/tt&gt; section simply
allows arbitrary commands to be specified (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;canonical-livepatch&lt;/span&gt;&lt;/tt&gt; is included
in the examples), but in that case why call it a &lt;tt class="docutils literal"&gt;snap&lt;/tt&gt; section?&lt;/p&gt;
&lt;p&gt;The exceedingly long channel name causes the snap to follow a &lt;a class="reference external" href="https://snapcraft.io/docs/publish-to-a-branch"&gt;branch of a
channel&lt;/a&gt; that may include per-release quirks. Or … something like that. I&amp;#8217;m
still not clear on the whole &amp;#8220;channel&amp;#8221; concept in&amp;nbsp;snaps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="locale-ly-sourced"&gt;
&lt;h2&gt;Locale-ly&amp;nbsp;sourced&lt;/h2&gt;
&lt;p&gt;On the official Ubuntu Desktop for Raspberry Pi images, we have a first time
setup process &lt;a class="footnote-reference" href="#oem-config" id="footnote-reference-2"&gt;[2]&lt;/a&gt; which guides the user through locale selection and
initial user creation. We don&amp;#8217;t have that here, so we&amp;#8217;d better get
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; to handle that instead. Firstly the locale, timezone, and
keyboard&amp;nbsp;settings:&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="nt"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;en_GB.UTF-8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;Europe/London&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;pc105&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;gb&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;ctrl:nocaps&lt;/span&gt;
&lt;/pre&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;You may want to leave off that &amp;#8220;options:&amp;#8221; line. I include it to put Ctrl in
the right place (i.e. where Caps Lock is) and because I have no need of a
Caps Lock&amp;nbsp;key.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;To find out the valid values for these settings, you can use the following
commands on an existing Ubuntu desktop (I say desktop specifically because the
available locales on server installations tend to be extremely minimal)
&lt;a class="footnote-reference" href="#no-systemd" id="footnote-reference-3"&gt;[3]&lt;/a&gt;:&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;locale:&lt;/dt&gt;
&lt;dd&gt;&lt;tt class="docutils literal"&gt;localectl &lt;span class="pre"&gt;list-locales&lt;/span&gt;&lt;/tt&gt;&lt;/dd&gt;
&lt;dt&gt;timezone:&lt;/dt&gt;
&lt;dd&gt;&lt;tt class="docutils literal"&gt;timedatectl &lt;span class="pre"&gt;list-timezones&lt;/span&gt;&lt;/tt&gt;&lt;/dd&gt;
&lt;dt&gt;keyboard:&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="first last docutils"&gt;
&lt;dt&gt;model:&lt;/dt&gt;
&lt;dd&gt;&lt;tt class="docutils literal"&gt;localectl &lt;span class="pre"&gt;list-x11-keymap-models&lt;/span&gt;&lt;/tt&gt;&lt;/dd&gt;
&lt;dt&gt;layout:&lt;/dt&gt;
&lt;dd&gt;&lt;tt class="docutils literal"&gt;localectl &lt;span class="pre"&gt;list-x11-keymap-layouts&lt;/span&gt;&lt;/tt&gt;&lt;/dd&gt;
&lt;dt&gt;variant:&lt;/dt&gt;
&lt;dd&gt;&lt;tt class="docutils literal"&gt;localectl &lt;span class="pre"&gt;list-x11-keymaps-variants&lt;/span&gt; [layout]&lt;/tt&gt;&lt;/dd&gt;
&lt;dt&gt;options:&lt;/dt&gt;
&lt;dd&gt;&lt;tt class="docutils literal"&gt;localectl &lt;span class="pre"&gt;list-x11-keymaps-option&lt;/span&gt;&lt;/tt&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="adding-personality"&gt;
&lt;h2&gt;Adding&amp;nbsp;personality&lt;/h2&gt;
&lt;p&gt;Next we need to create, and customize, the initial user. By default,
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; will create a user named &lt;tt class="docutils literal"&gt;ubuntu&lt;/tt&gt; with a locked password,
which also has password-less &lt;tt class="docutils literal"&gt;sudo&lt;/tt&gt; access, and a bunch of default group
memberships (for things like direct video and audio access, etc). The default
group memberships are fine, but I&amp;#8217;d like a slightly more personalized username,
and one with password-required &lt;tt class="docutils literal"&gt;sudo&lt;/tt&gt; rights. This can be accomplished with
the following&amp;nbsp;block:&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dave&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;gecos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Dave&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Jones&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;plain_text_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;raspberry&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;lock_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALL=(ALL:ALL)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ALL&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;ssh_import_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;lp:waveform&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;This changes the default username to &amp;#8220;dave&amp;#8221;, and uses my name in the &lt;tt class="docutils literal"&gt;gecos&lt;/tt&gt;
field (which traditionally recorded a whole bunch of things like display name,
office number, telephone number, and so forth but these days tends to just be
used for the display name). The &lt;tt class="docutils literal"&gt;sudo&lt;/tt&gt; setting specifically lacks the
&lt;tt class="docutils literal"&gt;&lt;span class="caps"&gt;NOPASSWD&lt;/span&gt;&lt;/tt&gt; flag, requiring a password for use. The &lt;tt class="docutils literal"&gt;ssh_import_id&lt;/tt&gt; setting
lists users from which to import public &lt;span class="caps"&gt;SSH&lt;/span&gt; keys (use &amp;#8220;lp:&amp;#8221; prefix for
Launchpad usernames, and &amp;#8220;gh:&amp;#8221; for&amp;nbsp;Github).&lt;/p&gt;
&lt;p&gt;The block also sets the initial password to the plain-text string &amp;#8220;raspberry&amp;#8221;
and ensures password login is possible (&lt;tt class="docutils literal"&gt;lock_passwd&lt;/tt&gt; is true by default
which means the only way to login is with &lt;span class="caps"&gt;SSH&lt;/span&gt; or another auxiliary mechanism,
but that&amp;#8217;s not so useful on the desktop!). This is horribly insecure! We could
do something &lt;em&gt;slightly&lt;/em&gt; more secure here by providing a hashed password
instead. First we&amp;#8217;d run &lt;tt class="docutils literal"&gt;mkpasswd&lt;/tt&gt; to generate the&amp;nbsp;hash:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;mkpasswd&lt;span class="w"&gt; &lt;/span&gt;--method&lt;span class="o"&gt;=&lt;/span&gt;SHA-512&lt;span class="w"&gt; &lt;/span&gt;--rounds&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;Password:
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="nv"&gt;$rounds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4096&lt;/span&gt;&lt;span class="nv"&gt;$JZRfK1tM&lt;/span&gt;.xiWZtR5&lt;span class="nv"&gt;$XpMvuj2reJr&lt;/span&gt;.....lI0T4Z/
&lt;/pre&gt;
&lt;p&gt;Then we would use this with &lt;tt class="docutils literal"&gt;hashed_passwd&lt;/tt&gt; instead of
&lt;tt class="docutils literal"&gt;plain_text_passwd&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dave&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;gecos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Dave&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Jones&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;hashed_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;$6$rounds=4096$JZRfK1tM.xiWZtR5$XpMvuj2reJr.....lI0T4Z/&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;lock_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALL=(ALL:ALL)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ALL&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;ssh_import_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;lp:waveform&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;However, don&amp;#8217;t be lulled into a false sense of security. As the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt;
documentation &lt;a class="reference external" href="https://cloudinit.readthedocs.io/en/latest/reference/modules.html#users-and-groups"&gt;notes&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
While &lt;tt class="docutils literal"&gt;hashed_password&lt;/tt&gt; is better than &lt;tt class="docutils literal"&gt;plain_text_passwd&lt;/tt&gt;, using [a
password] in &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;user-data&lt;/span&gt;&lt;/tt&gt; represents a security risk as &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;user-data&lt;/span&gt;&lt;/tt&gt;
could be accessible by third-parties depending on your cloud platform&lt;/blockquote&gt;
&lt;p&gt;To be clear: &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;user-data&lt;/span&gt;&lt;/tt&gt; is a world-readable file on the Ubuntu Pi images (it
has to be because it&amp;#8217;s on a &lt;span class="caps"&gt;FAT&lt;/span&gt; partition). There is &lt;em&gt;no&lt;/em&gt; absolutely secure
method of setting the password via &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; (at least on the Ubuntu Pi
images); the secure thing to do here is login and then &lt;em&gt;change your password&lt;/em&gt;.
Consider this password initial and &lt;em&gt;temporary&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="baking-in-hacks"&gt;
&lt;h2&gt;Baking in&amp;nbsp;hacks&lt;/h2&gt;
&lt;p&gt;Finishing off our &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;user-data&lt;/span&gt;&lt;/tt&gt; file we&amp;#8217;re going to make one final rather hacky
(but useful) change. At the time of writing, Firefox starts under the XWayland
layer. This leads to rather poor performance under certain circumstances. To
force it to load under Wayland directly, we&amp;#8217;d need to set the
&lt;tt class="docutils literal"&gt;MOZ_ENABLE_WAYLAND&lt;/tt&gt; environment variable. Ideally we would do this only in
our user&amp;#8217;s environment, not system wide. This could be done by appending a line
to our user&amp;#8217;s &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.profile&lt;/span&gt;&lt;/tt&gt; script. However, this doesn&amp;#8217;t exist initially (and
won&amp;#8217;t until &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; creates our user). Thankfully, this presents no&amp;nbsp;problem!&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;/home/dave/.profile&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nt"&gt;defer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nt"&gt;append&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p-Indicator"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="no"&gt;export MOZ_ENABLE_WAYLAND=1&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The powerful (but obviously slightly dangerous) &lt;tt class="docutils literal"&gt;write_files&lt;/tt&gt; key allows us
to write to arbitrary files on first boot. Here we specify we&amp;#8217;d like to write
to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/home/dave/.profile&lt;/span&gt;&lt;/tt&gt; (adjust for your custom username as necessary). We
also inform &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; that the write should be &lt;em&gt;deferred&lt;/em&gt; which means this
will take place &lt;em&gt;after&lt;/em&gt; user creation. Further, we specify that we wish to
append (not overwrite), and finally we provide the lines we&amp;#8217;d like to&amp;nbsp;append.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="going-shopping"&gt;
&lt;h2&gt;Going&amp;nbsp;shopping&lt;/h2&gt;
&lt;p&gt;Naturally, in order to obtain the packages we&amp;#8217;ve requested we&amp;#8217;re going to need
some network connectivity. If your Pi is going to be connected by Ethernet,
you&amp;#8217;re good to go; the default configuration will just use your Ethernet
connection. However, if you&amp;#8217;re going to be relying on WiFi instead we need to
be a bit of surgery in the last file we mentioned earlier, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;network-config&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Firstly we&amp;#8217;ll delete the &lt;tt class="docutils literal"&gt;ethernets&lt;/tt&gt; section, then uncomment the &lt;tt class="docutils literal"&gt;wifis&lt;/tt&gt;
section and specify the local access point and&amp;nbsp;password:&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;wifis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nt"&gt;wlan0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nt"&gt;access-points&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;my-wifi-ssid&amp;quot;&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nt"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;my-wifi-password&amp;quot;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;It is also useful to specify the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;regulatory-domain&lt;/span&gt;&lt;/tt&gt; here (note that this
needs to be specified under the &lt;tt class="docutils literal"&gt;wlan0&lt;/tt&gt; key, which is the reason for the
inclusion of the parent keys&amp;nbsp;below):&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;wifis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nt"&gt;wlan0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nt"&gt;regulatory-domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l-Scalar-Plain"&gt;GB&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;The valid regulatory domains can be found in the &lt;a class="reference external" href="https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git/tree/db.txt"&gt;Linux kernel source&lt;/a&gt;
Specifically, the two-letter code after the &amp;#8220;country&amp;#8221; line, which are almost
entirely the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2"&gt;&lt;span class="caps"&gt;ISO&lt;/span&gt;-3166 standard two-letter country codes&lt;/a&gt;. The special &amp;#8220;00&amp;#8221;
domain (the &amp;#8220;world regulatory domain&amp;#8221;) is the default, but relying on this can
lead to poor WiFi performance, particularly in 5GHz setups where many channels
have restrictions in the world&amp;nbsp;domain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-first-byte-is-with-the-eye"&gt;
&lt;span id="down-here"&gt;&lt;/span&gt;&lt;h2&gt;The first byte is with the&amp;nbsp;eye&lt;/h2&gt;
&lt;p&gt;At the end of all this tinkering, you should have files that look something
like the following on your boot partition (lines you may wish to pay specific
attention to are&amp;nbsp;highlighted):&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;config.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;&lt;span class="na"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vmlinuz&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="na"&gt;cmdline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;cmdline.txt&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;&lt;span class="na"&gt;initramfs initrd.img followkernel&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="k"&gt;[pi4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;&lt;span class="na"&gt;max_framebuffers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="na"&gt;arm_boost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;&lt;span class="c1"&gt;# Enable the audio output, I2C and SPI interfaces on the GPIO header. As these&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;&lt;span class="c1"&gt;# parameters related to the base device-tree they must appear *before* any&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="c1"&gt;# other dtoverlay= specification&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;audio=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;i2c_arm=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="na"&gt;dtparam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;spi=on&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;&lt;span class="c1"&gt;# Comment out the following line if the edges of the desktop appear outside&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="c1"&gt;# the edges of your display&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="na"&gt;disable_overscan&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="c1"&gt;# If you have issues with audio, you may try uncommenting the following line&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="c1"&gt;# which forces the HDMI output into HDMI mode instead of DVI (which doesn&amp;#39;t&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="c1"&gt;# support audio output)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="c1"&gt;#hdmi_drive=2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="c1"&gt;# Enable the serial pins&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;&lt;span class="c1"&gt;#enable_uart=1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="c1"&gt;# Autoload overlays for any recognized cameras or displays that are attached&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="c1"&gt;# to the CSI/DSI ports. Please note this is for libcamera support, *not* for&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;&lt;span class="c1"&gt;# the legacy camera stack&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;&lt;span class="na"&gt;camera_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="na"&gt;display_auto_detect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;&lt;span class="c1"&gt;# Config settings specific to arm64&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="na"&gt;arm_64bit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-40"&gt;&lt;span class="linenos"&gt;40&lt;/span&gt;&lt;span class="k"&gt;[cm4]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-41"&gt;&lt;span class="linenos"&gt;41&lt;/span&gt;&lt;span class="c1"&gt;# Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-42"&gt;&lt;span class="linenos"&gt;42&lt;/span&gt;&lt;span class="c1"&gt;# such a board)&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-43"&gt;&lt;span class="linenos"&gt;43&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;dwc2,dr_mode=host&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-44"&gt;&lt;span class="linenos"&gt;44&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-45"&gt;&lt;span class="linenos"&gt;45&lt;/span&gt;&lt;span class="k"&gt;[all]&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-46"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;46&lt;/span&gt;&lt;span class="na"&gt;dtoverlay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;vc4-kms-v3d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;cmdline.txt&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt;1&lt;/span&gt;zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=zstd dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Please note that &lt;tt class="docutils literal"&gt;cmdline.txt&lt;/tt&gt; must consist of a &lt;em&gt;single line of text&lt;/em&gt;.
Ignore any wrapping of text&amp;nbsp;above.&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;user-data&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="c1"&gt;#cloud-config&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lubuntu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;&lt;span class="nt"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;en_GB.UTF-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="nt"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Europe/London&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="nt"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pc105&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-11"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;11&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ctrl:nocaps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-12"&gt;&lt;span class="linenos"&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-13"&gt;&lt;span class="linenos"&gt;13&lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-14"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;14&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;dave&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-15"&gt;&lt;span class="linenos"&gt;15&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;lock_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-16"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;16&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;gecos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Dave&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Jones&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-17"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;17&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;plain_text_passwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;raspberry&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-18"&gt;&lt;span class="linenos"&gt;18&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALL=(ALL:ALL)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ALL&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-19"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;19&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ssh_import_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-20"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;20&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lp:waveform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-21"&gt;&lt;span class="linenos"&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-22"&gt;&lt;span class="linenos"&gt;22&lt;/span&gt;&lt;span class="nt"&gt;write_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-23"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;23&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/home/dave/.profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-24"&gt;&lt;span class="linenos"&gt;24&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;append&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-25"&gt;&lt;span class="linenos"&gt;25&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;defer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-26"&gt;&lt;span class="linenos"&gt;26&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-27"&gt;&lt;span class="linenos"&gt;27&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;export MOZ_ENABLE_WAYLAND=1&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-28"&gt;&lt;span class="linenos"&gt;28&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-29"&gt;&lt;span class="linenos"&gt;29&lt;/span&gt;&lt;span class="nt"&gt;package_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-30"&gt;&lt;span class="linenos"&gt;30&lt;/span&gt;&lt;span class="nt"&gt;package_upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-31"&gt;&lt;span class="linenos"&gt;31&lt;/span&gt;&lt;span class="nt"&gt;package_reboot_if_required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-32"&gt;&lt;span class="linenos"&gt;32&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-33"&gt;&lt;span class="linenos"&gt;33&lt;/span&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-34"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;34&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;lubuntu-desktop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-35"&gt;&lt;span class="linenos"&gt;35&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ubuntu-raspi-settings-desktop&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-36"&gt;&lt;span class="linenos"&gt;36&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-37"&gt;&lt;span class="linenos"&gt;37&lt;/span&gt;&lt;span class="nt"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-38"&gt;&lt;span class="linenos"&gt;38&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-39"&gt;&lt;span class="linenos"&gt;39&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;snap install firefox&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You may be wondering if the ordering of these blocks matters. The answer is
&amp;#8220;no&amp;#8221;. The ordering of actions in &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; does &lt;em&gt;not&lt;/em&gt; depend on the
ordering of the configuration file (and nor should it). The system is intended
to be &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Declarative_programming"&gt;declarative&lt;/a&gt;; we are describing the state we wish to attain, not how to
obtain&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;This is why the &lt;tt class="docutils literal"&gt;write_files&lt;/tt&gt; section has options like &lt;tt class="docutils literal"&gt;defer&lt;/tt&gt; which adjust
the timing of these actions. By default, &lt;tt class="docutils literal"&gt;write_files&lt;/tt&gt; entries will always
occur early on so that written files can be available to other&amp;nbsp;actions.&lt;/p&gt;
&lt;div class="topic"&gt;
&lt;p class="topic-title"&gt;network-config&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span id="line-1"&gt;&lt;span class="linenos"&gt; 1&lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-2"&gt;&lt;span class="linenos"&gt; 2&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-3"&gt;&lt;span class="linenos"&gt; 3&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;wifis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-4"&gt;&lt;span class="linenos"&gt; 4&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;wlan0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-5"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 5&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;regulatory-domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;GB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-6"&gt;&lt;span class="linenos"&gt; 6&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-7"&gt;&lt;span class="linenos"&gt; 7&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-8"&gt;&lt;span class="linenos"&gt; 8&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;access-points&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span id="line-9"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt; 9&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;my-wifi-ssid&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span id="line-10"&gt;&lt;span class="hll"&gt;&lt;span class="linenos"&gt;10&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;my-wifi-password&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;With all those written, safely eject your card (or &lt;span class="caps"&gt;SSD&lt;/span&gt; drive), plug it into
your Pi and let it boot. This will take a … very … very … long … time.
Installing an entire hierarchy of desktop packages in this manner is not a
quick process, and the first boot will probably take at least 1 hour (I didn&amp;#8217;t
time every installation during this test, but the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; logs for the
Lubuntu run indicated setup on the microSD card took roughly 1½&amp;nbsp;hours).&lt;/p&gt;
&lt;p&gt;However, once it&amp;#8217;s complete, it should automatically reboot and you should find
yourself at a shiny new graphical desktop login! There&amp;#8217;s still some horror to
sort out here (in particular the clash of networking configuration stacks), but
we&amp;#8217;ll deal with that next time when we&amp;#8217;ll also take a look at comparing the
current crop of desktops on Ubuntu, and see what&amp;#8217;s changed in the last few
years. We&amp;#8217;ll also compare them to the official Gnome desktop, and learn a few
more &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;cloud-init&lt;/span&gt;&lt;/tt&gt; tricks&amp;nbsp;…&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="linux-mount" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If you&amp;#8217;re using Linux, you&amp;#8217;ll also see the root partition
(&amp;#8220;writable&amp;#8221;) appear, but you can ignore this&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="oem-config" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;oem-config&lt;/span&gt;&lt;/tt&gt;, derived from the &lt;tt class="docutils literal"&gt;ubiquity&lt;/tt&gt; installer. There
are moves afoot to replace this at some point (given &lt;tt class="docutils literal"&gt;ubiquity&lt;/tt&gt; is being
replaced with &lt;tt class="docutils literal"&gt;subiquity&lt;/tt&gt;), but nothing concrete as yet&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="no-systemd" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;p class="first"&gt;For those violently allergic to systemd, the equivalent commands the
listing locales, timezones, and keyboard settings&amp;nbsp;are:&lt;/p&gt;
&lt;dl class="last docutils"&gt;
&lt;dt&gt;locale:&lt;/dt&gt;
&lt;dd&gt;&lt;tt class="docutils literal"&gt;locale &lt;span class="pre"&gt;-a&lt;/span&gt;&lt;/tt&gt;&lt;/dd&gt;
&lt;dt&gt;timezone:&lt;/dt&gt;
&lt;dd&gt;&lt;tt class="docutils literal"&gt;(cd /usr/share/zoneinfo/posix; find &lt;span class="pre"&gt;-type&lt;/span&gt; f &lt;span class="pre"&gt;-or&lt;/span&gt; &lt;span class="pre"&gt;-type&lt;/span&gt; l &lt;span class="pre"&gt;-printf&lt;/span&gt; '%P\n')&lt;/tt&gt;&lt;/dd&gt;
&lt;dt&gt;keyboard:&lt;/dt&gt;
&lt;dd&gt;Read various sections in &lt;tt class="docutils literal"&gt;/usr/share/X11/xkb/rules/base.lst&lt;/tt&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="pi"></category><category term="cloud-init"></category><category term="desktop"></category></entry><entry><title>Making Jammy less Dodgy</title><link href="https://waldorf.waveform.org.uk/2022/making-jammy-less-dodgy.html" rel="alternate"></link><published>2022-07-22T00:00:00+01:00</published><updated>2023-11-06T08:37:40+00:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2022-07-22:/2022/making-jammy-less-dodgy.html</id><summary type="html">&lt;p class="first last"&gt;Fixing some of the post-release &amp;#8220;fun&amp;#8221; with Jammy (22.04 &lt;span class="caps"&gt;LTS&lt;/span&gt;)&lt;/p&gt;
</summary><content type="html">&lt;img alt="One of Jammy's more &amp;quot;radioactive&amp;quot; wallpapers; a series of waves fading from a bright purple to a positively eye-searing orange. I rather like it!" src="https://waldorf.waveform.org.uk/images/jammy-radioactive-wallpaper.png" /&gt;
&lt;p&gt;It&amp;#8217;s now several months after jammy&amp;#8217;s release, and thus long past time since I
should&amp;#8217;ve posted something about it. I&amp;#8217;ve been holding back on this because,
despite being an &lt;span class="caps"&gt;LTS&lt;/span&gt; (in fact, the first Ubuntu &lt;span class="caps"&gt;LTS&lt;/span&gt; desktop for the Pi), I
can&amp;#8217;t say I&amp;#8217;m happy with&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Yet.&lt;/p&gt;
&lt;p&gt;Still, that&amp;#8217;s why we don&amp;#8217;t enable upgrades for &lt;span class="caps"&gt;LTS&lt;/span&gt; users until the first point
release (&lt;a class="reference external" href="https://discourse.ubuntu.com/t/jammy-jellyfish-release-schedule/23906"&gt;planned for August 4th&lt;/a&gt; at the time of writing). So let&amp;#8217;s go
through the painful bits and see what early adopters can rectify before I get
my nose back to the grindstone and try and fix all the bits I&amp;#8217;ve messed&amp;nbsp;up!&lt;/p&gt;
&lt;p&gt;In some ways, this may be considered a spiritual successor to my &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2021/6-months-with-the-pi-desktop.html"&gt;earlier
post&lt;/a&gt; (and &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2020/ubuntu-desktops-on-the-pi.html"&gt;even earlier post&lt;/a&gt;) on the Pi desktops. Or to put it another way,
consider this the current &amp;#8220;Dave recommends you run your Ubuntu Pi this way&amp;#8221;
post (until I supersede it&amp;nbsp;again)!&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;I&amp;#8217;m going to take the unusual step of stating quite explicitly that the
following (like everything on this site) is my &lt;em&gt;personal&lt;/em&gt; opinion. This is
&lt;em&gt;my&lt;/em&gt; recommendation for running your Ubuntu Pi, not anyone else&amp;#8217;s
(including&amp;nbsp;Canonical).&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So, with disclaimers thoroughly disclaimed, let us begin&amp;nbsp;…&lt;/p&gt;
&lt;div class="section" id="snap"&gt;
&lt;h2&gt;Snap!&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s the &lt;a class="reference external" href="https://www.omgubuntu.co.uk/2022/04/how-to-install-firefox-deb-apt-ubuntu-22-04#disqus_thread"&gt;serial complaint&lt;/a&gt;: the default browser (Firefox) is now a snap. I&amp;#8217;m
not going to get into the fiery debate over snaps here (more beer is required
for that!). Nor am I going to address the start-up speed issues (they&amp;#8217;ve been
&lt;a class="reference external" href="https://ubuntu.com/blog/how-are-we-improving-firefox-snap-performance-part-2"&gt;furiously hacked&lt;/a&gt; upon and &lt;a class="reference external" href="https://ubuntu.com/blog/how-are-we-improving-firefox-snap-performance-part-3"&gt;thoroughly covered&lt;/a&gt; elsewhere; in fact I was a
small cog in the team that did some of that work). Besides, I&amp;#8217;m more concerned
with the performance of the browser &lt;em&gt;after&lt;/em&gt; it&amp;#8217;s started (a browser isn&amp;#8217;t
something I fire up more than once a day), and in that regard I&amp;#8217;ve no
particular complaints about the performance of the snapped version over the deb&amp;nbsp;version.&lt;/p&gt;
&lt;p&gt;And yet, complaints I have&amp;nbsp;…&lt;/p&gt;
&lt;p&gt;There are currently issues with the Firefox snap which, personally, I consider
deal-breakers. In particular &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/chromium-browser/+bug/1741074"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;:&amp;nbsp;#1741074&lt;/a&gt; &amp;#8220;chrome-gnome-shell extension
fails to detect native host connector&amp;#8221; (aka the &amp;#8220;native messaging issue&amp;#8221;). The
bug&amp;#8217;s title may sound relatively innocuous but in practice this translates to
&lt;a class="reference external" href="https://github.com/keepassxreboot/keepassxc-browser/issues/1426"&gt;&amp;#8220;I can&amp;#8217;t use KeepassXC&amp;#8221;&lt;/a&gt; (my password database of choice) with my&amp;nbsp;browser.&lt;/p&gt;
&lt;p&gt;I would fallback to KeepassXC&amp;#8217;s awesome auto-type feature, but that &lt;a class="reference external" href="https://github.com/keepassxreboot/keepassxc/issues/2281#issuecomment-922332932"&gt;doesn&amp;#8217;t
work under Wayland&lt;/a&gt; (to be clear: this isn&amp;#8217;t exactly a defect, more a design
choice; the linked thread has more details). Hence, at least with the version
of jammy as released, my only option to use my (now pretty extensive, and
certainly indispensable) password database is to copy and paste usernames and
passwords via the clipboard … which just about &lt;em&gt;any&lt;/em&gt; process can view.
Obviously, this is a fairly major step backwards in security and not one I&amp;#8217;m
willing to put up&amp;nbsp;with.&lt;/p&gt;
&lt;p&gt;I should stress this is another issue that is top of the list and being
furiously attacked with many sharp objects. Once it&amp;#8217;s fixed, I&amp;#8217;ll have no
specific qualms about returning to the snap (after all, Mozilla seem to prefer
it as a means of distribution). But what to do in the&amp;nbsp;meantime?&lt;/p&gt;
&lt;p&gt;Switch to the flatpak? No good: the aforementioned bug applies to any confined
(snap or otherwise) browser. Besides … the Firefox flatpak is only &lt;a class="reference external" href="https://beta.flathub.org/apps/details/org.mozilla.firefox"&gt;available
for amd64&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Switch to Chromium? It&amp;#8217;s snapped too. That said, I&amp;#8217;m not sure I would even if I
could: &lt;a class="reference external" href="https://github.com/gorhill/uBlock"&gt;uBlock Origin&lt;/a&gt; (an extension I consider damned near mandatory for
anyone wanting to browse the modern web on anything less than a beefy Ryzen
with &lt;span class="caps"&gt;32GB&lt;/span&gt; of &lt;span class="caps"&gt;RAM&lt;/span&gt;) is &lt;a class="reference external" href="https://github.com/uBlockOrigin/uBlock-issues/issues/338#issuecomment-468339241"&gt;better in Firefox&lt;/a&gt; than in&amp;nbsp;Chromium.&lt;/p&gt;
&lt;p&gt;What about full-fat Chrome? Not an option; Google only distribute Chrome
packages for amd64&amp;nbsp;too.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Rant: frankly, this is one of my biggest misgivings about snap, flatpak,
and all these distribution methods that purport to put &amp;#8220;distribution in the
hands of the developers&amp;#8221;: they all suck at providing for anything other
than &lt;a class="reference external" href="https://github.com/canonical-web-and-design/snapcraft.io/issues/3969"&gt;&lt;span class="caps"&gt;PC&lt;/span&gt; architectures&lt;/a&gt; leaving stuff like the Pi (or &lt;span class="caps"&gt;RISC&lt;/span&gt;-V, or any
new architecture) high and&amp;nbsp;dry.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;So, until this is fixed, let&amp;#8217;s just use the&amp;nbsp;deb:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;add-apt-repository&lt;span class="w"&gt; &lt;/span&gt;ppa:mozillateam/ppa&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;... lots of output, press Enter ...
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;EOF&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;tee&lt;span class="w"&gt; &lt;/span&gt;/etc/apt/preferences.d/firefox&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;Package: firefox*
Pin: release=LP-PPA-mozillateam
Pin-Priority: 501

Package: firefox*
Pin: release o=Ubuntu
Pin-Priority: -1
EOF
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;purge&lt;span class="w"&gt; &lt;/span&gt;firefox&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;snap&lt;span class="w"&gt; &lt;/span&gt;remove&lt;span class="w"&gt; &lt;/span&gt;firefox&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;firefox
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="crackle"&gt;
&lt;h2&gt;Crackle!&lt;/h2&gt;
&lt;p&gt;Another &lt;a class="reference external" href="https://lists.ubuntu.com/archives/ubuntu-devel/2022-June/042116.html"&gt;cereal complaint&lt;/a&gt; (I make no excuses for the puns here): the
introduction of &lt;a class="reference external" href="https://www.freedesktop.org/software/systemd/man/systemd-oomd.service.html"&gt;systemd-oomd&lt;/a&gt;! In fact, I was rather glad of this one but I
also think it&amp;#8217;s less of an issue on the Pi than it is the &lt;span class="caps"&gt;PC&lt;/span&gt;, for reasons I&amp;#8217;ll
go into&amp;nbsp;…&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;This section is partly redundant because, while writing it, one of my
colleagues (Nick, who despite being fresh-faced and new, jumped headlong
into the fray) pushed a new configuration that substantially solves things.
See &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1972159"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1972159&lt;/a&gt; for the full&amp;nbsp;story.&lt;/p&gt;
&lt;p class="last"&gt;However, there&amp;#8217;s still some useful stuff in here for users on smaller
memory systems (including non-Pis!) so I&amp;#8217;ve left it&amp;nbsp;in.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Firstly, a little context. For those not aware, systemd-oomd is a new facility
for killing memory hogging processes (now activated by default on our desktop
images). Previously, this was solely the domain of the dreaded &lt;a class="reference external" href="https://docs.kernel.org/admin-guide/mm/concepts.html#oom-killer"&gt;&lt;span class="caps"&gt;OOM&lt;/span&gt; killer&lt;/a&gt; in
the Linux kernel. While this certainly did the job of killing memory hogs, it
was typically only capable of doing so &lt;em&gt;after&lt;/em&gt; the system had descended into
&amp;#8220;swap hell&amp;#8221;. In other words, only once something ridiculously fat had pushed
everything else on the system to page itself out to disk, did the kernel &lt;span class="caps"&gt;OOM&lt;/span&gt;
killer wake up and stalk the process table looking for potential&amp;nbsp;victims.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="A frame from Futurama's &amp;quot;Hell is Other Robots&amp;quot; depicting the Beastie Boys scratching a hard drive. A not so subtle allusion to &amp;quot;swap hell&amp;quot;." src="https://waldorf.waveform.org.uk/images/swap-hell.jpg" /&gt;
&lt;p class="caption"&gt;An artist&amp;#8217;s impression of &amp;#8220;swap&amp;nbsp;hell&amp;#8221;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This typically meant that, while things &lt;em&gt;did&lt;/em&gt; get remedied eventually, it took
several minutes of the machine &amp;#8220;thrashing&amp;#8221; for that to happen. In the
noughties, I might listen for the audible cue of an &lt;span class="caps"&gt;HDD&lt;/span&gt; thrashing its heads to
have a clue this was going on, but this is now and SSDs (or &lt;span class="caps"&gt;SD&lt;/span&gt; cards) don&amp;#8217;t
provide quite the same&amp;nbsp;feedback!&lt;/p&gt;
&lt;p&gt;As a rough rule of thumb, people will assume something has crashed after
roughly 5 seconds of the &lt;span class="caps"&gt;UI&lt;/span&gt; appearing to freeze. If that sounds short, consider
how many seconds it would take before you assumed a crash if &lt;em&gt;even your mouse
pointer&lt;/em&gt; is frozen (or jumpy to the point that someone might reasonably assume
something was &amp;#8220;wrong&amp;#8221;). In practice this typically meant that, long before the
kernel &lt;span class="caps"&gt;OOM&lt;/span&gt; killer got involved, the user&amp;#8217;s itchy power-button finger got
involved&amp;nbsp;first.&lt;/p&gt;
&lt;p&gt;To be fair, systemd-oomd does fix several issues with the kernel&amp;#8217;s &lt;span class="caps"&gt;OOM&lt;/span&gt; killer.
The most notable being that a modern application may have many &amp;#8220;processes&amp;#8221; and
(being process-oriented) the kernel&amp;#8217;s &lt;span class="caps"&gt;OOM&lt;/span&gt; killer would only kill the heaviest
individual process (regardless of whether it was a mere component in a larger
system). That potentially left the rest of the application in a unknown /
unstable state. By contrast, systemd-oomd will kill the whole cgroup
consistently (cgroup in this context can be read as &amp;#8220;application&amp;#8221; … sort&amp;nbsp;of).&lt;/p&gt;
&lt;p&gt;It also acts before the system ever gets near &amp;#8220;swap hell&amp;#8221;, basing its actions
on the system reaching some (fairly arbitrary) thresholds like 90% of both
&lt;span class="caps"&gt;RAM&lt;/span&gt; and swap being utilized (to activate), and &lt;a class="reference external" href="https://www.kernel.org/doc/html/latest/accounting/psi.html"&gt;pressure stall information&lt;/a&gt;
(to determine what to act&amp;nbsp;upon).&lt;/p&gt;
&lt;p&gt;Unfortunately there are some major&amp;nbsp;issues:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Most browsers (presumably in acknowledgement of how much fat is dripping off
the silk of the web these days) already have mechanisms to &amp;#8220;unload&amp;#8221; their
heavier processes (usually individual tabs) when they detect the system is
&amp;#8220;under load&amp;#8221;. However, being fine-tuned to the individual application, these
usually kick in later than systemd-oomd will (or to put it another way, by
the time they &lt;em&gt;would&lt;/em&gt; kick in, systemd-oomd has already killed the whole&amp;nbsp;browser).&lt;/li&gt;
&lt;li&gt;systemd-oomd has no user interaction or even notification. One second you&amp;#8217;re
working in your browser and the next: &lt;em&gt;blip&lt;/em&gt;. It&amp;#8217;s gone. No warning, no
chance to intervene, and not so much as an apology after the&amp;nbsp;fact!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the upside, it all happens very quickly: there&amp;#8217;s no wading through the
treacle of swap-thrashing. But it feels … arbitrary, unpredictable, and frankly&amp;nbsp;&amp;#8220;flaky&amp;#8221;.&lt;/p&gt;
&lt;p&gt;There is a simple solution: get more &lt;span class="caps"&gt;RAM&lt;/span&gt;! On my machines with &lt;span class="caps"&gt;8GB&lt;/span&gt; (or more) of
&lt;span class="caps"&gt;RAM&lt;/span&gt;, I simply haven&amp;#8217;t encountered the issue. It&amp;#8217;s only on machines with &lt;span class="caps"&gt;4GB&lt;/span&gt; or
less that this seems to be a serious issue (at least, that&amp;#8217;s my personal
experience &amp;#8212; I&amp;#8217;m sure others with different workloads may find differently).
Still, that includes the Pi 400 I use as a desktop, and also my tiddly laptop
(which has &lt;span class="caps"&gt;4GB&lt;/span&gt; of &lt;span class="caps"&gt;RAM&lt;/span&gt; and a Celeron processor &amp;#8212; I like my machines small and&amp;nbsp;cheap!).&lt;/p&gt;
&lt;p&gt;And this is where things (surprisingly!) turned out better on the Pi than on
the &lt;span class="caps"&gt;PC&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;On my little &lt;span class="caps"&gt;4GB&lt;/span&gt; laptop (which doesn&amp;#8217;t really get much use, only when I&amp;#8217;m away
from the house), I noticed Firefox frequently getting killed especially when
working in Google Docs. Curiously, I &lt;em&gt;didn&amp;#8217;t&lt;/em&gt; notice the same on the Pi 400
(one of my two main workhorses that gets used a lot more than the&amp;nbsp;laptop).&lt;/p&gt;
&lt;p&gt;Then I recalled that we&amp;#8217;d activated &lt;a class="reference external" href="https://www.kernel.org/doc/html/v4.19/vm/zswap.html"&gt;zswap&lt;/a&gt; (see &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2021/6-months-with-the-pi-desktop.html"&gt;earlier post&lt;/a&gt;) by default
on jammy for the Pi desktop images. My &lt;span class="caps"&gt;PC&lt;/span&gt; laptop had the same &lt;span class="caps"&gt;RAM&lt;/span&gt; size (&lt;span class="caps"&gt;4GB&lt;/span&gt;),
the same swap size (&lt;span class="caps"&gt;1GB&lt;/span&gt;), but while zswap was active on the Pi, it wasn&amp;#8217;t on
the laptop. That&amp;#8217;s not to say the Pi was perfect: there were two occasions when
Firefox got killed, but that was in stark contrast to the laptop on which it
happened half a dozen times in a single&amp;nbsp;day.&lt;/p&gt;
&lt;p&gt;Obviously the first thing I did was activate zswap on my laptop and, after
a reboot suddenly things were &lt;em&gt;much&lt;/em&gt; better. I did still manage to get Firefox
killed during a subsequent test run, but after then expanding the swap to &lt;span class="caps"&gt;2GB&lt;/span&gt;
on both machines, I managed a full day of work on the laptop without a single
systemd-oomd&amp;nbsp;activation.&lt;/p&gt;
&lt;p&gt;So (unusually for this site), here&amp;#8217;s a recommendation for any jammy desktop
users on small PCs out there (&lt;strong&gt;Pi users, you can ignore this bit&lt;/strong&gt;):&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;# &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'/GRUB_CMDLINE_LINUX_DEFAULT/ s/splash/splash zswap.enabled=1 zswap.compressor=zstd zswap.zpool=z3fold/'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt; &lt;/span&gt;/etc/default/grub&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;# &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;zstd&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/initramfs-tools/modules&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;# &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;z3fold&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/initramfs-tools/modules&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;# &lt;/span&gt;update-initramfs&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;# &lt;/span&gt;update-grub
&lt;/pre&gt;
&lt;p&gt;The above will activate zswap by adding &lt;tt class="docutils literal"&gt;zswap.enabled=1
zswap.compressor=zstd zswap.zpool=z3fold&lt;/tt&gt; to the kernel&amp;#8217;s command line in the
&lt;span class="caps"&gt;GRUB&lt;/span&gt; configuration, and adding the necessary modules to the&amp;nbsp;initramfs.&lt;/p&gt;
&lt;p&gt;Next, I&amp;#8217;d also recommend (to both small &lt;span class="caps"&gt;PC&lt;/span&gt; users &lt;em&gt;and&lt;/em&gt; Pi users), to bump the
default swap-file up to &lt;span class="caps"&gt;2GB&lt;/span&gt;. After doing this, I haven&amp;#8217;t suffered a single
systemd-oomd kill on my Pi 400 (again, for my particular workload &amp;#8212; bear in
mind I spend most of my time in lightweight terminal things, so adjust
accordingly). The following should be run on a freshly booted system as the
first thing we&amp;#8217;re going to do is &lt;em&gt;disable&lt;/em&gt; the existing swap before expanding&amp;nbsp;it:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;swapoff&lt;span class="w"&gt; &lt;/span&gt;/swapfile&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;fallocate&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;2G&lt;span class="w"&gt; &lt;/span&gt;/swapfile&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkswap&lt;span class="w"&gt; &lt;/span&gt;/swapfile&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/swapfile&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;swapon&lt;span class="w"&gt; &lt;/span&gt;/swapfile
&lt;/pre&gt;
&lt;p&gt;What have we actually accomplished with all&amp;nbsp;this?&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s take the example of my &lt;span class="caps"&gt;4GB&lt;/span&gt; laptop. The defaults for zswap&amp;#8217;s configuration
will reserve 20% of all &lt;span class="caps"&gt;RAM&lt;/span&gt; for compressed pages, which is roughly &lt;span class="caps"&gt;800MB&lt;/span&gt;. Those
compressed pages will (with the z3fold allocator) store &lt;em&gt;up to&lt;/em&gt; 3 uncompressed
pages each. So that &lt;span class="caps"&gt;800MB&lt;/span&gt; of &lt;span class="caps"&gt;RAM&lt;/span&gt; can act as up to 2.&lt;span class="caps"&gt;4GB&lt;/span&gt; of (suspiciously fast)
swap. And beyond that we also have &lt;span class="caps"&gt;2GB&lt;/span&gt; of (typical, slow) disk-based&amp;nbsp;swap.&lt;/p&gt;
&lt;p&gt;Visually what we&amp;#8217;ve done is&amp;nbsp;this:&lt;/p&gt;
&lt;object data="https://waldorf.waveform.org.uk/images/zswap-layout.svg" type="image/svg+xml"&gt;Three bars illustrating the original state of the memory layout (&lt;span class="caps"&gt;4GB&lt;/span&gt;
&lt;span class="caps"&gt;RAM&lt;/span&gt;, &lt;span class="caps"&gt;1GB&lt;/span&gt; swap), the new physical layout (3.&lt;span class="caps"&gt;2GB&lt;/span&gt; &lt;span class="caps"&gt;RAM&lt;/span&gt;, &lt;span class="caps"&gt;800MB&lt;/span&gt; zswap, &lt;span class="caps"&gt;2GB&lt;/span&gt;
disk swap), and the new &amp;#8220;effective&amp;#8221; layout (3.&lt;span class="caps"&gt;2GB&lt;/span&gt; &lt;span class="caps"&gt;RAM&lt;/span&gt;, 2.&lt;span class="caps"&gt;4GB&lt;/span&gt; zswap,
&lt;span class="caps"&gt;2GB&lt;/span&gt; disk swap)&lt;/object&gt;
&lt;p&gt;Don&amp;#8217;t be fooled: we&amp;#8217;ve &lt;em&gt;reduced&lt;/em&gt; the amount of available &lt;span class="caps"&gt;RAM&lt;/span&gt; from &lt;span class="caps"&gt;4GB&lt;/span&gt; to 3.&lt;span class="caps"&gt;2GB&lt;/span&gt;.
This isn&amp;#8217;t good, but it&amp;#8217;s the trade-off you make with compressed &lt;span class="caps"&gt;RAM&lt;/span&gt; systems of
any sort. We&amp;#8217;ve also sacrificed another gig of disk space to swap. However,
we&amp;#8217;ve increased the available swap from &lt;span class="caps"&gt;1GB&lt;/span&gt; (by default) to about 4.&lt;span class="caps"&gt;4GB&lt;/span&gt;, of
which more than half is very fast compressed-memory swap and all for a (fairly)
minimal memory&amp;nbsp;cost.&lt;/p&gt;
&lt;p&gt;Furthermore, we&amp;#8217;ve also moved from a configuration where there&amp;#8217;s &lt;span class="caps"&gt;4GB&lt;/span&gt; of very
fast pages, and &lt;span class="caps"&gt;1GB&lt;/span&gt; of really slow pages to one where there&amp;#8217;s 3.&lt;span class="caps"&gt;2GB&lt;/span&gt; of very
fast pages, 2.&lt;span class="caps"&gt;4GB&lt;/span&gt; of &lt;em&gt;fairly&lt;/em&gt; quick pages, and &lt;span class="caps"&gt;2GB&lt;/span&gt; of really slow pages. In
other words, we&amp;#8217;ve now got a &amp;#8220;smoother&amp;#8221; progression of memory the kernel can
stick pages into. This helps a system under load go a bit slower while
remaining reasonably responsive, instead of suddenly hitting a brick wall of&amp;nbsp;swap.&lt;/p&gt;
&lt;div class="section" id="soggy-cornflakes"&gt;
&lt;h3&gt;Soggy&amp;nbsp;Cornflakes&lt;/h3&gt;
&lt;p&gt;One mea-culpa I should offer here: I managed to forget something rather
important on the Ubuntu Pi desktop images for&amp;nbsp;jammy.&lt;/p&gt;
&lt;p&gt;While zswap is activated, and the swap-file is created (now on boot by the
&lt;tt class="docutils literal"&gt;mkswap.service&lt;/tt&gt; unit so we no longer ship a gigabyte of &amp;#8220;nothing&amp;#8221; in the
image itself) … I managed to forget to add the &amp;#8220;z3fold&amp;#8221; and &amp;#8220;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Zstd"&gt;zstd&lt;/a&gt;&amp;#8221; modules
to the initramfs modules list. As a result, zswap is still working on the Pi
desktop images, but it&amp;#8217;s currently falling back to the default &amp;#8220;zbud&amp;#8221; (2-page)
allocator, and &amp;#8220;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Oberhumer"&gt;lzo&lt;/a&gt;&amp;#8221;&amp;nbsp;compression.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/ubuntu-settings/+bug/1977764"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1977764&lt;/a&gt; is tracking this and I&amp;#8217;ll get it fixed as soon as I reasonably
can (unfortunately, while it sounds trivial it&amp;#8217;s actually a messy one &amp;#8212; read
the bug if you want the full&amp;nbsp;story).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="pop"&gt;
&lt;h2&gt;Pop!&lt;/h2&gt;
&lt;p&gt;That about covers things for the desktop side. What about the server image?
Overall I&amp;#8217;m actually pretty happy with the server side of things, but one thing
has been irking me whenever I&amp;#8217;ve played with the lovely little &lt;a class="reference external" href="https://www.raspberrypi.com/products/raspberry-pi-zero-2-w/"&gt;Pi Zero 2W&lt;/a&gt;.
There&amp;#8217;s precious little memory available at runtime, particularly on the arm64
images (which it seems the &lt;em&gt;vast&lt;/em&gt; majority of our users&amp;nbsp;prefer).&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s been some effort recently to identify things installed by default which
shouldn&amp;#8217;t be, with the goal of reducing the &amp;#8220;base&amp;#8221; memory footprint of our
images and I thought I&amp;#8217;d have a look at what&amp;#8217;s running by default on the Pi
server images to see if there&amp;#8217;s anything we could cull&amp;nbsp;there.&lt;/p&gt;
&lt;p&gt;First, let&amp;#8217;s see how much free memory we have on a fresh&amp;nbsp;boot:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;free&lt;span class="w"&gt; &lt;/span&gt;-h&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;               total        used        free      shared  buff/cache   available
Mem:           414Mi       152Mi        33Mi       3.0Mi       228Mi       242Mi
Swap:             0B          0B          0B&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Hmmm, only &lt;span class="caps"&gt;242MB&lt;/span&gt; available. Okay, what&amp;#8217;s eating&amp;nbsp;it?&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;A quick clarification about &amp;#8220;free&amp;#8221; vs &amp;#8220;available&amp;#8221;. Ignore &amp;#8220;free&amp;#8221;. This is
the amount of &lt;span class="caps"&gt;RAM&lt;/span&gt; actually unused, but unused &lt;span class="caps"&gt;RAM&lt;/span&gt; is wasted &lt;span class="caps"&gt;RAM&lt;/span&gt;. The kernel
has a duty to minimize free &lt;span class="caps"&gt;RAM&lt;/span&gt; by filling anything unused with disk (and
other useful) caches which can be evicted trivially in the case that more
&lt;span class="caps"&gt;RAM&lt;/span&gt; is required. The &amp;#8220;available&amp;#8221; metric indicates the amount of &lt;span class="caps"&gt;RAM&lt;/span&gt; that is
available &amp;#8220;on demand&amp;#8221; should userland processes request it. It&amp;#8217;s &lt;em&gt;roughly&lt;/em&gt;
(but not precisely) equal to &amp;#8220;free&amp;#8221; +&amp;nbsp;&amp;#8220;buff/cache&amp;#8221;.&lt;/p&gt;
&lt;p class="last"&gt;Or to put it another way: &amp;#8220;available&amp;#8221; tells you how much &lt;span class="caps"&gt;RAM&lt;/span&gt; is available
for use; &amp;#8220;free&amp;#8221; is the metric which tells you how much &lt;span class="caps"&gt;RAM&lt;/span&gt; you&amp;#8217;ve wasted
your money on&amp;nbsp;;)&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;We&amp;#8217;ll use the &lt;tt class="docutils literal"&gt;ps&lt;/tt&gt; command exclude everything under
&lt;span class="caps"&gt;PID&lt;/span&gt; 2 which is the kernel (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--ppid&lt;/span&gt; 2 &lt;span class="pre"&gt;-p&lt;/span&gt; 2 &lt;span class="pre"&gt;-N&lt;/span&gt;&lt;/tt&gt;). We&amp;#8217;ll turn on the
hierarchical view (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-H&lt;/span&gt;&lt;/tt&gt;) to get a clue of what belongs to what (this won&amp;#8217;t
show every inter-process dependency, but it can be a rough guide), and the
&amp;#8220;full&amp;#8221; output (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-F&lt;/span&gt;&lt;/tt&gt;) so we can get the memory usage info (amongst other
things; I&amp;#8217;ll exclude some of the columns below for the sake of text&amp;nbsp;wrapping):&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;--ppid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-NHF&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;UID          PID    PPID     SZ   RSS PSR TTY   CMD
root           1       0  41786 11364   2 ?     /sbin/init fixrtc splash
root         374       1  12020 12572   0 ?       /lib/systemd/systemd-journald
root         416       1  72416 25672   3 ?       /sbin/multipathd -d -s
root         429       1   5998  6332   2 ?       /lib/systemd/systemd-udevd
root         576       1   4087  9732   3 ?       /sbin/wpa_supplicant -c /run/netpla
systemd+     588       1  22160  6292   3 ?       /lib/systemd/systemd-timesyncd
systemd+     634       1   4097  7704   1 ?       /lib/systemd/systemd-networkd
systemd+     636       1   6270 12224   1 ?       /lib/systemd/systemd-resolved
message+     668       1   2280  4220   3 ?       &amp;#64;dbus-daemon --system --address=sys
root         673       1  20492  3344   2 ?       /usr/sbin/irqbalance --foreground
root         677       1   8217 17916   1 ?       /usr/bin/python3 /usr/bin/networkd-
root         678       1  59035  8220   3 ?       /usr/libexec/polkitd --no-debug
syslog       680       1  55508  4392   3 ?       /usr/sbin/rsyslogd -n -iNONE
root         684       1  366205 27060  0 ?       /usr/lib/snapd/snapd
root         687       1   6002  7164   2 ?       /lib/systemd/systemd-logind
root         691       1  98379 11280   3 ?       /usr/libexec/udisks2/udisksd
root         695       1   3813  3440   0 ?       /sbin/wpa_supplicant -u -s -O /run/
root         712       1   1727  2456   0 ?       /usr/sbin/cron -f -P
root         726       1  61827 12368   1 ?       /usr/sbin/ModemManager
root         736       1   1409   808   1 ttyS0   /sbin/agetty -o -p -- \u --keep-bau
root         744       1  27480 19884   0 ?       /usr/bin/python3 /usr/share/unatten
root         755       1   3787  8428   1 ?       sshd: /usr/sbin/sshd -D [listener]
root        1660     755   4530  9716   0 ?         sshd: ubuntu [priv]
ubuntu      1804    1660   4661  7592   1 ?           sshd: ubuntu&amp;#64;pts/0
ubuntu      1805    1804   2152  4852   2 pts/0         -bash
ubuntu    355020    1805   2495  2844   3 pts/0           ps --ppid 2 -p 2 -NHF
root         881       1    560   168   2 ?       /usr/bin/hciattach /dev/serial1 bcm
root         899       1   2386  4468   3 ?       /usr/lib/bluetooth/bluetoothd
ubuntu      1004       1   4559  9924   2 ?       /lib/systemd/systemd --user
ubuntu      1005    1004  42795  5800   2 ?         (sd-pam)
root        1766       1   1398   812   2 tty6    /sbin/agetty -o -p -- \u --noclear
root        1777       1   2417  3976   1 tty1    /bin/login -p --
ubuntu    227377    1777   2174  4856   2 tty1      -bash&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Okay, lots to go through here. &lt;span class="caps"&gt;RSS&lt;/span&gt; (Resident Set Size) is the most interesting
column here (it&amp;#8217;s &lt;a class="reference external" href="https://web.archive.org/web/20120520221529/http://emilics.com/blog/article/mconsumption.html"&gt;not wholly accurate&lt;/a&gt; but good enough for our purposes).
What&amp;#8217;s the fattest thing in &lt;span class="caps"&gt;RAM&lt;/span&gt;? Ah … snapd (at ~&lt;span class="caps"&gt;26MB&lt;/span&gt;). On my fat &lt;span class="caps"&gt;8GB&lt;/span&gt; Pi 4 I&amp;#8217;m
happy to leave that because I use the &lt;span class="caps"&gt;LXD&lt;/span&gt; snap (a lot!). However, this is a
little Zero 2W and I only need debs on this, so out it&amp;nbsp;goes:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;purge&lt;span class="w"&gt; &lt;/span&gt;snapd&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
  squashfs-tools
Use 'sudo apt autoremove' to remove it.
The following packages will be REMOVED:
  snapd*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 84.1 MB disk space will be freed.
Do you want to continue? [Y/n]
... lots of complaints about read-only stuff ...
rm: cannot remove '/snap/core20/1408/var/log': Read-only file system
rm: cannot remove '/snap/core20/1408/var/mail': Read-only file system
rm: cannot remove '/snap/core20/1408/var/opt': Read-only file system
rm: cannot remove '/snap/core20/1408/var/snap': Read-only file system
rm: cannot remove '/snap/core20/1408/var/spool/mail': Read-only file system
rm: cannot remove '/snap/core20/1408/var/tmp': Read-only file system
rm: cannot remove '/snap/core20/1408/writable': Read-only file system
Cannot remove directory /snap
Removing extra snap-confine apparmor rules
Removing snapd cache
Removing snapd state
dpkg: warning: while removing snapd, directory '/snap' not empty so not removed
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;autoremove&lt;span class="w"&gt; &lt;/span&gt;--purge&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
  squashfs-tools*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 408 kB disk space will be freed.
Do you want to continue? [Y/n]
&lt;/span&gt;&lt;span class="gp-VirtualEnv"&gt;(Reading database ... 100500 files and directories currently installed.)&lt;/span&gt;
&lt;span class="go"&gt;Removing squashfs-tools (1:4.5-3build1) ...
Processing triggers for man-db (2.10.2-1) ...&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;At this point, given it couldn&amp;#8217;t remove everything under &lt;tt class="docutils literal"&gt;/snap&lt;/tt&gt; I&amp;#8217;d just
reboot to clear up any remaining mounts and &lt;tt class="docutils literal"&gt;sudo rm &lt;span class="pre"&gt;-fr&lt;/span&gt; /snap&lt;/tt&gt; (I don&amp;#8217;t
recall having to do this before; I&amp;#8217;ll try and remember to investigate this
further at some&amp;nbsp;point).&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;... wait to get back to the login ...
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-fr&lt;span class="w"&gt; &lt;/span&gt;/snap
&lt;/pre&gt;
&lt;p&gt;Now, what&amp;#8217;s next? &amp;#8220;multipathd&amp;#8221; (~&lt;span class="caps"&gt;25MB&lt;/span&gt;). This is a piece of the default server
installation for dealing with &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Multipath_I/O"&gt;multipath disk &lt;span class="caps"&gt;IO&lt;/span&gt;&lt;/a&gt;. However, unless you&amp;#8217;re
running a Compute Module with some fairly serious storage attached to it, this
is likely pointless on your Pi. Unfortunately, removing this is probably not a
good&amp;nbsp;idea:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;purge&lt;span class="w"&gt; &lt;/span&gt;multipath-tools&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  kpartx libsgutils2-2 liburcu8 sg3-utils sg3-utils-udev
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  multipath-tools* ubuntu-server* ubuntu-server-raspi*
0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded.
After this operation, 1179 kB disk space will be freed.
Do you want to continue? [Y/n] n
Abort.&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Notice how it wanted to remove the &amp;#8220;ubuntu-server&amp;#8221; package? That&amp;#8217;s usually not
a good sign! However, perhaps we can disable it&amp;nbsp;somehow:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;multipathd.service&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;# &lt;/span&gt;/lib/systemd/system/multipathd.service&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;[Unit]
Description=Device-Mapper Multipath Device Controller
Before=iscsi.service iscsid.service lvm2-activation-early.service
Before=local-fs-pre.target blk-availability.service shutdown.target
Wants=systemd-udevd-kernel.socket
After=systemd-udevd-kernel.socket
After=multipathd.socket systemd-remount-fs.service
DefaultDependencies=no
Conflicts=shutdown.target
ConditionKernelCommandLine=!nompath
ConditionKernelCommandLine=!multipath=off
ConditionVirtualization=!container

[Service]
... etc ...

[Install]
... etc ...&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Ah ha! Adding &lt;tt class="docutils literal"&gt;nompath&lt;/tt&gt; or the slightly more obvious &lt;tt class="docutils literal"&gt;multipath=off&lt;/tt&gt; to the
kernel command line should disable this service. Well, that&amp;#8217;s easily&amp;nbsp;accomplished:&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'s/$/ multipath=off/'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/boot/firmware/cmdline.txt&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot
&lt;/pre&gt;
&lt;p&gt;I&amp;#8217;m sorely tempted to add this by default to the Pi images, but I need to dig a
bit further into whether multipath has any genuine use-cases on the&amp;nbsp;Pi.&lt;/p&gt;
&lt;p&gt;Next on the list? The Python-based &amp;#8220;unattended-upgrades-shutdown&amp;#8221; process
(~&lt;span class="caps"&gt;19MB&lt;/span&gt;). It&amp;#8217;s not a great idea to disable this (it ensures the computer doesn&amp;#8217;t
shut down in the middle of unattended-upgrades). However, it&amp;#8217;s annoying that it
hangs around the whole time eating &lt;span class="caps"&gt;RAM&lt;/span&gt; and only actually does anything at
shutdown. Still, it&amp;#8217;s the subject of an existing ticket, &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/unattended-upgrades/+bug/1955084"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1955084&lt;/a&gt; so
we&amp;#8217;ll just leave that one for&amp;nbsp;now.&lt;/p&gt;
&lt;p&gt;Next? Another Python process: the &amp;#8220;networkd-dispatcher&amp;#8221; daemon (~&lt;span class="caps"&gt;17MB&lt;/span&gt;). If you
like your WiFi connection, leave this one alone! Next up, it&amp;#8217;s
&amp;#8220;systemd-journald&amp;#8221; (~&lt;span class="caps"&gt;12MB&lt;/span&gt;). That&amp;#8217;s also doing useful work, so we&amp;#8217;ll leave that
one alone&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;Then … &amp;#8220;ModemManager&amp;#8221;. Hang on? &lt;em&gt;Modem&lt;/em&gt; Manager? Am I back in the 90s?! Oh,
it&amp;#8217;s for &lt;span class="caps"&gt;GSM&lt;/span&gt; modems. Still, I&amp;#8217;m not actually using a &lt;span class="caps"&gt;GSM&lt;/span&gt; modem on this Pi so
why is that there? In fact, it&amp;#8217;s the subject of another ticket, &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/ubuntu-meta/+bug/1981109"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #1981109&lt;/a&gt;
(you may note it&amp;#8217;s another one filed by Steve, another colleague who has been
ruthlessly hunting down the cruft of late). Anyway, given the details in that
ticket this one can be safely excised (it&amp;#8217;s not even a real dependency, just a
&amp;#8220;recommendation&amp;#8221; of another&amp;nbsp;package)!&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;purge&lt;span class="w"&gt; &lt;/span&gt;modemmanager&lt;span class="w"&gt; &lt;/span&gt;--autoremove&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
  libtcl8.6* modemmanager* tcl* tcl8.6* usb-modeswitch* usb-modeswitch-data*
0 upgraded, 0 newly installed, 6 to remove and 0 not upgraded.
After this operation, 8595 kB disk space will be freed.
Do you want to continue? [Y/n]
&lt;/span&gt;&lt;span class="gp-VirtualEnv"&gt;(Reading database ... 100491 files and directories currently installed.)&lt;/span&gt;
&lt;span class="go"&gt;Removing usb-modeswitch (2.6.1-3ubuntu2) ...
Removing tcl (8.6.11+1build2) ...
Removing tcl8.6 (8.6.12+dfsg-1build1) ...
Removing libtcl8.6:arm64 (8.6.12+dfsg-1build1) ...
Removing modemmanager (1.18.6-1) ...
Unknown option: runtime
Removing usb-modeswitch-data (20191128-4) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for dbus (1.12.20-2ubuntu4) ...
Processing triggers for libc-bin (2.35-0ubuntu3) ...
&lt;/span&gt;&lt;span class="gp-VirtualEnv"&gt;(Reading database ... 100105 files and directories currently installed.)&lt;/span&gt;
&lt;span class="go"&gt;Purging configuration files for tcl8.6 (8.6.12+dfsg-1build1) ...
Purging configuration files for usb-modeswitch (2.6.1-3ubuntu2) ...
Purging configuration files for modemmanager (1.18.6-1) ...
Processing triggers for dbus (1.12.20-2ubuntu4) ...&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Next up, &amp;#8220;systemd-resolved&amp;#8221; (~&lt;span class="caps"&gt;12MB&lt;/span&gt;). We shouldn&amp;#8217;t touch that one (&lt;span class="caps"&gt;DNS&lt;/span&gt;
resolution and caching is generally&amp;nbsp;useful).&lt;/p&gt;
&lt;p&gt;Next? &amp;#8220;udisks2&amp;#8221; (~&lt;span class="caps"&gt;11MB&lt;/span&gt;). This is a useful service, handling things like
auto-mounting &lt;span class="caps"&gt;USB&lt;/span&gt; storage devices that have been inserted. However, I&amp;#8217;m not
going to be doing that on this Pi Zero 2W so I don&amp;#8217;t need it running all the
time. I&amp;#8217;m not going to uninstall it as it&amp;#8217;s potentially useful and, even after
disabling it (which will prevent it auto-starting), the &lt;tt class="docutils literal"&gt;udisksctl&lt;/tt&gt; command
can implicitly start it back up again, should I find I need&amp;nbsp;it.&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;udisks2&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;disable&lt;span class="w"&gt; &lt;/span&gt;udisks2&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;Removed /etc/systemd/system/graphical.target.wants/udisks2.service&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;At this point we&amp;#8217;re into diminishing returns so let&amp;#8217;s reboot to a clean start
and see what &lt;tt class="docutils literal"&gt;free&lt;/tt&gt; says&amp;nbsp;now.&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;... wait to get back to the login ...
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;free&lt;span class="w"&gt; &lt;/span&gt;-h&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;               total        used        free      shared  buff/cache   available
Mem:           414Mi       103Mi       165Mi       2.0Mi       146Mi       299Mi
Swap:             0B          0B          0B&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;That&amp;#8217;s looking better! Nearly &lt;span class="caps"&gt;300MB&lt;/span&gt; free now. Finally, another tweak we can use
to grab a bit more memory. This one is only useful if you have no intention of
using &lt;span class="caps"&gt;GPU&lt;/span&gt; functionality (no camera, no video decoding / encoding acceleration,
etc). However, I don&amp;#8217;t need any graphics on this particular Pi (in fact there
won&amp;#8217;t be any display plugged into it) so let&amp;#8217;s reduce the &lt;span class="caps"&gt;GPU&lt;/span&gt; memory split all
the way down to the minimum (&lt;span class="caps"&gt;16MB&lt;/span&gt;).&lt;/p&gt;
&lt;pre class="code console literal-block"&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gpu_mem=16&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/boot/firmware/config.txt&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;reboot&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;... wait to get back to the login ...
&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;free&lt;span class="w"&gt; &lt;/span&gt;-h&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;               total        used        free      shared  buff/cache   available
Mem:           462Mi       101Mi       214Mi       2.0Mi       146Mi       348Mi
Swap:             0B          0B          0B&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;And there we have it; over &lt;span class="caps"&gt;100MB&lt;/span&gt; extra available memory from our starting
point. Bear in mind we have disabled some functionality to achieve this, so
these aren&amp;#8217;t all changes that could (or should!) be made universally. However,
from the tickets we&amp;#8217;ve encountered along the way there&amp;#8217;s definitely some
improvements that can still be made in the base&amp;nbsp;image.&lt;/p&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="desktop"></category><category term="pi"></category><category term="jammy"></category></entry><entry><title>When HDMI freezes over</title><link href="https://waldorf.waveform.org.uk/2021/when-hdmi-freezes-over.html" rel="alternate"></link><published>2021-10-13T00:00:00+01:00</published><updated>2022-07-22T10:50:00+01:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2021-10-13:/2021/when-hdmi-freezes-over.html</id><summary type="html">&lt;p class="first last"&gt;On the teething pains of the Impish desktop release, and the joys of
owning old&amp;nbsp;monitors&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Well, it&amp;#8217;s time for another Ubuntu release, and so time for another slew of
blog posts from me! In this particular case though, I need to start with a mea
culpa on the state of the Ubuntu Desktop for Raspberry Pi&amp;nbsp;release.&lt;/p&gt;
&lt;div class="section" id="the-bug-the-bodge-and-the-deadline"&gt;
&lt;h2&gt;The bug, the bodge, and the&amp;nbsp;deadline&lt;/h2&gt;
&lt;p&gt;Shortly before release, a bug in &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/linux-raspi/+bug/1946368"&gt;&lt;span class="caps"&gt;HDMI&lt;/span&gt; output handling&lt;/a&gt; (initially part of
&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/linux-raspi/+bug/1944397"&gt;another bug&lt;/a&gt;) was discovered which vexed us right up to the release itself.
The symptoms ranged from the annoying (display output freezes after a certain
amount of use, usually a couple of hours in my case) to the critical (display
output freezes during boot, in the case of a&amp;nbsp;colleague).&lt;/p&gt;
&lt;p&gt;The determining factor eventually turned out to be something to do with high
refresh-rate monitors. With my eye-sight, I&amp;#8217;ve never wanted or needed anything
beyond good ol&amp;#8217; 1080p at 60Hz … and so that&amp;#8217;s what all my monitors are. But
&lt;a class="reference external" href="https://blogjawn.stufftoread.com/"&gt;younger colleagues&lt;/a&gt; (with better eye-sight) have fancier displays with higher
frame-rates and on these the issue was most definitely&amp;nbsp;critical.&lt;/p&gt;
&lt;p&gt;We quickly found a work-around (which is in the &lt;a class="reference external" href="https://discourse.ubuntu.com/t/impish-indri-release-notes/21951"&gt;release notes&lt;/a&gt;) which was
simply to replace the &amp;#8220;kms&amp;#8221; overlay in &lt;tt class="docutils literal"&gt;config.txt&lt;/tt&gt; with the &amp;#8220;fkms&amp;#8221; overlay,
but then the race was on to fix things before&amp;nbsp;release.&lt;/p&gt;
&lt;p&gt;The kernel team worked tirelessly to try and come up with a fix, but it quickly
became apparent this was an upstream issue too, and that it was unlikely we&amp;#8217;d
find a fix on our own. Eventually it was obvious that the bug was going to make
it into the release images, and so the debate switched to whether to release
with the fkms workaround in&amp;nbsp;place.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="to-bodge-or-not-to-bodge"&gt;
&lt;h2&gt;To bodge, or not to&amp;nbsp;bodge&lt;/h2&gt;
&lt;p&gt;As will be obvious to anyone who&amp;#8217;s tried the desktop release with a
high-refresh rate monitor, we released &lt;em&gt;without&lt;/em&gt; the workaround in place (and
that&amp;#8217;s the royal we, because ultimately this was &lt;em&gt;my&lt;/em&gt; decision so if you&amp;#8217;re
going to yell at anyone, yell at &lt;em&gt;me&lt;/em&gt; &amp;#8212; comments&amp;nbsp;below!).&lt;/p&gt;
&lt;p&gt;By way of (lengthy) explanation, here was my&amp;nbsp;reasoning:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;We have regular meetings with the Pi Foundation (or more precisely the
engineers at Raspberry Pi Trading Ltd. — just to appease Ben&amp;#8217;s nagging of my
constant conflation of these entities!). My understanding from these
meetings is the &amp;#8220;kms&amp;#8221; overlay is considered the &amp;#8220;future direction of
development&amp;#8221;. As such, it is under active development in the upstream&amp;nbsp;kernel.&lt;/li&gt;
&lt;li&gt;The &amp;#8220;fkms&amp;#8221; overlay is considered legacy, and while it is supported in the
kernel in use in Raspberry Pi &lt;span class="caps"&gt;OS&lt;/span&gt;, if it happens to break in the development
kernel (which is where the Ubuntu kernel patches are sourced from), that&amp;#8217;s&amp;nbsp;acceptable.&lt;/li&gt;
&lt;li&gt;We have a mechanism for modifying the boot configuration during a release
upgrade, but no such mechanism currently exists for kernel upgrades. The
modifications performed during release upgrades are &lt;em&gt;not&lt;/em&gt; perfect (there are
edge cases we cannot reasonably account for), but a release upgrade is a
sufficiently major operation that a certain amount of breakage might be
considered reasonable in the case of esoteric configurations. The same
cannot be said of kernel&amp;nbsp;upgrades.&lt;/li&gt;
&lt;li&gt;Other (minor) points against &amp;#8220;fkms&amp;#8221;: audio doesn&amp;#8217;t operate correctly
(choppy) under &amp;#8220;fkms&amp;#8221; without the &amp;#8220;tsched=0&amp;#8221; workaround, and video displays
screen-tearing. These are obviously non-critical, but it&amp;#8217;s a sub-par
experience compared to fixing &amp;#8220;kms&amp;#8221;&amp;nbsp;properly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To summarise: we could switch people to the &amp;#8220;fkms&amp;#8221; overlay during the impish
release upgrade (and obviously modify the release image to use &amp;#8220;fkms&amp;#8221; too) but
that would leave us in a position where a future kernel upgrade during the
release broke things (in fact, our testing with a few interim upstream kernels
suggested this was already the case), and there was no good mechanism for
fiddling with the boot configuration during a regular &lt;tt class="docutils literal"&gt;apt update&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;apt
upgrade&lt;/tt&gt; procedure.&lt;/p&gt;
&lt;p&gt;Alternatively, we could release with the &amp;#8220;kms&amp;#8221; overlay knowing full well that
would break badly on certain high-fps monitors, but with a release noted
work-around that wasn&amp;#8217;t &lt;em&gt;terribly&lt;/em&gt; complex (editing one line in a text file,
which was accessible on all platforms), and the hope that we could fix the
kernel in a (quickly released) update. Obviously this would still entail pain
for people having to use the workaround to even boot (in order to install such
an upgrade). But it would also mean that such people would have experience of
installing the workaround and thus would have little difficulty in removing it
themselves, without having to bodge a postinst script into the kernel to try
removing it (probably&amp;nbsp;imperfectly).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion …&amp;nbsp;?&lt;/h2&gt;
&lt;p&gt;As it turns out, we may have a fix quicker than I&amp;#8217;d hoped: as I write this
final section, I&amp;#8217;m just waiting on another &lt;span class="caps"&gt;SD&lt;/span&gt; card to flash to play with a
testing kernel which may fix at least part of the issue (I wasn&amp;#8217;t kidding when
I said the kernel team were working tirelessly on this!). There are also a
couple of patches that &lt;em&gt;appear&lt;/em&gt; to stabilize things completely, at least on my
old 1080p 60Hz&amp;nbsp;monitor.&lt;/p&gt;
&lt;p&gt;Anyway, to all those affected, all I can say for now is &amp;#8220;sorry&amp;#8221; that this
release isn&amp;#8217;t everything I&amp;#8217;d hoped it to be, and that the release includes
&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/linux-raspi/+bug/1946368"&gt;this issue&lt;/a&gt;. That&amp;#8217;s on me: I could&amp;#8217;ve made the call to switch to &amp;#8220;fkms&amp;#8221; for
the release, but I genuinely think that although this is obviously the more
painful course, it&amp;#8217;s the right one for a better experience in the&amp;nbsp;end.&lt;/p&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="pi"></category><category term="desktop"></category><category term="impish"></category></entry><entry><title>6 Months with the Pi Desktop</title><link href="https://waldorf.waveform.org.uk/2021/6-months-with-the-pi-desktop.html" rel="alternate"></link><published>2021-04-17T00:00:00+01:00</published><updated>2022-09-06T13:27:19+01:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2021-04-17:/2021/6-months-with-the-pi-desktop.html</id><summary type="html">&lt;p class="first last"&gt;A run-down of using a Pi as my only desktop for an entire release&amp;nbsp;cycle&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;: A look at the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2022/making-jammy-less-dodgy.html"&gt;Jammy desktop image&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In a deep movie trailer voice: &amp;#8220;&lt;a class="reference external" href="https://waldorf.waveform.org.uk/2020/a-week-with-the-pi-desktop.html"&gt;Previously on Dave&amp;#8217;s blog&lt;/a&gt;&amp;#8220;… &amp;#8220;Oh no! My &lt;span class="caps"&gt;PC&lt;/span&gt; is
no more! Whatever shall I do?!&amp;#8221; &amp;#8220;Oooh, a Pi 400&amp;nbsp;…&amp;#8221;&lt;/p&gt;
&lt;p&gt;Well, it&amp;#8217;s been about 6 months since I started &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food"&gt;dog-fooding&lt;/a&gt; the Ubuntu
desktop on a Raspberry Pi (and since I last managed to write a blog post …
ahem). I&amp;#8217;d originally intended to go back to using a big, fat, Watt-guzzling &lt;span class="caps"&gt;PC&lt;/span&gt;
as my main development machine at some point in this cycle. However, a
combination of global silicon shortages (if the damned crypto-miners could let
me buy a single decent graphics card that&amp;#8217;d be … nice?), and some major
improvements in the Pi desktop meant I wound up spending the &lt;em&gt;entire&lt;/em&gt; hirsute
cycle using the little Pi 400 as my primary&amp;nbsp;desktop.&lt;/p&gt;
&lt;div class="section" id="the-hippopotamus-in-the-room"&gt;
&lt;h2&gt;The Hippopotamus in the&amp;nbsp;Room&lt;/h2&gt;
&lt;p&gt;The biggest issue with this, as discussed in the previous installment, was
video playback. We didn&amp;#8217;t have video acceleration on the Ubuntu Desktop for Pi
and this meant that, at the start of the hirsute development cycle, I still had
to resort to my little laptop (a tiny Celeron powered thing) for video
conferencing. However, at some point (a couple of months ago? I forget the
precise timing as all sorts of work-arounds have been required at one stage or
another) things came together, the planets aligned, the Gods of the Desktop
smiled upon their lowly worshippers and Wayland+&lt;span class="caps"&gt;KMS&lt;/span&gt; started&amp;nbsp;working.&lt;/p&gt;
&lt;p&gt;Suddenly … things got &lt;em&gt;much&lt;/em&gt;&amp;nbsp;better.&lt;/p&gt;
&lt;p&gt;For the past several weeks I&amp;#8217;ve been using my little Pi 400 as my &lt;em&gt;sole&lt;/em&gt;
desktop. The laptop has been ditched entirely. &lt;span class="caps"&gt;HD&lt;/span&gt; YouTube playback works
happily. Video conferencing over Google Meet works perfectly (no Zoom, but
that&amp;#8217;s because there&amp;#8217;s no &lt;span class="caps"&gt;ARM&lt;/span&gt; builds of the client, ho hum), and the desktop
generally feels responsive and&amp;nbsp;slick.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s definitely &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1924251"&gt;a few kinks&lt;/a&gt; still to work out, but nothing show-stopping
that&amp;#8217;s made me dig the laptop out of storage or prevented me from Getting
Stuff&amp;nbsp;Done.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="making-hippos-fly"&gt;
&lt;h2&gt;Making Hippos&amp;nbsp;Fly&lt;/h2&gt;
&lt;img alt="A Pi 400 in front of a simple HDMI monitor with a Logitech C920 webcam attached, and a USB3 SSD resting on the base, surrounded by the typical junk on Dave's desk (myriad cables, a solder station, a spare keyboard for testing, random SD cards)" src="https://waldorf.waveform.org.uk/images/hairy-pi.jpg" /&gt;
&lt;p&gt;Above is a shot of my little desktop setup. Some optimizations to&amp;nbsp;note:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;I don&amp;#8217;t have a fancy monitor. It&amp;#8217;s bog-standard old 1080p &lt;span class="caps"&gt;HDMI&lt;/span&gt; thing.
Personally, I can&amp;#8217;t tell the difference between 1080p and 4K without
squinting through my glasses anyway, but from a performance perspective
having a 1080p monitor means no scaling is required to make the desktop
readable. 200% scaling is fast under Gnome, but the result is frankly too
big for my liking, and fractional scaling causes a noticeable performance
hit. Choose your screen&amp;nbsp;wisely!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Use the &lt;span class="caps"&gt;HDMI0&lt;/span&gt; port. On the Pi 4, it&amp;#8217;s next to the &lt;span class="caps"&gt;USB&lt;/span&gt;-C power port. On the
Pi 400, it&amp;#8217;s the one next to the &lt;span class="caps"&gt;SD&lt;/span&gt; card slot. In certain configurations,
audio playback through &lt;span class="caps"&gt;HDMI&lt;/span&gt; only works from &lt;span class="caps"&gt;HDMI0&lt;/span&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;It&amp;#8217;s booting off an &lt;span class="caps"&gt;SSD&lt;/span&gt; connected to one of the &lt;span class="caps"&gt;USB3&lt;/span&gt; ports (that little
black box sat on the base of the monitor). We introduced support for booting
Ubuntu over &lt;span class="caps"&gt;USB&lt;/span&gt; in groovy, and hirsute should work just as well. Simply
flash the image to your &lt;span class="caps"&gt;USB&lt;/span&gt; drive and you&amp;#8217;re good to go. But do note that
you may need to &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2020/installing-the-new-pi-ubuntu-desktop.html#usb-hdd-ssd"&gt;enable &lt;span class="caps"&gt;USB&lt;/span&gt; boot&lt;/a&gt; in your Pi&amp;#8217;s boot order first (this is
one-time setup so if your Pi can already boot off &lt;span class="caps"&gt;USB&lt;/span&gt;, you&amp;#8217;re good to&amp;nbsp;go).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;You can&amp;#8217;t attach a Pi Camera Module to the Pi 400, so I&amp;#8217;ve got an old
Logitech C920 attached to one of the &lt;span class="caps"&gt;USB&lt;/span&gt;&amp;nbsp;ports.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;The Pi 400 only has &lt;span class="caps"&gt;4GB&lt;/span&gt; of &lt;span class="caps"&gt;RAM&lt;/span&gt;. For lightweight desktops like &lt;span class="caps"&gt;LXDE&lt;/span&gt; this is
okay, but Gnome shell is quite a bit heavier. The Ubuntu Desktop image for
Pi does come with a &lt;span class="caps"&gt;1GB&lt;/span&gt; swap file but honestly you probably want to extend
this and I highly recommend using zswap (more on that&amp;nbsp;below).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;One advantage the Pi 400 &lt;em&gt;does&lt;/em&gt; have over the Pi 4 is it&amp;#8217;s &lt;em&gt;much&lt;/em&gt; better at
running cool. In turn, this means overclocking it is entirely viable even
without any active cooling. At present I have the following lines added to
my &lt;tt class="docutils literal"&gt;config.txt&lt;/tt&gt; file on the boot partition, and the Pi 400 has been
running with no heat / throttling issues for&amp;nbsp;months:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
arm_freq=2000
over_voltage=6
&lt;/pre&gt;
&lt;p&gt;You &lt;em&gt;might&lt;/em&gt; get away with these settings on a Pi 4, but you&amp;#8217;d likely want
some active cooling for that&amp;nbsp;setup.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="section" id="swap-swap-glorious-zswap"&gt;
&lt;h2&gt;Swap, swap, glorious&amp;nbsp;zswap!&lt;/h2&gt;
&lt;p&gt;As a rough rule of thumb, &lt;em&gt;all&lt;/em&gt; systems should have swap. It doesn&amp;#8217;t matter if
your machine is a beast with &lt;span class="caps"&gt;128GB&lt;/span&gt; of &lt;span class="caps"&gt;RAM&lt;/span&gt;, having &lt;em&gt;some&lt;/em&gt; swap (not much, just a
gig or two, say) is still useful as it permits the kernel to ditch pages that
are never (or extremely rarely) used and use the &lt;span class="caps"&gt;RAM&lt;/span&gt; saved for disk cache (and
there&amp;#8217;s no such thing as too much of&amp;nbsp;that!).&lt;/p&gt;
&lt;p&gt;However, on a Pi 400 running a hefty desktop environment under &lt;span class="caps"&gt;4GB&lt;/span&gt; of &lt;span class="caps"&gt;RAM&lt;/span&gt; it&amp;#8217;s
downright vital. As mentioned above, the images ship with a &lt;span class="caps"&gt;1GB&lt;/span&gt; swap file (some
may argue it would be preferable to create it on first boot, but it compresses
trivially in the image, and this ensures that when people flash it they
effectively &amp;#8220;reserve&amp;#8221; room for the necessary swap space). Ideally though
(unless you&amp;#8217;re on a beast like the Pi 4 &lt;span class="caps"&gt;8GB&lt;/span&gt; model), you probably want to expand
this to something a bit&amp;nbsp;bigger.&lt;/p&gt;
&lt;p&gt;This can be easily done from the command line but I&amp;#8217;d caution to do this when
you&amp;#8217;ve first booted the system and before you&amp;#8217;ve launched anything else as the
first step is to (temporarily) &lt;em&gt;disable&lt;/em&gt; the swap. The following commands will
add &lt;span class="caps"&gt;1GB&lt;/span&gt; of size to the default swap-file on the desktop&amp;nbsp;image:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ sudo swapoff /swapfile
$ sudo fallocate -l 2g /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
&lt;/pre&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;You could trivially add a second swap-file and this wouldn&amp;#8217;t necessitate
disabling the existing one, but that then means getting into editing the
&lt;tt class="docutils literal"&gt;/etc/fstab&lt;/tt&gt; file to add it and this is a bit easier to document. Use
whichever means you are comfortable with, but the important thing here is
that &lt;span class="caps"&gt;1GB&lt;/span&gt; of swap probably isn&amp;#8217;t quite enough on a system with &lt;span class="caps"&gt;4GB&lt;/span&gt; of &lt;span class="caps"&gt;RAM&lt;/span&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Next, I would highly recommend enabling &amp;#8220;&lt;a class="reference external" href="https://www.kernel.org/doc/html/latest/vm/zswap.html"&gt;zswap&lt;/a&gt;&amp;#8220;. This is one of several
forms of virtual memory compression provided by the Linux kernel. The other
commonly used one is &amp;#8220;&lt;a class="reference external" href="https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html"&gt;zram&lt;/a&gt;&amp;#8220;. I&amp;#8217;m not enough of an expert to opine on the
fine detail of these systems, but my rough rule of thumb is as&amp;nbsp;follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;If you have no swap-file at all, zram is preferable. It provides a pseudo
swap-file which is actually a compressed area of &lt;span class="caps"&gt;RAM&lt;/span&gt; and hence requires no
swap-file backing&amp;nbsp;it.&lt;/li&gt;
&lt;li&gt;However, if you have a swap-file, zswap is preferable. It acts as a
write-back cache for the swap-file and can in certain circumstances avoid
pages ever hitting the disk at&amp;nbsp;all.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&amp;#8217;t worry about the computational overhead of these systems. &lt;span class="caps"&gt;CPU&lt;/span&gt; speed and
memory bandwidth have grown considerably faster than bulk storage &lt;span class="caps"&gt;IO&lt;/span&gt; bandwidth
has. As a result, memory compression systems that (to some degree) prevent or
reduce disk &lt;span class="caps"&gt;IO&lt;/span&gt; are almost &lt;em&gt;always&lt;/em&gt; a&amp;nbsp;win.&lt;/p&gt;
&lt;p&gt;Anyway, because we definitely have a swap-file, we&amp;#8217;re going to use zswap here.
It&amp;#8217;s trivial to enable, but we&amp;#8217;re going to customize it a bit to get some more
out of it. To enable zswap you simply need to add the parameter
&lt;tt class="docutils literal"&gt;zswap.enabled=1&lt;/tt&gt; to your kernel command&amp;nbsp;line:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ sudo sed -i -e 's/$/ zswap.enabled=1/' /boot/firmware/cmdline.txt
&lt;/pre&gt;
&lt;p&gt;This is sufficient to enable zswap; if you were to reboot at this point it
would already be working. If you don&amp;#8217;t want to get into things that are a bit
more complex, then feel free to stop at this point &amp;#8212; you&amp;#8217;ll already have
plenty of&amp;nbsp;benefit.&lt;/p&gt;
&lt;p&gt;Still here? Okay, zswap&amp;#8217;s defaults are, if anything, a bit conservative. The
default allocator (zbud) is limited to 2 compressed objects per page. A
superior allocator (z3fold) permits 3 objects per page boosting the typical
compression ratio. Furthermore, the default compression algorithm is &amp;#8220;lzo&amp;#8221;
which is nice and fast, but doesn&amp;#8217;t provide &lt;em&gt;great&lt;/em&gt; compression. Other options
include &amp;#8220;lz4&amp;#8221;, &amp;#8220;lz4hc&amp;#8221; (&lt;span class="caps"&gt;LZ4&lt;/span&gt; with &amp;#8220;high compression&amp;#8221;), and &amp;#8220;zstd&amp;#8221;. Personally,
I&amp;#8217;ve gone for &amp;#8220;lz4&amp;#8221;; &amp;#8220;zstd&amp;#8221; is also tempting but remember we&amp;#8217;re balancing
compression with speed here, and despite zstd being better at compressing
things, lz4 is &lt;em&gt;very&lt;/em&gt;&amp;nbsp;fast.&lt;/p&gt;
&lt;p&gt;Unfortunately, we can&amp;#8217;t &amp;#8220;just&amp;#8221; enable these as we enabled zswap above. We need
to make sure that the modules for these features are included in the initramfs
at boot&amp;nbsp;time:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ sudo -i
# echo lz4 &amp;gt;&amp;gt; /etc/initramfs-tools/modules
# echo z3fold &amp;gt;&amp;gt; /etc/initramfs-tools/modules
# update-initramfs -u
&lt;/pre&gt;
&lt;p&gt;Then simply add some more parameters to your kernel command&amp;nbsp;line:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# sed -i -e 's/$/ zswap.compressor=lz4/' /boot/firmware/cmdline.txt
# sed -i -e 's/$/ zswap.zpool=z3fold/' /boot/firmware/cmdline.txt
&lt;/pre&gt;
&lt;p&gt;Now reboot and you should have your super-whizzy compressed &lt;span class="caps"&gt;RAM&lt;/span&gt; setup complete!
To check everything is set correctly (after rebooting) you can run the&amp;nbsp;following:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ grep -R . /sys/module/zswap/parameters
/sys/module/zswap/parameters/same_filled_pages_enabled:Y
/sys/module/zswap/parameters/enabled:Y
/sys/module/zswap/parameters/max_pool_percent:20
/sys/module/zswap/parameters/compressor:lz4
/sys/module/zswap/parameters/zpool:z3fold
/sys/module/zswap/parameters/accept_threshold_percent:90
&lt;/pre&gt;
&lt;p&gt;If things aren&amp;#8217;t right, have a look at &lt;tt class="docutils literal"&gt;/boot/firmware/cmdline.txt&lt;/tt&gt; in a text&amp;nbsp;editor.&lt;/p&gt;
&lt;p&gt;To see how zswap is&amp;nbsp;performing:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ sudo grep -R . /sys/kernel/debug/zswap
/sys/kernel/debug/zswap/same_filled_pages:3418
/sys/kernel/debug/zswap/stored_pages:242039
/sys/kernel/debug/zswap/pool_total_size:353652736
/sys/kernel/debug/zswap/duplicate_entry:0
/sys/kernel/debug/zswap/written_back_pages:0
/sys/kernel/debug/zswap/reject_compress_poor:368
/sys/kernel/debug/zswap/reject_kmemcache_fail:0
/sys/kernel/debug/zswap/reject_alloc_fail:0
/sys/kernel/debug/zswap/reject_reclaim_fail:0
/sys/kernel/debug/zswap/pool_limit_hit:0
&lt;/pre&gt;
&lt;p&gt;I&amp;#8217;ve even tried this on a Pi 4 &lt;span class="caps"&gt;2GB&lt;/span&gt; model and, while it&amp;#8217;s not as nice as a Pi
400 (in particular due to the SoC running hotter), it makes it a pretty viable
desktop at least for light usage. It was perfectly capable of firing up Firefox
and playing an &lt;span class="caps"&gt;HD&lt;/span&gt; YouTube video, while also running LibreOffice Writer, and a
terminal with vim, all on a $35 &lt;span class="caps"&gt;2GB&lt;/span&gt;&amp;nbsp;Pi!&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;I should note we don&amp;#8217;t officially support using the desktop image on a &lt;span class="caps"&gt;2GB&lt;/span&gt;
Pi, but personally I think this little optimization makes it a reasonable
platform for the Ubuntu&amp;nbsp;desktop.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Hirsute Hippo&amp;#8217;s due for release on April 22nd, and the &lt;a class="reference external" href="https://discourse.ubuntu.com/t/hirsute-hippo-release-notes/19221"&gt;release notes&lt;/a&gt; are
definitely worth a quick&amp;nbsp;peek.&lt;/p&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="pi"></category><category term="desktop"></category><category term="hirsute"></category></entry><entry><title>A Week with the Pi Desktop</title><link href="https://waldorf.waveform.org.uk/2020/a-week-with-the-pi-desktop.html" rel="alternate"></link><published>2020-10-22T00:00:00+01:00</published><updated>2022-09-06T13:27:19+01:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2020-10-22:/2020/a-week-with-the-pi-desktop.html</id><summary type="html">&lt;p class="first last"&gt;The ups and downs of a week using the Pi as my only&amp;nbsp;desktop&lt;/p&gt;
</summary><content type="html">&lt;p&gt;In a &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2020/installing-the-new-pi-ubuntu-desktop.html"&gt;previous post&lt;/a&gt; I mentioned I&amp;#8217;d be using a Pi as my exclusive desktop for
a week, mostly to validate that it actually worked (and that our guesstimate
that 4Gb &lt;span class="caps"&gt;RAM&lt;/span&gt; models were a reasonable &amp;#8220;base&amp;#8221;), but partly just for the&amp;nbsp;experience!&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a blow-by-blow account of how it went (there&amp;#8217;s a &lt;span class="caps"&gt;TL&lt;/span&gt;;&lt;span class="caps"&gt;DR&lt;/span&gt; at end if you
just want to scroll there&amp;nbsp;:)…&lt;/p&gt;
&lt;div class="section" id="monday"&gt;
&lt;h2&gt;Monday&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;d spent a few hours of the prior week setting up the system as I needed for
work so, come this morning, everything was pretty much as my desktop normally
is. Just on a&amp;nbsp;Pi.&lt;/p&gt;
&lt;img alt="The diminutive Raspberry Pi sat next to the empty hulk of my old PC" src="https://waldorf.waveform.org.uk/images/honey-i-shrunk-the-pc.jpg" /&gt;
&lt;p&gt;The Pi in question was a model 4B with 4Gb of &lt;span class="caps"&gt;RAM&lt;/span&gt;. It was booting off an
ancient 120Gb &lt;span class="caps"&gt;SSD&lt;/span&gt; I had lying around from an old &lt;span class="caps"&gt;PC&lt;/span&gt; (in that small black case
on the floor) and the eagle-eyed will note that there&amp;#8217;s absolutely no active
cooling or so much as a heat-sink installed on it in this picture. This is
deliberate: I was reasonably sure it was going to thermally throttle at some
point in the day, but I wanted to see how often that happened and how bad it
was in practice. In other words, trying to answer the question: is this usable
on an otherwise &amp;#8220;naked&amp;#8221;&amp;nbsp;Pi?&lt;/p&gt;
&lt;p&gt;Other than that, it was plugged into all the stuff I usually have plumbed into
my beefy (but aging, and now &lt;a class="reference external" href="https://twitter.com/waveform80/status/1312086341061050368"&gt;somewhat dead&lt;/a&gt;) Core&amp;nbsp;i7.&lt;/p&gt;
&lt;p&gt;First&amp;nbsp;tweaks:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Audio from rhythmbox was choppy. I&amp;#8217;d encountered this before and the hints
from the &amp;#8220;Audio&amp;#8221; section of my &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2020/ubuntu-desktops-on-the-pi.html"&gt;earlier notes&lt;/a&gt; on the Pi desktop soon sorted
this out. I&amp;#8217;ll see what we can do about fixing this in the final image but
given where it is I don&amp;#8217;t &lt;em&gt;think&lt;/em&gt; we can layer another file on top of it to
implement this just for the Pi. This will probably be something I just have
to stick in the release&amp;nbsp;notes.&lt;/li&gt;
&lt;li&gt;The wrong audio output device was always selected on boot (should be &amp;#8220;Analog
Output - Built-in Audio&amp;#8221;, but it was always &amp;#8220;Multichannel Output - Built-in
Audio&amp;#8221;). On a hunch, I tried disabling the &amp;#8220;module-switch-on-connect&amp;#8221; lines
in that same file (&lt;tt class="docutils literal"&gt;/etc/pulse/default.pa&lt;/tt&gt;) and the problem was solved,
although later I discovered this did mean that audio devices plugged into &lt;span class="caps"&gt;USB&lt;/span&gt;
weren&amp;#8217;t automatically selected. However, in my case, that&amp;#8217;s ideal as I didn&amp;#8217;t
&lt;em&gt;want&lt;/em&gt; them selected. Again, this may wind up being a release&amp;nbsp;note.&lt;/li&gt;
&lt;li&gt;No swap. Not an issue initially, but I figured I&amp;#8217;d be needing it sooner or
later so I set up a 1Gb swap file and some monitoring scripts to regularly
report things like system load, swap used, SoC temperature, etc. then added
them to my steadily growing tmux configuration. Will see what can be done
about fixing this for the&amp;nbsp;release.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first real test of the day: a meeting in Google Meet! I didn&amp;#8217;t have any
camera plumbed in at this point as I hadn&amp;#8217;t succeeded in getting the camera
module working properly with it yet, but I plugged in my nice &lt;span class="caps"&gt;USB&lt;/span&gt; microphone
(that&amp;#8217;s the &lt;span class="caps"&gt;USB&lt;/span&gt; audio device I mentioned above, which I don&amp;#8217;t want to use for
output, just input), fired up Chromium (installed from the snap-store) and
somewhat nervously&amp;nbsp;connected…&lt;/p&gt;
&lt;p&gt;My group were evidently feeling somewhat shy (!) and everyone had their camera
feed off, so it was just audio for this first challenge. Still, there were 5
people in the call so this was a reasonable first test. My audio apparently
worked perfectly, and I had no issues hearing anyone at my end. All pretty
smooth so&amp;nbsp;far!&lt;/p&gt;
&lt;p&gt;The Pi had been idling at ~60°C but that temperature slowly began to climb
during the call. Within about 10 minutes it was at the 78°C mark (the Pi 4
throttles at 80°C) and I was starting to get a bit nervous. It took quite a
while to get actually hit 80°C (maybe another 5 minutes) and at that point
there was an occasional drop-out from the audio when others were speaking but
otherwise the thermal throttling worked remarkably smoothly and everything
stayed connected and working! So far, so&amp;nbsp;good.&lt;/p&gt;
&lt;p&gt;After the call was over, I dove into some other work and wound up compiling a
couple of packages, writing up some notes and answering a few e-mails. The
compiling all went fine, no swapping, no throttling, but the e-mail… This
proved to be the next big challenge. Within minutes of firing up a GMail tab,
swap space was being eaten into. It really is quite the memory&amp;nbsp;hog!&lt;/p&gt;
&lt;p&gt;Next&amp;nbsp;tweaks:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;I activated &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Zswap"&gt;zswap&lt;/a&gt; (appended &lt;tt class="docutils literal"&gt;zswap.enabled=1&lt;/tt&gt; to
&lt;tt class="docutils literal"&gt;/boot/firmware/cmdline.txt&lt;/tt&gt;) to see if that alleviated the 50% of my 1Gb
swap space that&amp;#8217;d been eaten. It &lt;em&gt;seemed&lt;/em&gt; to (hovered around 20-30% after
loading everything back up after rebooting to check my config), but these
things are difficult to measure. &lt;span class="caps"&gt;YMMV&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, the next big challenge of the day. Another Google Meet call, but this time
one that usually had 10+ participants and was very likely to involve video
streams. I opted to try this one in Firefox instead (just to see if it would
work). Within a minute of connecting it was obvious the Pi was struggling; the
SoC temperature hit 80°C (the throttle point) within the first minute, and the
video streams were mostly frozen. That said, at all points audio from the call
was playing smoothly. With a fair bit of patience (very slow &lt;span class="caps"&gt;UI&lt;/span&gt;!), I disabled
the incoming video feeds so the Pi just had audio to deal&amp;nbsp;with.&lt;/p&gt;
&lt;p&gt;Then the next challenge: using a shared Google Doc in another tab with the call
still going. I was highly dubious the Pi would manage this given it was already
into thermal throttling and swapping but I opened the tab anyway. It wasn&amp;#8217;t
quick to load but to my amazement it worked! I could see others editing away
and could make a few edits myself. It wasn&amp;#8217;t smooth, it did have a fair bit of
cursor lag, but at all points the audio of the call kept playing mostly
smoothly (a few crackles here and there, but nothing to affect comprehension),
and I could actually work semi-productively. Remember, this was on the smallest
of the Pis supported, with no thermal management at all and no shutting down
anything I was already&amp;nbsp;running.&lt;/p&gt;
&lt;p&gt;Impressions at the end of the day: it&amp;#8217;s slightly uncanny. Several times during
the day I had to remind myself that I wasn&amp;#8217;t on Ammy (my old Core i7). To be
clear: I&amp;#8217;m not claiming they&amp;#8217;re in any way comparable on performance because
they&amp;#8217;re not. It&amp;#8217;s trivial to find something that shows a massive performance
difference (like Google Meet calls, or using GMail), but for most of the time,
playing some music in the background while I hacked away at something in vim
under a terminal window there was effectively no&amp;nbsp;difference.&lt;/p&gt;
&lt;p&gt;Then I&amp;#8217;d need to flash a fresh image onto an &lt;span class="caps"&gt;SD&lt;/span&gt; card to test something, and
suddenly I&amp;#8217;d find myself reaching down to stick the card in the flash-reader
that used to be in one of Ammy&amp;#8217;s 5.25&amp;#8221; bays and realize: nope, I&amp;#8217;m on the Pi,
and I need to use that nice little card-reader-slash-usb-hub I&amp;#8217;d stuck on the
desk&amp;nbsp;instead.&lt;/p&gt;
&lt;img alt="The neat little USB3 hub / card-reader / card writer on my desk" src="https://waldorf.waveform.org.uk/images/the-replacement-reader.jpg" /&gt;
&lt;p&gt;To my genuine surprise, there wasn&amp;#8217;t one thing the Pi &lt;em&gt;failed&lt;/em&gt; at all day. Bear
in mind this was an uncooled, more or less &amp;#8220;stock&amp;#8221; 4Gb Pi. Sure, the Google
Meet calls weren&amp;#8217;t great, and the GMail &lt;span class="caps"&gt;UI&lt;/span&gt; was hilariously laggy in some places
… but they worked! Nothing crashed, nothing hung, and I had a day about as
productive as any normal&amp;nbsp;day.&lt;/p&gt;
&lt;p&gt;If there&amp;#8217;s one major difference that I&amp;#8217;m just noticing it&amp;#8217;s that, as I write
this at 8 o&amp;#8217;clock in the evening, my fingers are&amp;nbsp;cold.&lt;/p&gt;
&lt;p&gt;This may not sound too surprising: my office is in an unheated loft extension,
it&amp;#8217;s mid-October, and I&amp;#8217;m in the North of the &lt;span class="caps"&gt;UK&lt;/span&gt;, so it&amp;#8217;s pretty chilly
outside. But normally Ammy, with her mammoth heat-sink, myriad fans, and
frankly silly graphics card, has done a pretty good job of keeping things
toasty and warm up here. She&amp;#8217;s usually more than capable of raising the
temperature in this room up to 30°C (in summer, things get ridiculously hot up
here!). But the Pi has nothing like that thermal output. I might have to get
some&amp;nbsp;gloves…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="tuesday"&gt;
&lt;h2&gt;Tuesday&lt;/h2&gt;
&lt;p&gt;Played around a bit with the configuration today to test some extra&amp;nbsp;interfaces:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Unplugged my usual Microsoft Intellimouse and tried out a bluetooth-based
mouse instead. After some considerable pain getting it paired (which may be
because it was previously paired to another machine), it&amp;#8217;s working&amp;nbsp;happily.&lt;/li&gt;
&lt;li&gt;Paired the Pi with my mobile phone and tried out bluetooth-based tethering.
Totally uneventful: just&amp;nbsp;worked.&lt;/li&gt;
&lt;li&gt;Also fitted a &lt;a class="reference external" href="https://shop.pimoroni.com/products/fan-shim#show-accessories"&gt;Pimoroni fan-shim&lt;/a&gt; to see what difference that made.
Thankfully since this image doesn&amp;#8217;t have U-Boot there were no problems with
the fan-shim &lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/u-boot/+bug/1873520"&gt;interrupting it&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To configure the temperature limit on the fan-shim, I simply added the
following line to &lt;tt class="docutils literal"&gt;/boot/firmware/config.txt&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;
dtoverlay=gpio-fan,gpiopin=18,temp=65000
&lt;/pre&gt;
&lt;p&gt;The only thing that brought the Pi into throttling territory yesterday were the
calls in Google Meet, so I was interested to see what difference that made
today. For the first call of the day there were only a few people with cameras
on, but that was enough to quickly push the Pi&amp;#8217;s temperature&amp;nbsp;up.&lt;/p&gt;
&lt;p&gt;Sure enough, the fan-shim kept things nicely below 65°C throughout the call.
However, while this meant the audio was perfect throughout, I still wound up
having to switch off most of the incoming video streams to keep things
operating smoothly (Google Meet has a nice option to show a single standard-def
stream at a time which seemed to work well). On this call, I was still audio&amp;nbsp;only.&lt;/p&gt;
&lt;p&gt;Then it was back to some compiling and documentation work, no problems here and
everything went&amp;nbsp;smoothly.&lt;/p&gt;
&lt;p&gt;Next call: at this point while I&amp;#8217;d managed to get a camera module installed,
there was a problem in that the cable isn&amp;#8217;t that long and I didn&amp;#8217;t think people
would particularly enjoy a view from &lt;em&gt;under&lt;/em&gt; my desk (ahem). So, instead I
plugged in the &lt;span class="caps"&gt;USB&lt;/span&gt; web-cam that normally sits on my monitor. I knew this was
likely to give the Pi a hard time as &lt;span class="caps"&gt;USB&lt;/span&gt; web-cams typically chuck out an &lt;span class="caps"&gt;MJPEG&lt;/span&gt;
stream and it would be up to Chromium to convert that to &lt;span class="caps"&gt;VP8&lt;/span&gt; (or &lt;span class="caps"&gt;VP9&lt;/span&gt;?) which it
wouldn&amp;#8217;t use the &lt;span class="caps"&gt;GPU&lt;/span&gt; for. Sure enough, within a few seconds of connecting it
was obvious the Pi was struggling (apparently my audio was choppy and dropping
out), so I disabled my video feed and carried on as&amp;nbsp;normal.&lt;/p&gt;
&lt;p&gt;Finally: needed to modify some bits in &lt;span class="caps"&gt;JIRA&lt;/span&gt; (which we use for organizing the
team&amp;#8217;s work). &lt;span class="caps"&gt;JIRA&lt;/span&gt; was &amp;#8230; hilariously slow. Nearly a full minute to just load
the web-page. That said, &lt;span class="caps"&gt;JIRA&lt;/span&gt; is hilariously, painfully, slow on just about
anything I&amp;#8217;ve used (including Ammy) so I shouldn&amp;#8217;t be surprised there. It was
useable with a good dose of patience, but I&amp;#8217;m thankful it&amp;#8217;s not something I
spend all my time in (can&amp;#8217;t see my boss using it with a Pi&amp;nbsp;:).&lt;/p&gt;
&lt;p&gt;Verdict for the day: bluetooth was fine; the fan-shim is probably worthwhile
for heavy workloads; &lt;span class="caps"&gt;USB&lt;/span&gt; web-cams are not going to be happy on video calls -
use a camera module if at all possible (though cable length may be an&amp;nbsp;issue).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="wednesday"&gt;
&lt;h2&gt;Wednesday&lt;/h2&gt;
&lt;p&gt;Switched up to a Pi4 8Gb today. I was satisfied with the 4Gb&amp;#8217;s performance with
a decent dose of swap-file but was now interested in whether the 8Gb would swap
at all and whether the (hypothetical) lack of swap would lead to any serious
performance&amp;nbsp;difference.&lt;/p&gt;
&lt;img alt="The 8Gb Pi 4 with Pimoroni Fan-Shim installed" src="https://waldorf.waveform.org.uk/images/kermit.jpg" /&gt;
&lt;p&gt;I transferred the fan-shim to this Pi so I could compare &lt;em&gt;just&lt;/em&gt; the difference
in &lt;span class="caps"&gt;RAM&lt;/span&gt; rather than anything else. Everything else was just unplugged from the
old Pi and plugged into the new Pi. This is one of the things I love about the
Pi: transferring all your storage between them is trivial (whether &lt;span class="caps"&gt;SD&lt;/span&gt; card or
&lt;span class="caps"&gt;USB&lt;/span&gt; hard-drive based, it&amp;#8217;s a lot easier than messing around inside a &lt;span class="caps"&gt;PC&lt;/span&gt;&amp;nbsp;tower!).&lt;/p&gt;
&lt;p&gt;There was some small faff getting the &lt;span class="caps"&gt;EEPROM&lt;/span&gt; &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2020/installing-the-new-pi-ubuntu-desktop.html"&gt;configured to handle &lt;span class="caps"&gt;USB&lt;/span&gt; boot&lt;/a&gt;,
but I had an &lt;span class="caps"&gt;SD&lt;/span&gt; card already setup to deal with that so it didn&amp;#8217;t take more
than a minute or two, then we were&amp;nbsp;off.&lt;/p&gt;
&lt;p&gt;The day was frankly uneventful. The usual mix of meets, compiling, emailing,
etc. Only one thing of note really: no swapping. With a judicious set of &lt;span class="caps"&gt;JIRA&lt;/span&gt;,
Gmail, and other hogs open I did manage to push the Pi to ~70% &lt;span class="caps"&gt;RAM&lt;/span&gt; usage but
never managed to get it to actually swap (beyond trivial&amp;nbsp;levels).&lt;/p&gt;
&lt;p&gt;However, I can&amp;#8217;t claim I actually noticed any performance difference. It felt
pretty much exactly the same as the 4Gb model - the only difference being that
I could see the swap monitor sat resolutely at zero all&amp;nbsp;day.&lt;/p&gt;
&lt;p&gt;Verdict for the day: the 8Gb is certainly a technical improvement, and for some
that extra memory may be crucial (especially if you&amp;#8217;re heavily into
containers). Personally, I could live happily with a 4Gb plus some swap.
Incidentally, even on an 8Gb I&amp;#8217;d still keep some swap (say, 1Gb) around.
The myths surrounding things being faster without swap are generally just that:
&lt;a class="reference external" href="https://chrisdown.name/2018/01/02/in-defence-of-swap.html"&gt;myths&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="thursday"&gt;
&lt;h2&gt;Thursday&lt;/h2&gt;
&lt;p&gt;Still on the Pi4 8Gb today. I did cheat on my Google Meet calls today, and used
my little laptop instead, largely because I knew one of the calls was going to
involve screen-sharing and at this point I was pretty confident I knew the Pi&amp;#8217;s
limits and that I couldn&amp;#8217;t smoothly deal with that, and ~10 people on the call
too (on Google Meet, if you opt for &amp;#8220;Audio only&amp;#8221; it really means that and
doesn&amp;#8217;t permit screen-sharing; unsurprising but slightly annoying&amp;nbsp;today).&lt;/p&gt;
&lt;p&gt;Come the evening I had to &amp;#8220;cheat&amp;#8221; on another meeting call but for different
reasons. I was due to give a quick talk for the Python North West group, which
was using Zoom and, about 30 minutes before I was due to connect, discovered
there&amp;#8217;s no Zoom client for &lt;span class="caps"&gt;ARM&lt;/span&gt;. I wouldn&amp;#8217;t have minded going audio-only for
this one - I didn&amp;#8217;t have any slides, just a few notes for a quick 10 minute
segment. Still, it was back to the laptop&amp;nbsp;again.&lt;/p&gt;
&lt;p&gt;Everything else was basically&amp;nbsp;uneventful:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Needed to do some printing for my kid (colour laser printer on the network);
worked without a hitch as it usually did on&amp;nbsp;Ammy&lt;/li&gt;
&lt;li&gt;Needed to scan some pages for my partner (&lt;span class="caps"&gt;USB&lt;/span&gt; connected scanner); also worked
without a&amp;nbsp;hitch&lt;/li&gt;
&lt;li&gt;Did some quick image tweaks in Gimp (for this post!) with my partner&amp;#8217;s Wacom
tablet. No problems there either (just plug&amp;#8217;n&amp;#8217;play), though I&amp;#8217;m pretty sure
the extra &lt;span class="caps"&gt;RAM&lt;/span&gt; of the 8Gb model&amp;nbsp;helped&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Slight hassle plugging and unplugging all these &lt;span class="caps"&gt;USB&lt;/span&gt; things, but necessary. The
Pi&amp;#8217;s power supply isn&amp;#8217;t a 750W beast like Ammy&amp;#8217;s and doesn&amp;#8217;t like having &lt;em&gt;all&lt;/em&gt;
my &lt;span class="caps"&gt;USB&lt;/span&gt; gadgets plugged in at once. Further, given I&amp;#8217;m also &lt;em&gt;booting&lt;/em&gt; off a &lt;span class="caps"&gt;USB&lt;/span&gt;
attached device it&amp;#8217;d be ill-advised to try and starve that of power! Might be
time to invest in a powered &lt;span class="caps"&gt;USB&lt;/span&gt;&amp;nbsp;hub…&lt;/p&gt;
&lt;p&gt;Verdict for the day: if &lt;em&gt;only&lt;/em&gt; Chromium could use the &lt;span class="caps"&gt;GPU&lt;/span&gt; for video encode and
decode here. We&amp;#8217;ll have to see what can be done about that (this is easier said
than done; I have some inkling of what the Pi Foundation have gone through to
get &lt;span class="caps"&gt;GPU&lt;/span&gt; decode into their version of Chromium, and it&amp;#8217;s&amp;nbsp;non-trivial).&lt;/p&gt;
&lt;p&gt;Also, more stuff needs compiling for &lt;span class="caps"&gt;ARM&lt;/span&gt;. After the lack-of-Zoom-client
discovery I went checking around for a few things. There&amp;#8217;s no Chrome for &lt;span class="caps"&gt;ARM&lt;/span&gt;
(well, outside of Chromebooks, so it&amp;#8217;s obviously &lt;em&gt;possible&lt;/em&gt;), no Zoom (as noted
already), and no Skype. Signal and Telegram are available, but there&amp;#8217;s
definitely some prodding to be done&amp;nbsp;here…&lt;/p&gt;
&lt;p&gt;Side note: it was amusing to note the number of sites that happily offered me
an amd64&amp;nbsp;deb!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="friday"&gt;
&lt;h2&gt;Friday&lt;/h2&gt;
&lt;p&gt;Still on the Pi4 8Gb. Cheated on the Google Meet calls again with the laptop
because, well, I might as well at this point. Everything else still on the Pi4,
and uneventful. Watched a few YouTube videos; slightly jerky startup for the
first second, and then played entirely smoothly while I was still working in
another&amp;nbsp;window.&lt;/p&gt;
&lt;p&gt;Looks like it&amp;#8217;s happy dealing with 1 video stream (even with it just doing &lt;span class="caps"&gt;CPU&lt;/span&gt;
decoding), but pushing it to do more than that (e.g. during conferencing) isn&amp;#8217;t
viable without hardware&amp;nbsp;acceleration.&lt;/p&gt;
&lt;p&gt;Wound up doing some work in the evening on the piwheels website. The Firefox
and Chromium developer tools are certainly a bit sluggish, but still useable.
Once used to the slower refresh rate, it didn&amp;#8217;t slow me&amp;nbsp;down.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="tl-dr-conclusion"&gt;
&lt;h2&gt;&lt;span class="caps"&gt;TL&lt;/span&gt;;&lt;span class="caps"&gt;DR&lt;/span&gt; /&amp;nbsp;Conclusion&lt;/h2&gt;
&lt;img alt="A collection of windows on the Ubuntu 20.10 Desktop running on the pi" src="https://waldorf.waveform.org.uk/images/desktop-screenshot.png" /&gt;
&lt;p&gt;It&amp;#8217;s &lt;em&gt;so&lt;/em&gt; close to being a fully viable desktop replacement. The thing holding
it back for me is video acceleration on Google Meet calls. If we had that, I
could effectively switch to using this for the vast majority of my work, firing
up the big &lt;span class="caps"&gt;PC&lt;/span&gt; (when it&amp;#8217;s fixed :) only for seriously heavy duty things like
video editing, or &lt;span class="caps"&gt;PC&lt;/span&gt; gaming, which are pretty rare activities for me, and which
it really wouldn&amp;#8217;t be realistic to expect a Pi to&amp;nbsp;accomplish.&lt;/p&gt;
&lt;p&gt;For others? Very much depends on typical uses and software. If you need Skype
or Zoom, for instance, you&amp;#8217;ll be stuck using the web-based versions (which&amp;#8217;ll
have the same issues as I did with Google Meet) because there&amp;#8217;s no &lt;span class="caps"&gt;ARM&lt;/span&gt; compiled
native clients (yet). But if you don&amp;#8217;t need video conferencing (okay, that&amp;#8217;s
probably a fairly major ask in the midst of a pandemic where everyone in front
of a computer is probably home-working), it&amp;#8217;s a capable&amp;nbsp;replacement.&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t go expecting Ryzen-like performance because you&amp;#8217;re not going to get it …
obviously. But I&amp;#8217;d hardly call it sluggish either. Running off a &lt;span class="caps"&gt;USB&lt;/span&gt;-attached
&lt;span class="caps"&gt;SSD&lt;/span&gt; everything starts up quickly and runs pretty smoothly. I was also impressed
that, even on the 4Gb model, despite it eating into swap a bit, nothing ever
felt like it was overwhelming the system. Though you might want to invest in a
powered &lt;span class="caps"&gt;USB&lt;/span&gt;-hub!&lt;/p&gt;
&lt;p&gt;Finally, for all the talk of the Pi 4 &amp;#8220;running hot&amp;#8221;, I only ever &lt;em&gt;needed&lt;/em&gt; the
fan-shim for video conferencing. My other workloads failed to push it into
thermal throttling (though a few got close). The board certainly gets toasty,
but it&amp;#8217;s nothing like the small fan heater that Ammy was. If only it could heat
my fingers up a&amp;nbsp;bit!&lt;/p&gt;
&lt;p&gt;Final note: any issues we haven&amp;#8217;t sorted out by release, with any known
workarounds, should be mentioned in the &lt;a class="reference external" href="https://discourse.ubuntu.com/t/groovy-gorilla-release-notes/15533"&gt;Groovy Release Notes&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="pi"></category><category term="desktop"></category><category term="groovy"></category></entry><entry><title>Installing the new Pi Ubuntu Desktop</title><link href="https://waldorf.waveform.org.uk/2020/installing-the-new-pi-ubuntu-desktop.html" rel="alternate"></link><published>2020-10-12T00:00:00+01:00</published><updated>2021-04-15T23:15:01+01:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2020-10-12:/2020/installing-the-new-pi-ubuntu-desktop.html</id><summary type="html">&lt;p class="first last"&gt;Installing the official Ubuntu desktop for the Raspberry&amp;nbsp;Pi&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Now that Martin&amp;#8217;s &lt;a class="reference external" href="https://twitter.com/m_wimpress/status/1314315931468914689"&gt;given the game away&lt;/a&gt; on Twitter, it&amp;#8217;s probably a good idea
for me to post a quick guide on installing the new Ubuntu Desktop for the Pi on
various media. So, here&amp;nbsp;goes!&lt;/p&gt;
&lt;div class="section" id="stuff-you-ll-need"&gt;
&lt;h2&gt;Stuff you&amp;#8217;ll&amp;nbsp;need&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;A Raspberry Pi Model 4B with 4Gb of &lt;span class="caps"&gt;RAM&lt;/span&gt; or higher. Theoretically, the desktop
can run on less but we&amp;#8217;re only officially supporting it on these models
because with less than 4Gb of &lt;span class="caps"&gt;RAM&lt;/span&gt; it&amp;#8217;s not a particularly &amp;#8220;useful&amp;#8221;&amp;nbsp;experience!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;The &lt;a class="reference external" href="https://www.raspberrypi.org/downloads/"&gt;Raspberry Pi Imager&lt;/a&gt; tool for whatever platform you&amp;#8217;re&amp;nbsp;on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;The Ubuntu Desktop for Raspberry Pi image, for now anyway. Once Groovy&amp;#8217;s
released it&amp;#8217;ll just appear in the menu in the imager tool, but for now you
can grab the pre-release beta&amp;nbsp;from:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://cdimage.ubuntu.com/ubuntu/daily-preinstalled/current/"&gt;http://cdimage.ubuntu.com/ubuntu/daily-preinstalled/current/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You need the &lt;a class="reference external" href="http://cdimage.ubuntu.com/ubuntu/daily-preinstalled/current/groovy-preinstalled-desktop-arm64+raspi.img.xz"&gt;groovy-preinstalled-desktop-arm64+raspi.img.xz&lt;/a&gt; image from
there. You may note there&amp;#8217;s no armhf image and the simple reason for that is
we&amp;#8217;re not providing one at this time; it&amp;#8217;s arm64&amp;nbsp;only.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, continue with one of the sections&amp;nbsp;below&amp;#8230;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sd-card"&gt;
&lt;h2&gt;&lt;span class="caps"&gt;SD&lt;/span&gt;&amp;nbsp;Card&lt;/h2&gt;
&lt;p&gt;To install on an &lt;span class="caps"&gt;SD&lt;/span&gt; card is pretty much simplicity&amp;nbsp;itself:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Start the Imager&amp;nbsp;Tool&lt;/li&gt;
&lt;li&gt;Click &amp;#8220;Choose &lt;span class="caps"&gt;OS&lt;/span&gt;&amp;#8221;, select &amp;#8220;Use custom&amp;#8221;, and select the file you downloaded
earlier; you don&amp;#8217;t need to decompress it (after release you&amp;#8217;ll be able to
pick an entry under&amp;nbsp;&amp;#8220;Ubuntu&amp;#8221;)&lt;/li&gt;
&lt;li&gt;Click &amp;#8220;Choose &lt;span class="caps"&gt;SD&lt;/span&gt; Card&amp;#8221;, select the card you want to&amp;nbsp;flash&lt;/li&gt;
&lt;li&gt;Click&amp;nbsp;&amp;#8220;Write&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;
&lt;img alt="A preview of the Raspberry Pi Imager utility flashing a card" src="https://waldorf.waveform.org.uk/images/imager4.png" /&gt;
&lt;p&gt;Then you can boot the card on your Pi&amp;nbsp;4.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="usb-hdd-ssd"&gt;
&lt;h2&gt;&lt;span class="caps"&gt;USB&lt;/span&gt; &lt;span class="caps"&gt;HDD&lt;/span&gt; / &lt;span class="caps"&gt;SSD&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;In Groovy we&amp;#8217;re (finally!) adding support for booting Ubuntu directly from a
&lt;span class="caps"&gt;USB&lt;/span&gt; attached hard-drive or &lt;span class="caps"&gt;SSD&lt;/span&gt; with no &lt;span class="caps"&gt;SSD&lt;/span&gt; card involved. The first thing to
ensure is that you&amp;#8217;ve got an up to date &lt;span class="caps"&gt;EEPROM&lt;/span&gt; version on your Pi 4 (as &lt;span class="caps"&gt;USB&lt;/span&gt;
booting was added after the Pi 4&amp;#8217;s release). This is easy enough to accomplish
under either Raspbian or&amp;nbsp;Ubuntu:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;sudo apt install &lt;span class="pre"&gt;rpi-eeprom&lt;/span&gt;&lt;/tt&gt; - only strictly necessary on Ubuntu as it&amp;#8217;s
installed by default on Raspbian, but it won&amp;#8217;t do any harm&amp;nbsp;there&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;sudo vcgencmd bootloader_config &amp;gt; bootconf.txt&lt;/tt&gt; - extract the current
bootloader configuration to a text&amp;nbsp;file&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;sed &lt;span class="pre"&gt;-i&lt;/span&gt; &lt;span class="pre"&gt;-e&lt;/span&gt; &lt;span class="pre"&gt;'/^BOOT_ORDER=/&lt;/span&gt; &lt;span class="pre"&gt;s/=.*$/=0xf41/'&lt;/span&gt; bootconf.txt&lt;/tt&gt; - set the
BOOT_ORDER option to 0xf41 (meaning attempt &lt;span class="caps"&gt;SD&lt;/span&gt; card, then &lt;span class="caps"&gt;USB&lt;/span&gt; mass-storage
device, then repeat; see &lt;a class="reference external" href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md"&gt;pi4 bootloader configuration&lt;/a&gt; for more
information). Alternatively &lt;tt class="docutils literal"&gt;vim bootconf.txt&lt;/tt&gt; and make the edits yourself
if you don&amp;#8217;t trust my sed-hacking&amp;nbsp;:)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;rpi-eeprom-config&lt;/span&gt; &lt;span class="pre"&gt;--out&lt;/span&gt; &lt;span class="pre"&gt;pieeprom-new.bin&lt;/span&gt; &lt;span class="pre"&gt;--config&lt;/span&gt; bootconf.txt &lt;span class="pre"&gt;/lib/firmware/raspberrypi/bootloader/critical/pieeprom-2020-09-03.bin&lt;/span&gt;&lt;/tt&gt; -
generate a copy of the &lt;span class="caps"&gt;EEPROM&lt;/span&gt; with the updated&amp;nbsp;configuration&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;sudo &lt;span class="pre"&gt;rpi-eeprom-update&lt;/span&gt; &lt;span class="pre"&gt;-d&lt;/span&gt; &lt;span class="pre"&gt;-f&lt;/span&gt; &lt;span class="pre"&gt;./pieeprom-new.bin&lt;/span&gt;&lt;/tt&gt; - set the system to flash
the new &lt;span class="caps"&gt;EEPROM&lt;/span&gt; firmware on the next&amp;nbsp;boot&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;sudo reboot&lt;/tt&gt; - to apply any changes (the &lt;span class="caps"&gt;EEPROM&lt;/span&gt; is only updated during the
early stages of&amp;nbsp;boot)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;Don&amp;#8217;t worry about having to do this on every &lt;span class="caps"&gt;EEPROM&lt;/span&gt; upgrade because you
don&amp;#8217;t have to. Each &lt;span class="caps"&gt;EEPROM&lt;/span&gt; upgrade extracts the current &lt;span class="caps"&gt;EEPROM&lt;/span&gt;
configuration and merges it with the updated &lt;span class="caps"&gt;EEPROM&lt;/span&gt; binary before flashing&amp;nbsp;it.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Now that the &lt;span class="caps"&gt;EEPROM&lt;/span&gt;&amp;#8217;s dealt with, how do we get the image onto a hard&amp;nbsp;drive?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Read the &lt;span class="caps"&gt;SD&lt;/span&gt; Card instructions&amp;nbsp;above&lt;/li&gt;
&lt;li&gt;Pretend your &lt;span class="caps"&gt;USB&lt;/span&gt;-attached hard-drive is a very fat &lt;span class="caps"&gt;SD&lt;/span&gt; card and just select it
instead when you click on &amp;#8220;Choose &lt;span class="caps"&gt;SD&lt;/span&gt;&amp;nbsp;Card&amp;#8221;&lt;/li&gt;
&lt;li&gt;erm &amp;#8230; that&amp;#8217;s&amp;nbsp;it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You should now be able to boot your flashed drive on your Pi 4 off your
&lt;span class="caps"&gt;USB&lt;/span&gt;-attached hard-drive without any &lt;span class="caps"&gt;SD&lt;/span&gt; card inserted. Be aware that some drives
have issues being used to boot the Pi. In&amp;nbsp;particular:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Spinning hard-disks required a lot more power than SSDs and will very likely
required a &lt;em&gt;powered&lt;/em&gt; &lt;span class="caps"&gt;USB&lt;/span&gt; hub. If you have a stonkingly huge hard-drive, see
the next section&amp;nbsp;too&amp;#8230;&lt;/li&gt;
&lt;li&gt;Hubs themselves can cause compatibility issues, so frankly you&amp;#8217;re much better
off with an &lt;span class="caps"&gt;SSD&lt;/span&gt; to boot off (typically no need for a hub and no spin-up time&amp;nbsp;issues).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;#8217;s lots of good information on both the Pi forums and various GitHub
issues for debugging boot issues; here&amp;#8217;s a selection of links in a rough &amp;#8220;look
at this first&amp;#8221;&amp;nbsp;order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.raspberrypi.org/forums/viewtopic.php?t=58151"&gt;Pi Forums: Is your Pi not&amp;nbsp;booting?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.raspberrypi.org/forums/viewtopic.php?f=63&amp;amp;t=277007"&gt;Pi Forums: &lt;span class="caps"&gt;USB&lt;/span&gt; &lt;span class="caps"&gt;MSD&lt;/span&gt; boot &lt;span class="caps"&gt;EEPROM&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.raspberrypi.org/forums/viewtopic.php?t=245931"&gt;Pi Forums: Pi 4 &lt;span class="caps"&gt;USB3&lt;/span&gt; &lt;span class="caps"&gt;SSD&lt;/span&gt; slow&amp;nbsp;speeds?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md"&gt;Pi Docs: Pi 4 Bootloader&amp;nbsp;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/raspberrypi/rpi-eeprom/issues/180"&gt;GitHub Issue: Enclosure doesn&amp;#8217;t power on after&amp;nbsp;reboot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="stonkingly-huge-hdd-ssd"&gt;
&lt;h2&gt;Stonkingly huge &lt;span class="caps"&gt;HDD&lt;/span&gt; / &lt;span class="caps"&gt;SSD&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;What if you have a hard-drive larger than 2Tb (or &lt;span class="caps"&gt;SSD&lt;/span&gt; if you&amp;#8217;re richer than
Croesus) and want to actually use all that space? The default &lt;span class="caps"&gt;MBR&lt;/span&gt; partitioning
on the image won&amp;#8217;t be much use as it can&amp;#8217;t address anything beyond 2Tb.
Thankfully, the Pi&amp;#8217;s bootloader now supports &lt;span class="caps"&gt;GPT&lt;/span&gt; partitioning too so this isn&amp;#8217;t
a big deal and just requires a minor tweak to the partition&amp;nbsp;table.&lt;/p&gt;
&lt;p&gt;The following instructions are Linux-specific. I&amp;#8217;m sure it&amp;#8217;s possible to do
this on Windows and Mac &lt;span class="caps"&gt;OS&lt;/span&gt; too, but you&amp;#8217;ll have to Google that if you need it.
I would advise doing this with the drive attached to another machine (i.e. when
you&amp;#8217;re not booted from it). It &lt;em&gt;might&lt;/em&gt; be possible to do this on a &amp;#8220;live&amp;#8221;
system, but I haven&amp;#8217;t tried that so &lt;span class="caps"&gt;YMMV&lt;/span&gt;!&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;sudo apt install gdisk&lt;/tt&gt; - just to make sure you&amp;#8217;ve got gdisk (the &lt;span class="caps"&gt;GPT&lt;/span&gt;
partitioning tool)&amp;nbsp;installed&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;sudo gdisk /dev/sdX&lt;/tt&gt; - where sdX is whatever your hard-drive is called
(consult the end of &lt;tt class="docutils literal"&gt;dmesg&lt;/tt&gt; for a&amp;nbsp;hint)&lt;/li&gt;
&lt;li&gt;If gdisk complains about a valid &lt;span class="caps"&gt;MBR&lt;/span&gt; and a corrupt &lt;span class="caps"&gt;GPT&lt;/span&gt;, don&amp;#8217;t worry (this can
happen when re-imaging drives that&amp;#8217;ve had a &lt;span class="caps"&gt;GPT&lt;/span&gt; partition table before). Just
select &lt;tt class="docutils literal"&gt;1&lt;/tt&gt; to use the valid &lt;span class="caps"&gt;MBR&lt;/span&gt; and&amp;nbsp;continue&lt;/li&gt;
&lt;li&gt;gdisk should&amp;#8217;ve converted your &lt;span class="caps"&gt;MBR&lt;/span&gt; partition table to &lt;span class="caps"&gt;GPT&lt;/span&gt; in &lt;span class="caps"&gt;RAM&lt;/span&gt; (not written
to the disk yet). Enter &lt;tt class="docutils literal"&gt;p&lt;/tt&gt; to print the table and make sure it looks
relatively sane:&lt;ul&gt;
&lt;li&gt;two&amp;nbsp;partitions,&lt;/li&gt;
&lt;li&gt;a small one with type 0700 (&amp;#8220;Microsoft basic data&amp;#8221;) which is the boot
partition,&amp;nbsp;and&lt;/li&gt;
&lt;li&gt;a larger one with type 8300 (&amp;#8220;Linux filesystem&amp;#8221;) which is the root&amp;nbsp;partition&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Enter &lt;tt class="docutils literal"&gt;w&lt;/tt&gt; to write the new partition table to the disk and&amp;nbsp;exit.&lt;/li&gt;
&lt;li&gt;Safely eject the drive and boot from&amp;nbsp;it!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that you can do this before the first boot, or you can do it later on.
However, if you do this &lt;em&gt;after&lt;/em&gt; the first boot you may need to manually resize
the root partition to take up the full disk size (if that&amp;#8217;s what you want). If
you do this before the first boot, the image &lt;em&gt;should&lt;/em&gt; expand the root partition
to fill the disk (I&amp;#8217;ve checked resizing works under &lt;span class="caps"&gt;GPT&lt;/span&gt;, but I haven&amp;#8217;t got a
spare &lt;span class="caps"&gt;HD&lt;/span&gt; &amp;gt;2Tb to actually try that with!&amp;nbsp;:).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="have-you-actually-tested-this"&gt;
&lt;h2&gt;Have you actually tested&amp;nbsp;this?&lt;/h2&gt;
&lt;p&gt;For the last week I&amp;#8217;ve been using the desktop image on and off on a Pi 4 with
4Gb of &lt;span class="caps"&gt;RAM&lt;/span&gt; (I&amp;#8217;ve got an 8Gb model here, but obviously the point is to try and
validate that 4Gb is &amp;#8220;sufficient&amp;#8221;), with my little laptop as a backup. However,
this week I&amp;#8217;m embarking on something a little more adventurous: using it full
time as my only desktop (laptop strictly for emergency backup only, and no
desktop either because … well, it sort of &lt;a class="reference external" href="https://twitter.com/waveform80/status/1312086341061050368"&gt;blew up&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The specific configuration I&amp;#8217;m using is: booting off a small 120Gb &lt;span class="caps"&gt;SSD&lt;/span&gt; I had
spare. Anyway, if I come up with any tweaks along the way I&amp;#8217;ll post a write-up
later this week. Wish me&amp;nbsp;luck!&lt;/p&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="pi"></category><category term="desktop"></category><category term="install"></category></entry><entry><title>Ubuntu Desktops on the Pi</title><link href="https://waldorf.waveform.org.uk/2020/ubuntu-desktops-on-the-pi.html" rel="alternate"></link><published>2020-04-17T00:00:00+01:00</published><updated>2023-08-01T17:02:11+01:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2020-04-17:/2020/ubuntu-desktops-on-the-pi.html</id><summary type="html">&lt;p class="first last"&gt;A quick review of the Ubuntu desktop flavours on the Raspberry&amp;nbsp;Pi&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;: A look at the &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2021/6-months-with-the-pi-desktop.html"&gt;Hirsute desktop image&lt;/a&gt;, &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2022/making-jammy-less-dodgy.html"&gt;Jammy desktop image&lt;/a&gt;, and &lt;a class="reference external" href="https://waldorf.waveform.org.uk/2023/desktop-on-a-stick.html"&gt;Making desktops with cloud-init&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the things I&amp;#8217;ve been looking at recently is the relative performance of
our desktop packages on the Pi (a lot of people seem to be trying to use the Pi
4 as a desktop work-horse - and it is &lt;em&gt;reasonably&lt;/em&gt; capable of this with the
right&amp;nbsp;selections).&lt;/p&gt;
&lt;p&gt;Anyway, here&amp;#8217;s some quick notes from my experiments. Firstly, the various
desktop packages and some comments (just in the order I tried&amp;nbsp;them):&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ubuntu-desktop&lt;/span&gt;&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;A bit sticky here and there (particularly during login and application
selection - basically anywhere Gnome tries to do any animation), but&amp;nbsp;tolerable.&lt;/dd&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;xubuntu-desktop&lt;/span&gt;&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;A bit slicker than the default on the Pi; could actually be a reasonable
choice for a default&amp;nbsp;desktop.&lt;/dd&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;lubuntu-desktop&lt;/span&gt;&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;It&amp;#8217;s not pretty, but damn this flies! No real surprise there given it&amp;#8217;s
LXQt which is the basis of Raspbian too. With a bit of layout tweaking this
would definitely be my go to choice of desktop under Ubuntu on the&amp;nbsp;Pi.&lt;/dd&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;kubuntu-desktop&lt;/span&gt;&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;Ouch, this is painful. Don&amp;#8217;t misunderstand me - I love Kubuntu generally
(I&amp;#8217;m one of those old stick-in-the-muds that bemoans all the options
that&amp;#8217;ve disappeared from Gnome over the years and loves that they&amp;#8217;re all
still there on &lt;span class="caps"&gt;KDE&lt;/span&gt;). However, it&amp;#8217;s undeniably heavier and on the Pi, even
on a 4Gb Pi 4, it&amp;#8217;s just&amp;nbsp;unusable.&lt;/dd&gt;
&lt;dt&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ubuntu-budgie-desktop&lt;/span&gt;&lt;/tt&gt;&lt;/dt&gt;
&lt;dd&gt;Oooh, pretty! Sadly, not that functional. The start menu is better than the
default but (shock! horror!) the terminal won&amp;#8217;t start, so that&amp;#8217;s this
experiment prematurely ended (yes, I could switch tty and fiddle around but
the Mac-like prettiness hasn&amp;#8217;t tempted me that much&amp;nbsp;:).&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="section" id="compatibility-notes"&gt;
&lt;h2&gt;Compatibility&amp;nbsp;notes&lt;/h2&gt;
&lt;p&gt;I was only testing the arm64 images; I&amp;#8217;d expect similar results under armhf
though. Several things are worth adding to improve compatibility or enable
hardware (these apply to pretty much all the desktops&amp;nbsp;above):&lt;/p&gt;
&lt;div class="section" id="graphics"&gt;
&lt;h3&gt;Graphics&lt;/h3&gt;
&lt;p&gt;Add &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;dtoverlay=vc4-fkms-v3d&lt;/span&gt;&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;/boot/firmware/syscfg.txt&lt;/tt&gt; to enable the
&amp;#8220;fake&amp;#8221; &lt;span class="caps"&gt;KMS&lt;/span&gt; frame-buffer. Lots of &lt;span class="caps"&gt;GUI&lt;/span&gt; instability without this. For all those
that want this to be the default: so do I, but there&amp;#8217;s issues with doing this
that need solving first (breaks u-boot&amp;#8217;s video console, and breaks boot on the&amp;nbsp;3A+).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="audio"&gt;
&lt;h3&gt;Audio&lt;/h3&gt;
&lt;p&gt;From Focal (20.04) onwards, &lt;tt class="docutils literal"&gt;dtparam=audio=on&lt;/tt&gt; should be the default in the
boot configuration so audio should at least be present. However, if you&amp;#8217;re
installing a desktop environment you also want to tweak a pulse-audio parameter
to improve its scheduling and avoid choppy audio. Edit
&lt;tt class="docutils literal"&gt;/etc/pulse/default.pa&lt;/tt&gt; and find the&amp;nbsp;line:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
load-module module-udev-detect
&lt;/pre&gt;
&lt;p&gt;And append &lt;tt class="docutils literal"&gt;tsched=0&lt;/tt&gt; so that the line&amp;nbsp;reads:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
load-module module-udev-detect tsched=0
&lt;/pre&gt;
&lt;p&gt;(thanks to BranLoux896 on the &lt;a class="reference external" href="https://raspberrypi.org/forums/"&gt;Raspberry Pi forums&lt;/a&gt; for mentioning&amp;nbsp;this!)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="login-managers"&gt;
&lt;h3&gt;Login&amp;nbsp;managers&lt;/h3&gt;
&lt;p&gt;Most of the desktop packages provide a selection of display managers (gdm3,
lightdm, ssdm, etc.) on installation. I attempted most selections and found
that lightdm doesn&amp;#8217;t work for some reason I haven&amp;#8217;t tried to figure out yet,
but gdm3 and ssdm work&amp;nbsp;fine.&lt;/p&gt;
&lt;p&gt;However, one issue with gdm3: it always defaults to the &amp;#8220;ubuntu&amp;#8221; desktop even
if you&amp;#8217;ve installed, say, &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;lubuntu-desktop&lt;/span&gt;&lt;/tt&gt;. After selecting the user to
login as, click the gears at the bottom right and select the &lt;em&gt;actual&lt;/em&gt; desktop
you installed before completing the login&amp;nbsp;:)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="wireless-bluetooth"&gt;
&lt;h3&gt;Wireless &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt;&amp;nbsp;Bluetooth&lt;/h3&gt;
&lt;p&gt;Install the &amp;#8220;iw&amp;#8221; package (which&amp;#8217;ll pull in &amp;#8220;crda&amp;#8221;) and then run &lt;tt class="docutils literal"&gt;sudo iw reg
set &lt;span class="caps"&gt;GB&lt;/span&gt;&lt;/tt&gt; (if you&amp;#8217;re in the &lt;span class="caps"&gt;UK&lt;/span&gt; like me; substitute &lt;span class="caps"&gt;GB&lt;/span&gt; for your region code
otherwise) to set the WiFi region correctly (usually enables a few channels
that aren&amp;#8217;t enabled in the default &amp;#8220;world region&amp;#8221;). I&amp;#8217;ll endeavour to get this
in the image by default in Focal, but you&amp;#8217;ll still need to set the region code
for&amp;nbsp;now.&lt;/p&gt;
&lt;p&gt;Install the &amp;#8220;pi-bluetooth&amp;#8221; package to enable Bluetooth. This &amp;#8220;just works&amp;#8221; once
the package is&amp;nbsp;installed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="remote-desktops"&gt;
&lt;h3&gt;Remote&amp;nbsp;desktops&lt;/h3&gt;
&lt;p&gt;I ran a quick experiment in Terminal Services-style remote desktops with xrdp
under lubuntu-desktop (the only one I figured would be light enough to be
worthwhile for such endeavours). To try&amp;nbsp;this:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;install the &lt;tt class="docutils literal"&gt;xrdp&lt;/tt&gt; package&lt;/li&gt;
&lt;li&gt;add the &lt;tt class="docutils literal"&gt;xrdp&lt;/tt&gt; user to the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;ssl-cert&lt;/span&gt;&lt;/tt&gt; group&lt;/li&gt;
&lt;li&gt;reboot&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then you should be able to connect remotely using an &lt;span class="caps"&gt;RDP&lt;/span&gt; client (like
&lt;tt class="docutils literal"&gt;remmina&lt;/tt&gt;) providing you specify the username and password in the connection&amp;nbsp;settings.&lt;/p&gt;
&lt;p&gt;Another quick experiment in screen-scraping style remote desktop was
semi-successful with the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;tigervnc-scraping-server&lt;/span&gt;&lt;/tt&gt; package but a further
experiment to do &lt;span class="caps"&gt;TS&lt;/span&gt;-style remote desktop with &lt;span class="caps"&gt;VNC&lt;/span&gt; wouldn&amp;#8217;t work (some issue
with &lt;span class="caps"&gt;GDM&lt;/span&gt; I didn&amp;#8217;t have time to dig&amp;nbsp;into).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="power-saving"&gt;
&lt;h3&gt;Power&amp;nbsp;saving&lt;/h3&gt;
&lt;p&gt;Power saving is &amp;#8230; rather pointless. I forget which desktop I saw this on, but
one of them decided to put the Pi to sleep on idle timeout and &amp;#8230; that just
effectively switched the Pi off! So, turn off all those suspend timers&amp;nbsp;:)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="lubuntu"></category><category term="xubuntu"></category><category term="kubuntu"></category><category term="budgie"></category><category term="hirsute"></category><category term="pi"></category><category term="desktop"></category><category term="bluetooth"></category><category term="wifi"></category><category term="vnc"></category><category term="rdp"></category></entry></feed>