Chromebook won't boot since linux-armv7-5.16.1-1 update

This forum is for topics dealing with problems with software specifically in the ARMv7h repo.

Chromebook won't boot since linux-armv7-5.16.1-1 update

Postby autumnontape » Sun Jan 23, 2022 6:10 am

Thank you for updating linux-armv7! I'm looking forward to using it, but I have a Hisense Chromebook C11, and it won't move past a black screen (with backlight on) when I try to boot from the microSD card I have ALARM installed on. I have to hold the power button to turn it off. Today I tried updating to linux-armv7-5.16.2-2 (by using proot on my x86_64 laptop), but the results are the same with the newer kernel.

I looked at the systemd journal, but there was nothing there. It seems the boot doesn't even progress far enough to start writing to the journal. I don't know how to move forward from here, and I'd appreciate it if anyone could help to point me in the right direction.

I asked about this in another thread first, but I haven't gotten any responses there.
autumnontape
 
Posts: 7
Joined: Fri Dec 31, 2021 12:40 am

Re: Chromebook won't boot since linux-armv7-5.16.1-1 update

Postby armuseru » Thu Jan 27, 2022 11:34 pm

I could be totally mistaken, but since installation guide of archlinuxarm for your device similar to guide for xe303c12 I just made an assumption that it has similar uboot. In that case it may have similar peculiarities, like did not load large kernels. Some solution for xe303c12 that was work earlier for me https://archlinuxarm.org/forum/viewtopic.php?f=47&t=15169&p=67825#p67825
I believe that kernel.its for you device should be like:
Code: Select all
/dts-v1/;

/ {
    description = "Chrome OS kernel image with one or more FDT blobs";
    #address-cells = <1>;
    images {
        kernel {
            description = "kernel";
            data = /incbin/("/boot/zImage");
            type = "kernel_noload";
            arch = "arm";
            os = "linux";
            compression = "none";
            load = <0>;
            entry = <0>;
        };
        fdt-veyron-jerry {
            description = "rk3288-veyron-jerry.dtb";
            data = /incbin/("/boot/dtbs/rk3288-veyron-jerry.dtb");
            type = "flat_dt";
            arch = "arm";
            compression = "none";
            hash {
                algo = "sha1";
            };
        };
    };
    configurations {
        default = "conf-veyron-jerry";
        conf-veyron-jerry {
            kernel = "kernel";
            fdt = "fdt-veryon-jerry";
        };
    };
};
armuseru
 
Posts: 34
Joined: Sat Jan 09, 2021 9:36 am

Re: Chromebook won't boot since linux-armv7-5.16.1-1 update

Postby JVital » Thu Mar 17, 2022 2:19 am

Thanks for pointing us in the right direction armuseru! I also have a Hisense Chromebook C11 (Veyron Jerry) that failed to boot after the 5.16.x kernel update due to the larger kernel size.

Your kernel.its file is exactly correct. The kernelinst script, however, needs to be slightly different. Here's the slightly modded script that worked for me:

Code: Select all
#!/bin/bash
if [ "$(whoami)" == "root" ]; then

# resign kernel

echo "
You may re-sign kernel and customize kernel boot string.
Regular user do not need it, so it is safe to press n.
Do you want to do this? (y/n)
"
read -r tmpvar1
if $(echo $tmpvar1 | grep -q [Yy]); then
    bootcmd='console=tty0 init=/sbin/init root=PARTUUID=%U/PARTNROFF=1 rootwait rw noinitrd'
    echo "default bootcmd is

$bootcmd

Be very careful, without init=/sbin/init root=PARTUUID=%U/PARTNROFF=1
or something like that your could get a bootfail.
Now you may specify a new one or just press Enter"
    tmpvar2=""
    read -r tmpvar2
    if [ ! -z "$tmpvar2" ]; then
        bootcmd="$tmpvar2"
    else
        echo "Will be used default boot string
   "
    fi
        #
        mkimage -D "-I dts -O dtb -p 2048" -f /boot/reflash/kernel.its /tmp/vmlinux.uimg
        # make empty bootloader
        dd if=/dev/zero of=/tmp/bootloader.bin bs=512 count=1
       
        echo $bootcmd > /tmp/cmdline
       
        # backup default vmlinux.kpart
        mv -f /boot/vmlinux.kpart /boot/vmlinux.old
       
        # final step
        vbutil_kernel \
        --pack /boot/vmlinux.kpart \
        --version 1 \
        --vmlinuz /tmp/vmlinux.uimg \
        --arch arm \
        --keyblock /boot/reflash/kernel.keyblock \
        --signprivate /boot/reflash/kernel_data_key.vbprivk \
        --config /tmp/cmdline \
        --bootloader /tmp/bootloader.bin
       
        # clear used files
        rm -f /tmp/vmlinux.uimg /tmp/cmdline /tmp/bootloader.bin
fi

# flash kernel

  krnprts=""
  krnprtc=0
  for i in $(ls /dev | grep -x --regexp="mmcblk[0-9]" --regexp="sd[a-z]" --regexp="vd[a-z]"); do
    if $(cgpt show /dev/$i | grep Label | grep -q [Kk]ernel); then
      if $(echo $i | grep -q mmcblk); then
        krnprts+="$i""p$(cgpt show /dev/$i | grep Label | grep [Kk]ernel -m 1 | sed 's/  / /g' | sed 's/  / /g' | sed 's/ La.*//g' | sed 's/.* //g') "
      else
        krnprts+="$i$(cgpt show /dev/$i | grep Label | grep [Kk]ernel -m 1 | sed 's/  / /g' | sed 's/  / /g' | sed 's/ La.*//g' | sed 's/.* //g') "
      fi
      krnprtc=$(($krnprtc+1))
    fi
  done
 
  echo ""
  if [ "$krnprtc" -eq 0 ]; then
    echo "Chrome OS kernel partition did not detected."
    echo "You must reflash kernel manually."
  elif [ "$krnprtc" -eq 1 ]; then
    echo "Finded ChromeOs kernel partition - $krnprts"
    echo "Do you want to flash a new kernel to it? (y/n)"
    read -r shouldwe
    if [[ $shouldwe =~ ^([yY][eE][sS]|[yY])$ ]]; then
      dd if=/boot/vmlinux.kpart of=/dev/$krnprts
      sync
    else
      echo "You may flash kernel manually like:"
      echo "dd if=/boot/vmlinux.kpart of=/dev/$krnprts"
    fi
  else
    echo "Finded more than one Chrome OS kernel partition."
    echo "You need to select next action
    "
    echo "0 for do not flash"
    numpart=0
    for i in $krnprts; do
      numpart=$(($numpart+1))
      echo "$numpart for flash $i partition"
    done
    echo ""
    echo "Wrong partition may lead to bootfail. Be aware!"
    read -r shouldwe
    if [ $shouldwe -gt 0 ]&&[ $shouldwe -le $numpart ]; then
      numpart=0
      for i in $krnprts; do
        numpart=$(($numpart+1))
        if [ $numpart -eq $shouldwe ]; then
          dd if=/boot/vmlinux.kpart of=/dev/$i
          sync
        fi
      done
    fi
  fi
else
  echo superuser rights required
fi


I can confirm it works both within Arch (if you remember to run it before rebooting after a kernel update), and in a chroot from ChromeOS (which is where you'll do it when you invariably forget lol).

I'm now happily running the 5.16.13 kernel with this patch. I'm having issues with RTL-SDR dongles, but I think that's unrelated.

Thanks again!
JVital
 
Posts: 2
Joined: Thu Mar 17, 2022 2:00 am


Return to ARMv7h

Who is online

Users browsing this forum: No registered users and 1 guest