diff --git a/scripts/live b/scripts/live index 08d6d74..d774284 100755 --- a/scripts/live +++ b/scripts/live @@ -1485,7 +1485,8 @@ setup_unionfs () then if [ -n "${PERSISTENT_READONLY}" ] then - root_backing="/${rootmnt}/live/persistent/$(basename ${cowdevice})-root" + mount -t tmpfs -o rw,noatime,mode=755 tmpfs "/cow" + root_backing="${rootmnt}/live/persistent/$(basename ${cowdevice})-root" mkdir -p ${root_backing} else root_backing="/cow" @@ -1505,6 +1506,7 @@ setup_unionfs () rofscount=$(echo ${rofslist} |wc -w) + # XXX: we now ensure that there can only be one read-only filesystem. Should this be inside the EXPOSED_ROOT if? if [ ${rofscount} -ne 1 ] then panic "only one RO file system supported with exposedroot: ${rofslist}" @@ -1532,21 +1534,25 @@ setup_unionfs () #panic "unionmount does not support subunions (${cow_dirs})." fi - unionmountopts="" - unionmountpoint="" - for dir in ${cow_dirs}; do - unionrw="/cow${dir}" - unionro="${rofs}${dir}" unionmountpoint="${rootmnt}${dir}" - mkdir -p ${unionrw} + mkdir -p ${unionmountpoint} if [ "${UNIONTYPE}" = "unionmount" ] then # FIXME: handle PERSISTENT_READONLY unionmountopts="-t ${cow_fstype} -o noatime,union,${cow_mountopt} ${cowdevice}" mount_full $unionmountopts "${unionmountpoint}" else - do_union ${root_backing} ${unionrw} ${unionro} ${unionmountpoint} + cow_dir="/cow${dir}" + rofs_dir="${rofs}${dir}" + mkdir -p ${cow_dir} + if [ -n "${PERSISTENT_READONLY}" ] && [ "${cowdevice}" != "tmpfs" ] + then + #mount -t tmpfs -o rw,noatime,mode=755 tmpfs "${cow_dir}" + do_union ${unionmountpoint} ${cow_dir} ${root_backing} ${rofs_dir} + else + do_union ${unionmountpoint} ${cow_dir} ${rofs_dir} + fi fi || panic "mount ${UNIONTYPE} on ${unionmountpoint} failed with option ${unionmountopts}" done @@ -1743,10 +1749,10 @@ setup_unionfs () dest="$(mktemp -d ${persistent_backing}/links_source-XXXXXX)" links_source="${dest}" fi - unionrw="$(echo ${dest} | sed -e "s|${rootmnt}|/cow/|")" - mkdir -p ${unionrw} - unionmountopts="noatime,${noxino_opt}dirs=${unionrw}=rw:${source}=${roopt}" - do_union ${root_backing} ${unionrw} ${source} ${dest} + cow_dir="$(echo ${dest} | sed -e "s|${rootmnt}|/cow/|")" + mkdir -p ${cow_dir} + # XXX: broken! will be fixed in the next few commits... + do_union ${dest} ${cow_dir} ${source} fi if [ -n "${opt_linkfiles}" ] diff --git a/scripts/live-helpers b/scripts/live-helpers index 3de16e5..e7fef47 100644 --- a/scripts/live-helpers +++ b/scripts/live-helpers @@ -607,16 +607,16 @@ link_files () } do_union () { - root_backing="${1}" - unionrw="${2}" - unionro="${3}" - unionmountpoint="${4}" + local unionmountpoint="${1}" # directory where the union is mounted + local unionrw="${2}" # branch where the union changes are stored + local unionro1="${3}" # first underlying read-only branch (optional) + local unionro2="${4}" # second underlying read-only branch (optional) if [ "${UNIONTYPE}" = "aufs" ] then rw_opt="rw" ro_opt="rr+wh" - noxino_opt="noxino," + noxino_opt="noxino" elif [ "${UNIONTYPE}" = "unionfs-fuse" ] then rw_opt="RW" @@ -628,9 +628,16 @@ do_union () { case "${UNIONTYPE}" in unionfs-fuse) - # FIXME: handle PERSISTENT_READONLY unionmountopts="-o cow -o noinitgroups -o default_permissions -o allow_other -o use_ino -o suid" - unionmountopts="${unionmountopts} ${unionrw}=${rw_opt}:${unionro}=${ro_opt}" + unionmountopts="${unionmountopts} ${unionrw}=${rw_opt}" + if [ -n "${unionro1}" ] + then + unionmountopts="${unionmountopts}:${unionro1}=${ro_opt}" + fi + if [ -n "${unionro2}" ] + then + unionmountopts="${unionmountopts}:${unionro2}=${ro_opt}" + fi ( sysctl -w fs.file-max=391524 ; ulimit -HSn 16384 unionfs-fuse ${unionmountopts} "${unionmountpoint}" ) && \ ( mkdir -p /run/sendsigs.omit.d @@ -638,18 +645,21 @@ do_union () { ;; overlayfs) - # FIXME: is PERSISTENT_READONLY possible? (overlayfs only handles two dirs, but perhaps they can be chained?) - unionmountopts="-o noatime,lowerdir=${unionro},upperdir=${unionrw}" + # XXX: can unionro2 be used? (overlayfs only handles two dirs, but perhaps they can be chained?) + # XXX: and can unionro1 be optional? i.e. can overlayfs skip lowerdir? + unionmountopts="-o noatime,lowerdir=${unionro1},upperdir=${unionrw}" mount -t ${UNIONTYPE} ${unionmountopts} ${UNIONTYPE} "${unionmountpoint}" ;; *) - if [ -n "${PERSISTENT_READONLY}" ] + unionmountopts="-o noatime,${noxino_opt},dirs=${unionrw}=${rw_opt}" + if [ -n "${unionro1}" ] then - mount -t tmpfs -o rw,noatime,mode=755 tmpfs "${unionrw}" - unionmountopts="-o noatime,${noxino_opt}dirs=${unionrw}=${rw_opt}:${root_backing}=${ro_opt}:${unionro}=${ro_opt}" - else - unionmountopts="-o noatime,${noxino_opt}dirs=${unionrw}=${rw_opt}:${unionro}=${ro_opt}" + unionmountopts="${unionmountopts}:${unionro1}=${ro_opt}" + fi + if [ -n "${unionro2}" ] + then + unionmountopts="${unionmountopts}:${unionro2}=${ro_opt}" fi mount -t ${UNIONTYPE} ${unionmountopts} ${UNIONTYPE} "${unionmountpoint}" ;;