SHOW:
|
|
- or go back to the newest paste.
| 1 | setup_unionfs() {
| |
| 2 | image_directory="$1" | |
| 3 | rootmnt="$2" | |
| 4 | ||
| 5 | if [ "${UNIONFS}" = 'DEFAULT' ]; then
| |
| 6 | for union in 'overlayfs' 'aufs' 'unionfs' | |
| 7 | do | |
| 8 | modprobe "${MP_QUIET}" -b ${union} || true
| |
| 9 | if cut -f2 /proc/filesystems | grep -q "^${union}\$"; then
| |
| 10 | UNIONFS="${union}"
| |
| 11 | break | |
| 12 | fi | |
| 13 | done | |
| 14 | fi | |
| 15 | if [ "${UNIONFS}" = 'DEFAULT' -a -x /bin/unionfs-fuse ]; then
| |
| 16 | UNIONFS="unionfs-fuse" | |
| 17 | fi | |
| 18 | # If all else fails fall back to aufs. | |
| 19 | if [ "${UNIONFS}" = 'DEFAULT' ]; then
| |
| 20 | UNIONFS='aufs' | |
| 21 | fi | |
| 22 | ||
| 23 | # run-init can't deal with images in a subdir, but we're going to | |
| 24 | # move all of these away before it runs anyway. No, we're not, | |
| 25 | # put them in / since move-mounting them into / breaks mono and | |
| 26 | # some other apps. | |
| 27 | ||
| 28 | croot="/" | |
| 29 | ||
| 30 | # Let's just mount the read-only file systems first | |
| 31 | rofsstring="" | |
| 32 | rofslist="" | |
| 33 | if [ "${UNIONFS}" = "aufs" ]; then
| |
| 34 | roopt="rr" | |
| 35 | elif [ "${UNIONFS}" = "unionfs-fuse" ]; then
| |
| 36 | roopt="RO" | |
| 37 | else | |
| 38 | roopt="ro" | |
| 39 | fi | |
| 40 | ||
| 41 | mkdir -p "${croot}"
| |
| 42 | for image_type in "ext2" "squashfs" "dir" ; do | |
| 43 | for image in "${image_directory}"/*."${image_type}"; do
| |
| 44 | imagename=$(basename "${image}")
| |
| 45 | ||
| 46 | # Skip Edubuntu's extra squashfs | |
| 47 | if [ "$imagename" = "ltsp.squashfs" ] || | |
| 48 | [ "$imagename" = "server.squashfs" ]; then | |
| 49 | continue | |
| 50 | fi | |
| 51 | ||
| 52 | if [ -d "${image}" ]; then
| |
| 53 | # it is a plain directory: do nothing | |
| 54 | rofsstring="${image}=${roopt}:${rofsstring}"
| |
| 55 | rofslist="${image} ${rofslist}"
| |
| 56 | elif [ -f "${image}" ]; then
| |
| 57 | backdev=$(get_backing_device "$image") | |
| 58 | fstype=$(get_fstype "${backdev}")
| |
| 59 | if [ "${fstype}" = "unknown" ]; then
| |
| 60 | panic "Unknown file system type on ${backdev} (${image})"
| |
| 61 | fi | |
| 62 | mkdir -p "${croot}/${imagename}"
| |
| 63 | mount -t "${fstype}" -o ro,noatime "${backdev}" "${croot}/${imagename}" || panic "Can not mount $backdev ($image) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}"
| |
| 64 | fi | |
| 65 | done | |
| 66 | done | |
| 67 | rofsstring=${rofsstring%:}
| |
| 68 | ||
| 69 | mkdir -p /cow | |
| 70 | cowdevice="tmpfs" | |
| 71 | cow_fstype="tmpfs" | |
| 72 | cow_mountopt="rw,noatime,mode=755" | |
| 73 | ||
| 74 | persistent_ro_mount="" | |
| 75 | ||
| 76 | # Looking for "${root_persistence}" device or file
| |
| 77 | if [ -n "${PERSISTENT}" ]; then
| |
| 78 | - | cowdevice=${cowprobe}
|
| 78 | + | |
| 79 | - | cow_fstype=$(get_fstype "${cowprobe}")
|
| 79 | + | |
| 80 | - | cow_mountopt="rw,noatime" |
| 80 | + | persistent_ro_device=${cowprobe}
|
| 81 | persistent_ro_fstype=$(get_fstype "${cowprobe}")
| |
| 82 | persistent_ro_mountopt="ro,noatime" | |
| 83 | persistent_ro_mount="/persistent" | |
| 84 | ||
| 85 | mkdir -p $persistent_ro_mount | |
| 86 | mount -t ${persistent_ro_fstype} -o ${persistent_ro_mountopt} ${persistent_ro_device} ${persistent_ro_mount} || panic "Can not mount persistent_ro_device on /persistent"
| |
| 87 | else | |
| 88 | [ "$quiet" != "y" ] && log_warning_msg "Unable to find the persistent medium" | |
| 89 | fi | |
| 90 | fi | |
| 91 | ||
| 92 | mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} /cow || panic "Can not mount $cowdevice on /cow"
| |
| 93 | ||
| 94 | case ${UNIONFS} in
| |
| 95 | unionfs-fuse) | |
| 96 | (ulimit -n 16384; unionfs-fuse -o cow -o noinitgroups -o default_permissions -o allow_other -o use_ino -o suid /cow=RW:$rofsstring "$rootmnt" || panic "${UNIONFS} mount failed")
| |
| 97 | mkdir -p /dev/.initramfs/varrun | |
| 98 | pidof unionfs-fuse >> /dev/.initramfs/varrun/sendsigs.omit || true | |
| 99 | ;; | |
| 100 | aufs|unionfs) | |
| 101 | - | for mount in /cow $rofslist |
| 101 | + | |
| 102 | ;; | |
| 103 | overlayfs) | |
| 104 | # Mount the layers pairwise from the bottom onto rootmnt, | |
| 105 | # for the second and later layers rootmnt forms the lower layer. | |
| 106 | mounts="" | |
| 107 | for mount in /cow $persistent_ro_mount $rofslist | |
| 108 | do | |
| 109 | mounts="$mount $mounts" | |
| 110 | done | |
| 111 | lower="" | |
| 112 | for mount in $mounts | |
| 113 | do | |
| 114 | if [ "$lower" = "" ]; then | |
| 115 | lower="$mount" | |
| 116 | continue | |
| 117 | fi | |
| 118 | mount -t overlayfs -o "upperdir=$mount,lowerdir=$lower" \ | |
| 119 | "$mount" "$rootmnt" | |
| 120 | lower="$rootmnt" | |
| 121 | done | |
| 122 | ;; | |
| 123 | esac | |
| 124 | ||
| 125 | # Adding other custom mounts | |
| 126 | if [ -n "${PERSISTENT}" ]; then
| |
| 127 | # directly mount /home | |
| 128 | # FIXME: add a custom mounts configurable system | |
| 129 | homecow=$(find_cow_device "${home_persistence}" )
| |
| 130 | if [ -b "${homecow}" ]; then
| |
| 131 | mount -t $(get_fstype "${homecow}") -o rw,noatime "${homecow}" "${rootmnt}/home"
| |
| 132 | export HOMEMOUNTED=1 # used to proper calculate free space in do_snap_copy() | |
| 133 | else | |
| 134 | [ "$quiet" != "y" ] && log_warning_msg "Unable to find the persistent home medium" | |
| 135 | fi | |
| 136 | # Look for other snapshots to copy in | |
| 137 | try_snap "${root_snapshot_label}" "${rootmnt}" "ROOT"
| |
| 138 | try_snap "${home_snapshot_label}" "${rootmnt}/home" "HOME"
| |
| 139 | fi | |
| 140 | ||
| 141 | if [ -n "${SHOWMOUNTS}" ]; then
| |
| 142 | for d in ${rofslist}; do
| |
| 143 | mkdir -p "${rootmnt}/${LIVE_MEDIA_PATH}/${d##*/}"
| |
| 144 | case d in | |
| 145 | *.dir) # do nothing # mount -o bind "${d}" "${rootmnt}/${LIVE_MEDIA_PATH}/${d##*/}"
| |
| 146 | ;; | |
| 147 | *) | |
| 148 | if [ "${UNIONFS}" = unionfs-fuse ]; then
| |
| 149 | mount -o bind "${d}" "${rootmnt}/${LIVE_MEDIA_PATH}/${d##*/}"
| |
| 150 | else | |
| 151 | mount -o move "${d}" "${rootmnt}/${LIVE_MEDIA_PATH}/${d##*/}"
| |
| 152 | fi | |
| 153 | ;; | |
| 154 | esac | |
| 155 | done | |
| 156 | # shows cow fs on /cow for use by casper-snapshot | |
| 157 | mkdir -p "${rootmnt}/cow"
| |
| 158 | mount -o bind /cow "${rootmnt}/cow"
| |
| 159 | fi | |
| 160 | ||
| 161 | # move the first mount; no head in busybox-initramfs | |
| 162 | for d in $(mount -t squashfs | cut -d\ -f 3); do | |
| 163 | mkdir -p "${rootmnt}/rofs"
| |
| 164 | if [ "${UNIONFS}" = unionfs-fuse ]; then
| |
| 165 | mount -o bind "${d}" "${rootmnt}/rofs"
| |
| 166 | else | |
| 167 | mount -o move "${d}" "${rootmnt}/rofs"
| |
| 168 | fi | |
| 169 | break | |
| 170 | done | |
| 171 | } |