diff options
author | nkskjames <nkskjames@gmail.com> | 2016-01-30 13:11:34 -0600 |
---|---|---|
committer | nkskjames <nkskjames@gmail.com> | 2016-01-30 13:11:34 -0600 |
commit | a5360eab96406d02ddc238a65fa61756ac98372b (patch) | |
tree | 3cc8821e7670072cf0515e2a1c0361f1d3f91921 /meta-phosphor/common/recipes-phosphor | |
parent | e83b5c12f7cdb59da8f9265622b5620c10f84024 (diff) | |
parent | 3e287b385e2bf08ddeee2a56e22f1168455d8c88 (diff) | |
download | talos-openbmc-a5360eab96406d02ddc238a65fa61756ac98372b.tar.gz talos-openbmc-a5360eab96406d02ddc238a65fa61756ac98372b.zip |
Merge pull request #150 from mdmillerii/persistent-2
Persistent 2
Diffstat (limited to 'meta-phosphor/common/recipes-phosphor')
5 files changed, 282 insertions, 0 deletions
diff --git a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh new file mode 100644 index 000000000..0dc4c35c6 --- /dev/null +++ b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh @@ -0,0 +1,85 @@ +#!/bin/sh + +rodir=run/initramfs/ro +rwdir=run/initramfs/rw +upper=$rwdir/cow +work=$rwdir/work + +cd / +mkdir -p sys proc dev run +mount dev dev -tdevtmpfs +mount sys sys -tsysfs +mount proc proc -tproc +if ! grep run proc/mounts +then + mount tmpfs run -t tmpfs -o mode=755,nodev +fi + +mkdir -p $rodir $rwdir + +cp -rp init shutdown update whitelist bin sbin usr lib etc var run/initramfs + +# To start a interactive shell with job control at this point, run +# getty 38400 ttyS4 + +findmtd() { + m=$(grep -xl "$1" /sys/class/mtd/*/name) + m=${m%/name} + m=${m##*/} + echo $m +} + +env=$(findmtd u-boot-env) +if test -n $env +then + ln -s /dev/$env /run/mtd:u-boot-env + cp /run/mtd:u-boot-env /run/fw_env +fi + +rofs=$(findmtd rofs) +rwfs=$(findmtd rwfs) + +rofst=squashfs +rwfst=ext4 + +echo rofs = $rofs $rofst rwfs = $rwfs $rwfst + +if grep -w debug-init-sh /proc/cmdline || + ! mount -o rw /dev/mtdblock${rwfs#mtd} $rwdir -t $rwfst +then + echo Please mount the rw file system on $rwdir from this shell + while ! sulogin && ! test -f /takeover + do + echo getty failed, retrying + done +fi + +# Touch /takeover in the above getty to become pid 1 +if test -e /takeover +then + export PS1=init#\ + exec /bin/sh +fi + +mount -o ro /dev/mtdblock${rofs#mtd} $rodir -t $rofst + +rm -rf $work +mkdir -p $upper +mkdir -p $work + +mount -t overlay -o lowerdir=$rodir,upperdir=$upper,workdir=$work cow /root + +if ! chroot /root /bin/sh -c exit +then + echo 'chroot test failed; invoking emergency shell.' + PS1=rescue#\ sulogin +fi + +for f in sys dev proc run +do + mount --move $f root/$f +done + +# switch_root /root /sbin/init +exec chroot /root /sbin/init + diff --git a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-shutdown.sh b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-shutdown.sh new file mode 100644 index 000000000..cc076fdc0 --- /dev/null +++ b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-shutdown.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +echo shutdown: "$@" + +export PS1=shutdown-sh#\ +# exec bin/sh + +if [ ! -e /proc/mounts ] +then + mkdir -p /proc + mount proc proc -tproc + umount_proc=1 +else + umount_proc= +fi + +# remove an empty oldroot, that means we are not invoked from systemd-shutdown +rmdir /oldroot 2>/dev/null + +set -x +for f in $( awk '/oldroot/ { print $2 }' < /proc/mounts | sort -r ) +do + umount $f +done +set +x + +if test -s /run/fw_env -a -c /run/mtd:u-boot-env -a ! -e /image-u-boot-env && + ! cmp /run/mtd:u-boot-env /run/fw_env +then + ln -s /run/fw_env /image-u-boot-env +fi + +if test -x /update && ls image-* > /dev/null 2>&1 +then + exec /update ${1+"$@"} +fi + +echo Remaining mounts: +cat /proc/mounts + +test "umount_proc" && umount /proc && rmdir /proc + + + +# Execute the command systemd told us to ... +if test -d /oldroot && test "$1" +then + if test "$1" == kexec + then + $1 -f -e + else + $1 -f + fi +fi + + +echo "Execute ${1-reboot} -f if all unounted ok, or exec /init" + +export PS1=shutdown-sh#\ +exec /bin/sh diff --git a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh new file mode 100755 index 000000000..1122e83fa --- /dev/null +++ b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh @@ -0,0 +1,106 @@ +#!/bin/sh + +echo update: "$@" + +export PS1=update-sh#\ +# exec /bin/sh + +cd / +if ! test -r /proc/mounts || ! test -f /proc/mounts +then + mkdir -p /proc + mount -t proc proc proc +fi +if ! test -d /sys/class +then + mkdir -p /sys + mount -t sysfs sys sys +fi +if ! test -c /dev/null +then + mkdir -p /dev + mount -t devtmpfs dev dev +fi +while grep mtd /proc/mounts +do + echo 1>&2 "Error: A mtd device is mounted." + sulogin + # exec /bin/sh +done + +findmtd() { + m=$(grep -xl "$1" /sys/class/mtd/*/name) + m=${m%/name} + m=${m##*/} + echo $m +} + +rofs=$(findmtd rofs) +rwfs=$(findmtd rwfs) + +rofst=squahsfs +rwfst=ext4 + +if test -n "$rwfs" && test -s whitelist +then + + mkdir -p rw + mount /dev/mtdblock${rwfs#mtd} rw -oro -t $rwfst + + while read f + do + if ! test -e rw/cow/$f + then + continue + fi + d="save/cow/$f" + mkdir -p "${d%/*}" + cp -rp rw/cow/$f "${d%/*}/" + done < whitelist + + umount rw +fi + + +for f in image-* +do + m=$(findmtd ${f#image-}) + if test -z "$m" + then + echo 1>&2 "Unable to find mtd partiton for $f" + exec /bin/sh + fi +done + +for f in image-* +do + m=$(findmtd ${f#image-}) + echo "Updating ${f#image-}" + # flasheraseall /dev/$m && dd if=$f of=/dev/$m + flashcp -v $f /dev/$m +done + + +if test -d save/cow +then + mount /dev/mtdblock${rwfs#mtd} rw -o rw -t $rwfst + cp -rp save/cow/. rw/cow/ + umount rw +fi + +# Execute the command systemd told us to ... +if test -d /oldroot && test -x "/sbin/$1" && test -f "/sbin/$1" +then + if test "$1" == kexec + then + /sbin/$1 -f -e + else + /sbin/$1 -f + fi +fi + + +echo "Execute ${1-reboot} -f if all is ok" + +export PS1=update-sh#\ +exec /bin/sh diff --git a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/whitelist b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/whitelist new file mode 100644 index 000000000..80f9c81e7 --- /dev/null +++ b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/files/whitelist @@ -0,0 +1,8 @@ +/etc/dropbear/dropbear_rsa_host_key +/etc/systemd/network +/etc/resolv.conf +/etc/machine-id +/etc/passwd +/etc/group +/etc/shadow +/etc/gshadow diff --git a/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/obmc-phosphor-init.bb b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/obmc-phosphor-init.bb new file mode 100644 index 000000000..68ee00d20 --- /dev/null +++ b/meta-phosphor/common/recipes-phosphor/obmc-phosphor-initfs/obmc-phosphor-init.bb @@ -0,0 +1,23 @@ +SUMMARY = "Phosphor OpenBMC pre-init scripts" +DESCRIPTION = "Phosphor OpenBMC filesytem mount reference implementation." +PR = "r1" + +inherit obmc-phosphor-license +inherit obmc-phosphor-initfs + +S = "${WORKDIR}" +SRC_URI += "file://obmc-init.sh" +SRC_URI += "file://obmc-shutdown.sh" +SRC_URI += "file://obmc-update.sh" +SRC_URI += "file://whitelist" + +do_install() { + install -m 0755 ${WORKDIR}/obmc-init.sh ${D}/init + install -m 0755 ${WORKDIR}/obmc-shutdown.sh ${D}/shutdown + install -m 0755 ${WORKDIR}/obmc-update.sh ${D}/update + install -m 0644 ${WORKDIR}/whitelist ${D}/whitelist + install -d ${D}/dev + mknod -m 622 ${D}/dev/console c 5 1 +} + +FILES_${PN} += " /init /shutdown /update /whitelist /dev " |