czwartek, 28 lipca 2016

Kernele z patchem CK

Pewnie większość użytkowników Archa dawno już spotkała się z tzw. kernelami Cona Kolivasa, czy też z patchami BFS lub CK. Część z nas ich używa. Teoretycznie kernel Manjaro winien zawierać te patche już od dość dawna, jednakże kiedy go ostatni raz sprawdzałem (wczoraj) nie był wyposażony w te łatki.
Na bieżąco nowe wersje kernela udostępnia w postaci binarnej użytkownik graysky, a zatem nie musimy ich kompilować. Co ciekawe, w jego repozytorium dostępnych jest bardzo wiele odmian dostosowanych do poszczególnych rodzajów procesora, a nie tylko wersje dla architektury 32 i 64 bitowej. Kompilacja jest zatem konieczna wyłącznie osobom, które z jakichś przyczyn chciałyby dokonać większych zmian w swoich kernelach. Dla nich są skrypty w AUR, które radzę dokładnie przeglądnąć, albowiem można w nich poustawiać sporo opcji. Jeśli ktoś chciałby dokładniej to poznać - zapraszam do dyskusji, czy to tutaj, czy na forum.
Oprócz kerneli z najnowszej linii, są jeszcze repozytoria, w których można znaleźć kernele LTS wyposażone w łatkę CK i to zarówno z ostatniej linii LTS, jak i z linii 3.x. Te kernele nie są jednakże już dostosowane do poszczególnych typów procesorów, oferując niekiedy wersje wyłącznie dla procesorów 64 bitowych. Z lektury ich zawartości wynika, że nie udostępniają nawet najnowszych kerneli LTS (np. zamiast ostatniego 4.4, oferuje 3.14, które już w sierpniu br. stanie się EOL). Jeszcze inne, jak np. linux-ck-pax oferują je dla linii 3.14, 3.16, 3.17 i 3.19, spośród których w zasadzie wartą odnotowania jest wyłącznie linia 3.16 ze względu na wsparcie sięgające 2020 r. (3.17 i 3.19 już są EOL). Jest jeszcze repozytorium z linux-ck dla linii 3.10 i to może jeszcze być dla kogoś ciekawe, ze względu na wsparcie do października 2017 r. W niniejszej notatce pomijam te repozytoria. Jeśli znajdzie się ktoś zainteresowany, używający takiej linii kerneli, to proszę się zaznajomić z tą informacją.

Co to daje?
Patche tworzone przez Kolivasa (a także innych użytkowników, albowiem sporo tu pracy Alfreda Chena i Oleksandra Natalenki) są przeznaczone dla desktopów. Ich głównym celem ma być większa responsywność systemu. Programy winny się uruchamiać szybciej. Winniśmy odczuwać większą płynność pracy.

Nieco ładu.
Kolivas oferuje dwa rodzaje łatek: BFS oraz CK, za każdym razem dostosowanych do danego wydania kernela. Główny patch, to BFS. To on jest planistą procesów alternatywnym dla CFS, który jest domyślnym obecnie schedulerem CPU w kernelu. Drugi z patchy zawiera w całości BFS a nadto jeszcze inne, które mają dodatkowo poprawić responsywność systemu jak np. ustawienie tick rate na 1000Hz (domyślny kernel w Archu ma tę wartość ustawioną na 300Hz). Takie ustawienie częstotliwości jest rekomendowane dla pracy BFS, choć nie jest ono warunkiem jego poprawnego działania. Tutaj uwaga ta ostatnia zmiana może mieć wpływ na długotrwałość pracy na zasilaniu bateryjnym. Niestety to jedna z tych wartości, której nie możemy zmienić na pracującym już kernelu. Jest "wszyta" w kernel na stałe, zatem jeśli odczujecie spadek długotrwałości pracy na kernelu CK przy zasilaniu bateryjnym, to wówczas dobrze mieć w systemie drugi, bardziej energooszczędny kernel, na którym uruchamialibyśmy notebooka, gdy pracujemy na takim zasilaniu. Może to być kernel "linux" z Archa, może to być nawet linux-ck, ale wówczas zbudowany z AUR, albowiem tylko tam możemy zdecydować się na nienakładanie tego patcha. Sens tego ostatniego rozwiązania wydaje się być jednak problematyczny.
Oprócz kerneli "linux-ck", patch BFS lub CK jest dość popularny i rozpowszechniony. Dla przykładu, każde wydanie pf-kernel zawiera BFS. Podobnie zawiera je również kernel kalterfx.
BFS jest też stosowany w kernelach niektórych dystrybucji. Przedziwna sytuacja występuje w przypadku kernel-lqx, albowiem PKGBUILD daje możliwość skompilowania kernela z tym patchem, jednakże nie znajduje się on w źródłach, na podstawie, których kernel ten jest kompilowany. Jedynym patchem, jaki jest tu nakładany jest liquorix, który niekiedy ma zaimplementowane BFS, a innym razem nie.

Pozostawmy jednak na boku inne kernele, które korzystają z BFS/CK i zainstalujmy ten kernel w możliwie najprostszy sposób.
W przypadku najnowszej linii kerneli skorzystamy w tym celu z repozytorium graysky'ego. Pierwsze, czego musimy dokonać, to w pliku /etc/pacman.conf dodać to repozytorium. Dopisujemy w dowolnym miejscu listy repozytoriów następujący wpis:
[repo-ck]
Server = http://repo-ck.com/$arch
Następnie musimy dodać sygnaturę podpisu graysky'ego. W konsoli wpisujemy:
# pacman-key -r 5EE46C4C && pacman-key --lsign-key 5EE46C4C
Teraz synchronizujemy bazę pacmana:
# pacman -Syy
Pojawi się nam całe mnóstwo nowych kerneli, których nazwa rozpoczyna się od linux-ck. Kernel linux-ck, który został oznaczony wyłącznie numerem wersji jest pozbawiony optymalizacji dla określonego typu procesora. Pozostałe kernele, jak np. linux-ck-piledriver, linux-ck-silvermont itd. są kernelami zoptymalizowanymi, których kompilacja została wykonana z użyciem patcha graysky'ego. Osobiście sądzę, że lepiej jest zainstalować ów dostosowany do naszego procesora kernel. Właściwą nazwę rozpoznajemy po wydaniu w konsoli polecenia:
$ gcc -c -Q -march=native --help=target | grep march
W wyniku jego działania otrzymamy wynik wyglądający np. tak:
  -march=                               bdver2
Interesująca dla nas część, to informacja znajdująca się za -march=, czyli w tym przypadku bdver2. Teraz odnajdujemy jakiej nazwie kernela ona odpowiada z poniższej przedstawionej listy.
Dla procesorów Intela będą to:
bonnel - atom
silvermont - silvermont
core2 - core2
nehalem - nehalem
sandybridge - sandybridge
ivybridge - ivybridge
haswell - haswell
broadwell - broadwell
skylake - skylake
pentium4 - p4
prescott - p4
nocona - p4
pentm - ck
pentm - ck
pentium-m - ck
Dla procesorów AMD:
athlon - kx
athlon-4 - kx
athlon-tbird - kx
athlon-mp - kx
athlon-xp - kx
k8-sse3 - kx
amdfam10 - k10
btver1 - bobcat
bdver1 - bulldozer
bdver2 - piledriver
Lewa kolumna listy oznacza wynik jaki uzyskujemy wpisując powyżej przedstawioną komendę po "-march=", zaś prawa odpowiada nazwie kernela występującej po oznaczeniu linux-ck. Jeśli się zdecydujemy na instalację dostosowanych kerneli, to musimy w tej samej wersji instalować pliki nagłówkowe, czy sterowniki nvidia lub moduły virtualbox czy sterowniki dla kart wifi broadcom-wl.
Paczki w repo-ck są podzielone na grupy, które odpowiadają wpisom umieszczonym w powyższej liście poprzedzonym prefiksem ck-. Jedynie dla podstawowej linii kerneli musimy wpisać ck-generic.
Po instalacji wybranego kernela musimy o tym oczywiście poinformować stosowany przez nas program rozruchowy (np. GRUB2). W tym ostatnim przypadku będzie to:
# grub-mkconfig -o /boot/grub/grub.cfg
Jak już może się zorientowaliście, repozytorium dostarcza nie tylko kerneli, ich pliki nagłówkowe, ale również sterowniki nvidia w różnych wersjach, sterowniki broadcom-wl oraz moduły virtualbox. Jeśli zdecydowaliśmy się na korzystanie ze kerneli linux-ck, to mając sprzęt, który ich wymaga musimy również zastosować te sterowniki dla linux-ck.

Kernele linux-ck udostępniane przez graysky'ego mają również wbudowanego alternatywnego (dla domyślnego CFQ) planistę I/O pod nazwą BFQ. Nie jest on jednakże uruchomiony automatycznie (to możemy dokonać kompilując kernel). Uruchomić go możemy dodając wpis elevator=bfq w linii poleceń kernela i oczywiście przebudować program rozruchowy. Możliwe jest również uruchomienie tego planisty dla określonego urządzenia dyskowego. Jest to rozwiązanie ciekawe w przypadku stosowania w tym samym komputerze dysków talerzowych oraz SSD, albowiem te ostatnie - wg wszelkich danych - najlepiej używać z planistą noop. Jeśli takie rozwiązanie komuś będzie potrzebne, zapraszam na forum, albo do lektury niżej podanych stron.

Więcej dowiecie się m.in. z:
- strona na wiki Archa o kernelu linux-ck,
- strona na wiki Archa o repozytorium repo-ck,
- strona graysky'ego (wraz z podanymi na niej linkami)