Build kernel using make-kpkg

- Use make-kpkg to build both the kernel and headers dpkgs.
- Install those into the rootfs instead of copying the Image/modules dir
- kernel-overlay contains a few tweaked files from
/usr/share/kernel-package -- these will be automatically used instead of
the stock ones
- Embiggen the boot partition - installing through apt requires space to
temporarily back-up the old kernel file. It's ~20M, so we need at least
40M -- 128M just to not have to do this again (hopefully).

Change-Id: I23573438774efe3d221210f45833cd15d5ca36a3
diff --git a/boot.mk b/boot.mk
index 0af7e9a..fbc5db9 100644
--- a/boot.mk
+++ b/boot.mk
@@ -7,9 +7,8 @@
 boot: $(PRODUCT_OUT)/boot.img
 
 $(PRODUCT_OUT)/boot.img: $(PRODUCT_OUT)/u-boot.imx $(PRODUCT_OUT)/kernel $(PRODUCT_OUT)/obj/BOOT_OBJ/boot.scr
-	fallocate -l 32M $(PRODUCT_OUT)/boot.img
+	fallocate -l 128M $(PRODUCT_OUT)/boot.img
 	mkfs.fat $(PRODUCT_OUT)/boot.img
-	mcopy -i $(PRODUCT_OUT)/boot.img $(PRODUCT_OUT)/kernel ::Image
 	mcopy -i $(PRODUCT_OUT)/boot.img $(PRODUCT_OUT)/obj/BOOT_OBJ/boot.scr ::
 	mcopy -i $(PRODUCT_OUT)/boot.img $(PRODUCT_OUT)/fsl-imx8mq-phanbell.dtb ::
 
diff --git a/kernel-overlay/pkg/image/postinst b/kernel-overlay/pkg/image/postinst
new file mode 100755
index 0000000..4ec364c
--- /dev/null
+++ b/kernel-overlay/pkg/image/postinst
@@ -0,0 +1,443 @@
+#! /usr/bin/perl
+#                              -*- Mode: Cperl -*-
+# debian.postinst ---
+# Author           : Manoj Srivastava ( srivasta@pilgrim.umass.edu )
+# Created On       : Sat Apr 27 05:55:26 1996
+# Created On Node  : melkor.pilgrim.umass.edu
+# Last Modified By : Manoj Srivastava
+# Last Modified On : Mon Apr 13 14:24:43 2009
+# Last Machine Used: anzu.internal.golden-gryphon.com
+# Update Count     : 362
+# Status           : Unknown, Use with caution!
+# HISTORY          :
+# Description      :
+#
+#    $Id: image.postinst,v 1.125 2003/10/07 16:24:20 srivasta Exp $
+#
+
+#
+#use strict; #for debugging
+use Cwd 'abs_path';
+use Debconf::Client::ConfModule qw(:all);
+version('2.0');
+my $capb = capb("backup");
+
+$| = 1;
+
+# Predefined values:
+my $version           = "=V";
+my $move_image        = '';     # target machine defined
+my $kimage            = "=K";   # Should be empty, mostly
+my $image_dir         = "=D";   # where the image is located
+my $clobber_modules   = '';     # target machine defined
+my $initrd            = "=I";   # initrd kernel
+my $postinst_hook     = '';     #Normally we do not
+my $postrm_hook       = '';     #Normally we do not
+my $preinst_hook      = '';     #Normally we do not
+my $prerm_hook        = '';     #Normally we do not
+my $ignore_depmod_err = '';     # normally we do not
+my $relink_src_link   = 'YES';  # There is no harm in checking the link
+my $relink_build_link = 'YES';  # There is no harm in checking the link
+my $force_build_link  = '';     # There is no harm in checking the link
+my $arch              = "=A";   #  should be same as dpkg --print-architecture
+my $kernel_arch       = "=B";
+my $package_name       = "=ST-image-$version";
+my $kernel_pkg_version = "=KPV";
+
+#known variables
+my $image_dest     = "/";
+my $realimageloc   = "/$image_dir/";
+my $have_conffile  = "";
+my $silent_modules = '';
+my $warn_reboot    = 'Yes';         # Warn that we are installing a version of
+                                    # the kernel we are running
+
+my $modules_base = '/lib/modules';
+my $CONF_LOC     = '/etc/kernel-img.conf';
+
+# Ignore all invocations except when called on to configure.
+exit 0 unless $ARGV[0] =~ /configure/;
+
+my $DEBUG = 0;
+
+# Do some preliminary sanity checks here to ensure we actually have an
+# valid image dir
+chdir('/') or die "could not chdir to /:$!\n";
+die "Internal Error: ($image_dir) is not a directory!\n"
+  unless -d $image_dir;
+
+# remove multiple leading slashes; make sure there is at least one.
+$realimageloc =~ s|^/*|/|o;
+$realimageloc =~ s|/+|/|o;
+die "Internal Error: ($realimageloc) is not a directory!\n"
+  unless -d $realimageloc;
+
+if ( -r "$CONF_LOC" && -f "$CONF_LOC" ) {
+  if ( open( CONF, "$CONF_LOC" ) ) {
+    while (<CONF>) {
+      chomp;
+      s/\#.*$//g;
+      next if /^\s*$/;
+
+      $move_image      = "" if m/^\s*move_image\s*=\s*(no|false|0)\s*$/i;
+      $clobber_modules = '' if m/^\s*clobber_modules\s*=\s*(no|false|0)\s*$/i;
+      $silent_modules  = '' if m/^\s*silent_modules\s*=\s*(no|false|0)\s*$/i;
+      $warn_reboot     = '' if m/^\s*warn_reboot\s*=\s*(no|false|0)\s*$/i;
+      $ignore_depmod_err = ''
+        if m/^\s*ignore_depmod_err\s*=\s*(no|false|0)\s*$/i;
+      $relink_src_link = '' if m/^\s*relink_src_link\s*=\s*(no|false|0)\s*$/i;
+      $relink_build_link = ''
+        if m/^\s*relink_build_link\s*=\s*(no|false|0)\s*$/i;
+      $force_build_link = ''
+        if m/^\s*force_build_link\s*=\s*(no|false|0)\s*$/i;
+
+      $move_image = "Yes" if m/^\s*move_image\s*=\s*(yes|true|1)\s*$/i;
+      $clobber_modules = "Yes"
+        if m/^\s*clobber_modules\s*=\s*(yes|true|1)\s*$/i;
+      $silent_modules = 'Yes'
+        if m/^\s*silent_modules\s*=\s*(yes|true|1)\s*$/i;
+      $warn_reboot = 'Yes' if m/^\s*warn_reboot\s*=\s*(yes|true|1)\s*$/i;
+      $ignore_depmod_err = 'Yes'
+        if m/^\s*ignore_depmod_err\s*=\s*(yes|true|1)\s*$/i;
+      $relink_src_link = 'Yes'
+        if m/^\s*relink_src_link\s*=\s*(yes|true|1)\s*$/i;
+      $relink_build_link = 'Yes'
+        if m/^\s*relink_build_link\s*=\s*(yes|true|1)\s*$/i;
+      $force_build_link = 'Yes'
+        if m/^\s*force_build_link\s*=\s*(yes|true|1)\s*$/i;
+
+      $image_dest    = "$1" if m/^\s*image_dest\s*=\s*(\S+)/i;
+      $postinst_hook = "$1" if m/^\s*postinst_hook\s*=\s*(\S+)/i;
+      $postrm_hook   = "$1" if m/^\s*postrm_hook\s*=\s*(\S+)/i;
+      $preinst_hook  = "$1" if m/^\s*preinst_hook\s*=\s*(\S+)/i;
+      $prerm_hook    = "$1" if m/^\s*prerm_hook\s*=\s*(\S+)/i;
+      $mkimage       = "$1" if m/^\s*mkimage\s*=\s*(.+)$/i;
+      $ramdisk       = "$1" if m/^\s*ramdisk\s*=\s*(.+)$/i;
+    } ## end while (<CONF>)
+    close CONF;
+    $have_conffile = "Yes";
+  } ## end if ( open( CONF, "$CONF_LOC"...))
+} ## end if ( -r "$CONF_LOC" &&...)
+else {
+  if ( open( CONF, ">$CONF_LOC" ) ) {
+    print CONF "# Kernel Image management overrides\n";
+    print CONF "# See kernel-img.conf(5) for details\n";
+    if ( $loader =~ /palo/i ) {
+      print CONF "link_in_boot = Yes\n";
+      print CONF "do_symlinks = Yes\n";
+      print CONF "relative_links = Yes\n";
+    }
+    else {
+      print CONF "do_symlinks = No\n";
+      print CONF "do_bootloader = No\n";
+      print CONF "do_initrd = Yes\n";
+      print CONF "link_in_boot = No\n";
+
+    } ## end else [ if ( $loader =~ /palo/i)]
+    close CONF;
+    $have_conffile = "Yes";
+  } ## end if ( open( CONF, ">$CONF_LOC"...))
+} ## end else [ if ( -r "$CONF_LOC" &&...)]
+
+# For some versions of kernel-package, we had this warning in the
+# postinst, but the rules did not really interpolate the value in.
+# Here is a sanity check.
+my $pattern = "=" . "I";
+$initrd =~ s/^$pattern$//;
+
+# Tack on at least one trainling /
+$image_dest = "$image_dest/";
+$image_dest =~ s|^/*|/|o;
+$image_dest =~ s|/+$|/|o;
+
+if ( !-d "$image_dest" ) {
+  die
+    "Expected Image Destination dir ($image_dest) to be a valid directory!\n";
+}
+
+# most of our work is done in $image_dest (nominally /)
+chdir("$image_dest") or die "could not chdir to $image_dest:$!\n";
+
+# Paranoid check to make sure that the correct value is put in there
+if ( !$kimage ) { $kimage = "vmlinuz"; }    # Hmm. empty
+elsif ( $kimage =~ m/^b?zImage$/o ) {
+  $kimage = "vmlinuz";
+}                                           # these produce vmlinuz
+elsif ( $kimage =~ m/^[iI]mage$/o ) { my $nop = $kimage; }
+elsif ( $kimage =~ m/^vmlinux$/o )  { my $nop = $kimage; }
+elsif ( $kimage =~ m/^xen[0u]-linux$/o ) {
+  $package_name = "${kimage}-$version";
+}
+elsif ( $kimage =~ m/^uImage$/o ) { my $nop = $kimage; }
+else                              { $kimage = "vmlinuz" }    # default
+### EDIT(aiy): Return Image for $kimage
+$kimage = "Image";
+
+$ENV{KERNEL_ARCH} = $kernel_arch if $kernel_arch;
+
+### EDIT(aiy): Return $kimage instead of $kimage-$version
+die "Internal Error: Could not find image ("
+  . $realimageloc
+  . "$kimage-$version)\n"
+  unless -e $realimageloc
+  . "$kimage";
+  # . "$kimage-$version";
+
+######################################################################
+## Fix the build link
+######################################################################
+sub fix_build_link {
+  return unless -d "$modules_base/$version";
+
+  # if we saved a build link in preinst, restore the link
+  if (!-e "$modules_base/$version/build"
+    && -l "$modules_base/$version/build.save" ) {
+    rename( "$modules_base/$version/build.save",
+      "$modules_base/$version/build" )
+      || die "failed to move $modules_base/$version/build:$!";
+  } ## end if ( !-e "$modules_base/$version/build"...)
+  if ( $relink_build_link || $force_build_link ) {
+    my $build_target;
+    my $real_target = '';
+    if ( -l "$modules_base/$version/build" ) {
+      $build_target = readlink "$modules_base/$version/build";
+    }
+    else {
+      return;
+    }
+
+    # Determine what the real file name is, and test that for existence
+    $real_target = abs_path($build_target) if defined($build_target);
+    if ( !defined($build_target) || !-d "$real_target" ) {    # Danglink link
+      warn qq(
+ Hmm. There is a symbolic link $modules_base/$version/build
+ However, I can not read it: $!
+ Therefore, I am deleting $modules_base/$version/build\n
+);
+      my $num = unlink "$modules_base/$version/build";
+      if ( $num != 1 ) {
+        warn "error unlinking $modules_base/$version/build";
+      }
+      else {
+        if ( $force_build_link || -d "/usr/src/=ST-headers-$version" ) {
+          my $result = symlink( "/usr/src/=ST-headers-$version",
+            "$modules_base/$version/build" );
+          if ( !$result ) {
+            warn
+              "Could not link /usr/src/=ST-headers-$version to $modules_base/$version/build:$!";
+          }
+        } ## end if ( $force_build_link...)
+      } ## end else [ if ( $num != 1 ) ]
+    } ## end if ( !defined($build_target...))
+  } ## end if ( $relink_build_link...)
+} ## end sub fix_build_link
+
+if ( $relink_build_link || $force_build_link ) {
+  &fix_build_link();
+}
+######################################################################
+## Fix the source link
+######################################################################
+sub fix_source_link {
+  return unless -d "$modules_base/$version";
+  if ($relink_src_link) {
+    my $source_target;
+    my $real_target = '';
+
+    if ( -l "$modules_base/$version/source" ) {
+      $source_target = readlink "$modules_base/$version/source";
+    }
+    else {
+      return;
+    }
+
+    # Determine what the real file name is, and test that for existence
+    $real_target = abs_path($source_target) if defined($source_target);
+    if ( !defined($source_target) || !-d "$real_target" ) {    # Danglink link
+      warn qq(
+ Hmm. The package shipped with a symbolic link $modules_base/$version/source
+ However, I can not read the target: $!
+ Therefore, I am deleting $modules_base/$version/source\n
+);
+      my $num = unlink "$modules_base/$version/source";
+      if ( $num != 1 ) {
+        warn "error unlinking $modules_base/$version/source";
+      }
+    } ## end if ( !defined($source_target...))
+  } ## end if ($relink_src_link)
+} ## end sub fix_source_link
+
+if ($relink_src_link) {
+  &fix_source_link();
+}
+######################################################################
+######################################################################
+######################################################################
+######################################################################
+
+# We may not have any modules installed
+if ( -d "$modules_base/$version" ) {
+  print STDERR "Running depmod.\n";
+  my $ret = system("depmod -a -F $realimageloc/System.map-$version $version");
+  my $exit_value  = $? >> 8;
+  my $signal_num  = $? & 127;
+  my $dumped_core = $? & 128;
+  if ($ret) {
+    if ( -f "$modules_base/$version/modules.dep" ) {
+      unlink "$modules_base/$version/modules.dep" unless $initrd;
+    }
+    my $seen;
+    my $answer;
+    my $question = "${package_name}/postinst/depmod-error-$version";
+    if ($initrd) {
+      $question = "${package_name}/postinst/depmod-error-initrd-$version";
+    }
+    ( $ret, $seen ) = fset( "$question", 'seen', 'false' );
+    die "Error setting debconf flags in $question: $seen" if $ret;
+
+    $ret = subst( "$question", 'modules_base', "$modules_base" );
+    die "Error setting debconf substitutions in $question: $seen" if $ret;
+
+    $ret = subst( "$question", 'SIGNAL', ", and got a signal $signal_num" );
+    die "Error setting debconf substitutions in $question: $seen" if $ret;
+
+    if ($dumped_core) {
+      $ret = subst( "$question", 'CORE', ", and dumped core" );
+      die "Error setting debconf substitutions in $question: $seen" if $ret;
+    }
+    else {
+      $ret = subst( "$question", 'CORE', " " );
+      die "Error setting debconf substitutions in $question: $seen" if $ret;
+    }
+
+    ( $ret, $seen ) = input( 'medium', "$question" );
+    if ( $ret && $ret != 30 ) {
+      die "Error setting debconf question $question: $seen";
+    }
+
+    ( $ret, $seen ) = go();
+    if ( $ret && $ret != 30 ) {
+      die "Error asking debconf question $question: $seen";
+    }
+
+    ( $ret, $answer ) = get("$question");
+    die "Error retreiving answer for $question: $answer" if $ret;
+
+    if ( !$ignore_depmod_err ) {
+      if ( $answer =~ /^(y|t)/i ) {
+        exit(1);
+      }
+      else {
+        print STDERR "Ok, continuing as directed\n";
+      }
+    } ## end if ( !$ignore_depmod_err)
+  } ## end if ($ret)
+} ## end if ( -d "$modules_base/$version")
+
+# We used to have System.* files in /
+if ( -e "/System.map" || -e "/System.old" ) {
+  my $ret;
+  my $answer;
+  my $question = "${package_name}/postinst/old-system-map-link-$version";
+
+  ( $ret, $answer ) = get("$question");
+  die "Error retreiving answer for $question: $answer" if $ret;
+
+  $answer =~ s/^\s+//;
+  $answer =~ s/\s+$//;
+  if ( $answer =~ /^(y|t)/i ) {
+    unlink '/System.map' if -e '/System.map';
+    unlink '/System.old' if -e '/System.old';
+    print STDERR "Obsolete links removed.\n";
+  }
+} ## end if ( -e "/System.map" ...)
+
+# set the env var stem
+$ENV{'STEM'} = "=ST";
+
+sub run_hook {
+  my $type   = shift;
+  my $script = shift;
+
+  print STDERR "Running $type hook script $script.\n";
+  system("$script $version $realimageloc$kimage-$version")
+    && print STDERR "User $type hook script [$script] ";
+  if ($?) {
+    if ( $? == -1 ) {
+      print STDERR "failed to execute: $!\n";
+    }
+    elsif ( $? & 127 ) {
+      printf STDERR "died with signal %d, %s coredump\n",
+        ( $? & 127 ), ( $? & 128 ) ? 'with' : 'without';
+    }
+    else {
+      printf STDERR "exited with value %d\n", $? >> 8;
+    }
+    exit $? >> 8;
+  } ## end if ($?)
+} ## end sub run_hook
+
+# Set up the env variable containing our arguments
+my $out;
+for (@ARGV) {
+  s,','\\'',g;
+  $out .= " '$_'";
+}
+$ENV{'DEB_MAINT_PARAMS'}       = "$out";
+$ENV{'KERNEL_PACKAGE_VERSION'} = "$kernel_pkg_version";
+
+if ( !$initrd ) {
+  $ENV{INITRD} = 'No';
+}
+## Run user hook script here, if any
+if ( -d "/etc/kernel/postinst.d" ) {
+  print STDERR "Examining /etc/kernel/postinst.d.\n";
+  system( "run-parts --verbose --exit-on-error --arg=$version "
+      . "--arg=$realimageloc$kimage-$version "
+      . "/etc/kernel/postinst.d" )
+    && die "Failed to process /etc/kernel/postinst.d";
+} ## end if ( -d "/etc/kernel/postinst.d")
+
+if ( -d "/etc/kernel/postinst.d/$version" ) {
+  print STDERR "Examining /etc/kernel/postinst.d/$version.\n";
+  system( "run-parts --verbose --exit-on-error --arg=$version "
+      . "--arg=$realimageloc$kimage-$version "
+      . "/etc/kernel/postinst.d/$version" )
+    && die "Failed to process /etc/kernel/postinst.d/$version";
+} ## end if ( -d "/etc/kernel/postinst.d/$version")
+
+if ($postinst_hook) {
+  &run_hook( "postinst", $postinst_hook );
+}
+
+# creating some info about kernel and initrd
+if ($DEBUG) {
+  my $ksize = sprintf( "%.0f",
+    ( stat( $realimageloc . "$kimage-$version" ) )[7] / 1024 )
+    . "kB";
+  my $initrdsize = '';
+  if ($initrd) {
+    $initrdsize = sprintf( "%.0f",
+      ( stat( $realimageloc . "initrd.img-$version" ) )[7] / 1024 )
+      . "kB";
+  }
+
+  print STDERR <<"EOMSG";
+A new kernel image has been installed at $realimageloc$kimage-$version
+ (Size: $ksize)
+
+Symbolic links, unless otherwise specified, can be found in $image_dest
+
+EOMSG
+
+  if ($initrd) {
+    print STDERR <<"EOMSGA";
+
+ Initial rootdisk image: ${realimageloc}initrd.img-$version (Size: $initrdsize)
+EOMSGA
+  } ## end if ($initrd)
+} ## end if ($DEBUG)
+
+exit 0;
+
+__END__
diff --git a/kernel-overlay/ruleset/arches/arm64.mk b/kernel-overlay/ruleset/arches/arm64.mk
new file mode 100644
index 0000000..23fc176
--- /dev/null
+++ b/kernel-overlay/ruleset/arches/arm64.mk
@@ -0,0 +1,35 @@
+######################### -*- Mode: Makefile-Gmake -*- ########################
+## arm64.mk ---
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+##
+## arch-tag:
+##
+###############################################################################
+
+### ARM (new abi)
+ifeq ($(strip $(DEB_HOST_ARCH)),arm64)
+  kimage := vmlinuz
+  target = Image
+  NEED_DIRECT_GZIP_IMAGE=NO
+  kimagesrc = arch/$(KERNEL_ARCH)/boot/Image
+  ### EDIT(aiy): Set kimagedest to destdir/Image
+  kimagedest = $(INT_IMAGE_DESTDIR)/Image
+  # kimagedest = $(INT_IMAGE_DESTDIR)/vmlinuz-$(KERNELRELEASE)
+  DEBCONFIG = $(CONFDIR)/config.arm64
+  kelfimagesrc = vmlinux
+  kelfimagedest = $(INT_IMAGE_DESTDIR)/vmlinux-$(KERNELRELEASE)
+  KERNEL_ARCH = arm64
+endif
diff --git a/kernel.mk b/kernel.mk
index 4d746bf..8f74b27 100644
--- a/kernel.mk
+++ b/kernel.mk
@@ -11,11 +11,12 @@
 # Explicit sequencing here since u-boot and the kernel seriously hate each other
 # in parallel.
 kernel:
-	+make -f $(ROOTDIR)/build/kernel.mk $(KERNEL_OUT_DIR)/.config
-	+make -C $(KERNEL_SRC_DIR) O=$(KERNEL_OUT_DIR) ARCH=arm64 CROSS_COMPILE=$(TOOLCHAIN) Image modules dtbs
+	+make -f $(ROOTDIR)/build/kernel.mk kpkg
 	+make -f $(ROOTDIR)/build/kernel.mk $(PRODUCT_OUT)/kernel
 	+make -f $(ROOTDIR)/build/kernel.mk $(PRODUCT_OUT)/fsl-imx8mq-phanbell.dtb
 
+kpkg: $(PRODUCT_OUT)/linux-image-4.9.51-aiy_1_arm64.deb
+
 $(KERNEL_OUT_DIR)/.config: $(ROOTDIR)/build/defconfig
 	mkdir -p $(KERNEL_OUT_DIR)
 	+make -C $(KERNEL_SRC_DIR) O=$(KERNEL_OUT_DIR) ARCH=arm64 CROSS_COMPILE=$(TOOLCHAIN) mrproper defconfig
@@ -36,4 +37,14 @@
 clean::
 	+make -C $(KERNEL_SRC_DIR) mrproper
 
-.PHONY:: kernel modules_install
+$(PRODUCT_OUT)/linux-image-4.9.51-aiy_1_arm64.deb:
+	mkdir -p $(KERNEL_OUT_DIR)
+	cp -afs $(ROOTDIR)/linux-imx/* $(KERNEL_OUT_DIR)
+	make -f $(ROOTDIR)/build/kernel.mk $(KERNEL_OUT_DIR)/.config
+	cd $(KERNEL_OUT_DIR); make-kpkg --rootcmd fakeroot --arch arm64 \
+		--cross-compile $(TOOLCHAIN) --revision 1 --append-to-version=-aiy \
+		-j $(shell nproc) --overlay-dir=$(ROOTDIR)/build/kernel-overlay \
+		kernel_image kernel_headers
+	mv $(KERNEL_OUT_DIR)/../*.deb $(PRODUCT_OUT)
+
+.PHONY:: kernel kpkg
diff --git a/partition-table.bpt b/partition-table.bpt
index 13b7212..8fc336c 100644
--- a/partition-table.bpt
+++ b/partition-table.bpt
@@ -10,7 +10,7 @@
     {
       "label": "boot",
       "offset": 8388608,
-      "size": 33554432,
+      "size": 134217728,
       "grow": false,
       "guid": "595059e1-7b18-4e71-98f8-86b0ef75fe34",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
@@ -23,7 +23,7 @@
     },
     {
       "label": "misc",
-      "offset": 41943040,
+      "offset": 142606336,
       "size": 1048576,
       "grow": false,
       "guid": "8d34ae73-b586-4f9a-b0e8-ec448b882071",
@@ -37,8 +37,8 @@
     },
     {
       "label": "rootfs",
-      "offset": 50331648,
-      "size": 12826181632,
+      "offset": 150994944,
+      "size": 12725518336,
       "grow": true,
       "guid": "70672ec3-5eee-49ff-b3b1-eb1fbd406bf5",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
diff --git a/preamble.mk b/preamble.mk
index eada7ba..c8ae891 100644
--- a/preamble.mk
+++ b/preamble.mk
@@ -65,6 +65,7 @@
 	python2.7 \
 	python3-reportbug \
 	reportbug \
+	rsync \
 	rsyslog \
 	sudo \
 	systemd \
diff --git a/prereqs.mk b/prereqs.mk
index 8eceaa3..5a7555d 100644
--- a/prereqs.mk
+++ b/prereqs.mk
@@ -11,6 +11,8 @@
 	debian-archive-keyring \
 	debootstrap \
 	device-tree-compiler \
+	fakeroot \
+	kernel-package \
 	kpartx \
 	mtools \
 	parted \
diff --git a/rootfs.mk b/rootfs.mk
index 1744caa..5480352 100644
--- a/rootfs.mk
+++ b/rootfs.mk
@@ -92,20 +92,26 @@
 	sha256sum $(ROOTFS_RAW_IMG) > $(ROOTFS_RAW_IMG).sha256sum
 
 ifeq ($(ROOTFS_FETCH_TARBALL),true)
-$(ROOTFS_PATCHED_IMG): fetch-rootfs
+$(ROOTFS_PATCHED_IMG): fetch-rootfs $(ROOTDIR)/build/boot.mk
 else
-$(ROOTFS_PATCHED_IMG): $(ROOTFS_RAW_IMG)
+$(ROOTFS_PATCHED_IMG): $(ROOTFS_RAW_IMG) $(ROOTDIR)/build/boot.mk
 endif
 	cp -r $(ROOTFS_RAW_IMG) $(ROOTFS_PATCHED_IMG)
 	mkdir -p $(ROOTFS_DIR)
+	-sudo umount $(ROOTFS_DIR)/boot
 	-sudo umount $(ROOTFS_DIR)
 	sudo mount -o loop $(ROOTFS_PATCHED_IMG) $(ROOTFS_DIR)
+	sudo mount -o loop $(PRODUCT_OUT)/boot.img $(ROOTFS_DIR)/boot
 
 	+make -f $(ROOTDIR)/build/rootfs.mk gpu
 	+make -f $(ROOTDIR)/build/rootfs.mk firmware
-	+make -f $(ROOTDIR)/build/kernel.mk modules_install
 	+make -f $(ROOTDIR)/build/rootfs.mk adjustments
 
+	sudo cp $(PRODUCT_OUT)/*.deb $(ROOTFS_DIR)/root/
+	sudo chroot $(ROOTFS_DIR) bash -c 'dpkg -i /root/*.deb'
+	sudo rm -rf $(ROOTFS_DIR)/root/*.deb
+
+	sudo umount $(ROOTFS_DIR)/boot
 	sudo umount $(ROOTFS_DIR)
 	sudo rmdir $(ROOTFS_DIR)
 	sudo sync $(ROOTFS_PATCHED_IMG)