From f67c45dd4ba4081ec4f8b82cee2b2da0f5d06143 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Thu, 30 Mar 2023 23:49:54 +0800 Subject: [PATCH] update patch file name in kirkstone-lf-5.15.71-2.2.0 --- bsp/rootfs/build.sh | 388 ++++++++++++++++++++++++------------------------------ 1 files changed, 172 insertions(+), 216 deletions(-) diff --git a/bsp/rootfs/build.sh b/bsp/rootfs/build.sh index 11d2a5c..7cf4a54 100755 --- a/bsp/rootfs/build.sh +++ b/bsp/rootfs/build.sh @@ -1,38 +1,15 @@ #!/bin/bash -PRJ_PATH=`pwd` -PRJ_NAME=`basename ${PRJ_PATH}` +source ../scripts/setup_env.sh -BOARD=igkboard +JSON_CONF=rootfs.json -# $SYSTEM should be buildroot, yocto or debian -# Buildroot distro should be: buildroot-2021.02 -# Yocto distro should be : hardknott -# Debian distro should be : buster or bullseye -SYSTEM=buildroot -DISTRO=v2021.02 - -SYSTYPE=`echo $SYSTEM | tr 'A-Z' 'a-z'` -if [ $SYSTYPE == "debian" ] ; then - SYSNAME=${DISTRO} -else - SYSNAME=${SYSTYPE} -fi -ROOTFS_DIR=rootfs_${SYSNAME} - -TAR_PATH=${PRJ_PATH}/../tarball -DRV_PATH=${PRJ_PATH}/driver - -# rootfs configuration -ARCH=armhf -DEF_USER=lingyun -DEF_PASSWD=12345 +DEF_USER=`jq -r ".SYS_CONF.DEF_USER" $JSON_CONF` +DEF_PASSWD=`jq -r ".SYS_CONF.DEF_PASSWD" $JSON_CONF` DEF_HOSTNAME=${BOARD} -APT_CONF=extra_apps.json -PATCH_PATH=${PRJ_PATH}/files +TARBALL_DIR=${PRJ_PATH}/../tarballs/ -set -u set -e trap 'exit_handler' EXIT @@ -42,195 +19,186 @@ umount ${ROOTFS_DIR}/{sys,proc,dev/pts,dev} 2>/dev/null || true } -STAGE=0 -function msg_banner() +function do_debian_fetch() { - STAGE=`expr $STAGE + 1` - - echo "" - echo "+---------------------------------------------+" - printf " Stage $STAGE: $1\n" - echo "+---------------------------------------------+" - echo "" -} - -function do_unpack() -{ - if [ -d ${ROOTFS_DIR} ] ; then - printf "\n\n -- ${ROOTFS_DIR} fetched already, skip it -- \n\n" + if [ $SYSTEM != debian -o -d $ROOTFS_DIR ] ; then return; fi - if [ -s ${TAR_PATH}/${ROOTFS_DIR}.tar.bz2 ] ; then - printf "\n\n -- decompress ${ROOTFS_DIR}.tar.bz2 -- \n\n" - mkdir -p ${ROOTFS_DIR} - tar -xjf ${TAR_PATH}/${ROOTFS_DIR}.tar.bz2 -C ${ROOTFS_DIR} + debian_src=$1 + ARCH=$2 + + # debootstrap fetch debian rootfs + export DEBIAN_FRONTEND=noninteractive + export DEBCONF_NONINTERACTIVE_SEEN=true + export LC_ALL=C + export LANGUAGE=C + export LANG=C + + pr_warn "debootstrap fetch start" + + pr_info "debootstrap --arch=${ARCH} --foreign ${DISTRO} ${ROOTFS_DIR} ${debian_src}" + debootstrap --arch=${ARCH} --foreign ${DISTRO} ${ROOTFS_DIR} ${debian_src} + chroot ${ROOTFS_DIR} debootstrap/debootstrap --second-stage + + pr_warn "debootstrap fetch done" + chroot ${ROOTFS_DIR} dpkg --configure -a + + cd ${ROOTFS_DIR} + tar -cjf ../${ROOTFS_DIR}.orig.tar.bz2 * + cd - +} + +# Install extra apps defined in configure file +function do_debian_apt() +{ + if [ $SYSTEM != debian ] ; then + return; fi - return; + apt_install=$(eval echo `jq -r .SYS_DEBIAN.INSTALL_APT $JSON_CONF` | tr 'A-Z' 'a-z') + if [ $apt_install != yes ] ; then + pr_warn "skip debootstrap apt install extra apps" + return; + fi + + pr_warn "debootstrap apt install extra apps" + + extra_apps=`eval jq -r .SYS_DEBIAN.APT_APPS[] $JSON_CONF` + + cp -f /usr/bin/qemu-arm-static ${ROOTFS_DIR}/usr/bin/ + + mount -o bind /proc ${ROOTFS_DIR}/proc + mount -o bind /dev ${ROOTFS_DIR}/dev + mount -o bind /dev/pts ${ROOTFS_DIR}/dev/pts + mount -o bind /sys ${ROOTFS_DIR}/sys + + chroot ${ROOTFS_DIR} apt update + chroot ${ROOTFS_DIR} apt install -y ${extra_apps} + chroot ${ROOTFS_DIR} apt autoremove + + umount ${ROOTFS_DIR}/{sys,proc,dev/pts,dev} + pr_warn "debootstrap apt install done" +} + +function do_debian_conf() +{ + if [ $SYSTEM != debian ] ; then + return; + fi + + pr_warn "update debian system configuration" + + # add default user account + set +e + grep "$DEF_USER" ${ROOTFS_DIR}/etc/passwd > /dev/null 2>&1 + if [ $? != 0 ] ; then + pr_info "setup default user account" + cp -f /usr/bin/qemu-arm-static ${ROOTFS_DIR}/usr/bin/ + chroot ${ROOTFS_DIR} chmod 4755 /usr/bin/sudo + chroot ${ROOTFS_DIR} sh -c "useradd -m -s /bin/bash ${DEF_USER}" + chroot ${ROOTFS_DIR} sh -c "echo ${DEF_USER}:${DEF_PASSWD} | chpasswd" + chroot ${ROOTFS_DIR} sh -c "usermod -aG video,audio,sudo ${DEF_USER}" + fi + set -e + + # modify root password + chroot ${ROOTFS_DIR} sh -c "echo root:${DEF_PASSWD} | chpasswd" + + # update PATH environment in /etc/profile + sed -i 's|PATH=.*|PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"|g' ${ROOTFS_DIR}/etc/profile + + # update sudo without passwd + sed -i "s|^%sudo.*|%sudo ALL=(ALL:ALL) NOPASSWD:ALL|g" ${ROOTFS_DIR}/etc/sudoers + + # enable ping command for all user + chmod 4755 ${ROOTFS_DIR}/usr/bin/ping* + + # enable root login on serial port + MOD_FILE=${ROOTFS_DIR}/etc/securetty + set +e + grep ttyLP1 ${MOD_FILE} > /dev/null 2>&1 + if [ $? != 0 ] ; then + echo "" >> ${MOD_FILE} + echo "# i.MX8ULP serial console" >> ${MOD_FILE} + echo "ttyLP1" >> ${MOD_FILE} + echo "ttyLP2" >> ${MOD_FILE} + echo "ttyLP3" >> ${MOD_FILE} + fi + set -e } -# debootstrap fetch debian rootfs function do_fetch() { - msg_banner " ${ROOTFS_DIR} do fetch " - - # try to decompress packet first. - do_unpack - - if [ -d ${ROOTFS_DIR} ] ; then - return ; - else - if [ $SYSTYPE != "debian" ] ; then - echo " ERROR: miss ${SYSTEM}(${DISTRO}) rootfs, exit now. " - echo "" - exit; - fi + if [ -d $ROOTFS_DIR ] ; then + pr_warn "rootfs tree for $SYSTEM($DISTRO) fetch already" + return; fi - export DEBIAN_FRONTEND=noninteractive - export DEBCONF_NONINTERACTIVE_SEEN=true - export LC_ALL=C - export LANGUAGE=C - export LANG=C + pr_warn "start fetch rootfs tree for $SYSTEM($DISTRO) " - printf "\n\n -- debootstrap fetch start --\n\n" - debootstrap --arch=${ARCH} --foreign ${DISTRO} ${ROOTFS_DIR} http://ftp.cn.debian.org/debian/ + if [ -f $ROOTFS_DIR.tar.bz2 ] ; then + do_unpack $TARBALL_DIR/$ROOTFS_DIR.tar.bz2 $ROOTFS_DIR + return; + fi - chroot ${ROOTFS_DIR} debootstrap/debootstrap --second-stage - printf "\n\n -- debootstrap config start --\n\n" + if [ $SYSTEM == "yocto" ] ; then - chroot ${ROOTFS_DIR} dpkg --configure -a - printf "\n\n -- debootstrap fetch done -- \n\n" + mkdir -p $ROOTFS_DIR + do_fetch_json $JSON_CONF SYS_YOCTO $ROOTFS_DIR - # Clear the MD5 value to install extra apps - sed -i -e "s|.*md5val.*|\t\"md5val\":\"MD5_Auto_Generate_Here\"|g" $APT_CONF -} + elif [ $SYSTEM == "buildroot" ] ; then -# Install extra apps defined in extra_apps.conf -function do_apt() -{ - export DEBIAN_FRONTEND=noninteractive - export DEBCONF_NONINTERACTIVE_SEEN=true - export LC_ALL=C - export LANGUAGE=C - export LANG=C + mkdir -p $ROOTFS_DIR + do_fetch_json $JSON_CONF SYS_BUILDROOT $ROOTFS_DIR - msg_banner " debootstrap apt install " + elif [ $SYSTEM == "debian" ] ; then + protocal=`jq -r ".SYS_DEBIAN.PROTOCAL" $JSON_CONF` + if [ $protocal != "debootstrap" ] ; then + mkdir -p $ROOTFS_DIR + do_fetch_json $JSON_CONF SYS_DEBIAN $ROOTFS_DIR - if [ -f $APT_CONF ] ; then - extra_apps=$(eval jq -r .extra_apps[] $APT_CONF ) - md5_file=$(eval jq -r .md5val extra_apps.json) - md5_calc=$(eval echo $extra_apps | md5sum | awk '{print $1}') - - - if [ $md5_file == $md5_calc ] ; then - printf "\n\n -- debootstrap apt install already, skip it! --\n\n" else - printf "\n\n -- debootstrap apt install start --\n\n" - - cp -f /usr/bin/qemu-arm-static ${ROOTFS_DIR}/usr/bin/ - mount -o bind /proc ${ROOTFS_DIR}/proc - mount -o bind /dev ${ROOTFS_DIR}/dev - mount -o bind /dev/pts ${ROOTFS_DIR}/dev/pts - mount -o bind /sys ${ROOTFS_DIR}/sys - - chroot ${ROOTFS_DIR} apt update - chroot ${ROOTFS_DIR} apt install -y ${extra_apps} - - umount ${ROOTFS_DIR}/{sys,proc,dev/pts,dev} - - sed -i -e "s|.*md5val.*|\t\"md5val\":\"$md5_calc\"|g" $APT_CONF - printf "\n\n -- debootstrap apt install done --\n\n" - - # modify root password - chroot ${ROOTFS_DIR} sh -c "echo root:${DEF_PASSWD} | chpasswd" - - # add extra user account - set +e - grep "$DEF_USER" ${ROOTFS_DIR}/etc/passwd > /dev/null 2>&1 - if [ $? != 0 ] ; then - printf "\n\n -- setup default user account --\n\n" - chroot ${ROOTFS_DIR} sh -c "useradd -m -s /bin/bash ${DEF_USER}" - chroot ${ROOTFS_DIR} sh -c "echo ${DEF_USER}:${DEF_PASSWD} | chpasswd" - chroot ${ROOTFS_DIR} sh -c "usermod -G video,audio,sudo avnet" - - echo "${DEF_USER} ALL=(ALL:ALL) NOPASSWD:ALL" >> ${ROOTFS_DIR}/etc/sudoers - fi - set -e + debian_src=`jq -r ".SYS_DEBIAN.URL" $JSON_CONF` + arch=`jq -r ".SYS_DEBIAN.ARCH" $JSON_CONF` + do_debian_fetch $debian_src $arch fi + + fi + rm -f *.tar.* +} + + +function do_install() +{ + # Remove lib/modules first + rm -rf $ROOTFS_DIR/lib/modules/* + + # apt install extra packet for debian rootfs + if [ $SYSTEM == "debian" ] ; then + do_debian_apt + do_debian_conf + do_install_json $JSON_CONF SYS_DEBIAN.INSTALL_FILES + elif [ $SYSTEM == "yocto" ] ; then + do_install_json $JSON_CONF SYS_YOCTO.INSTALL_FILES + elif [ $SYSTEM == "buildroot" ] ; then + do_install_json $JSON_CONF SYS_BUILDROOT.INSTALL_FILES fi } -function do_modules() +function do_config() { - msg_banner " install linux firmware" - if [ -s ${TAR_PATH}/firmware.tar.bz2 ] ; then - tar -xjf ${TAR_PATH}/firmware.tar.bz2 -C ${ROOTFS_DIR}/lib/ - fi - - if [ ! -d ${DRV_PATH}/lib/ ] ; then - return ; - fi - - if [ -d ${DRV_PATH}/lib/modules ] ; then - msg_banner " install kernel modules" - rm -rf ${ROOTFS_DIR}/lib/modules/ - cp -af ${DRV_PATH}/lib/modules ${ROOTFS_DIR}/lib/ - fi -} - -function do_common() -{ - if [ -s ${PATCH_PATH}/expand_rootfs ] ; then - cp ${PATCH_PATH}/expand_rootfs ${ROOTFS_DIR}/usr/sbin/ - chmod a+x ${ROOTFS_DIR}/usr/sbin/expand_rootfs - fi -} - -function do_buildroot() -{ - if [ $SYSTYPE != "buildroot" ] ; then - return ; - fi - - # add vim alias for vim - grep "alias vim=" ${ROOTFS_DIR}/etc/profile > /dev/null 2>&1 - if [ $? != 0 ] ; then - echo "alias vim='vi'" >> ${ROOTFS_DIR}/etc/profile - fi - - if [ -s ${PATCH_PATH}/S30WpaSupplicant ] ; then - cp ${PATCH_PATH}/S30WpaSupplicant ${ROOTFS_DIR}/etc/init.d/ - chmod a+x ${ROOTFS_DIR}/etc/init.d/S30WpaSupplicant - fi - - if [ -s ${PATCH_PATH}/wpa_supplicant.conf ] ; then - cp ${PATCH_PATH}/wpa_supplicant.conf ${ROOTFS_DIR}/etc/ - fi - - printf "\n\n -- modify buildroot rootfs done --\n\n" -} - -function do_modify() -{ - msg_banner " modify rootfs environment" + pr_warn "start configure for $SYSTEM($DISTRO) rootfs" set +e - # modify for buildroot rootfs - do_buildroot - - # modify for all rootfs - do_common - # update hostnmae and issue - echo "Welcome to LingYun IoT Gateway Kit Board GNU/Linux ${SYSTEM}(${DISTRO}) system, default password '$DEF_PASSWD'." > ${ROOTFS_DIR}/etc/issue + echo "Welcome to ${BOARD} Board GNU/Linux ${SYSTEM}(${DISTRO}) system, default password '$DEF_PASSWD'." > ${ROOTFS_DIR}/etc/issue echo $DEF_HOSTNAME > ${ROOTFS_DIR}/etc/hostname - grep "$BOARD" ${ROOTFS_DIR}/etc/hosts > /dev/null 2>&1 + grep "${DEF_HOSTNAME}" ${ROOTFS_DIR}/etc/hosts > /dev/null 2>&1 if [ $? != 0 ] ; then - echo "127.0.0.1 ${BOARD}" >> ${ROOTFS_DIR}/etc/hosts + echo "127.0.0.1 ${DEF_HOSTNAME}" >> ${ROOTFS_DIR}/etc/hosts fi # update dns server @@ -241,7 +209,6 @@ sed -i "s|PS1='# '|PS1='\\\u@\\\h:\\\w# '|g" ${ROOTFS_DIR}/etc/profile sed -i "s|PS1='$ '|PS1='\\\u@\\\h:\\\w$ '|g" ${ROOTFS_DIR}/etc/profile - # add ls alias for display with color grep "^alias ls=" ${ROOTFS_DIR}/etc/profile > /dev/null 2>&1 if [ $? != 0 ] ; then @@ -249,38 +216,31 @@ fi # permit root ssh login - sed -i "s|^#PermitRootLogin.*|PermitRootLogin yes|g" ${ROOTFS_DIR}/etc/ssh/sshd_config - sed -i "s|^#PasswordAuthentication.*|PasswordAuthentication yes|g" ${ROOTFS_DIR}/etc/ssh/sshd_config + if [ -f ${ROOTFS_DIR}/etc/ssh/sshd_config ] ; then + sed -i "s|^#PermitRootLogin.*|PermitRootLogin yes|g" ${ROOTFS_DIR}/etc/ssh/sshd_config + sed -i "s|^#PasswordAuthentication.*|PasswordAuthentication yes|g" ${ROOTFS_DIR}/etc/ssh/sshd_config + fi set -e - - printf "\n\n -- modify rootfs done --\n\n" + pr_warn "configure for $SYSTEM($DISTRO) rootfs done" } function do_pack() { - if [ -f ${ROOTFS_DIR}.tar.bz2 ] ; then - msg_banner " rootfs already generate, skip it" - return ; - else - msg_banner " generate rootfs packet " - fi + pr_warn "start generate $SYSTEM($DISTRO) rootfs packet" cd ${ROOTFS_DIR} - tar -cjf ../${ROOTFS_DIR}.tar.bz2 * - cd ${PRJ_PATH} - printf "\n\n -- generate rootfs packet done --\n\n" + pr_warn "generate $SYSTEM($DISTRO) rootfs packet done" } function do_distclean() { - printf "\n\n -- do distclean in $PRJ_NAME --\n\n" + pr_warn "clean rootfs source tree" - rm -rf driver - rm -rf $ROOTFS_DIR + rm -rf $ROOTFS_DIR* rootfs_* exit; } @@ -288,17 +248,8 @@ function do_rootfs() { do_fetch - - echo "do rootfs continue " - - # debian rootfs need apt install packet - if [ $SYSTYPE == "debian" ] ;then - do_apt - fi - - do_modules - do_modify - do_pack + do_install + do_config } function do_root() @@ -319,8 +270,9 @@ { echo "" echo "Usage:" - echo " $0 [-b] [-c] [-h]" + echo " $0 [-b] [p] [-c] [-h]" echo " -b: download and build $PRJ_NAME" + echo " -p: packet the rootfs tree source" echo " -c: clean all the source code" echo " -h: show this help message" echo "" @@ -329,11 +281,15 @@ exit; } -while getopts "bch" OPTNAME +while getopts "bpch" OPTNAME do case "${OPTNAME}" in "b") break; + ;; + + "p") + do_pack ;; "c") @@ -341,7 +297,7 @@ do_distclean ;; - "*") + "h") do_usage ;; esac -- Gitblit v1.9.1