

{"id":3753,"date":"2026-07-22T21:23:28","date_gmt":"2026-07-22T19:23:28","guid":{"rendered":"https:\/\/fabsk.eu\/blog\/?p=3753"},"modified":"2026-07-22T21:23:29","modified_gmt":"2026-07-22T19:23:29","slug":"odroid-m1-upgrade-from-ubuntu-24-04-to-26-04","status":"publish","type":"post","link":"https:\/\/fabsk.eu\/blog\/2026\/07\/22\/odroid-m1-upgrade-from-ubuntu-24-04-to-26-04\/","title":{"rendered":"odroid M1: upgrade from Ubuntu 24.04 to 26.04"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">On my <a href=\"https:\/\/fabsk.eu\/blog\/2022\/10\/02\/odroid-m1-premieres-impressions\/\" data-type=\"post\" data-id=\"2604\">odroid M1<\/a>, my Ubuntu install was 2 years old and I felt that the versions of various software started to get outdated. Time for an upgrade!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Damn! No direct update with \u00ab\u00a0dist-upgrade\u00a0\u00bb or \u00ab\u00a0do-release-upgrade\u00a0\u00bb. So the plan was 1) backup 2) change the apt version reference from \u00ab\u00a0<em>noble<\/em>\u00a0\u00bb to \u00ab\u00a0<em>resolute<\/em>\u00a0\u00bb 3) \u00ab\u00a0<em>apt-update<\/em>\u00a0\u00bb \u00ab\u00a0<em>apt-upgrade<\/em>\u00a0\u00bb 4) finger cross 5) fix things<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">1) Backup: new partition where to backup the existing partitions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Goal:<\/strong> if something goes wrong, I want to be able to restore everything immediately, not reinstalling and restoring files here and there. So an disk image back seems a good choice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I had about 30GB to backup, located on an attached m.2 drive. So copying by network (i.e. ssh) would take ages. So my plan was to create a new dedicated partition.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Usually, my odroid sits near my router (without keyboard nor screen). I plugged it to my desktop monitor with a long RJ45 cable and attached an USB keyboard. Note that I could not find quickly how to use a French azerty keyboard layout.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I booted, and in the Petitboot menu selected \u00ab\u00a0exit to shell\u00a0\u00bb and executed \u00ab\u00a0<em>udhcpc<\/em>\u00ab\u00a0, which will autoconfigure the network. Then \u00ab\u00a0<em>exit<\/em>\u00a0\u00bb to go back to the menu.<\/li>\n\n\n\n<li>I selected \u00ab\u00a0<em>Rescuezilla<\/em>\u00a0\u00bb to do a network book on this small distro. This way, the root partition is not mounted and I will be able to resize it. Maybe there was a better choice with a GUI repartition tool\u2026<\/li>\n\n\n\n<li>There, in the terminal, \u00ab\u00a0sudo su -\u00ab\u00a0, and entered \u00ab\u00a0<em>odroid<\/em>\u00a0\u00bb as password.<\/li>\n\n\n\n<li>I executed \u00ab\u00a0<em>resize2fs \/dev\/nvme0n1p2 50G<\/em>\u00a0\u00bb (to be above the current disk usage, while still keeping some free space for the upgrade).<\/li>\n\n\n\n<li>Then I resized this partition with \u00ab\u00a0parted\u00a0\u00bb to 70G. From memory: \u00ab\u00a0parted\u00a0\u00bb, \u00ab\u00a0<em>resizepart<\/em>\u00ab\u00a0, \u00ab\u00a0<em>2<\/em>\u00ab\u00a0, \u00ab\u00a0<em>70GB<\/em>\u00ab\u00a0.<\/li>\n\n\n\n<li>Then I created a new partition. From memory:\n<ul class=\"wp-block-list\">\n<li>\u00ab\u00a0<em>parted<\/em>\u00ab\u00a0<\/li>\n\n\n\n<li>\u00ab\u00a0<em>unit s<\/em>\u00a0\u00bb (to use the number of sectors for partitions boundaries)<\/li>\n\n\n\n<li>\u00ab\u00a0<em>print free<\/em>\u00a0\u00bb to see the next free space for the new partition.<\/li>\n\n\n\n<li>Then, I calculated the start position of my new partition so it is optimally aligned. In my case, the free space started at \u00ab\u00a0<em>136718751<\/em>\u00a0\u00bb (in sectors units). To calculate, with python: \u00ab\u00a0import math\u00a0\u00bb, then \u00ab\u00a0<em>(math.floor(136718751\/2048)+1)*2048<\/em>\u00a0\u00bb which gave me \u00ab\u00a0<em>136720384<\/em>\u00ab\u00a0.<\/li>\n\n\n\n<li>Then I could create the new partition. From memory: \u00ab\u00a0parted\u00a0\u00bb, \u00ab\u00a0<em>mkpart primary ext4 136720384 100%<\/em>\u00ab\u00a0<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Then I could backup the partitions, with something like:\n<ul class=\"wp-block-list\">\n<li>mkdir \/tmp\/aaa<\/li>\n\n\n\n<li>mount \/<em>dev\/nvme0n1p3 \/tmp\/aaa<\/em><\/li>\n\n\n\n<li>cat dev\/nvme0n1p1 \/tmp\/aaa\/1.img<\/li>\n\n\n\n<li>cat dev\/nvme0n1p2 \/tmp\/aaa\/2.img<\/li>\n\n\n\n<li>umount \/tmp\/aaa<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2) Upgrade<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I rebooted to the installed Ubuntu<\/li>\n\n\n\n<li>I logged in as root (with ssh from my desktop, because it&rsquo;s more convenient with a French keyboard layout).<\/li>\n\n\n\n<li>I made a backup copy of \u00ab\u00a0<em>\/etc\/apt\/sources.list.d\/ubuntu.sources<\/em>\u00ab\u00a0<\/li>\n\n\n\n<li>And in \u00ab\u00a0<em>\/etc\/apt\/sources.list.d\/ubuntu.sources<\/em>\u00ab\u00a0, I replaced all the \u00ab\u00a0<em>noble<\/em>\u00a0\u00bb occurrences (the current version for 24.04) by \u00ab\u00a0<em>resolute<\/em>\u00a0\u00bb (26.04).<\/li>\n\n\n\n<li>Then \u00ab\u00a0<em>apt update<\/em>\u00ab\u00a0, \u00ab\u00a0<em>apt upgrade<\/em>\u00ab\u00a0.<\/li>\n\n\n\n<li>I was prompted if I wanted to upgrade the Postgresql data (yes).<\/li>\n\n\n\n<li>At some point, I got an error and what suggested to run \u00ab\u00a0<em>apt &#8211;fix-broken install<\/em>\u00ab\u00a0, which I did.<\/li>\n\n\n\n<li>\u00ab\u00a0<em>apt upgrade<\/em>\u00a0\u00bb again. I was proposed to upgrade Postgresql dlata again (yes).<\/li>\n\n\n\n<li>I was informed that some programs such as ssh may have to be restarted because of the libc.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Fix things (Wireguard)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Things seemed to work (Nextcloud, ssh, Transmission).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Excepted my Wireguard VPN server. My phone could still connect and get and IP, but I could only ping the odroid IP (no access to Internet). The cause? My system settings for the IP forwarding was not taken in account any more. They were previously located in \u00ab\u00a0<em>\/etc\/sysctl.conf<\/em>\u00ab\u00a0. But this file was renamed to \u00ab\u00a0<em>\/etc\/sysctl.conf.dpkg-bak<\/em>\u00ab\u00a0. I had to put these settings in a new file I called \u00ab\u00a0<em>\/etc\/sysctl.d\/50-wireguard.conf<\/em>\u00a0\u00bb and apply them with \u00ab\u00a0<em>sysctl -p \/etc\/sysctl.d\/50-wireguard.conf<\/em>\u00a0\u00bb for immediate testing. With that, my VPN client could access the public Internet again, and it also worked after a reboot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Little disappointment: still the same kernel version (<em>5.18.0-odroid-arm64<\/em>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&rsquo;s all!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>On my odroid M1, my Ubuntu install was 2 years old and I felt that the versions of various software started to get outdated. Time for an upgrade! Damn! No direct update with \u00ab\u00a0dist-upgrade\u00a0\u00bb or \u00ab\u00a0do-release-upgrade\u00a0\u00bb. So the plan was 1) backup 2) change the apt version reference from \u00ab\u00a0noble\u00a0\u00bb to \u00ab\u00a0resolute\u00a0\u00bb 3) \u00ab\u00a0apt-update\u00a0\u00bb \u00ab\u00a0apt-upgrade\u00a0\u00bb [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,19,52],"tags":[],"class_list":["post-3753","post","type-post","status-publish","format-standard","hentry","category-informatique","category-linux","category-odroid","\"lang=\"en"],"_links":{"self":[{"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/posts\/3753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/comments?post=3753"}],"version-history":[{"count":5,"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/posts\/3753\/revisions"}],"predecessor-version":[{"id":3758,"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/posts\/3753\/revisions\/3758"}],"wp:attachment":[{"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/media?parent=3753"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/categories?post=3753"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/tags?post=3753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}