APU2C2Debian: Porovnání verzí
Značka: editace z Vizuálního editoru |
|||
(Není zobrazeno 45 mezilehlých verzí od 4 dalších uživatelů.) | |||
Řádek 1: | Řádek 1: | ||
− | Tento návod pojednává o instalaci OS Debian na PCEngines 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: [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 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: | ||
+ | |||
+ | *[http://www.pcengines.ch/apucool.htm apucool] | ||
+ | |||
+ | ==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 | ||
+ | |||
+ | <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 serial console | ||
+ | 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] '' | ||
+ | |||
+ | ''201119 - update2: nově připravený image debian 10: [http://10.107.137.12/iso/debian-10-for-APU-serial-install.iso 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) | ||
+ | |||
+ | <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 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | Download BIOSu: | ||
+ | |||
+ | Verze '''v4.14.0.x''' (včetně microcode 0x07030106) | ||
+ | |||
+ | APU2 a APU4: http://lide.hkfree.org/~vecino/ | ||
+ | |||
+ | <br /> | ||
+ | ==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 | ||
+ | |||
+ | ==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:<syntaxhighlight lang="bash"> | ||
+ | Debian:~# uname -a | ||
+ | Linux debian 4.19.0-13-686-pae | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | V repozitáři si najdeme verzi kernelu, která nepoužívá PAE, je to ta verze, která nemá "pae" v názvu<syntaxhighlight lang="bash"> | ||
+ | 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) | ||
+ | ... | ||
+ | </syntaxhighlight>Danou verzi kernelu nainstalujeme:<syntaxhighlight lang="bash"> | ||
+ | root@debian:~# apt install linux-image-4.19.0-14-686 | ||
+ | </syntaxhighlight>Pokud se kernel v pořádku nainstaluje odstraníme současný kernel:<syntaxhighlight lang="bash"> | ||
+ | root@debian:~# apt remove linux-image-4.19.0-14-686-pae | ||
+ | </syntaxhighlight>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<syntaxhighlight lang="bash"> | ||
+ | root@debian:~# uname -a | ||
+ | Linux debian 4.19.0-14-686 #1 SMP Debian 4.19.171-2 (2021-01-30) i586 GNU/Linux | ||
+ | |||
+ | </syntaxhighlight>je CF karta připravena k vložení do Alixu. |
Aktuální verze z 6. 10. 2022, 07:53
Tento návod pojednává o instalaci OS Debian (bez grafického rozhraní) na PCEngines APU druhé generace např. APU2C2
Obsah
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 serial console
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.x (včetně microcode 0x07030106)
APU2 a APU4: http://lide.hkfree.org/~vecino/
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.