[OE-core] [PATCH 3/4] populate-volatile.sh: add ROOT_DIR variable to support running at rootfs time

Bernhard Reutner-Fischer rep.dot.nop at gmail.com
Tue Feb 19 11:56:04 UTC 2013


On 19 February 2013 08:38,  <Qi.Chen at windriver.com> wrote:
> From: Chen Qi <Qi.Chen at windriver.com>
>
> For populate-volatile.sh script to run correctly both at rootfs time and
> at system boot time, it needs to be aware of which situation it is now in.
>
> We use the ROOT_DIR variable to indicate whether it is run at rootfs time or
> not. ROOT_DIR being "/" indicates that this script is run at system boot time,
> otherwise, it is run at rootfs time.
>
> Also, we ignore failures when running this script at rootfs time.
> For example, if ${ROOT_DIR}/var/dir1 is symlink to /var/volatile/dir1, it's
> possible that the link is a dead link. So if we're going to create some file
> under ${ROOT_DIR}/var/dir1, it will fail. But the failure does no harm,
> because this script will always run at system boot time to set up the correct
> files and directories.
>
> [YOCTO #3406]
>
> Signed-off-by: Chen Qi <Qi.Chen at windriver.com>
> ---
>  .../initscripts-1.0/populate-volatile.sh           |   57 +++++++++++++++-----
>  1 file changed, 43 insertions(+), 14 deletions(-)
>
> diff --git a/meta/recipes-core/initscripts/initscripts-1.0/populate-volatile.sh b/meta/recipes-core/initscripts/initscripts-1.0/populate-volatile.sh
> index ab3af70..f1f8793 100755
> --- a/meta/recipes-core/initscripts/initscripts-1.0/populate-volatile.sh
> +++ b/meta/recipes-core/initscripts/initscripts-1.0/populate-volatile.sh
> @@ -8,10 +8,18 @@
>  # Short-Description:  Populate the volatile filesystem
>  ### END INIT INFO
>
> -. /etc/default/rcS
> -
> -CFGDIR="/etc/default/volatiles"
> -TMPROOT="/var/tmp"
> +# Get ROOT_DIR
> +DIRNAME=`dirname $0`
> +ROOT_DIR=`echo $DIRNAME | sed -ne 's:etc/.*::p'`
> +
> +[ -e ${ROOT_DIR}/etc/default/rcS ] && . ${ROOT_DIR}/etc/default/rcS
> +# When running populat-volatile.sh at rootfs time, disable cache.

populate-volatile.sh, missing 'e'

And if you touch that script, please trim all that ugly trailing
whitespace while at it:
sed -i -e 's/[[:space:]]*$//g'
meta/recipes-core/initscripts/initscripts*/populate-volatile.sh

> +[ "$ROOT_DIR" != "/" ] && VOLATILE_ENABLE_CACHE=no
> +# If rootfs is read-only, disable cache.
> +[ "$ROOTFS_READ_ONLY" = "yes" ] && VOLATILE_ENABLE_CACHE=no
> +
> +CFGDIR="${ROOT_DIR}/etc/default/volatiles"
> +TMPROOT="${ROOT_DIR}/var/tmp"
>  COREDEF="00_core"
>
>  [ "${VERBOSE}" != "no" ] && echo "Populating volatile Filesystems."
> @@ -27,7 +35,15 @@ create_file() {
>         [ -e "$1" ] && {
>                 [ "${VERBOSE}" != "no" ] && echo "Target already exists. Skipping."
>         } || {
> -               eval $EXEC &
> +               if [ "$ROOT_DIR" = "/" ]; then
> +                       eval $EXEC &
> +               else
> +                       # Creating some files at rootfs time may fail and should fail,
> +                       # but these failures should not be logged to make sure the do_rootfs
> +                       # process doesn't fail. This does no harm, as this script will
> +                       # run on target to set up the correct files and directories.
> +                       eval $EXEC > /dev/null 2>&1

why don't you background here?

> +               fi
>         }
>  }
>
> @@ -41,7 +57,13 @@ mk_dir() {
>         [ -e "$1" ] && {
>                 [ "${VERBOSE}" != "no" ] && echo "Target already exists. Skipping."
>         } || {
> -               eval $EXEC
> +               if [ "$ROOT_DIR" = "/" ]; then
> +                       eval $EXEC
> +               else
> +                       # For the same reason with create_file(), failures should
> +                       # not be logged.
> +                       eval $EXEC > /dev/null 2>&1
> +               fi
>         }
>  }
>
> @@ -53,7 +75,13 @@ link_file() {
>         [ -e "$2" ] && {
>                 echo "Cannot create link over existing -${TNAME}-." >&2
>         } || {
> -               eval $EXEC &
> +               if [ "$ROOT_DIR" = "/" ]; then
> +                       eval $EXEC &
> +               else
> +                       # For the same reason with create_file(), failures should
> +                       # not be logged.
> +                       eval $EXEC > /dev/null 2>&1

why don't you background here?
> +               fi
>         }
>  }
>
> @@ -71,7 +99,7 @@ check_requirements() {
>         TMP_DEFINED="${TMPROOT}/tmpdefined.$$"
>         TMP_COMBINED="${TMPROOT}/tmpcombined.$$"
>
> -       cat /etc/passwd | sed 's@\(^:\)*:.*@\1@' | sort | uniq > "${TMP_DEFINED}"
> +       cat ${ROOT_DIR}/etc/passwd | sed 's@\(^:\)*:.*@\1@' | sort | uniq > "${TMP_DEFINED}"

I would have remove the cat.

>         cat ${CFGFILE} | grep -v "^#" | cut -d " " -f 2 > "${TMP_INTERMED}"
>         cat "${TMP_DEFINED}" "${TMP_INTERMED}" | sort | uniq > "${TMP_COMBINED}"
>         NR_DEFINED_USERS="`cat "${TMP_DEFINED}" | wc -l`"
> @@ -85,7 +113,7 @@ check_requirements() {
>         }
>
>
> -       cat /etc/group | sed 's@\(^:\)*:.*@\1@' | sort | uniq > "${TMP_DEFINED}"
> +       cat ${ROOT_DIR}/etc/group | sed 's@\(^:\)*:.*@\1@' | sort | uniq > "${TMP_DEFINED}"

likewise.
>         cat ${CFGFILE} | grep -v "^#" | cut -d " " -f 3 > "${TMP_INTERMED}"
>         cat "${TMP_DEFINED}" "${TMP_INTERMED}" | sort | uniq > "${TMP_COMBINED}"
>
> @@ -116,6 +144,7 @@ apply_cfgfile() {
>         cat ${CFGFILE} | grep -v "^#" | \
>                 while read LINE; do
>                 eval `echo "$LINE" | sed -n "s/\(.*\)\ \(.*\) \(.*\)\ \(.*\)\ \(.*\)\ \(.*\)/TTYPE=\1 ; TUSER=\2; TGROUP=\3; TMODE=\4; TNAME=\5 TLTARGET=\6/p"`
> +               TNAME=${ROOT_DIR}/${TNAME}
>                 [ "${VERBOSE}" != "no" ] && echo "Checking for -${TNAME}-."
>
>                 [ "${TTYPE}" = "l" ] && {
> @@ -168,19 +197,19 @@ do
>  done
>  exec 9>&-
>
> -if test -e /etc/volatile.cache -a "$VOLATILE_ENABLE_CACHE" = "yes" -a "x$1" != "xupdate" -a "x$clearcache" = "x0"
> +if test -e ${ROOT_DIR}/etc/volatile.cache -a "$VOLATILE_ENABLE_CACHE" = "yes" -a "x$1" != "xupdate" -a "x$clearcache" = "x0"
>  then
> -       sh /etc/volatile.cache
> +       sh ${ROOT_DIR}/etc/volatile.cache
>  else
> -       rm -f /etc/volatile.cache /etc/volatile.cache.build
> +       rm -f ${ROOT_DIR}/etc/volatile.cache /etc/volatile.cache.build

why just the first one and not .build too?

>         for file in `ls -1 "${CFGDIR}" | sort`; do
>                 apply_cfgfile "${CFGDIR}/${file}"
>         done
>
> -       [ -e /etc/volatile.cache.build ] && sync && mv /etc/volatile.cache.build /etc/volatile.cache
> +       [ -e ${ROOT_DIR}/etc/volatile.cache.build ] && sync && mv /etc/volatile.cache.build /etc/volatile.cache

hm? Likewise, missing ${ROOT_DIR} ?

>  fi
>
> -if test -f /etc/ld.so.cache -a ! -f /var/run/ld.so.cache
> +if [ "${ROOT_DIR}" = "/" ] && [ -f /etc/ld.so.cache ] && [ ! -f /var/run/ld.so.cache ]
>  then
>         ln -s /etc/ld.so.cache /var/run/ld.so.cache
>  fi




More information about the Openembedded-core mailing list