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:
Î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:
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:
- /dev/sda1 - de 300MiB folosiți pentru fișierele utilizate în procesul de bootare;
- /dev/sda2 - de 300GiB folosiți pentru distribuția Armbian;
- /dev/sda3 - de 200GiB folosiți pentru distribuția Void Linux;
- /dev/sda4 - de 200GiB folosiți pentru distribuția CentOS Stream 10;
- /dev/sda4 - de 200GiB folosiți pentru distribuția EndeavourOS;
- /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:
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:
Pentru a utiliza Gnome:
Pentru a utiliza KDE:
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:
După care se va finaliza prin apăsarea butonului Aplicarea tuturor operațiilor:
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:
Alte informații legate de KDE:
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:
În urma aplicării modificărilor realizate discului SSD, acesta va arăta ca mai jos:
Î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:
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):
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.