Jak wgrać custom kernel dla SAMSUNG'a

Niestety, z przykrością stwierdzam, że SAMSUNG nie chce, abyś wgrywał własnego linuksa. Stara się utrudnić ten proces. Ale od początku. 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). Na YouTube widziałem filmik, w którym ktoś w ten sposób wgrał customowy kernel, ale to był jakiś samsung z androidem 2.6 (galaxy sII?). Ja mam z 5.0.2 z 2014 roku. Chyba samsung usuną tę opcję i teraz jedynym sposobem jest wgranie nowego kernela przez flashowanie partycji boot (mkbootimg, boot.img). To też zrobiłem. Ale dlaczego się nie udało?

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.

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. 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.

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.

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.

Jednak- tak jak napisałem, to nie ma sensu, bo jest tiwoizacja. Postaram się jeszcze spróbować z samsung galaxy grand neo plus i a5 2016 i napiszę aktualizację. Tylko nie prędko, bo pobieranie przez samsung opensource center trwa 2h (prędkość 50kB/s);(((((