Linux și dispozitivele SBC

În cele ce urmează se explică modul în care se poate utiliza Linux cu dispozitivele de tip SBC (Single Board Computer).

Procesul de pornire a unui Linux

O reprezentare, într-un mod simplificat, a procesului de pornire este cea din figura de mai jos:

Schemă pornire Linux

În cele ce urmează se explică pe scurt, într-un mod simplist, procesul de pornire al unui dispozitiv ce rulează sistemul de operare Linux.

BIOS/UEFI/PPL

BIOS-ul (acronim de la „Basic Input - Output System”) inițializează hardware-ul și se asigură printr-un auto-test de pornire (POST) că tot hardware-ul este pregătit. Sarcina principală a BIOS-ului este de a încărca bootloader-ul.

UEFI-ul (acronim de la Unified Extensible Firmware Interface) este varianta mai nouă ce înlocuiește BIOS-ul cu capabilități mai mari și printre altele are ca scop să încarce bootloader-ul.

Dispozitivele embedded de tipul SBC, ca și Odroid N2, în general nu au BIOS sau UEFI, acestea fiind înlocuite de microprocesor care au în memoria ROM un program primar de încărcare (PPL - Primary Program Loader), al cărui scop este să caute pe SDMMC sau pe eMMC un program secundar de încărcare (SPL - Secundary Program Loader) denumit U-Boot SPL al cărui scop este să inițializeze memoria să poată încărca bootloader-ul U-Boot.

Unele dispozitive mai au o memorie SPI în care este instalată o distribuție specială Petitboot care are inclus U-Boot distribuție ce joacă rolul unui bootloader, mult mai evoluat, cu capabilități multiple de boot.

Bootloader

Bootloader-ul încarcă nucleul (kernelul) în memorie și apoi pornește nucleul cu un set de parametri ai nucleului.

Kernel

Când nucleul (kernelul) este încărcat, inițializează imediat dispozitivele și memoria. Sarcina principală a nucleului este de a încărca procesul de inițializare (init).

INIT

Procesul init este primul proces care este pornit, init pornește și oprește procesul esențial din sistem. Acesta reprezintă de cele mai multe ori o legătură simbolică, de la serviciul principal de inițializare a sistemului, de exemplu systemd, denumită init și amplasată în directorul /usr/sbin/ sau /sbin/init.

florin@odroid-n2:~$ ps -p 1
    PID TTY          TIME CMD
      1 ?        00:00:04 systemd
florin@odroid-n2:~$ ls -la /sbin/init 
lrwxrwxrwx 1 root root 20 dec  1 15:28 /sbin/init -> /lib/systemd/systemd
florin@odroid-n2:~$ ls -la /usr/sbin/init 
lrwxrwxrwx 1 root root 20 dec  1 15:28 /usr/sbin/init -> /lib/systemd/systemd
florin@odroid-n2:~$ ls -la /sbin
lrwxrwxrwx 1 root root 8 feb  9 04:35 /sbin -> usr/sbin
florin@odroid-n2:~$ ps -ax
    PID TTY      STAT   TIME COMMAND
      1 ?        Ss     0:04 /sbin/init d:
...

Denumirea de init vine de la SysV init, denumit și System five init care a fost printre primele folosite în lumea UNIX-LINUX.
O enumerare, nu în totalitate, de astfel de servicii init este următoarea:

  • SysVinit - în acest caz /sbin/init nu va fi o legătură simbolică;
  • OpenRC - folosit de Gentoo Linux;
  • Runit - folosit de Void linux;
  • Systemd - folosit de majoritatea distribuțiilor Linux: Red Hat, Debian, Ubuntu etc.

Instalarea sistemului de operare Linux în Odroid N2

Pentru instalare s-a utilizat placa Odroid N2. Aceasta are avantajul că este prevăzută cu o memorie de tip Flash SPI. În interiorul acestei memorii se află instalată o altă mini distribuție Linux denumită Petitboot ce va realiza procesul de încărcare a distribuțiilor Linux, practic va fi BOOTLOADER-ul din procesul de pornire explicat mai sus. Prezintă avantajul că elimină necesitatea de a avea un bootloader de tip U-boot pe mediul în care dorim să instalăm Linux și de asemeni permite încărcarea mai multor kerneluri și distribuții de pe diferite medii, chiar și din rețea.

Pregătirea mediului de instalare

Deoarece placa are și porturi USB3, ce asigură o viteză de transfer este mai mare ca dispozitivele SDMMC sau eMMC, se va folosi unul dintre aceste porturi USB3 cu un adaptor de SSD NVME2 la USB3. Partiționarea utilizată este următoare:

florin@odroid-n2:~$ sudo fdisk -l /dev/sda
Disk /dev/sda: 931,51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: X900 1TB        
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 334C2C9E-6346-C54C-AB4D-521EEB3EE059

Device          Start        End   Sectors  Size Type
/dev/sda1        8192     622591    614400  300M Linux filesystem
/dev/sda2      622592  629768191 629145600  300G Linux filesystem
/dev/sda3   629768192 1049198591 419430400  200G Linux filesystem
/dev/sda4  1049198592 1468628991 419430400  200G Linux filesystem
/dev/sda5  1468628992 1888059391 419430400  200G Linux filesystem
/dev/sda6  1888059392 1904836607  16777216    8G Linux swap

în GParted partiționarea SSD-ului este prezentată sub forma:

GParted - SSD

După partiționare se realizează formatarea cu mkfs.ext4 pentru partițiile cu fișiere și cu mkswap pentru partiția swap. Pentru ușurință se poate folosi GParted.

Au fost realizate 6 partiții:

  1. /dev/sda1 - de 300MiB folosiți pentru fișierele utilizate în procesul de bootare;
  2. /dev/sda2 - de 300GiB folosiți pentru distribuția Armbian;
  3. /dev/sda3 - de 200GiB folosiți pentru distribuția Void Linux;
  4. /dev/sda4 - de 200GiB folosiți pentru distribuția CentOS Stream 10;
  5. /dev/sda4 - de 200GiB folosiți pentru distribuția EndeavourOS;
  6. /dev/sda5 - de 8GiB folosiți pentru swap.

Instalare Armbian

Pentru instalarea distribuției Armbian, s-a folosit versiunea 25.2.1, varianta Debian 12, cu Cinnamon și cu extensiile MESA/VPU și kernel 6.12.
După descărcarea fișierului cu imaginea arhivată acesta este dezarhivat:

florin@odroid-n2:~/Descărcări$ unxz Armbian_25.2.1_Odroidn2_bookworm_current_6.12.13_cinnamon-backported-mesa_desktop.img.xz 

În urma dezarhivării vom avea imaginea cu distribuția care în mod normal se scrie pe un disk eMMC sau SDMMC, dar în cazul de față se va monta în directorul /mnt/armbian/:

florin@odroid-n2:~/Descărcări$ sudo mkdir /mnt/armbian
florin@odroid-n2:~/Descărcări$ sudo fdisk -l Armbian_25.2.1_Odroidn2_bookworm_current_6.12.13_cinnamon-backported-mesa_desktop.img 
Disk Armbian_25.2.1_Odroidn2_bookworm_current_6.12.13_cinnamon-backported-mesa_desktop.img: 7,2 GiB, 7730102272 bytes, 15097856 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3b4ad264

Device                                                                                 Boot Start      End  Sectors  Size Id Type
Armbian_25.2.1_Odroidn2_bookworm_current_6.12.13_cinnamon-backported-mesa_desktop.img1       8192 15097855 15089664  7,2G 83 Linux
florin@odroid-n2:~/Descărcări$ sudo mount -o loop,offset=$((512*8192)) Armbian_25.2.1_Odroidn2_bookworm_current_6.12.13_cinnamon-backported-mesa_desktop.img /mnt/armbian/
florin@odroid-n2:~/Descărcări$ ls /mnt/armbian/
bin  boot  dev  etc  home  initrd.img  initrd.img.old  lib  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var  vmlinuz  vmlinuz.old

Se realizează un director de lucru, /mnt/work, în care se montează partiția /dev/sda2, creată pentru scopul instalarii distribuției Armbian:

florin@odroid-n2:~/Descărcări$ sudo mkdir /mnt/work

Apoi se montează partiția /dev/sda2 în /mnt/work:

florin@odroid-n2:~/Descărcări$ sudo mount /dev/sda2 /mnt/work

Se creează un director boot, în /mnt/work, unde va fi montată partiția /dev/sda1:

florin@odroid-n2:~/Descărcări$ sudo mkdir /mnt/work/boot

Montăm partiția /dev/sda1, în /mnt/work/boot:

florin@odroid-n2:~/Descărcări$ sudo mount /dev/sda1 /mnt/work/boot

După care se vor copia toate directoarele și fișierele, cu păstrarea atributelor, din /mnt/armbian, în /mnt/work:

florin@odroid-n2:~/Descărcări$ sudo cp -rp /mnt/armbian/* /mnt/work/

Deoarece pentru boot este utilizat Petitboot, va trebui să realizăm în /dev/sda1, deja montat, în /mnt/work/boot, un director grub, iar în director se va edita un fișier denumit grub.cfg, folosit de Petitboot în procesul de bootare:

florin@odroid-n2:~/Descărcări$ sudo mkdir /mnt/work/boot/grub
florin@odroid-n2:~/Descărcări$ sudo nano /mnt/work/boot/grub/grub.cfg

Fișierul citit de Petitboot cu parametrii ce vor fi preluați la boot, va fi de forma:

#/boot/grub.cfg
set UUID=3131c377-66a0-45d0-bde5-d13295d7fb41
menuentry "Armbian 25.2.1 (6.12.13-current-meson64)" {
  linux       /Image root=UUID=$UUID rootwait rootfstype=ext4 console=ttyAML0,115200 console=tty1 consoleblank=0 coherent_pool=2M
  initrd      /uInitrd
  devicetree  /dtb/amlogic/meson-g12b-odroid-n2.dtb
}

Grub.cfg de aici nu necesită instalarea bootloader-ului grub sau grub2 este numai un fișier utilizat de Petitboot care caută pe discuri fișierele boot.scr sau boot.ini aferente lui U-boot și grub.cfg din directoarele grub sau grub2, pentru a prelua parametrii de boot.

După cum se observă va trebui să cunoaștem UUID-ul partiției /dev/sda2 și de asemeni a lui /dev/sda1 folosită pentru /boot necesare a fi scrise și în fișierul /etc/fstab, care poate fi obținut cu GParted sau cu blkid:

florin@odroid-n2:~$ sudo blkid
/dev/sda1: LABEL="boot" UUID="13c60d7c-1b1c-4d58-b9fe-f9262ebc2174" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="boot" PARTUUID="1a8cf7ef-9bf5-4c56-ac00-d0b95e8b8284"
/dev/sda2: LABEL="armbian" UUID="3131c377-66a0-45d0-bde5-d13295d7fb41" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="armbian" PARTUUID="d7c80cb3-3217-41ba-a5de-b7a5e1d8f3f3"
/dev/sda3: LABEL="voidlinux" UUID="2dc3f400-b644-4998-b77c-665b630bc6f3" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="voidlinux" PARTUUID="efadaf32-c3fd-454f-b13b-98353033e661"
/dev/sda4: LABEL="centos" UUID="11bb4148-3733-422f-a2ae-0ad7c5ceb422" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="centos" PARTUUID="39bce778-f381-4807-8485-d9f72e0c5556"
/dev/sda5: LABEL="archlinux" UUID="9cbc45a5-81d5-49f3-90d8-dce710f90fd1" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="archlinux" PARTUUID="25031d65-5c7d-4e40-bf68-d7fdfb17be19"
/dev/sda6: LABEL="swap" UUID="f8d67fd5-0a7f-45b3-877c-2dcf04aec10a" TYPE="swap" PARTLABEL="swap" PARTUUID="c04500c6-2af8-4b0b-81d0-f73b7ec8c0ed"
/dev/zram1: LABEL="log2ram" UUID="2d080a5b-e763-46ad-8906-3ff9c3f5165b" BLOCK_SIZE="4096" TYPE="ext4"
/dev/loop0: LABEL="armbi_root" UUID="ba88db95-be25-4496-8028-64ba53ef82ac" BLOCK_SIZE="4096" TYPE="ext4"
/dev/zram0: UUID="a5a5ef56-c926-416e-8023-481464490b32" TYPE="swap"

Deoarece Petitboot citește mai întâi fișierul boot.scr va trebui să ștergem fișierul realizat de către Armbian, precum și boot.bmp și boot.cmd acestea nefiind utile, va trebui ca administratorul de sistem să aibă grijă și la un eventual update ale acestora ce vor fi puse la loc.
Fișierul fstab va avea un conținut de forma:

#/etc/fstab 
UUID=13c60d7c-1b1c-4d58-b9fe-f9262ebc2174   /boot   ext4    defaults,noatime,commit=120,errors=remount-ro   0 1
UUID=3131c377-66a0-45d0-bde5-d13295d7fb41   /   ext4    defaults,noatime,commit=120,errors=remount-ro   0 1
UUID=f8d67fd5-0a7f-45b3-877c-2dcf04aec10a   none    swap    defaults                    0 0
tmpfs                       /tmp    tmpfs   defaults,nosuid                 0 0

Iar structura directorului /boot va fi de forma:

florin@odroid-n2:~$ ls /boot/
config-6.12.16-current-meson64      lost+found
dtb                                 System.map-6.12.16-current-meson64
dtb-6.12.16-current-meson64         uInitrd
grub                                uInitrd-6.12.16-current-meson64
Image                               vmlinuz-6.12.16-current-meson64
initrd.img-6.12.16-current-meson64
florin@odroid-n2:~$ ls /boot/grub/
grub.cfg

În final, după bootare utilizatorul va fi întâmpinat de mesajele clasice de instalare a distribuției Armbian, pentru introducerea parolei de root, crearea unui utilizator și alegerea limbii dorite de utilizare. După logarea în sistem acesta va arata la modu acesta:

După pornire va apărea ecranul cu Petitboot ca în imaginea de mai jos:

Armbian în Odroid N2

Instalare CentOS Stream 10

Pentru ușurință se utilizează o imagine iso de încercare și instalare a distribuției CentOS Stream 10, aceasta are deja KDE și Gnome, respectiv la momentul scrierii articolului fișierul este CentOS-Stream-Image-MAX-Live.aarch64-10-202501222202.iso:

florin@odroid-n2:~/Descărcări$ ls -lah CentOS-Stream-Image-MAX-Live.aarch64-10-202501222202.iso
-rw-r--r-- 1 florin florin 2,7G mar  1 20:45 CentOS-Stream-Image-MAX-Live.aarch64-10-202501222202.iso

Pentru început se verifică dacă partiția /dev/sda4/ în care dorim să instalăm CentOS este montată (folosită):

florin@odroid-n2:~$ sudo mount | grep sda4
/dev/sda4 on /media/florin/centos type ext4 (rw,nosuid,nodev,relatime,errors=remount-ro,stripe=2,uhelper=udisks2)

După cum se observă este în uz, dar pentru a o monta în /mnt/work va trebui demontată din /media/florin/centos și montată în /mnt/work:

florin@odroid-n2:~$ mount | grep sda4
/dev/sda4 on /media/florin/centos type ext4 (rw,nosuid,nodev,relatime,errors=remount-ro,stripe=2,uhelper=udisks2)
florin@odroid-n2:~$ sudo umount /media/florin/centos 
florin@odroid-n2:~$ sudo mount /dev/sda4 /mnt/work/
florin@odroid-n2:~$ mount | grep sda4
/dev/sda4 on /mnt/work type ext4 (rw,relatime,stripe=2)

Se va scoate structura rootfs, ca și la instalarea lui Armbian, dar de acestă dată din imaginea iso:

ATENȚIE
Imaginea squasfs.img este de tip "erofs" iar Armbian și alte distribuții nu o pot monta nefiind în kernel suport pentru acesta. În CentOS Stream 10 x86_84 există suport pentru a scoate rootfs-ul din imaginea iso:

florin@florin-pc:~/Descărcări$ sudo mount -o loop CentOS-Stream-Image-MAX-Live.aarch64-10-202501222202.iso /mnt/iso/
[sudo] parola pentru florin: 
mount: /mnt/iso: WARNING: source write-protected, mounted read-only.
florin@florin-pc:~/Descărcări$ sudo losetup -Pf /mnt/iso/LiveOS/squashfs.img 
florin@florin-pc:~/Descărcări$ sudo mount /dev/loop1 /mnt/centos/
mount: /mnt/centos: WARNING: source write-protected, mounted read-only.
florin@florin-pc:~/Descărcări$ ls /mnt/centos/
afs  boot  etc   image  lib64  mnt  proc  run   srv  tmp  var
bin  dev   home  lib    media  opt  root  sbin  sys  usr
florin@florin-pc:~/Descărcări$ sudo mount /dev/sdc4 /mnt/work/
florin@florin-pc:~/Descărcări$ sudo cp -rp /mnt/centos/* /mnt/work/
florin@florin-pc:~/Descărcări$ ls /mnt/work/
afs  boot  etc   image  lib64       media  opt   root  sbin  sys  usr
bin  dev   home  lib    lost+found  mnt    proc  run   srv   tmp  var
florin@florin-pc:~/Descărcări$ sudo umount /mnt/work 
florin@florin-pc:~/Descărcări$ sudo umount /mnt/centos 
florin@florin-pc:~/Descărcări$ sudo losetup -d /dev/loop1 
florin@florin-pc:~/Descărcări$ sudo umount /mnt/iso

După ce obține rootrfs-ul se poate muta SSD-ul din PC în Odroid N2 și lucra în continuare în Armbian.

Imaginea find folosită în Live pentru încercare și instalare va trebui să realizăm un chroot în ea unde vor fi eliminate pachetele care nu sunt necesare, se va adăuga altele, se va crea utilizatorul ce va folosi distribuția CentOS Stream 10 ce conține deja KDE și Gnome preinstalat.

Deoarece se va mai lucra și în alte ocazii cu chroot este bine de a realiza un script:

#!/bin/bash
#chroot_work.sh
DIR="/mnt/work"
mount -o rbind /dev $DIR/dev
mount -t proc none $DIR/proc
mount -o bind /sys $DIR/sys
mount -o bind /tmp $DIR/tmp
cp /etc/resolv.conf $DIR/etc/
chroot $DIR /bin/bash

Se marchează ca find executabil:

florin@odroid-n2:~$ chmod +x chroot_work.sh

Se verifică dacă partiția /dev/sda4, în care am stabilit ca vom instala CentOS Stream 10, este montată, dacă este utilizată o demontăm și o montăm în directorul de lucru:

florin@odroid-n2:~$ mount | grep /dev/sda4 
florin@odroid-n2:~$ sudo mount /dev/sda4 /mnt/work/
florin@odroid-n2:~$ ls /mnt/work/
afs  boot  etc   image  lib64       media  opt   root  sbin  sys  usr
bin  dev   home  lib    lost+found  mnt    proc  run   srv   tmp  var

După care rulăm script pentru chroot:

florin@odroid-n2:~$ sudo ./chroot_work.sh 
[sudo] parola pentru florin: 
root@odroid-n2:/# 

Se observă ca s-a schimbat denumirea consolei, apoi se încărca profilul aferent CentOS, iar pentru siguranță se schimbă și denumirea consolei:

root@odroid-n2:/# source /etc/profile
root@odroid-n2:/# export PS1="(chroot) $PS1"
(chroot) root@odroid-n2:/#

Ca urmare a faptului că se va folosi kernelul din Armbian va trebui să se elimine tot ce însemnă kernel și respectiv grub deoarece acestea se află în /boot unde mai târziu va monta partiția /dev/sda1:

(chroot) root@odroid-n2:/# rpm -qa | grep kernel
kernel-modules-core-6.12.0-43.el10.aarch64
kernel-core-6.12.0-43.el10.aarch64
kernel-modules-6.12.0-43.el10.aarch64
kernel-modules-extra-6.12.0-43.el10.aarch64
kernel-tools-libs-6.12.0-43.el10.aarch64
kernel-tools-6.12.0-43.el10.aarch64
kernel-6.12.0-43.el10.aarch64
(chroot) root@odroid-n2:/# rpm -qa | grep grub
grub2-common-2.12-5.el10.noarch
grub2-tools-minimal-2.12-5.el10.aarch64
grubby-8.40-77.el10.aarch64
grub2-tools-2.12-5.el10.aarch64
grub2-tools-extra-2.12-5.el10.aarch64
grub2-efi-aa64-modules-2.12-5.el10.noarch
grub2-efi-aa64-cdboot-2.12-5.el10.aarch64
grub2-efi-aa64-2.12-5.el10.aarch64
(chroot) root@odroid-n2:/# ls /boot/
config-6.12.0-43.el10.aarch64  initramfs-6.12.0-43.el10.aarch64.img
dtb                            loader
dtb-6.12.0-43.el10.aarch64     symvers-6.12.0-43.el10.aarch64.xz
efi                            System.map-6.12.0-43.el10.aarch64
grub2                          vmlinuz-6.12.0-43.el10.aarch64
(chroot) root@odroid-n2:/#

Tot mai târziu, poate în alt articol, urmează a se va compila un kernel custom.

(chroot) root@odroid-n2:/# dnf remove kernel-modules-core kernel-core kernel-modules kernel-modules-extra kernel-tools-libs kernel-tools kernel -y 

Pentru eliminarea lui grub va trebui să se comenteze liniile (se adaugă diez # în fața liniei) din următoarele fișiere deoarece grub este protejat la eliminarea din sistem:

(chroot) root@odroid-n2:/# nano /etc/yum/protected.d/grub2-efi-aa64.conf 
(chroot) root@odroid-n2:/# nano /etc/yum/protected.d/grub2-tools-minimal.conf

După realizarea modificărilor de mai sus se poate elimina grub:

(chroot) root@odroid-n2:/# dnf remove grub2-common grub2-tools-minimal grubby grub2-tools grub2-tools-extra grub2-efi-aa64-modules grub2-efi-aa64-cdboot grub2-efi-aa64-cdboot -y

Se verifică ce a mai rămas în /boot:

(chroot) root@odroid-n2:/# ls /boot
dtb  efi  loader

Se va șterge ce a mai rămas:

(chroot) root@odroid-n2:/# rm -r /boot/*
rm: eliminați '/boot/dtb' de tipul legătură simbolică? y
rm: descindeți în directorul '/boot/efi'? y
rm: descindeți în directorul '/boot/efi/EFI'? y
rm: descindeți în directorul '/boot/efi/EFI/BOOT'? y
rm: eliminați '/boot/efi/EFI/BOOT/fbaa64.efi' de tipul fișier obișnuit? y
rm: eliminați '/boot/efi/EFI/BOOT/BOOTAA64.EFI' de tipul fișier obișnuit? y
rm: eliminați '/boot/efi/EFI/BOOT' de tipul director? y
rm: descindeți în directorul '/boot/efi/EFI/centos'? y
rm: eliminați '/boot/efi/EFI/centos/BOOTAA64.CSV' de tipul fișier obișnuit? y
rm: eliminați '/boot/efi/EFI/centos/shim.efi' de tipul fișier obișnuit? y
rm: eliminați '/boot/efi/EFI/centos/shimaa64-centos.efi' de tipul fișier obișnuit? y
rm: eliminați '/boot/efi/EFI/centos/shimaa64.efi' de tipul fișier obișnuit? y
rm: eliminați '/boot/efi/EFI/centos/mmaa64.efi' de tipul fișier obișnuit? y
rm: eliminați '/boot/efi/EFI/centos' de tipul director? y
rm: eliminați '/boot/efi/EFI' de tipul director? y
rm: eliminați '/boot/efi' de tipul director? y
rm: descindeți în directorul '/boot/loader'? y
rm: descindeți în directorul '/boot/loader/entries'? y
rm: eliminați '/boot/loader/entries/dc9647167e9240308687296b9211acb7-6.12.0-43.el10.aarch64.conf' de tipul fișier obișnuit? y
rm: eliminați '/boot/loader/entries' de tipul director? y
rm: eliminați '/boot/loader' de tipul director? y
(chroot) root@odroid-n2:/# ls /boot/
(chroot) root@odroid-n2:/#  

Urmează modificarea fișierul /etc/fstab în conformitate cu discul SSD:

(chroot) root@odroid-n2:/# nano /etc/fstab

În fstab se editează în conformitate cu hardware-ul și cu cele pregătite anterior:

#/etc/fstab
UUID=13c60d7c-1b1c-4d58-b9fe-f9262ebc2174       /boot   ext4    defaults,noatime,commit=120,errors=remount-ro   0 1
UUID=11bb4148-3733-422f-a2ae-0ad7c5ceb422       /       ext4    defaults,noatime,commit=120,errors=remount-ro   0 1
UUID=f8d67fd5-0a7f-45b3-877c-2dcf04aec10a       none    swap    defaults                                        0 0
tmpfs                                           /tmp    tmpfs   defaults,nosuid                                 0 0

Va trebui de adăugat directorul cu modulele aferente kernelului din Armbian, respectiv din directorul /usr/lib/modules/ în /mnt/work/usr/lib/modules/ :

florin@odroid-n2:~$ sudo cp -rp /usr/lib/modules/* /mnt/work/usr/lib/modules/
florin@odroid-n2:~$ sudo cp -r /usr/lib/linux-image-6.12.16-current-meson64 /mnt/work/usr/lib/

Se revine la chroot și se dezactivează, pentru moment, serviciul firewalld:

(chroot) root@odroid-n2:/# systemctl disable firewalld
Removed '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'.
Removed '/etc/systemd/system/multi-user.target.wants/firewalld.service'.

Apoi se va adăuga un utilizator pentru logare:

(chroot) root@odroid-n2:/# useradd -G wheel,dialout,video,audio -s /bin/bash -c 'Florin Tanasă' florin
(chroot) root@odroid-n2:/# ls /home/
florin

Se va stabili o parolă la utilizator:

(chroot) root@odroid-n2:/# passwd florin
Parolă nouă: 
Rescrieți parola nouă: 
passwd: parolă actualizată cu succes

Se modifică, dacă se dorește, limba sistemului:

(chroot) root@odroid-n2:/# cat /etc/locale.conf
LANG=en_US.UTF-8
(chroot) root@odroid-n2:/# nano /etc/locale.conf 
(chroot) root@odroid-n2:/# cat /etc/locale.conf 
LANG=ro_RO.UTF-8

Apoi se va adăuga o opțiune cu noua distribuție în /boot/grub/grub.cfg pentru a fi disponibilă la bootare:

florin@odroid-n2:~$ sudo nano /boot/grub/grub.cfg 

După modificare fișierul grub.cfg va arăta de forma:

set UUID1=3131c377-66a0-45d0-bde5-d13295d7fb41
set UUID2=11bb4148-3733-422f-a2ae-0ad7c5ceb422

menuentry "Armbian 25.2.1 (6.12.16-current-meson64)" {
  linux       /Image root=UUID=$UUID1 rootwait rootfstype=ext4 console=ttyAML0,115200 console=tty1 consoleblank=0 coherent_pool=2M
  initrd      /uInitrd
  devicetree  /dtb/amlogic/meson-g12b-odroid-n2.dtb
} 
menuentry "CentOS Stream 10 (6.12.16-current-meson64)" {
  linux       /Image root=UUID=$UUID2 rootwait rootfstype=ext4 console=ttyAML0,115200 console=tty1 consoleblank=0 coherent_pool=2M
  initrd      /uInitrd
  devicetree  /dtb/amlogic/meson-g12b-odroid-n2.dtb
}

După repornire utilizatorul se va putea loga în sistem folosind Desktop Managerul sddm:

Pentru a utiliza Gnome clasic:

Gonome clasic în CentOS Stream 10

Pentru a utiliza Gnome:

Gnome în CentOS Stream 10

Pentru a utiliza KDE:

KDE în CentOS Stream 10

Instalare EndeavourOS

Din categoria categoria distribuțiilor bazate pe Arch Linux se va folosi EndeavorOS care pune la dispoziție o imagine pregătită special pentru SBC Odroid N2, respectiv pune la dispoziție și un kernel compilat pentru dispozitivele Amlogic.

Descărcare fișierul imagine

Fișierul cu imaginea distribuției se descărca utilizând comanda:

florin@odroid-n2:~/Descărcări$ wget https://github.com/endeavouros-arm/images/releases/download/odroid-n2-image/enosLinuxARM-odroid-n2-latest.img.xz

Fișierul descărcat se dezarhivează:

florin@odroid-n2:~/Descărcări$ unxz enosLinuxARM-odroid-n2-latest.img.xz

Obținerea unor informații legate de imagine

În continuare se verifică dacă imaginea are mai multe partiții:

lorin@odroid-n2:~/Descărcări$ sudo fdisk -l enosLinuxARM-odroid-n2-latest.img
Disk enosLinuxARM-odroid-n2-latest.img: 8,5 GiB, 9126805504 bytes, 17825792 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3b835c24

Device                             Boot   Start      End  Sectors  Size Id Type
enosLinuxARM-odroid-n2-latest.img1         4096  1052671  1048576  512M  c W95 FAT32 (LBA)
enosLinuxARM-odroid-n2-latest.img2      1052672 16777215 15724544  7,5G 83 Linux

Din rezultat se constată că sunt două partiții și informații privind de la care sector încep partiții și câte unități are un sector:

  • 512M - utilizată pentru boot, care pornește de la sectorul 4096;
  • 7,5G - utilizată pentru rootfs, care pornește de la sectorul 1052672;
  • 1 sector are 512 unități.

Informațiile de mai sus vor fi utile la montare în vederea extragerii informațiilor.

Adăugarea unei noi partiții de boot

Deoarece imaginea distribuției are două partiți una pentru boot și una pentru rootfs este necesar de a crea o nouă partiție pentru boot. În acest scop vom putea folosi GParted din Armbian instalat anterior iar partiția de boot o vom realiza mai mare și de alt tip.
Vom realiza o partiție denumită boot_arch de 1G de tip linux formatată ext4:

GParted setare partiție boot_arch

După care se va finaliza prin apăsarea butonului Aplicarea tuturor operațiilor:

GParted finalizare operații

Se observă că s-a realizat partiția /dev/sda7 ce va fi utilizată pentru /boot iar partiția /dev/sda5, realizată de la început, va fi utilizată pentru rootfs, respectiv pentru \/.

Montarea imaginii și extragerea datelor

Pentru început se realizează directorul unde vom partițiile din interiorul imaginii în vederea extragerii datelor către partițiile din SSD:

florin@odroid-n2:~/Descărcări$ sudo mkdir /mnt/endeavouros

Montam partiția de boot din cadrul imaginii descărcate în /mnt/eandeavouros/, apoi se va monta partiția /dev/sda7/ în /mnt/work/ iar în final vom copia datele și vor fi demontate partițiile:

florin@odroid-n2:~/Descărcări$ sudo mount -o loop,offset=$((512*4096)) enosLinuxARM-odroid-n2-latest.img /mnt/endeavouros/
florin@odroid-n2:~/Descărcări$ ls /mnt/endeavouros/
boot.ini       dtbs   initramfs-linux.img   sd_fusing.sh
boot.ini.orig  Image  initramfs-linux.uimg  u-boot.bin
florin@odroid-n2:~/Descărcări$ sudo mount /dev/sda7 /mnt/work/
florin@odroid-n2:~/Descărcări$ ls /mnt/work/
lost+found
florin@odroid-n2:~/Descărcări$ sudo cp -rp /mnt/endeavouros/* /mnt/work/
florin@odroid-n2:~/Descărcări$ ls /mnt/work/
boot.ini       dtbs   initramfs-linux.img   lost+found    u-boot.bin
boot.ini.orig  Image  initramfs-linux.uimg  sd_fusing.sh
florin@odroid-n2:~/Descărcări$ sudo umount /mnt/endeavouros 
florin@odroid-n2:~/Descărcări$ sudo umount /mnt/work 

Apoi se va monta partiția de rootfs din cadrul imaginii descărcate în /mnt/endeavouros/, după aceea se va monta partiția /dev/sda5 în /mnt/work, iar în final se va copia datele și se vor demonta partițiile:

florin@odroid-n2:~/Descărcări$ sudo mount -o loop,offset=$((512*1052672)) enosLinuxARM-odroid-n2-latest.img /mnt/endeavouros/
florin@odroid-n2:~/Descărcări$ ls /mnt/endeavouros/
bin   dev  home  lost+found  opt   root  sbin  sys  usr
boot  etc  lib   mnt         proc  run   srv   tmp  var
florin@odroid-n2:~/Descărcări$ sudo mount /dev/sda5 /mnt/work/
florin@odroid-n2:~/Descărcări$ ls /mnt/work/
lost+found
florin@odroid-n2:~/Descărcări$ sudo cp -rp /mnt/endeavouros/* /mnt/work/
florin@odroid-n2:~/Descărcări$ ls /mnt/work/
bin   dev  home  lost+found  opt   root  sbin  sys  usr
boot  etc  lib   mnt         proc  run   srv   tmp  var
florin@odroid-n2:~/Descărcări$ sudo umount /mnt/endeavouros 
florin@odroid-n2:~/Descărcări$ sudo umount /mnt/work 

Utilizând comanda blkid se poate identifica valoarea UUID a partițiilor **/dev/sda5* și /dev/sda7**:

florin@odroid-n2:~/Descărcări$ sudo blkid
/dev/sda1: LABEL="boot" UUID="13c60d7c-1b1c-4d58-b9fe-f9262ebc2174" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="boot" PARTUUID="1a8cf7ef-9bf5-4c56-ac00-d0b95e8b8284"
/dev/sda2: LABEL="armbian" UUID="3131c377-66a0-45d0-bde5-d13295d7fb41" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="armbian" PARTUUID="d7c80cb3-3217-41ba-a5de-b7a5e1d8f3f3"
/dev/sda3: LABEL="voidlinux" UUID="2dc3f400-b644-4998-b77c-665b630bc6f3" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="voidlinux" PARTUUID="efadaf32-c3fd-454f-b13b-98353033e661"
/dev/sda4: LABEL="centos" UUID="11bb4148-3733-422f-a2ae-0ad7c5ceb422" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="centos" PARTUUID="39bce778-f381-4807-8485-d9f72e0c5556"
/dev/sda5: LABEL="archlinux" UUID="9cbc45a5-81d5-49f3-90d8-dce710f90fd1" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="archlinux" PARTUUID="25031d65-5c7d-4e40-bf68-d7fdfb17be19"
/dev/sda6: LABEL="swap" UUID="f8d67fd5-0a7f-45b3-877c-2dcf04aec10a" TYPE="swap" PARTLABEL="swap" PARTUUID="c04500c6-2af8-4b0b-81d0-f73b7ec8c0ed"
/dev/sda7: LABEL="boot_arch" UUID="5c430bbe-17c5-4570-af18-c9f3bef1b22c" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="boot_arch" PARTUUID="c1dbebea-3729-4ab0-9636-7de8ffe3afb8"
/dev/zram1: LABEL="log2ram" UUID="8ff0f59c-0e89-499e-a9c5-0190ae6be290" BLOCK_SIZE="4096" TYPE="ext4"
/dev/zram0: UUID="dc52859c-3820-46b0-86c5-71989bc3abe4" TYPE="swap"

Se observă că datele care intereseză au următoarele valori:

  • /dev/sda5: LABEL="archlinux" UUID="9cbc45a5-81d5-49f3-90d8-dce710f90fd1";
  • /dev/sda7: LABEL="boot_arch" UUID="5c430bbe-17c5-4570-af18-c9f3bef1b22c".

Cu acestea se va modifica parametrul pentru UUID aferente partiției /dev/sda5 pentru root în fișierul boot.ini utilizat la boot-are, precum ambele vor in folosite în fișierul **/etc/fstab***:

florin@odroid-n2:~/Descărcări$ sudo mount /dev/sda7 /mnt/work/
florin@odroid-n2:~/Descărcări$ sudo nano /mnt/work/boot.ini

Se modifică fișierul în conformitate cu datele noastre:

ODROIDN2-UBOOT-CONFIG

# DO Not Edit this line: KERNEL: mainline

setenv board "odroidn2"

# Show logo as soon as possible
showlogo

# System Label
setenv bootlabel "ArchLinux"

# Default Console Device Setting
setenv condev "console=ttyAML0,115200n8 console=tty1"

# Video Output
## preferred_resolution
## set to your preferred resolution using the format:
##    {width}x{heigth}@{hertz}
##    example: 1920x1080@60
## or
##    Set to an empty string to let the kernel automatically
##    choose a resolution for you.
setenv preferred_resolution ""

## petitboot_edid
## if you experience issues of display not showing any
## image when using petitboot you can use this setting
## to overwrite the default display edid information.
##
## A valid value for this option can be:
##    800x600, 1024x768, 1280x720, 1280x1024, 1600x1200,
##    1680x1050, 1920x1080, 2560x1440, 2880x1800, 3840x2160
## or
##    Set to an empty string to use the display provided
##    edid information.
setenv petitboot_edid ""

## Uncomment to force petitboot been always set as
## active to always force the edid overwrite.
#setenv petitboot_active "1"

if test "${petitboot_edid}" != "" && test "${petitboot_active}" = "1"; then
    setenv voutput "drm_kms_helper.edid_firmware=HDMI-A-1:edid/${petitboot_edid}.bin"
elif test "${preferred_resolution}" != ""; then
    setenv voutput "video=HDMI-A-1:${preferred_resolution}"
fi

# Boot Args
setenv bootargs "root=UUID=9cbc45a5-81d5-49f3-90d8-dce710f90fd1 rootwait rw fsck.repair=yes"
setenv bootargs "${bootargs} mitigations=off ${condev}"
setenv bootargs "${bootargs} logo=osd0,loaded no_console_suspend"
setenv bootargs "${bootargs} net.ifnames=0 cma=800M"
setenv bootargs "${bootargs} clk_ignore_unused ${voutput}"

# Set load addresses
setenv dtb_loadaddr "0x20000000"
setenv loadaddr "0x1080000"
setenv initrd_loadaddr "0x4080000"

# Load kernel, dtb and initrd
ext4load usb ${devno}:7 ${loadaddr} /Image
if test "${variant}" = "n2_plus"; then
    ext4load usb ${devno}:7 ${dtb_loadaddr} /dtbs/amlogic/meson-g12b-odroid-n2-plus.dtb
else
    ext4load usb ${devno}:7 ${dtb_loadaddr} /dtbs/amlogic/meson-g12b-odroid-n2.dtb
fi
ext4load usb ${devno}:7 ${initrd_loadaddr} /initramfs-linux.uimg

# boot
booti ${loadaddr} ${initrd_loadaddr} ${dtb_loadaddr}

ATENȚIE
Se va da importanță la parametrul UUID care va informa kernelul unde se află partiția de root și la faptul că se va înlocui parametrul load mmc ${devno}:1 cu ext4load usb ${devno}:7, practic vom informa bootloader-ul unde se află partiția de boot de unde va încărca kernelul (ne amintim de modul cum pornește Linux, descris foarte sumar la începutul articolului).

Urmează să se editeze fișierul fstab , după ce în prealabil se demontează partiția /dev/sda7/ din /mnt/work:

florin@odroid-n2:~$ sudo umount /mnt/work
florin@odroid-n2:~$ sudo mount /dev/sda5 /mnt/work/
florin@odroid-n2:~$ sudo nano /mnt/work/etc/fstab

În fișierul fstab se vor defini următori parametrii utilizați de kernel la bootare, în vederea montării:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a device; this may
# be used with UUID= as a more robust way to name devices that works even if
# disks are added and removed. See fstab(5).
#
# <file system>             <mount point>  <type>  <options>  <dump>  <pass>

UUID=5c430bbe-17c5-4570-af18-c9f3bef1b22c       /boot   ext4    defaults       >
UUID=3131c377-66a0-45d0-bde5-d13295d7fb41       /       ext4    defaults,noatim>
UUID=f8d67fd5-0a7f-45b3-877c-2dcf04aec10a       none    swap    defaults       >
tmpfs                                           /tmp    tmpfs   defaults,nosuid>

În final, după salvare,se va demonta partiția și se va reporni dispozitivul SBC Odroid N2:

florin@odroid-n2:~$ sudo umount /mnt/work 
florin@odroid-n2:~$ sudo reboot

După repornire, Petitboot va detecta noua configurație din /dev/sda7, respectiv va prelua datele din fișierul boot.ini, modificat anterior, iar după alegerea din meniu a opțiunii ArchLinux kernelul va fi încărcat, împreună cu parametrii, iar sistemul ne va întâmpina cu unele solicitări în vederea configurării, respectiv a instalării lui EndevourOS, în final, după logare, ne vom bucura de noua distribuție:

EndeavourOS in Odroid N2

Alte informații legate de KDE:

EndeavourOS în Odroid N2

S-a preferat KDE-ul deoarece merge bine în Wayland iar consumul de resurse nu este foarte însemnat.

Instalare Void Linux

Void Linux este una din distribuțiile dezvoltattă independent și nu depinde de alte distribuții, respectiv cu un pachet manager propriu numit xbps și care este unul dintre cele mai rapide în managementul pachetelor.
Pentru ușurința în instalare se va folosi imaginea Live cu XFCE pregătită pentru laptopul pinebook-pro urmând ca mai apoi să modificăm secvența de boot în conformitate cu platforma noastră meson, deoarece kernelul este compilat cu suport pentru acestă platformă (imaginea de la CentOS Stream 10 nu punea un kernel care oferă suport pentru meson).
În cele ce urmează vom descărca imaginea și se va realiza montări succesive până se ajunge la rootfs în vederea extragerii acesteia în partițiile din SSD, create în acest scop:

florin@odroid-n2:~$ cd Descărcări/
florin@odroid-n2:~/Descărcări$ wget https://repo-default.voidlinux.org/live/current/void-live-aarch64-20250202-xfce.iso
florin@odroid-n2:~/Descărcări$ sudo mount void-live-aarch64-20250202-xfce.iso /mnt/iso/
florin@odroid-n2:~/Descărcări$ sudo mount /mnt/iso/LiveOS/squashfs.img /mnt/work/
florin@odroid-n2:~/Descărcări$ sudo mkdir /mnt/voidlinux
florin@odroid-n2:~/Descărcări$ sudo mount /mnt/work/LiveOS/ext3fs.img /mnt/voidlinux/
florin@odroid-n2:~/Descărcări$ ls /mnt/voidlinux/
bin   dev  home  lib32  lost+found  mnt  proc  run   sys  usr
boot  etc  lib   lib64  media       opt  root  sbin  tmp  var

Ca și în cazul instalării lui EndeavourOS se va crea o partiție de 1G, cu sistemul de fișiere ext4, pentru partiția de boot:

GParted setările partiție de **boot**

În urma aplicării modificărilor realizate discului SSD, acesta va arăta ca mai jos:

GParted în urma modificărilor

În continuare se va realiza un director în care vom monta partiția realizată anterior /dev/sda8 și în care se copiază datele din /mnt/voidlinux/boot:

florin@odroid-n2:~$ sudo mkdir /mnt/boot_void
[sudo] parola pentru florin: 
florin@odroid-n2:~$ mount | grep sda8
florin@odroid-n2:~$ sudo mount /dev/sda8 /mnt/boot_void/
florin@odroid-n2:~$ sudo cp -rp /mnt/voidlinux/boot/* /mnt/boot_void/
florin@odroid-n2:~$ ls /mnt/boot_void/
boot.scr  config-6.12.11_1  initramfs-6.12.11_1.img  vmlinux-6.12.11_1
boot.txt  dtbs              lost+found
florin@odroid-n2:~$ sudo umount /mnt/boot_void

După demontarea partiției /dev/sda8, vom realiza un director /mnt/root_void, în care se va monta partiția pentru rootfs realizată de la început /dev/sda3 și unde vom copia datele aferente rootfs din imaginea iso, respectiv din /mnt/root_void, după care se vor șterge datele din /mnt/root_void/boot, iar în final vom monta partiția de boot /dev/sda8 în /mnt/root_void/boot:

florin@odroid-n2:~/Descărcări$ cd ~
florin@odroid-n2:~$ sudo mkdir /mnt/root_void
florin@odroid-n2:~$ sudo mount /dev/sda3 /mnt/root_void/
florin@odroid-n2:~$ ls /mnt/root_void/
lost+found
florin@odroid-n2:~$ sudo cp -rp /mnt/voidlinux/* /mnt/root_void/ 
florin@odroid-n2:~$ sudo rm -r /mnt/root_void/boot/*
florin@odroid-n2:~$ ls /mnt/root_void/boot/
florin@odroid-n2:~$ sudo mount /dev/sda8 /mnt/root_void/boot/
florin@odroid-n2:~$ sudo ls /mnt/root_void/boot/
boot.scr  config-6.12.11_1  initramfs-6.12.11_1.img  vmlinux-6.12.11_1
boot.txt  dtbs          lost+found

Pentru determinarea ale partițiilor de rulează blkid:

florin@odroid-n2:~$ sudo blkid
/dev/sda1: LABEL="boot" UUID="13c60d7c-1b1c-4d58-b9fe-f9262ebc2174" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="boot" PARTUUID="1a8cf7ef-9bf5-4c56-ac00-d0b95e8b8284"
/dev/sda2: LABEL="armbian" UUID="3131c377-66a0-45d0-bde5-d13295d7fb41" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="armbian" PARTUUID="d7c80cb3-3217-41ba-a5de-b7a5e1d8f3f3"
/dev/sda4: LABEL="centos" UUID="11bb4148-3733-422f-a2ae-0ad7c5ceb422" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="centos" PARTUUID="39bce778-f381-4807-8485-d9f72e0c5556"
/dev/sda5: LABEL="archlinux" UUID="9cbc45a5-81d5-49f3-90d8-dce710f90fd1" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="archlinux" PARTUUID="25031d65-5c7d-4e40-bf68-d7fdfb17be19"
/dev/sda6: LABEL="swap" UUID="f8d67fd5-0a7f-45b3-877c-2dcf04aec10a" TYPE="swap" PARTLABEL="swap" PARTUUID="c04500c6-2af8-4b0b-81d0-f73b7ec8c0ed"
/dev/sda7: LABEL="boot_arch" UUID="5c430bbe-17c5-4570-af18-c9f3bef1b22c" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="boot_arch" PARTUUID="c1dbebea-3729-4ab0-9636-7de8ffe3afb8"
/dev/sda3: LABEL="voidlinux" UUID="f0cc6ce1-37af-4865-9347-24f30edcd042" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="voidlinux" PARTUUID="efadaf32-c3fd-454f-b13b-98353033e661"
/dev/sda8: LABEL="boot_void" UUID="7e62a9a8-46c7-4824-ae08-c2c95151e313" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="boot_void" PARTUUID="f779f881-f461-467b-8803-c10e1313643f"
/dev/loop1: TYPE="squashfs"
/dev/zram1: LABEL="log2ram" UUID="4b9e4e87-e8e5-4837-b56c-e6ef79607e58" BLOCK_SIZE="4096" TYPE="ext4"
/dev/loop2: UUID="3007f301-c2c1-40b3-9dbc-68844f4f1fe6" SEC_TYPE="ext2" BLOCK_SIZE="4096" TYPE="ext3"
/dev/loop0: BLOCK_SIZE="2048" UUID="2025-02-02-00-21-58-00" LABEL="VOID_LIVE" TYPE="iso9660"
/dev/zram0: UUID="4a5c516d-e7e0-4f76-9fb2-4eab60a52d17" TYPE="swap"

ATENȚIE
La reformatarea unei partiții se modifică UUID.

Din care se extrag datele de interes:

  • /dev/sda3: LABEL="voidlinux" UUID="f0cc6ce1-37af-4865-9347-24f30edcd042";
  • /dev/sda8: LABEL="boot_void" UUID="7e62a9a8-46c7-4824-ae08-c2c95151e313"

Date care for fi folosite la editarea fișierului fstab:

florin@odroid-n2:~$ sudo nano /mnt/root_void/etc/fstab 

Iar fișierul va arăta de forma:

#
# See fstab(5).
#
# <file system> <dir>   <type>  <options>       <dump>  <pass>
UUID=7e62a9a8-46c7-4824-ae08-c2c95151e313   /boot   ext4    defaults,noatime,commit=120,errors=remount-ro   0 1
UUID=f0cc6ce1-37af-4865-9347-24f30edcd042   /   ext4    defaults,noatime,commit=120,errors=remount-ro   0 1
UUID=f8d67fd5-0a7f-45b3-877c-2dcf04aec10a   none    swap    defaults                    0 0
tmpfs                       /tmp    tmpfs   defaults,nosuid,nodev               0 0

Se va continua realizând un chroot în directorul /mnt/root_void. Se poate modica scriptul anterior sau se poate realiza unul, sub forma:

florin@odroid-n2:~$ cat chroot_work.sh 
#!/bin/bash
#chroot_work.sh
DIR="/mnt/root_void/"
mount -o rbind /dev $DIR/dev
mount -t proc none $DIR/proc
mount -o bind /sys $DIR/sys
mount -o bind /tmp $DIR/tmp
cp /etc/resolv.conf $DIR/etc/
chroot $DIR /bin/bash

În continuare se rulează scriptul intrând în modul chroot, se preia profilul, se modifică modifica denumirea consolei se realizează update și upgrade la pachete, se va bloca pornirea la boot a serviciului desktop manager - lightdm, iar final se va instala o seamă de utilitare și se dezinstala kernelul etc:

florin@odroid-n2:~$ sudo ./chroot_work.sh 
bash: warning: setlocale: LC_ALL: cannot change locale (ro_RO.UTF-8)
bash-5.2# source /etc/profile
bash-5.2# export PS1="(chroot) $PS1"
(chroot) bash-5.2# ping google.ro
PING google.ro (142.250.180.227) 56(84) bytes of data.
64 bytes from bud02s34-in-f3.1e100.net (142.250.180.227): icmp_seq=1 ttl=57 time=21.7 ms
64 bytes from bud02s34-in-f3.1e100.net (142.250.180.227): icmp_seq=2 ttl=57 time=21.2 ms
^C
--- google.ro ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 21.220/21.463/21.707/0.243 ms
(chroot) bash-5.2# xbps-install -Su
(chroot) bash-5.2# xbps-query -l | grep linux
ii liblastlog2-2.40.2_1                      Lastlog replacement library from util-linux
ii libsmartcols-2.40.2_1                     Table or Tree library from util-linux
ii linux-6.12_1                              Linux kernel meta package
ii linux-base-2023.05.29_1                   Linux kernel base dependencies
ii linux-firmware-amd-20250211_1             Binary firmware blobs for the Linux kernel - AMD CPU/GPU microcode
ii linux-firmware-broadcom-20250211_1        Binary firmware blobs for the Linux kernel - Broadcom network blobs
ii linux-firmware-network-20250211_1         Binary firmware blobs for the Linux kernel - network
ii linux-firmware-nvidia-20250211_1          Binary firmware blobs for the Linux kernel NVIDIA GPU microcode
ii linux-firmware-qualcomm-20250211_1        Binary firmware blobs for the Linux kernel - Qualcomm SoC blobs
ii linux6.12-6.12.16_1                       Linux kernel and modules (6.12 series)
ii util-linux-2.40.2_1                       Miscellaneous linux utilities
ii util-linux-common-2.40.2_1                Miscellaneous linux utilities - common files
(chroot) bash-5.2# xbps-query -l | grep grub 
ii grub-2.12_2                               GRand Unified Bootloader 2
ii grub-arm64-efi-2.12_2                     GRand Unified Bootloader 2 - arm64 EFI support

(chroot) bash-5.2# xbps-remove grub-arm64-efi-2.12_2 grub-2.12_2

Name           Action    Version           New version            Download size
grub-arm64-efi remove    2.12_2            -                      - 
grub           remove    2.12_2            -                      - 

Size freed on disk:             33MB
Space available on disk:       192GB

Do you want to continue? [Y/n] y
Removing `grub-arm64-efi-2.12_2' ...
Removed `grub-arm64-efi-2.12_2' successfully.
Removing `grub-2.12_2' ...
Removed `grub-2.12_2' successfully.

0 downloaded, 0 installed, 0 updated, 0 configured, 2 removed.

(chroot) bash-5.2# xbps-query -l | grep pinebookpro
ii pinebookpro-base-0.6_1                    Void Linux Pinebook Pro platform package
ii pinebookpro-firmware-0.0.20201114_1       Firmware files for the Pinebook Pro
ii pinebookpro-uboot-2022.04_2               U-Boot for Pinebook Pro
(chroot) bash-5.2# xbps-query -l | grep x13        
ii x13s-base-3_1                             Void Linux Thinkpad X13s platform package

(chroot) bash-5.2# xbps-remove pinebookpro-uboot-2022.04_2 pinebookpro-firmware-0.0.20201114_1 pinebookpro-base-0.6_1

Name                 Action    Version           New version            Download size
pinebookpro-uboot    remove    2022.04_2         -                      - 
pinebookpro-firmware remove    0.0.20201114_1    -                      - 
pinebookpro-base     remove    0.6_1             -                      - 

Size freed on disk:           1792KB
Space available on disk:       192GB

Do you want to continue? [Y/n] y
Removing `pinebookpro-uboot-2022.04_2' ...
Removed `pinebookpro-uboot-2022.04_2' successfully.
Removing `pinebookpro-firmware-0.0.20201114_1' ...
Removed `pinebookpro-firmware-0.0.20201114_1' successfully.
Removing `pinebookpro-base-0.6_1' ...
Updating udev hardware database ...
Removed `pinebookpro-base-0.6_1' successfully.

0 downloaded, 0 installed, 0 updated, 0 configured, 3 removed.

(chroot) bash-5.2# xbps-remove x13s-base-3_1

Name      Action    Version           New version            Download size
x13s-base remove    3_1               -                      - 

Size freed on disk:            1524B
Space available on disk:       192GB

Do you want to continue? [Y/n] y
Removing `x13s-base-3_1' ...
Removed `x13s-base-3_1' successfully.

0 downloaded, 0 installed, 0 updated, 0 configured, 1 removed.

(chroot) bash-5.2# xbps-remove linux6.12-6.12.16_1 linux-6.12_1

Name      Action    Version           New version            Download size
linux6.12 remove    6.12.16_1         -                      - 
linux     remove    6.12_1            -                      - 

Size freed on disk:            231MB
Space available on disk:       192GB

Do you want to continue? [Y/n] y
Removing `linux6.12-6.12.16_1' ...
Executing post-remove kernel hook: 20-initramfs ...
Executing post-remove kernel hook: 50-efibootmgr ...
Removed `linux6.12-6.12.16_1' successfully.
Removing `linux-6.12_1' ...
Removed `linux-6.12_1' successfully.

0 downloaded, 0 installed, 0 updated, 0 configured, 2 removed.
(chroot) bash-5.2# xbps-install nano
(chroot) bash-5.2# xbps-install mc

(chroot) bash-5.2# ls /boot/
boot.scr  boot.txt  config-6.12.11_1  dtbs  initramfs-6.12.11_1.img  lost+found  vmlinux-6.12.11_1
(chroot) bash-5.2# rm -r /boot/dtbs
(chroot) bash-5.2# rm -f /boot/*
rm: cannot remove '/boot/lost+found': Is a directory
(chroot) bash-5.2# ls /boot/
lost+found

Deoarece kernelul și modulele acestuia au fost dezinstalate se vor folosi kernelul și modulele de la distribuția EndeavourOS în cadrul rootfs-ului de la VoidLinux. În acest scop se pornește o consolă nouă în care vor fi rulate următoarele comenzi:

florin@odroid-n2:~$ sudo mkdir /mnt/boot_endeavouros
florin@odroid-n2:~$ sudo mount /dev/sda7 /mnt/boot_endeavouros/
florin@odroid-n2:~$ ls /mnt/boot_endeavouros/
boot.ini  boot.ini.orig  dtbs  Image  initramfs-linux.img  initramfs-linux.uimg  lost+found  sd_fusing.sh  u-boot.bin
florin@odroid-n2:~$ sudo cp -rp /mnt/boot_endeavouros/dtbs /mnt/root_void/boot/
florin@odroid-n2:~$ sudo cp -fp /mnt/boot_endeavouros/boot.ini /mnt/root_void/boot/
florin@odroid-n2:~$ sudo cp -fp /mnt/boot_endeavouros/Image /mnt/root_void/boot/
florin@odroid-n2:~$ sudo cp -fp /mnt/boot_endeavouros/initramfs-linux.uimg /mnt/root_void/boot/
florin@odroid-n2:~$ ls /mnt/root_void/boot/
boot.ini  dtbs  Image  initramfs-linux.uimg  lost+found
florin@odroid-n2:~$ sudo umount /mnt/boot_endeavouros/
florin@odroid-n2:~$ sudo mount /dev/sda5 /mnt/endeavouros/
florin@odroid-n2:~$ ls /mnt/endeavouros/
bin  boot  dev  etc  home  lib  lost+found  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
florin@odroid-n2:~$ ls /mnt/endeavouros/usr/lib/modules/
6.13.5-1-eos-arm  extramodules-6.13

Se revine la consola chroot și se modifică fișierul /boot/boot.ini conform cu noii parametrii:

(chroot) bash-5.2# nano /boot/boot.ini 

Fișierul **boot.ini***, după modificare, va avea un conținut de forma:

# DO Not Edit this line: KERNEL: mainline

setenv board "odroidn2"

# Show logo as soon as possible
showlogo

# System Label
setenv bootlabel "VoidLinux"

# Default Console Device Setting
setenv condev "console=ttyAML0,115200n8 console=tty1"

# Video Output
## preferred_resolution
## set to your preferred resolution using the format:
##    {width}x{heigth}@{hertz}
##    example: 1920x1080@60
## or
##    Set to an empty string to let the kernel automatically
##    choose a resolution for you.
setenv preferred_resolution ""

## petitboot_edid
## if you experience issues of display not showing any
## image when using petitboot you can use this setting
## to overwrite the default display edid information.
##
## A valid value for this option can be:
##    800x600, 1024x768, 1280x720, 1280x1024, 1600x1200,
##    1680x1050, 1920x1080, 2560x1440, 2880x1800, 3840x2160
## or
##    Set to an empty string to use the display provided
##    edid information.
setenv petitboot_edid ""

## Uncomment to force petitboot been always set as
## active to always force the edid overwrite.
#setenv petitboot_active "1"

if test "${petitboot_edid}" != "" && test "${petitboot_active}" = "1"; then
    setenv voutput "drm_kms_helper.edid_firmware=HDMI-A-1:edid/${petitboot_edid}.bin"
elif test "${preferred_resolution}" != ""; then
    setenv voutput "video=HDMI-A-1:${preferred_resolution}"
fi

# Boot Args
setenv bootargs "root=UUID=f0cc6ce1-37af-4865-9347-24f30edcd042 rootwait rw fsck.repair=yes"
setenv bootargs "${bootargs} mitigations=off ${condev}"
setenv bootargs "${bootargs} logo=osd0,loaded no_console_suspend"
setenv bootargs "${bootargs} net.ifnames=0 cma=800M"
setenv bootargs "${bootargs} clk_ignore_unused ${voutput}"

# Set load addresses
setenv dtb_loadaddr "0x20000000"
setenv loadaddr "0x1080000"
setenv initrd_loadaddr "0x4080000"

# Load kernel, dtb and initrd
ext4load usb ${devno}:8 ${loadaddr} /Image
if test "${variant}" = "n2_plus"; then
    ext4load usb ${devno}:8 ${dtb_loadaddr} /dtbs/amlogic/meson-g12b-odroid-n2-plus.dtb
else
    ext4load usb ${devno}:8 ${dtb_loadaddr} /dtbs/amlogic/meson-g12b-odroid-n2.dtb
fi
ext4load usb ${devno}:8 ${initrd_loadaddr} /initramfs-linux.uimg

# boot
booti ${loadaddr} ${initrd_loadaddr} ${dtb_loadaddr}

La repornire Petitboot va prelua parametrii de pornire din fișierul astfel modificat.

Apoi se adăugă o parolă la utilizatorul root, se va crea un utilizator de lucru și se oprește, pentru prima pornire, serviciul lightdm:

(chroot) bash-5.2# passwd 
New password: 
Retype new password: 
passwd: password updated successfully
(chroot) bash-5.2#
(chroot) bash-5.2# useradd -G wheel,dialout,video,plugdev -s /bin/bash -c 'Florin Tanasa' florin
(chroot) bash-5.2# ls /home/
florin
(chroot) bash-5.2# passwd florin
New password: 
Retype new password: 
passwd: password updated successfully
(chroot) bash-5.2#
(chroot) bash-5.2# touch /etc/sv/lightdm/down

În final se închid consolele și se repornește sistemul.

La repornire Petitboot va detecta pe partiția de boot fișierul boot.ini și va prelua în meniu opțiunea VoidLinux cu parametrii și argumentele de bootare aferenți:

Petitboot

După pornire utilizatorul va fi întâmpinat de consolă unde se va loga ca utilizator root iar mai apoi se va porni serviciul lightdm folosind comanda:

sv up lightdm

În urma rulări comenzii serviciul lightdm (Managerul de ferestre) va porni, iar după logare în sistem, VoidLinux va arăta de forma, (sistemul din imagine a fost setat să folosească limba română din consolă la prima bootare):

VoidLinux cu XFCE4 în Odroid N2

Concluzii

Plăcile SBC dotate cu procesoare arm sunt versatile, pot fi folosite cu succes în diverse utilizări (birou, diverse servicii: web, ftp, ssh, fișiere etc), au consum mic, fiind în general fără ventilatoare practic nu fac zgomot etc.

Se constată că dacă există un kernel la o distribuție acesta poate fi utilizat și la altă distribuție, practic kernelul este Linux, iar distribuția este GNU/Linux dacă respectă unele criterii.

Instalarea unei distribuții GNU/Linux se poate face în totalitate manual și nu este necesar o interfață grafică sau un instalator dedicat.

Ca distribuție VoidLinux este una foarte rapidă și merită de compilat un kernel custom pentru placa Odroid N2, dar nu este pentru începători.