

{"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-25T15:35:16","modified_gmt":"2026-07-25T13:35:16","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<h2 class=\"wp-block-heading\">Upgrade the kernel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With this way, it still ran my previous ancient kernel: <em>5.18.0-odroid-arm64<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Before the upgrade, I already had \u00ab\u00a0<em>\/etc\/apt\/sources.list.d\/ppa_linuxfactory_or_kr.sources<\/em>\u00ab\u00a0, whic\u0125 I enabled and set to \u00ab\u00a0<em>resolute<\/em>\u00ab\u00a0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Enabled: yes\nTypes: deb\nURIs: http:\/\/ppa.linuxfactory.or.kr\nSuites: resolute\nComponents: main rk3568 rockchip<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"> I ran with <em>sudo<\/em> \u00ab\u00a0<em>apt update<\/em>\u00a0\u00bb and \u00ab\u00a0<em>apt install linux-image-odroidm1<\/em>\u00ab\u00a0. After a reboot, I had the version \u00ab\u00a0<em>6.1.0-rockchip-odroid-arm64<\/em>\u00a0\u00bb running.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To downgrade so Petitboot starts the previous kernel: \u00ab\u00a0<em>sudo flash-kernel &#8211;force 5.18.0-odroid-arm64<\/em>\u00ab\u00a0. To select again the most recent kernel, just \u00ab\u00a0<em>sudo flash-kernel<\/em>\u00ab\u00a0.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fix the always-changing MAC address and IPs for kernel 6.1<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After the kernel upgrade, it turned out that the OS generated a new MAC address for each reboot. With two consequences:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>My ISP router thought each time that the odroid was a new machine, so its DHCP assigned it a new IPv4.<\/li>\n\n\n\n<li>The OS generated a new IPv6.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In the journalctl I could see the following lines:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>juil. 25 13:26:36 odroid kernel: rk_gmac-dwmac fe2a0000.ethernet: rk_get_eth_addr: rk_vendor_read eth mac address failed (-1)\njuil. 25 13:26:36 odroid kernel: rk_gmac-dwmac fe2a0000.ethernet: rk_get_eth_addr: generate random eth mac address: 2a:65:63:b9:17:64\njuil. 25 13:26:36 odroid kernel: rk_gmac-dwmac fe2a0000.ethernet: rk_get_eth_addr: rk_vendor_write eth mac address failed (-1)\njuil. 25 13:26:36 odroid kernel: rk_gmac-dwmac fe2a0000.ethernet: rk_get_eth_addr: id: 0 rk_vendor_read eth mac address failed (-1)\njuil. 25 13:26:36 odroid kernel: rk_gmac-dwmac fe2a0000.ethernet: rk_get_eth_addr: mac address: 2a:65:63:b9:17:64<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">I don&rsquo;t know the exact root cause, but I read that it was related to my version of Petitboot. Solution:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I plugged a keyboard and a screen.<\/li>\n\n\n\n<li>I rebooted.<\/li>\n\n\n\n<li>In the Petitboot menu, opened a shell.<\/li>\n\n\n\n<li>Ran \u00ab\u00a0<em>pb-update<\/em>\u00ab\u00a0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">After that, I got (sadly) a new MAC address, but at least it did not change across reboots, and so my router gave me a fixed LAN IPv4, and I got a fixed IPv6.<\/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":9,"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/posts\/3753\/revisions"}],"predecessor-version":[{"id":3767,"href":"https:\/\/fabsk.eu\/blog\/wp-json\/wp\/v2\/posts\/3753\/revisions\/3767"}],"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}]}}