On 2012-08-15 17:11, Thomas Bächler wrote: > > So, with initscripts, we mount all the API file systems manually. When > you put them in fstab as well, things fail. But when you want special > options for those file systems, you won't get them. > > This very short systemd snippet showed that systemd is capable of > parsing fstab and remounting the API file systems such that all your > options are respected. > > We tried this with initscripts before, and we couldn't make it work, as > it was too complicated with shell scripts. As I always watch arch mailing list with interest (systemd adventures in particular) this grabbed my attention (not arch user anymore, but irrelevant). Leaving whole systemd vs. sysv discussion aside - it's perfectly doable. Not a trivial few-liner, but actually something barely bigger and not really complex - with help of some bash features. Important thing is how mount behaves depending if both the "device" (irrelevant with api mounts, but the rules stand) and the mountpoint are specified - or - only the mountpoint. That is - assuming the logic you need is essentially: 1) if in fstab, use its options, else use standard/manual options 2) if mounted (e.g. initramfs handover), remount, else mount Below is a fragment of bash (generally v4+ required, but can be toned down easily) function which is also responsile for handling basic mounts. For the record - shegrep(), ismnt() are in-bash few-liners to avoid dependency on external commands - short loops over input and /proc/self/mountinfo (inc. \040 conversion) respectively. The snippet below even checks if the required stuff is compiled in the kernel (though these days it can be just removed, hard to imagine system without tmpfs of devtmpfs ...). Either way, maybe this approach will be of use for you. local _fstab _x # $1 mount point to check against pre-read fstab function infstab() { local _i for ((_i = 0; _i < ${#_fstab[@]} ; i++)); do [[ ${_fstab[_i]} =~ ^[^#][^[:blank:]]*[[:blank:]]+([^[:blank:]]+) ]] || continue [[ ${BASH_REMATCH[1]} = "${1// /\040}" ]] && return 0 done return 1 } # $1 comma separated fs to try in turn # $2 opts # $3 dir function vmnt() { local _fs _opt _dev _x [[ -d $3 ]] || return # comma separated list is a bit paranoid, we should just assume # that stuff is properly compiled in kernel, API stuff in particular IFS=, eval _fs='( $1 )' for _x in "${_fs[@]}" ""; do shegrep -q "[[:blank:]]$_x$" </proc/filesystems && break done [[ -z $_x ]] && return # /paranoid # use options and "device" only if not in fstab infstab "$3" || { _opt=$2; _dev=$_x; } if ismnt "$3"; then _opt="-o remount${_opt:+,$_opt}" unset _fs else _opt="${_opt:+-o $_opt}" _fs="-t $_x" fi mount $_fs $_opt $_dev "$3" } # set proper time w.r.t. tz (this does not access rtc !) # this requires /etc/localtime to make sense (file or symlink+/usr # mounted) if [[ $HWCLKMODE = localtime && -r /etc/localtime ]]; then hwclock --localtime --systz --noadjfile fi # we assure /proc mount, then vmnt handles it (fstab opts and crap) # hard to live without proc :) and we have stuff depending on it [[ -d /proc/self ]] || mount -t proc -o "nosuid,noexec,nodev" proc /proc # preread fstab(s) mapfile -t _fstab < <(shopt -s nullglob; for _x in /etc/fsta[b] /etc/fstab.d/*; do echo "$(< "$_x")"; done) # early mounts # - might be handed over from initramfs, might be not # - might have sane mount options, might have not # - might be in fstab, might be not vmnt proc "nosuid,noexec,nodev" /proc vmnt sysfs "nosuid,noexec,nodev" /sys vmnt devtmpfs,tmpfs "mode=0755,nosuid" /dev mkdir -p -m 0755 /dev/{pts,shm} vmnt tmpfs "mode=1777,nosuid,nodev" /dev/shm vmnt devpts "mode=0620,gid=tty,nosuid,noexec" /dev/pts vmnt tmpfs "mode=0755,nosuid,nodev,exec" /run vmnt tmpfs "mode=0755,nosuid,nodev,exec" /sys/fs/cgroup ... and so on, whatever might be needed There're also few other things that are often claimed as hard/impossible with bash scripts - e.g. resilience against broken (hanging) rc scripts with banal help of mkfifo or full device detach with help of pivot_root - doing it in the same way systemd does (certainly it requires proper initramfs generator leaving necessary stuff in /run/initramfs to pivot to - or - something analogous or hell - even created in fly by shutdown script).