<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet Ubuntu</title>
	<link>http://planet.ubuntu.com/</link>
	<language>en</language>
	<description>Planet Ubuntu - http://planet.ubuntu.com/</description>

<item>
	<title>Ubuntu Blog: Native integration available between Canonical LXD and HPE Alletra MP B10000</title>
	<guid isPermaLink="true">https://ubuntu.com//blog/canonical_lxd_hpe_alletra</guid>
	<link>https://ubuntu.com//blog/canonical_lxd_hpe_alletra</link>
	<description>&lt;p&gt;The integration combines efficient open source virtualization with high performance, enterprise-grade storage&lt;/p&gt;
&lt;p&gt;We are pleased to announce a new,  native integration between Canonical LXD and HPE Alletra. This integration brings together Canonical’s securely designed, open source virtualization platform with HPE’s enterprise-grade storage to deliver a simple, scalable, high-performance experience. &lt;/p&gt;
&lt;h1 class=&quot;wp-block-heading&quot;&gt;Enterprise-grade storage meets efficient open source virtualization&lt;/h1&gt;
&lt;p&gt;HPE Alletra is designed to deliver mission-critical storage at mid range economics, with a consistent data experience across various cloud environments. With this integration, Canonical LXD and MicroCloud users can now provision and manage Alletra block storage directly through the LXD interface, without the need for any third-party plugins or additional abstraction layers. &lt;/p&gt;
&lt;p&gt;The integration enables users to seamlessly create, attach, snapshot, and manage thin-provisioned block volumes as easily as working with local storage, while retaining the full performance, resilience, and enterprise data services of HPE Alletra. &lt;/p&gt;
&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;949&quot; src=&quot;https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_1571/https%3A%2F%2Fubuntu.com%2Fwp-content%2Fuploads%2Fb448%2Fimage.png&quot; width=&quot;1571&quot; /&gt;&lt;/figure&gt;
&lt;h1 class=&quot;wp-block-heading&quot;&gt;Simplified operations and scalable performance&lt;/h1&gt;
&lt;p&gt;HPE Alletra NVMe-based architecture ensures sub-millisecond latency for demanding workloads, with built-in services such as thin-provisioning and data deduplication minimizing storage costs while maintaining consistent performance. Paired with LXD’s lightweight control plane and streamlined UI, users can easily operate their environments, combining the best of open source with enterprise storage functionality.&lt;/p&gt;
&lt;p&gt;As demands grow, new volumes and storage capacity can be allocated on the fly. Alletra’s scale-out, modular architecture ensures the platform can expand without disrupting running workloads. &lt;/p&gt;
&lt;h1 class=&quot;wp-block-heading&quot;&gt;A foundation for modern infrastructure deployments &lt;/h1&gt;
&lt;p&gt;LXD provides a unified open source virtualization platform to run system containers and virtual machines with a focus on efficiency, security, and ease of management. With native support for HPE Alletra, enterprises can now build, deploy, and manage their workloads with enterprise storage guarantees, whether in private clouds, on-premises data centers, or edge environments. &lt;/p&gt;
&lt;p&gt;The combined solution empowers teams to deliver predictable performance for critical and data-intensive workloads while reducing complexity and ensuring agility.&lt;/p&gt;
&lt;h1 class=&quot;wp-block-heading&quot;&gt;Availability&lt;/h1&gt;
&lt;p&gt;The integration between LXD and HPE Alletra is available starting with the &lt;a href=&quot;https://documentation.ubuntu.com/lxd/latest/reference/release-notes/release-notes-6.6/&quot;&gt;LXD 6.6 feature release&lt;/a&gt;, and requires a HPE Alletra WSAPI version 1. LXD currently supports connecting to HPE Alletra storage through NVMe/TCP or iSCSI protocols. For detailed information, visit &lt;a href=&quot;https://documentation.ubuntu.com/lxd/stable-5.21/reference/storage_alletra/&quot;&gt;Canonical’s LXD documentation&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Mon, 15 Dec 2025 15:57:28 +0000</pubDate>
</item>
<item>
	<title>Ubuntu Blog: Why you should retire your Microsoft Azure Consumption Commitment (MACC) with Ubuntu Pro</title>
	<guid isPermaLink="true">https://ubuntu.com//blog/retire-azure-consumption-commitment-macc-ubuntu-pro</guid>
	<link>https://ubuntu.com//blog/retire-azure-consumption-commitment-macc-ubuntu-pro</link>
	<description>&lt;p&gt;When your organization first signed its Microsoft Azure Consumption Commitment (MACC), it was a strategic step to unlock better pricing and enable cloud growth. However, fulfilling that commitment efficiently requires planning. Organizations often look for ways to retire their MACC that drive strategic value, rather than simply increasing consumption to meet a deadline.&lt;/p&gt;
&lt;p&gt;The goal is to meet your commitment while delivering long-term benefits to the business.&lt;/p&gt;
&lt;p&gt;With Ubuntu Pro in the Azure Marketplace, you can retire your MACC at 100% of the pretax purchase amount. In practice, this allows you to meet consumption goals on your standard Azure invoice, while securing your open source supply chain and automating compliance.&lt;/p&gt;
&lt;h1 class=&quot;wp-block-heading&quot;&gt;Turn a spend target into an open source security strategy&lt;/h1&gt;
&lt;p&gt;Instead of simply increasing consumption to hit a target, effective IT and FinOps teams align their MACC with broader strategic goals. Open source support and security maintenance is a priority for enterprises, as a &lt;a href=&quot;https://pages.ubuntu.com/rs/066-EOV-335/images/Final%20report%20-%20WorldofOS_EUSpotlight_2025_081525.pdf?version=0&amp;amp;_gl=1*tbk0ic*_gcl_au*MjAyODc1NDE5My4xNzU0OTk1ODU4&quot;&gt;recent Linux Foundation report&lt;/a&gt; shows: 54% of enterprises want long-term guarantees, and 53% expect rapid security patching.&lt;/p&gt;
&lt;p&gt;Ubuntu Pro offers both. By choosing software that strengthens your security and operations, you can retire your MACC while funding capabilities your organization prioritizes.&lt;/p&gt;
&lt;p&gt;Allocating MACC to Ubuntu Pro is a direct investment in your open source estate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Expanded Security Maintenance (ESM)&lt;/strong&gt;: extend security coverage to the critical open source applications running above the operating system layer. ESM provides up to 15 years of security updates for the OS, plus tens of thousands of packages. You might already see alerts for these missing updates in your Azure portal – learn how to check your exposure in our blog: [&lt;a href=&quot;https://ubuntu.com/blog/ubuntu-lts-vm-azure-security-view&quot;&gt;A complete security view for every Ubuntu LTS VM on Azure&lt;/a&gt;].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kernel Livepatch&lt;/strong&gt;: reduce maintenance windows by applying critical kernel patches without requiring a reboot for most workloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance tooling&lt;/strong&gt;: access options for CIS hardening and FIPS 140-3 validated cryptographic modules to support meeting compliance and regulatory needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional enterprise support&lt;/strong&gt;: add enterprise SLAs, direct access to Canonical engineers for break-fix and bug-fix, and guidance on operating Ubuntu and ESM-covered packages on Azure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By choosing Ubuntu Pro, you convert your MACC spend into a maintained open source foundation across the development lifecycle.&lt;/p&gt;
&lt;h1 class=&quot;wp-block-heading&quot;&gt;Maximize value and streamline procurement&lt;/h1&gt;
&lt;p&gt;Retiring your commitment should be financially efficient and administratively simple. While standard Marketplace listings are MACC-eligible, many organizations use p&lt;a href=&quot;https://learn.microsoft.com/en-us/marketplace/private-offers-overview&quot;&gt;rivate offers&lt;/a&gt; to secure tailored commercial terms, like custom pricing or volume discounts, without sacrificing eligibility.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;We support both standard private offers and multiparty private offers for rollouts involving resellers in the US/UK. In all cases, checking that your purchase counts toward your commitment is straightforward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Confirm Eligibility&lt;/strong&gt;: verify the listing or private offer is marked as “Azure benefit-eligible.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Purchase Correctly&lt;/strong&gt;: execute the transaction in the Azure portal under the tenant and subscription tied to your MACC agreement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach guarantees that every dollar spent satisfies your financial goals while delivering the specific security coverage your organization needs.&lt;/p&gt;
&lt;p&gt;Ready to align Ubuntu Pro with your MACC? &lt;a href=&quot;https://ubuntu.com/azure/contact-us&quot;&gt;Talk to our team&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Sat, 13 Dec 2025 00:07:17 +0000</pubDate>
</item>
<item>
	<title>Ubuntu Studio: Coming to 26.04 LTS: Three Layouts</title>
	<guid isPermaLink="false">https://ubuntustudio.org/?p=3049</guid>
	<link>https://ubuntustudio.org/2025/12/coming-to-26-04-lts-three-layouts/</link>
	<description>&lt;h2&gt;Xfce Legacy&lt;/h2&gt;



&lt;p&gt;A lot of people have asked us why Ubuntu Studio comes with a panel on top as the default. For that, it’s a simple answer: Legacy.&lt;/p&gt;



&lt;p&gt;When Ubuntu Studio 12.04 LTS (Precise Pangolin) released over 13 years ago, it was released with a top panel by default as that was the default for our desktop envirionment: Xfce.&lt;/p&gt;



&lt;p&gt;Fast-forward eight years to 20.10 and Xfce was no longer our default desktop environment: we had switched to KDE’s Plasma Desktop. Plasma has a bottom panel by default, similar to Windows. However, to ease the transition for our long-time users, we kept the panel on top by default, resizing it to be similar to the default top panel of Xfce.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-3053&quot; height=&quot;400&quot; src=&quot;https://ubuntustudio.org/wp-content/uploads/2025/12/e9d5/VirtualBox_ISOTest_10_12_2025_18_42_41.jpg&quot; width=&quot;640&quot; /&gt;&lt;/figure&gt;



&lt;h2&gt;A macOS-Like Layout&lt;/h2&gt;



&lt;p&gt;With 25.10’s release, we included an additional layout: two panels. One panel is on top with a global menu, and the bottom contains some default applications, a trash can, and a full-screen application launcher. This is a way to feel familiar to those with a similar layout from where they may be coming from, being an operating system for creativity: macOS.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-3050&quot; height=&quot;400&quot; src=&quot;https://ubuntustudio.org/wp-content/uploads/2025/12/1df5/VirtualBox_ISOTest_10_12_2025_18_45_35.png&quot; width=&quot;640&quot; /&gt;&lt;/figure&gt;



&lt;h2&gt;Familiarity and Traditionalism: Windows-like Layout&lt;/h2&gt;



&lt;p&gt;Starting with 26.04 LTS, we’ll also include one more layout: a bottom, Windows 10-like layout. This is to ease the transition for those coming from Windows, and due to popular request and reports.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-3052&quot; height=&quot;400&quot; src=&quot;https://ubuntustudio.org/wp-content/uploads/2025/12/9220/VirtualBox_ISOTest_10_12_2025_18_43_35.jpg&quot; width=&quot;640&quot; /&gt;&lt;/figure&gt;



&lt;h2&gt;Should We Change The Default?&lt;/h2&gt;



&lt;p&gt;It has been 13 years since we defaulted to a top panel, but is that the right idea anymore?&lt;/p&gt;



&lt;p&gt;Right now, on the Ubuntu Discourse, &lt;a href=&quot;https://discourse.ubuntu.com/t/coming-to-ubuntu-studio-26-04-lts-three-layouts/&quot;&gt;we have a poll&lt;/a&gt; to decide if we should change the default layout starting with 26.04 LTS. This will not affect layouts for anyone upgrading from a prior release, but only new installations or new users going forward.&lt;/p&gt;



&lt;p&gt;If you would like to participate in the poll, &lt;a href=&quot;https://discourse.ubuntu.com/t/coming-to-ubuntu-studio-26-04-lts-three-layouts/&quot;&gt;head on over to the Ubuntu Discourse and cast a vote&lt;/a&gt;!&lt;/p&gt;</description>
	<pubDate>Thu, 11 Dec 2025 18:41:20 +0000</pubDate>
</item>
<item>
	<title>Podcast Ubuntu Portugal: E368 Ensino De TIC, Com Artur Coelho</title>
	<guid isPermaLink="false">https://hub.podcastubuntuportugal.org/s/FsY2XcYK4nEiLoW/download/e368.mp3</guid>
	<link>https://podcastubuntuportugal.org/e368/</link>
	<description>&lt;p&gt;Desta feita, raptámos…errr…recebemos um convidado muito especial: Artur Coelho. Professor de TIC, formador, apaixonado pela educação e criatividade com robótica, IA, 3D e programação de software, mantém uma visão crítica, actual e informada sobre o ensino das Tecnologias de Informação e Comunicação (TIC) nas escolas portuguesas - onde foi pioneiro na introdução de diversas tecnologias e construiu um percurso invejável, influenciando positivamente um grande número de alunos e professores. A conversa foi tão longa e interessante que vamos tentar rapt…convidá-lo outra vez no futuro.&lt;/p&gt;
&lt;p&gt;Já sabem: oiçam, subscrevam e partilhem!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Artur Coelho:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://masto.pt/@arturcoelho&quot;&gt;https://masto.pt/@arturcoelho&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://intergalacticrobot.blogspot.com/&quot;&gt;https://intergalacticrobot.blogspot.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://3dalpha.blogspot.com/&quot;&gt;https://3dalpha.blogspot.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ANPRI: &lt;a href=&quot;https://anpri.edu.pt/&quot;&gt;https://anpri.edu.pt/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;O Robô Anprino:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anpri.pt/anprino/index.php/componentes-do-robot/&quot;&gt;https://www.anpri.pt/anprino/index.php/componentes-do-robot/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sketchfab.com/3d-models/anprino-f2c430c0b17d4124b7824ec8b3bf5670&quot;&gt;https://sketchfab.com/3d-models/anprino-f2c430c0b17d4124b7824ec8b3bf5670&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fundação Microbit para a educação:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://microbit.org/&quot;&gt;https://microbit.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://microbit.org/projects/make-it-code-it/&quot;&gt;https://microbit.org/projects/make-it-code-it/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://microbit.org/buy/&quot;&gt;https://microbit.org/buy/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pocket Code: &lt;a href=&quot;https://catrobat.org/pocket-code/&quot;&gt;https://catrobat.org/pocket-code/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Scratch: &lt;a href=&quot;https://scratch.mit.edu/about&quot;&gt;https://scratch.mit.edu/about&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ubuntu Touch: &lt;a href=&quot;https://www.ubuntu-touch.io/&quot;&gt;https://www.ubuntu-touch.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sessão sobre Ubuntu Touch no LCD Porto (27 e 29 de Novembro): &lt;a href=&quot;https://porto.ectl.softwarelivre.eu/pt/schedule/2025/&quot;&gt;https://porto.ectl.softwarelivre.eu/pt/schedule/2025/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;«Ubuntu Touch e o seu ecossistema», com Diogo Constantino e António Aragão: &lt;a href=&quot;https://youtu.be/GCiLd02G74g&quot;&gt;https://youtu.be/GCiLd02G74g&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Uncomplicated Firewall (UFW): &lt;a href=&quot;https://wiki.ubuntu.com/UncomplicatedFirewall&quot;&gt;https://wiki.ubuntu.com/UncomplicatedFirewall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gufw, UFW com interface gráfico: &lt;a href=&quot;https://help.ubuntu.com/community/Gufw&quot;&gt;https://help.ubuntu.com/community/Gufw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Debian 13 Trixie: &lt;a href=&quot;https://www.debian.org/releases/trixie/&quot;&gt;https://www.debian.org/releases/trixie/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KDE Plasma 6: &lt;a href=&quot;https://kde.org/announcements/megarelease/6/&quot;&gt;https://kde.org/announcements/megarelease/6/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Noughty Linux:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://noughtylinux.org/&quot;&gt;https://noughtylinux.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/noughtylinux&quot;&gt;https://github.com/noughtylinux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nicholas Negroponte: &lt;a href=&quot;https://en.wikipedia.org/wiki/Nicholas_Negroponte&quot;&gt;https://en.wikipedia.org/wiki/Nicholas_Negroponte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Seymour Papert:
&lt;ul&gt;
&lt;li&gt;Sítio internet: &lt;a href=&quot;http://papert.org/&quot;&gt;http://papert.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Obras publicadas: &lt;a href=&quot;http://papert.org/works.html&quot;&gt;http://papert.org/works.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Biografia: &lt;a href=&quot;https://en.wikipedia.org/wiki/Seymour_Papert&quot;&gt;https://en.wikipedia.org/wiki/Seymour_Papert&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;«20 coisas para fazer com um computador» (Papert, Seymour A.; Solomon, Cynthia, 1971): &lt;a href=&quot;https://dspace.mit.edu/handle/1721.1/5836&quot;&gt;https://dspace.mit.edu/handle/1721.1/5836&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OLPC: &lt;a href=&quot;https://en.wikipedia.org/wiki/One_Laptop_per_Child&quot;&gt;https://en.wikipedia.org/wiki/One_Laptop_per_Child&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Magalhães (Intel Classmate) PC: &lt;a href=&quot;https://en.wikipedia.org/wiki/Classmate_PC&quot;&gt;https://en.wikipedia.org/wiki/Classmate_PC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linux Caixa Mágica: &lt;a href=&quot;https://en.wikipedia.org/wiki/Linux_Caixa_M%C3%A1gica&quot;&gt;https://en.wikipedia.org/wiki/Linux_Caixa_M%C3%A1gica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Alberto, o dicionário aberto: &lt;a href=&quot;https://snapcraft.io/alberto&quot;&gt;https://snapcraft.io/alberto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Projecto Natura: &lt;a href=&quot;https://natura.di.uminho.pt/wiki/doku.php?id=ProjectoNatura&quot;&gt;https://natura.di.uminho.pt/wiki/doku.php?id=ProjectoNatura&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Faruk, uma mascote de Luís Louro para o Software Freedom Day: &lt;a href=&quot;https://digitalfreedoms.org/en/sfd/blog/sfd-mascot-challenge-winners-2025&quot;&gt;https://digitalfreedoms.org/en/sfd/blog/sfd-mascot-challenge-winners-2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sobre Wernher Von Braun: &lt;a href=&quot;https://youtu.be/TjDEsGZLbio&quot;&gt;https://youtu.be/TjDEsGZLbio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;O foguetão Vergeltungswaffe 2: &lt;a href=&quot;https://youtu.be/jePOQuFTXy4&quot;&gt;https://youtu.be/jePOQuFTXy4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LoCo PT: &lt;a href=&quot;https://loco.ubuntu.com/teams/ubuntu-pt/&quot;&gt;https://loco.ubuntu.com/teams/ubuntu-pt/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mastodon: &lt;a href=&quot;https://masto.pt/@pup&quot;&gt;https://masto.pt/@pup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Youtube: &lt;a href=&quot;https://youtube.com/PodcastUbuntuPortugal&quot;&gt;https://youtube.com/PodcastUbuntuPortugal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;atribuição-e-licenças&quot;&gt;Atribuição e licenças&lt;/h3&gt;
&lt;p&gt;Este episódio foi produzido por Diogo Constantino, Miguel e Tiago Carrondo e editado pelo &lt;a href=&quot;https://senhorpodcast.pt/&quot;&gt;Senhor Podcast&lt;/a&gt;.
O website é produzido por Tiago Carrondo e o &lt;a href=&quot;https://gitlab.com/podcastubuntuportugal/website&quot;&gt;código aberto&lt;/a&gt; está licenciado nos termos da &lt;a href=&quot;https://gitlab.com/podcastubuntuportugal/website/main/LICENSE&quot;&gt;Licença MIT&lt;/a&gt;. (&lt;a href=&quot;https://creativecommons.org/licenses/by/4.0/)&quot;&gt;https://creativecommons.org/licenses/by/4.0/)&lt;/a&gt;. A música do genérico é: “Won’t see it comin’ (Feat Aequality &amp;amp; N’sorte d’autruche)”, por Alpha Hydrae e está licenciada nos termos da &lt;a href=&quot;https://creativecommons.org/publicdomain/zero/1.0/&quot;&gt;CC0 1.0 Universal License&lt;/a&gt;.
Os separadores de péssima qualidade foram tocados ao vivo e sem rede pelo Miguel, pelo que pedimos desculpa pelos incómodos causados.
Este episódio está licenciado nos termos da licença: &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-nd/4.0/&quot;&gt;Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)&lt;/a&gt;, &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode&quot;&gt;cujo texto integral pode ser lido aqui&lt;/a&gt;. Estamos abertos a licenciar para permitir outros tipos de utilização, &lt;a href=&quot;https://podcastubuntuportugal.org/contactos&quot;&gt;contactem-nos&lt;/a&gt; para validação e autorização.
A arte de episódio foi criada pelo Luís Louro - a mascote Faruk - vencedora do terceiro lugar no concurso de mascote para o Software Freedom Day.&lt;/p&gt;</description>
	<pubDate>Thu, 11 Dec 2025 00:00:00 +0000</pubDate>
        <enclosure url="https://hub.podcastubuntuportugal.org/s/FsY2XcYK4nEiLoW/download/e368.mp3" length="61771312" type="audio/mpeg"/>
</item>
<item>
	<title>Salih Emin: Fix Broken Updates: uCareSystem New Release uCareSystem v25.12</title>
	<guid isPermaLink="false">https://utappia.org/?p=49934</guid>
	<link>https://utappia.org/2025/12/06/fix-broken-update-linux-ucaresystem/</link>
	<description>&lt;p&gt;Let’s be honest. Dealing with &lt;strong&gt;broken updates&lt;/strong&gt; is a nightmare. We’ve all experienced that moment of panic when you run an update, step away for coffee, and return to a terminal screen full of angry red error messages. That is exactly why uCareSystem exists, and today, it gets even better at preventing these issues.&lt;/p&gt;



&lt;span id=&quot;more-49934&quot;&gt;&lt;/span&gt;



&lt;p&gt;&lt;strong&gt;Fix Broken Updates: uCareSystem New Release&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;I’m thrilled to announce the latest release of &lt;a href=&quot;https://utappia.org/download-ucaresystem/&quot;&gt;uCareSystem&lt;/a&gt;. As the sole developer, I feel the pain of &lt;strong&gt;broken updates&lt;/strong&gt; personally. For this version, I spent a lot of time under the hood, focusing on making sure the tool doesn’t just work when everything is perfect, but proactively fixes issues before they break your system.&lt;/p&gt;



&lt;p&gt;Here is why you should upgrade to the new version and say goodbye to &lt;strong&gt;broken updates&lt;/strong&gt; for good:&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Prevent Broken Updates with Pre-flight Checks&lt;/h3&gt;



&lt;p&gt;The most frustrating &lt;strong&gt;broken updates&lt;/strong&gt; are the ones that fail because of something that happened &lt;em&gt;last&lt;/em&gt; week.&lt;/p&gt;



&lt;p&gt;The new uCareSystem introduces automated pre-flight checks. Think of it as a bouncer for your update process. Before it lets any new packages in, it checks the ID of your system to prevent &lt;strong&gt;broken updates&lt;/strong&gt;. It now automatically detects and attempts to fix:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Those annoying stale &lt;code&gt;dpkg&lt;/code&gt; locks that require a reboot.&lt;/li&gt;



&lt;li&gt;Installations that were interrupted (ghosts of updates past).&lt;/li&gt;



&lt;li&gt;Broken dependencies that threaten to ruin your day.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The goal is simple: You press the button, and it actually works.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;A UI Upgrade for Better Monitoring&lt;/h3&gt;



&lt;p&gt;While staring at scrolling walls of monochrome text makes us feel like hackers in a 90s movie, it’s not great for spotting errors.&lt;/p&gt;



&lt;p&gt;I’ve given the uCareSystem terminal interface a significant makeover. With improved color coding, better progress indicators, and real-time output logging, you’ll now have a much clearer idea of the process, helping you catch potential issues that could lead to &lt;strong&gt;broken updates&lt;/strong&gt;.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Robustness: Avoiding Broken Updates in Containers&lt;/h3&gt;



&lt;p&gt;Linux runs everywhere now. To keep up, uCareSystem needs to be flexible.&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Containers &amp;amp; WSL:&lt;/strong&gt; I’ve improved &lt;code&gt;systemd&lt;/code&gt; detection so the tool plays nicely even in environments like Docker containers and &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/wsl/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Windows Subsystem for Linux (WSL)&lt;/a&gt;.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Internet Reality Check:&lt;/strong&gt; I added better connectivity checks. Trying to download updates without a stable connection is a common cause of &lt;strong&gt;broken updates&lt;/strong&gt;, and we now handle that gracefully.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Auto-Recovery:&lt;/strong&gt; If a &lt;code&gt;dpkg&lt;/code&gt; process trips and falls midway, the software now has mechanisms to help pick it back up automatically.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Spring Cleaning the Code with ShellCheck&lt;/h3&gt;



&lt;p&gt;For the code-peepers out there who like to look under the hood: I did some massive spring cleaning. Extensive refactoring and complying with &lt;a href=&quot;https://www.shellcheck.net/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;ShellCheck&lt;/a&gt; standards mean the codebase is now cleaner and safer. This ensures better maintainability and fewer bugs in the future.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;



&lt;p&gt;Give the new version a spin. Hopefully, it makes your system maintenance totally boring—and completely free of &lt;strong&gt;broken updates&lt;/strong&gt;.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;By the Numbers&lt;/h3&gt;



&lt;p&gt;This was a significant undertaking, reflected in the statistics for this release:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;38 files changed: &lt;/strong&gt;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;2,030 additions, &lt;/strong&gt;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;718 deletions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Please take a look to a comprehensive Release note in the repository: &lt;a href=&quot;https://github.com/Utappia/uCareSystem/releases/tag/v25.12.04&quot;&gt;https://github.com/Utappia/uCareSystem/releases/tag/v25.12.04&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;This release is a testament to my commitment to quality and my vision for the future of uCareSystem as a one-stop system maintenance tool Debian Ubuntu. I am confident that I laid a stronger foundation that will allow for even more exciting features and faster development in the future.&lt;/p&gt;



&lt;p&gt;I am deeply grateful to the community members who supported the previous development cycle through donations or code contributions:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;P. Laoughman (Thanks for your continued support)&lt;/li&gt;



&lt;li&gt;W. Schreinemachers (Thanks for your continued support)&lt;/li&gt;



&lt;li&gt;D. Luchini (Thanks for your continued support)&lt;/li&gt;



&lt;li&gt;M. Van Hoof&lt;/li&gt;



&lt;li&gt;Frankie P.&lt;/li&gt;



&lt;li&gt;M. Ryser&lt;/li&gt;



&lt;li&gt;Th. Ploumis&lt;/li&gt;



&lt;li&gt;M. Stade&lt;/li&gt;



&lt;li&gt;K. J. Rasmussen&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Every version, has also a code name dedicated as a release honored to one of the contributors. For historical reference, you can check all &lt;a href=&quot;https://github.com/Utappia/uCareSystem/blob/master/HONORED_RELEASES.md&quot;&gt;previous honored releases&lt;/a&gt;.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Where can I download uCareSystem ?&lt;/h2&gt;



&lt;p&gt;As always, I want to express my gratitude for your support over the past 15 years. I have received countless messages from inside and outside Greece about how useful they found the application. I hope you find the new version useful as well.&lt;/p&gt;



&lt;p&gt;If you’ve found uCareSystem to be valuable and it has saved you time, consider showing your appreciation with a donation. You can contribute via PayPal or Debit/Credit Card by clicking on the banner.&lt;/p&gt;



&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pay what you want&lt;/th&gt;
&lt;th&gt;Maybe next time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Click the donate button and enter the amount you want to donate. Then you will be navigated to the page with the latest version to download the installer&lt;/td&gt;
&lt;td&gt;If you don’t want to Donate this time, just click the download icon to be navigated to the page with the latest version to download the installer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.paypal.com/donate/?hosted_button_id=SATQ6Y9S3UCSG&quot; rel=&quot;attachment wp-att-2601&quot;&gt;&lt;img alt=&quot;btn_donateCC_LG&quot; class=&quot;wp-image-2601 size-full aligncenter&quot; height=&quot;47&quot; src=&quot;http://utappiablog.wordpress.com/wp-content/uploads/2016/03/btn_donatecc_lg1.gif&quot; width=&quot;147&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Utappia/uCareSystem/releases/latest&quot; rel=&quot;attachment wp-att-2593&quot;&gt;&lt;img alt=&quot;ucare-system-download&quot; class=&quot;size-full wp-image-2593 aligncenter&quot; height=&quot;151&quot; src=&quot;http://utappiablog.wordpress.com/wp-content/uploads/2016/03/ucare-system-download.png&quot; width=&quot;151&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Once installed, the updates for new versions will be installed along with your regular system updates.&lt;/p&gt;
&lt;p&gt;The post &lt;a href=&quot;https://utappia.org/2025/12/06/fix-broken-update-linux-ucaresystem/&quot;&gt;Fix Broken Updates: uCareSystem New Release uCareSystem v25.12&lt;/a&gt; appeared first on &lt;a href=&quot;https://utappia.org&quot;&gt;Utappia&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Sat, 06 Dec 2025 15:59:58 +0000</pubDate>
</item>
<item>
	<title>Colin Watson: Free software activity in November 2025</title>
	<guid isPermaLink="false">tag:www.chiark.greenend.org.uk,2025-12-04:/~cjwatson/blog/activity-2025-11.html</guid>
	<link>https://www.chiark.greenend.org.uk/~cjwatson/blog/activity-2025-11.html</link>
	<description>&lt;p&gt;My Debian contributions this month were all
&lt;a href=&quot;https://www.freexian.com/about/debian-contributions/&quot;&gt;sponsored&lt;/a&gt; by
Freexian.  I had a bit less time than usual, because Freexian collaborators
gathered in Marseille this month for our yearly sprint, doing some planning
for next year.&lt;/p&gt;
&lt;p&gt;You can also support my work directly via
&lt;a href=&quot;https://liberapay.com/cjwatson&quot;&gt;Liberapay&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/cjwatson&quot;&gt;GitHub
Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;OpenSSH&lt;/h2&gt;
&lt;p&gt;I began preparing for the second stage of the &lt;a href=&quot;https://lists.debian.org/debian-devel/2024/04/msg00044.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;GSS&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; key exchange package
split&lt;/a&gt; (some
details have changed since that message).  It seems that we’ll need to wait
until Ubuntu 26.04 &lt;span class=&quot;caps&quot;&gt;LTS&lt;/span&gt; has been released, but that’s close enough that it’s
worth making sure we’re ready.  This month I just did some packaging
cleanups that would otherwise have been annoying to copy, such as removing
support for direct upgrades from pre-bookworm.  I’m considering some other
package rearrangements to make the split easier to manage, but haven’t made
any decisions here yet.&lt;/p&gt;
&lt;p&gt;This also led me to start on a long-overdue bug triage pass, mainly
consisting of applying usertags to lots of our open bugs to sort them by
which program they apply to, and also closing a few that have been fixed,
since some bugs will eventually need to be reassigned to &lt;span class=&quot;caps&quot;&gt;GSS&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; packages
and it would be helpful to make them easier to find.  At the time of
writing, about 30% of the bug list remains to be categorized this way.&lt;/p&gt;
&lt;h2&gt;Python packaging&lt;/h2&gt;
&lt;p&gt;I upgraded these packages to new upstream versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aioftp&lt;/li&gt;
&lt;li&gt;basemap (fixing &lt;a href=&quot;https://bugs.debian.org/1119728&quot;&gt;Cython 3.1
  compatibility&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;billiard&lt;/li&gt;
&lt;li&gt;black&lt;/li&gt;
&lt;li&gt;django-phonenumber-field&lt;/li&gt;
&lt;li&gt;flask-security&lt;/li&gt;
&lt;li&gt;flufl.i18n&lt;/li&gt;
&lt;li&gt;langtable&lt;/li&gt;
&lt;li&gt;mariadb-connector-python&lt;/li&gt;
&lt;li&gt;peewee (fixing &lt;a href=&quot;https://bugs.debian.org/1119757&quot;&gt;Cython 3.1
  compatibility&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;pydantic&lt;/li&gt;
&lt;li&gt;pydantic-core&lt;/li&gt;
&lt;li&gt;pydantic-settings&lt;/li&gt;
&lt;li&gt;pylsqpack&lt;/li&gt;
&lt;li&gt;pymongo&lt;/li&gt;
&lt;li&gt;pymssql&lt;/li&gt;
&lt;li&gt;pyodbc&lt;/li&gt;
&lt;li&gt;python-auditwheel (&lt;a href=&quot;https://github.com/pypa/auditwheel/pull/640&quot;&gt;contributed follow-up fix
  upstream&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-avro&lt;/li&gt;
&lt;li&gt;python-bleach&lt;/li&gt;
&lt;li&gt;python-btrees&lt;/li&gt;
&lt;li&gt;python-certifi&lt;/li&gt;
&lt;li&gt;python-charset-normalizer&lt;/li&gt;
&lt;li&gt;python-colorlog&lt;/li&gt;
&lt;li&gt;python-django-channels&lt;/li&gt;
&lt;li&gt;python-django-constance&lt;/li&gt;
&lt;li&gt;python-django-contact-form&lt;/li&gt;
&lt;li&gt;python-django-hashids&lt;/li&gt;
&lt;li&gt;python-djvulibre (fixing &lt;a href=&quot;https://bugs.debian.org/1119766&quot;&gt;Cython 3.1
  compatibility&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-evalidate&lt;/li&gt;
&lt;li&gt;python-legacy-cgi&lt;/li&gt;
&lt;li&gt;python-openstep-plist (fixing &lt;a href=&quot;https://bugs.debian.org/1119767&quot;&gt;Cython 3.1
  compatibility&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-pytest-run-parallel&lt;/li&gt;
&lt;li&gt;python-pytokens&lt;/li&gt;
&lt;li&gt;python-tblib&lt;/li&gt;
&lt;li&gt;python-webargs&lt;/li&gt;
&lt;li&gt;pyupgrade&lt;/li&gt;
&lt;li&gt;sqlfluff&lt;/li&gt;
&lt;li&gt;trove-classifiers&lt;/li&gt;
&lt;li&gt;ttconv&lt;/li&gt;
&lt;li&gt;wcwidth&lt;/li&gt;
&lt;li&gt;zope.hookable&lt;/li&gt;
&lt;li&gt;zope.i18nmessageid (removing &lt;a href=&quot;https://bugs.debian.org/1084014&quot;&gt;run-time dependency on
  setuptools&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;zope.interface&lt;/li&gt;
&lt;li&gt;zope.proxy&lt;/li&gt;
&lt;li&gt;zope.security (removing &lt;a href=&quot;https://bugs.debian.org/1084018&quot;&gt;run-time dependency on
  setuptools&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;zope.sqlalchemy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I packaged &lt;a href=&quot;https://bugs.debian.org/1120507&quot;&gt;django-pgtransaction&lt;/a&gt; and
backported it to trixie, since we plan to use it in Debusine; and I adopted
python-certifi for the Python team.&lt;/p&gt;
&lt;p&gt;I fixed or helped to fix several other build/test failures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1119744&quot;&gt;kivy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1120242&quot;&gt;mypy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1114284&quot;&gt;pytest-mypy-testing&lt;/a&gt; (&lt;a href=&quot;https://github.com/davidfritzsche/pytest-mypy-testing/pull/57&quot;&gt;contributed
  upstream&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://salsa.debian.org/python-team/packages/python-cytoolz/-/commit/52856c4c1d1bc9fab0241e4c1b0d20d75bdaa99a&quot;&gt;python-cytoolz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1120725&quot;&gt;python-discord&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1120469&quot;&gt;python-ncls&lt;/a&gt;, fixing some failures in pyranges&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1121095&quot;&gt;pyxdg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1114415&quot;&gt;traitlets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1120228&quot;&gt;twine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I fixed a couple of other bugs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1119801&quot;&gt;pmix: B-D on python3-all-dev, but not built for all supported Python3 versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1064621&quot;&gt;python-certifi: Package not compatible with multiarch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Other bits and pieces&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1087524&quot;&gt;cdebconf: Move to /usr/lib/apt/apt-extracttemplates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://salsa.debian.org/debian/devscripts/-/merge_requests/588&quot;&gt;devscripts: Restore dpkg-dev dependency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1121577&quot;&gt;groff: Missing information about some utilities in the “contrib” directory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Code reviews&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1119914&quot;&gt;base-passwd: French translation&lt;/a&gt; (merged
  and uploaded)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://salsa.debian.org/installer-team/cdebconf/-/merge_requests/23&quot;&gt;cdebconf: Consider using the standard dh sequence in
  d/rules&lt;/a&gt;
  (merged and uploaded)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/430151&quot;&gt;cdebconf: Multiple select is not right aligned in
  Hebrew&lt;/a&gt; (patch fails to build; asked
  reporter for an update)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1078936&quot;&gt;cdebconf: Allow building without
  libglib2.0-dev&lt;/a&gt; (merged and uploaded)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1121035&quot;&gt;pydantic-core&lt;/a&gt; (merged and uploaded)&lt;/li&gt;
&lt;li&gt;pymongo (sponsored adoption by Aryan Karamtoth)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://salsa.debian.org/python-team/packages/maturin/-/merge_requests/1&quot;&gt;python-maturin: Add missing build
  dependencies&lt;/a&gt;
  (merged and uploaded)&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Thu, 04 Dec 2025 17:55:59 +0000</pubDate>
</item>
<item>
	<title>St&amp;eacute;phane Graber: Announcing Incus 6.19</title>
	<guid isPermaLink="false">https://stgraber.org/?p=1820</guid>
	<link>https://stgraber.org/2025/12/01/announcing-incus-6-19/</link>
	<description>&lt;p&gt;The Incus team is pleased to announce the release of Incus 6.19!&lt;/p&gt;



&lt;p&gt;This is a slightly less busy release than usual as we’ve recently been spending quite a bit of time smoothing some of the initial rough edges from the &lt;a href=&quot;https://discuss.linuxcontainers.org/t/announcing-incusos/25139&quot;&gt;IncusOS release&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;That said, it still contains quite a few nice improvements and quite a lot of bugfixes!&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://linuxcontainers.org/incus/try-it/&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-1821&quot; height=&quot;488&quot; src=&quot;https://stgraber.org/wp-content/uploads/2025/12/image-1024x488.png&quot; width=&quot;1024&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;The highlights for this release are:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Initial SELinux support&lt;/li&gt;



&lt;li&gt;Improved Windows agent support&lt;/li&gt;



&lt;li&gt;Serial devices in the resources API&lt;/li&gt;



&lt;li&gt;Bandwidth limits on OVN NICs&lt;/li&gt;



&lt;li&gt;Support for multi-object deletion in most CLI commands&lt;/li&gt;



&lt;li&gt;Ability to turn off passthrough of PCI firmware to VM&lt;/li&gt;



&lt;li&gt;PKCS12 generation in the CLI&lt;/li&gt;



&lt;li&gt;Option for raw units in CLI CSV output&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The full announcement and changelog can be &lt;a href=&quot;https://discuss.linuxcontainers.org/t/incus-6-19-has-been-released/25405&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;found here&lt;/a&gt;.&lt;br /&gt;And for those who prefer videos, here’s the release &lt;a href=&quot;https://www.youtube.com/watch?v=KY5k_ankFP0&quot;&gt;overview video&lt;/a&gt;:&lt;/p&gt;



&lt;figure class=&quot;wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio&quot;&gt;&lt;div class=&quot;wp-block-embed__wrapper&quot;&gt;

&lt;/div&gt;&lt;/figure&gt;



&lt;p&gt;You can take the latest release of Incus up for a spin through our online demo service at: &lt;a href=&quot;https://linuxcontainers.org/incus/try-it/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;https://linuxcontainers.org/incus/try-it/&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;And as always, my company is offering commercial support on Incus, ranging from by-the-hour support contracts to one-off services on things like initial migration from LXD, review of your deployment to squeeze the most out of Incus or even feature sponsorship. You’ll find all details of that here: &lt;a href=&quot;https://zabbly.com/incus&quot;&gt;https://zabbly.com/incus&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Donations towards my work on this and other open source projects is also always appreciated, you can  find me on &lt;a href=&quot;https://github.com/sponsors/stgraber&quot;&gt;Github Sponsors&lt;/a&gt;, &lt;a href=&quot;https://patreon.com/stgraber&quot;&gt;Patreon&lt;/a&gt; and &lt;a href=&quot;https://ko-fi.com/stgraber&quot;&gt;Ko-fi&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;Enjoy!&lt;/p&gt;


&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 01 Dec 2025 17:17:41 +0000</pubDate>
</item>
<item>
	<title>Launchpad News: Introducing Webhooks for Package Uploads in PPAs</title>
	<guid isPermaLink="false">https://blog.launchpad.net/?p=4508</guid>
	<link>https://blog.launchpad.net/general/introducing-webhooks-for-package-uploads-in-ppas</link>
	<description>&lt;p&gt;We have extended our webhooks capabilities to be able to trigger webhooks on successful and unsuccessful package uploads to Personal Package Archives (PPAs).&lt;/p&gt;



&lt;p&gt;When a new source package is uploaded to one of your PPAs, the system can now send an instant webhook notification to an endpoint you control. This will make it easier to build automations around package uploads and binary package builds in your PPAs.&lt;/p&gt;



&lt;p&gt;The webhook configuration includes scopes so you can configure to only trigger on successful use cases, or vice versa. Each webhook payload includes essential metadata about the upload – more details in the &lt;a href=&quot;https://documentation.ubuntu.com/launchpad/user/how-to/launchpad-api/webhooks/#source-package-upload&quot;&gt;Webhooks&lt;/a&gt; page of our user documentation.&lt;/p&gt;



&lt;p&gt;To try it out, you can add a webhook to your archive via the API (&lt;a href=&quot;https://launchpad.net/+apidoc/devel.html#webhook_target&quot;&gt;API reference&lt;/a&gt;), or via the UI by going to “Manage Webhooks” in your archive’s page.&lt;/p&gt;



&lt;p&gt;If you have ideas or feedback, reach out to us!&lt;/p&gt;</description>
	<pubDate>Mon, 01 Dec 2025 09:02:23 +0000</pubDate>
</item>
<item>
	<title>Podcast Ubuntu Portugal: E367 a Todo O Vapor</title>
	<guid isPermaLink="false">https://hub.podcastubuntuportugal.org/s/bj6nTbQAL2pB8Dp/download/e367.mp3</guid>
	<link>https://podcastubuntuportugal.org/e367/</link>
	<description>&lt;p&gt;Nesta semana e seguintes, vamos apostar no Ubuntu Touch e trazer o Software Livre nos telefones para as massas! O Miguel resolveu problemas com a ajuda da comunidade, o Diogo vai ao Porto evangelizar à bruta com o Ruben Carneiro e o sol brilhará para todos nós. A Canonical promete suporte para 15 anos; o Xubuntu foi hackeado porque não usa Hugo (womp, womp); o Miguel agora usa mano e bro em cada frase por causa de impressoras e vai converter-se ao Debian com Plasma e MEU DEUS, AS MÁQUINAS DA STEAM SÃO LINDAS!! FUUUUYYYYYOOOOH!!!&lt;/p&gt;
&lt;p&gt;Já sabem: oiçam, subscrevam e partilhem!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu Touch: &lt;a href=&quot;https://www.ubuntu-touch.io/&quot;&gt;https://www.ubuntu-touch.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sessão sobre Ubuntu Touch no LCD Porto (27 e 29 de Novembro): &lt;a href=&quot;https://porto.ectl.softwarelivre.eu/pt/schedule/2025/&quot;&gt;https://porto.ectl.softwarelivre.eu/pt/schedule/2025/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ruben Carneiro: &lt;a href=&quot;https://rubencarneiro.github.io/rubencarneiro.io/&quot;&gt;https://rubencarneiro.github.io/rubencarneiro.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bugs do UT no Gitlab: &lt;a href=&quot;https://gitlab.com/ubports/development/ubuntu-touch&quot;&gt;https://gitlab.com/ubports/development/ubuntu-touch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pesquisar sem IA: &lt;a href=&quot;https://noai.duckduckgo.com&quot;&gt;https://noai.duckduckgo.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Canon Pixma, controladores para Linux: &lt;a href=&quot;https://www.canon.pt/support/consumer/products/printers/pixma/ts-series/pixma-ts3150.html?type=drivers&amp;amp;os=Linux%20(64-bit)&quot;&gt;https://www.canon.pt/support/consumer/products/printers/pixma/ts-series/pixma-ts3150.html?type=drivers&amp;amp;os=Linux%20(64-bit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CUPS? Temos tudo: &lt;a href=&quot;https://openprinting.github.io/cups/&quot;&gt;https://openprinting.github.io/cups/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mais apps? Não, obrigado: &lt;a href=&quot;https://youtu.be/kfgtqNrGAFs&quot;&gt;https://youtu.be/kfgtqNrGAFs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Câmara da UBports: &lt;a href=&quot;https://open-store.io/app/camera.ubports&quot;&gt;https://open-store.io/app/camera.ubports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Manigâncias para o Mistério da Câmara Desaparecida: &lt;a href=&quot;https://forums.ubports.com/topic/10425/camera-app-cannot-be-installed/30&quot;&gt;https://forums.ubports.com/topic/10425/camera-app-cannot-be-installed/30&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Podcat: &lt;a href=&quot;https://open-store.io/app/podcat.cibersheep&quot;&gt;https://open-store.io/app/podcat.cibersheep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Podbird: &lt;a href=&quot;https://open-store.io/app/com.mikeasoft.podbird&quot;&gt;https://open-store.io/app/com.mikeasoft.podbird&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Debian 13 Trixie: &lt;a href=&quot;https://www.debian.org/releases/trixie/&quot;&gt;https://www.debian.org/releases/trixie/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KDE Plasma 6: &lt;a href=&quot;https://kde.org/announcements/megarelease/6/&quot;&gt;https://kde.org/announcements/megarelease/6/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;João Gabriel Ribeiro (Shifter.pt): &lt;a href=&quot;https://shifter.pt/author/joao-gabriel-ribeiro/&quot;&gt;https://shifter.pt/author/joao-gabriel-ribeiro/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Uncle Roger, embaixador da cozinha oriental, originário da Malásia: &lt;a href=&quot;https://www.youtube.com/channel/UCVjlpEjEY9GpksqbEesJnNA&quot;&gt;https://www.youtube.com/channel/UCVjlpEjEY9GpksqbEesJnNA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tio Roger num casamento Bengali em Sintra: &lt;a href=&quot;https://youtu.be/wJoLjhgguwA&quot;&gt;https://youtu.be/wJoLjhgguwA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;O site do Xubuntu foi hackeado e distribuiu malware:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.omgubuntu.co.uk/2025/10/xubuntu-website-malware-hack&quot;&gt;https://www.omgubuntu.co.uk/2025/10/xubuntu-website-malware-hack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.omgubuntu.co.uk/2025/11/xubuntu-website-breach-report&quot;&gt;https://www.omgubuntu.co.uk/2025/11/xubuntu-website-breach-report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.ubuntu.com/archives/xubuntu-users/2025-November/012210.html&quot;&gt;https://lists.ubuntu.com/archives/xubuntu-users/2025-November/012210.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A Canonical oferece suporte para 15 anos:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://discourse.ubuntu.com/t/foundations-team-updates-2025-11-20/72480/3?u=d0od&quot;&gt;https://discourse.ubuntu.com/t/foundations-team-updates-2025-11-20/72480/3?u=d0od&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.omgubuntu.co.uk/2025/11/ubuntu-lts-releases-15-years-of-support&quot;&gt;https://www.omgubuntu.co.uk/2025/11/ubuntu-lts-releases-15-years-of-support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ubuntu.com/blog/canonical-expands-total-coverage-for-ubuntu-lts-releases-to-15-years-with-legacy-add-on&quot;&gt;https://ubuntu.com/blog/canonical-expands-total-coverage-for-ubuntu-lts-releases-to-15-years-with-legacy-add-on&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Steam da Valve; hardware para fartura de jogos em Linux: &lt;a href=&quot;https://store.steampowered.com/sale/hardware&quot;&gt;https://store.steampowered.com/sale/hardware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Steam Machine:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/VkW3wTHT-p8&quot;&gt;https://youtu.be/VkW3wTHT-p8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/g3FkuZNSGkw&quot;&gt;https://youtu.be/g3FkuZNSGkw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Steam Frame:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/b7q2CS8HDHU&quot;&gt;https://youtu.be/b7q2CS8HDHU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/dU3ru09HTng&quot;&gt;https://youtu.be/dU3ru09HTng&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NeXT computer (1988): &lt;a href=&quot;https://en.wikipedia.org/wiki/NeXT_Computer&quot;&gt;https://en.wikipedia.org/wiki/NeXT_Computer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LoCo PT: &lt;a href=&quot;https://loco.ubuntu.com/teams/ubuntu-pt/&quot;&gt;https://loco.ubuntu.com/teams/ubuntu-pt/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mastodon: &lt;a href=&quot;https://masto.pt/@pup&quot;&gt;https://masto.pt/@pup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Youtube: &lt;a href=&quot;https://youtube.com/PodcastUbuntuPortugal&quot;&gt;https://youtube.com/PodcastUbuntuPortugal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;atribuição-e-licenças&quot;&gt;Atribuição e licenças&lt;/h3&gt;
&lt;p&gt;Este episódio foi produzido por Diogo Constantino, Miguel e Tiago Carrondo e editado pelo &lt;a href=&quot;https://senhorpodcast.pt/&quot;&gt;Senhor Podcast&lt;/a&gt;.
O website é produzido por Tiago Carrondo e o &lt;a href=&quot;https://gitlab.com/podcastubuntuportugal/website&quot;&gt;código aberto&lt;/a&gt; está licenciado nos termos da &lt;a href=&quot;https://gitlab.com/podcastubuntuportugal/website/main/LICENSE&quot;&gt;Licença MIT&lt;/a&gt;. (&lt;a href=&quot;https://creativecommons.org/licenses/by/4.0/)&quot;&gt;https://creativecommons.org/licenses/by/4.0/)&lt;/a&gt;. A música do genérico é: “Won’t see it comin’ (Feat Aequality &amp;amp; N’sorte d’autruche)”, por Alpha Hydrae e está licenciada nos termos da &lt;a href=&quot;https://creativecommons.org/publicdomain/zero/1.0/&quot;&gt;CC0 1.0 Universal License&lt;/a&gt;.
Os separadores de péssima qualidade foram tocados ao vivo e sem rede pelo Miguel, pelo que pedimos desculpa pelos incómodos causados. Os efeitos sonoros têm os seguintes créditos: [patrons laughing.mp3 by pbrproductions] (&lt;a href=&quot;https://freesound.org/s/418831/&quot;&gt;https://freesound.org/s/418831/&lt;/a&gt;) – License: Attribution 3.0. Concurso: [01 WINNER.mp3 by jordanielmills] – (&lt;a href=&quot;https://freesound.org/s/167535/&quot;&gt;https://freesound.org/s/167535/&lt;/a&gt;) – License: Creative Commons 0.
Este episódio e a imagem utilizada estão licenciados nos termos da licença: &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-nd/4.0/&quot;&gt;Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)&lt;/a&gt;, &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode&quot;&gt;cujo texto integral pode ser lido aqui&lt;/a&gt;. Estamos abertos a licenciar para permitir outros tipos de utilização, &lt;a href=&quot;https://podcastubuntuportugal.org/contactos&quot;&gt;contactem-nos&lt;/a&gt; para validação e autorização.
A arte de episódio foi criada por encomenda pela Shizamura - artista, ilustradora e autora de BD. Podem ficar a conhecer melhor a &lt;a href=&quot;https://ciberlandia.pt/@shizamura&quot;&gt;Shizamura na Ciberlândia&lt;/a&gt; e no &lt;a href=&quot;https://sarilho.net/&quot;&gt;seu sítio web&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Thu, 27 Nov 2025 00:00:00 +0000</pubDate>
        <enclosure url="https://hub.podcastubuntuportugal.org/s/bj6nTbQAL2pB8Dp/download/e367.mp3" length="46947055" type="audio/mpeg"/>
</item>
<item>
	<title>Balint Reczey: Think you can’t interpose static binaries with LD_PRELOAD? Think again!</title>
	<guid isPermaLink="false">https://balintreczey.hu/blog/?p=1042</guid>
	<link>https://balintreczey.hu/blog/think-you-cant-interpose-static-binaries-with-ld_preload-think-again/</link>
	<description>&lt;div class=&quot;wp-block-media-text alignwide is-vertically-aligned-center&quot;&gt;&lt;figure class=&quot;wp-block-media-text__media&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-853 size-thumbnail&quot; height=&quot;4001&quot; src=&quot;https://balintreczey.hu/blog/wp-content/uploads/2023/04/firebuild-logo.svg&quot; width=&quot;4614&quot; /&gt;&lt;/figure&gt;&lt;div class=&quot;wp-block-media-text__content&quot;&gt;
&lt;p&gt;Well, you are right, you can’t. At least not directly. This is well documented in many projects relying on interposing binaries, like faketime.&lt;/p&gt;



&lt;p&gt; &lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;



&lt;p&gt;&lt;/p&gt;



&lt;p&gt;But what if we could write something that would take a static binary, replace at least the direct syscalls with ones going through libc and load it with the dynamic linker? We are in luck, because the excellent QEMU project has a user space emulator! It can be compiled as a dynamically linked executable, honors LD_PRELOAD and uses the host libc’s syscall – well, at least sometimes. Sometimes syscalls just bypass libc.&lt;/p&gt;



&lt;p&gt;The missing piece was a way to make QEMU always take the interposable path and call the host libc instead of using an arch-specifix assembly routine (`safe_syscall_base`) to construct the syscall and going directly to the kernel. Luckily, this turned out to be doable. A small patch later, QEMU gained a switch that forces all syscalls through libc. Suddenly, our static binaries started looking a lot more dynamic!&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;$ faketime '2008-12-24 08:15:42'  qemu-x86_64 ./test_static_clock_gettime
2008-12-24 08:15:42.725404654
$ file test_static_clock_gettime 
test_clock_gettime: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, ...&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;With this in place, Firebuild can finally wrap even those secretive statically linked tools. QEMU runs them, libc catches their syscalls, &lt;code&gt;LD_PRELOAD&lt;/code&gt; injects &lt;code&gt;libfirebuild.so&lt;/code&gt;, and from there the usual interposition magic happens. The result: previously uncachable build steps can now be traced, cached, and shortcut just like their dynamic friends.&lt;/p&gt;



&lt;p&gt;There is one more problem though. Why would the static binaries deep in the build be run by QEMU? Firebuild also intercepts the `exec()` calls and now it rewrites them on the fly whenever the executed binary would be statically linked!&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;$ firebuild -d comm bash -c ./test_static
...
FIREBUILD: fd 9.1: ({ExecedProcess 161077.1, running, &quot;bash -c ./test_static&quot;, fds=[0: {FileFD ofd={FileO
FD #0 type=FD_PIPE_IN r} cloexec=false}, 1: {FileFD ofd={FileOFD #3 type=FD_PIPE_OUT w} {Pipe #0} close_o
n_popen=false cloexec=false}, 2: {FileFD ofd={FileOFD #4 type=FD_PIPE_OUT w} {Pipe #1} close_on_popen=fal
se cloexec=false}, 3: {FileFD NULL} /* times 2 */]})
{
    &quot;[FBBCOMM_TAG]&quot;: &quot;exec&quot;,
    &quot;file&quot;: &quot;test_static&quot;,
    &quot;// fd&quot;: null,
    &quot;// dirfd&quot;: null,
    &quot;arg&quot;: [
        &quot;./test_static&quot;
    ],
    &quot;env&quot;: [
        &quot;SHELL=/bin/bash&quot;,
 ...
        &quot;FB_SOCKET=/tmp/firebuild.cpMn75/socket&quot;,
        &quot;_=./test_static&quot;
    ],
    &quot;with_p&quot;: false,
    &quot;// path&quot;: null,
    &quot;utime_u&quot;: 0,
    &quot;stime_u&quot;: 1017
}
FIREBUILD: -&amp;gt; proc_ic_msg()  (message_processor.cc:782)  proc={ExecedProcess 161077.1, running, &quot;bash -c 
./test_static&quot;, fds=[0: {FileFD ofd={FileOFD #0 type=FD_PIPE_IN r} cloexec=false}, 1: {FileFD ofd={FileOF
D #3 type=FD_PIPE_OUT w} {Pipe #0} close_on_popen=false cloexec=false}, 2: {FileFD ofd={FileOFD #4 type=F
D_PIPE_OUT w} {Pipe #1} close_on_popen=false cloexec=false}, 3: {FileFD NULL} /* times 2 */]}, fd_conn=9.
1, tag=exec, ack_num=0
FIREBUILD:   -&amp;gt; send_fbb()  (utils.cc:292)  conn=9.1, ack_num=0 fd_count=0
Sending message with ancillary fds []:
{
    &quot;[FBBCOMM_TAG]&quot;: &quot;rewritten_args&quot;,
    &quot;arg&quot;: [
        &quot;/usr/bin/qemu-user-interposable&quot;,
        &quot;-libc-syscalls&quot;,
        &quot;./test_static&quot;
    ],
    &quot;path&quot;: &quot;/usr/bin/qemu-user-interposable&quot;
}
...
FIREBUILD: -&amp;gt; accept_ic_conn()  (firebuild.cc:139)  listener=6
...
FIREBUILD: fd 9.2: ({Process NULL})
{
    &quot;[FBBCOMM_TAG]&quot;: &quot;scproc_query&quot;,
    &quot;pid&quot;: 161077,
    &quot;ppid&quot;: 161073,
    &quot;cwd&quot;: &quot;/home/rbalint/projects/firebuild/test&quot;,
    &quot;arg&quot;: [
        &quot;/usr/bin/qemu-user-interposable&quot;,
        &quot;-libc-syscalls&quot;,
        &quot;./test_static&quot;
    ],
    &quot;env_var&quot;: [
        &quot;CCACHE_DISABLE=1&quot;,
...
        &quot;SHELL=/bin/bash&quot;,
        &quot;SHLVL=0&quot;,
        &quot;_=./test_static&quot;
    ],
    &quot;umask&quot;: &quot;0002&quot;,
    &quot;jobserver_fds&quot;: [],
    &quot;// jobserver_fifo&quot;: null,
    &quot;executable&quot;: &quot;/usr/bin/qemu-user-interposable&quot;,
    &quot;// executed_path&quot;: null,
    &quot;// original_executed_path&quot;: null,
    &quot;libs&quot;: [
        &quot;/lib/x86_64-linux-gnu/libatomic.so.1&quot;,
        &quot;/lib/x86_64-linux-gnu/libc.so.6&quot;,
        &quot;/lib/x86_64-linux-gnu/libglib-2.0.so.0&quot;,
        &quot;/lib/x86_64-linux-gnu/libm.so.6&quot;,
        &quot;/lib/x86_64-linux-gnu/libpcre2-8.so.0&quot;,
        &quot;/lib64/ld-linux-x86-64.so.2&quot;
    ],
    &quot;version&quot;: &quot;0.8.5.1&quot;
}
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The QEMU patch is &lt;a href=&quot;https://lists.gnu.org/archive/html/qemu-devel/2025-11/msg02559.html&quot;&gt;forwarded to qemu-devel&lt;/a&gt;. If it lands, anyone using QEMU user-mode emulation could benefit — not just Firebuild.&lt;/p&gt;



&lt;p&gt;For Firebuild users, though, the impact is immediate. Toolchains that mix dynamic and static helpers? Cross-builds that pull in odd little statically linked utilities? Previously “invisible” steps in your builds? All now fair game for caching.&lt;/p&gt;



&lt;p&gt;&lt;a href=&quot;https://github.com/firebuild/firebuild/releases/tag/v0.8.5&quot;&gt;Firebuild 0.8.5&lt;/a&gt; ships this new capability out of the box. Just update, make sure you’re using a patched QEMU, and enjoy the feeling of watching even static binaries fall neatly into place in your cached build graph. Ubuntu users can get the prebuilt patched QEMU packages from the &lt;a href=&quot;https://launchpad.net/~firebuild/+archive/ubuntu/stable&quot;&gt;Firebuild PPA&lt;/a&gt; already. &lt;/p&gt;



&lt;p&gt;Static binaries, welcome to the party!&lt;/p&gt;</description>
	<pubDate>Thu, 20 Nov 2025 20:56:17 +0000</pubDate>
</item>
<item>
	<title>Colin Watson: Free software activity in October 2025</title>
	<guid isPermaLink="false">tag:www.chiark.greenend.org.uk,2025-11-09:/~cjwatson/blog/activity-2025-10.html</guid>
	<link>https://www.chiark.greenend.org.uk/~cjwatson/blog/activity-2025-10.html</link>
	<description>&lt;p&gt;About 95% of my Debian contributions this month were
&lt;a href=&quot;https://www.freexian.com/about/debian-contributions/&quot;&gt;sponsored&lt;/a&gt; by Freexian.&lt;/p&gt;
&lt;p&gt;You can also support my work directly via
&lt;a href=&quot;https://liberapay.com/cjwatson&quot;&gt;Liberapay&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/cjwatson&quot;&gt;GitHub
Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;OpenSSH&lt;/h2&gt;
&lt;p&gt;OpenSSH upstream released
&lt;a href=&quot;https://www.openssh.org/releasenotes.html#10.1&quot;&gt;10.1p1&lt;/a&gt; this month, so I
upgraded to that.  In the process, I reverted a Debian patch that changed &lt;span class=&quot;caps&quot;&gt;IP&lt;/span&gt;
quality-of-service defaults, which &lt;a href=&quot;https://bugs.debian.org/923879&quot;&gt;made sense at the
time&lt;/a&gt; but has since been reworked upstream
anyway, so it makes sense to find out whether we still have similar
problems.  So far I haven’t heard anything bad in this area.&lt;/p&gt;
&lt;p&gt;10.1p1 caused a regression in the ssh-agent-filter package’s tests, which I
&lt;a href=&quot;https://bugzilla.mindrot.org/show_bug.cgi?id=3877&quot;&gt;bisected and chased up with
upstream&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;10.1p1 also had a few other user-visible regressions
(&lt;a href=&quot;https://bugs.debian.org/1117574&quot;&gt;#1117574&lt;/a&gt;,
&lt;a href=&quot;https://bugs.debian.org/1117594&quot;&gt;#1117594&lt;/a&gt;,
&lt;a href=&quot;https://bugs.debian.org/1117638&quot;&gt;#1117638&lt;/a&gt;,
&lt;a href=&quot;https://bugs.debian.org/1117720&quot;&gt;#1117720&lt;/a&gt;); I upgraded to
&lt;a href=&quot;https://www.openssh.org/releasenotes.html#10.2&quot;&gt;10.2p1&lt;/a&gt; which fixed some of
these, and &lt;a href=&quot;https://bugzilla.mindrot.org/show_bug.cgi?id=3879#c10&quot;&gt;contributed some upstream debugging
help&lt;/a&gt; to clear up the
rest.  While I was there, I also fixed &lt;a href=&quot;https://bugs.debian.org/1117965&quot;&gt;ssh-session-cleanup: fails due to
wrong $ssh_session_pattern&lt;/a&gt; in our packaging.&lt;/p&gt;
&lt;p&gt;Finally, I got all this into trixie-backports, which I intend to keep up to
date throughout the forky development cycle.&lt;/p&gt;
&lt;h2&gt;Python packaging&lt;/h2&gt;
&lt;p&gt;For some time, ansible-core has had occasional autopkgtest failures that
usually go away before anyone has a chance to look into them properly.  I
ran into these via openssh recently and decided to track them down.  It
turns out that they only happened when the &lt;code&gt;libpython3.13-stdlib&lt;/code&gt; package
had different versions in testing and unstable, because an integration test
setup script made a change that would be reverted if that package was ever
upgraded in the testbed, and one of the integration tests accidentally
failed to disable system apt sources comprehensively enough while testing
the behaviour of the &lt;code&gt;ansible.builtin.apt&lt;/code&gt; module.  I &lt;a href=&quot;https://salsa.debian.org/python-team/packages/ansible-core/-/compare/debian%2F2.19.3-1...debian%2F2.19.3-2?from_project_id=58498&quot;&gt;fixed this in
Debian&lt;/a&gt;
and &lt;a href=&quot;https://github.com/ansible/ansible/pull/86050&quot;&gt;contributed the relevant part
upstream&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We’ve started working on enabling Python 3.14 as a supported version in
Debian.  I fixed or helped to fix a number of packages for this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117894&quot;&gt;cxxopt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117978&quot;&gt;cython&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117891&quot;&gt;m2crypto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117899&quot;&gt;pymongo&lt;/a&gt; (already fixed by Alexandre
  Detiste, but after checking this I took the opportunity to simplify its
  arrangements for disabling broken tests and to switch to autopkgtest-pkg-pybuild)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117902&quot;&gt;python-cytoolz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117907&quot;&gt;python-lz4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117910&quot;&gt;python-msgspec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I upgraded these packages to new upstream versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aiomysql (fixing &lt;a href=&quot;https://bugs.debian.org/1118754&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CVE&lt;/span&gt;-2025-62611&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;audioread&lt;/li&gt;
&lt;li&gt;bitstruct&lt;/li&gt;
&lt;li&gt;black (fixing a &lt;a href=&quot;https://bugs.debian.org/1114067&quot;&gt;build failure&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;blake3-py&lt;/li&gt;
&lt;li&gt;buildbot (fixing a &lt;a href=&quot;https://bugs.debian.org/1117640&quot;&gt;regression&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;cxxopt&lt;/li&gt;
&lt;li&gt;django-cte&lt;/li&gt;
&lt;li&gt;django-pipeline&lt;/li&gt;
&lt;li&gt;django-q&lt;/li&gt;
&lt;li&gt;isort&lt;/li&gt;
&lt;li&gt;khard&lt;/li&gt;
&lt;li&gt;lazy-object-proxy (fixing a &lt;a href=&quot;https://bugs.debian.org/1117892&quot;&gt;build
  failure&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;psycopg3 (fixing a &lt;a href=&quot;https://bugs.debian.org/1117367&quot;&gt;build failure&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;pydantic&lt;/li&gt;
&lt;li&gt;pydantic-core&lt;/li&gt;
&lt;li&gt;pydantic-extra-types&lt;/li&gt;
&lt;li&gt;pytest-mock&lt;/li&gt;
&lt;li&gt;pytest-rerunfailures&lt;/li&gt;
&lt;li&gt;python-bcrypt&lt;/li&gt;
&lt;li&gt;python-bitarray&lt;/li&gt;
&lt;li&gt;python-confluent-kafka (&lt;a href=&quot;https://bugs.debian.org/1089748&quot;&gt;#1089748&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-crispy-bootstrap4&lt;/li&gt;
&lt;li&gt;python-crispy-bootstrap5&lt;/li&gt;
&lt;li&gt;python-django-mptt&lt;/li&gt;
&lt;li&gt;python-ewoksppf (fixing a &lt;a href=&quot;https://bugs.debian.org/1115134&quot;&gt;build
  failure&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-greenlet (fixing a &lt;a href=&quot;https://bugs.debian.org/1082800&quot;&gt;build failure on
  powerpc&lt;/a&gt; and a &lt;a href=&quot;https://bugs.debian.org/1117906&quot;&gt;Python 3.14 build
  failure&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-gssapi&lt;/li&gt;
&lt;li&gt;python-holidays&lt;/li&gt;
&lt;li&gt;python-persistent&lt;/li&gt;
&lt;li&gt;python-pyluach&lt;/li&gt;
&lt;li&gt;python-pytest-asyncio&lt;/li&gt;
&lt;li&gt;python-pytest-run-parallel&lt;/li&gt;
&lt;li&gt;python-pytokens (&lt;a href=&quot;https://github.com/tusharsadhwani/pytokens/pull/11&quot;&gt;contributed supporting fix
  upstream&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-semantic-release&lt;/li&gt;
&lt;li&gt;python-stdlib-list&lt;/li&gt;
&lt;li&gt;python-tblib&lt;/li&gt;
&lt;li&gt;python-telethon&lt;/li&gt;
&lt;li&gt;python-treq&lt;/li&gt;
&lt;li&gt;python-typing-inspection&lt;/li&gt;
&lt;li&gt;python-watchfiles&lt;/li&gt;
&lt;li&gt;pyupgrade&lt;/li&gt;
&lt;li&gt;rpds-py (fixing a &lt;a href=&quot;https://bugs.debian.org/1114347&quot;&gt;build failure&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;zope.hookable&lt;/li&gt;
&lt;li&gt;zope.schema&lt;/li&gt;
&lt;li&gt;zope.testrunner (removing &lt;a href=&quot;https://bugs.debian.org/1084020&quot;&gt;run-time dependency on
  setuptools&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I packaged &lt;a href=&quot;https://bugs.debian.org/1110998&quot;&gt;python-blockbuster&lt;/a&gt; and
&lt;a href=&quot;https://bugs.debian.org/1116692&quot;&gt;python-pytokens&lt;/a&gt;, needed as new
dependencies of various other packages.&lt;/p&gt;
&lt;p&gt;Santiago Vila filed a &lt;a href=&quot;https://udd.debian.org/cgi-bin/bts-usertags.cgi?user=debian-qa@lists.debian.org&amp;amp;tag=ftbfs-nocheck-profile&quot;&gt;batch of
bugs&lt;/a&gt;
about packages that fail to build when using the &lt;a href=&quot;https://wiki.debian.org/BuildProfileSpec&quot;&gt;&lt;code&gt;nocheck&lt;/code&gt; build
profile&lt;/a&gt;, and I fixed several of
these (generally just a matter of adjusting build-dependencies):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pastedeploy (&lt;a href=&quot;https://bugs.debian.org/1116833&quot;&gt;#1116833&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-ewokscore (&lt;a href=&quot;https://bugs.debian.org/1116858&quot;&gt;#1116858&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-ewoksdask (&lt;a href=&quot;https://bugs.debian.org/1116859&quot;&gt;#1116859&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-ewoksorange (&lt;a href=&quot;https://bugs.debian.org/1116862&quot;&gt;#1116862&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-odmantic (&lt;a href=&quot;https://bugs.debian.org/1116866&quot;&gt;#1116866&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-processview (&lt;a href=&quot;https://bugs.debian.org/1116871&quot;&gt;#1116871&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;python-semantic-release (&lt;a href=&quot;https://bugs.debian.org/1116881&quot;&gt;#1116881&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;sqlfluff (&lt;a href=&quot;https://bugs.debian.org/1116916&quot;&gt;#1116916&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I helped out with the &lt;a href=&quot;https://udd.debian.org/cgi-bin/bts-usertags.cgi?user=debian-science@lists.debian.org&amp;amp;tag=scikit-learn-1.7&quot;&gt;scikit-learn 1.7
transition&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117991&quot;&gt;python-gplearn&lt;/a&gt; (&lt;a href=&quot;https://github.com/trevorstephens/gplearn/pull/305&quot;&gt;contributed
  upstream&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117992&quot;&gt;scikit-optimize&lt;/a&gt; (&lt;a href=&quot;https://github.com/holgern/scikit-optimize/pull/8&quot;&gt;contributed
  upstream&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117989&quot;&gt;sklearn-pandas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I fixed or helped to fix several other build/test failures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1118418&quot;&gt;beangulp&lt;/a&gt; (&lt;a href=&quot;https://github.com/beancount/beangulp/pull/193&quot;&gt;contributed
  upstream&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117386&quot;&gt;beanquery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117391&quot;&gt;buildbot&lt;/a&gt; (&lt;a href=&quot;https://github.com/buildbot/buildbot/pull/8707&quot;&gt;contributed
  upstream&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1118419&quot;&gt;celery&lt;/a&gt; (&lt;a href=&quot;https://github.com/celery/celery/pull/9968&quot;&gt;contributed
  upstream&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1114604&quot;&gt;cython&lt;/a&gt; (only on i386; involved a rather
  slow bisection process first)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1118305&quot;&gt;django-measurement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1118306&quot;&gt;django-select2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1118170&quot;&gt;ocrmypdf&lt;/a&gt; (partial investigation, still open)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117421&quot;&gt;poetry-plugin-export&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1114282&quot;&gt;pytest-aiohttp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117423&quot;&gt;python-aiohttp-session&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1107129&quot;&gt;python-cups&lt;/a&gt; (cross-building)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117647&quot;&gt;python-django-postgres-extra&lt;/a&gt; (actually
  needed a fix in python-django)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1114715&quot;&gt;python-fabio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1114308&quot;&gt;python-jellyfish&lt;/a&gt; (&lt;a href=&quot;https://codeberg.org/jpt/jellyfish/pulls/232&quot;&gt;contributed
  upstream&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117369&quot;&gt;python-maturin&lt;/a&gt; (thanks to a patch from
  Peter Michael Green in &lt;a href=&quot;https://bugs.debian.org/1115459&quot;&gt;#1115459&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1114330&quot;&gt;python-requests-oauthlib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1115760&quot;&gt;python-telethon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1115756&quot;&gt;python-webargs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1114379&quot;&gt;silx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://salsa.debian.org/python-team/packages/sphinx-inline-tabs/-/compare/debian%2F2023.4.21-2...debian%2F2023.4.21-3?from_project_id=75611&quot;&gt;sphinx-inline-tabs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I fixed some other bugs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1105905&quot;&gt;cython: The man page is &lt;code&gt;/usr/bin/env: 'python': No such file or
  directory&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1078006&quot;&gt;depthcharge-tools: SyntaxWarnings with Python 3.12 about invalid escape
  sequences&lt;/a&gt; (&lt;a href=&quot;https://github.com/alpernebbi/depthcharge-tools/pull/9&quot;&gt;contributed
  upstream&lt;/a&gt; a while ago)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1112509&quot;&gt;django-auditlog: Please drop dependencies on python3-pytzdata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1118055&quot;&gt;pysmi: Might trigger: AttributeError: module ‘importlib’ has no attribute
  ‘machinery’&lt;/a&gt; (&lt;a href=&quot;https://github.com/etingof/pysmi/pull/74&quot;&gt;attempted to contribute
  upstream&lt;/a&gt;, although that
  repository is dead)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1115274&quot;&gt;python-msgspec: Please use pseudo-packages for architecture whitelisting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1118582&quot;&gt;python-tomlkit: Binary package rejected&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I investigated a &lt;a href=&quot;https://bugs.debian.org/1117768&quot;&gt;python-py build failure&lt;/a&gt;,
which turned out to have been fixed in Python 3.13.9.&lt;/p&gt;
&lt;p&gt;I adopted &lt;a href=&quot;https://bugs.debian.org/948809&quot;&gt;zope.hookable&lt;/a&gt; and
&lt;a href=&quot;https://bugs.debian.org/948812&quot;&gt;zope.location&lt;/a&gt; for the Python team.&lt;/p&gt;
&lt;p&gt;Following an &lt;span class=&quot;caps&quot;&gt;IRC&lt;/span&gt; question, I &lt;a href=&quot;https://salsa.debian.org/electronics-team/linux-gpib-user/-/merge_requests/1&quot;&gt;ported linux-gpib-user to
pybuild-plugin-pyproject&lt;/a&gt;,
and added tests to make sure the resulting binary package layout is correct.&lt;/p&gt;
&lt;h2&gt;Rust packaging&lt;/h2&gt;
&lt;p&gt;Another Pydantic upgrade meant I had to upgrade a corresponding stack of
Rust packages to new upstream versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rust-idna&lt;/li&gt;
&lt;li&gt;rust-jiter&lt;/li&gt;
&lt;li&gt;rust-pyo3&lt;/li&gt;
&lt;li&gt;rust-regex&lt;/li&gt;
&lt;li&gt;rust-regex-automata&lt;/li&gt;
&lt;li&gt;rust-speedate&lt;/li&gt;
&lt;li&gt;rust-uuid&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also upgraded rust-archery and rust-rpds.&lt;/p&gt;
&lt;h2&gt;Other bits and pieces&lt;/h2&gt;
&lt;p&gt;I fixed a few bugs in other packages I maintain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117014&quot;&gt;halibut: &lt;span class=&quot;caps&quot;&gt;FTCBFS&lt;/span&gt;: passes host flags to the build compiler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117112&quot;&gt;iprutils: No package available for other architectures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I investigated a &lt;a href=&quot;https://bugs.debian.org/1118530&quot;&gt;malware report against
tini&lt;/a&gt;, which I think we can prove to be a
false positive (at least under the reasonable assumption that there isn’t
malware hiding in libgcc or glibc).  Yay for reproducible builds!&lt;/p&gt;
&lt;p&gt;I noticed and fixed a &lt;a href=&quot;https://salsa.debian.org/debbugs-team/debbugs/-/merge_requests/25&quot;&gt;small &lt;span class=&quot;caps&quot;&gt;UI&lt;/span&gt; deficiency in
debbugs&lt;/a&gt;,
making the checkboxes under “Misc options” on package pages easier to hit.
This is merged but we haven’t yet deployed it.&lt;/p&gt;
&lt;p&gt;I notced and fixed a
&lt;a href=&quot;https://salsa.debian.org/debian/developers-reference/-/merge_requests/73&quot;&gt;typo&lt;/a&gt;
in the &lt;a href=&quot;https://www.debian.org/doc/manuals/developers-reference/pkgs.en.html#being-kind-to-porters&quot;&gt;Being kind to
porters&lt;/a&gt;
section of the Debian Developer’s Reference.&lt;/p&gt;
&lt;h2&gt;Code reviews&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://salsa.debian.org/debian/base-passwd/-/merge_requests/17&quot;&gt;base-passwd: Add clock
  group&lt;/a&gt; (rejected)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://salsa.debian.org/debbugs-team/debbugs/-/merge_requests/24&quot;&gt;debbugs: Fix dep8 autopkgtests, make Salsa &lt;span class=&quot;caps&quot;&gt;CI&lt;/span&gt; fully
  green&lt;/a&gt;
  (reviewed, awaiting revisions)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1117764&quot;&gt;python-gmpy2: &lt;span class=&quot;caps&quot;&gt;FTBFS&lt;/span&gt;&lt;/a&gt; (sponsored fix for
  Martin Kelly)&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Sun, 09 Nov 2025 15:33:33 +0000</pubDate>
</item>
<item>
	<title>St&amp;eacute;phane Graber: Introducing IncusOS!</title>
	<guid isPermaLink="false">https://stgraber.org/?p=1810</guid>
	<link>https://stgraber.org/2025/11/07/introducing-incusos/</link>
	<description>&lt;p&gt;After over a year of work, I’m very excited to announce the general availability of &lt;a href=&quot;https://linuxcontainers.org/incus-os/&quot;&gt;IncusOS&lt;/a&gt;, our own immutable OS image designed from the ground up to run &lt;a href=&quot;https://linuxcontainers.org/incus/&quot;&gt;Incus&lt;/a&gt;!&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://discuss.linuxcontainers.org/t/announcing-incusos/25139&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-1811&quot; height=&quot;640&quot; src=&quot;https://stgraber.org/wp-content/uploads/2025/11/image-1-1024x640.png&quot; width=&quot;1024&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;IncusOS is designed for the modern world, actively relying on both UEFI Secure Boot and TPM 2.0 for boot security and for full disk encryption. It’s a very locked down environment, both for security and for general reliability. There is no local or remote shell, everything must be done through the (authenticated) Incus API.&lt;br /&gt;&lt;br /&gt;Under the hood, it’s built on a minimal Debian 13 base, using the Zabbly builds of both the Linux kernel, ZFS and Incus, providing the latest stable versions of all of those. We rely a lot on the systemd tooling to handle image builds (mkosi), application installation (sysext), system updates (sysupdate) and a variety of other things from network configuration to partitioning.&lt;/p&gt;



&lt;p&gt;I recorded a &lt;a href=&quot;https://www.youtube.com/watch?v=Is_HgmwayGs&quot;&gt;demo video&lt;/a&gt; of its installation and basic usage both in a virtual machine and on physical hardware:&lt;/p&gt;



&lt;figure class=&quot;wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio&quot;&gt;&lt;div class=&quot;wp-block-embed__wrapper&quot;&gt;

&lt;/div&gt;&lt;/figure&gt;



&lt;p&gt;&lt;br /&gt;Full release announcement: &lt;a href=&quot;https://discuss.linuxcontainers.org/t/announcing-incusos/25139&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;https://discuss.linuxcontainers.org/t/announcing-incusos/25139&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 07 Nov 2025 09:33:48 +0000</pubDate>
</item>
<item>
	<title>The Fridge: Ubuntu Weekly Newsletter Issue 916</title>
	<guid isPermaLink="false">https://fridge.ubuntu.com/?p=10676</guid>
	<link>https://fridge.ubuntu.com/2025/11/03/ubuntu-weekly-newsletter-issue-916/</link>
	<description>&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://fridge.ubuntu.com/wp-content/uploads/2020/02/c9d7/header.png&quot; /&gt;&lt;/figure&gt;



&lt;p&gt;Welcome to the Ubuntu Weekly Newsletter, &lt;strong&gt;Issue 916 for the week of October 26 – November 1, 2025&lt;/strong&gt;. The full version of this issue is available &lt;a href=&quot;https://discourse.ubuntu.com/t/ubuntu-weekly-newsletter-issue-916/71163&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;In this issue we cover:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;Upgrades to 25.10 (Questing Quokka) are now live!&lt;/li&gt;&lt;li&gt;Ubuntu Stats&lt;/li&gt;&lt;li&gt;Hot in Support&lt;/li&gt;&lt;li&gt;Other Meeting Reports&lt;/li&gt;&lt;li&gt;Upcoming Meetings and Events&lt;/li&gt;&lt;li&gt;LoCo Events&lt;/li&gt;&lt;li&gt;Ubuntu Project docs: That’s a wrap!&lt;/li&gt;&lt;li&gt;Introducing architecture variants: amd64v3 now available in Ubuntu 25.10&lt;/li&gt;&lt;li&gt;[Ubuntu Studio] Upgrading from 25.04 to 25.10&lt;/li&gt;&lt;li&gt;Other Community News&lt;/li&gt;&lt;li&gt;What Say You&lt;/li&gt;&lt;li&gt;Ubuntu Cloud News&lt;/li&gt;&lt;li&gt;Canonical News&lt;/li&gt;&lt;li&gt;In the Press&lt;/li&gt;&lt;li&gt;In the Blogosphere&lt;/li&gt;&lt;li&gt;In Other News&lt;/li&gt;&lt;li&gt;Featured Audio and Video&lt;/li&gt;&lt;li&gt;Updates and Security for Ubuntu 22.04, 24.04, 25.04 and 25.10&lt;/li&gt;&lt;li&gt;And much more!&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;The Ubuntu Weekly Newsletter is brought to you by:&lt;/strong&gt;&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;Krytarik Raido&lt;/li&gt;&lt;li&gt;Bashing-om&lt;/li&gt;&lt;li&gt;Chris Guiver&lt;/li&gt;&lt;li&gt;Wild Man&lt;/li&gt;&lt;li&gt;irihapeti&lt;/li&gt;&lt;li&gt;And many others&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;If you have a story idea for the Weekly Newsletter, join the &lt;a href=&quot;https://lists.ubuntu.com/mailman/listinfo/Ubuntu-news-team&quot;&gt;Ubuntu News Team mailing list&lt;/a&gt; and submit it. Ideas can also be added to the &lt;a href=&quot;https://discourse.ubuntu.com/t/ubuntu-weekly-newsletter-ideas/40053&quot;&gt;wiki&lt;/a&gt;!&lt;/p&gt;



&lt;div class=&quot;wp-block-image&quot;&gt;&lt;figure class=&quot;alignleft&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://fridge.ubuntu.com/wp-content/uploads/2015/05/ab28/CCL.png&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href=&quot;https://fridge.ubuntu.com/2025/11/03/ubuntu-weekly-newsletter-issue-916/&quot;&gt;&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Mon, 03 Nov 2025 23:53:15 +0000</pubDate>
</item>
<item>
	<title>Scarlett Gately Moore: A New Chapter: Career Transition Update</title>
	<guid isPermaLink="false">https://www.scarlettgatelymoore.dev/?p=2141</guid>
	<link>https://www.scarlettgatelymoore.dev/a-new-chapter-career-transition-update/</link>
	<description>&lt;p&gt;I’m pleased to share that my career transition has been successful! I’ve joined our local county assessor’s office, beginning a new path in property assessment for taxation and valuation. While the compensation is modest, it offers the stability I was looking for.&lt;/p&gt;



&lt;p&gt;My new schedule consists of four 10-hour days with an hour commute each way, which means Monday through Thursday will be largely devoted to work and travel. However, I’ll have Fridays available for open source contributions once I’ve completed my existing website maintenance commitments.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Open Source Priorities&lt;/strong&gt;&lt;/h2&gt;



&lt;p&gt;Going forward, my contribution focus will be:&lt;/p&gt;



&lt;ol class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Ubuntu Community Council&lt;/li&gt;



&lt;li&gt;Kubuntu/Debian&lt;/li&gt;



&lt;li&gt;Snap packages (as time permits)&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;Regarding the snap packages: my earlier hope of transitioning them to Carl hasn’t worked out as planned. He’s taken on maintaining KDE Neon single-handedly, and understandably, adding snap maintenance on top of that proved unfeasible. I’ll do what I can to help when time allows.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Looking for Contributors&lt;/strong&gt;&lt;/h2&gt;



&lt;p&gt;If you’re interested in contributing to Kubuntu or helping with snap packages, I’d love to hear from you! Feel free to reach out—community involvement is what makes these projects thrive.&lt;/p&gt;



&lt;p&gt;Thanks for your patience and understanding as I navigate this transition.&lt;/p&gt;</description>
	<pubDate>Fri, 31 Oct 2025 15:38:55 +0000</pubDate>
</item>
<item>
	<title>Ubuntu Studio: Upgrading from 25.04 to 25.10</title>
	<guid isPermaLink="false">https://ubuntustudio.org/?p=3045</guid>
	<link>https://ubuntustudio.org/2025/10/upgrading-from-25-04-to-25-10/</link>
	<description>&lt;div class=&quot;wp-block-image&quot;&gt;&lt;figure class=&quot;alignright size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-2953&quot; height=&quot;128&quot; src=&quot;https://ubuntustudio.org/wp-content/uploads/2025/02/2be9/system-software-update.png&quot; width=&quot;126&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;



&lt;h2&gt;An issue has been identified&lt;/h2&gt;



&lt;p&gt;The Ubuntu Release team has now enabled upgrades from 25.04 to 25.10! This is great news! In fact, you may have noticed this icon on your toolbar and a notification to upgrade.&lt;/p&gt;



&lt;p&gt;However, upon doing so, you may have noticed something a little more unfortunate:&lt;/p&gt;



&lt;div class=&quot;wp-block-image&quot;&gt;&lt;figure class=&quot;aligncenter size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-3046&quot; height=&quot;305&quot; src=&quot;https://ubuntustudio.org/wp-content/uploads/2025/10/df61/Screenshot_20251029_110851.png&quot; width=&quot;680&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;



&lt;p&gt;Yep, we know. This tells you nothing about what is wrong. What is wrong is &lt;em&gt;slightly&lt;/em&gt; more technical. As it turns out, the backend application that actually performs the upgrade removed an argument from its command line unannounced during the Plucky Puffin release cycle, approximately a year ago.&lt;/p&gt;



&lt;p&gt;As our project leader, Erich Eickmeyer, maintains the upgrade notifier widget for both Ubuntu Studio and Kubuntu, he woke up and immediately got to work identifying what’s wrong and how to patch the Plasma widget in question to correctly execute the upgrade process. He has uploaded the fix, and it was accepted by a member of the Ubuntu Stable Release Updates team.&lt;/p&gt;



&lt;p&gt;At the moment, the fix needs to be tested and verified. In order to test it, one must install the fix from the &lt;code&gt;plucky-proposed&lt;/code&gt; repository. In order for it to be available, it must build for all architectures and, as of this writing, is awaiting building on &lt;code&gt;riscv64&lt;/code&gt; which has a 40-hour backlog.&lt;/p&gt;



&lt;h2&gt;The Workaround&lt;/h2&gt;



&lt;p&gt;If you wish to begin the upgrade process manually rather than waiting on the upgrade notifier fix to be implemented, feel free to make sure you are fully updated, type &lt;code&gt;alt-space&lt;/code&gt; to execute Krunner, and paste this:&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;do-release-upgrade -f DistUpgradeViewKDE&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;This is the exact command that will be executed by the notifier widget as soon as it is updated.&lt;/p&gt;



&lt;p&gt;Of course, if you’re in no hurry, feel free to wait until the notifier is updated and use that method. Do bear in mind, though, that as of this writing, &lt;strong&gt;you have exactly 90 days to perform the upgrade to 25.10&lt;/strong&gt; before your system will no longer be supported. At that time, you’ll risk being unable to upgrade at all unless certain procedures for End-Of-Life Upgrades are done, which can be tedious for those uncomfortable in a command line as it will require modifying system files.&lt;/p&gt;



&lt;h2&gt;Mea Culpa&lt;/h2&gt;



&lt;p&gt;We do apologize for the inconvenience. Testing upgrade paths like this are hard to do and things go missed, especially when teams don’t communicate with each other. We’re try to identify things before they happen but, unfortunately, certain items cannot be foreseen.&lt;br /&gt;&lt;br /&gt;This issue has now been added to the Ubuntu Studio 25.10 Release Notes.&lt;/p&gt;</description>
	<pubDate>Wed, 29 Oct 2025 20:08:52 +0000</pubDate>
</item>
<item>
	<title>Launchpad News: Make fetch service opt-in</title>
	<guid isPermaLink="false">https://blog.launchpad.net/?p=4492</guid>
	<link>https://blog.launchpad.net/general/make-fetch-service-opt-in</link>
	<description>&lt;p&gt;Launchpad Builders do not have direct access to the Internet. To reach external resources, they must acquire an authentication token that allows access to a restricted set of URLs via a proxy. This can either be a custom authenticated builder proxy or the fetch service.&lt;/p&gt;



&lt;p&gt;The fetch service is a custom sophisticated context-aware forward proxy. Whereas the builder proxy allows requests to allowlisted URLs, the fetch service also keeps track of requests and dependencies for a build.&lt;/p&gt;



&lt;p&gt;Users can now opt-in to use the fetch service while building snaps, charms, rocks and sourcecraft packages. You can read more about the fetch service &lt;a href=&quot;https://documentation.ubuntu.com/launchpad/developer/reference/services/fetch-service/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Why is the fetch service important?&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;To achieve traceability and reproducibility, artifact dependencies retrieved during a build must be identified. The fetch service mediates network access between the build host and the outside world, examining the request protocol, creating a manifest of the downloaded artifacts, and keeping a copy of the artifacts for archival and metadata extraction for each package build.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;How to use the fetch service?&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;To be able to use the fetch service, users must opt-in. For snaps, charms, rocks and sourcecraft packages, the &lt;code&gt;use_fetch_service&lt;/code&gt; flag should be set to &lt;code&gt;true&lt;/code&gt; in the API. For snaps and charms, this setting is also available in the &lt;em&gt;Edit Recipe&lt;/em&gt; UI page. &lt;/p&gt;



&lt;p&gt;The fetch service can be run in two modes, “strict” and “permissive”, where it defaults to the former. Both modes only allow certain resources and formats, as defined by inspectors which are responsible for inspecting the requests and the various downloads that are made during the build, ensuring that the requests are permitted. &lt;/p&gt;



&lt;p&gt;The “strict” mode errors out if any restrictions are violated. The “permissive” mode works similarly, but only logs a warning when encountering any violations. The mode can be configured using the &lt;code&gt;fetch_service_policy&lt;/code&gt; option via the API. For snaps and charms, the mode can also be selected from a dropdown on the &lt;em&gt;Edit Recipe&lt;/em&gt; UI page.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;When to use the fetch service?&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Use the fetch service when you need to keep track of requests and dependencies for a build, e.g., when you need to verify that the artifacts belong to secure, trusted sources.&lt;/p&gt;</description>
	<pubDate>Tue, 28 Oct 2025 11:31:12 +0000</pubDate>
</item>
<item>
	<title>The Fridge: Ubuntu Weekly Newsletter Issue 915</title>
	<guid isPermaLink="false">https://fridge.ubuntu.com/?p=10671</guid>
	<link>https://fridge.ubuntu.com/2025/10/27/ubuntu-weekly-newsletter-issue-915/</link>
	<description>&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://fridge.ubuntu.com/wp-content/uploads/2020/02/c9d7/header.png&quot; /&gt;&lt;/figure&gt;



&lt;p&gt;Welcome to the Ubuntu Weekly Newsletter, &lt;strong&gt;Issue 915 for the week of October 19 – 25, 2025&lt;/strong&gt;. The full version of this issue is available &lt;a href=&quot;https://discourse.ubuntu.com/t/ubuntu-weekly-newsletter-issue-915/70261&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;In this issue we cover:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;Enabling updates on Ubuntu 25.10 systems&lt;/li&gt;&lt;li&gt;[Updated] Questing Quokka Release Notes&lt;/li&gt;&lt;li&gt;Resolute Raccoon is now open for development&lt;/li&gt;&lt;li&gt;Ubuntu Stats&lt;/li&gt;&lt;li&gt;Hot in Support&lt;/li&gt;&lt;li&gt;Rocks Public Journal; 2025-21-10&lt;/li&gt;&lt;li&gt;Other Meeting Reports&lt;/li&gt;&lt;li&gt;Upcoming Meetings and Events&lt;/li&gt;&lt;li&gt;Vote result: LoCo rebranding and rescoping resolution&lt;/li&gt;&lt;li&gt;Discover your fully open source robotics observability at ROSCon 2025&lt;/li&gt;&lt;li&gt;Ubuntu 25.10 Release Party @ Taipei&lt;/li&gt;&lt;li&gt;LoCo Events&lt;/li&gt;&lt;li&gt;TPM-backed FDE: Take 2 minutes to help widen Ubuntu compatibility with your TPM configuration!&lt;/li&gt;&lt;li&gt;Canonical’s new design system : towards a design system ontology&lt;/li&gt;&lt;li&gt;Other Community News&lt;/li&gt;&lt;li&gt;Canonical News&lt;/li&gt;&lt;li&gt;In the Press&lt;/li&gt;&lt;li&gt;In the Blogosphere&lt;/li&gt;&lt;li&gt;Other Articles of Interest&lt;/li&gt;&lt;li&gt;Featured Audio and Video&lt;/li&gt;&lt;li&gt;Updates and Security for Ubuntu 22.04, 24.04, 25.04 and 25.10&lt;/li&gt;&lt;li&gt;And much more!&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;The Ubuntu Weekly Newsletter is brought to you by:&lt;/strong&gt;&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;Krytarik Raido&lt;/li&gt;&lt;li&gt;Bashing-om&lt;/li&gt;&lt;li&gt;Chris Guiver&lt;/li&gt;&lt;li&gt;Wild Man&lt;/li&gt;&lt;li&gt;Cristovao Cordeiro (cjdc) – Rocks&lt;/li&gt;&lt;li&gt;irihapeti&lt;/li&gt;&lt;li&gt;And many others&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;If you have a story idea for the Weekly Newsletter, join the &lt;a href=&quot;https://lists.ubuntu.com/mailman/listinfo/Ubuntu-news-team&quot;&gt;Ubuntu News Team mailing list&lt;/a&gt; and submit it. Ideas can also be added to the &lt;a href=&quot;https://discourse.ubuntu.com/t/ubuntu-weekly-newsletter-ideas/40053&quot;&gt;wiki&lt;/a&gt;!&lt;/p&gt;



&lt;div class=&quot;wp-block-image&quot;&gt;&lt;figure class=&quot;alignleft&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://fridge.ubuntu.com/wp-content/uploads/2015/05/ab28/CCL.png&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href=&quot;https://fridge.ubuntu.com/2025/10/27/ubuntu-weekly-newsletter-issue-915/&quot;&gt;&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Mon, 27 Oct 2025 21:51:36 +0000</pubDate>
</item>
<item>
	<title>Paul Tagliamonte: It's NOT always DNS.</title>
	<guid isPermaLink="true">https://notes.pault.ag/its-not-always-dns/</guid>
	<link>https://notes.pault.ag/its-not-always-dns/</link>
	<description>&lt;p&gt;I’ve written down a new rule (no name, sorry) that I’ll be repeating to myself
and those around me. &lt;strong&gt;“If you can replace ‘DNS’ with ‘key value store mapping
a name to an ip’ and it still makes sense, it was not, in fact, DNS.”&lt;/strong&gt; Feel
free to repeat it along with me.&lt;/p&gt;
&lt;p&gt;Sure, the “It’s always DNS” meme is funny the first few hundred times you see
it – but what’s less funny is when critical thinking ends because a DNS query
is involved. DNS failures are often the first observable problem &lt;em&gt;because&lt;/em&gt;
it’s one of the first things that needs to be done. DNS is fairly complicated,
implementation-dependent, and at times – frustrating to debug – but it is not
the operational hazard it’s made out to be. It’s at best a shallow take, and at
worst actively holding teams back from understanding their true operational
risks.&lt;/p&gt;
&lt;p&gt;IP connectivity failures between a host and the rest of the network is &lt;em&gt;not&lt;/em&gt; a
reason to blame DNS. This would happen no matter how you distribute the updated
name to IP mappings. Wiping out
&lt;a href=&quot;https://aws.amazon.com/message/101925/&quot;&gt;all the records during the course of operations due to an automation bug&lt;/a&gt;
is &lt;em&gt;not&lt;/em&gt; a reason to blame DNS. This, too, would happen no matter how you
distribute the name to IP mappings. Something made the choice to delete all the
mappings, and &lt;a href=&quot;https://web.archive.org/web/20251005205731/http://www.team.net/mjb/hawg.html&quot;&gt;it did what you asked it to do&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There’s plenty of annoying DNS specific sharp edges to blame when things &lt;em&gt;do&lt;/em&gt;
go wrong (like &lt;code&gt;8.8.8.8&lt;/code&gt; and &lt;code&gt;1.1.1.1&lt;/code&gt; disagreeing about resolving a domain
because of DNSSEC, or since we’re on the topic, a
&lt;a href=&quot;https://slack.engineering/what-happened-during-slacks-dnssec-rollout/&quot;&gt;DNSSEC rollout bricking prod for hours&lt;/a&gt;)
for us to be cracking jokes anytime a program makes a DNS request.&lt;/p&gt;
&lt;p&gt;We can do better.&lt;/p&gt;</description>
	<pubDate>Mon, 27 Oct 2025 17:15:00 +0000</pubDate>
</item>
<item>
	<title>Julian Andres Klode: Sound Removals</title>
	<guid isPermaLink="true">https://blog.jak-linux.org/2025/10/18/sound-removals/</guid>
	<link>https://blog.jak-linux.org/2025/10/18/sound-removals/</link>
	<description>&lt;h2 id=&quot;problem-statement&quot;&gt;Problem statement&lt;/h2&gt;
&lt;p&gt;Currently if you have an automatically installed package A (= 1) where&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A (= 1) Depends B (= 1)&lt;/li&gt;
&lt;li&gt;A (= 2) Depends B (= 2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and you upgrade B from 1 to 2; then  you can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Remove A (= 1)&lt;/li&gt;
&lt;li&gt;Upgrade A to version 2&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If A was installed by a chain initiated by Recommends (say X Rec Y, Y Depends A), the solver sometimes preferred removing A (and anything depending on it until it got).&lt;/p&gt;
&lt;p&gt;I have a fix pending to introduce eager Recommends which fixes the practical case, but
this is still not &lt;em&gt;sound&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In fact we can show that the solver produces the wrong result for small
minimal test cases, as well as the right result for some others without the
fix (hooray?).&lt;/p&gt;
&lt;p&gt;Ensuring sound removals is more complex, and first of all it begs the question: When
is a removal sound? This, of course, is on us to define.&lt;/p&gt;
&lt;p&gt;An easy case can be found in the &lt;a href=&quot;https://www.debian.org/doc/debian-policy/ch-relationships.html#replacing-whole-packages-forcing-their-removal&quot;&gt;Debian policy, 7.6.2 “Replacing whole packages, forcing their removal”&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;B (= 2)&lt;/code&gt; declares a &lt;code&gt;Conflicts: A (= 1)&lt;/code&gt; and &lt;code&gt;Replaces: A (= 1)&lt;/code&gt;, then the removal
is valid. However this is incomplete as well, consider it declares &lt;code&gt;Conflicts: A (&amp;lt; 1)&lt;/code&gt;
and &lt;code&gt;Replaces: A (&amp;lt; 1)&lt;/code&gt;; the solution to remove A rather than upgrade it would still
be wrong.&lt;/p&gt;
&lt;p&gt;This indicates that we should only allow removing &lt;code&gt;A&lt;/code&gt; if the conflicts could not be solved
by upgrading it.&lt;/p&gt;
&lt;p&gt;The other case to explore is package removals. If B is removed, A should be removed as well;
however it there is another package X that &lt;code&gt;Provides: B (= 1)&lt;/code&gt; and it is marked for install,
A should not be removed. That said, the solver is not allowed to install X to satisfy the
depends &lt;code&gt;B (= 1)&lt;/code&gt; - only to satisfy other dependencies [we do not want to get into endless
loops where we switch between alternatives to keep reverse dependencies installed].&lt;/p&gt;
&lt;h2 id=&quot;proposed-solution&quot;&gt;Proposed solution&lt;/h2&gt;
&lt;p&gt;To solve this, I propose the following definition:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Definition (sound removal)&lt;/strong&gt;: A removal of package &lt;code&gt;P&lt;/code&gt; is sound if either:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A version &lt;code&gt;v&lt;/code&gt; is installed that &lt;em&gt;package-conflicts&lt;/em&gt; with B.&lt;/li&gt;
&lt;li&gt;A package &lt;code&gt;Q&lt;/code&gt; is removed and the installable versions of P &lt;em&gt;package-depends&lt;/em&gt; on Q.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;where the other definitions are:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Definition (installable version)&lt;/strong&gt;: A version &lt;code&gt;v&lt;/code&gt; is installable if either it is installed,
or it is newer than an installed version of the same package (you may wish to change this to
accomodate downgrades, or require strict pinning, but here be dragons).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Definition (package-depends):&lt;/strong&gt; A version &lt;code&gt;v&lt;/code&gt; &lt;em&gt;package-depends&lt;/em&gt; on a package B if either:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;there exists a dependency in &lt;code&gt;v&lt;/code&gt; that can be solved by any version of &lt;code&gt;B&lt;/code&gt;, or&lt;/li&gt;
&lt;li&gt;there exists a package &lt;code&gt;C&lt;/code&gt; where &lt;code&gt;v package-depends C&lt;/code&gt; and &lt;code&gt;any (c in C) package-depends B&lt;/code&gt; (transitivity)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Definition (package-conflicts):&lt;/strong&gt; A version &lt;code&gt;v&lt;/code&gt; &lt;em&gt;package-conflicts&lt;/em&gt; with an installed package &lt;code&gt;B&lt;/code&gt; if either:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;it declares a conflicts against an installable version of B; or&lt;/li&gt;
&lt;li&gt;there exists a package &lt;code&gt;C&lt;/code&gt; where &lt;code&gt;v package-conflicts C&lt;/code&gt;,
and &lt;code&gt;b package-depends C&lt;/code&gt; for installable versions b.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;translating-this-into-a-modified-sat-solver&quot;&gt;Translating this into a (modified) SAT solver&lt;/h2&gt;
&lt;p&gt;One approach may be to implement the logic in the conflict analysis that drives backtracking, i.e.
we assume a package &lt;code&gt;A&lt;/code&gt; and when we reach &lt;code&gt;not A&lt;/code&gt;, we analyse if the implication graph for &lt;code&gt;not A&lt;/code&gt;
constitutes a sound removal, and then replace the assumption &lt;code&gt;A&lt;/code&gt; with the assumption
&lt;code&gt;A or &quot;learned reason&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;However, while this seems a plausible mechanism for a DPLL solver, for a modern CDCL solver,  it’s
not immediately evident how to analyse whether &lt;code&gt;not A&lt;/code&gt; is sound if the reason for it is a learned
clause, rather than a problem clause.&lt;/p&gt;
&lt;p&gt;Instead we propose a static encoding of the rules into a slightly modified SAT solver:&lt;/p&gt;
&lt;p&gt;Given c1, …, cn that transitive-conflicts A and D1, …, Dn that A package-depends on,
introduce the rule:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;A unless c1 or c2 or  ... cn ... or not D1 or not D2 ... or not Dn&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Rules of the form &lt;code&gt;A... unless B...&lt;/code&gt; - where &lt;code&gt;A...&lt;/code&gt; and &lt;code&gt;B...&lt;/code&gt; are CNF - are
intuitively the same as &lt;code&gt;A... or B...&lt;/code&gt;, however the semantic here is different:
We are not allowed to select &lt;code&gt;B...&lt;/code&gt; to satisfy this clause.&lt;/p&gt;
&lt;p&gt;This requires a SAT solver that tracks a reason for each literal being assigned,
such as solver3, rather than a SAT solver like MiniSAT that only tracks reasons across
propagation (solver3 may track &lt;code&gt;A depends B or C&lt;/code&gt; as the reason for &lt;code&gt;B&lt;/code&gt; without evaluating
&lt;code&gt;C&lt;/code&gt;, whereas MiniSAT would only track it as the reason given &lt;code&gt;not C&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&quot;is-it-actually-sound&quot;&gt;Is it actually sound?&lt;/h2&gt;
&lt;p&gt;The proposed definition of a sound removal may still proof unsound as I either missed
something in the conclusion of the proposed definition that violates my goal I set out
to achieve, or I missed some of the goals.&lt;/p&gt;
&lt;p&gt;I challenge you to find cases that cause removals that look wrong :D&lt;/p&gt;</description>
	<pubDate>Sat, 18 Oct 2025 19:37:17 +0000</pubDate>
</item>
<item>
	<title>Kubuntu General News: Kubuntu 25.10 “Questing Quokka” Released:</title>
	<guid isPermaLink="false">https://kubuntu.org/?p=5351</guid>
	<link>https://kubuntu.org/news/kubuntu-25-10-questing-quokka-released/</link>
	<description>&lt;p&gt;October 9, 2025 – The Kubuntu team is thrilled to announce the release of Kubuntu 25.10, codenamed “Questing Quokka”!&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-5354&quot; height=&quot;473&quot; src=&quot;https://kubuntu.org/wp-content/uploads/2025/10/b709/Kubuntu_Questing.png&quot; width=&quot;840&quot; /&gt;&lt;/figure&gt;



&lt;p&gt;As a community-driven flavor of Ubuntu, Kubuntu continues its mission to deliver the cutting-edge KDE software ecosystem on top of Ubuntu’s rock-solid foundation. This interim release, aligned with Ubuntu’s six-month cycle, packs in the freshest updates to Plasma, Frameworks, and applications, ensuring a smooth, performant desktop experience for millions of users worldwide.&lt;/p&gt;



&lt;p&gt;Building on the Ubuntu 25.10 base released today by Canonical, Kubuntu 25.10 introduces Plasma 6.4 as the flagship update, alongside Qt 6.9, KDE Frameworks 6.17.0, and the latest KDE Gear 25.08 suite.&lt;/p&gt;



&lt;p&gt;We’ve also upgraded to Linux kernel 6.17 for enhanced hardware support and efficiency. Whether you’re a developer, creator, or everyday user, this release emphasizes Wayland adoption, modern security, and seamless integration with the open source world.&lt;/p&gt;



&lt;p&gt;Kubuntu remains completely free to download, use, and share—empowering our global community to innovate without barriers. Download it now from &lt;a href=&quot;https://kubuntu.org/getkubuntu&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;kubuntu.org/getkubuntu&lt;/a&gt; and join the conversation in our forums or IRC channels.&lt;/p&gt;



&lt;h2&gt;Three Exciting New Features for Kubuntu Users&lt;/h2&gt;



&lt;p&gt;Here are three standout enhancements that Kubuntu 25.10 brings to your desktop, designed to make your workflow faster, more secure, and visually stunning:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;&lt;strong&gt;KDE Plasma 6.4: A Refined and Responsive Desktop&lt;/strong&gt; Dive into the fifth feature release of Plasma 6, complete with Qt 6.8 and Frameworks 6.17.0. This update refines the desktop with smoother animations, improved widget customization, and better multi-monitor handling. It’s a big win for productivity, letting you tailor your environment like never before while enjoying the stability of Ubuntu’s core.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Plasma Wayland as Default Session&lt;/strong&gt; Say goodbye to legacy X11 limitations—Wayland is now the go-to session for superior graphics rendering, reduced latency, and enhanced security. With hardware-accelerated compositing baked in, you’ll notice snappier video playback and app responsiveness. (X11 fans, no worries: it’s still available via a simple package install.) This shift future-proofs your setup for the next era of Linux desktops.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rust-Powered sudo-rs for Safer System Management&lt;/strong&gt; Leveraging Ubuntu’s new memory-safe implementations, Kubuntu defaults to sudo-rs—a Rust-based reimplementation of sudo. It slashes vulnerabilities common in traditional tools, making privilege escalation quicker and more secure without compromising usability. Paired with NTS-enabled NTP for tamper-proof time syncing, your system stays locked down while you focus on what matters.&lt;/li&gt;&lt;/ul&gt;



&lt;h2&gt;What’s New Under the Hood&lt;/h2&gt;



&lt;p&gt;Beyond these highlights, Kubuntu 25.10 inherits Ubuntu’s robust platform upgrades:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Linux Kernel 6.17&lt;/strong&gt;: Better Arm and RISC-V support, nested virtualization, and Intel TDX for confidential computing—ideal for developers and edge deployments.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Updated Developer Tools&lt;/strong&gt;: OpenJDK 25, Python 3.14 RC3, Golang 1.25, GCC 15, and Rust 1.85 (with 1.88 available) to supercharge your coding sessions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Enhanced Security and Accessibility&lt;/strong&gt;: Experimental TPM-backed full disk encryption with recovery options, improved Bluetooth audio (AAC codecs via restricted extras), and broader accessibility features to meet global standards.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;KDE Applications Galore&lt;/strong&gt;: Everything from Dolphin file manager to Konsole terminal refreshed to 25.08 versions, plus legacy Qt5/KF5 support for your favorite older apps.&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;This release underscores Kubuntu’s commitment to being at the heart of the open source ecosystem—pushing boundaries with KDE while riding Ubuntu’s reliable waves. A huge thank you to our volunteer contributors, testers, and the upstream KDE team for making this possible.&lt;/p&gt;



&lt;p&gt;Ready to quokka-hop into the future? Upgrade today or install fresh. Questions? Head to  &lt;a href=&quot;https://discourse.ubuntu.com/c/flavors/kubuntu/187&quot;&gt;https://discourse.ubuntu.com/c/flavors/kubuntu/187&lt;/a&gt; or ping us on Matrix at &lt;a href=&quot;https://matrix.to/#/#kubuntu:matrix.org&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;#kubuntu:matrix.org&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;Stay tuned for the Ubuntu Summit on October 23-24, where we’ll showcase more on Kubuntu’s role in open source innovation&lt;/p&gt;



&lt;p&gt;P.S New updated website coming soon…. keep an eye on kubuntu.org for when we switch&lt;/p&gt;</description>
	<pubDate>Fri, 10 Oct 2025 13:48:07 +0000</pubDate>
</item>
<item>
	<title>Erich Eickmeyer: Why I Won’t Be Attending or Speaking at Ubuntu Summit 25.10</title>
	<guid isPermaLink="false">http://ericheickmeyer.com/?p=6134</guid>
	<link>https://ericheickmeyer.com/2025/10/09/why-i-wont-be-attending-or-speaking-at-ubuntu-summit-25-10/</link>
	<description>&lt;p&gt;Ubuntu Summit’s decision to go exclusively online, with the exception of those speaking at the Summit in London, UK, is anti-collaborative and turns its back on the very people who make Ubuntu what it is: its community of volunteers and developers. Ubuntu Summit was created from the dust of the Ubuntu Developer Summit in 2022 to recognize the community. It no longer serves that purpose.&lt;/p&gt;



&lt;p&gt;As many know, I have been the lead of Ubuntu Studio for more than 7 years. I’m the longest-tenured Ubuntu Studio lead. I owe much of the foundation that was built to my predecessors: Luke Yelavich (founder), Scott Lavender, Kaj Ailomaa, and Set Halstrom. It is a true labor of love for me, and is the foundation for much of what I do.&lt;/p&gt;



&lt;p&gt;I have worked myself through the ranks of Ubuntu, becoming a small-time packager for a small set of Ubuntu packages, then the Ubuntu Studio packageset, moving up to MOTU (Master of the Universe). I also served on the Ubuntu Community Council and am a current Discourse moderator.&lt;/p&gt;



&lt;p&gt;Community and the love of people is a huge motivation for me. Granted, for those first four years, I hadn’t ever met the people I was collaborating with to make Ubuntu Studio what it is.&lt;/p&gt;



&lt;p&gt;Then in August 2022, I was invited to attend the first ever Ubuntu Summit 2022 in Prague, Czechia. Having never travelled abroad before and never having even been off the continent of North America, itself a challenge as getting a U.S. passport is neither cheap nor easy, I was reluctant at first. Then I managed to get my passport, as well as the funds and passports to bring my wife and son to Ubuntu Summit.&lt;/p&gt;



&lt;p&gt;That experience changed my life and the life of my entire family. My son, 10 at the time, was the youngest registered attendee. My wife was inspired to bring back Edubuntu, which had been defunct for nine long years by the time it was revived that following spring.&lt;/p&gt;



&lt;p&gt;These are the things that happen when you have personal connections with people. If you’ve never read the book before, I encourage you to read &lt;em&gt;&lt;a href=&quot;https://www.nurturingparenting.com/images/cmsfiles/hardwired_to_connect.pdf&quot;&gt;Hardwired to Connect&lt;/a&gt;&lt;/em&gt;, which is a research paper published by a bunch of scientists. In essence, it says that people’s brains are wired, from birth, to engage in communities in for personal, in-person connections. It’s a scientific study that took years and is an excellent introduction to why we are the way we are.&lt;/p&gt;



&lt;p&gt;Much of my education revolves around the very idea of building personal communities, which is one reason I was appalled when Ubuntu Summit, starting with 25.10, while it would be twice a year, it would be online-only except for the speakers. Having spoken at the past three, I was planning to take a year off from speaking, while still being there to represent as an Ubuntu Flavor Lead with my wife, also a now Flavor Lead.&lt;/p&gt;



&lt;p&gt;If it weren’t for that initial Ubuntu Summit, in person, my wife and son would not have been as interested or as involved as they are today. The subsequent years only strengthened that involvement. &lt;/p&gt;



&lt;p&gt;Now, it’s going to be an online-focused approach. I get it. It’s cheaper and easier. Also, those attending online were just watching a livestream anyhow. The Local Communities (LoCos) can get together on their own if they want to do a big event. It’s easier to reach more people if you do everything online.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Except it’s not.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;For instance, the nearest active LoCo to me, in the Seattle-Tacoma area, is the Southern California LoCo. Meetups with them are logistically impossible. Same if I were to go to the Arizona LoCo; it’s just not possible. Most of the states in the United States are huge, so if there were one LoCo per state, it wouldn’t be correct. To be honest, I have no desire, time, or energy left to start and lead a LoCo in my area. Besides that, there used to be one for my state, but it’s long gone.&lt;/p&gt;



&lt;p&gt;Furthermore, with the exception of me and my wife, us flavor leads are scattered to the globe. It used to be that we would meet online throughout the year every other month and then meet together once a year at Ubuntu Summit. That’s gone now.&lt;/p&gt;



&lt;p&gt;Again, I get it. Canonical is a company that is and always has been majority remote work. Except for one thing: they get together &lt;strong&gt;twice a year&lt;/strong&gt; in-person, and are even given T-Shirts to celebrate the immediately-prior release &lt;em&gt;which was partially built by volunteers&lt;/em&gt;. Those of us who give our time, energy, and effort to the Ubuntu community aren’t given that in-person experience, let alone a T-Shirt. The very lifeblood of what makes Ubuntu so great isn’t given the ability to meet in-person. That’s been stripped from us, and it came as a complete surprise.&lt;/p&gt;



&lt;p&gt;I’m not without ideas for solutions to problems, though. Rather than be completely destructive in this post, I can be constructive. My solution to this would be a compromise:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Have the Summit be in-person once a year following the &lt;code&gt;yy.04&lt;/code&gt; release
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Have that one go back to being what it was. It can either have booths like 2024 did or go back to being talk/workshop-focused like years prior. It doesn’t matter, &lt;strong&gt;it just needs to be in-person&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Have the Summit be online once a year following the &lt;code&gt;yy.10&lt;/code&gt; release&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;I don’t think this is too much to ask. The reward of personal connections when doing something remote for most of the year is a small price to pay, no matter the cost. Personal connections are tantamount to a healthy community.&lt;/p&gt;



&lt;p&gt;I think my compromise would prevent the Summit from dying just like the Ubuntu Developer Summit did once it went online-only. The way I see it is with the current status-quo, history is repeating itself.&lt;/p&gt;



&lt;p&gt;I’m sure people at Canonical don’t see it this way because they meet with the people they work with the most twice a year. Those of us from the Ubuntu community that are developers aren’t given that luxury. We’re not even given that luxury once a year now. We’re not even given a T-Shirt!&lt;/p&gt;



&lt;p&gt;Am I angry? A little. Do I feel betrayed by the very community I have given so much to over the years? Absolutely. Either way, I believe an online-only Summit is anti-collaborative in that it removes personal connections from the equation, which goes against the very fiber of my being.&lt;/p&gt;



&lt;p&gt;Thank you for reading this, and I hope this reaches the people I’m trying to reach and have it speak for those who either won’t speak-up or don’t think they can make a difference.&lt;/p&gt;</description>
	<pubDate>Thu, 09 Oct 2025 22:01:09 +0000</pubDate>
</item>
<item>
	<title>Lubuntu Blog: Lubuntu 25.10 (Questing Quokka) Released!</title>
	<guid isPermaLink="false">https://lubuntu.me/?p=4159</guid>
	<link>https://lubuntu.me/lubuntu-25-10-questing-quokka-released/</link>
	<description>The Lubuntu Team is proud to announce Lubuntu 25.10, codenamed Questing Quokka. Lubuntu 25.10 is the 29th release of Lubuntu, the 15th release of Lubuntu with LXQt as the default desktop environment. Download and Support Lifespan With 25.10 being an interim release, it will follow the standard non-LTS support period of nine months; this means […]</description>
	<pubDate>Thu, 09 Oct 2025 14:05:30 +0000</pubDate>
</item>
<item>
	<title>Sean Davis: Xubuntu 25.10 &quot;Questing Quokka&quot;</title>
	<guid isPermaLink="false">https://seand.xyz/tag/xubuntu/rss/68e73e02fa4f1216ce0f75bd</guid>
	<link>https://seand.xyz/blog/2025/10/09/xubuntu-25-10-questing-quokka/</link>
	<description>&lt;img alt=&quot;Xubuntu 25.10 &amp;quot;Questing Quokka&amp;quot;&quot; src=&quot;https://seand.xyz/content/images/2025/10/xubuntu-2510-featured.png&quot; /&gt;&lt;p&gt;&lt;em&gt;A Critical Moment and a Glimpse of the Future&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://wiki.xubuntu.org/releases/25.10/release-notes?ref=seand.xyz&quot; rel=&quot;noreferrer&quot;&gt;Xubuntu 25.10&lt;/a&gt;, codenamed &quot;Questing Quokka,&quot; is the fortieth release of the Xfce-powered Ubuntu flavor. Built on the 6.17 Linux kernel, Xfce 4.20, MATE 1.26, and GNOME 49, this release continues to deliver the fast, tightly-integrated, and user-friendly experience that Xubuntu users expect, even on modest hardware.&lt;/p&gt;&lt;p&gt;Today, I&amp;amp;aposll explore where Xubuntu stands as it approaches its twentieth anniversary and share what&amp;amp;aposs new (and what&amp;amp;aposs still rough around the edges) in this release.&lt;/p&gt;&lt;figure class=&quot;kg-card kg-image-card kg-card-hascaption&quot;&gt;&lt;img alt=&quot;Xubuntu 25.10 &amp;quot;Questing Quokka&amp;quot;&quot; class=&quot;kg-image&quot; height=&quot;900&quot; src=&quot;https://seand.xyz/content/images/2025/10/xubuntu-2510-desktop.png&quot; width=&quot;1440&quot; /&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Xubuntu 25.10 &quot;Questing Quokka&quot;: A screenshot of the desktop.&lt;/span&gt;&lt;/figure&gt;&lt;h2 id=&quot;a-critical-juncture&quot;&gt;A Critical Juncture&lt;/h2&gt;&lt;p&gt;The &quot;Questing Quokka&quot; arrives at a pivotal time in Xubuntu&amp;amp;aposs history. In just six months, we&amp;amp;aposll celebrate Xubuntu&amp;amp;aposs twentieth anniversary (technically eight months: 6.06 marks the only time Ubuntu was released in June).&lt;/p&gt;&lt;p&gt;In recent years, our small development team has faced the same challenges as many open-source projects: contributors stepping back, real-world responsibilities growing, and less time to dedicate to day-to-day development.&lt;/p&gt;&lt;p&gt;Beyond that, our involvement with the upstream Xfce project has slowed. Many of us, myself included, once played major roles in shaping Xfce’s direction, contributing countless hours to its design, code, and outreach. Those efforts helped establish the strong foundation Xfce enjoys today.&lt;/p&gt;&lt;p&gt;While we remain proud supporters and collaborators, Xubuntu’s continued growth depends on fresh energy and new contributors. If you’ve ever wanted to make a tangible impact on an open-source desktop environment, this is your moment. Visit the &lt;a href=&quot;https://xubuntu.org/contribute/?ref=seand.xyz&quot; rel=&quot;noreferrer&quot;&gt;Get Involved&lt;/a&gt; page to learn how to help with artwork, development, documentation, QA, marketing, and more.&lt;/p&gt;&lt;p&gt;Now, let’s look at what’s new (and what still needs work) in 25.10.&lt;/p&gt;&lt;h2 id=&quot;xubuntu-2510-a-snapshot-of-the-future&quot;&gt;Xubuntu 25.10: A Snapshot of the Future&lt;/h2&gt;&lt;p&gt;As mentioned, Xubuntu 25.10 ships with Xfce 4.20, GNOME 49, and MATE 1.26. Like other Ubuntu flavors, it also introduces the new Rust-based &lt;code&gt;sudo-rs&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you’re upgrading from Xubuntu 25.04, you’ll find the experience familiar. Most applications have received incremental updates, theming remains consistent, and there are few new user-facing features. The most noticeable changes this cycle? The bugs. 🐞&lt;/p&gt;&lt;h3 id=&quot;known-issues-and-what-to-expect&quot;&gt;Known Issues (and What to Expect)&lt;/h3&gt;&lt;h4 id=&quot;libadwaita-apps-and-the-case-of-the-missing-close-button&quot;&gt;libadwaita Apps and the Case of the Missing Close Button&lt;/h4&gt;&lt;p&gt;Late in the cycle, &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/elementary-xfce/+bug/2125025?ref=seand.xyz&quot; rel=&quot;noreferrer&quot;&gt;we discovered&lt;/a&gt; that several GNOME and libadwaita-based apps have empty window close buttons when using the &lt;em&gt;elementary-xfce&lt;/em&gt; icon theme. This affects Disk Usage Analyzer (&lt;code&gt;baobab&lt;/code&gt;), Document Scanner (&lt;code&gt;simple-scan&lt;/code&gt;), Fonts (&lt;code&gt;gnome-font-viewer&lt;/code&gt;), Mines (&lt;code&gt;gnome-mines&lt;/code&gt;), and Sudoku (&lt;code&gt;gnome-sudoku&lt;/code&gt;).&lt;/p&gt;&lt;figure class=&quot;kg-card kg-image-card kg-card-hascaption&quot;&gt;&lt;img alt=&quot;Xubuntu 25.10 &amp;quot;Questing Quokka&amp;quot;&quot; class=&quot;kg-image&quot; height=&quot;800&quot; src=&quot;https://seand.xyz/content/images/2025/10/xubuntu-2510-missing-libadwaita-close-icon.png&quot; width=&quot;1280&quot; /&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Modern GNOME applications are missing the close window icon. Can&amp;amp;apost see it? Neither can I.&lt;/span&gt;&lt;/figure&gt;&lt;h4 id=&quot;missing-icon-for-document-scanners-scan-options&quot;&gt;Missing Icon for Document Scanner&amp;amp;aposs Scan Options&lt;/h4&gt;&lt;p&gt;The Scan Options menu icon in Document Scanner is &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/elementary-xfce/+bug/2127071?ref=seand.xyz&quot; rel=&quot;noreferrer&quot;&gt;currently invisible&lt;/a&gt;. This issue has been reported upstream to the &lt;em&gt;elementary-xfce&lt;/em&gt; GitHub tracker.&lt;/p&gt;&lt;figure class=&quot;kg-card kg-image-card kg-card-hascaption&quot;&gt;&lt;img alt=&quot;Xubuntu 25.10 &amp;quot;Questing Quokka&amp;quot;&quot; class=&quot;kg-image&quot; height=&quot;800&quot; src=&quot;https://seand.xyz/content/images/2025/10/xubuntu-2510-missing-scan-options-icon.png&quot; width=&quot;1280&quot; /&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;To the right of the Scan button is a menu button for the Scan Options. Invisible unless you hover it.&lt;/span&gt;&lt;/figure&gt;&lt;h4 id=&quot;flatpak-packages-cannot-be-installed&quot;&gt;Flatpak Packages Cannot Be Installed&lt;/h4&gt;&lt;p&gt;Due to a Fuse/AppArmor conflict in Ubuntu 25.10, installing Flatpak packages &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/flatpak/+bug/2122161?ref=seand.xyz&quot; rel=&quot;noreferrer&quot;&gt;currently fails&lt;/a&gt;. Work is underway to resolve this, and Flatpak support should return soon.&lt;/p&gt;&lt;h4 id=&quot;graphical-ssh-agent-unavailable&quot;&gt;Graphical SSH Agent Unavailable&lt;/h4&gt;&lt;p&gt;Xubuntu 25.10’s graphical SSH agent isn’t functioning as expected. Without it, SSH key passphrases must be entered each time. &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/2125549?ref=seand.xyz&quot; rel=&quot;noreferrer&quot;&gt;Investigation continues&lt;/a&gt;, and a fix may land before the next release.&lt;/p&gt;&lt;h4 id=&quot;double-network-icons-sometimes&quot;&gt;Double Network Icons (Sometimes)&lt;/h4&gt;&lt;p&gt;Some users may see &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/xfce4-panel/+bug/2059045?ref=seand.xyz&quot; rel=&quot;noreferrer&quot;&gt;duplicate network icons&lt;/a&gt;, especially in virtual machines. One appears via the Xfce Indicator Plugin and the other via the Systray Plugin. Removing the Indicator Plugin resolves this... something we’re considering doing by default for 26.04.&lt;/p&gt;&lt;figure class=&quot;kg-card kg-image-card kg-card-hascaption&quot;&gt;&lt;img alt=&quot;Xubuntu 25.10 &amp;quot;Questing Quokka&amp;quot;&quot; class=&quot;kg-image&quot; height=&quot;800&quot; src=&quot;https://seand.xyz/content/images/2025/10/xubuntu-2510-double-network-icons.png&quot; width=&quot;1280&quot; /&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Some users may be confused to see two network icons that look nearly identical and function the same.&lt;/span&gt;&lt;/figure&gt;&lt;h4 id=&quot;screensaver-wallpaper-discrepancy&quot;&gt;Screensaver Wallpaper Discrepancy&lt;/h4&gt;&lt;p&gt;When first locking your screen, you &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/xfce4-screensaver/+bug/2107239?ref=seand.xyz&quot; rel=&quot;noreferrer&quot;&gt;might notice&lt;/a&gt; that the lock screen wallpaper defaults to Xfce’s background instead of Xubuntu’s. Changing (and reapplying) your wallpaper fixes the mismatch.&lt;/p&gt;&lt;figure class=&quot;kg-card kg-image-card kg-card-hascaption&quot;&gt;&lt;img alt=&quot;Xubuntu 25.10 &amp;quot;Questing Quokka&amp;quot;&quot; class=&quot;kg-image&quot; height=&quot;800&quot; src=&quot;https://seand.xyz/content/images/2025/10/xubuntu-2510-wrong-screensaver-wallpaper.png&quot; width=&quot;1280&quot; /&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;If you lock your screen before changing your wallpaper, you&amp;amp;aposll be greeted by Xfce&amp;amp;aposs wallpaper.&lt;/span&gt;&lt;/figure&gt;&lt;h2 id=&quot;looking-ahead&quot;&gt;Looking Ahead&lt;/h2&gt;&lt;p&gt;At first glance, Xubuntu 25.10 might seem rough around the edges: more bugs than usual, fewer active contributors, and an LTS release on the horizon. But known issues are solvable issues. With six months until 26.04, we have time to address these challenges, polish the experience, and deliver a release worthy of Xubuntu’s twentieth anniversary.&lt;/p&gt;&lt;p&gt;If you want to help shape that milestone release—whether through code, documentation, design, or outreach—please reach out. Together, we can ensure Xubuntu continues to thrive for another twenty years.&lt;/p&gt;&lt;div class=&quot;kg-card kg-cta-card kg-cta-bg-grey kg-cta-minimal    &quot; data-layout=&quot;minimal&quot;&gt;
            
                &lt;div class=&quot;kg-cta-sponsor-label-wrapper&quot;&gt;
                    &lt;div class=&quot;kg-cta-sponsor-label&quot;&gt;
                        &lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Join the Xubuntu Community&lt;/span&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            
            &lt;div class=&quot;kg-cta-content&quot;&gt;
                
                
                    &lt;div class=&quot;kg-cta-content-inner&quot;&gt;
                    
                        &lt;div class=&quot;kg-cta-text&quot;&gt;
                            &lt;p dir=&quot;ltr&quot;&gt;&lt;b&gt;&lt;strong style=&quot;white-space: pre-wrap;&quot;&gt;Everyone can participate&lt;/strong&gt;&lt;/b&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt; in the Xubuntu community on many levels, from simply giving advice to fellow Xubuntu users to becoming a maintainer of core packages. Any contribution, even the smallest, is valued.&lt;/span&gt;&lt;/p&gt;
                        &lt;/div&gt;
                    
                    
                        &lt;a class=&quot;kg-cta-button &quot; href=&quot;https://xubuntu.org/contribute/?ref=seand.xyz&quot; style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;
                            Get Involved
                        &lt;/a&gt;
                        
                    &lt;/div&gt;
                
            &lt;/div&gt;
        &lt;/div&gt;</description>
	<pubDate>Thu, 09 Oct 2025 06:58:43 +0000</pubDate>
</item>
<item>
	<title>Xubuntu: Xubuntu 25.10 released!</title>
	<guid isPermaLink="false">https://xubuntu.org/?p=5725</guid>
	<link>https://xubuntu.org/news/xubuntu-25-10-released/</link>
	<description>&lt;p&gt;The Xubuntu team is happy to announce the immediate release of Xubuntu 25.10.&lt;/p&gt;



&lt;p&gt;Xubuntu 25.10, codenamed &lt;strong&gt;Questing Quokka&lt;/strong&gt;, is a regular release and will be supported for 9 months, until July 2026.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-5726&quot; height=&quot;900&quot; src=&quot;https://xubuntu.org/wp-content/uploads/2025/10/ade5/xubuntu-2510-desktop.png&quot; width=&quot;1440&quot; /&gt;Xubuntu 25.10, featuring the latest updates from Xfce 4.20 and GNOME 49.&lt;/figure&gt;



&lt;p&gt;Xubuntu 25.10 features the latest Xfce 4.20 and GNOME 49 updates. &lt;strong&gt;Xfce 4.20&lt;/strong&gt; updates feature stability improvements and enhanced Wayland support, for those adventurous enough to use it. &lt;strong&gt;GNOME 49&lt;/strong&gt; apps have received further polish and are well-suited for Xubuntu. &lt;strong&gt;MATE 1.26&lt;/strong&gt; apps are still included to round out Xubuntu’s office suite.&lt;/p&gt;



&lt;p&gt;The &lt;strong&gt;final release images&lt;/strong&gt; for &lt;strong&gt;Xubuntu Desktop&lt;/strong&gt; and &lt;strong&gt;Xubuntu Minimal&lt;/strong&gt; are available as torrents and direct downloads from &lt;a href=&quot;https://xubuntu.org/download/&quot;&gt;xubuntu.org/download/&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;As the main server might be busy the first few days after the release, we recommend using the torrents if possible.&lt;/p&gt;



&lt;p&gt;We want to thank everybody who contributed to this release of Xubuntu!&lt;/p&gt;



&lt;h2&gt;Highlights and Known Issues&lt;/h2&gt;



&lt;h3&gt;Highlights&lt;/h3&gt;



&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Xfce 4.20&lt;/strong&gt; components have received several stability improvements. Minor integration issues persist in Xubuntu 25.10 and will be addressed for 26.04, scheduled for release in April.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GNOME 49&lt;/strong&gt; apps are further refined with new features and usability improvements.&lt;/li&gt;&lt;/ul&gt;



&lt;h3&gt;Known Issues&lt;/h3&gt;



&lt;ul&gt;&lt;li&gt;Some missing icons mean that &lt;strong&gt;libadwaita apps&lt;/strong&gt; (modern GNOME style) have graphical glitches. Notably, the window &lt;em&gt;close&lt;/em&gt; icons are blank (LP: &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/elementary-xfce/+bug/2125025&quot;&gt;#2125025&lt;/a&gt;), and &lt;strong&gt;Document Scanner&lt;/strong&gt; is missing an icon for the scanner options (LP: &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/elementary-xfce/+bug/2127071&quot;&gt;#2127071&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;The graphical &lt;strong&gt;SSH agent&lt;/strong&gt; is unavailable due to a change in the &lt;strong&gt;GNOME Keyring Daemon&lt;/strong&gt; (LP: &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/2125549&quot;&gt;#2125549&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Flatpak&lt;/strong&gt; packages will refuse to install due to a conflict between AppArmor and libfuse (LP: &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/flatpak/+bug/2122161&quot;&gt;#2122161&lt;/a&gt;). A fix is in progress.&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;Please refer to the &lt;a href=&quot;https://wiki.xubuntu.org/releases/25.10/release-notes&quot;&gt;Xubuntu Release Notes&lt;/a&gt; for more obscure known issues, information on affecting bugs, bug fixes, and a list of new package versions.&lt;/p&gt;



&lt;p&gt;The main &lt;a href=&quot;https://discourse.ubuntu.com/t/questing-quokka-release-notes/59220&quot;&gt;Ubuntu Release Notes&lt;/a&gt; cover many other packages we carry and more generic issues.&lt;/p&gt;



&lt;h2&gt;Support&lt;/h2&gt;



&lt;p&gt;&lt;strong&gt;For support&lt;/strong&gt; with the release, navigate to &lt;a href=&quot;https://xubuntu.org/help/&quot;&gt;Help &amp;amp; Support&lt;/a&gt; for a complete list of methods to get help.&lt;/p&gt;</description>
	<pubDate>Thu, 09 Oct 2025 01:06:35 +0000</pubDate>
</item>
<item>
	<title>David Mohammed: Ubuntu Budgie 25.10 release notes</title>
	<guid isPermaLink="false">https://ubuntubudgie.org/?p=3911</guid>
	<link>https://ubuntubudgie.org/2025/10/ubuntu-budgie-25-10-release-notes/</link>
	<description>&lt;p&gt;Ubuntu Budgie 25.10 (Questing Quokka) is a Standard Release with 9 months of support by your distro maintainers and Canonical, from Oct 2025 to July 2026. These release notes showcase the key takeaways for 25.04 upgraders to 25.10. Please note – there is no direct upgrade path from 24.04.3 to 25.10; you must uplift to 24.10 first or perform a fresh install. In these release notes the areas…&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ubuntubudgie.org/2025/10/ubuntu-budgie-25-10-release-notes/&quot; rel=&quot;nofollow&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 08 Oct 2025 17:26:51 +0000</pubDate>
</item>
<item>
	<title>Julian Andres Klode: Dependency Tries</title>
	<guid isPermaLink="true">https://blog.jak-linux.org/2025/09/27/dependency-tries/</guid>
	<link>https://blog.jak-linux.org/2025/09/27/dependency-tries/</link>
	<description>&lt;p&gt;As I was shopping groceries I had a shocking realization: The active dependencies
of packages in a solver actually form a trie (a dependency &lt;code&gt;A|B&lt;/code&gt; - “A or B” - of
a package &lt;code&gt;X&lt;/code&gt; is considered active if we marked &lt;code&gt;X&lt;/code&gt; for install).&lt;/p&gt;
&lt;p&gt;Consider the dependencies &lt;code&gt;A|B|C&lt;/code&gt;, &lt;code&gt;A|B&lt;/code&gt;, &lt;code&gt;B|X&lt;/code&gt;.
In most package managers these just express alternatives, that is, the “or” relationship,
but in Debian packages, it also expresses a preference relationship between its operands,
so in &lt;code&gt;A|B|C&lt;/code&gt;, &lt;code&gt;A&lt;/code&gt; is preferred over &lt;code&gt;B&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt; over &lt;code&gt;C&lt;/code&gt; (and &lt;code&gt;A&lt;/code&gt; transitively over &lt;code&gt;C&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;This means that we can convert the three dependencies into a trie as follows:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Dependency trie of the three dependencies&quot; src=&quot;https://blog.jak-linux.org/post/trie1.svg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Solving the dependency here becomes a matter of trying to install the package
referenced by the first edge of the root, and seeing if that sticks. In this
case, that would be ‘a’. Let’s assume that ‘a’ failed to install, the next
step is to remove the empty node of &lt;code&gt;a&lt;/code&gt;, and merging its children into the
root.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Reduced dependency trie with “not A” containing b, b|c, b|x&quot; src=&quot;https://blog.jak-linux.org/post/trie2.svg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For ease of visualisation, we remove “a” from the dependency nodes as well,
leading us to a trie of the dependencies “b”, “b|c”, and “b|x”.&lt;/p&gt;
&lt;p&gt;Presenting the Debian dependency problem, or the positive part of it as a
trie allows us for a great visualization of the problem but it may not proof
to be an effective implementation choice.&lt;/p&gt;
&lt;p&gt;In the real world we may actually store this as a priority queue that we
can delete from. Since we don’t actually want to delete from the queue
for real, our queue items are pairs of a pointer to dependency and an
activitity level, say &lt;code&gt;A|B@1&lt;/code&gt;.
Whenever a variable is assigned false, we look at its reverse dependencies
and bump their activity, and reinsert them (the priority of the item being
determined by the leftmost solution still possible, it has now changed).
When we iterate the queue, we remove items with a lower activity level:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Our queue is &lt;code&gt;A|B@1&lt;/code&gt;, &lt;code&gt;A|B|C@1&lt;/code&gt;, &lt;code&gt;B|X@1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Rejecting A bump the activity for its reverse dependencies and reinset them:
Our queue is &lt;code&gt;A|B@1&lt;/code&gt;, &lt;code&gt;A|B|C@1&lt;/code&gt;, &lt;code&gt;(A|)B@2&lt;/code&gt;, &lt;code&gt;(A|)B|C@2&lt;/code&gt;, &lt;code&gt;B|X@1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;We visit &lt;code&gt;A|B@1&lt;/code&gt; but see the activity of the underlying dependency is now 2 and remove it
Our queue is &lt;code&gt;A|B|C@1&lt;/code&gt;, &lt;code&gt;(A|)B@2&lt;/code&gt;, &lt;code&gt;(A|)B|C@2&lt;/code&gt;, &lt;code&gt;B|X@1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;We visit &lt;code&gt;A|B|C@1&lt;/code&gt; but see the activity of the underlying dependency is now 2 and remove it
Our queue is &lt;code&gt;(A|)B@2&lt;/code&gt;, &lt;code&gt;(A|)B|C@2&lt;/code&gt;, &lt;code&gt;B|X@1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;We visit &lt;code&gt;A|B@2&lt;/code&gt;, see the activity matches and find B is the solution.&lt;/li&gt;
&lt;/ol&gt;</description>
	<pubDate>Sat, 27 Sep 2025 14:32:19 +0000</pubDate>
</item>
<item>
	<title>Aaron Rainbolt: Setting up a weird dual-boot DOS workstation</title>
	<guid isPermaLink="true">https://arraybolt3.substack.com/p/setting-up-a-weird-dual-boot-dos</guid>
	<link>https://arraybolt3.substack.com/p/setting-up-a-weird-dual-boot-dos</link>
	<description>&lt;p&gt;I’ve been wanting to create some Bible study software for DOS for a while now. Why target DOS? Because it’s a cool platform, it’s still in use in some areas of the world, and I haven’t been able to find readily available Bible software for DOS, whether open-source or not. Over the weekend, I was thinking about this project again, and decided that, for the sake of development ease and avoiding emulator quirks, I should set up a DOS installation on physical hardware and create the software on that machine.&lt;/p&gt;&lt;p&gt;I have tons of old computers in varying states of decay or usefulness; three of them still work pretty well. I decided to pick the weakest of the three for this project since it probably had more than enough grunt for the project at hand, but wouldn’t be useful for much else. The chosen system was a Compaq Presario 6000 desktop, featuring some iteration of an AMD Athlon XP processor, 256 MB RAM, a 20 GB hard drive (which I was about to expand for reasons I’ll get into later), a floppy drive, and dual optical drives (only one of which works). This particular system is a bit strange since its USB controller and network card are both NVIDIA hardware, even though NVIDIA is typically associated with graphics cards. Beyond that though, the system was pretty typical for the kind of hardware you’d see in the early 2000s - all of the drives use IDE to communicate with the motherboard, and most of the expansion slots are PCI (except for a couple of mystery slots, one of them &lt;em&gt;might&lt;/em&gt; be AGP, and another one seems to be intentionally blocked off and I can’t tell what it is). The back panel features PS/2 ports for a mouse and keyboard, a parallel port and a serial port, a VGA port for the monitor, and a few USB (probably USB 2) ports. There was also a 3Com network card installed in one of the slots, which I had put there when experimenting with OpenBSD on this system. The front panel had a couple more USB ports.&lt;/p&gt;&lt;div class=&quot;subscription-widget-wrap-editor&quot; data-attrs=&quot;{&amp;quot;url&amp;quot;:&amp;quot;https://arraybolt3.substack.com/subscribe?&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;Subscribe&amp;quot;,&amp;quot;language&amp;quot;:&amp;quot;en&amp;quot;}&quot; data-component-name=&quot;SubscribeWidgetToDOM&quot;&gt;&lt;div class=&quot;subscription-widget show-subscribe&quot;&gt;&lt;div class=&quot;preamble&quot;&gt;&lt;p class=&quot;cta-caption&quot;&gt;Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.&lt;/p&gt;&lt;/div&gt;&lt;form class=&quot;subscription-widget-subscribe&quot;&gt;&lt;input class=&quot;email-input&quot; name=&quot;email&quot; tabindex=&quot;-1&quot; type=&quot;email&quot; /&gt;&lt;input class=&quot;button primary&quot; type=&quot;submit&quot; value=&quot;Subscribe&quot; /&gt;&lt;div class=&quot;fake-input-wrapper&quot;&gt;&lt;div class=&quot;fake-input&quot;&gt;&lt;/div&gt;&lt;div class=&quot;fake-button&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/form&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;One downside of using DOS for development is a lack of good source code versioning systems. Git doesn’t exist for DOS, and I don’t have the time or willingness to learn RCS or similar (maybe I should?), so I decided I would implement version control by just copying the project every so often to a backup location, probably zipping it in the process. Anticipating that this would probably require a hefty chunk of disk space, I decided to add a 40 GB Maxtor drive taken from a Pentium 4 desktop I had laying around. Getting the drive installed was a bit of a challenge; many older computers have the drives slide out backwards into the system, but this Compaq has them slide out &lt;em&gt;forward&lt;/em&gt; out the front of the machine. This meant I had to get the front panel off of the machine, which was hard because it was held on by four extremely stiff plastic latches that had to all be disengaged at the same time. Thankfully the plastic of the front panel was able to bend enough that I could disengage each latch individually, then keep it that way while I worked on another latch.&lt;/p&gt;&lt;p&gt;After getting the cover off, I had to fight with Compaq’s drive mounting hardware. Rather than just screwing the drives directly into the bay like a normal computer would, Compaq elected to use a system of rails and latches to keep the drives fully hooked into the machine. The screws had very thick heads, and were intended to slide along the rails and then latch in place once inserted far enough. As strange as this already was, there was also the problem that the secondary drive bay had a malformed rail, that was just &lt;em&gt;barely&lt;/em&gt; too narrow for the mounting screws to actually slide in. There were also separate screw types for the optical drives and the hard drives. What I ended up doing was using optical drive screws on the Maxtor hard drive, which seemed to fit correctly and were able to latch in place. After getting this kludgy setup to work, I then remembered that I needed to set jumpers on the drives to configure them as “master” and “slave” properly, so I then took both drives out, reconfigured the jumpers, and slid them back in. After a bit of cable routing shenanigans (including removing a rather unfortunately located zip tie), I finally had both drives installed.&lt;/p&gt;&lt;p&gt;To confirm that I hadn’t made a total mess of my drive configuration, I decided to take some time to power the system on and check the BIOS. I had an old PS/2 Microsoft keyboard, and a small, 4:3 aspect ratio flatscreen display with a built-in VGA cable, so I decided to use those for the project. Nothing caught fire when I plugged it in and powered it on, and after getting into the BIOS settings I found that both drives appeared to be properly recognized. I also saw “Removable Media Boot”, which made me hopeful that this machine might support USB boot. I turned off a bunch of settings related to “fast startup” to minimize the chances of having issues, then saved my changes and exited.&lt;/p&gt;&lt;p&gt;Since I thought USB boot might work, I downloaded the FreeDOS 1.4 FullUSB and flashed it to a USB drive. Unfortunately, my hopes were soon dashed; the USB drive did not appear in the BIOS’s boot order settings. Crud.&lt;/p&gt;&lt;p&gt;I don’t generally like burning CD-Rs if I don’t have to, since they can’t be rewritten, they probably won’t keep being manufactured for much longer, and I only had 48 of my original stack of 50 left (oh horror!), but I didn’t see another good option at this point, so I dragged out one of the other working old computers, a Panasonic Toughbook that had an old-ish install of Void Linux on it. This particular machine looks like it’s been through a warzone, but it still works well enough, and most importantly, the CD burner in it seems to work flawlessly. In the hopes of not having to waste any further CDs in the future, I decided to burn Plop Boot Manager to the disc rather than burning FreeDOS itself. The burn went smoothly enough, the Compaq was happy to boot from it, and next thing I knew I was able to boot into FreeDOS from the USB! Woohoo!…&lt;/p&gt;&lt;p&gt;…or…. not. FreeDOS itself seemed to run without issues, and partitioning and formatting the drives wasn’t a problem, but for some reason FreeDOS’s installer didn’t work when booted in this way. Despite the fact that it was installing to what it considered drive D:, it kept trying to write files to drive C:, which was the read-only volume on the USB drive. This resulted in lots of “Abort, Retry, Ignore, Fail?” error messages, and while the installer did seem to work (kinda) if I just &quot;ignored” all the errors, I didn’t trust the finished installation was going to work. I also couldn’t just sit there and press and hold the “I” key to keep ignoring errors, since doing so slowed the copy process down (probably because it was spamming the keyboard interrupt, I would guess). So, one CD-R apparently wasted. Next!&lt;/p&gt;&lt;p&gt;Back on the Toughbook, I used wget to download both the FreeDOS 1.4 LiveCD and BonusCD. I needed both discs, since the OS was on the LiveCD and the development tools (like the C compiler I wanted to use) was on the BonusCD. Burning the discs was pretty easy, and FreeDOS seemed much happier installing from a CD than trying to install from a USB. Soon enough I had a working FreeDOS installation, and a little bit later I had a good text editor and the Open Watcom 1.9 compiler installed.&lt;/p&gt;&lt;p&gt;At this point I was almost ready to sit down and start coding, but decided I had better figure out how to get data off the system before I dedicated a bunch of time working on my project. I didn’t want it to just rot on the machine it was coded on. At this point I discovered two frustrating facts:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The USB driver included with FreeDOS only works with UHCI controllers, but the controller in this system is an OHCI controller.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The network card wasn’t supported out of the box - there were packet drivers out there for it most likely, but those weren’t very useful since I couldn’t get outside data onto the machine since USB didn’t work.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;(At this point one might reasonably ask why I don’t just use the floppy disk drive. That’s because I have exactly one functional computer with a floppy disk drive, that being the Compaq I was setting up. I can use floppies as storage if I’m willing to risk catastrophic data loss, but they’re useless as a data transfer mechanism. There are also OHCI drivers for DOS available online, even open-source drivers, but of course those would have to be transferred to the system in order to use them.)&lt;/p&gt;&lt;p&gt;At this point what a normal person probably would do is accept the fact that they’re going to have to burn some more CD-Rs, and proceed to get some USB and network drivers onto the machine. But due to being paranoid about running out of CD-Rs, that was an absolutely unacceptable solution to me. I had the OpenBSD disc I used some months ago laying around, so…&lt;/p&gt;&lt;p&gt;Dual-booting FreeDOS and OpenBSD didn’t end up being all that hard. For one, BSD’s partitioning system actually works really well for multibooting. Even though OpenBSD generally uses a whole bunch of partitions, it doesn’t try to create them all directly on the drive. Instead, it creates one “container” partition, and then creates a bunch of OpenBSD-specific partitions within that container, separate from the drive’s usual partitioning scheme. On top of that, the installer is pretty straightforward (once you realize that you need to skip all forms of network setup if you don’t intend to plug the machine into a network), and an OpenBSD installation without an X server or games fits in 3 GB of disk space with a bit of wiggle room to spare. I don’t expect I’ll be able to update this installation without pain, but since all I need it to do is let me move files to and from a USB drive, I don’t need to update it (and won’t be connecting it to a network).&lt;/p&gt;&lt;p&gt;The only really painful part of the installation process was partitioning - every operating system seems to have a radically different idea of how fdisk is supposed to work, and OpenBSD’s idea of fdisk is the most… um… interesting one I’ve seen to date. Rather than working in terms of unallocated space and partition creation, OpenBSD’s fdisk just acts as if all four partitions MBR allows for always exist at all times. You don’t create a partition, you just configure each of the partition slots you’re interested in working with. If you don’t want a partition to exit, you set its type code to “00” (unused). If you do want a partition to exist, you set its type code to whatever’s appropriate for your use case, define a start and end sector, and you’re done. I’m guessing this is &lt;em&gt;probably&lt;/em&gt; a more accurate model of how MBR actually works, but it was nonetheless surprising to me. More surprising is that there don’t seem to be any safeguards to make sure you don’t do something completely ridiculous like define partitions that overlap each other, or put sector 0 as part of a partition. OpenBSD’s fdisk also does not try to guess things like how large you want the partition to be, so you have to calculate everything by hand and double-check your work to keep from making a mess. To be honest, I actually kind of like this system, it was just very unexpected.&lt;/p&gt;&lt;p&gt;After fighting with the partitioner a bit, I made a 3 GB partition at the end of the 40 GB Maxtor drive to install OpenBSD to. The remaining 37 GB would still be dedicated to a FAT32 DOS system. (In retrospect, I wish I had split the drive 50-50 between DOS and OpenBSD so I could play with both, and in all likelihood I’ll probably go back and do that at some point in the future, but this is the setup I have now.) Once that was done, OpenBSD installed just fine…&lt;/p&gt;&lt;p&gt;…and then I realized that the BIOS in this machine doesn’t allow me to specify which hard drive I want to boot from. The boot order settings fail to list the secondary drive anywhere, and there’s no boot menu button.&lt;/p&gt;&lt;p&gt;Thankfully there was a good workaround. Remember the Plop Boot Manager disc I burned near the beginning of this ordeal? Turns out it had no problem recognizing all of the partitions on all of the drives in this system. All I have to do is just leave the Plop CD in the bootable drive, and then I can choose whether i want to boot into FreeDOS or OpenBSD effortlessly.&lt;/p&gt;&lt;p&gt;That pretty much describes where my setup is at so far. I have been able to successfully transfer files between my main work laptop and the FreeDOS system using this OpenBSD “shim”. I haven’t gotten USB working in FreeDOS yet, and I haven’t managed to get either of the network cards to work yet, but the system does work, and I had a lot of fun using “edit” and “fed” to write up a README.TXT for the Bible software project that inspired this whole endeavor. There’s still more to do for setting up the workstation though:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;I really would like to have working USB in FreeDOS. There’s a Panasonic driver floating around the Internet that people claim to have success with, I’ll probably end up using that.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I should replace the broken optical drive. Then I can have both Plop Boot Manager and the FreeDos 1.4 BonusCD inserted at the same time, which would make life quite a bit easier.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I’m already regretting only giving OpenBSD 3 GB of space on the secondary drive. I’d like to be able to use it to chat on IRC, which means connecting it to the Internet, which means keeping it up-to-date, so I’ll probably repartition the drive, allocate 20 GB to OpenBSD, and leave 20 GB for DOS. Even that’s probably huge, but we’ll find out. (I don’t intend to connect FreeDOS to the Internet since I’m a bit scared of the security issues of doing that.)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Embarrassingly, I’m using a Chromebook to let me look at Open Watcom’s documentation in a web browser. I should set things up so that I can read the documentation from within DOS itself.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Other than the above points though, the system is working quite well, and I’m happy with it. Hopefully I won’t end up spending so much time setting it up that I never use it for its intended purpose! :P&lt;/p&gt;&lt;div class=&quot;subscription-widget-wrap-editor&quot; data-attrs=&quot;{&amp;quot;url&amp;quot;:&amp;quot;https://arraybolt3.substack.com/subscribe?&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;Subscribe&amp;quot;,&amp;quot;language&amp;quot;:&amp;quot;en&amp;quot;}&quot; data-component-name=&quot;SubscribeWidgetToDOM&quot;&gt;&lt;div class=&quot;subscription-widget show-subscribe&quot;&gt;&lt;div class=&quot;preamble&quot;&gt;&lt;p class=&quot;cta-caption&quot;&gt;Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.&lt;/p&gt;&lt;/div&gt;&lt;form class=&quot;subscription-widget-subscribe&quot;&gt;&lt;input class=&quot;email-input&quot; name=&quot;email&quot; tabindex=&quot;-1&quot; type=&quot;email&quot; /&gt;&lt;input class=&quot;button primary&quot; type=&quot;submit&quot; value=&quot;Subscribe&quot; /&gt;&lt;div class=&quot;fake-input-wrapper&quot;&gt;&lt;div class=&quot;fake-input&quot;&gt;&lt;/div&gt;&lt;div class=&quot;fake-button&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/form&gt;&lt;/div&gt;&lt;/div&gt;</description>
	<pubDate>Sun, 21 Sep 2025 18:04:21 +0000</pubDate>
        <enclosure url="https://substackcdn.com/image/fetch/$s_!U9th!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81afb1c6-f320-42fc-97ab-f1de570fde3a_288x288.png" length="0" type="image/jpeg"/>
</item>
<item>
	<title>Lubuntu Blog: Lubuntu Questing Beta Released!</title>
	<guid isPermaLink="false">https://lubuntu.me/?p=4154</guid>
	<link>https://lubuntu.me/lubuntu-questing-beta-released/</link>
	<description>Thanks to all the hard work from our contributors, Lubuntu 25.10 Beta has been released. With the codename Questing Quokka, Lubuntu 25.10 will be the 29th release of Lubuntu, the fifteenth release of Lubuntu with LXQt as the default desktop environment. Support lifespan With 25.10 being an interim release, it will follow the standard non-LTS […]</description>
	<pubDate>Thu, 18 Sep 2025 21:42:05 +0000</pubDate>
</item>
<item>
	<title>Jonathan Riddell: Adios Chicos, 25 Years of KDE</title>
	<guid isPermaLink="false">https://jriddell.org/?p=1606</guid>
	<link>https://jriddell.org/2025/09/14/adios-chicos-25-years-of-kde/</link>
	<description>&lt;p&gt;It was the turn of the millenium when I got my first computer fresh at university.  Windows seemed uninteresting, it was impossible to work out how it worked or write programs for it.  SuSE Linux 6.2 was much more interesting to try and opened a world of understanding how computers worked and wanting to code on them.  These were the days of the .com boom and I went to big expos in London where they showered you with freebies and IBM competed with SuSE and Red Hat for the biggest stall.  IBM said that Linux had made it on the server and now was going to take over the desktop so I realised that working with KDE would be a good idea.  And as a novice coder it was very perfect for learning Qt and how open development worked and I loved the free software ideals.  Going to the pre-Akademy conference (it was called Kastle then) in Nove Hrady was a great intro to the community in person and in some ways I learnt more about software development in a week there then my years at uni.&lt;/p&gt;



&lt;p&gt;So clearly this was a good way to make a career.  I dossed around for a year until the Quaker geek collective heard tale of an African Spaceman who was funding a new Linux distro called SSDS (Shuttleworth’s Super Secret Debian Startup) so I got into Debian packaging and made a point that KDE should be involved.  Before long they came knocking and I went to the first Ubuntu conference in Australia.  I spent about ten amazing years brining KDE to Ubuntu or bringing Ubuntu to KDE for what was already called Kubuntu (not my name choice), a successful community project I’m really proud of.  At one point Nokia wanted to use it alongside Plasma Active to sell on a tablet thing along with phones, this could well have taken over the world but y’know, iPhone happened and Kubuntu never found a commercial use after that although it still gets used in big places like Google or the City of Munich or Weta digital (watch those Hobbit DVD extras).  I loved being invited out to Nigeria or India to give talks and spread the world of open software.  Looking back there’s probably a million business cases that would have been possible but I’m not the best at being a future visionary.  Eventually Canonical decided to stop funding it which is fair enough.  &lt;/p&gt;



&lt;p&gt;But then Blue Systems came along, another nice guy with deep pockets wanting to help and we carried on.  When Canonical decided to kill off lots of community projects we came up with the idea of moving directly into KDE to make KDE neon.  It has always been crazy how open source communities like KDE are reliant on separate companies to take their software out to the world so we wanted to change that, and I like to think we succeeded.  Using CI systems we could create a much more manageable setup.  Still the system was never as resiliant as it should have been and several times KDE neon ended up shipping a duff update which will have been very painful for users.  We had three people working full time on it at the start but before long it was just me and a volunteer and the quality suffered as a result.&lt;/p&gt;



&lt;p&gt;Last winter I drove to the Blue Systems schoße for a routine conference and was organising people to give talks when the guy who pays us started off by saying he was dying and the company would be shutting down.  Which was very sad but it makes sense to end it on a high.  After years of having no business modal and not knowing what the aims of the company were, which caused several people to genuinely go mad, we finally had a business model of sorts with Valve paying us to make Plasma up to the standards needed to ship it as Desktop Scope on the Valve Steam Deck games console.  Nate had been given advanced notice of the company shutting down and had already started another company, Tech Paladin, to take on the business.  Shouldn’t this be run as a cooperative we wondered?  No that was too complex he said.  The next day I ended up at a funeral for some German accountants and when I came back there had been some more discussion and we watched a video about Igalia who make the other operating system for Valve.  They are a cooperative socialist paradise and Nate said he’d look into doing that instead of the setup where he had full control and all the profit.  It was clear there was to be no other discussion on the matter of our future.&lt;/p&gt;



&lt;p&gt;A few weeks later we had an online meeting where I proposed a useful agenda but was ignored, instead Nate gave his updated plan for a business which was to give Dave a slice of the profit and otherwise he’d keep all the profit and all the control.  So I gave my proposal I’d been working on for a company with equal ownership, equal profit, a management structure and workers rights.  A couple weeks later we had anther video call but Nate called me first and told me I’d be excluded from it.  No explanation was given beyond I had “made some comments and would not be happy”.  If someone is telling you what your emotions that is when controlling behaviour starts to become abusive.  And thus ended my 25 years with KDE.&lt;/p&gt;



&lt;p&gt;And what of my colleagues?  Surely they wouldn’t want a setup where they have no control over their professional life and all their profit goes to one person?  Well dunno, they’ve stopped speaking to me.  Nothing.  Silence.  Nil.  Not so much as a “cheereo”, nor “sorry we chose the option were you got excluded” and certainly no explanation.  From people who I have worked with for some twenty years in some cases that hurts.  I don’t know why they stopped talking to me, I can only speculate and I don’t want to do that.&lt;/p&gt;



&lt;p&gt;We never had workers rights at Blue Systems, we were all on self employment contracts.  This will continue at Tech Paladin.  It is illegal but unenforceable when done on an international setup.  But employment rights are not a luxury you can chose to do without if you enjoy your job and want some more flexibility in your work day.  They are fundamental and life altering rights that change people’s lives as I discovered when my adopted children were taken away from me.  Nobody should be doing business with or taking money from Tech Paladin else be party to illegal workers rights abuses.&lt;/p&gt;



&lt;p&gt;Then I started to get sad, being cut off from my life for the last 25 years was too much for me.  All things come to an end and I’ve seen plenty people had to leave KDE because the money ran out or maybe they had a disagreement with someone in the project, but never a profiteering control struggle like this.  I struggled to get out of bed on some days.  I’ve given my life to KDE, I’ve seen it gone from a sure fire project to take over the world to being one open desktop project in a world of many to seeing the revival in recent years where we can honestly say we make some of the best software out there.  I like to think I’ve been part of keeping it alive, progressing, relevant and at the forefront of commercial, government and community usage.  It’s been an amazing ride full of opportunities and adventures the likes of which I’m sure my peers from my university course have never had.&lt;/p&gt;



&lt;p&gt;But in the end I lost my friends, my colleagues, my job, my career and my family.  What’s a spod who just tried to do the right thing for society to do?  Dunno.  For now, if you want me, you can find me surfing the endless wave whenever the sun sets over my digital nomad coliving paddleshack at the end of the world.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=oLEwUpT5DUc&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-1610&quot; height=&quot;859&quot; src=&quot;https://jriddell.org/wp-content/uploads/2025/09/image-1024x859.png&quot; width=&quot;1024&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=oLEwUpT5DUc&quot;&gt;Sunset surfs at the digital nomad coliving paddleshack at the end of the world&lt;/a&gt;&lt;/figure&gt;</description>
	<pubDate>Sun, 14 Sep 2025 20:56:35 +0000</pubDate>
</item>
<item>
	<title>Xubuntu: Guide Terbaru Slot Online, Versi Demo Tanpa Deposit, serta Platform Slot Online Gacor Versi Update</title>
	<guid isPermaLink="false">https://xubuntu.org/?p=5699</guid>
	<link>https://xubuntu.org/news/guide-terbaru-slot-online-versi-demo-tanpa-deposit-serta-platform-slot-online-gacor-versi-update/</link>
	<description>&lt;h1&gt;Panduan Asik Slot Online 2025&lt;/h1&gt;
&lt;p&gt;Saat ini, &lt;a href=&quot;https://emirategate.com/&quot;&gt;demo slot pragmatic&lt;/a&gt; semakin booming di para pecinta hiburan. Ada banyak alasan yang bikin game slot jadi favorit, mulai dari praktis dimainkan, koleksi slot bejibun, hingga hadiah besar yang bikin penasaran. Gak heran kalau slot gacor selalu jadi buruan utama bagi pemain baru maupun pemain pro.&lt;/p&gt;
&lt;h2&gt;Mengenal Game Slot&lt;/h2&gt;
&lt;p&gt;Permainan slot online adalah bentuk digital dari mesin slot klasik yang dulunya cuma ada di rumah judi. Lewat internet, setiap orang bisa menikmati slot online hanya dengan laptop mereka. Inilah alasan game slot menjadi tren, karena gampang dimengerti, fleksibel, serta bikin nagih.&lt;/p&gt;
&lt;p&gt;Daya tarik slot online juga ada di visual kece, soundtrack epik, dan koleksi tema unik. Dari retro vibes sampai slot modern, semua ada. Bahkan banyak developer game bikin slot bertema anime. Jadi, user bisa tentuin game favorit dengan bebas.&lt;/p&gt;
&lt;h2&gt;Manfaat Slot Demo&lt;/h2&gt;
&lt;p&gt;Mode gratis berguna banget buat pemula yang baru kenal slot. Dengan mode ini, pemain bisa mengetes mekanisme slot tanpa resiko kehilangan saldo. Mereka juga bisa belajar fitur scatter. Bahkan player berpengalaman sering menggunakan demo slot untuk uji RTP sebelum main sungguhan.&lt;/p&gt;
&lt;p&gt;Kesimpulannya, slot demo adalah alat belajar yang bikin nyaman, bukan hanya untuk player baru tapi juga user senior. Dengan begitu, saat masuk ke slot online, mereka lebih paham.&lt;/p&gt;
&lt;h2&gt;Fenomena Slot Gacor&lt;/h2&gt;
&lt;p&gt;Di kalangan penggemar slot, istilah slot hoki jadi bahan obrolan. Banyak yang yakin kalau ada periode spesial di mana slot kasih big win. Walaupun hasilnya RNG, kemenangan besar bikin pemain makin percaya ada slot gacor. Itulah kenapa akses slot gacor selalu heboh pemain.&lt;/p&gt;
&lt;h2&gt;Tips Cari Situs Slot Aman&lt;/h2&gt;
&lt;p&gt;Platform permainan slot ada banyak banget sekarang, tapi gak semuanya aman. Makanya pemain wajib cermat sebelum main. Beberapa hal penting yang patut diperhatikan antara lain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proteksi data biar informasi pribadi tetap terjaga.&lt;/li&gt;
&lt;li&gt;Support 24 jam yang cepat tanggap buat bantu masalah pemain.&lt;/li&gt;
&lt;li&gt;Review positif supaya user lebih percaya diri saat main.&lt;/li&gt;
&lt;li&gt;Transaksi lancar agar gak ribet untuk semua pemain.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Tren Toto Slot&lt;/h2&gt;
&lt;p&gt;Game toto belakangan makin naik daun. Fitur inovatif dari jenis ini ada di bonus spesial yang seru. Berbeda dengan slot klasik, toto slot sering ngasih free spin, bikin user merasa semakin enjoy tiap kali nyoba.&lt;/p&gt;
&lt;h3&gt;Panduan Bermain Slot Santai&lt;/h3&gt;
&lt;p&gt;Supaya main makin menyenangkan, ada beberapa trik yang bisa diterapkan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mulai dari slot demo biar ngerti cara main dulu.&lt;/li&gt;
&lt;li&gt;Kontrol budget dengan hati-hati, jangan terlalu napsu.&lt;/li&gt;
&lt;li&gt;Jangan lupa, permainan slot itu bergantung hoki, jadi fokus ke hiburan daripada ngejar profit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Penutup&lt;/h2&gt;
&lt;p&gt;Game slot digital makin seru dengan teknologi baru. Dari demo slot untuk latihan, slot mudah jackpot yang banyak dicari, sampai toto slot yang lagi trend, semua tersedia buat pengguna. Yang penting, mainlah santai, pilih situs aman, dan selalu sadari kalau keseruan lebih utama daripada cari profit.&lt;/p&gt;</description>
	<pubDate>Wed, 10 Sep 2025 17:39:35 +0000</pubDate>
</item>
<item>
	<title>Andrea Corbellini: Testing crash recovery features in a CI environment</title>
	<guid isPermaLink="false">tag:andrea.corbellini.name,2025-09-09:/2025/09/09/testing-crash-recovery-features-in-ci/</guid>
	<link>https://andrea.corbellini.name/2025/09/09/testing-crash-recovery-features-in-ci/</link>
	<description>&lt;p&gt;About two years ago I wrote a Rust crate to fulfill this promise:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a crash occurs while updating a file, the file either contains the old
contents, or the new contents, nothing in between.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This crate essentially solves the following problem: when you update a file,
generally you open it, truncate it, write to it block-by-block, and eventually
close it. The problem with this process is that if a crash occurs at any point
during this process (the program segfaults, the kernel panics, the machine
loses power, …), your file will be left in an intermediate state where the
old contents are completely lost, and the new contents are only partially
written (if at all). My crate solves this problem by making file updates &lt;em&gt;atomic&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This crate is publicly available as &lt;a href=&quot;https://crates.io/crates/atomic-write-file&quot;&gt;atomic-write-file&lt;/a&gt; and you can read its
description for more details (sorry, I’m very bad at naming things).&lt;/p&gt;
&lt;p&gt;The way the crate works is simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instead of opening the &lt;em&gt;target&lt;/em&gt; file directly, the crate opens a &lt;em&gt;temporary&lt;/em&gt;
   file.&lt;/li&gt;
&lt;li&gt;You write to the temporary file.&lt;/li&gt;
&lt;li&gt;Once all changes are in, the temporary file contents are synced to the
   storage, and it is atomically renamed so that it replaces the target file.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is not by any chance a new technique that I invented, and it’s a very
common strategy to solve the problem. This technique guarantees that if a crash
occurs at or before step 3, then the file will have the old contents,
unchanged. If a crash occurs after step 3, then the file will have the new
contents.&lt;/p&gt;
&lt;p&gt;There’s a small caveat with this technique: if a crash occurs between steps 1
and 3, then the crate will leave behind a temporary file that occupies some
space on the storage device with no purpose.&lt;/p&gt;
&lt;p&gt;This is where Linux anonymous temporary files come into play: this
Linux-specific feature allows you to create temporary files that are written on
the filesystem, but are not given a path in the filesystem. If a crash occurs
between step 1 and 3, the temporary file will simply be forgotten into
oblivion.&lt;/p&gt;
&lt;h1 id=&quot;meet-the-opponent-btrfs&quot;&gt;Meet the opponent: btrfs&lt;/h1&gt;
&lt;p&gt;Using Linux anonymous temporary files seemed very appealing for
atomic-write-file to avoid leaving leftovers behind, although I knew that
they’re not the perfect solution: there’s limited support (they’re supported
only on Linux, and only on some filesystems), they require the use of Linux
features that may not be available all the time (the &lt;code&gt;/proc&lt;/code&gt; filesystem), and
they also have the problem that, sooner or later, they will need to be given a
name if we want to be able to replace the target file, and this leaves a small
time window during which we could leave some cruft behind.&lt;/p&gt;
&lt;p&gt;But none of these are huge problems, and in fact atomic-write-file is able to
do a best effort attempt at using anonymous temporary files, and reverting to
regular files if that doesn’t work.&lt;/p&gt;
&lt;p&gt;One day I was notified about &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/issues/6&quot;&gt;an issue on using my crate on the btrfs file
system&lt;/a&gt;: after a crash, my crate could break its promise and leave the
file contents &lt;strong&gt;empty&lt;/strong&gt;. I did some investigation on the issue that &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/issues/6#issuecomment-2048836275&quot;&gt;you can
read about if you’re interested&lt;/a&gt;, and then fixed it.&lt;/p&gt;
&lt;p&gt;This problem was specific to btrfs, and I argue that it’s actually caused by a
btrfs bug, rather than a bug in the crate itself, but nonetheless this issue
had revealed a critical flaw of my crate: &lt;strong&gt;I did not have any tests to check
if my crate was fulfilling its promise or not!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Therefore I decided to create a small test suite for Linux to simulate crashes
and inspect the contents of files after those crashes occurred on a variety of
filesystems, which is what this blog post is about. This test suite now runs on
my laptop and &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/actions/workflows/crash-tests.yml&quot;&gt;on GitHub Actions&lt;/a&gt;, and potentially any
other CI environment.&lt;/p&gt;
&lt;h1 id=&quot;testing-strategy&quot;&gt;Testing strategy&lt;/h1&gt;
&lt;p&gt;Here’s the idea I came up with: I can create a virtual machine, with a virtual
storage device attached to it, and a filesystem initialized with a file. The
virtual machine updates the file using atomic-write-file, and then triggers a
kernel panic. After that, the file is inspected for consistency.&lt;/p&gt;
&lt;p&gt;So here is how it works in practice: there are 3 main pieces:
1. A test binary that is responsible for updating the test file using
   atomic-write-file.
1. An &lt;code&gt;init.sh&lt;/code&gt; script that runs inside the virtual machine.
1. The &lt;code&gt;run-tests.sh&lt;/code&gt; script that puts everything together and starts up the
   virtual machine.&lt;/p&gt;
&lt;h2 id=&quot;the-test-binary&quot;&gt;The test binary&lt;/h2&gt;
&lt;p&gt;The test binary that is a &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/blob/master/crash-tests/linux/src/main.rs&quot;&gt;short Rust program&lt;/a&gt; that I can paste here:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;atomic_write_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AtomicWriteFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AtomicWriteFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/test/file&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;open failed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write_all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;b&quot;hello&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;write failed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;commit failed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nothing special to see here: this is the minimal code required to use atomic-write-file.&lt;/p&gt;
&lt;h2 id=&quot;the-initsh-script&quot;&gt;The init.sh script&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/blob/master/crash-tests/linux/init.sh&quot;&gt;The &lt;code&gt;init.sh&lt;/code&gt; script&lt;/a&gt; is more interesting: this script in fact is meant to run
&lt;em&gt;twice&lt;/em&gt;. The first time it runs, &lt;code&gt;init.sh&lt;/code&gt; will run the test binary above and
trigger the kernel panic. The second time, it will read the test file contents
and report them back &lt;code&gt;run-tests.sh&lt;/code&gt; script for inspection.&lt;/p&gt;
&lt;p&gt;Let’s take a closer look at what it does: first, it mounts the &lt;code&gt;/proc&lt;/code&gt; and
&lt;code&gt;/sys&lt;/code&gt; virtual filesystems. These are needed for some basic system functions,
and also to enable the Linux anonymous temporary file feature.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mount&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;proc&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;none&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/proc
mount&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;sysfs&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;none&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/sys
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then it mounts the filesystem containing the test file. Before it can do that,
however, it needs to load the correct kernel module for the filesystem. Nothing
too fancy here: the filesystem type is simply specified on the kernel command
line (read through &lt;code&gt;/proc/cmdline&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;fstype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;grep&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-Eo&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'test.fs=\w+'&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/proc/cmdline&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;cut&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-d&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-f2&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
modprobe&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$fstype&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt;
mount&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$fstype&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/dev/sdb&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then, if this script is run for the first time, it will run the test executable and quit:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Running test binary'&lt;/span&gt;
atomic-write-file-test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;init.sh&lt;/code&gt; (as the name suggests) is run as the init script of the virtual
machine. In Linux, if the init script quits without invoking the proper
shutdown sequence, the kernel will panic. So we don’t actually need to do
anything special to trigger a panic. I could have inserted a &lt;code&gt;echo c &amp;gt;
/proc/sysrq-trigger&lt;/code&gt; line to make it more explicit, but then I figured that
having that line wouldn’t be nice for people who want to test the script on
their system.&lt;/p&gt;
&lt;p&gt;You might ask: how does &lt;code&gt;init.sh&lt;/code&gt; know if it’s the first time it gets called or
the second? Again, nothing fancy here: &lt;code&gt;run-tests.sh&lt;/code&gt; gives that hint using a
kernel command line argument:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;grep&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-q&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;test.verify&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/proc/cmdline&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If &lt;code&gt;test.verify&lt;/code&gt; is specified on &lt;code&gt;/proc/cmdline&lt;/code&gt;, then it means this is the
second time this script is run. In that case, the file contents are just
printed on the console:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;grep&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-q&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;test.verify&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/proc/cmdline&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Verifying test file contents'&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-----'&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;xxd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/test/file
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-----'&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;poweroff&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-f
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This uses &lt;code&gt;xxd&lt;/code&gt; so in case there are garbled characters on screen, we can
comfortably analyze the output and figure out what happened. At the end, the
system is more gracefully shut down using &lt;code&gt;poweroff&lt;/code&gt; to avoid another kernel
panic (this is not really necessary).&lt;/p&gt;
&lt;h1 id=&quot;the-run-testssh-script&quot;&gt;The run-tests.sh script&lt;/h1&gt;
&lt;p&gt;And then there’s &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/blob/master/crash-tests/linux/run-test.sh&quot;&gt;the &lt;code&gt;run-tests.sh&lt;/code&gt; script that crates the virtual storage,
launches the virtual machine, and inspects the file contents&lt;/a&gt;.
This is where most the complexity is, so let’s go step-by-step (the code below
has been simplified from the original for readability):&lt;/p&gt;
&lt;p&gt;The first thing it does is compiling the test binary above. The virtual machine
runs in a very barebone environment, so I used static linking to avoid having
to copy additional libraries like &lt;code&gt;libc&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;uname&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-m&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;-unknown-linux-gnu
&lt;span class=&quot;nv&quot;&gt;RUSTFLAGS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-C target-feature=+crt-static'&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;cargo&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;build&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--release&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--features&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$cargo_features&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--target&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$target&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then &lt;code&gt;run-tests.sh&lt;/code&gt; creates a minimal &lt;a href=&quot;https://en.wikipedia.org/wiki/Initial_ramdisk&quot;&gt;initramfs&lt;/a&gt; for the virtual machine. The
initramfs is a filesystem that gets mounted by Linux early at boot. It’s
generally used by Linux distributions to load the main operating system, but in
my case the initramfs contains everything needed for the test. In particular,
it contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The test binary.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;init.sh&lt;/code&gt; script.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/BusyBox&quot;&gt;BusyBox&lt;/a&gt;, to get the needed utilities like &lt;code&gt;xxd&lt;/code&gt; and &lt;code&gt;poweroff&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The kernel modules to mount filesystems and their dependencies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first 3 items are easy to set up:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;init.sh&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-T&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/sbin/init&quot;&lt;/span&gt;
cp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;atomic-write-file-test&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/bin&quot;&lt;/span&gt;
cp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;which&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;busybox&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/bin&quot;&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$busybox&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--install&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-s&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/bin&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The kernel modules are a bit more complicated. First of all: where can we get
them from? Ideally, I would have liked to download them from some minimal Linux
distribution, but this turned out to be more complicated than expected. In the
end, I decided to just steal them from the host operating system:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;modules&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/lib/modules/&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;uname&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-r&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
cp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-a&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$modules&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/lib/modules&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-r&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mod_path&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;*.ko.gz&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;gunzip&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-o&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.uncompressed&quot;&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;*.ko.xz&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;unxz&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-o&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.uncompressed&quot;&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;*.ko.zst&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;unzstd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-o&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.uncompressed&quot;&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;mv&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.uncompressed&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&amp;lt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&amp;lt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;modprobe&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--dirname&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--show-depends&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filesystem_type&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;grep&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;^insmod&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;cut&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-d&lt;span class=&quot;s1&quot;&gt;' '&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-f2&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What this does is copying all the module files from the host, getting all the
dependencies for the filesystem module using &lt;code&gt;modprobe&lt;/code&gt;, and then uncompressing
those modules if they’re compressed (I found this much easier than adding
compression support in the virtual machine). An alternative approach would be
to simply decompress all the modules, but that’s much slower.&lt;/p&gt;
&lt;p&gt;Once everything has been copied over and uncompressed, the initramfs is
created:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;initramfs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;rootfs.img
mksquashfs&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now it’s time to create the virtual storage device with the filesystem, which
is a trivial task:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;testfs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;testfs.img
dd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/zero&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$testfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1M&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;300&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;mkfs.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filesystem_type&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$testfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Finally, we can start our VM using &lt;a href=&quot;https://en.wikipedia.org/wiki/QEMU&quot;&gt;QEMU&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;qemu&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;qemu-system-&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;uname&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-m&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/boot/vmlinuz-&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;uname&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-r&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$qemu&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-kernel&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$kernel&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-append&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;root=/dev/sda ro panic=-1 console=ttyS0 quiet test.fs=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filesystem_type&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-drive&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;index=0,media=disk,format=raw,file=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-drive&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;index=1,media=disk,format=raw,file=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$testfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-no-reboot&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-nographic
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Again we’re stealing the kernel from the host operating system, which is also
where the kernel modules come from. The &lt;code&gt;drive&lt;/code&gt; with &lt;code&gt;index=0&lt;/code&gt; is the initramfs
and will be visible as &lt;code&gt;/dev/sda&lt;/code&gt; in the guest; the other drive with &lt;code&gt;index=1&lt;/code&gt;
is our test storage and will be visible as &lt;code&gt;/dev/sdb&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;root=/dev/sda&lt;/code&gt; tells the kernel to boot from our initramfs image. &lt;code&gt;panic=-1&lt;/code&gt;
tells the kernel not to reboot in case of a panic (&lt;code&gt;panic=N&lt;/code&gt; specifies the
number of seconds to wait before rebooting in case of kernel panic; specifying
a negative value blocks that behavior). &lt;code&gt;console=ttyS0&lt;/code&gt; allows us to capture
the output printed by the init script. &lt;code&gt;test.fs=...&lt;/code&gt; is the option that
&lt;code&gt;init.sh&lt;/code&gt; is going to look for to understand what filesystem type to use.&lt;/p&gt;
&lt;p&gt;Once that runs, the virtual machine is expected to do its job and crash with a
kernel panic. We then need to restart it to verify the file contents. The QEMU
command is exactly the same except for the additional &lt;code&gt;test.verify&lt;/code&gt; option:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;output.txt

&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$qemu&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-kernel&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$kernel&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-append&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;root=/dev/sda ro panic=-1 console=ttyS0 quiet test.fs=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filesystem_type&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; test.verify&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-drive&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;index=0,media=disk,format=raw,file=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-drive&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;index=1,media=disk,format=raw,file=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$testfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-no-reboot&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-nographic&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;tee&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The output from this command is captured in a file that can be analyzed. If you
remember how &lt;code&gt;init.sh&lt;/code&gt; is written, you might have noticed that it writes the
test file contents between two markers:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-----'&lt;/span&gt;
xxd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/test/file
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-----'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So what we have to do to verify the contents of the file is simply look for
those two &lt;code&gt;-----&lt;/code&gt; markers, get the content in between, and parse it through
&lt;code&gt;xxd -r&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;sed&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-n&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/-----/, /-----/p'&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;xxd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-r&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;hello&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Success&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Failure&quot;&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And that’s it!&lt;/p&gt;
&lt;h1 id=&quot;running-in-github-actions&quot;&gt;Running in GitHub Actions&lt;/h1&gt;
&lt;p&gt;The next step for me was to set up some automation to make sure that my test
script was run whenever I made any change to the crate. Because my project was
already hosted on GitHub, I decided to go with GitHub Actions. I was a bit
worried that I would have had to struggle to make it work because my script
works by &lt;em&gt;stealing&lt;/em&gt; the kernel from the host, and I thought that the GitHub
runners could have some protections in place to prevent me from reading the
kernel. To my surprise, there were no such restrictions. In fact, I did not
have to modify a single line of code to make my tests work in GitHub Actions:
check out the &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/blob/master/.github/workflows/crash-tests.yml&quot;&gt;workflow file&lt;/a&gt; if you’re curious.&lt;/p&gt;
&lt;h1 id=&quot;result&quot;&gt;Result&lt;/h1&gt;
&lt;p&gt;In the end, the test suite was able to reproduce the issue with btrfs and
anonymous temporary files, as well as show that the fix was working as
intended. This is what it looks like (output in the screenshot was trimmed down
a bit):&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Output showing a failure from the test suite&quot; src=&quot;https://andrea.corbellini.name/images/crash-tests-failure.png&quot; /&gt;
  Output from the &lt;code&gt;run-test.sh&lt;/code&gt; script &lt;em&gt;before&lt;/em&gt; applying the fix, showing a failure.
&lt;/figure&gt;

&lt;figure&gt;
  &lt;img alt=&quot;Output showing a success from the test suite&quot; src=&quot;https://andrea.corbellini.name/images/crash-tests-success.png&quot; /&gt;
  Output from the &lt;code&gt;run-test.sh&lt;/code&gt; script &lt;em&gt;after&lt;/em&gt; applying the fix, showing a success.
&lt;/figure&gt;

&lt;h1 id=&quot;future&quot;&gt;Future&lt;/h1&gt;
&lt;p&gt;I’m pretty satisfied with the general approach of running in a virtual machine
and simulating a crash, but the implementation has a huge limitation: because
it &lt;em&gt;steals&lt;/em&gt; the kernel from the host, it cannot simulate crashes on other
kernels, operating systems, or platforms.&lt;/p&gt;
&lt;p&gt;I think in the future I’m going to take a look at &lt;a href=&quot;https://github.com/cross-rs/cross&quot;&gt;cross-rs&lt;/a&gt;, a cross-platform
tool for Rust crates. Cross-rs works kinda in a similar way as my test suite,
in that it uses QEMU emulation to run tests. Maybe I can reuse their QEMU
images and tweak them to run my crash tests. If that is feasible, then I will
be able to extend my test suite to all major platforms and operating systems.&lt;/p&gt;</description>
	<pubDate>Tue, 09 Sep 2025 00:05:00 +0000</pubDate>
</item>
<item>
	<title>Dougie Richardson: CLI Corner: rsync</title>
	<guid isPermaLink="false">https://dougiewougie.com/?p=2981</guid>
	<link>https://dougiewougie.com/linux/cli-corner-rsync/</link>
	<description>&lt;p&gt;Synchronise two directories, e.g. Nextcloud and an encrypted USB drive with archive, recursive, partial, and progress flags:&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code class=&quot;language-bash&quot; lang=&quot;bash&quot;&gt;rsync -varP src destination&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 31 Aug 2025 10:38:37 +0000</pubDate>
</item>
<item>
	<title>Scarlett Gately Moore: A Bittersweet Farewell: My Final KDE Snap Release and the End of an Era</title>
	<guid isPermaLink="false">https://www.scarlettgatelymoore.dev/?p=2134</guid>
	<link>https://www.scarlettgatelymoore.dev/a-bittersweet-farewell-my-final-kde-snap-release-and-the-end-of-an-era/</link>
	<description>&lt;p&gt;Today marks both a milestone and a turning point in my journey with open source software. I’m proud to announce the release of KDE Gear 25.08.0 as my final snap package release. You can find all the details about this exciting update at the &lt;a href=&quot;https://kde.org/announcements/gear/25.08.0/&quot;&gt;official KDE announcement&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;After much reflection and with a heavy heart, I’ve made the difficult decision to retire from most of my open source software work, including snap packaging. This wasn’t a choice I made lightly – it comes after months of rejections and silence in an industry I’ve loved and called home for over 20 years.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Passing the Torch&lt;/h2&gt;



&lt;p&gt;While I’m stepping back, I’m thrilled to share that the future of KDE snaps is in excellent hands. Carlos from the Neon team has been working tirelessly to set up snaps on the new infrastructure that KDE has made available. This means building snaps in KDE CI is now possible – a significant leap forward for the ecosystem. I’ll be helping Carlos get the pipelines properly configured to ensure a smooth transition.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Staying Connected (But Differently)&lt;/h2&gt;



&lt;p&gt;Though I’m stepping away from most development work, I won’t be disappearing entirely from the communities that have meant so much to me:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Kubuntu&lt;/strong&gt;: I’ll remain available as a backup, though Rik is doing an absolutely fabulous job getting the latest and greatest KDE packages uploaded. The distribution is in capable hands.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Ubuntu Community Council&lt;/strong&gt;: I’m continuing my involvement here because I’ve found myself genuinely enjoying the community side of things. There’s something deeply fulfilling about focusing on the human connections that make these projects possible.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Debian&lt;/strong&gt;: I’ll likely be submitting for emeritus status, as I haven’t had the time to contribute meaningfully and want to be honest about my current capacity.&lt;/li&gt;
&lt;/ul&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;The Reality Behind the Decision&lt;/h2&gt;



&lt;p&gt;This transition isn’t just about career fatigue – it’s about financial reality. I’ve spent too many years working for free while struggling to pay my bills. The recent changes in the industry, particularly with AI transforming the web development landscape, have made things even more challenging. Getting traffic to websites now requires extensive social media work and marketing – all expected to be done without compensation.&lt;/p&gt;



&lt;p&gt;My stint at webwork was good while it lasted, but the changing landscape has made it unsustainable. I’ve reached a point where I can’t continue doing free work when my family and I are struggling financially. It shouldn’t take breaking a limb to receive the donations needed to survive.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;A Career That Meant Everything&lt;/h2&gt;



&lt;p&gt;These 20+ years in open source have been the defining chapter of my professional life. I’ve watched communities grow, technologies evolve, and witnessed firsthand the incredible things that happen when passionate people work together. The relationships I’ve built, the problems we’ve solved together, and the software we’ve created have been deeply meaningful.&lt;/p&gt;



&lt;p&gt;But I also have to be honest about where I stand today: I cannot compete in the current job market. The industry has changed, and despite my experience and passion, the opportunities just aren’t there for someone in my situation.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Looking Forward&lt;/h2&gt;



&lt;p&gt;Making a career change after two decades is terrifying, but it’s also necessary. I need to find a path that can provide financial stability for my family while still allowing me to contribute meaningfully to the world.&lt;/p&gt;



&lt;p&gt;If you’ve benefited from my work over the years and are in a position to help during this transition, I would be forever grateful for any support. Every contribution, no matter the size, helps ease this difficult period: &lt;a href=&quot;https://gofund.me/a9c55d8f&quot;&gt;https://gofund.me/a9c55d8f&lt;/a&gt;&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Thank You&lt;/h2&gt;



&lt;p&gt;To everyone who has collaborated with me, tested my packages, filed bug reports, offered encouragement, or simply used the software I’ve helped maintain – thank you. You’ve made these 20+ years worthwhile, and you’ve been part of something bigger than any individual contribution.&lt;/p&gt;



&lt;p&gt;The open source world will continue to thrive because it’s built on the collective passion of thousands of people like Carlos, Rik, and countless others who are carrying the torch forward. While my active development days are ending, the impact of this community will continue long into the future.&lt;/p&gt;



&lt;p&gt;With sincere gratitude and fond farewells,&lt;/p&gt;



&lt;p&gt;Scarlett Moore&lt;/p&gt;</description>
	<pubDate>Mon, 25 Aug 2025 15:42:29 +0000</pubDate>
</item>
<item>
	<title>Andrea Corbellini: It will take decades to undo the damage done by &quot;AI&quot;</title>
	<guid isPermaLink="false">tag:andrea.corbellini.name,2025-08-20:/2025/08/20/it-will-take-decades-to-undo-the-damage-done-by-ai/</guid>
	<link>https://andrea.corbellini.name/2025/08/20/it-will-take-decades-to-undo-the-damage-done-by-ai/</link>
	<description>&lt;p&gt;Many business owners in the software development industry are investing a lot
into LLM bots, marketed as “generative AI”. Some of them go as far as &lt;em&gt;forcing&lt;/em&gt;
software developers to use such tools under the threat of being fired if they
don’t comply. After all, why shouldn’t they? This technology has a catchy name,
it produces very convincing output that sometimes is correct (or close to being
correct), and companies producing these tools are very good at downplaying
their limitations and at promising that the “next version” will be
astonishingly better than the one before.&lt;/p&gt;
&lt;p&gt;My day-to-day experience, and scientific research, however show a quite big
problem: while senior developers get little or no gain from “generative AI”
(&lt;a href=&quot;https://www.reuters.com/business/ai-slows-down-some-experienced-software-developers-study-finds-2025-07-10/&quot;&gt;1&lt;/a&gt;,
&lt;a href=&quot;https://fortune.com/2025/07/20/ai-hampers-productivity-software-developers-productivity-study/&quot;&gt;2&lt;/a&gt;,
&lt;a href=&quot;https://blueheadline.com/software-dev/ai-helps-new-developers-but-seniors/&quot;&gt;3&lt;/a&gt;,
&lt;a href=&quot;https://blog.stackademic.com/ai-coding-tools-slow-senior-devs-by-19-why-experts-are-still-using-them-98d855b81c4e&quot;&gt;4&lt;/a&gt;),
junior developers get massive boosts in productivity. Why am I describing a
boost in productivity as a problem? Well, it’s simple: the new generations of
software developers (the ones that are just entering the job market, and the
ones that are still in school) are relying heavily on these LLM tools for
&lt;em&gt;nearly all&lt;/em&gt; work-related tasks. And, again, why shouldn’t they? The entire
world is telling them to do so! And as a result of that, they are advancing
without gaining any actual skill.&lt;/p&gt;
&lt;p&gt;Me and other (ex-)coworkers have seen it first hand: a junior developer
completes a task using an LLM bot. More senior developers find major problems
with the result. Junior developers go back to the LLM tool asking for a fix,
wasting hours or days without a positive outcome. &lt;strong&gt;Junior developers are
becoming unable to perform tasks independently.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In addition to that, there’s a problem that I feel like is not talked about
extensively: these LLM tools can only regurgitate what they’ve been trained
with. They’re good at finding patterns and re-applying strategies that have
been used in prior work, but by their nature they cannot &lt;em&gt;create&lt;/em&gt; or
&lt;em&gt;innovate&lt;/em&gt;. So, if this trend continues, &lt;strong&gt;the new generations of software
developers are not just going to be &lt;em&gt;skill-less&lt;/em&gt;, they’re also going to be
incapable of solving new problems that haven’t been seen before&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;My prediction? &lt;strong&gt;Within 10 or 20 years, the older generation of software
developers will be asked to come out of retirement to fix the unmaintainable
mess created by the newer generations, and to make advancements in the
information technology sector.&lt;/strong&gt; A bit like old COBOL developers are asked to
come out of retirement to maintain banking systems, but on a much larger scale.
This, unless there will be advancements towards &lt;em&gt;true&lt;/em&gt; Artificial Intelligence,
or unless the current trend in education is broken.&lt;/p&gt;
&lt;p&gt;Now don’t get me wrong: I’m not opposed to LLM bots (although I’m against
calling them “AI”, because they’re very far from fulfilling the AI promise),
and I think they can be very powerful tools. What I’m worried about is that new
generations are being told to rely on them almost exclusively, and this can
only lead to an evident skill gap. In fact, I think that if there’s a country
that in the future will be able to harness the power of the LLM bots and &lt;em&gt;at
the same time&lt;/em&gt; maintain a good enough level of education, thus addressing the
skill gap problem, they will be the dominant economic power of the future,
because they will be able to automate tasks that are time/energy-consuming for
humans, while at the same time use the human brain to innovate and advance.&lt;/p&gt;</description>
	<pubDate>Wed, 20 Aug 2025 17:17:00 +0000</pubDate>
</item>
<item>
	<title>Erich Eickmeyer: Raspberry Pi as a Networked Audio Interface</title>
	<guid isPermaLink="false">http://ericheickmeyer.com/?p=5998</guid>
	<link>https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/</link>
	<description>&lt;p&gt;I haven’t posted for quite some time, and a lot has happened. For instance, my wife revived Edubuntu and my work with Ubuntu Studio now spans over 7 years.&lt;/p&gt;



&lt;p&gt;Recently, I became the proud owner of a Behringer X-Air XR18. This became the key to opening a new business, which I’ll announce at a later date. I’m working on acquiring more equipment to make this work.&lt;/p&gt;



&lt;p&gt;As many people know, the XR18 is a stagebox-style mixer in which the mixer is physically on the stage with no controls but controlled with an iPad or Android tablet. However, as the owner of a Behringer X-Touch, which integrates seamlessly with an X-Air mixer via either MIDI or Network connections. In my situation, this gives the ability to have a physical front-of-house setup, with a computer showing the X-Air Edit application.&lt;/p&gt;



&lt;p&gt;However, what if I want to multi-track record or add custom effects via Ubuntu Studio? This is where it would get complicated as I would then have to run a prohibitively-long USB cable from my computer to the XR18 on the stage. This would not be ideal.&lt;/p&gt;



&lt;p&gt;As many people know, MIDI can be routed via network, which is the way the X-Touch, XR18, and X-Air app work together. A simple WiFi router and ethernet cable wouild be a great solution to this problem, but that also leaves an Ethernet cable prone to being tripped-over by audience members (unless one were to gaff it down). So, since we’ve already got WiFi, let’s take advantage of that.&lt;/p&gt;



&lt;p&gt;To expose the audio ports to the WiFi, we’re going to have to bridge it. But… how? Most people would tell me just to use &lt;a href=&quot;https://www.audinate.com/&quot;&gt;Dante&lt;/a&gt; but, unfortunately, Audinate refuses to support Linux, and AES67 support in PipeWire is very young. However, it turns out, &lt;a href=&quot;https://www.jacktrip.com/&quot;&gt;JackTrip&lt;/a&gt; is in the Ubuntu repositories and, as its name would imply, integrates seamlessly with &lt;a href=&quot;https://jackaudio.org/&quot;&gt;JACK &lt;/a&gt;and, therefore, &lt;a href=&quot;https://pipewire.org&quot;&gt;PipeWire&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;Setting this up is rather simple, and I’m documenting the process here.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Prerequisites&lt;/h2&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;A Raspberry Pi 4 or higher (I have a late 2023 Raspberry Pi 5)&lt;/li&gt;



&lt;li&gt;A micro SD card (16GB or larger)&lt;/li&gt;



&lt;li&gt;&lt;a href=&quot;https://cdimage.ubuntu.com/releases/noble/release/&quot;&gt;Ubuntu Server for Raspberry Pi&lt;/a&gt; (I used 24.04, linked here).&lt;/li&gt;



&lt;li&gt;Optional: &lt;a href=&quot;https://ubuntu.com/pro&quot;&gt;Ubuntu Pro&lt;/a&gt; (for the RealTime Ubuntu Raspberry Pi Kernel)&lt;/li&gt;
&lt;/ul&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Here we go…&lt;/h2&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;alignright size-large is-resized&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6004&quot; data-attachment-id=&quot;6004&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;image&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image.png?w=662&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image.png?w=300&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image.png&quot; data-orig-size=&quot;832,616&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/image/&quot; height=&quot;616&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image.png?w=832&quot; style=&quot;width: 417px; height: auto;&quot; width=&quot;832&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;The first thing I did was install the downloaded preinstalled server image to a micro SD card. This is accomplished using Raspberry Pi Imager. I used the Snap version maintained by Dave Jones of Canonical, part of Canonical’s Raspberry Pi team. If you’ve never met Dave, he does all of his computing via Raspberry Pi, and it’s a sight to behold!&lt;br /&gt;&lt;br /&gt;To get that, it’s as easy as &lt;code&gt;sudo snap install rpi-imager&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;I made sure to set the server to automatically detect my WiFi, but if you plan to use a hard Ethernet connection, this isn’t necessary. Just be sure you can SSH into the machine as this is key (pre-set a user and set the machine name).&lt;/p&gt;



&lt;p&gt;Once the SD card is imaged, I SSH’d into the machine (&lt;code&gt;ssh erich@{computer-name}.local&lt;/code&gt;). The first thing I did was install &lt;code&gt;jackd2&lt;/code&gt; and &lt;code&gt;jacktrip&lt;/code&gt;:&lt;/p&gt;



&lt;p&gt;&lt;code&gt;sudo apt install --no-install-recommends jackd2 jacktrip&lt;/code&gt;&lt;/p&gt;



&lt;p&gt;One must use the &lt;code&gt;--no-install-recommends&lt;/code&gt; option to avoid installing unecessary graphical tools as &lt;code&gt;jackd2&lt;/code&gt; will want to install &lt;code&gt;qjackctl&lt;/code&gt; which is the GUI application to control JACK. We don’t need it here. JackTrip has an option to automatically connect to all inputs and outputs, so we’ll use that here.&lt;/p&gt;



&lt;p&gt;To automatically start JACK upon boot, I modified &lt;a href=&quot;https://raw.githubusercontent.com/jackaudio/jack2/refs/heads/develop/systemd/jack%40.service.in&quot;&gt;this systemd unit file &lt;/a&gt;to be custom for my setup. You’ll notice I made the buffer 256 (&lt;code&gt;-p 256&lt;/code&gt;) with 3 periods per buffer (&lt;code&gt;-n 3&lt;/code&gt;) as gives the highest reliablility on a USB connection. Additionally, the highest frequency an XR18 runs at is 48000 Hz, so I made sure to set the frequency there (&lt;code&gt;-r 48000&lt;/code&gt;). Also, we want the process to run in realtime and directly to ALSA (&lt;code&gt;--realtime -dalsa&lt;/code&gt;):&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;[Unit]
Description=JACK server using %i user profile
Documentation=man:jackd(1)
After=sound.target local-fs.target

[Service]
User=%i
Group=%i
#Type=notify
EnvironmentFile=-/etc/jack/alsa.conf
#EnvironmentFile=-%h/.config/jack/%i.conf
ExecStart=/usr/bin/jackd --realtime -dalsa -p 256 -n 3 -r 48000
# -d $DEVICE $DRIVER_SETTINGS
LimitRTPRIO=95
LimitRTTIME=infinity
LimitMEMLOCK=infinity
# Caution: use on memory-limited devices only
# OOMScoreAdjust=-1000

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;I installed this to &lt;code&gt;/usr/lib/systemd/system/jackd@.service&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;Next, I created a systemd unit file to start JackTrip. I needed this to be a server (&lt;code&gt;-s&lt;/code&gt;), with 18 inputs and outputs (for an XR18, &lt;code&gt;-n 18&lt;/code&gt;) and automatically connect upon start (&lt;code&gt;-q auto&lt;/code&gt;):&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;[Unit]
Description=JackTrip Audio Network Service
After=network.target sound.target jackd@%i.service
Wants=network-online.target

[Service]
# Run as a specific user who has JACK permissions
User=%i
Group=%i

ExecStart=jacktrip -s -n 18 -q auto --udprt
Restart=always
RestartSec=5

# Optional: environment for JACK if needed
#Environment=JACK_NO_AUDIO_RESERVATION=1

# Give JACK/JackTrip real-time priority
LimitRTPRIO=infinity
LimitMEMLOCK=infinity

[Install]
WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;I installed this to &lt;code&gt;/usr/lib/systemd/system/jacktrip@.service&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;Next, to make sure this runs as my user, I did the following:&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;sudo systemctl enable jackd@erich.service
sudo systemctl enable jacktrip@erich.service&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Optionally, since this will be used as a headless appliance, one can use Ubuntu Pro to get the RealTime Kernel. This is accomplished by the following with an &lt;a href=&quot;https://login.ubuntu.com/&quot;&gt;Ubuntu One account&lt;/a&gt;:&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;pro attach
pro enable realtime-kernel&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;To make sure everything worked, check &lt;code&gt;pro status&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;You can have up to 5 machines running Ubuntu Pro for free. In my case, as an Ubuntu Member, I can have up to 50 machines for free, and this is only my third one!&lt;/p&gt;



&lt;p&gt;Once this is done, reboot. On your other machine, install &lt;code&gt;jacktrip-gui&lt;/code&gt;. (This will be in Ubuntu Studio 25.10 and higher by default!): &lt;code&gt;sudo apt install jacktrip-gui&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;Opening it, it will ask you if you want to sign in with a Virtual Studio account. This is because JackTrip allows you to collaborate across the entire internet with fellow musicians with very low latency! It’s pretty cool! However, we don’t need that for this purpose. Instead, we’re going to say “No” and simply connect to the server as a P2P client:&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-large is-resized&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-1.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6012&quot; data-attachment-id=&quot;6012&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;image&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-1.png?w=662&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-1.png?w=300&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-1.png&quot; data-orig-size=&quot;856,795&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/image-2/&quot; height=&quot;795&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-1.png?w=856&quot; style=&quot;width: 678px; height: auto;&quot; width=&quot;856&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;Enter the computer name with &lt;code&gt;.local&lt;/code&gt; afterwards, and it should find it as long as your desktop or laptop is connected to the same network as the Raspberry Pi.&lt;/p&gt;



&lt;p&gt;After you click “Connect”, you should see this:&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-large is-resized&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-3.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6017&quot; data-attachment-id=&quot;6017&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;image&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-3.png?w=662&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-3.png?w=224&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-3.png&quot; data-orig-size=&quot;856,1148&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/image-4/&quot; height=&quot;1024&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-3.png?w=764&quot; style=&quot;width: 630px; height: auto;&quot; width=&quot;764&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;As you can see, this has audio coming in from a microphone already.&lt;/p&gt;



&lt;p&gt;Back in X-Air Edit, already connected to the mixer, I changed my routing so channels 1 and 2 were being sent to the aux, so I can then use my computer’s audio there for music from e.g. Spotify:&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-4.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6019&quot; data-attachment-id=&quot;6019&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;image&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-4.png?w=662&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-4.png?w=300&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-4.png&quot; data-orig-size=&quot;1189,754&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/image-5/&quot; height=&quot;649&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-4.png?w=1024&quot; width=&quot;1024&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;Next I started a Dummy Audio Device from &lt;a href=&quot;https://ubuntustudio.org/audio-configuration/&quot;&gt;Ubuntu Studio Audio Configuration&lt;/a&gt; and made it the main output for the computer. I then connected the monitor of the dummy output to channels 1 and 2 of JackTrip using Patchance:&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-large&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-5.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6021&quot; data-attachment-id=&quot;6021&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;image&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-5.png?w=457&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-5.png?w=300&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-5.png&quot; data-orig-size=&quot;457,326&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/image-6/&quot; height=&quot;326&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-5.png?w=457&quot; width=&quot;457&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;…and VIOLA! Even testing my microphone, there was so little latency it was imperceivable.&lt;/p&gt;



&lt;p&gt;I’m envisioning a setup like this:&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/stage.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6068&quot; data-attachment-id=&quot;6068&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;stage&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/stage.png?w=662&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/stage.png?w=300&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/stage.png&quot; data-orig-size=&quot;740,294&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/stage/&quot; height=&quot;294&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/stage.png?w=740&quot; width=&quot;740&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;I’m excited to test this further! Overall, I feel like I’ve found a way to do a Dante-less audio-over-ethernet setup that cost me nothing!&lt;/p&gt;</description>
	<pubDate>Tue, 19 Aug 2025 19:48:23 +0000</pubDate>
</item>
<item>
	<title>Jonathan Carter: Debian 13</title>
	<guid isPermaLink="false">https://jonathancarter.org/?p=11948</guid>
	<link>https://jonathancarter.org/2025/08/10/debian-13/</link>
	<description>&lt;p&gt;Debian 13 has finally &lt;a href=&quot;https://bits.debian.org/2025/08/trixie-released.html&quot;&gt;been released&lt;/a&gt;!&lt;/p&gt;



&lt;p&gt;One of the biggest and under-hyped features is support for HTTP Boot. This allows you to simply specify a URL (to any d-i or live image iso) in your computer’s firmware setup and then you can boot to it directly over the Internet, so no need to download an image, write it to flash disk and then boot from the flash disk on computers made in the last ~5 years. This is also supported on the Tianocore free EFI firmware, which is useful if you’d like to try it out on QEMU/KVM.&lt;/p&gt;



&lt;p&gt;More details about Debian 13 available on the &lt;a href=&quot;https://www.debian.org/News/2025/20250809&quot;&gt;official press release&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;The default theme for Debian 13 is &lt;a href=&quot;https://wiki.debian.org/DebianArt/Themes/Ceratopsian&quot;&gt;Ceratopsian&lt;/a&gt;, designed by Elise Couper. I’ll be honest, I wasn’t 100% sure it was the best choice when it won the artwork vote, but it really grew on me over the last few months, and it looked &lt;em&gt;great&lt;/em&gt; in combination with all kinds of other things during DebConf too, so it has certainly won me over.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11957&quot; height=&quot;500&quot; src=&quot;https://jonathancarter.org/files/images/wllpaper.jpeg&quot; style=&quot;width: 798px; height: auto;&quot; width=&quot;800&quot; /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;And I particularly like the Plymouth theme. It’s very minimal, and it reminds me of the Toy Story Trixie character, it’s almost like it helps explain the theme:&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-large is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11961&quot; height=&quot;644&quot; src=&quot;https://jonathancarter.org/files/images/certop-1024x644.jpeg&quot; style=&quot;width: 1024px; height: auto;&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p class=&quot;has-text-align-center&quot;&gt;&lt;em&gt;Plymouth (start-up/shutdown) theme.&lt;/em&gt;&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11963&quot; height=&quot;631&quot; src=&quot;https://jonathancarter.org/files/images/trixie.jpeg&quot; width=&quot;600&quot; /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p class=&quot;has-text-align-center&quot;&gt;&lt;a href=&quot;https://disney.fandom.com/wiki/Trixie&quot;&gt;Trixie, the character from Toy Story&lt;/a&gt; that was chosen as the codename for Debian 13.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Debian Local Team ISO testing&lt;/h2&gt;



&lt;p&gt;Yesterday we got some locals together for ISO testing and we got a cake with the wallpaper printed on it, along with our local team logo which has been a work in progress for the last 3 years, so hopefully we’ll finalise it this year!  (it will be ready when it’s ready). It came out a lot bluer than the original wallpaper, but still tasted great.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-large&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11949&quot; height=&quot;771&quot; src=&quot;https://jonathancarter.org/files/images/cake-13-1024x771.jpg&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;For many releases, I’ve been the only person from South Africa doing ISO smoke-testing, and this time was quite different, since everyone else in the photo below tested an image except for me. I basically just provided some support and helped out with getting salsa/wiki accounts and some troubleshooting. It went nice and fast, and it’s always a big relief when there are no showstoppers for the release.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-large&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11951&quot; height=&quot;590&quot; src=&quot;https://jonathancarter.org/files/images/trixiecake2-1024x590.jpg&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p class=&quot;has-text-align-center&quot;&gt;&lt;em&gt;My dog was really wishing hard that the cake would slip off.&lt;/em&gt;&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11970&quot; height=&quot;221&quot; src=&quot;https://jonathancarter.org/files/images/cambalache.jpg&quot; width=&quot;600&quot; /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;Packaging-wise, I only have one big new package for Trixie, and that’s &lt;a href=&quot;https://github.com/xjuan/cambalache/tree/main&quot;&gt;Cambalache&lt;/a&gt;, a rapid application design UI builder for GTK3/GTK4.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11972&quot; height=&quot;423&quot; src=&quot;https://jonathancarter.org/files/images/image-29.png&quot; style=&quot;width: 616px; height: auto;&quot; width=&quot;752&quot; /&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;The version in trixie is 0.94.1-3 and version 1.0 was recently released, so I’ll get that updated in forky and backport it if possible.&lt;/p&gt;



&lt;p&gt;I was originally considering using Cambalache for an installer UI, but ended up going with a web front-end instead. But that’s moving firmly towards forky territory, so more on that another time!&lt;/p&gt;



&lt;p&gt;Thanks to everyone who was involved in this release, so far upgrades have been very smooth!&lt;/p&gt;
&lt;img alt=&quot;&quot; height=&quot;0&quot; src=&quot;https://analytics.jonathancarter.org/piwik.php?idsite=1&amp;amp;rec=1&amp;amp;url=https%3A%2F%2Fjonathancarter.org%2F2025%2F08%2F10%2Fdebian-13%2F&amp;amp;action_name=Debian+13&amp;amp;urlref=https%3A%2F%2Fjonathancarter.org%2Ffeed%2F&quot; style=&quot;border: 0; width: 0; height: 0;&quot; width=&quot;0&quot; /&gt;</description>
	<pubDate>Sun, 10 Aug 2025 14:53:36 +0000</pubDate>
</item>
<item>
	<title>Thomas Bechtold: Streamline Root Filesystem Modifications with chimg</title>
	<guid isPermaLink="false">http://toabctl.wordpress.com/?p=151</guid>
	<link>https://toabctl.wordpress.com/2025/07/31/streamline-root-filesystem-modifications-with-chimg/</link>
	<description>&lt;p&gt;During the last year I developed as a side project a new tool called &lt;a href=&quot;https://github.com/canonical/chimg/&quot;&gt;chimg&lt;/a&gt; . That tool is useful to modify a given rootfs chroot directory in a declarative way. It can replace a kernel within a chroot, preseed snaps, install debian packages, add PPAs and more (documentation is in git but not yet published).&lt;/p&gt;



&lt;p&gt;The nice thing about this is, that this tool can be integrated into &lt;a href=&quot;https://launchpad.net/livecd-rootfs&quot;&gt;livecd-rootfs&lt;/a&gt; (the tool that is usually used to build Ubuntu images) or future tools which might use the craft framework to build images. &lt;code&gt;chimg&lt;/code&gt; automatically detects already bind-mounted filesystems (eg. &lt;code&gt;/sys&lt;/code&gt;, &lt;code&gt;/proc&lt;/code&gt;, …), detects already preseeded snaps and usually does that same thing that &lt;code&gt;livecd-rootfs&lt;/code&gt; currently does when eg. replacing an already installed kernel.&lt;/p&gt;



&lt;p&gt;Install &lt;code&gt;chimg&lt;/code&gt; with:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: plain; title: ; notranslate&quot;&gt;sudo snap install chimg --classic
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;An example configuration (eg. &lt;code&gt;config.yaml&lt;/code&gt;) to modify a rootfs chroot directory looks like this:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: yaml; title: ; notranslate&quot;&gt;---
kernel: linux-aws
debs:
  - name: shim-signed
  - name: grub-pc
  - name: grub2-common
  - name: ubuntu-cloud-minimal
snap:
  assertion_brand: canonical
  assertion_model: aws-classic
  snaps:
    - name: hello
      channel: latest/stable
files:
  -
    destination: /etc/default/grub.d/70-mysettings.cfg
    content: |+
      GRUB_TIMEOUT=0

cmds_post:
  -
    cmd: |
      echo &quot;Everything done&quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This config (stored in &lt;code&gt;config.yaml&lt;/code&gt; in this example) can be applied to a newly created (or existing) root filesystem directory. Let’s create one in &lt;code&gt;/tmp/chimg-noble&lt;/code&gt;:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: bash; title: ; notranslate&quot;&gt;sudo mmdebstrap --variant=apt --verbose noble /tmp/chimg-noble
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Let’s apply the config changes now:&lt;/p&gt;


&lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: bash; title: ; notranslate&quot;&gt;sudo chimg --log-console chrootfs config.yaml /tmp/chimg-noble
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;That’s it. The modifications are now applied to the &lt;code&gt;/tmp/chimg-noble&lt;/code&gt; directory.&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 31 Jul 2025 18:15:36 +0000</pubDate>
</item>
<item>
	<title>Oliver Grawert: Rooming with Mark</title>
	<guid isPermaLink="false">http://ograblog.wordpress.com/?p=389</guid>
	<link>https://ograblog.wordpress.com/2025/05/16/rooming-with-mark/</link>
	<description>&lt;p class=&quot;has-black-color has-text-color has-link-color wp-elements-46088db9ef993c5ecc5629835e2d0dbd&quot;&gt;Yesterday, exactly twenty years ago my mobile rang while I was walking the dog. &lt;br /&gt;&lt;br /&gt;I had just returned from Sydney about a week ago (still battling with the last remains of my Jet-lag (I had never left Europe before!)) where I had attended the UbuntuDownUnder summit and had a 30min interview on the last day (that was literally rather like having a coffee with friends after lunch) with Mark Shuttleworth and Matt Zimmerman (back then Canonicals CTO) on a nice hotel terrace directly under a tree with a colony of flying foxes sleeping above our heads.&lt;br /&gt;&lt;br /&gt;There was Jane Silber (CEO) on the phone, telling me: “I’m so happy to tell you you are hired! In your new role we want you to create an educational flavor of Ubuntu, there will be a debian-edu/skolelinux gathering in Bergen in Norway from the 10th to 12th of June, are you okay flying there with Mark?”&lt;br /&gt;&lt;br /&gt;I rushed back home and told my girlfriend: “I’m hired, and I’ll fly Canonical One on my first business trip next month!” (Canonical One was the name of Marks plane). I learned the next weeks that Canonical had indeed booked a generic scheduled flight for me and we’d only meet at the venue &lt;img alt=&quot;🙂&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;The flight was a disaster, after we were boarding that small 20-seater 2 prop plane that was supposed to get us from Cologne to Amsterdam and the pilot started the engine my window all of a sudden was soaked in oil. We had to stay in the plane out on the filed while the mechanics were fixing the engine for like 2-3h so indeed I missed the connection in Amsterdam and had to stay for the night instead of arriving in Bergen the evening before the event started.&lt;br /&gt;&lt;br /&gt;When I arrived at the venue everyone was already busy hacking on stuff and I jumped right in alongside, finally meeting some users of LTSP (Linux Terminal Server Project) which I was upstream for at that time and working with them on the problems they faced in debian with it, tinkering with moodle as a teaching support system and looking at other edu software, meanwhile Mark was sitting on a bar-stool in a corner with his laptop hacking on launchpad code.&lt;br /&gt;&lt;br /&gt;When we went to our hotel in the evening it turned out they did not have our booking at all and were completely overbooked due to a jewelry exhibition they had in the house for that week. I talked like 15min to the lady behind the counter, showed her my booking confirmation PDF on the laptop, begged and flirted a lot and eventually she told us “We do have an exhibition room that we keep as spare, it only has one bed but you can have it and we will add a folding bed”. The room was actually a normal hotel room but completely set up with wallpaper tables all around the walls. &lt;br /&gt;&lt;br /&gt;Mark insisted to take the folding bed and I can tell you, he does not snore … (well, he didn’t back then)&lt;br /&gt;&lt;br /&gt;This was only the first of a plethora of adventures that followed in the upcoming 20 years, that phone call clearly changed my life and the company gave me the opportunity to work with the brightest, sharpest and most intelligent people on the planet in and outside of Canonical.&lt;br /&gt;&lt;br /&gt;It surely changed a lot over these years (when I started we were building the distro with 18 people in the distro team and did that for quite a few years before it actually got split into server, foundations, kernel and desktop teams) but it never lost its special spirit of having these exceptional people with such a high focus on bringing opensource to everyone and making it accessible to everyone. &lt;br /&gt;Indeed, with growth comes the requirement to make more money to pay the people, the responsibility to give your employees a certain amount of security and persistence grows, but Canonical and especially Mark have always managed to keep the balance to not lose that focus and do the right thing in the end.&lt;br /&gt;&lt;br /&gt;Ten years ago I said “onward to the next ten!!”, I won’t really say “onward to the next 20!” today, not because I ever plan to resign but simply because I doubt I still want to work full time when I’m 75 &lt;img alt=&quot;😉&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f609.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Thank you Mark for dragging me into this adventure and thank you for still having me! I still love the ride!!&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 29 Jul 2025 13:26:03 +0000</pubDate>
</item>
<item>
	<title>Dimitri John Ledkov: Achieving actually full disk encryption of UEFI ESP at rest with TCG OPAL, FIPS, LUKS</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-347582618045055410.post-5137629174584752121</guid>
	<link>http://blog.surgut.co.uk/2025/07/achieving-actually-full-disk-encryption.html</link>
	<description>&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifDQL9Ducebgoi5rQaoK8ZXCp1ud1YHOguORDpgsmeD5E1PNT9Ptcdps3hLehMw6RHpXeovif1fgMpYF8lAucFgYmUZYgvdl68669qcjgUkN4hcpTRBzSK1HilijZgPjSxpCySZQtvtmkh7EjKMjMB27qIpJvXXmlFfobGPp7bIjoluItyPF6cJ7fnL1A/s1280/pexels-markus-winkler-1430818-3828944.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;853&quot; data-original-width=&quot;1280&quot; height=&quot;427&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifDQL9Ducebgoi5rQaoK8ZXCp1ud1YHOguORDpgsmeD5E1PNT9Ptcdps3hLehMw6RHpXeovif1fgMpYF8lAucFgYmUZYgvdl68669qcjgUkN4hcpTRBzSK1HilijZgPjSxpCySZQtvtmkh7EjKMjMB27qIpJvXXmlFfobGPp7bIjoluItyPF6cJ7fnL1A/w640-h427/pexels-markus-winkler-1430818-3828944.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Achieving full disk encryption using FIPS, TCG OPAL and LUKS to encrypt UEFI ESP on bare-metal and in VMs&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Many security standards such as CIS and STIG require to protect information at rest. For example, &lt;a href=&quot;https://doi.org/10.6028/NIST.SP.800-53r5&quot;&gt;NIST SP 800-53r5&lt;/a&gt; SC-28 advocate to use cryptographic protection, offline storage and TPMs to enhance protection of information confidentiality and/or integrity.&lt;/p&gt;&lt;p&gt;Traditionally to satisfy such controls on portable devices such as laptops one would utilize software based Full Disk Encryption - &lt;a href=&quot;https://support.apple.com/en-gb/guide/mac-help/mh11785/mac&quot;&gt;Mac OS X FileVault&lt;/a&gt;, &lt;a href=&quot;https://support.microsoft.com/en-us/windows/bitlocker-drive-encryption-76b92ac9-1040-48d6-9f5f-d14b3c5fa178&quot;&gt;Windows Bitlocker&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/cryptsetup/cryptsetup&quot;&gt;Linux cryptsetup LUKS2&lt;/a&gt;. In cases when FIPS cryptography is required, additional burden would be placed onto these systems to operate their kernels in FIPS mode.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://trustedcomputinggroup.org/&quot;&gt;Trusted Computing Group&lt;/a&gt; works on establishing many industry standards and specifications, which are widely adopted to improve safety and security of computing whilst keeping it easy to use. One of their most famous specifications them is TCG &lt;span face=&quot;Roboto-Medium&quot; style=&quot;background-color: white;&quot;&gt;TPM 2.0 (Trusted Platform Module). TPMs are now widely available on most devices and help to protect secret keys and attest systems. For example, most software full disk encryption solutions can utilise TCG TPM to store full disk encryption keys providing passwordless, biometric or pin-base ways to unlock the drives as well as attesting that system have not been modified or compromised whilst offline.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://trustedcomputinggroup.org/resource/storage-work-group-storage-security-subsystem-class-opal/&quot;&gt;TCG Storage Security Subsystem Class: Opal Specification&lt;/a&gt; is a set of specifications for features of data storage devices. The authors and contributors to OPAL are leading and well trusted storage manufacturers such as Samsung, Western Digital, Seagate Technologies, Dell, Google, Lenovo, IBM, Kioxia, among others. One of the features that Opal Specification enables is self-encrypting drives which becomes very powerful when combined with pre-boot authentication. Out of the box, such drives always and transparently encrypt all disk data using hardware acceleration. To protect data one can enter UEFI firmware setup (BIOS) to set NVMe single user password (or user + administrator/recovery passwords) to encrypt the disk encryption key. If one's firmware didn't come with such features, one can also use &lt;a href=&quot;https://sedutil.com/&quot;&gt;SEDutil&lt;/a&gt; to inspect and configure all of this. Latest release of major Linux distributions have SEDutil already packaged.&lt;/p&gt;&lt;p&gt;Once password is set, on startup, pre-boot authentication will request one to enter password - prior to booting any operating systems. It means that full disk is actually encrypted, including the UEFI ESP and all operating systems that are installed in case of dual or multi-boot installations. This also prevents tampering with ESP, UEFI bootloaders and kernels which with traditional software-based encryption often remain unencrypted and accessible. It also means one doesn't have to do special OS level repartitioning, or installation steps to ensure all data is encrypted at rest.&lt;/p&gt;&lt;p&gt;What about FIPS compliance? Well, the good news is that majority of the OPAL compliant hard drives and/or security sub-chips do have FIPS 140-3 certification. Meaning they have been tested by independent laboratories to ensure they do in-fact encrypt data. On the &lt;a href=&quot;https://csrc.nist.gov/Projects/cryptographic-module-validation-program/validated-modules/search&quot;&gt;CMVP&lt;/a&gt; website one can search for module name terms &quot;OPAL&quot; or &quot;NVMe&quot; or name of hardware vendor to locate FIPS certificates.&lt;/p&gt;&lt;p&gt;Are such drives widely available? Yes. For example, a common Thinkpad X1 gen 11 has OPAL NVMe drives as standard, and they have FIPS certification too. Thus, it is likely in your hardware fleet these are already widely available. Use sedutil to check if MediaEncrypt and LockingSupported features are available.&lt;/p&gt;&lt;p&gt;Well, this is great for laptops and physical servers, but you may ask - what about public or private cloud? Actually, more or less the same is already in-place in both. On CVMP website all major clouds have their disk encryption hardware certified, and all of them always encrypt all Virtual Machines with FIPS certified cryptography without an ability to opt-out. One is however in full control of how the encryption keys are managed: cloud-provider or self-managed (either with a cloud HSM or KMS or bring your own / external). See these relevant encryption options and key management docs for &lt;a href=&quot;https://cloud.google.com/docs/security/encryption/default-encryption?hl=en&quot;&gt;GCP&lt;/a&gt;, &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/virtual-machines/disk-encryption-overview&quot;&gt;Azure&lt;/a&gt;, &lt;a href=&quot;https://maturitymodel.security.aws.dev/en/2.-foundational/kms/&quot;&gt;AWS&lt;/a&gt;. But the key takeaway without doing anything, at rest, VMs in public cloud are always encrypted and satisfy NIST SP 800-53 controls.&lt;/p&gt;&lt;p&gt;What about private cloud? Most Linux based private clouds ultimately use &lt;a href=&quot;https://www.qemu.org/&quot;&gt;qemu&lt;/a&gt; typically with qcow2 virtual disk images. Qemu supports user-space encryption of qcow2 disk, see this &lt;a href=&quot;https://www.qemu.org/docs/master/tools/qemu-img.html&quot;&gt;manpage&lt;/a&gt;. Such encryption encrypts the full virtual machine disk, including the bootloader and ESP. And it is handled entirely outside of the VM on the host - meaning the VM never has access to the disk encryption keys. Qemu implements this encryption entirely in userspace using gnutls, nettle, libgcrypt depending on how it was compiled. This also means one can satisfy FIPS requirements entirely in userspace without a Linux kernel in FIPS mode. Higher level APIs built on top of qemu also support qcow2 disk encryption, as in projects such as &lt;a href=&quot;https://libvirt.org/formatstorageencryption.html&quot;&gt;libvirt&lt;/a&gt; and &lt;a href=&quot;https://docs.openstack.org/cinder/latest/configuration/block-storage/volume-encryption.html&quot;&gt;OpenStack Cinder&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you carefully read the docs, you may notice that agent support is explicitly sometimes called out as not supported or not mentioned. Quite often agents running inside the OS may not have enough observability to them to assess if there is external encryption. It does mean that monitoring above encryption options require different approaches - for example monitor your cloud configuration using tools such as Wiz and &lt;a href=&quot;https://orca.security/&quot;&gt;Orca&lt;/a&gt;, rather than using agents inside individual VMs. For laptop / endpoint security agents, I do wish they would start gaining capability to report OPAL SED availability and status if it is active or not.&lt;/p&gt;&lt;p&gt;What about using software encryption none-the-less on top of the above solutions? It is commonly referred to double or multiple encryption. There will be an additional performance impact, but it can be worthwhile. It really depends on what you define as data at rest for yourself and which controls you need. If one has a dual-boot laptop, and wants to keep one OS encrypted whilst booted into the other, it can perfectly reasonable to encrypted the two using separate software encryption keys. In addition to the OPAL encryption of the ESP. For more targeted per-file / per-folder encryption, one can look into using &lt;a href=&quot;https://nuetzlich.net/gocryptfs/&quot;&gt;gocryptfs&lt;/a&gt; which is the best successor to the once popular, but now deprecated &lt;a href=&quot;https://www.ecryptfs.org/&quot;&gt;eCryptfs&lt;/a&gt; (amazing tool, but has fallen behind in development and can lead to data loss).&lt;/p&gt;&lt;p&gt;All of the above mostly talks about cryptographic encryption, which only provides confidentially but not data integrity. To protect integrity, one needs to choose how to maintain that. &lt;a href=&quot;https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/verity.html&quot;&gt;dm-verity&lt;/a&gt; is a good choice for read-only and rigid installations. For read-write workloads, it may be easier to deploy &lt;a href=&quot;https://zfsonlinux.org/&quot;&gt;ZFS&lt;/a&gt; or &lt;a href=&quot;https://btrfs.readthedocs.io/en/latest/index.html&quot;&gt;Btrfs&lt;/a&gt; instead. If one is using filesystems without a built-in integrity support such as XFS or Ext4, one can retrofit integrity layer to them by using &lt;a href=&quot;https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/dm-integrity.html&quot;&gt;dm-integrity&lt;/a&gt; (either standalone, or via dm-luks/cryptsetup --integrity option).&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;If one has a lot of estate and a lot of encryption keys to keep track off a key management solution is likely needed. The most popular solution is likely the one from Thales Group marketed under &lt;a href=&quot;https://cpl.thalesgroup.com/encryption/data-security-platform&quot;&gt;ChiperTrust Data Security Platform&lt;/a&gt; (previously Vormetric), but there are many others including OEM / Vendor / Hardware / Cloud specific or agnostic solutions.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;I hope this crash course guide piques your interest to learn and discover modern confidentially and integrity solutions, and to re-affirm or change your existing controls w.r.t. to data protection at rest. &lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Full disk encryption, including UEFI ESP /boot/efi is now widely achievable by default on both baremetal machines and in VMs including with FIPS certification. To discuss more let's connect on &lt;a href=&quot;https://www.linkedin.com/in/dimitri-john-ledkov/&quot;&gt;Linkedin&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Mon, 28 Jul 2025 11:13:30 +0000</pubDate>
	<author>noreply@blogger.com (Dimitri John Ledkov)</author>
</item>
<item>
	<title>Jonathan Carter: DebConf25</title>
	<guid isPermaLink="false">https://jonathancarter.org/?p=11929</guid>
	<link>https://jonathancarter.org/2025/07/19/debconf25/</link>
	<description>&lt;p&gt;The last two weeks I attended &lt;a href=&quot;https://debconf25.debconf.org/&quot;&gt;DebConf and DebCamp&lt;/a&gt; in Brest, France.&lt;/p&gt;



&lt;p&gt;Usually, I like to do a more detailed write-up of DebConf, but I was already quite burnt out when I got here, so I’ll circle back to a few things that were important to me in later posts.&lt;/p&gt;



&lt;p&gt;In the meantime, thanks to everyone who made this DebConf possible, whether you volunteered for one task or were part of the organisation team. Also a special thanks to the &lt;a href=&quot;https://debconf25.debconf.org/sponsors/&quot;&gt;wonderful sponsors&lt;/a&gt; who made this entire event possible!&lt;/p&gt;



&lt;p&gt;See you next year in Argentina!&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img alt=&quot;Jellyfish taken during daytrip at aquarium.&quot; class=&quot;wp-image-11936&quot; height=&quot;577&quot; src=&quot;https://jonathancarter.org/files/images/jellyfish-1024x577.jpeg&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;



&lt;p class=&quot;has-text-align-center&quot;&gt;&lt;em&gt;Jellyfish, taken during daytrip at aquarium.&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;
&lt;img alt=&quot;&quot; height=&quot;0&quot; src=&quot;https://analytics.jonathancarter.org/piwik.php?idsite=1&amp;amp;rec=1&amp;amp;url=https%3A%2F%2Fjonathancarter.org%2F2025%2F07%2F19%2Fdebconf25%2F&amp;amp;action_name=DebConf25&amp;amp;urlref=https%3A%2F%2Fjonathancarter.org%2Ffeed%2F&quot; style=&quot;border: 0; width: 0; height: 0;&quot; width=&quot;0&quot; /&gt;</description>
	<pubDate>Sat, 19 Jul 2025 17:12:49 +0000</pubDate>
</item>

</channel>
</rss>
