#!/bin/bash source ../scripts/setup_env.sh JSON_CONF=rootfs.json DEF_USER=`jq -r ".SYS_CONF.DEF_USER" $JSON_CONF` DEF_PASSWD=`jq -r ".SYS_CONF.DEF_PASSWD" $JSON_CONF` DEF_HOSTNAME=${BOARD} TARBALL_DIR=${PRJ_PATH}/../tarballs/ set -e trap 'exit_handler' EXIT function exit_handler() { rm -f ${ROOTFS_DIR}/usr/bin/qemu-arm-static umount ${ROOTFS_DIR}/{sys,proc,dev/pts,dev} 2>/dev/null || true } function do_debian_fetch() { if [ $SYSTEM != debian -o -d $ROOTFS_DIR ] ; then return; fi 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 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 } function do_fetch() { if [ -d $ROOTFS_DIR ] ; then pr_warn "rootfs tree for $SYSTEM($DISTRO) fetch already" return; fi pr_warn "start fetch rootfs tree for $SYSTEM($DISTRO) " if [ -f $ROOTFS_DIR.tar.bz2 ] ; then do_unpack $TARBALL_DIR/$ROOTFS_DIR.tar.bz2 $ROOTFS_DIR return; fi if [ $SYSTEM == "yocto" ] ; then mkdir -p $ROOTFS_DIR do_fetch_json $JSON_CONF SYS_YOCTO $ROOTFS_DIR do_unpack $TARBALL_DIR/$ROOTFS_DIR.tar.bz2 $ROOTFS_DIR elif [ $SYSTEM == "buildroot" ] ; then mkdir -p $ROOTFS_DIR do_fetch_json $JSON_CONF SYS_BUILDROOT $ROOTFS_DIR do_unpack $TARBALL_DIR/$ROOTFS_DIR.tar.bz2 $ROOTFS_DIR 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 do_unpack $TARBALL_DIR/$ROOTFS_DIR.tar.bz2 $ROOTFS_DIR else 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_config() { pr_warn "start configure for $SYSTEM($DISTRO) rootfs" set +e # update hostnmae and 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 "${DEF_HOSTNAME}" ${ROOTFS_DIR}/etc/hosts > /dev/null 2>&1 if [ $? != 0 ] ; then echo "127.0.0.1 ${DEF_HOSTNAME}" >> ${ROOTFS_DIR}/etc/hosts fi # update dns server echo "nameserver 114.114.114.114" > ${ROOTFS_DIR}/etc/resolv.conf echo "nameserver 223.5.5.5" >> ${ROOTFS_DIR}/etc/resolv.conf # update profile 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 echo "alias ls='ls --color=auto'" >> ${ROOTFS_DIR}/etc/profile fi # permit root ssh login 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 pr_warn "configure for $SYSTEM($DISTRO) rootfs done" } function do_pack() { pr_warn "start generate $SYSTEM($DISTRO) rootfs packet" cd ${ROOTFS_DIR} tar -cjf ../${ROOTFS_DIR}.tar.bz2 * cd ${PRJ_PATH} pr_warn "generate $SYSTEM($DISTRO) rootfs packet done" } function do_distclean() { pr_warn "clean rootfs source tree" rm -rf $ROOTFS_DIR* rootfs_* exit; } function do_rootfs() { do_fetch do_install do_config } function do_root() { echo "" if [[ $1 == "yes" ]] && [ `id -u` != 0 ] ; then echo "ERROR: This action must run as root!" echo "" exit; elif [[ $1 != "yes" ]] && [ `id -u` == 0 ] ; then echo "ERROR: This action cannot run as root!" echo "" exit; fi } function do_usage() { echo "" echo "Usage:" 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 "" echo " WARNNING: This shell script must run as sudo" echo "" exit; } while getopts "bpch" OPTNAME do case "${OPTNAME}" in "b") break; ;; "p") do_pack ;; "c") do_root "yes" do_distclean ;; "h") do_usage ;; esac done do_root "yes" do_rootfs