#!/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
|
|
elif [ $SYSTEM == "buildroot" ] ; then
|
|
mkdir -p $ROOTFS_DIR
|
do_fetch_json $JSON_CONF SYS_BUILDROOT $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
|
|
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
|