Jak wgrać custom kernel na SAMSUNG'a

Ten wpis jest dla trochę bardziej zaawansowanych użytkowników. Android jest systemem opartym na linuksie. Każdy model telefonu zawiera linuksa przystosowanego do danego urządzenia (zawiera sterowniki). Kernel oznacza po angielsku jądro systemu operacyjnego. Linux Kernel jest otwartoźródłowy i jego licencja GNU GPL v2 wymaga udostępnienia zmodyfikowanego kodu źródłowego. Zanim opiszę, jak zdobyć kod źródłowy dla naszego modelu telefonu, skompilować (i możliwie spatchować do najnowszej wersji) opiszę moje zmagania z tym.

STARAŁEM SIĘ WGRAĆ SWÓJ KERNEL. NIESTETY TIWOIZACJA MNIE POKONAŁA

Kiedy już odpakowałem (to był chyba zip), miałem pliki Kernel.tar.gz, Platform.tar.gz, README_Kernel, README_Platform. Odpakowałem kernel, a więc cat Kernel.tar.gz | gzip -cd | tar xvf -

Archiwum zostało odpakowane, do katalogu, w którym się znajdowałem. Zrobiło mi to bałagan. Aby zrobić takie archiwum jak Kernel.tar.gz należałoby wpisać: 

~/kernel/ > tar cf - . | gzip > ../Kernel.tar.gz

Uważam, że to było celowe działanie samsunga, bo nikt w ten sposób tarbali nie robi.

Pierwsze próby kończyły się niepowodzeniem. W skrypcie build_kernel.sh był haczyk

cp output/arch/kernel/arm/boot/Image arch/arm/kernel/boot/zImage

Jestem wtajemniczony w linuksa i od razu, gdy zobaczyłem tę linijkę, zrozumiałem co jest nie tak.

bzImage - gotowa skompresowana binarka linuksa, x86, x86_64

zImage - gotowa skompresowana binarka linuksa, arm, arm64 i inne

Image - niegotowy nieskompresowany linux, on nie ma prawa się zbootować

W "README_Kernel" było napisane: aby uruchomić wykonać tarball z arch/arm/kernel/boot/zImage i następnie go wgrać ('how to prepare kernel for downloading to target'). Nie było powiedziane, że przez odin3, ale odin to jedyne oficjalne narzędzie służące do tego, więc w AP wstawiłem tarball linuksa, telefon uruchomiłem w download mode, zgłosił się i kliknąłem "start". Na telefonie wyświetlił się komunikat "unsupported dev_type" i "file too large" (kiedy zrozumiałem haczyk ze skryptem build_kernel.sh, już nie było tego drugiego komunikatu). Jest to drobne utrudnienie, ale nie stoi na przeszkodzie. 

QUALCOMM SECUREBOOT: ENABLE (CSB)

Omawiany przeze mnie telefon to samsung galaxy grand prime, posiadający System-on-Chip Snapdragon 410, opcja Secureboot została dokladnie opisana tutaj. Secureboot sprawdza sygnaturę w boot.img linuksa i ramdisku (initramfs). Nie jest możliwe uruchomienie jakiegokolwiek zmodyfikowanego linuksa, który nie będzie miał odpowiedniego certyfikatu. 

"it basically checks the boot.img and won't boot if it wo..."

Dlatego moje próby wgrania własnego kernela kończyły się na logu "samsung kernel grand prime powered by android", na górze napis "Set warranty bit : kernel". Nie było napisu "KERNEL IS NOT SEANDROID ENFORCING". Szczerze nie rozumiem, o co z tym chodzi, ale patrząc na skrypt "build_msm8916_kernel.sh" dla parametru -E uruchamia echo -n "SEANDROIDENFORCE" >> $PRODUCT_OUT/boot.img. Ta komenda magicznie sprawia, że ten nieprzyjemny czerwony napis znika.

Chociaż snapdragon 410 ma możliwość secureboot, w modelu G530-FZ można wgrać custom recovery bez problemu. W nowszych samsungach zdecydowanie utrudnili to zadanie, trzeba po wgraniu recovery od razu do niego zbootować, inaczej zostanie nadpisany.

Dobrze, jak skompilować te jądro czy coś

Ufff, teraz gdy już napisałem, dlaczego moim zdaniem nie warto się za to zabierać, mogę przejść do sedna. Pierwszym krokiem jest zdobycie kodu źródłowego. Najlepiej wpisz w wyszukiwarkę "nazwatwojegoproducenta opensource". LG/Huawei/Samsung mają swój "open source center", a xiaomi z tego co wiem ma na githubie. Pobierz również kompilator dla arm / arm64 (aarch64), możesz go zainstalować poprzez paczkę od ubuntu (gcc-arm-none-eabi) albo od Google arm-eabi-4.7. Zawsze można wykorzystać na miejsce 4.7 wersję 4.9, stare linuksy nie można skompilować z gcc-5. Przy kompilacji użyj zmiennej $CROSS_COMPILE (w moim przypadku ustawiona jest na "CROSS_COMPILE=$(pwd)/arm-eabi-4.7/bin/arm-eabi-"). Zmienna musi być ARCH=arm.

Tutaj jedna moja ważna uwaga- nie uruchamiaj make menuconfig ani żadnej innej komendy związanej z ustawieniami konfiguracji linuksa (mam na myśli allnoconfig allyesconfig xconfig config), ponieważ i tak zostanie one nadpisane przez skrypt,

make VARIANT_DEFCONFIG=msm8916_sec_fortuna_eur_defconfig msm8916_sec_defconfig SELINUX_DEFCONFIG=selinux_defconfig

ponieważ są trzy pliki konfiguracyjne. Moja rada: wykonaj oddzielny plik, w którym będą określone ustawienia, tzn. np. CONFIG_costam=y. O tym, jak brzmią te ustawienia, możesz sprawdzić będąc w menuconfig, wybierając dane ustawienie i klikając "h"

ARM Accelerated Cryptographic Algorithms
CONFIG_ARM_CRYPTO:

Say Y here to choose from a selection of cryptographic algorithms
implemented using ARM specific CPU features or instructions.

Symbol: ARM_CRYPTO [=n]
Type : bool
Prompt: ARM Accelerated Cryptographic Algorithms
Defined at arch/arm/crypto/Kconfig:3
Depends on: CRYPTO [=y] && ARM [=y]

a wiec ARM_CRYPTO=y w podanym przykładzie.

Jak zaaktualizować linuksa?

Jak sprawić, aby kernel był bezpieczny i z nowymi funkcjami? Polecam utworzyć repo git i po prostu merge albo cherry-pick od repozytorium linuksa. Tutaj jest świetny poradnik.

Polecam wykorzystać do tego kernel/common oraz kernel-msm. Są to wersje bardzo zbliżone do tego co mamy w tym samsungu.

Końcowe kroki

Kiedy skompilujesz

1. wykonaj kopię oryginalnej partycji boot

musisz mieć roota. Nie masz? To proste. Wystarczy, że pobierzesz i wgrasz custom recovery, najlepiej tak jak ja twrp. Następnie wyłącz telefon i naciśnij kombinacje klawiszy Volume up + home + power i podłącz do komputera. Gdyby samsungi miały fastboot mode można było by odrazu zbootować w twrp bez zapisywania.

franek@franek-MS-7808:~/linux-5.1.15$ adb devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
33002b8cc98c7363 recovery
franek@franek-MS-7808:~/linux-5.1.15$ adb shell
~ # cd /dev/block/bootdevice/by-name
/dev/block/bootdevice/by-name # ls -l
lrwxrwxrwx 1 root root 21 Jul 17 17:41 BOOT -> /dev/block/mmcblk0p10

Istnieją oczywiście inne partycje niż boot, ale ciebie interesuje tylko ta jedna. Zrób jej kopie, a więc w tym przypadku cat /dev/block/mmcblk0p10 > /sdcard/boot.img i zrób sumę kontrolną md5sum /sdcard/boot.img. Kopie zapisz najlepiej na chmurze.

2. Za pomocą unpackbootimg wypakuj boot.img i wykonaj swoją partycję boot.img przez mkbootimg nastepnie boot.img spakuj do tarballa (tar cvf smg530fz.tar boot.img) i w odin w AP wybierz ten tarball.

Polecam sklonować repozytorium z github, Samsung opensource center jest bardzo bardzo powolny.