Commit 55d7a9b2 authored by Oleg Dzhimiev's avatar Oleg Dzhimiev
Browse files

1. initramfs 2. parallel make for initramfs

parent 7a705d48
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
# Simple initramfs image. Mostly used for live images.
DESCRIPTION = "Small image capable of booting a device. The kernel includes \
the Minimal RAM-based Initial Root Filesystem (initramfs), which finds the \
first 'init' program more efficiently."

PACKAGE_INSTALL = "initramfs-live-boot ${VIRTUAL-RUNTIME_base-utils} udev base-passwd ${ROOTFS_BOOTSTRAP_INSTALL}"

# Do not pollute the initrd image with rootfs features
IMAGE_FEATURES = ""

export IMAGE_BASENAME = "core-image-elphel393-initramfs"
IMAGE_LINGUAS = ""

LICENSE = "MIT"

IMAGE_FSTYPES = "${INITRAMFS_FSTYPES}"
inherit core-image

IMAGE_ROOTFS_SIZE = "8192"

BAD_RECOMMENDATIONS += "busybox-syslog"
 
+1 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ IMAGE_INSTALL = "packagegroup-core-boot ${ROOTFS_PKGMANAGE_BOOTSTRAP} ${CORE_IMA
IMAGE_INSTALL_append = "u-boot-ezynq"
IMAGE_INSTALL_append += " \ 
                         sudo \
                         gcc \
                         python-core \
                         python-numpy \
                         python-argparse \
+277 −0
Original line number Diff line number Diff line
#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

ROOT_MOUNT="/rootfs"
ROOT_IMAGE="rootfs.img"
MOUNT="/bin/mount"
UMOUNT="/bin/umount"
ISOLINUX=""

ROOT_DISK=""

# Copied from initramfs-framework. The core of this script probably should be
# turned into initramfs-framework modules to reduce duplication.
udev_daemon() {
	OPTIONS="/sbin/udev/udevd /sbin/udevd /lib/udev/udevd /lib/systemd/systemd-udevd"

	for o in $OPTIONS; do
		if [ -x "$o" ]; then
			echo $o
			return 0
		fi
	done

	return 1
}

_UDEV_DAEMON=`udev_daemon`

early_setup() {
    mkdir -p /proc
    mkdir -p /sys
    mount -t proc proc /proc
    mount -t sysfs sysfs /sys
    mount -t devtmpfs none /dev

    # support modular kernel
    modprobe isofs 2> /dev/null

    mkdir -p /run
    mkdir -p /var/run

    $_UDEV_DAEMON --daemon
    udevadm trigger --action=add
}

read_args() {
    [ -z "$CMDLINE" ] && CMDLINE=`cat /proc/cmdline`
    for arg in $CMDLINE; do
        optarg=`expr "x$arg" : 'x[^=]*=\(.*\)'`
        case $arg in
            root=*)
                ROOT_DEVICE=$optarg ;;
            rootimage=*)
                ROOT_IMAGE=$optarg ;;
            rootfstype=*)
                ROOT_FSTYPE=$optarg
                modprobe $optarg 2> /dev/null ;;
#             ubi.mtd=*)
#                 optarg_arr=${optarg//,/ }
#                 ROOT_UBIVOL=$optarg_arr[0] 
#                 ;;
            LABEL=*)
                label=$optarg ;;
            video=*)
                video_mode=$arg ;;
            vga=*)
                vga_mode=$arg ;;
            console=*)
                if [ -z "${console_params}" ]; then
                    console_params=$arg
                else
                    console_params="$console_params $arg"
                fi ;;
            debugshell*)
                if [ -z "$optarg" ]; then
                        shelltimeout=30
                else
                        shelltimeout=$optarg
                fi 
        esac
    done
}

boot_live_root() {
    # Watches the udev event queue, and exits if all current events are handled
    udevadm settle --timeout=3 --quiet
    killall "${_UDEV_DAEMON##*/}" 2>/dev/null

#     # Allow for identification of the real root even after boot
#     mkdir -p  ${ROOT_MOUNT}/media/realroot
#     mount -n --move "/run/media/${ROOT_DISK}" ${ROOT_MOUNT}/media/realroot

#     # Move the mount points of some filesystems over to
#     # the corresponding directories under the real root filesystem.
#     for dir in `awk '/\/dev.* \/run\/media/{print $2}' /proc/mounts`; do
#         mkdir -p  ${ROOT_MOUNT}/media/${dir##*/}
#         mount -n --move $dir ${ROOT_MOUNT}/media/${dir##*/}
#     done
    
    mount -n --move /proc ${ROOT_MOUNT}/proc
    mount -n --move /sys ${ROOT_MOUNT}/sys
    mount -n --move /dev ${ROOT_MOUNT}/dev

    cd $ROOT_MOUNT
    
    # busybox switch_root supports -c option
    exec switch_root -c /dev/console $ROOT_MOUNT /sbin/init $CMDLINE ||
        fatal "Couldn't switch_root, dropping to shell"
}

fatal() {
    echo $1 >$CONSOLE
    echo >$CONSOLE
    exec sh
}

early_setup

[ -z "$CONSOLE" ] && CONSOLE="/dev/console"

read_args

#echo "Not waiting for removable media..."
# C=0
# while true
# do
#   echo "testing C= $C"
#   echo "break immediately"
#   break
#   for i in `ls /run/media 2>/dev/null`; do
#       if [ -f /run/media/$i/$ROOT_IMAGE ] ; then
# 		found="yes"
# 		ROOT_DISK="$i"
# 		break
# 	  elif [ -f /run/media/$i/isolinux/$ROOT_IMAGE ]; then
# 		found="yes"
# 		ISOLINUX="isolinux"
# 		ROOT_DISK="$i"
# 		break	
#       fi
#   done
#   if [ "$found" = "yes" ]; then
#       break;
#   fi
#   # don't wait for more than $shelltimeout seconds, if it's set
#   if [ -n "$shelltimeout" ]; then
#       echo -n " " $(( $shelltimeout - $C ))
#       if [ $C -ge $shelltimeout ]; then
#            echo "..."
# 	   echo "Mounted filesystems"
#            mount | grep media
#            echo "Available block devices"
#            cat /proc/partitions
#            fatal "Cannot find $ROOT_IMAGE file in /run/media/* , dropping to a shell "
#       fi
#       C=$(( C + 1 ))
#   fi
#   sleep 1
# done

# Try to mount the root image read-write and then boot it up.
# This function distinguishes between a read-only image and a read-write image.
# In the former case (typically an iso), it tries to make a union mount if possible.
# In the latter case, the root image could be mounted and then directly booted up.
mount_and_boot() {

    mkdir $ROOT_MOUNT
    #mknod /dev/loop0 b 7 0 2>/dev/null
    
    #if [ "$ROOT_FSTYPE" = "ubifs" ]; then
        #unlock flash ? - driver should have taken care of this
        # ubiattach won't be found and there's no need because kernel already knows
        #ubiattach /dev/ubi_ctrl -m $ROOT_UBIVOL
    #fi
    
    if ! mount -t $ROOT_FSTYPE -o rw,noatime $ROOT_DEVICE $ROOT_MOUNT ; then
        fatal "Could not mount rootfs device (not $ROOT_FSTYPE?)"
    fi
    
    # always 'overlay'
    TMP=/var/volatile/tmp
    mkdir -p /var/volatile
    mount -t tmpfs tmpfs /var/volatile
    mkdir -p $TMP/rootfs.ro $TMP/rootfs.rw
    
    if ! mount -n --move $ROOT_MOUNT $TMP/rootfs.ro; then
        rm -rf $TMP/rootfs.ro $TMP/rootfs.rw
        fatal "Could not move rootfs mount point"
    else
        mount -t tmpfs -o rw,noatime,mode=755 tmpfs $TMP/rootfs.rw
        mkdir -p $TMP/rootfs.rw/upperdir $TMP/rootfs.rw/work
        mount -t overlay overlay -o "lowerdir=$TMP/rootfs.ro,upperdir=$TMP/rootfs.rw/upperdir,workdir=$TMP/rootfs.rw/work" $ROOT_MOUNT
        
        # Assuming $ROOT_MOUNT/var/volatile exists
        mount --move /var/volatile $ROOT_MOUNT/var/volatile
        # Everything is already moved with /var/volatile
        #mkdir -p $ROOT_MOUNT/rootfs.ro $ROOT_MOUNT/rootfs.rw
        #mount --move /rootfs.ro $ROOT_MOUNT/rootfs.ro
        #mount --move /rootfs.rw $ROOT_MOUNT/rootfs.rw
    fi
    
    boot_live_root

#commenting out old lines
#     mkdir $ROOT_MOUNT
#     mknod /dev/loop0 b 7 0 2>/dev/null
#     
#     if ! mount -o rw,loop,noatime,nodiratime /run/media/$ROOT_DISK/$ISOLINUX/$ROOT_IMAGE $ROOT_MOUNT ; then
# 	fatal "Could not mount rootfs image"
#     fi
# 
#     if touch $ROOT_MOUNT/bin 2>/dev/null; then
# 	# The root image is read-write, directly boot it up.
# 	boot_live_root
#     fi
#     
#     # determine which unification filesystem to use
#     union_fs_type=""
#     if grep -q -w "overlay" /proc/filesystems; then
# 	union_fs_type="overlay"
#     elif grep -q -w "aufs" /proc/filesystems; then
# 	union_fs_type="aufs"
#     else
# 	union_fs_type=""
#     fi
# 
#     # make a union mount if possible
#     case $union_fs_type in
# 	"overlay")
# 	    mkdir -p /rootfs.ro /rootfs.rw
# 	    if ! mount -n --move $ROOT_MOUNT /rootfs.ro; then
# 		rm -rf /rootfs.ro /rootfs.rw
# 		fatal "Could not move rootfs mount point"
# 	    else
# 		mount -t tmpfs -o rw,noatime,mode=755 tmpfs /rootfs.rw
# 		mkdir -p /rootfs.rw/upperdir /rootfs.rw/work
# 		mount -t overlay overlay -o "lowerdir=/rootfs.ro,upperdir=/rootfs.rw/upperdir,workdir=/rootfs.rw/work" $ROOT_MOUNT
# 		mkdir -p $ROOT_MOUNT/rootfs.ro $ROOT_MOUNT/rootfs.rw
# 		mount --move /rootfs.ro $ROOT_MOUNT/rootfs.ro
# 		mount --move /rootfs.rw $ROOT_MOUNT/rootfs.rw
# 	    fi
# 	    ;;
# 	"aufs")
# 	    mkdir -p /rootfs.ro /rootfs.rw
# 	    if ! mount -n --move $ROOT_MOUNT /rootfs.ro; then
# 		rm -rf /rootfs.ro /rootfs.rw
# 		fatal "Could not move rootfs mount point"
# 	    else
# 		mount -t tmpfs -o rw,noatime,mode=755 tmpfs /rootfs.rw
# 		mount -t aufs -o "dirs=/rootfs.rw=rw:/rootfs.ro=ro" aufs $ROOT_MOUNT
# 		mkdir -p $ROOT_MOUNT/rootfs.ro $ROOT_MOUNT/rootfs.rw
# 		mount --move /rootfs.ro $ROOT_MOUNT/rootfs.ro
# 		mount --move /rootfs.rw $ROOT_MOUNT/rootfs.rw
# 	    fi
# 	    ;;
# 	"")
# 	    mount -t tmpfs -o rw,noatime,mode=755 tmpfs $ROOT_MOUNT/media
# 	    ;;
#     esac
# 
#     # boot the image
#     boot_live_root
}

# if [ "$label" != "boot" -a -f $label.sh ] ; then
# 	if [ -f /run/media/$i/$ISOLINUX/$ROOT_IMAGE ] ; then
# 	    ./$label.sh $i/$ISOLINUX $ROOT_IMAGE $video_mode $vga_mode $console_params
# 	else
# 	    fatal "Could not find $label script"
# 	fi
# 
# 	# If we're getting here, we failed...
# 	fatal "Target $label failed"
# fi

mount_and_boot
+1 −0
Original line number Diff line number Diff line
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+35 −0
Original line number Diff line number Diff line
@@ -28,6 +28,10 @@ export _MAKEFLAGS="-s -w -B KCFLAGS='-v'"
export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE _MAKEFLAGS"
EXTRA_OEMAKE = "${_MAKEFLAGS}"

INITRAMFS_IMAGE = "core-image-elphel393-initramfs"
INITRAMFS_IMAGE_BUNDLE = "1"
#IMAGE_FSTYPES = "cpio.gz"

do_fetch_append() {
    if os.path.isdir("${DEV_DIR}"):
        print("Found DEV_DIR, skipping cloning")
@@ -78,5 +82,36 @@ do_deploy_append(){
        else
            echo "NOT 3 FOUND!"
        fi
        #copy initramfs image over initramfsless image
        if [ -f ${DEPLOYDIR}/${INITRAMFS_BASE_NAME}.bin ]; then
            if [ -f ${DEPLOY_DIR_IMAGE}/${RLOC}/${PRODUCTION_KERNEL} ]; then
                rm ${DEPLOY_DIR_IMAGE}/${RLOC}/${PRODUCTION_KERNEL}
            fi
            cp ${DEPLOYDIR}/${INITRAMFS_BASE_NAME}.bin ${DEPLOY_DIR_IMAGE}/${RLOC}/${PRODUCTION_KERNEL}
        fi
    done
}

# Override kernel_do_compile used by do_bundle_initramfs in kernel.bbclass
# Added ${PARALLEL_MAKE} only
kernel_do_compile() {
	unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
	# The $use_alternate_initrd is only set from
	# do_bundle_initramfs() This variable is specifically for the
	# case where we are making a second pass at the kernel
	# compilation and we want to force the kernel build to use a
	# different initramfs image.  The way to do that in the kernel
	# is to specify:
	# make ...args... CONFIG_INITRAMFS_SOURCE=some_other_initramfs.cpio
	if [ "$use_alternate_initrd" = "" ] && [ "${INITRAMFS_TASK}" != "" ] ; then
		# The old style way of copying an prebuilt image and building it
		# is turned on via INTIRAMFS_TASK != ""
		copy_initramfs
		use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio
	fi
	oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} ${PARALLEL_MAKE} ${KERNEL_ALT_IMAGETYPE} CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd
	if test "${KERNEL_IMAGETYPE_FOR_MAKE}.gz" = "${KERNEL_IMAGETYPE}"; then
		gzip -9c < "${KERNEL_IMAGETYPE_FOR_MAKE}" > "${KERNEL_OUTPUT}"
	fi
}