move initramfs extraction to separate script
This commit is contained in:
parent
6c98649c9f
commit
86269dfa05
|
@ -1,2 +1,2 @@
|
||||||
/data
|
/data
|
||||||
/test.bin
|
/*.bin
|
28
build.sh
28
build.sh
|
@ -9,6 +9,7 @@ fi
|
||||||
|
|
||||||
. ./patch_initramfs.sh
|
. ./patch_initramfs.sh
|
||||||
. ./build_image.sh
|
. ./build_image.sh
|
||||||
|
. ./shim_utils.sh
|
||||||
|
|
||||||
print_help() {
|
print_help() {
|
||||||
echo "Usage: ./build.sh output_path shim_path rootfs_dir"
|
echo "Usage: ./build.sh output_path shim_path rootfs_dir"
|
||||||
|
@ -55,34 +56,9 @@ mkdir $kernel_dir -p
|
||||||
dd if=$kernel_loop of=$kernel_dir/kernel.bin bs=1M status=none
|
dd if=$kernel_loop of=$kernel_dir/kernel.bin bs=1M status=none
|
||||||
|
|
||||||
echo "extracting data from kernel"
|
echo "extracting data from kernel"
|
||||||
previous_dir=$(pwd)
|
|
||||||
cd $kernel_dir
|
|
||||||
if [ -e "${kernel_dir}/binwalk.out" ]; then
|
|
||||||
#don't run binwalk again if we don't need to
|
|
||||||
binwalk_out=$(cat $kernel_dir/binwalk.out)
|
|
||||||
else
|
|
||||||
binwalk_out=$(binwalk --extract kernel.bin --run-as=root)
|
|
||||||
echo $binwalk_out > $kernel_dir/binwalk.out
|
|
||||||
fi
|
|
||||||
#i can't be bothered to learn how to use sed
|
|
||||||
extracted_file=$(echo $binwalk_out | pcregrep -o1 "\d+\s+0x([0-9A-F]+)\s+gzip compressed data")
|
|
||||||
|
|
||||||
echo "extracting initramfs archive from kernel (this may take a while)"
|
|
||||||
cd _kernel.bin.extracted/
|
|
||||||
if [ ! -e "_${extracted_file}.extracted/" ]; then
|
|
||||||
binwalk --extract $extracted_file --run-as=root > /dev/null
|
|
||||||
fi
|
|
||||||
cd "_${extracted_file}.extracted/"
|
|
||||||
cpio_file=$(file ./* | pcregrep -o1 "([0-9A-F]+):\s+ASCII cpio archive")
|
|
||||||
|
|
||||||
echo "extracting initramfs cpio archive"
|
|
||||||
initramfs_dir=/tmp/shim_initramfs
|
initramfs_dir=/tmp/shim_initramfs
|
||||||
rm -rf $initramfs_dir
|
rm -rf $initramfs_dir
|
||||||
cat $cpio_file | cpio -D $initramfs_dir -imd --quiet
|
extract_initramfs $kernel_dir/kernel.bin $kernel_dir $initramfs_dir
|
||||||
echo "shim initramfs extracted to ${initramfs_dir}"
|
|
||||||
|
|
||||||
#leave /tmp
|
|
||||||
cd $previous_dir
|
|
||||||
|
|
||||||
echo "patching initramfs"
|
echo "patching initramfs"
|
||||||
patch_initramfs $initramfs_dir
|
patch_initramfs $initramfs_dir
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#build a rootfs that uses a squashfs + unionfs
|
||||||
|
#consists of a minimal busybox system containing:
|
||||||
|
# - FUSE kernel modules from the shim
|
||||||
|
# - unionfs-fuse statically compiled
|
||||||
|
# - the main squashfs, compressed with gzip
|
||||||
|
|
||||||
|
|
||||||
|
#todo - gotta refactor the other build scripts first
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#utilties for reading shim disk images
|
||||||
|
|
||||||
|
extract_initramfs() {
|
||||||
|
local kernel_bin="$1"
|
||||||
|
local working_dir="$2"
|
||||||
|
local output_dir="$3"
|
||||||
|
|
||||||
|
#first stage
|
||||||
|
local kernel_file="$(basename $kernel_bin)"
|
||||||
|
local binwalk_out=$(binwalk --extract $kernel_bin --directory=$working_dir --run-as=root)
|
||||||
|
local stage1_file=$(echo $binwalk_out | pcregrep -o1 "\d+\s+0x([0-9A-F]+)\s+gzip compressed data")
|
||||||
|
local stage1_dir="$working_dir/_$kernel_file.extracted"
|
||||||
|
local stage1_path="$stage1_dir/$stage1_file"
|
||||||
|
|
||||||
|
#second stage
|
||||||
|
binwalk --extract $stage1_path --directory=$stage1_dir --run-as=root
|
||||||
|
local stage2_dir="$stage1_dir/_$stage1_file.extracted/"
|
||||||
|
local cpio_file=$(file $stage2_dir/* | pcregrep -o1 "([0-9A-F]+):\s+ASCII cpio archive")
|
||||||
|
local cpio_path="$stage2_dir/$cpio_file"
|
||||||
|
|
||||||
|
rm -rf $output_dir
|
||||||
|
cat $cpio_path | cpio -D $output_dir -imd --quiet
|
||||||
|
}
|
Loading…
Reference in New Issue