From 4328fa806c19ecbc01c9a3cd56bd9b3076827bf5 Mon Sep 17 00:00:00 2001 From: Ivan Davidov Date: Sun, 29 May 2016 19:38:55 +0300 Subject: [PATCH] Added Oracle JRE/JDK and Apache Felix OSGi framework as overlay bundles. This needs additional cleanup. Updated the kernel build process - artifacts are used from separate install location. --- src/.config | 41 ++++++++++++++++------- src/02_build_kernel.sh | 16 +++++++-- src/04_build_glibc.sh | 9 ++--- src/05_prepare_glibc.sh | 15 ++++----- src/08_prepare_src.sh | 2 ++ src/10_pack_rootfs.sh | 7 ++-- src/12_generate_iso.sh | 28 +++++++--------- src/build_minimal_linux_live.sh | 26 +++++++------- src/build_minimal_linux_overlay.sh | 20 +++++------ src/overlay_dropbear.sh | 4 +-- src/overlay_felix.sh | 5 +++ src/overlay_felix_01_get.sh | 39 +++++++++++++++++++++ src/overlay_felix_02_install.sh | 35 +++++++++++++++++++ src/overlay_glibc_full.sh | 5 +-- src/overlay_java.sh | 54 ++++++++++++++++++++++++++++++ src/overlay_links.sh | 4 +-- 16 files changed, 232 insertions(+), 78 deletions(-) create mode 100755 src/overlay_felix.sh create mode 100755 src/overlay_felix_01_get.sh create mode 100755 src/overlay_felix_02_install.sh create mode 100755 src/overlay_java.sh diff --git a/src/.config b/src/.config index 29b066fb8..82d6aaa2d 100644 --- a/src/.config +++ b/src/.config @@ -8,7 +8,7 @@ # # http://kernel.org # -KERNEL_SOURCE_URL=http://kernel.org/pub/linux/kernel/v4.x/linux-4.5.3.tar.xz +KERNEL_SOURCE_URL=http://kernel.org/pub/linux/kernel/v4.x/linux-4.5.5.tar.xz # You can find the latest GNU libc source bundles here: # @@ -32,11 +32,11 @@ SYSLINUX_SOURCE_URL=http://kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.0 -###################################################### -# # -# This section contains the overlay source bundles # -# # -###################################################### +##################################################################### +# # +# This section contains the overlay source bundles and properties # +# # +##################################################################### # You can find the latest Links source bundles here: # @@ -50,6 +50,20 @@ LINKS_SOURCE_URL=http://links.twibright.com/download/links-2.12.tar.bz2 # DROPBEAR_SOURCE_URL=http://matt.ucc.asn.au/dropbear/releases/dropbear-2016.73.tar.bz2 +# You can find the latest Apache Felix source bundles here: +# +# http://felix.apache.org +# +FELIX_SOURCE_URL=http://www-us.apache.org/dist/felix/org.apache.felix.main.distribution-5.4.0.tar.gz + +# Download Oracle's jdk/jre and set the property with the absolute path to +# the archive. Example: +# +# JAVA_ARCHIVE=/home/ivan/Downloads/jdk-8u91-linux-x64.tar.gz +# +#JAVA_ARCHIVE=/absolute/path/to/java.archive.tar.gz +JAVA_ARCHIVE=/home/ivan/Downloads/jdk-8u91-linux-x64.tar.gz + #################################################### @@ -102,7 +116,7 @@ OVERLAY_TYPE=folder # internet. This is useful when you have already downloaded the sources and have # no internet connection. Or if you want to share your version of "Minimal Linux # Live" with predefined sources. -USE_LOCAL_SOURCE=false +USE_LOCAL_SOURCE=true # Copy "Minimal Linux Live" source files and folders in '/src' inside initramfs. # The default value is 'true'. You can use any other value, no value, or comment @@ -130,8 +144,11 @@ COPY_SOURCE_ISO=true # glibc_full - all core GNU C libraries (useful if other software is included) # links - text browser # dropbear - SSH server and client +# java - installs Oracle's JRE or JDK. Manual steps required. +# felix - Apache Felix OSGi framework. # -#OVERLAY_SOFTWARE=glibc_full,links,dropbear +#OVERLAY_BUNDLES=glibc_full,links,dropbear,java,felix +OVERLAY_BUNDLES=glibc_full,java,felix # This property enables the standard penguin boot logo in the upper left corner # of the screen. The property is used in 'xx_build_kernel.sh'. The default value @@ -140,8 +157,8 @@ USE_BOOT_LOGO=true # This property is the multiplicator which is used during the build process. The # total number of each 'make' jobs will be equal to the number of detected CPU -# cores mutiplied by this property. For example, if your CPU has 4 cores, then -# the number of 'make' jobs will be 4 * 2 = 8. Don't change this value unless -# you know what 'make' jobs are! -JOB_FACTOR=2 +# cores mutiplied by this property. For example, if you set this property with +# value '2' and if your CPU has 4 cores, then the number of 'make' jobs will be +# 4 * 2 = 8. Don't change this property unless you know what 'make' jobs are! +JOB_FACTOR=1 diff --git a/src/02_build_kernel.sh b/src/02_build_kernel.sh index 7d04e6387..99af1b91b 100755 --- a/src/02_build_kernel.sh +++ b/src/02_build_kernel.sh @@ -15,6 +15,10 @@ NUM_JOBS=$((NUM_CORES * JOB_FACTOR)) cd work/kernel +# Prepare the kernel install area. +rm -rf kernel_installed +mkdir kernel_installed + # Change to the kernel source directory which ls finds, e.g. 'linux-4.4.6'. cd $(ls -d linux-*) @@ -77,10 +81,16 @@ make \ CFLAGS="-Os -s -fno-stack-protector -U_FORTIFY_SOURCE" \ bzImage -j $NUM_JOBS -# Install kernel headers in './usr' (this is not '/usr') which are used later -# when we build and configure the GNU C library (glibc). +# Install the kernel file. +cp arch/x86/boot/bzImage \ + $SRC_DIR/work/kernel/kernel_installed/kernel + +# Install kernel headers which are used later when we build and configure the +# GNU C library (glibc). echo "Generating kernel headers..." -make headers_install -j $NUM_JOBS +make \ + INSTALL_HDR_PATH=$SRC_DIR/work/kernel/kernel_installed \ + headers_install -j $NUM_JOBS cd $SRC_DIR diff --git a/src/04_build_glibc.sh b/src/04_build_glibc.sh index e5454e7c6..6ae2404d5 100755 --- a/src/04_build_glibc.sh +++ b/src/04_build_glibc.sh @@ -13,11 +13,8 @@ NUM_CORES=$(grep ^processor /proc/cpuinfo | wc -l) # Calculate the number of 'make' jobs to be used later. NUM_JOBS=$((NUM_CORES * JOB_FACTOR)) -# Find the kernel build directory. -cd work/kernel -cd $(ls -d linux-*) -WORK_KERNEL_DIR=$(pwd) -cd $SRC_DIR +# Save the kernel installation directory. +KERNEL_INSTALLED=$SRC_DIR/work/kernel/kernel_installed cd work/glibc @@ -49,7 +46,7 @@ cd glibc_objects echo "Configuring glibc..." $GLIBC_SRC/configure \ --prefix= \ - --with-headers=$WORK_KERNEL_DIR/usr/include \ + --with-headers=$KERNEL_INSTALLED/include \ --without-gd \ --without-selinux \ --disable-werror \ diff --git a/src/05_prepare_glibc.sh b/src/05_prepare_glibc.sh index 925ebe782..4d147b820 100755 --- a/src/05_prepare_glibc.sh +++ b/src/05_prepare_glibc.sh @@ -4,11 +4,8 @@ echo "*** PREPARE GLIBC BEGIN ***" SRC_DIR=$(pwd) -# Find the kernel build directory. -cd work/kernel -cd $(ls -d *) -WORK_KERNEL_DIR=$(pwd) -cd $SRC_DIR +# Save the kernel installation directory. +KERNEL_INSTALLED=$(pwd) cd work/glibc @@ -45,10 +42,10 @@ ln -s ../lib lib cd ../include -ln -s $WORK_KERNEL_DIR/usr/include/linux linux -ln -s $WORK_KERNEL_DIR/usr/include/asm asm -ln -s $WORK_KERNEL_DIR/usr/include/asm-generic asm-generic -ln -s $WORK_KERNEL_DIR/usr/include/mtd mtd +ln -s $KERNEL_INSTALLED/include/linux linux +ln -s $KERNEL_INSTALLED/include/asm asm +ln -s $KERNEL_INSTALLED/asm-generic asm-generic +ln -s $KERNEL_INSTALLED/include/mtd mtd cd $SRC_DIR diff --git a/src/08_prepare_src.sh b/src/08_prepare_src.sh index 8599c5a10..1f4c2e4e0 100755 --- a/src/08_prepare_src.sh +++ b/src/08_prepare_src.sh @@ -6,6 +6,8 @@ SRC_DIR=$(pwd) cd work +echo "Preparing source files and folders. This may take a while..." + # Remove old sources (if they exist) rm -rf src mkdir src diff --git a/src/10_pack_rootfs.sh b/src/10_pack_rootfs.sh index 806e494cd..f3279d1b9 100755 --- a/src/10_pack_rootfs.sh +++ b/src/10_pack_rootfs.sh @@ -6,14 +6,17 @@ SRC_DIR=$(pwd) cd work +echo "Packing initramfs. This may take a while..." + # Remove the old 'initramfs' archive if it exists. rm -f rootfs.cpio.gz cd rootfs # Packs the current 'initramfs' folder structure in 'cpio.xz' archive. -echo "Packing initramfs..." -find . | cpio -R root:root -H newc -o | xz --check=none > ../rootfs.cpio.xz +find . | cpio -R root:root -H newc -o | xz -9 --check=none > ../rootfs.cpio.xz + +echo "Packing of initramfs has finished." cd $SRC_DIR diff --git a/src/12_generate_iso.sh b/src/12_generate_iso.sh index fde06551d..c9f809b46 100755 --- a/src/12_generate_iso.sh +++ b/src/12_generate_iso.sh @@ -4,11 +4,8 @@ echo "*** GENERATE ISO BEGIN ***" SRC_DIR=$(pwd) -# Find the kernel build directory. -cd work/kernel -cd $(ls -d *) -WORK_KERNEL_DIR=$(pwd) -cd $SRC_DIR +# Save the kernel installation directory. +KERNEL_INSTALLED=$SRC_DIR/work/kernel/kernel_installed # Find the Syslinux build directory. cd work/syslinux @@ -40,14 +37,14 @@ else echo "Source files and folders have been skipped." fi -# Read the 'OVERLAY_SOFTWARE' property from '.config' -OVERLAY_SOFTWARE="$(grep -i ^OVERLAY_SOFTWARE .config | cut -f2 -d'=')" +# Read the 'OVERLAY_BUNDLES' property from '.config' +OVERLAY_BUNDLES="$(grep -i ^OVERLAY_BUNDLES .config | cut -f2 -d'=')" -if [ ! "$OVERLAY_SOFTWARE" = "" ] ; then - echo "Generating additional overlay software. This may take a while..." - sh build_minimal_linux_overlay.sh +if [ ! "$OVERLAY_BUNDLES" = "" ] ; then + echo "Generating additional overlay bundles. This may take a while..." + time sh build_minimal_linux_overlay.sh else - echo "Generation of additional overlay software has been skipped." + echo "Generation of additional overlay bundles has been skipped." fi cd work/isoimage @@ -58,7 +55,7 @@ cp $WORK_SYSLINUX_DIR/bios/core/isolinux.bin . cp $WORK_SYSLINUX_DIR/bios/com32/elflink/ldlinux/ldlinux.c32 . # Now we copy the kernel. -cp $WORK_KERNEL_DIR/arch/x86/boot/bzImage ./kernel.xz +cp $KERNEL_INSTALLED/kernel ./kernel.xz # Now we copy the root file system. cp ../rootfs.cpio.xz ./rootfs.xz @@ -121,8 +118,7 @@ else echo "Generating ISO image with no overlay structure..." fi -# Create ISOLINUX configuration file. -#echo 'default kernel.xz initrd=rootfs.xz vga=769' > ./isolinux.cfg +# Create the ISOLINUX configuration file. echo 'default kernel.xz initrd=rootfs.xz vga=ask' > ./isolinux.cfg # Now we generate the ISO image file. @@ -139,7 +135,9 @@ genisoimage \ ./ # This allows the ISO image to be bootable if it is burned on USB flash drive. -isohybrid ../minimal_linux_live.iso 2>/dev/null || true +# The -u option is used in EFI boot mode (still not supported) and it reduces +# the ISO image size. +isohybrid -u ../minimal_linux_live.iso 2>/dev/null || true # Copy the ISO image to the root project folder. cp ../minimal_linux_live.iso ../../ diff --git a/src/build_minimal_linux_live.sh b/src/build_minimal_linux_live.sh index 4ed6012be..ee8b1d029 100755 --- a/src/build_minimal_linux_live.sh +++ b/src/build_minimal_linux_live.sh @@ -1,16 +1,16 @@ #!/bin/sh -sh 00_clean.sh -sh 01_get_kernel.sh -sh 02_build_kernel.sh -sh 03_get_glibc.sh -sh 04_build_glibc.sh -sh 05_prepare_glibc.sh -sh 06_get_busybox.sh -sh 07_build_busybox.sh -sh 08_prepare_src.sh -sh 09_generate_rootfs.sh -sh 10_pack_rootfs.sh -sh 11_get_syslinux.sh -sh 12_generate_iso.sh +sh time 00_clean.sh +sh time 01_get_kernel.sh +sh time 02_build_kernel.sh +sh time 03_get_glibc.sh +sh time 04_build_glibc.sh +sh time 05_prepare_glibc.sh +sh time 06_get_busybox.sh +sh time 07_build_busybox.sh +sh time 08_prepare_src.sh +sh time 09_generate_rootfs.sh +sh time 10_pack_rootfs.sh +sh time 11_get_syslinux.sh +sh time 12_generate_iso.sh diff --git a/src/build_minimal_linux_overlay.sh b/src/build_minimal_linux_overlay.sh index c96cfe653..43de83f87 100755 --- a/src/build_minimal_linux_overlay.sh +++ b/src/build_minimal_linux_overlay.sh @@ -1,24 +1,24 @@ #!/bin/sh -# Read the 'OVERLAY_SOFTWARE' property from '.config' -OVERLAY_SOFTWARE="$(grep -i ^OVERLAY_SOFTWARE .config | cut -f2 -d'=')" +# Read the 'OVERLAY_BUNDLES' property from '.config' +OVERLAY_BUNDLES="$(grep -i ^OVERLAY_BUNDLES .config | cut -f2 -d'=')" -if [ "$OVERLAY_SOFTWARE" = "" ] ; then - echo "There is no overlay software to build." +if [ "$OVERLAY_BUNDLES" = "" ] ; then + echo "There are no overlay bundles to build." else - sh overlay_00_clean.sh + time sh overlay_00_clean.sh - OVERLAY_PIECES="$(echo $OVERLAY_SOFTWARE | tr ',' ' ')" + OVERLAY_BUNDLES_LIST="$(echo $OVERLAY_BUNDLES | tr ',' ' ')" - for OVERLAY in $OVERLAY_PIECES + for BUNDLE in $OVERLAY_BUNDLES_LIST do - OVERLAY_SCRIPT=overlay_$OVERLAY.sh + OVERLAY_SCRIPT=overlay_$BUNDLE.sh if [ ! -f $OVERLAY_SCRIPT ] ; then echo "Error - cannot find overlay script file '$OVERLAY_SCRIPT'." else - echo "Building '$OVERLAY'..." - sh $OVERLAY_SCRIPT + echo "Building overlay bundle '$BUNDLE'..." + time sh $OVERLAY_SCRIPT fi done fi diff --git a/src/overlay_dropbear.sh b/src/overlay_dropbear.sh index 3e4f427b9..ba80a3840 100755 --- a/src/overlay_dropbear.sh +++ b/src/overlay_dropbear.sh @@ -1,5 +1,5 @@ #!/bin/sh -sh overlay_dropbear_01_get.sh -sh overlay_dropbear_02_build.sh +time sh overlay_dropbear_01_get.sh +time sh overlay_dropbear_02_build.sh diff --git a/src/overlay_felix.sh b/src/overlay_felix.sh new file mode 100755 index 000000000..3a2eb671a --- /dev/null +++ b/src/overlay_felix.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +time sh overlay_felix_01_get.sh +time sh overlay_felix_02_install.sh + diff --git a/src/overlay_felix_01_get.sh b/src/overlay_felix_01_get.sh new file mode 100755 index 000000000..3ee9ce365 --- /dev/null +++ b/src/overlay_felix_01_get.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +SRC_DIR=$(pwd) + +# Grab everything after the '=' character. +DOWNLOAD_URL=$(grep -i FELIX_SOURCE_URL .config | cut -f2 -d'=') + +# Grab everything after the last '/' character. +ARCHIVE_FILE=${DOWNLOAD_URL##*/} + +# Read the 'USE_LOCAL_SOURCE' property from '.config' +USE_LOCAL_SOURCE="$(grep -i USE_LOCAL_SOURCE .config | cut -f2 -d'=')" + +if [ "$USE_LOCAL_SOURCE" = "true" -a ! -f $SRC_DIR/source/overlay/$ARCHIVE_FILE ] ; then + echo "Source bundle $SRC_DIR/source/overlay/$ARCHIVE_FILE is missing and will be downloaded." + USE_LOCAL_SOURCE="false" +fi + +cd source/overlay + +if [ ! "$USE_LOCAL_SOURCE" = "true" ] ; then + # Downloading Apache Felix source bundle file. The '-c' option allows the download to resume. + echo "Downloading Apache Felix source bundle from $DOWNLOAD_URL" + wget -c $DOWNLOAD_URL +else + echo "Using local Apache Felix source bundle $SRC_DIR/source/overlay/$ARCHIVE_FILE" +fi + +# Delete folder with previously extracted Felix. +echo "Removing Apache Felix work area. This may take a while..." +rm -rf ../../work/overlay/felix +mkdir ../../work/overlay/felix + +# Extract Felix to folder 'work/overlay/felix'. +# Full path will be something like 'work/overlay/felix/felix-framework-5.4.0'. +tar -xvf $ARCHIVE_FILE -C ../../work/overlay/felix + +cd $SRC_DIR + diff --git a/src/overlay_felix_02_install.sh b/src/overlay_felix_02_install.sh new file mode 100755 index 000000000..9496b5124 --- /dev/null +++ b/src/overlay_felix_02_install.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +SRC_DIR=$(pwd) + +echo "Removing old Apache Felix artifacts. This may take a while..." +rm -rf $SRC_DIR/work/overlay/felix/felix_installed +mkdir -p $SRC_DIR/work/overlay/felix/felix_installed/opt/felix +mkdir -p $SRC_DIR/work/overlay/felix/felix_installed/bin + +cd $SRC_DIR/work/overlay/felix +cd $(ls -d felix-*) + +cat << CEOF > bin/felix-start.sh +#!/bin/sh + +cd /opt/felix +java -jar bin/felix.jar + +CEOF + +chmod +rx bin/felix-start.sh + +cp -r * $SRC_DIR/work/overlay/felix/felix_installed/opt/felix + +cd $SRC_DIR/work/overlay/felix/felix_installed + +ln -s ../opt/felix/bin/felix-start.sh bin/felix-start.sh + +cp -r $SRC_DIR/work/overlay/felix/felix_installed/* \ + $SRC_DIR/work/src/minimal_overlay + +echo "Apache Felix has been installed." + +cd $SRC_DIR + diff --git a/src/overlay_glibc_full.sh b/src/overlay_glibc_full.sh index b255a248d..a1b2e44e2 100755 --- a/src/overlay_glibc_full.sh +++ b/src/overlay_glibc_full.sh @@ -7,14 +7,13 @@ if [ ! -d $SRC_DIR/work/glibc/glibc_prepared ] ; then exit 1 fi -echo "Preparing the overlay glibc folder. Tis may take a while..." +echo "Preparing the overlay glibc folder. This may take a while..." rm -rf work/overlay/glibc mkdir -p work/overlay/glibc/lib cd work/glibc/glibc_prepared/lib find . -type l -exec cp {} $SRC_DIR/work/overlay/glibc/lib \; - echo "All libraries have been copied." cd $SRC_DIR/work/overlay/glibc/lib @@ -32,11 +31,9 @@ done echo "Duplicate libraries have been replaced with soft links." strip -g * - echo "All libraries have been optimized for size." cp -r $SRC_DIR/work/overlay/glibc/lib $SRC_DIR/work/src/minimal_overlay - echo "All libraries have been installed." cd $SRC_DIR diff --git a/src/overlay_java.sh b/src/overlay_java.sh new file mode 100755 index 000000000..076ca7b16 --- /dev/null +++ b/src/overlay_java.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +# This script installs Oracle's JRE or JDK from already downloaded 'tar.gz' +# archive. Oracle's license doesn't allow direct downloads, so you need to do +# the following: +# +# 1) Download JRE or JDK from http://oracle.com +# 2) Add the following property in the '.config' file: +# +# JAVA_ARCHIVE=/absolute/path/to/java/archive.tar.gz +# +# Example: +# +# JAVA_ARCHIVE=/home/myself/Downloads/jdk-8u91-linux-x64.tar.gz +# +# 3) Run this script. Note that the script will fail with error message if the +# 'JAVA_ARCHIVE' property is not set or if it points to invalid file. + +SRC_DIR=$(pwd) + +# Read the 'JAVA_ARCHIVE' property from '.config' +JAVA_ARCHIVE="$(grep -i ^JAVA_ARCHIVE .config | cut -f2 -d'=')" + +if [ "$JAVA_ARCHIVE" = "" ] ; then + echo "ERROR: configuration property 'JAVA_ARCHIVE' is not set." + exit 1 +elif [ ! -f "$JAVA_ARCHIVE" ] ; then + echo "ERROR: configuration property 'JAVA_ARCHIVE' points to non existent file." + exit 1 +fi + +rm -rf $SRC_DIR/work/overlay/java +mkdir -p $SRC_DIR/work/overlay/java/opt + +tar -xvf \ + $JAVA_ARCHIVE \ + -C $SRC_DIR/work/overlay/java/opt + +cd $SRC_DIR/work/overlay/java/opt +mv $(ls -d *) java + +mkdir $SRC_DIR/work/overlay/java/bin + +for FILE in $(ls java/bin) +do + ln -s ../opt/java/bin/$FILE ../bin/$FILE +done + +cp -r $SRC_DIR/work/overlay/java/* $SRC_DIR/work/src/minimal_overlay + +echo "Java has been installed." + +cd $SRC_DIR + diff --git a/src/overlay_links.sh b/src/overlay_links.sh index 7b8809f81..5d1bf64f3 100755 --- a/src/overlay_links.sh +++ b/src/overlay_links.sh @@ -1,5 +1,5 @@ #!/bin/sh -sh overlay_links_01_get.sh -sh overlay_links_02_build.sh +time sh overlay_links_01_get.sh +time sh overlay_links_02_build.sh