APU2C2Debian: Porovnání verzí

Z HKfree wiki
Skočit na navigaci Skočit na vyhledávání
(Není zobrazeno 21 mezilehlých verzí od 2 dalších uživatelů.)
Řádek 1: Řádek 1:
Tento návod pojednává o instalaci OS Debian na PCEngines APU, typ 2C2 (druhá generace APU)
+
Tento návod pojednává o instalaci OS Debian (bez grafického rozhraní) na PCEngines APU druhé generace např. APU2C2
  
 
== Příprava HW ==
 
== 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:
+
* 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: [http://www.pcengines.ch/apu2.htm]
 
* 1x mSATA SSD disk, sám výrobce doporučuje disk Phison 16GB [http://www.pcengines.ch/msata16d.htm]
 
* 1x mSATA SSD disk, sám výrobce doporučuje disk Phison 16GB [http://www.pcengines.ch/msata16d.htm]
 
* 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 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.)
Řádek 11: Řádek 11:
 
== Příprava iso image ==
 
== 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.
 
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.
+
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:
 
Postup:
 
* vytvoříme si pracovní adresáře, kde budeme manipulovat s daty
 
* vytvoříme si pracovní adresáře, kde budeme manipulovat s daty
 +
<syntaxhighlight lang="bash">
 +
mkdir deb-serial
 +
cd deb-serial
 +
</syntaxhighlight>
 +
* stáhneme si nejnovější iso image debianu formu "netinst", architektura AMD64
 +
<syntaxhighlight lang="bash">
 +
wget http://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-8.5.0-amd64-netinst.iso -O debian-amd64-netinst.iso
 +
</syntaxhighlight>
 +
''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
 +
<syntaxhighlight lang="bash">
 +
mkdir old
 +
mkdir new
 +
mount -o loop debian-amd64-netinst.iso old
 +
</syntaxhighlight>
 +
* 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)
 +
<syntaxhighlight lang="bash">
 +
shopt -s dotglob
 +
cp -rv old/* new/
 +
</syntaxhighlight>
 +
* nyní potřebujeme upravit soubory boot loaderu isolinux/syslinux, tak abychom mohli se systémem pracovat přes seriovou konzoli
 +
<syntaxhighlight lang="bash">
 +
nano new/isolinux/isolinux.cfg
 +
nano new/isolinux/txt.cfg
 +
</syntaxhighlight>
 +
* obsah souborů má být takovýto:
 +
<syntaxhighlight lang="bash">
 +
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
 +
###########################################
 +
</syntaxhighlight>
 +
'''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í:
 +
<syntaxhighlight lang="bash">
 +
apt-get install debootstrap squashfs-tools syslinux isolinux syslinux-common xorriso
 +
</syntaxhighlight>
 +
* image vytvoříme takto:
 +
<syntaxhighlight lang="bash">
 +
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/
 +
</syntaxhighlight>
 +
''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
 +
<syntaxhighlight lang="bash">
 +
dd if=debian-serial-install.iso of=/dev/sdX bs=1k
 +
</syntaxhighlight>
 +
* to je vše, můžeme přejít k instalaci na APU
 +
 +
''Již připravený image je zde [http://10.107.137.12/iso/debian-8.5-for-APU-serial-install.iso debian-8.5-for-APU-serial-install.iso] ,ale netvrdím že tem zůstane napořád''
 +
''update: nově připravený image debian 9: [http://10.107.137.12/iso/debian-9.0-for-APU-serial-install.iso debian-9.0-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)
 +
<syntaxhighlight lang="bash">
 +
cat /dev/ttyS0
 +
</syntaxhighlight>
 +
* 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:<syntaxhighlight>
 +
screen /dev/ttyUSB0 115200
 +
</syntaxhighlight>
 +
 +
== 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:
 +
<syntaxhighlight lang="bash">
 +
auto eth1
 +
iface eth1 inet static
 +
        address 192.168.1.1
 +
        netmask 255.255.255.0
 +
</syntaxhighlight>
 +
* nainstalovat ssh server:
 +
<syntaxhighlight lang="bash">
 +
apt-get update
 +
apt-get install openssh-server
 +
</syntaxhighlight>
 +
* 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:
 +
<syntaxhighlight lang="bash">
 +
[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]$
 +
</syntaxhighlight>
 +
 +
Po rebootu by měl najet novější BIOS:
 +
<syntaxhighlight lang="bash">
 +
PC Engines apu2
 +
coreboot build 08/30/2017
 +
BIOS version v4.6.1
 +
2032 MB DRAM
 +
 +
SeaBIOS (version rel-1.10.2.1)
 +
 +
Press F10 key now for boot menu
 +
</syntaxhighlight>
 +
 +
== 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:
 +
<syntaxhighlight lang="bash">
 +
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
 +
</syntaxhighlight>
 +
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:
 +
<syntaxhighlight lang="bash">
 +
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
 +
</syntaxhighlight>
 +
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:
 +
<syntaxhighlight lang="bash">
 +
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
 +
</syntaxhighlight>
 +
 +
Výsledek by měl vypadat pak nějak takto:
 +
<syntaxhighlight lang="bash">
 +
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
 +
</syntaxhighlight>
 +
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í):
 +
 +
<syntaxhighlight lang="bash">
 +
root@hrubinova1:~# ethtool --show-coalesce enp1s0 | grep "usecs"
 +
stats-block-usecs: 0
 +
rx-usecs: 3
 +
rx-usecs-irq: 0
 +
tx-usecs: 3
 +
root@hrubinova1:~#
 +
</syntaxhighlight>
 +
''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ě:
 +
 +
<syntaxhighlight lang="bash">
 +
root@hrubinova1:~# ethtool --coalesce enp1s0 rx-usecs 1000 tx-usecs 1000
 +
root@hrubinova1:~#
 +
</syntaxhighlight>
 +
''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

Verze z 21. 8. 2019, 13:06

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

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 08/30/2017
BIOS version v4.6.1
2032 MB DRAM

SeaBIOS (version rel-1.10.2.1)

Press F10 key now for boot menu

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