logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

i.MX6 buildroot: Fatal: Kernel too old po dodaniu gcc, glibc

ienecode 06 Kwi 2019 19:30 2355 58
Najlepsze odpowiedzi

Jak uruchomić obraz Buildroot z gcc i glibc na i.MX6 SC200, skoro po starcie pojawia się komunikat „Fatal: Kernel too old”?

Problem nie wynika z samego dodania gcc i glibc, tylko z niedopasowania obrazu do sprzętu: U-Boot nadal uruchamia kernel z pamięci wewnętrznej, a Twój nowy rootfs/DTB z SD nie pasuje do tego starego jądra [#17894367][#17897174] W logach widać też rozjazd wersji jądra: oryginalne ma 3.14.28, a zbudowane przez Ciebie 4.9.11, więc najpierw trzeba mieć poprawnie działający kernel i właściwy device tree [#17897174][#17902586] Najprościej użyć źródeł kernela dostarczonych przez producenta albo repozytorium `https://github.com/etwoc/linux-fslc-e2c.git`, ustawić w Buildroot `Kernel version` na `Custom Git Repository`, `Custom repository version` na `HEAD`, a jako konfigurację kernela wskazać lokalny plik `sc200_defconfig` [#17923576][#17926490] Dla tej płytki trzeba też ustawić w Buildroot nazwę DT source file na `imx6dl-sc200-ldo`, bo użycie `imx6dl-sabresd.dtb` powodowało błędy startu i brak wykrycia SD oraz sieci [#17940228][#17978961] Jeśli budowanie dalej się sypie, usuń `output/images/`, `output/build/kernel-HEAD/` i `output/build/uboot-rel_imx_4.9.x_1.0.0_ga/`, przebuduj od zera i dopiero potem dopasowuj U-Boota, żeby ładował kernel i DTB z karty SD zamiast z eMMC [#17940228][#17927585]
Wygenerowane przez model językowy.
  • #1 17889765
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Witam,

    Robię sobie próby z budowanie linuxa za pomocą buildroot'a.

    Pierwszy test to wybranie predefiniowanej konfiguracji : freescale_imx6dlsabresd_defconfig

    Po zbudowaniu systemu i przerzuceniu go na kartę SD system uruchamia się na docelowym sprzęcie.

    Kolejny test to dodanie do wcześniej zbudowanej wersji gcc, glibc i tu problem. Pomimo poprawnego zbudowania systemu nie uruchamia się. Komuniakt to:
    Fatal: Kernel too old.

    W czym może być problem ?
  • #2 17889809
    Konto nie istnieje
    Poziom 1  
  • #3 17889823
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    @stmx Rozumię że mogę to sprawdzić tylko z poziomu "make menuconfig" ?
    Bo tak jak mówiłem nie uruchamia się mi na zbudowanym systemie.
  • #4 17889834
    Konto nie istnieje
    Poziom 1  
  • #5 17889837
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    W menuconfig:
    Custom kernel headers series (4.9.x)
    Kernel version (Custom Git Repository ) ---> https://source.codeaurora.org/external/imx/linux-imx.git URL of (rel_imx_4.9.x_1.0.0_ga)

    Dodano po 1 [minuty]:

    @stmx Chodzi ci o to jaka mam wersję glibc na hoscie z którego uruchamiam buildroot'a?

    Dodano po 2 [minuty]:

    Damian7546 napisał:
    Kolejny test to dodanie do wcześniej zbudowanej wersji gcc, glibc i tu problem. Pomimo poprawnego zbudowania systemu nie uruchamia się. Komuniakt to:
    Fatal: Kernel too old.


    Ale nie dodaję gcc i glibc na działającym systemie tylko z poziomu make menuconfig i przebudowuję system na hoscie. Następnie wrzucam go od nowa na kartę SD i uruchamiam - z tym że nie uruchamia się bo wyrzuca błąd jak pisałem

    Dodano po 4 [minuty]:

    Poniżej log z próby uruchomienia systemu na docelowym komputerze - gdy system zbudowany z toolchainem, glibc...

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    I poniżej log z uruchomienia systemu bez toolchaina, libc ..

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Dodano po 13 [godziny] 11 [minuty]:

    @stmx Opisze może problem od początku. Próbuję ogarnąć rozruch, budowanie linuxa wbudowanego w celach edukacyjnych

    Na urządzeniu które próbuję uruchomić z własnym zbudowanym linuxem jest możliwość uruchomienia linuxa z wewnętrznej pamięci wykrywanej jako mmcblk3p1.

    Ja próbuję uruchomić system z karty SD. A więc przy starcie komputera wszedłem w bootloadera i ustawiłem zmienną środowiskową jak poniżej:

    setenv rootfsinfo 'root=/dev/mmcblk2p2 rootwait rw'
    saveenv

    I dzięki temu startuje mój zbudowany linux.
    Problem pojawia się gdy na moim hoscie (Ubuntu) gdzie buduję linuxa za pomocą builtroota dodaje w 'make menuconfig' toolchaina z glibc wtedy to nie uruchamia mi się zbudowany system na docelowym komputerze.

    Rozumię ze ww. zmienna środowiskowa uruchamia mi jądro i rootfs'a z SD ?
    Chyba nie ma sytuacji że jądro odpala się z wewnętrznej pamięci a tylko rootfs z SD?
  • #6 17894367
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Ta zmienna środowiskowa wybiera Ci tylko rootfs z karty, jadro w dalszym ciągu uruchamia się z wewnętrznej pamięci - tak wynika z logu. I ewidentnie wybudowany rootfs (init) jest z tym starym jądrem niekompatybilny.
    Musisz jeszcze zmienić konfiguracje U-boota aby jądro też zaciągał z karty (o ile tam je masz).
    Niestety, nie jestem (jeszcze) ekspertem od konfiguracji U-boota.
  • #7 17894547
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    @szelus no właśnie tu najprawdopodobniej jest problem... trzeba doczytać

    Dodano po 9 [minuty]:

    Chyba buildroot buduje od razu jądro:
    Gdy wypalam obraz na SD to mam partycję
    FAT z plikami:
    zImage i imx6dlsabresd.dtb
    i Ext2 z rootfs'em ...
    Rozumię że w FAT jest jądro ?
  • #8 17894983
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Tak, zImage to jądro. Jeżeli możesz, to wywołaj komendę printenv U-Boota i wklej tutaj wynik. Spróbujemy coś wymyślić
  • #9 17896223
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Poniżej zmienne z uboot'a :
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Dodano po 5 [minuty]:

    Zapewne któryś z poniższych parametrów trzeba by podmienić :
    Ale te adresy będą takie same ?
    Kod: Bash
    Zaloguj się, aby zobaczyć kod
  • #10 17896258
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Spróbowałbym:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod
  • #11 17896266
    Konto nie istnieje
    Poziom 1  
  • #12 17896272
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    szelus napisał:
    Spróbowałbym:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Niestety, po zmianie mmcdev na 2 :

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Dodano po 36 [minuty]:

    Fragment z "Linux podstawy i aplikacje dla systemów embedded"
    i.MX6 buildroot: Fatal: Kernel too old po dodaniu gcc, glibc

    Dodano po 1 [minuty]:

    Nie rozumie gdzie wskazywana jest partycja z jądrem.

    Dodano po 7 [minuty]:

    Obstawiałbym tą zmienną
    mmcroot=/dev/mmcblk2p2 rootwait rw

    ale jej zmiany nie da się zapisać ...

    Dodano po 20 [minuty]:

    Zmieniłem zmienna mmcdev jak niżej:

    setenv mmcdev 0

    efektem było to że zatrzymało się na odczycie pliku zImage z informacją że nie może odnaleźć imx6dl-sc200-ldo.dtb . Zmieniłem więc nazwę na karcie SD pliku z rozszerzeniem .dtb na szukaną przez uboota i coś ruszyło ....

    Nie uruchamia się fsroot tylko ciągle sypie komunikatem :

    max11801_ts 1-0048: FIFO_RD_AUX_MSB read failed (-6)
    max11801_ts 1-0048: FIFO_RD_AUX_MSB read failed (-6)

    Dodano po 26 [minuty]:

    Teraz napewno startuje jądro z buildroot'a:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Tylko jakieś komplikacje ze startem :)
  • #13 17897174
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Z logu wynika, że Twój nowy Linux nie widzi karty SD.
    Porównałem oba logi starującego Linuxa, które zamieściłeś i niestety są z innej bajki.
    Oryginalny kernel jest 3.14.28 a Twój 4.9.11. Tak się nie da pracować.
    Musisz zacząć od ściągnięcia, wybudowania i przetestowania jakiejś działającej konfiguracji buildroot'a, zanim zaczniesz ją modyfikować.
    Nie napisałeś jaką masz płytkę i skąd wziąłeś inicjalną konfigurację buildroot'a.
  • #14 17898222
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    @szelus I właśnie tutaj nie wiem jak podejść do sprawy.

    Komputer na którym robię próby to:
    https://etwoc.com/sc200-smart-connect-module/

    Pisze że jego macierzystą płytką jest i.mx6dlsabresd .

    Dlatego budując nowy fsroot i kernel wybrałem predefinicję z buildroota : freescale_imx6dlsabresd_defconfig .

    Komputer dostałem z gotowym systemem i jądrem zbudowanym przez YOCTO Porject znajdującym się w wewnętrznym flashu.
    Ja dla nauki chciałbym uruchomić ten komputer z jądra i fsroota zbudowanego przez buildroota używając karty SD.
    Rozumię że predefinicja freescale_imx6dlsabresd_defconfig z buildroot'a nijak nie ma się do mojego komputera ?
    W takim razie jak podejść do tematu ?
  • #15 17898915
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Nie wygląda to za ciekawie.
    Masz płytkę, dla której publicznie nie jest dostępna praktycznie żadna dokumentacja (chyba, że coś przeoczyłem). Masz coś więcej, niż jest na tej stronie?
    Płytka, nawet jeżeli bazuje na i.mx6dlsabresd (skąd pochodzi ta informacja?), to ewidentnie jest zmodyfikowana, ale nie wiadomo jakie dokładnie są te modyfikacje, a ma to wpływ na konfigurację driverów.
    Konfiguracja buildroot'a nie jest do końca poprawna, jądro zgłasza trochę błędów na starcie i przede wszystkim nie widzi karty SD (chociaż widzi kontroler) - dlatego start utyka na dostępie do rootfs.
    Masz chociaż źródła oryginalnego jądra (tego Yocto)?
  • #16 17899138
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Nie ma za wiele. Mam gotowe pliki bootloadera, kernela i fsroota oraz dokument w który opisany jest reflashing narzędziem mfg tool oraz opis płytki - przesyłam w załączniku.
    Załączniki:
    • info_.txt (3.65 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • re_flashing.pdf (205.14 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #17 17899898
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Nie ma zbyt wielu opcji.

    1. Można zażądać od firmy, która dostarczyła binarki, odpowiadających im źródeł kernela - zgodnie z GPL są zobowiązani dostarczyć. Ale czy się przejmą...
    Na podstawie tych źródeł można by skonfigurować buildroot'a.

    2. Jeżeli nie 1, to pozostaje hackerstwo - trzeba wyciągnąć oryginalny plik dtd, zdekompilować i na tej podstawie spróbować skonfigurować kernel, a następnie buildroot'a. Wydaje mi się to możliwe, ale byłoby z tym dużo zabawy.
  • #18 17900263
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    szelus napisał:

    1. Można zażądać od firmy, która dostarczyła binarki, odpowiadających im źródeł kernela - zgodnie z GPL są zobowiązani dostarczyć. Ale czy się przejmą...
    Na podstawie tych źródeł można by skonfigurować buildroot'a.


    Spróbuję.

    Dodano po 14 [godziny] 3 [minuty]:

    @szelus Nawet gdy dostanę źródło kerenla i w buildroot wskażę na kernela z lokalnej lokalizacji to w efekcie nie będzie to samo jak robiłem na początku postu, tj. Kernel uruchamiałem z wewnętrznej pamięci - a więc oryginalny natomiast rootfs'a z buidroot'a ?
  • #19 17902586
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Głownie chodzi o konfiguracje kernela, w szczególności device tree.
    Jeżeli kernel nie wstaje poprawnie (a ten wybudowany przez Ciebie ma problemy przynajmniej z kontrolą zasilania oraz z wykryciem karty SD), to system nie będzie stabilny i dalsza zabawa ma raczej umiarkowany sens.
    Jak już potrafisz wybudować poprawnie działający kernel, to można bawić się z konfiguracją oprogramowania w przestrzeni użytkownika - to jest mniej krytyczne.
    Wtedy można też myśleć o upgradzie jądra do nowszej wersji.
  • #21 17922754
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Trochę mnie nie było tutaj z powodu Świąt. Ściągnę to sobie i popatrzę.
    W zasadzie zacząłbym od skompilowania tego kernela "z ręki" i podmiany w image-u, ale możesz też spróbować dodać go tak, jak poprzednio (jako custom) i zobaczyć co się pojawi w konfiguracji i czy da się wybudować...
  • #22 17923151
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    @szelus No właśnie zastanawiam się jak dodać kernel do buildroota.
    W Kernel-> Kernel wersion (Custom Git repository) usuwam ściezke z gita i w
    Kernel-> Custom reposiotry version też usuwam.
    Dodaję w Custom Kernel patches scieżkę do /home/damian/Desktop/linux-fslc-e2c-e2c/kernel

    ale tak nie działa ... Chyba że to nie tak ?
  • #23 17923237
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    A nie działa tak, jak poprzednio? Ze wskazaniem tego URL, co dostałeś, jako custom repository?
  • #24 17923304
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Tz Kernel version i custom repository version zostawić bez zmian natomiast do Custom Kernel Patches dodać ścieżkę /home/damian/Desktop/linux-fslc-e2c-e2c/kernel ??
    To nie rozumie jak to ma zadziałać ? Jakie jądro mi zbuduje ?

    Dodano po 52 [minuty]:

    Gdy pozostawiam w freescale_imx6dlsabresd_defconfig wszystko bez zmian i dodaję tylko w "Kernel->Custom Kernel patches" scieżkę /home/damian/Desktop/linux-fslc-e2c-e2c/kernel

    to kompilacja kończy się błędem:

    Kod: Bash
    Zaloguj się, aby zobaczyć kod
  • #26 17924564
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    szelus napisał:
    defconfig powinien być wzięty ten z linux-fslc-ec2.

    Jak to zrobić w buildroot ?
    Skopiowanie defconfig od e2c do katalgou buildroot/configs nadanie mu nazwy e2c_defconfig i uruchomienie go make e2c_defconfig ? --> tak nie zadziała ...
  • #27 17926490
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Nie zrozumieliśmy się.
    Główny defconfig buildroot'a pozostaje bez zmian (freescale_...).
    Kopiujesz sobie lokalnie plik defconfig z linux-fslc-ec2. Uruchamiasz menuconfig i ustawiasz:
    
    Kernel-->
        Kernel version (Custom Git Repository ) --->
        (https://github.com/etwoc/linux-fslc-e2c.git) URL of custom repository 
        (HEAD) Custom repository version
        Kernel configuration (Using a custom (def)config file)  --->
        (podajesz ścieżkę do skopiowanego defconfig kernela) Configuration file path
    

    I tyle. Sprawdziłem - buduje się.
  • #28 17926578
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    (HEAD) Custom repository version , co oznacza wpis HEAD ?
  • #29 17927161
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Odwołuje się do najnowszej wersji dostępnej w repozytorium git.
    Nie jest to najlepsze rozwiązanie, ale ponieważ repozytorium nie jest otagowane, to aby odwołać się do konkretnej wersji, możesz ewentualnie użyć szesnastkowego identyfikatora commit'a.
  • #30 17927203
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Ok, zbudował mi sie system zgodniez twoimi zaleceniami.
    Po przebudowaniu dodałem w make menuconfig :
    Toolchain: [*]Enable WCHAR support, oraz [*]Enable C++ support.
    Kolejny raz uruchomiłem make i przeszło bez błędów.

    Następnie dodałem : Target packages -> Interpreter languages and script -> [*]nodejs
    I tym razem make nie przeszedł.


    Błąd jak niżej:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

✨ Użytkownik napotkał problem podczas budowy systemu Linux za pomocą Buildroot dla platformy i.MX6, gdzie po dodaniu gcc i glibc system nie uruchamia się, zgłaszając błąd "Fatal: Kernel too old". W trakcie dyskusji poruszono kwestie związane z wersjami jądra i glibc, konfiguracją U-Boot oraz problemami z detekcją karty SD. Użytkownik dowiedział się, że jądro powinno być uruchamiane z karty SD, a nie z pamięci wewnętrznej. Wskazano na konieczność użycia odpowiedniego pliku Device Tree (DTB) oraz na problemy z konfiguracją, które mogą wpływać na działanie interfejsów sieciowych. Ostatecznie użytkownik uzyskał działający system, ale nadal występują problemy z widocznością kart sieciowych.
Wygenerowane przez model językowy.
REKLAMA