From 05b62fd32e0293048b1883f40955cd9cc46460d4 Mon Sep 17 00:00:00 2001 From: Ivan Davidov Date: Sat, 16 Apr 2016 21:23:20 +0300 Subject: [PATCH] Major reorganization - initramfs structure is now externalized in separate folder structure. Added support for overlay from folders and disk images. Overlay structure has been externalized in separate folder. Added support to use preconfigured ".config" files for BusyBox and kernel. --- src/.config | 28 +++ src/02_build_kernel.sh | 28 ++- src/07_build_busybox.sh | 28 ++- src/08_generate_rootfs.sh | 230 ++--------------------- src/08_generate_rootfs/etc/bootscript.sh | 10 + src/08_generate_rootfs/etc/inittab | 12 ++ src/08_generate_rootfs/etc/prepare.sh | 9 + src/08_generate_rootfs/etc/rc.dhcp | 15 ++ src/08_generate_rootfs/etc/resolv.conf | 3 + src/08_generate_rootfs/etc/switch.sh | 149 +++++++++++++++ src/08_generate_rootfs/etc/welcome.txt | 7 + src/08_generate_rootfs/init | 10 + src/11_generate_iso.sh | 62 +++++- src/11_generate_iso/README.txt | 7 + src/qemu32.sh | 3 +- 15 files changed, 359 insertions(+), 242 deletions(-) create mode 100755 src/08_generate_rootfs/etc/bootscript.sh create mode 100644 src/08_generate_rootfs/etc/inittab create mode 100755 src/08_generate_rootfs/etc/prepare.sh create mode 100755 src/08_generate_rootfs/etc/rc.dhcp create mode 100644 src/08_generate_rootfs/etc/resolv.conf create mode 100755 src/08_generate_rootfs/etc/switch.sh create mode 100644 src/08_generate_rootfs/etc/welcome.txt create mode 100755 src/08_generate_rootfs/init create mode 100644 src/11_generate_iso/README.txt diff --git a/src/.config b/src/.config index e1a732a2d..26e7da859 100644 --- a/src/.config +++ b/src/.config @@ -24,3 +24,31 @@ BUSYBOX_SOURCE_URL=http://busybox.net/downloads/busybox-1.24.2.tar.bz2 # SYSLINUX_SOURCE_URL=https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.xz +### ### ### +### ### ### +### ### ### + +# Use predefined '.config' file when building the kernel. This overrides the config generation +# in '02_build_kernel.sh' and uses the config file provided in this parameter. You can comment, +# leave undefined or use nonexisting file in order to disable the property and rely on automatic +# config generation. +# +# KERNEL_CONFIG_FILE=kernel.config + +# Use predefined '.config' file when building BusyBox. This overrides the config generation in +# '07_build_busybox.sh' and uses the config file provided in this parameter. Leave undefined or +# comment the property in order to disable it and rely on automatic config generation. +# +# BUSYBOX_CONFIG_FILE=busybox.config + +# Define the overlay type to use. Possible values are 'sparse' and 'folder'. You can use any other +# value, no value, or comment the property in order to disable it. +# +# sparse - use sparse file with hardcoded maximal size of 1MB (see 11_generate_iso.sh). This option +# requires root permissions. The generated ISO image is larger. +# +# folder - use normal folder structure. Currently this doesn't work if the file system is 'vfat' +# because FAT requires special handling, e.g. POSIX overlay (http://sf.net/p/posixovl). +# +OVERLAY_TYPE=sparse + diff --git a/src/02_build_kernel.sh b/src/02_build_kernel.sh index c48a546b3..56a01d538 100755 --- a/src/02_build_kernel.sh +++ b/src/02_build_kernel.sh @@ -1,23 +1,35 @@ #!/bin/sh +SRC_DIR=$(pwd) + cd work/kernel # Change to the first directory ls finds, e.g. 'linux-4.4.6'. cd $(ls -d *) # Cleans up the kernel sources, including configuration files. -make mrproper +# make mrproper -# Create default configuration file for the kernel. -make defconfig +# Read the 'KERNEL_CONFIG_FILE' property from '.config' +KERNEL_CONFIG_FILE="$SRC_DIR/$(grep -i KERNEL_CONFIG_FILE $SRC_DIR/.config | cut -f2 -d'=')" -# Changes the name of the system to 'minimal'. -sed -i "s/.*CONFIG_DEFAULT_HOSTNAME.*/CONFIG_DEFAULT_HOSTNAME=\"minimal\"/" .config +if [ -f $KERNEL_CONFIG_FILE ] ; then + # Use predefined configuration file for the kernel. + cp $KERNEL_CONFIG_FILE .config +else + # Create default configuration file for the kernel. + make defconfig -# Enable overlay support, e.g. merge ro and rw directories. -sed -i "s/.*CONFIG_OVERLAY_FS.*/CONFIG_OVERLAY_FS=y/" .config + # Changes the name of the system to 'minimal'. + sed -i "s/.*CONFIG_DEFAULT_HOSTNAME.*/CONFIG_DEFAULT_HOSTNAME=\"minimal\"/" .config -# Compile the kernel with optimization for "parallel jobs" = "number of processors". + # Enable overlay support, e.g. merge ro and rw directories. + sed -i "s/.*CONFIG_OVERLAY_FS.*/CONFIG_OVERLAY_FS=y/" .config +fi + +exit 0 + +# Compile the kernel with optimization for 'parallel jobs' = 'number of processors'. # Good explanation of the different kernels: # http://unix.stackexchange.com/questions/5518/what-is-the-difference-between-the-following-kernel-makefile-terms-vmlinux-vmlinux make bzImage -j $(grep ^processor /proc/cpuinfo | wc -l) diff --git a/src/07_build_busybox.sh b/src/07_build_busybox.sh index 672217139..bbb1f19a9 100755 --- a/src/07_build_busybox.sh +++ b/src/07_build_busybox.sh @@ -1,5 +1,7 @@ #!/bin/sh +SRC_DIR=$(pwd) + # Find the glibc installation area. cd work/glibc cd $(ls -d *) @@ -13,10 +15,25 @@ cd work/busybox cd $(ls -d *) # Remove previously generated artifacts. -make distclean +# make distclean -# Create default configuration file. -make defconfig +# Read the 'BUSYBOX_CONFIG_FILE' property from '.config' +BUSYBOX_CONFIG_FILE="$SRC_DIR/$(grep -iBUSYBOX_CONFIG_FILE $SRC_DIR/.config | cut -f2 -d'=')" + +if [ -f $BUSYBOX_CONFIG_FILE ] ; then + # Use predefined configuration file for Busybox. + cp $BUSYBOX_CONFIG_FILE .config +else + # Create default configuration file. + make defconfig + + # The 'inetd' applet fails to compile because we use the glibc installation area as + # main pointer to the kernel headers (see 05_prepare_glibc.sh) and some headers are + # not resolved. The easiest solution is to ignore this particular applet. + sed -i "s/.*CONFIG_INETD.*/CONFIG_INETD=n/" .config +fi + +exit 0 # This variable holds the full path to the glibc installation area as quoted string. # All back slashes are escaped (/ => \/) in order to keep the 'sed' command stable. @@ -25,11 +42,6 @@ GLIBC_INSTALLED_ESCAPED=$(echo \"$GLIBC_INSTALLED\" | sed 's/\//\\\//g') # Now we tell BusyBox to use the glibc installation area. sed -i "s/.*CONFIG_SYSROOT.*/CONFIG_SYSROOT=$GLIBC_INSTALLED_ESCAPED/" .config -# The 'inetd' applet fails to compile because we use the glibc installation area as -# main pointer to the kernel headers (see 05_prepare_glibc.sh) and some headers are -# not resolved. The easiest solution is to ignore this particular applet. -sed -i "s/.*CONFIG_INETD.*/CONFIG_INETD=n/" .config - # Compile busybox with optimization for "parallel jobs" = "number of processors". make busybox -j $(grep ^processor /proc/cpuinfo | wc -l) diff --git a/src/08_generate_rootfs.sh b/src/08_generate_rootfs.sh index 221c78be6..e8d16ac77 100755 --- a/src/08_generate_rootfs.sh +++ b/src/08_generate_rootfs.sh @@ -18,234 +18,26 @@ cd busybox cd $(ls -d *) # Copy all BusyBox generated stuff to the location of our 'initramfs' folder. -cp -R _install ../../rootfs +cp -r _install ../../rootfs + +# Copy all rootfs stuff to the location of our 'initramfs' folder. +cp -r ../../../08_generate_rootfs/* ../../rootfs + cd ../../rootfs # Remove 'linuxrc' which is used when we boot in 'RAM disk' mode. rm -f linuxrc -# Create the missing root FS folders. -mkdir etc -mkdir dev -mkdir lib -mkdir mnt -mkdir proc -mkdir root -mkdir src -mkdir sys -mkdir tmp - -cd etc - -# The script '/etc/prepare.sh' is automatically executed as part of the '/init' -# process. We suppress most kernel messages and mount all cryitical file systems. -cat > prepare.sh << EOF -#!/bin/sh - -dmesg -n 1 - -mount -t devtmpfs none /dev -mount -t proc none /proc -mount -t tmpfs none /tmp -o mode=1777 -mount -t sysfs none /sys - -EOF - -chmod +x prepare.sh - -# The script '/etc/switch.sh' is automatically executed as part of the '/init' -# process. We overlay the '/minimal/rootfs' folder from the boot media, copy all -# files and folders to new mountpoint and then execute the command 'switch_root'. -cat > switch.sh << EOF -#!/bin/sh - -# Create the new mountpoint in RAM. -mount -t tmpfs none /mnt - -# Create folders for all critical file systems. -echo "Create folders for all critical file systems..." -mkdir /mnt/dev -mkdir /mnt/sys -mkdir /mnt/proc -mkdir /mnt/tmp -echo "...done." - -# Copy root folders in the new mountpoint. -echo "Copying the root file system to /mnt..." -cp -a bin etc lib lib64 root sbin src usr /mnt -echo "...done." - -mkdir /tmp/mnt -echo "Searching available devices for /minimal/rootfs folder..." -for DEVICE in /dev/* ; do - DEV=\$(echo "\${DEVICE##*/}") - SYSDEV=\$(echo "/sys/class/block/\$DEV") - - case \$DEV in - *loop*) continue ;; - esac - - if [ ! -d "\$SYSDEV" ] ; then - continue - fi - - mount \$DEVICE /tmp/mnt 2>/dev/null - if [ -d /tmp/mnt/minimal/rootfs ] ; then - echo " Found /minimal/rootfs folder on device \$DEV." - - touch /tmp/mnt/minimal/rootfs/minimal.pid 2>/dev/null - if [ -f /tmp/mnt/minimal/rootfs/minimal.pid ] ; then - echo " Trying to overlay in read/write mode..." - rm -f /tmp/mnt/minimal/rootfs/minimal.pid - mount -t overlay -o lowerdir=/mnt,upperdir=/tmp/mnt/minimal/rootfs,workdir=/tmp/mnt/minimal/work none /mnt - OUT=\$? - if [ ! "\$OUT" = "0" ] ; then - echo " Mount failed (probably on vfat), moving on with other devices." - umount /tmp/mnt 2>/dev/null - continue - fi - else - echo " Trying to overlay in read only mode..." - mkdir -p /tmp/minimal/work - mkdir -p /tmp/minimal/rootfs - mount -t overlay -o lowerdir=/mnt:/tmp/mnt/minimal/rootfs,upperdir=/tmp/minimal/rootfs,workdir=/tmp/minimal/work none /mnt - fi - - echo " ...done." - - break - else - umount /tmp/mnt 2>/dev/null - fi -done -echo "...done." - -# Move critical file systems to the new mountpoint. -echo "Remounting /dev, /sys, /tmp and /proc in /mnt..." -mount --move /dev /mnt/dev -mount --move /sys /mnt/sys -mount --move /proc /mnt/proc -mount --move /tmp /mnt/tmp -echo "...done." - -# The new mountpoint becomes file system root. All original root folders are -# deleted automatically as part of the command execution. The '/sbin/init' -# process is invoked and it becomes the new PID 1 parent process. -exec switch_root /mnt /sbin/init - -echo "You can never see this... unless there is a serious bug..." -sleep 99999 - -EOF - -chmod +x switch.sh - -# The script '/etc/bootscript.sh' is automatically executed as part of the -# '/sbin/init' proess. All core boot configuration has been completed and now we -# need to do the rest of the configuration on the user space level. Here we loop -# through all available network devices and we configure them through DHCP. -cat > bootscript.sh << EOF -#!/bin/sh - -echo "Welcome to \"Minimal Linux Live\" (/sbin/init)" - -for DEVICE in /sys/class/net/* ; do - echo "Found network device \${DEVICE##*/}" - ip link set \${DEVICE##*/} up - [ \${DEVICE##*/} != lo ] && udhcpc -b -i \${DEVICE##*/} -s /etc/rc.dhcp -done - -EOF - -chmod +x bootscript.sh - -# The script '/etc/rc.dhcp' is automatically invoked for each network device. -cat > rc.dhcp << EOF -#!/bin/sh - -ip addr add \$ip/\$mask dev \$interface - -if [ "\$router" ]; then - ip route add default via \$router dev \$interface -fi - -if [ "\$ip" ]; then - echo "DHCP configuration for device \$interface" - echo "ip: \$ip" - echo "mask: \$mask" - echo "router: \$router" -fi - -EOF - -chmod +x rc.dhcp - -# DNS resolving is done by using Google's public DNS servers. -cat > resolv.conf << EOF -nameserver 8.8.8.8 -nameserver 8.8.4.4 - -EOF - -# The file '/etc/welcome.txt' is displayed on every boot of the system in each -# available terminal. -cat > welcome.txt << EOF - - ##################################### - # # - # Welcome to "Minimal Linux Live" # - # # - ##################################### - -EOF - -# The file '/etc/inittab' contains the configuration which defines how the -# system will be initialized. Check the following URL for more details: -# http://git.busybox.net/busybox/tree/examples/inittab -cat > inittab << EOF -::sysinit:/etc/bootscript.sh -::restart:/sbin/init -::ctrlaltdel:/sbin/reboot -::once:cat /etc/welcome.txt -::respawn:/bin/cttyhack /bin/sh -tty2::once:cat /etc/welcome.txt -tty2::respawn:/bin/sh -tty3::once:cat /etc/welcome.txt -tty3::respawn:/bin/sh -tty4::once:cat /etc/welcome.txt -tty4::respawn:/bin/sh - -EOF - -cd .. - -# The '/init' script is the first place where we gain execution control after -# the kernel has been loaded. This script prepares the core file systems, then -# creates new mountpoint in RAM which we use as new root location and finally -# the execution is passed to the script '/sbin/init' which in turn looks for -# the configuration file '/etc/inittab'. -cat > init << EOF -#!/bin/sh - -echo "Welcome to \"Minimal Linux Live\" (/init)" - -# Let's mount all core file systems. -/etc/prepare.sh - -# Now let's create new mountpoint in RAM and make it our new root location. -exec /etc/switch.sh - -EOF - -chmod +x init - # Copy all source files to '/src'. Note that the scripts won't work there. cp ../../*.sh src cp ../../.config src cp ../../*.txt src -chmod +rx src/*.sh -chmod +r src/.config -chmod +r src/*.txt +cp -r ../../08_generate_rootfs src +cp -r ../../11_generate_iso src + +chmod -R +rx **/*.sh +chmod -R +r **/.config +chmod -R +r **/*.txt # Copy all necessary 'glibc' libraries to '/lib' BEGIN. diff --git a/src/08_generate_rootfs/etc/bootscript.sh b/src/08_generate_rootfs/etc/bootscript.sh new file mode 100755 index 000000000..cfca84333 --- /dev/null +++ b/src/08_generate_rootfs/etc/bootscript.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +echo "Welcome to \"Minimal Linux Live\" (/sbin/init)" + +for DEVICE in /sys/class/net/* ; do + echo "Found network device ${DEVICE##*/}" + ip link set ${DEVICE##*/} up + [ ${DEVICE##*/} != lo ] && udhcpc -b -i ${DEVICE##*/} -s /etc/rc.dhcp +done + diff --git a/src/08_generate_rootfs/etc/inittab b/src/08_generate_rootfs/etc/inittab new file mode 100644 index 000000000..d4fb0a548 --- /dev/null +++ b/src/08_generate_rootfs/etc/inittab @@ -0,0 +1,12 @@ +::sysinit:/etc/bootscript.sh +::restart:/sbin/init +::ctrlaltdel:/sbin/reboot +::once:cat /etc/welcome.txt +::respawn:/bin/cttyhack /bin/sh +tty2::once:cat /etc/welcome.txt +tty2::respawn:/bin/sh +tty3::once:cat /etc/welcome.txt +tty3::respawn:/bin/sh +tty4::once:cat /etc/welcome.txt +tty4::respawn:/bin/sh + diff --git a/src/08_generate_rootfs/etc/prepare.sh b/src/08_generate_rootfs/etc/prepare.sh new file mode 100755 index 000000000..ce05206b5 --- /dev/null +++ b/src/08_generate_rootfs/etc/prepare.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +dmesg -n 1 + +mount -t devtmpfs none /dev +mount -t proc none /proc +mount -t tmpfs none /tmp -o mode=1777 +mount -t sysfs none /sys + diff --git a/src/08_generate_rootfs/etc/rc.dhcp b/src/08_generate_rootfs/etc/rc.dhcp new file mode 100755 index 000000000..c2406d45b --- /dev/null +++ b/src/08_generate_rootfs/etc/rc.dhcp @@ -0,0 +1,15 @@ +#!/bin/sh + +ip addr add $ip/$mask dev $interface + +if [ "$router" ]; then + ip route add default via $router dev $interface +fi + +if [ "$ip" ]; then + echo "DHCP configuration for device $interface" + echo "ip: $ip" + echo "mask: $mask" + echo "router: $router" +fi + diff --git a/src/08_generate_rootfs/etc/resolv.conf b/src/08_generate_rootfs/etc/resolv.conf new file mode 100644 index 000000000..b86901ea2 --- /dev/null +++ b/src/08_generate_rootfs/etc/resolv.conf @@ -0,0 +1,3 @@ +nameserver 8.8.8.8 +nameserver 8.8.4.4 + diff --git a/src/08_generate_rootfs/etc/switch.sh b/src/08_generate_rootfs/etc/switch.sh new file mode 100755 index 000000000..a8983a81c --- /dev/null +++ b/src/08_generate_rootfs/etc/switch.sh @@ -0,0 +1,149 @@ +#!/bin/sh + +# Create the new mountpoint in RAM. +mount -t tmpfs none /mnt + +# Create folders for all critical file systems. +echo "Create folders for all critical file systems..." +mkdir /mnt/dev +mkdir /mnt/sys +mkdir /mnt/proc +mkdir /mnt/tmp + +# Copy root folders in the new mountpoint. +echo "Copying the root file system to /mnt..." +cp -a bin etc lib lib64 root sbin src usr /mnt + +DEFAULT_OVERLAY_DIR="/tmp/minimal/overlay" +DEFAULT_UPPER_DIR="/tmp/minimal/rootfs" +DEFAULT_WORK_DIR="/tmp/minimal/work" + +echo "Searching available devices for overlay content..." +for DEVICE in /dev/* ; do + DEV=$(echo "${DEVICE##*/}") + SYSDEV=$(echo "/sys/class/block/$DEV") + + case $DEV in + *loop*) continue ;; + esac + + if [ ! -d "$SYSDEV" ] ; then + continue + fi + + mkdir -p /tmp/mnt/device + DEVICE_MNT=/tmp/mnt/device + + OVERLAY_DIR="" + OVERLAY_MNT="" + UPPER_DIR="" + WORK_DIR="" + + mount $DEVICE $DEVICE_MNT 2>/dev/null + if [ -d $DEVICE_MNT/minimal/rootfs ] && [ -d $DEVICE_MNT/minimal/work ] ; then + # folder + echo " Found '/minimal' folder on device '$DEVICE'." + touch $DEVICE_MNT/minimal/rootfs/minimal.pid 2>/dev/null + if [ -f $DEVICE_MNT/minimal/rootfs/minimal.pid ] ; then + # read/write mode + echo " Device '$DEVICE' is mounted in read/write mode." + + rm -f $DEVICE_MNT/minimal/rootfs/minimal.pid + + OVERLAY_DIR=$DEFAULT_OVERLAY_DIR + OVERLAY_MNT=$DEVICE_MNT + UPPER_DIR=$DEVICE_MNT/minimal/rootfs + WORK_DIR=$DEVICE_MNT/minimal/work + else + # read only mode + echo " Device '$DEVICE' is mounted in read only mode." + + OVERLAY_DIR=$DEVICE_MNT/minimal/rootfs + OVERLAY_MNT=$DEVICE_MNT + UPPER_DIR=$DEFAULT_UPPER_DIR + WORK_DIR=$DEFAULT_WORK_DIR + fi + elif [ -f $DEVICE_MNT/minimal.img ] ; then + #image + echo " Found '/minimal.img' image on device '$DEVICE'." + + mkdir -p /tmp/mnt/image + IMAGE_MNT=/tmp/mnt/image + + LOOP_DEVICE=$(losetup -f) + losetup $LOOP_DEVICE $DEVICE_MNT/minimal.img + + mount $LOOP_DEVICE $IMAGE_MNT + if [ -d $IMAGE_MNT/rootfs -a -d $IMAGE_MNT/work ] ; then + touch $IMAGE_MNT/rootfs/minimal.pid 2>/dev/null + if [ -f $IMAGE_MNT/rootfs/minimal.pid ] ; then + # read/write mode + echo " Image '$DEVICE/minimal.img' is mounted in read/write mode." + + rm -f $IMAGE_MNT/rootfs/minimal.pid + + OVERLAY_DIR=$DEFAULT_OVERLAY_DIR + OVERLAY_MNT=$IMAGE_MNT + UPPER_DIR=$IMAGE_MNT/rootfs + WORK_DIR=$IMAGE_MNT/work + else + # read only mode + echo " Image '$DEVICE/minimal.img' is mounted in read only mode." + + OVERLAY_DIR=$IMAGE_MNT/rootfs + OVERLAY_MNT=$IMAGE_MNT + UPPER_DIR=$DEFAULT_UPPER_DIR + WORK_DIR=$DEFAULT_WORK_DIR + fi + else + umount $IMAGE_MNT + rm -rf $IMAGE_MNT + fi + fi + + if [ "$OVERLAY_DIR" != "" -a "$UPPER_DIR" != "" -a "$WORK_DIR" != "" ] ; then + mkdir -p $OVERLAY_DIR + mkdir -p $UPPER_DIR + mkdir -p $WORK_DIR + + mount -t overlay -o lowerdir=/mnt:$OVERLAY_DIR,upperdir=$UPPER_DIR,workdir=$WORK_DIR none /mnt 2>/dev/null + + OUT=$? + if [ ! "$OUT" = "0" ] ; then + echo " Mount failed (probably on vfat)." + + umount $OVERLAY_MNT 2>/dev/null + rmdir $OVERLAY_MNT 2>/dev/null + + rmdir $DEFAULT_OVERLAY_DIR 2>/dev/null + rmdir $DEFAULT_UPPER_DIR 2>/dev/null + rmdir $DEFAULT_WORK_DIR 2>/dev/null + + else + # All done, time to go. + echo " Overlay data from device '$DEVICE' has been merged." + break + fi + else + echo " Device '$DEVICE' has no proper overlay structure." + fi + + umount $DEVICE_MNT 2>/dev/null + rm -rf $DEVICE_MNT 2>/dev/null +done + +# Move critical file systems to the new mountpoint. +echo "Remounting /dev, /sys, /tmp and /proc in /mnt..." +mount --move /dev /mnt/dev +mount --move /sys /mnt/sys +mount --move /proc /mnt/proc +mount --move /tmp /mnt/tmp + +# The new mountpoint becomes file system root. All original root folders are +# deleted automatically as part of the command execution. The '/sbin/init' +# process is invoked and it becomes the new PID 1 parent process. +exec switch_root /mnt /sbin/init + +echo "You can never see this... unless there is a serious bug..." +sleep 99999 + diff --git a/src/08_generate_rootfs/etc/welcome.txt b/src/08_generate_rootfs/etc/welcome.txt new file mode 100644 index 000000000..37042c691 --- /dev/null +++ b/src/08_generate_rootfs/etc/welcome.txt @@ -0,0 +1,7 @@ + + ##################################### + # # + # Welcome to "Minimal Linux Live" # + # # + ##################################### + diff --git a/src/08_generate_rootfs/init b/src/08_generate_rootfs/init new file mode 100755 index 000000000..6dcaf2a62 --- /dev/null +++ b/src/08_generate_rootfs/init @@ -0,0 +1,10 @@ +#!/bin/sh + +echo "Welcome to \"Minimal Linux Live\" (/init)" + +# Let's mount all core file systems. +/etc/prepare.sh + +# Now let's create new mountpoint in RAM and make it our new root location. +exec /etc/switch.sh + diff --git a/src/11_generate_iso.sh b/src/11_generate_iso.sh index 7e9b35f73..4f81602d6 100755 --- a/src/11_generate_iso.sh +++ b/src/11_generate_iso.sh @@ -1,5 +1,7 @@ #!/bin/sh +SRC_DIR=$(pwd) + # Find the kernel build directory. cd work/kernel cd $(ls -d *) @@ -41,19 +43,67 @@ chmod +rx src/*.sh chmod +r src/.config chmod +r src/*.txt +# Read the 'OVERLAY_TYPE' property from '.config' +OVERLAY_TYPE="$(grep -i OVERLAY_TYPE $SRC_DIR/.config | cut -f2 -d'=')" +if [ "$OVERLAY_TYPE" = "sparse" -a "$(id -u)" = "0" ] ; then + # sparse + + echo "Using sparse file for overlay." + + # This is the BusyBox executable. + BUSYBOX=../rootfs/bin/busybox + + # Create sparse image file with 1MB size. + $BUSYBOX truncate -s 1M minimal.img + + # Find available loop device. + LOOP_DEVICE=$($BUSYBOX losetup -f) + + # Associate loop device with the sparse image file. + $BUSYBOX losetup $LOOP_DEVICE minimal.img + + # Format the sparse image file with Ext2 file system. + $BUSYBOX mkfs.ext2 $LOOP_DEVICE + + # Mount the sparse file in folder 'tmp_min". + mkdir tmp_min + $BUSYBOX mount minimal.img tmp_min + + # Create the overlay folders. + mkdir -p tmp_min/rootfs + mkdir -p tmp_min/work + + # Copy the overlay content. + cp -r $SRC_DIR/11_generate_iso/* tmp_min/rootfs/ + + # Unmount the sparse file and thelete the temporary folder. + $BUSYBOX umount tmp_min + rm -rf tmp_min + + # Detach the loop device. + $BUSYBOX losetup -d $LOOP_DEVICE +elif [ "$OVERLAY_TYPE" = "folder" ] ; then + # folder + echo "Using folder structure for overlay." + mkdir -p minimal/rootfs + mkdir -p minimal/work + + cp -r $SRC_DIR/11_generate_iso/* minimal/rootfs/ +fi + # Create the overlay directory '/minimal/rootfs'. All files in this folder are # merged in the root folder and can be manipulated thanks to overlayfs. -mkdir -p minimal/rootfs -cd minimal/rootfs -echo 'Sample file 1 from CD.' > file_from_cd_1.txt -echo 'Sample file 2 from CD.' > file_from_cd_2.txt -cd ../.. +#mkdir -p minimal/rootfs +#cd minimal/rootfs +#echo 'Sample file 1 from CD.' > file_from_cd_1.txt +#echo 'Sample file 2 from CD.' > file_from_cd_2.txt +#cd ../.. # Create ISOLINUX configuration file. echo 'default kernel.bz initrd=rootfs.gz' > ./isolinux.cfg # Now we generate the ISO image file. -genisoimage -J -r -o ../minimal_linux_live.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table ./ +genisoimage -J -r -o ../minimal_linux_live.iso -b isolinux.bin -c boot.cat -input-charset UTF-8 -no-emul-boot -boot-load-size 4 -boot-info-table ./ # 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 diff --git a/src/11_generate_iso/README.txt b/src/11_generate_iso/README.txt new file mode 100644 index 000000000..69b95e66e --- /dev/null +++ b/src/11_generate_iso/README.txt @@ -0,0 +1,7 @@ + +This file is located in directory '11_generate_iso'. You can use this directory +to put your own content (files and folders) which will be visible in the root +directory of your 'Minimal Linux Live' system, just like this file is visible. +The files/folders will override the content in the root folder, so be careful +what you put there because you may end up with broken system. :) + diff --git a/src/qemu32.sh b/src/qemu32.sh index aae299241..14385e6a4 100755 --- a/src/qemu32.sh +++ b/src/qemu32.sh @@ -1,4 +1,5 @@ #!/bin/sh -qemu-system-i386 -m 64M -hda hdd.img -cdrom minimal_linux_live.iso -boot d +qemu-system-i386 -m 64M -cdrom minimal_linux_live.iso -boot d +#qemu-system-i386 -m 64M -hda hdd.img -cdrom minimal_linux_live.iso -boot d