APU2C2Debian

Z HKfree wiki
Skočit na navigaci Skočit na vyhledávání

Tento návod pojednává o instalaci OS Debian (bez grafického rozhraní) na PCEngines APU druhé generace např. APU2C2

Příprava HW

  • 1x PCEngines APU 2C2 (případně 2B2), jde o desku s 1GHz quad-core embedded CPU s architekturou AMD64, konkrétně AMD G series GX-412TC, s 2GB nebo 4GB RAM, podrobné info: [1]
  • 1x mSATA SSD disk, sám výrobce doporučuje disk Phison 16GB [2]
  • 1x 12V zdroj, alesoň 1,5A, samotný APU má spotřebu 6-10W v závislosti na vytížení CPU, výkonová rezerva je tam kvůli perifériím (disk, USB flash, miniPCIe karta, apod.)
  • 1x case, který slouží zároveň jako chladič, APU lze provozovat i bez něj, ale jen v krátkých intervalech, kdy nebude zatížen CPU
  • 1x flash disk, alespoň 1GB

Sestavení chlazení je zde:

Příprava iso image

Tato část vykládá o vytvoření instalačního image, které se nahraje na flash disk a bude se z něj v APU instalovat systém. Budeme k tomu potřebovat stroj s linuxem a připojení k internetu. předpoklad je, že všechno dělám jako root. Postup:

  • vytvoříme si pracovní adresáře, kde budeme manipulovat s daty
mkdir deb-serial
cd deb-serial
  • stáhneme si nejnovější iso image debianu formu "netinst", architektura AMD64
wget http://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-8.5.0-amd64-netinst.iso -O debian-amd64-netinst.iso

pozn. je třeba mít nějakou novější instalaci, s verzí 8.3 to údajně nefunguje, APU2C2 je v době psaní návodu na trhu 2 měsíce, jde tedy o hodně nový kus HW

  • vytvoříme adresář pro rozbalení image a připojíme pomocí loop stažený image do adresáře
mkdir old
mkdir new
mount -o loop debian-amd64-netinst.iso old
  • zkopírujeme veškeré soubory z instalačního image do nové složky abychom je mohli upravit podle toho jak budeme potřebovat (shopt -s dotglob má zajistit, že se budou kopírovat i skryté soubory)
shopt -s dotglob
cp -rv old/* new/
  • nyní potřebujeme upravit soubory boot loaderu isolinux/syslinux, tak abychom mohli se systémem pracovat přes seriovou konzoli
nano new/isolinux/isolinux.cfg
nano new/isolinux/txt.cfg
  • obsah souborů má být takovýto:
isolinux.cfg:

# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
serial 0 115200
console 0
path
include menu.cfg
#default vesamenu.c32
#prompt 0
#timeout 0
###########################################

txt.cfg:

default install
label install
    menu label ^Install
    menu default
    kernel /install.amd/vmlinuz
    append vga=off console=ttyS0,115200,n8 initrd=/install.amd/initrd.gz --- console=ttyS0,115200,n8
###########################################

Pozornost věnujte i ostatnim .cfg souborům, aby někde nebyla také klauzule "default" a "menu default" instalátor by poté mohl spustit něco jiného než chceme

  • dále z upravené instalaci vytvoříme zpět iso image, na debianu 8 k tomu budeme potřebovat pár aplikací:
apt-get install debootstrap squashfs-tools syslinux isolinux syslinux-common xorriso
  • image vytvoříme takto:
xorriso -as mkisofs -r -J -joliet-long -l -cache-inodes -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -partition_offset 16 -A "Debian8.2" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o debian-serial-install.iso ./new/

Umístění souboru isohdpfx.bin se může lišit podle verze isolinux, je proto lepší si potvrdit, že je opravdu tam kde být má: updatedb; locate isohdpfx.bin

  • vytvoření image nahrajeme na flshku, místo /dev/sdX se zadá skutečná cesta k flashce
dd if=debian-serial-install.iso of=/dev/sdX bs=1k
  • to je vše, můžeme přejít k instalaci na APU

Již připravený image je zde debian-8.5-for-APU-serial-install.iso ,ale netvrdím že tem zůstane napořád

update: nově připravený image debian 9: debian-9.0-for-APU-serial-install.iso

201119 - update2: nově připravený image debian 10: debian-10-for-APU-serial-install.iso

připojení k APU přes sériový port

v této části návodu je popis jak propojit PC s APU pomocí sériového portu Potřebujeme PC, které má sériový port, případně USB-RS232 převodník a NULL MODEM sériový kabel Postup je následující:

  • PC a APU propojíme sériovým kabelem
  • v PC nalezneme ten správný sériový port, bude jich přítomno nejspíše několik - /dev/ttySx, kde x je pořadové číslo portu, který je ten správný můžeme rychle zjistit příkazem concatenate (cat)
cat /dev/ttyS0
  • když zapneme APU mělo by se na konzoli něco začít vypisovat i když by byl port nastaven nesprávně měl by vypisovat alespoň "nějaké nesmysly", pokud je to nesprávný port, nebude vypisovat nic, přes příkaz cat bude komunikace vždy jen jednosměrná, přejdeme tedy k programu, který umí komunikovat obousměrně
  • pro komunikaci použijeme aplikaci screen nebo minicom, nebo jiný program, který to umí a nastavíme ho tak, aby byla sériová linka nastavena na tyto parametry (jak danou aplikaci nastavit není cílem tohoto návodu):

datový tok: 115200 b/s datových bitů: 8 stop bit: 1 parita: ne SW/HW flow control: ne klasický jednořádkový zápis: 115200 8N1

například:

screen /dev/ttyUSB0 115200

instalace z flash disku

Tato část návodu pojednává o instalaci OS z flash disku

  • zasuneme námi připravenou flash do APU a zapneme ho, na konzoli bychom měli vidět informace vypisované BIOSem, poté by měl začít bootovat z flash, případně se pomocí klávesy F10 dá vyvolat boot menu, pokud chceme boot z flash vynutit ručně, APU nemá BIOS s grafickým rozhraním, nelze tedy do něj vlézt a něco nastavovat kromě pořadí boot zařízení.

pokud nejde zařízení ovládat je nejspíše nějak špatně nastavený sériový port, případně je něco špatně s kabelem - není to NULL MODEM, případně je poškozený apod.

  • Nyní máme před sebou klasickou instalaci debianu, jako je tomu u běžného PC nebo virtuálu (popis instalace debianu není cílem tohoto návodu).
  • Když máme instalaci za sebou, vyjmeme flashku a necháme systém restartovat, posléze by měl naběhnout do přihlašovacího dialogu
  • abychom nemuseli systém ovládat přes sériový port nainstalujeme openssh server a nastavíme mu ip adresu
  • do /etc/network/interfaces zadat/přidat něco takového:
auto eth1
iface eth1 inet static
        address 192.168.1.1
        netmask 255.255.255.0
  • nainstalovat ssh server:
apt-get update
apt-get install openssh-server
  • a restartovat
  • po bootu by měl APU být dostupný přes SSH na portu eth1 (ten prostřední ethernet port)

Update BIOS

Postup funguje na všechny typy APU2 desek, tedy např. APU2C2, APU2C4, APU2D2, APU4C4 atd.

Update BIOSu není na APU zcela triviální, PCEngines používá vlastní nastylovanou tiny distribuci linuxu, která obsahuje aplikaci, kterou lze BIOS flashnout. Je na to třeba několik kroků:

  • Na webu si stáhnout BIOS (firmware) pro svůj typ APU: https://www.pcengines.ch/apu2.htm případně další verze jsou na githubu https://github.com/pcengines/apu2-documentation#mainline nebo nově https://pcengines.github.io/
  • Stáhnout si instalátor tinyCore linuxu http://pcengines.ch/howto.htm#TinyCoreLinux pro windows (nastylovaný Universal USB Installer od Pendrivelinux) nebo pro linux/MAC
  • Nahrát tinyCore na flashku, postup je stejný jako u Universal USB Installer - postup triviální, spustí se program, vybere se flashka, jinak je to jen samé next, next, ...
  • nahrát nový BIOS na flashku např. apu2_v4.6.1.rom
  • nabootovat APU z připravené flashky - většinou stačí jen zasunout flash a zapnout APU, flashka by měla mít při bootu prioritu
  • až nastartuje systém (otázka pár sekund), flashnout nový BIOS:
[root@box:/media/TINYCORE]$ flashrom -w apu2_v4.6.1.rom -p internal
flashrom v0.9.9-r1954-beead91-17 on Linux 4.2.9-tinycore (i686)
flashrom is free software, get the source code at https://flashrom.org

Error accessing high tables, 0x100000 bytes at 0x77fae000
/dev/mem mmap failed: Resource temporarily unavailable
Failed getting access to coreboot high tables.
Found chipset "AMD FCH".
Enabling flash write... OK.
Identifying board "PC Engines apu2"... OK.
Found Winbond flash chip "W25Q64.V" (8192 kB, SPI) mapped at physical address 0xff800000.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.
[root@box:/media/TINYCORE]$

Po rebootu by měl najet novější BIOS:

PC Engines apu2
coreboot build 20212402
BIOS version v4.13.0.4 <<<< novy BIOS
2032 MB DRAM
SeaBIOS (version rel-1.12.1.3-0-g300e8b70)

Press F10 key now for boot menu


Download BIOSu:

Verze v4.14.0.4 (včetně microcode 0x07030106)

APU2: http://lide.hkfree.org/~vecino/apu2_v4.14.0.4.rom

APU4: http://lide.hkfree.org/~vecino/apu4_v4.14.0.4.rom

MD5:

56ba7116c75de5dc6c1956db8f897b20 *apu2_v4.14.0.4.rom
df955bfabae1e0a7dd9fbc18caa76ee2 *apu4_v4.14.0.4.rom

---

BIOS Information
	Vendor: coreboot
	Version: v4.14.0.4
	Release Date: 09/07/2021


Ladění přerušení

Po nasazení APU na Andre, kde je běžný provoz v řádu stovek mbit/s se vyskytl problém s tím, že CPU přestal stíhat obsluhovat přerušení od síťového adaptéru a tím pádem začal proces ksoftirqd (řažení fronty přerušení) velmi vytěžovat CPU, problém je, že servisa irqbalance by default přiřazuje jen jedno jádro CPU per síťové rozhraní a jedno jádro pak nestíhá odbavovat velký počet přerušení/s, částečné řešení je nastavit, aby přerušení od jednoho síťového rozhraní obsluhovala všechna jádra (přerušení se z pohledu x86 architektury řeší per jádro, nikoli per fyzický CPU).

V našem případě je uplink routru rozhraní enp1s0, pomocí příkazu cat /proc/interrupts | grep enp1s0 si zjistím které číslo přerušení (IRQ) má daný interface:

root@Andre1:~# cat /proc/interrupts | grep -E "enp1s0|CPU"
            CPU0       CPU1       CPU2       CPU3
  37:          0          0          0          1   PCI-MSI 524288-edge      enp1s0
  38:          1 3099457491          1          2   PCI-MSI 524289-edge      enp1s0-rx-0
  39:          0          0      29608     301086   PCI-MSI 524290-edge      enp1s0-rx-1
  40:          0        530          3 2703231872   PCI-MSI 524291-edge      enp1s0-tx-0
  41:          5          1 2694883102          0   PCI-MSI 524292-edge      enp1s0-tx-1

Zde je vidět, že přerušení od interfacu obsluhují jen některá jádra (někde je počet obsloužených přerušení 0 nebo velmi malé číslo) číslo ve sloupci udává počet obsloužených přerušení daným jádrem CPU. Náš cíl je tedy rozprostřít využití všech obsluhy přerušení mezi všechna jádra. To se dá manuálně provést tak, že budeme editovat soubor /proc/irq/$číslo_přerušení/smp_affinity, kde je přiřazený CPU pro dané přerušení vyjádřen binární notací a hexadecimálním číslem. První krok je stopnout a disablovat službu irqbalance, aby se nám už nesnažila "balancovat" využití CPU:

root@Andre1:~# systemctl stop irqbalance.service
root@Andre1:~# systemctl disable irqbalance.service
Synchronizing state of irqbalance.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable irqbalance

Poté přiřadíme do smp_affinity hodnotu tak, aby přerušení obsluhovala všechna, v našem případě 4, jádra binární notace vypadá následovně: každá jednička v hodnotě znamená povolení použití daného jádra k obsluze přerušení s tím, že nejnižší bit je CPU0 (tedy 1. jádro) a nejvyšší je CPU3 (tedy 4. jádro), pokud budu chtít využít všechna jádra, jednoduše dám všude jedničky: 1111b = 0xf, pokud by byl systém např. šestijádrový, hodnota by byla 11 1111b = 0x3f, u osmijádrového: 1111 1111b = 0xff atp.

Rozhraní enpXsY má přerušení rozdělená ještě na RX a TX složky, nastavit tedy musíme všechny složky:

root@Andre1:~# echo f > /proc/irq/38/smp_affinity
root@Andre1:~# echo f > /proc/irq/39/smp_affinity
root@Andre1:~# echo f > /proc/irq/40/smp_affinity
root@Andre1:~# echo f > /proc/irq/41/smp_affinity

Výsledek by měl vypadat pak nějak takto:

root@Andre1:~# cat /proc/interrupts | grep -E "enp1s0|CPU"
            CPU0       CPU1       CPU2       CPU3
  37:          0          0          0          1   PCI-MSI 524288-edge      enp1s0
  38:     155944 3106163509     165386     179882   PCI-MSI 524289-edge      enp1s0-rx-0
  39:          8         12      29629     301758   PCI-MSI 524290-edge      enp1s0-rx-1
  40:     105030     105696     112549 2709126908   PCI-MSI 524291-edge      enp1s0-tx-0
  41:     125211     125009 2700441807     146260   PCI-MSI 524292-edge      enp1s0-tx-1

Zde je vidět, že přerušení už obsluhují všechna jádra, výsledek by měl být nižší celkové zatížení CPU a hlavně by se už neměla, nebo alespoň ne moc, přerušení řadit v procesu ksoftirqd, vytížení jader by mělo být ideálně stejné.

Ladění front na síťové kartě

Ladění front na NIC má za cíl zvýšit propustnost APU v situaci kdy velký provoz CPU na APU zahltí počtem přerušení od síťové karty. Jak je karta nastavená se můžeme podívat pomocí aplikace ethtool, to co nás zajímá se jmenuje "coalesce", hodnota udává jak často síťovka pošle nabufrovaný provoz dále do CPU, každé takové odeslání vyvolá přerušení a vysoký počet přerušení/s může relativně pomalý CPU na APU utavit.

Zda toto nastavení vůbec jde změnit závisí na HW dané síťovky a jejím ovladači, např. síťovky intel a e1000 ovladač většinou problém nemají, některé realtek síťovky se staršími ovladači ano.

Jak je HW nastaven zjistíme takto (pokud je vypsána chyba "Operation not supported" daný ovladač coalesce nastavit neumí):

root@hrubinova1:~# ethtool --show-coalesce enp1s0 | grep "usecs"
stats-block-usecs: 0
rx-usecs: 3
rx-usecs-irq: 0
tx-usecs: 3
root@hrubinova1:~#

Hodnotu enp1s0 případně upravte podle názvu síťovky U intel síťovky i211AT je "by default" nastaveno obsluhování síťovky každé 3usec, tedy každé 3usec (pokud během té doby nějaký paket přijde) je buffer síťovky odeslán do CPU. My v tomto ukázkovém příkladu zvýšíme hodnotu na 1000usec, tedy 1ms, způsobí to sice zvýšení odezvy stroje, ale dost rapidně klesne počet přerušení/s a o to nám jde. Nastavené se provádí následovně:

root@hrubinova1:~# ethtool --coalesce enp1s0 rx-usecs 1000 tx-usecs 1000
root@hrubinova1:~#

Hodnotu enp1s0 případně upravte podle názvu síťovky

Pokud příkaz nevypíše nic, nastavení se nejspíš provedlo a můžeme ho zkontrolovat pomocí přepínače --show-coalesce jako je v příkladu výše. Provedení změny může mít za následek krátké přerušení spojení, ale nemělo by to systém či síťovku nějak "zaseknout". Toto nastení není persistentní, je ten potřeba dělat po každém rebootu, např. v nějakém startup scriptu či v souboru nastavení síťovky.

Tento postup byl nasazen na routrech na AP Hrubínova a Hive a na obou vedl k pozitivním výsledkům.

Credits: Locutus, Vcela

Debian 10 na PCEngines Alix

I na staříčký alix jde nainstalovat nový Debian 10, zařízení je sice velmi omezené svojí pamětí, ale základní systém si vystačí s 256GB ram i bez swapu (swapem bychom CF asi brzo umrtvili). Vzhledem k tomu, že Alix neumí bootovat z USB musí se systém dostat na CF kartu v jiném stroji, tak jak tomu bylo dříve. Budeme tedy potřebovat jiné PC a čtečku CF karet, nejlépe USBčkovou.

Postup instalace:

  • připravíme si klasickou instalačku debianu pro 32bit systém (i386), např. netinstall verzi, nenašel jsem jak načisto nainstalovat debian10 s non PAE kernelem, tento krok tedy provedeme až na konec
  • vezmeme PC ve kterém budeme systém instalovat, já použil APU a klasickou instalaci přes serial port, postup přípravy viz výše na této stránce
  • k PC připojíme instalační médium a čtečku CF karet s alespoň 2GB CF kartou
  • projdeme instalací systému s tím, že jako disk pro systém vybereme CF kartu (instalace debianu není předmětem tohoto návodu)
  • nainstalovaný systém si z CF karty spustíme stejným způsobem jako boot z USB disku
  • pokud nám systém nabotuje z CF karty provedeme v něm kromě nastavení sítě apod. věcí ještě jednu důležitou operaci, protože Alix má non PAE CPU musíme do systému zavést také non PAE kernel:

současnou verzi kernelu zjistíme pomocí příkazu uname -a:

Debian:~# uname -a
Linux debian 4.19.0-13-686-pae

V repozitáři si najdeme verzi kernelu, která nepoužívá PAE, je to ta verze, která nemá "pae" v názvu

root@debian:~# apt update && apt-cache search linux-image-4.19.0-14-686
...
linux-image-4.19.0-14-686 - Linux 4.19 for older PCs (signed)
...

Danou verzi kernelu nainstalujeme:

root@debian:~# apt install linux-image-4.19.0-14-686

Pokud se kernel v pořádku nainstaluje odstraníme současný kernel:

root@debian:~# apt remove linux-image-4.19.0-14-686-pae

apt bude varovat, že se snažíme odstranit běžící kernel, takže potvrdíme, že víme co děláme, na konci procesu by grub měl potvrdit, že nalezl nový kernel (non PAE) a připravit ho k zavedení, poté provedeme reboot pokud najede nový kernel

root@debian:~# uname -a
Linux debian 4.19.0-14-686 #1 SMP Debian 4.19.171-2 (2021-01-30) i586 GNU/Linux

je CF karta připravena k vložení do Alixu.