* [RFC/PATCH] Expand fstab-sys, simplify rootfs-block
@ 2011-05-20 15:09 Michal Soltys
[not found] ` <1305904167-14199-1-git-send-email-soltys-R61QfzASbfY@public.gmane.org>
0 siblings, 1 reply; 14+ messages in thread
From: Michal Soltys @ 2011-05-20 15:09 UTC (permalink / raw)
To: initramfs-u79uwXL29TY76Z2rM5mHXA
This patch moves code responsible for fsck'ing and determinig filesystem to
dracut-lib.sh, so it can be used by both fstab-sys and rootfs-block.
Adding fsck functionality to fstab-sys provides opportunity to move whole
separate /usr mount outside main initialization scripts - so real udev (with
different rules wanting /usr present) can work fine without any issues - having
/usr checked and mounted. At least that is the motivation behind these few
patches.
See respective commits for more details.
Note - I'm not sure if dracut-lib.sh is actually a proper place for those
functions - they were identical though, so to not repeat the code I stuffed
them there.
Haven't tested too much yet, so it's more RFC than a patch (code changes are
pretty simple though).
Michal Soltys (5):
dracut-lib.sh: add vwarn() function
dracut-lib.sh: Add det_fs() and wrap_fsck()
95fstab-sys: use det_fs and wrap_fsck
95rootfs-block/mount-root.sh: Rely on det_fs and wrap_fsck
95rootfs-block/block-genrules.sh: Use > instead of >>
modules.d/95fstab-sys/module-setup.sh | 2 +
modules.d/95fstab-sys/mount-sys.sh | 23 +++++++++---
modules.d/95rootfs-block/block-genrules.sh | 2 +-
modules.d/95rootfs-block/mount-root.sh | 47 +++++--------------------
modules.d/99base/dracut-lib.sh | 53 ++++++++++++++++++++++++++++
5 files changed, 82 insertions(+), 45 deletions(-)
--
1.7.2.1
^ permalink raw reply [flat|nested] 14+ messages in thread[parent not found: <1305904167-14199-1-git-send-email-soltys-R61QfzASbfY@public.gmane.org>]
* [PATCH 1/5] dracut-lib.sh: add vwarn() function [not found] ` <1305904167-14199-1-git-send-email-soltys-R61QfzASbfY@public.gmane.org> @ 2011-05-20 15:09 ` Michal Soltys 2011-05-20 15:09 ` [PATCH 2/5] dracut-lib.sh: Add det_fs() and wrap_fsck() Michal Soltys ` (3 subsequent siblings) 4 siblings, 0 replies; 14+ messages in thread From: Michal Soltys @ 2011-05-20 15:09 UTC (permalink / raw) To: initramfs-u79uwXL29TY76Z2rM5mHXA Similary to vinfo() Signed-off-by: Michal Soltys <soltys-R61QfzASbfY@public.gmane.org> --- modules.d/99base/dracut-lib.sh | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh index 4d03ed0..e376495 100755 --- a/modules.d/99base/dracut-lib.sh +++ b/modules.d/99base/dracut-lib.sh @@ -272,6 +272,12 @@ info() { echo "dracut: $@" } +vwarn() { + while read line; do + warn $line; + done +} + vinfo() { while read line; do info $line; -- 1.7.2.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/5] dracut-lib.sh: Add det_fs() and wrap_fsck() [not found] ` <1305904167-14199-1-git-send-email-soltys-R61QfzASbfY@public.gmane.org> 2011-05-20 15:09 ` [PATCH 1/5] dracut-lib.sh: add vwarn() function Michal Soltys @ 2011-05-20 15:09 ` Michal Soltys 2011-05-20 15:09 ` [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck Michal Soltys ` (2 subsequent siblings) 4 siblings, 0 replies; 14+ messages in thread From: Michal Soltys @ 2011-05-20 15:09 UTC (permalink / raw) To: initramfs-u79uwXL29TY76Z2rM5mHXA Both functions will be used by rootfs-block and fstab-sys modules. Both are based on code present in mount-root.sh, though few changes are present. det_fs: will try to determine filesystem type for supplied device, even if it's not auto. If fs cannot be detected, or if the detected one differs from the supplied one - a warning is issued (so user can fix its stuff later) wrap_fsck: will call fsck for specific device with optionally additional fsckoptions. The function returns fsck return value. Signed-off-by: Michal Soltys <soltys-R61QfzASbfY@public.gmane.org> --- modules.d/99base/dracut-lib.sh | 47 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 47 insertions(+), 0 deletions(-) diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh index e376495..10025bd 100755 --- a/modules.d/99base/dracut-lib.sh +++ b/modules.d/99base/dracut-lib.sh @@ -515,3 +515,50 @@ foreach_uuid_until() ( return 1 ) + +# Wrap fsck call for device _dev with additional fsck options _fsckopts return +# fsck's return code +wrap_fsck() { + local _ret _out _dev="$1" _fsckopts="$2" + + info "Checking filesystem." + info fsck -T $_fsckopts "$_dev" + _out=$(fsck -T $_fsckopts "$_dev") ; _ret=$? + + # A return of 4 or higher means there were serious problems. + if [ $_ret -gt 3 ]; then + echo $_out|vwarn + warn "fsck returned with error code $_ret" + warn "*** An error occurred during the file system check." + warn "*** Dropping you to a shell; the system will try" + warn "*** to mount the filesystem, when you leave the shell." + emergency_shell -n "(Repair filesystem)" + else + echo $_out|vinfo + [ $_ret -gt 0 ] && warn "fsck returned with $_ret" + fi + + return $_ret +} + +# Verify supplied filesystem type, fix if it's invalid, warn user if +# appropriate +det_fs() { + local _dev="$1" _fs="${2:-auto}" _inf="$3" _orig + + _orig="$_fs" + _fs=$(udevadm info --query=env --name="$_dev" | \ + while read line; do + if str_starts $line "ID_FS_TYPE="; then + echo ${line#ID_FS_TYPE=} + break + fi + done) + _fs=${_fs:-auto} + if [ "$_fs" = "auto" ]; then + warn "Cannon detect filesystem type for device $_dev" + elif [ "$_orig" != "auto" -a "$_fs" != "$_orig" ]; then + warn "$_inf: detected filesystem '$_fs' instead of '$_orig' for device: $_dev" + fi + echo "$_fs" +} -- 1.7.2.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck [not found] ` <1305904167-14199-1-git-send-email-soltys-R61QfzASbfY@public.gmane.org> 2011-05-20 15:09 ` [PATCH 1/5] dracut-lib.sh: add vwarn() function Michal Soltys 2011-05-20 15:09 ` [PATCH 2/5] dracut-lib.sh: Add det_fs() and wrap_fsck() Michal Soltys @ 2011-05-20 15:09 ` Michal Soltys [not found] ` <1305904167-14199-4-git-send-email-soltys-R61QfzASbfY@public.gmane.org> 2011-05-20 15:09 ` [PATCH 4/5] 95rootfs-block/mount-root.sh: Rely on " Michal Soltys 2011-05-20 15:09 ` [PATCH 5/5] 95rootfs-block/block-genrules.sh: Use > instead of >> Michal Soltys 4 siblings, 1 reply; 14+ messages in thread From: Michal Soltys @ 2011-05-20 15:09 UTC (permalink / raw) To: initramfs-u79uwXL29TY76Z2rM5mHXA This patch mainly adds fsck functionality to fstab-sys, with additional sanity checks (checking for device existence, verifying fstype via det_fs). Signed-off-by: Michal Soltys <soltys-R61QfzASbfY@public.gmane.org> --- modules.d/95fstab-sys/module-setup.sh | 2 ++ modules.d/95fstab-sys/mount-sys.sh | 23 +++++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/modules.d/95fstab-sys/module-setup.sh b/modules.d/95fstab-sys/module-setup.sh index f46c037..1fbd55b 100755 --- a/modules.d/95fstab-sys/module-setup.sh +++ b/modules.d/95fstab-sys/module-setup.sh @@ -12,5 +12,7 @@ depends() { install() { dracut_install /etc/fstab.sys + dracut_install /sbin/fsck* + type -P e2fsck >/dev/null && dracut_install e2fsck inst_hook pre-pivot 00 "$moddir/mount-sys.sh" } diff --git a/modules.d/95fstab-sys/mount-sys.sh b/modules.d/95fstab-sys/mount-sys.sh index 266576e..b444071 100755 --- a/modules.d/95fstab-sys/mount-sys.sh +++ b/modules.d/95fstab-sys/mount-sys.sh @@ -2,14 +2,25 @@ # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh -fstab_mount(){ - local dev mp type opts rest +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh + +fstab_mount() { + local _dev _mp _fs _opts _dump _pass _rest test -e "$1" || return 1 info "Mounting from $1" - while read dev mp type opts rest; do - [ -z "${dev%%#*}" ]&& continue # Skip comment lines - mount -v -t $type -o $opts $dev $NEWROOT/$mp - done < $1 | vinfo + while read _dev _mp _fs _opts _dump _pass _rest; do + [ -z "${_dev%%#*}" ] && continue # Skip comment lines + if [ ! -e "$_dev" ]; then + warn "Device $_dev doesn't exist, skipping mount." + continue + fi + if [ "$_pass" -gt 0 ] && ! strstr "$_opts" _netdev; then + wrap_fsck "$_dev" + fi + _fs=$(det_fs "$_dev" "$_fs" /etc/fstab.sys) + info "Mounting $_dev" + mount -v -t $_fs -o $_opts $_dev $NEWROOT/$_mp 2>&1 | vinfo + done < $1 return 0 } -- 1.7.2.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
[parent not found: <1305904167-14199-4-git-send-email-soltys-R61QfzASbfY@public.gmane.org>]
* Re: [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck [not found] ` <1305904167-14199-4-git-send-email-soltys-R61QfzASbfY@public.gmane.org> @ 2011-05-23 23:05 ` Karel Zak [not found] ` <20110523230507.GC2659-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org> 0 siblings, 1 reply; 14+ messages in thread From: Karel Zak @ 2011-05-23 23:05 UTC (permalink / raw) To: Michal Soltys; +Cc: initramfs-u79uwXL29TY76Z2rM5mHXA On Fri, May 20, 2011 at 05:09:25PM +0200, Michal Soltys wrote: > +fstab_mount() { > + local _dev _mp _fs _opts _dump _pass _rest > test -e "$1" || return 1 > info "Mounting from $1" > - while read dev mp type opts rest; do > - [ -z "${dev%%#*}" ]&& continue # Skip comment lines > - mount -v -t $type -o $opts $dev $NEWROOT/$mp > - done < $1 | vinfo > + while read _dev _mp _fs _opts _dump _pass _rest; do How does this code handle encoding in fstab? (e.g. /path/foo\x40bar) > + [ -z "${_dev%%#*}" ] && continue # Skip comment lines > + if [ ! -e "$_dev" ]; then > + warn "Device $_dev doesn't exist, skipping mount." > + continue > + fi > + if [ "$_pass" -gt 0 ] && ! strstr "$_opts" _netdev; then > + wrap_fsck "$_dev" > + fi > + _fs=$(det_fs "$_dev" "$_fs" /etc/fstab.sys) > + info "Mounting $_dev" > + mount -v -t $_fs -o $_opts $_dev $NEWROOT/$_mp 2>&1 | vinfo > + done < $1 It means that fsck is not running in parallel if you have more devices in /ect/fstab.sys. Is it expected? It would be better to call one fsck instance for all devices fsck -T /dev/sda1 /dev/sda2 /dev/sdb1 or use the "-l" option for more instances. Karel -- Karel Zak <kzak-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> http://karelzak.blogspot.com ^ permalink raw reply [flat|nested] 14+ messages in thread
[parent not found: <20110523230507.GC2659-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org>]
* Re: [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck [not found] ` <20110523230507.GC2659-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org> @ 2011-05-24 20:50 ` Michal Soltys [not found] ` <4DDC1A05.9030400-R61QfzASbfY@public.gmane.org> 2011-05-25 14:31 ` [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck Karel Zak 1 sibling, 1 reply; 14+ messages in thread From: Michal Soltys @ 2011-05-24 20:50 UTC (permalink / raw) To: Karel Zak; +Cc: initramfs-u79uwXL29TY76Z2rM5mHXA On 11-05-24 01:05, Karel Zak wrote: > On Fri, May 20, 2011 at 05:09:25PM +0200, Michal Soltys wrote: >> +fstab_mount() { >> + local _dev _mp _fs _opts _dump _pass _rest >> test -e "$1" || return 1 >> info "Mounting from $1" >> - while read dev mp type opts rest; do >> - [ -z "${dev%%#*}" ]&& continue # Skip comment lines >> - mount -v -t $type -o $opts $dev $NEWROOT/$mp >> - done< $1 | vinfo >> + while read _dev _mp _fs _opts _dump _pass _rest; do > > How does this code handle encoding in fstab? (e.g. /path/foo\x40bar) > Ah, I knew something went too easy. Though you mean - \040 as escape for space character in mountpoint, not any arbitrary \xNN or \0NN ? Also, some standard handling uuid/label and watching for other stuff as well would be good too. Plain 'test -e' is not too proper either. I'll get it done. >> + [ -z "${_dev%%#*}" ]&& continue # Skip comment lines >> + if [ ! -e "$_dev" ]; then >> + warn "Device $_dev doesn't exist, skipping mount." >> + continue >> + fi >> + if [ "$_pass" -gt 0 ]&& ! strstr "$_opts" _netdev; then >> + wrap_fsck "$_dev" >> + fi >> + _fs=$(det_fs "$_dev" "$_fs" /etc/fstab.sys) >> + info "Mounting $_dev" >> + mount -v -t $_fs -o $_opts $_dev $NEWROOT/$_mp 2>&1 | vinfo >> + done< $1 > > It means that fsck is not running in parallel if you have more > devices in /ect/fstab.sys. Is it expected? > Actually, when you mentioned it - I didn't really think about actually parallelizing those fscks. I assumed fstab-sys use is more of an exception for special cases (as, "must have that mount at all cost before pivot"), than something "standard". Shouldn't be a problem to expand it in such direction though. One point though - next step I wanted to do was to call proper fs-specific checker (if applicable, or fallback to generic one) - e.g. xfs wants xfs_check (xfs_db) or xfs_repair to be used (preferably including user intervention). So that would have to be done outside parallel run either way. Also I wonder, if fsck stuff and det_fs wouldn't be better in its own module, on which fstab-sys and rootfs-block would depend (instead of sourcing fscks themselves, while relying on dracut-lib.sh, etc.). > It would be better to call one fsck instance for all devices > > fsck -T /dev/sda1 /dev/sda2 /dev/sdb1 > > or use the "-l" option for more instances. > > Karel > ^ permalink raw reply [flat|nested] 14+ messages in thread
[parent not found: <4DDC1A05.9030400-R61QfzASbfY@public.gmane.org>]
* Re: [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck [not found] ` <4DDC1A05.9030400-R61QfzASbfY@public.gmane.org> @ 2011-05-24 22:39 ` Karel Zak [not found] ` <20110524223936.GG2659-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org> [not found] ` <4DDD0E48.3060607@rasengan.ppgk.com.pl> 0 siblings, 2 replies; 14+ messages in thread From: Karel Zak @ 2011-05-24 22:39 UTC (permalink / raw) To: Michal Soltys; +Cc: initramfs-u79uwXL29TY76Z2rM5mHXA On Tue, May 24, 2011 at 10:50:13PM +0200, Michal Soltys wrote: > On 11-05-24 01:05, Karel Zak wrote: >> On Fri, May 20, 2011 at 05:09:25PM +0200, Michal Soltys wrote: >>> +fstab_mount() { >>> + local _dev _mp _fs _opts _dump _pass _rest >>> test -e "$1" || return 1 >>> info "Mounting from $1" >>> - while read dev mp type opts rest; do >>> - [ -z "${dev%%#*}" ]&& continue # Skip comment lines >>> - mount -v -t $type -o $opts $dev $NEWROOT/$mp >>> - done< $1 | vinfo >>> + while read _dev _mp _fs _opts _dump _pass _rest; do >> >> How does this code handle encoding in fstab? (e.g. /path/foo\x40bar) >> > > Ah, I knew something went too easy. Though you mean - \040 as escape for > space character in mountpoint, not any arbitrary \xNN or \0NN ? from mount(8) code: need_escaping[] = { ' ', '\t', '\n', '\\' }; It's used for all strings in fstab (so not for mountpoints only). > Also, some standard handling uuid/label and watching for other stuff as > well would be good too. Plain 'test -e' is not too proper either. From my point of view it would be ideal to avoid fstab parsing in the script at all. export FSTAB_FILE=/etc/fstab.sys for $dev in $(findmnt --fstab -o SOURCE -e -n -O no_netdev); do fsck -T $dev mount $dev --target-prefix $NEWROOT done Unfortunately mount(8) does not allow to read info about mountpoints from alternative fstab file and it does not support --target-prefix now. I'll add this to my TODO list. Karel -- Karel Zak <kzak-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> http://karelzak.blogspot.com ^ permalink raw reply [flat|nested] 14+ messages in thread
[parent not found: <20110524223936.GG2659-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org>]
* Re: [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck [not found] ` <20110524223936.GG2659-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org> @ 2011-05-25 13:16 ` Harald Hoyer 2011-05-25 14:32 ` Michal Soltys 1 sibling, 0 replies; 14+ messages in thread From: Harald Hoyer @ 2011-05-25 13:16 UTC (permalink / raw) To: Karel Zak; +Cc: Michal Soltys, initramfs-u79uwXL29TY76Z2rM5mHXA Am 25.05.2011 00:39, schrieb Karel Zak: > Unfortunately mount(8) does not allow to read info about mountpoints > from alternative fstab file and it does not support --target-prefix > now. I'll add this to my TODO list. > > Karel > That would be really cool! Thank you! ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck [not found] ` <20110524223936.GG2659-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org> 2011-05-25 13:16 ` Harald Hoyer @ 2011-05-25 14:32 ` Michal Soltys 1 sibling, 0 replies; 14+ messages in thread From: Michal Soltys @ 2011-05-25 14:32 UTC (permalink / raw) To: Karel Zak; +Cc: initramfs-u79uwXL29TY76Z2rM5mHXA W dniu 25.05.2011 00:39, Karel Zak pisze: > > from mount(8) code: > > need_escaping[] = { ' ', '\t', '\n', '\\' }; > > It's used for all strings in fstab (so not for mountpoints only). > >> Also, some standard handling uuid/label and watching for other stuff as >> well would be good too. Plain 'test -e' is not too proper either. > > From my point of view it would be ideal to avoid fstab parsing in the > script at all. > > export FSTAB_FILE=/etc/fstab.sys > > for $dev in $(findmnt --fstab -o SOURCE -e -n -O no_netdev); do > > fsck -T $dev > mount $dev --target-prefix $NEWROOT > > done > > Unfortunately mount(8) does not allow to read info about mountpoints > from alternative fstab file and it does not support --target-prefix > now. I'll add this to my TODO list. > > Karel > Ok, thanks for info (btw, findmnt seems to only handle octal escapes). I'll update fstab-sys & co. and send new set of patches. ^ permalink raw reply [flat|nested] 14+ messages in thread
[parent not found: <4DDD0E48.3060607@rasengan.ppgk.com.pl>]
[parent not found: <4DDD0E48.3060607-dAhJnYnFfKxY6LDf3zcCrARSaAK4NQh3@public.gmane.org>]
* Re: [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck [not found] ` <4DDD0E48.3060607-dAhJnYnFfKxY6LDf3zcCrARSaAK4NQh3@public.gmane.org> @ 2011-05-25 14:33 ` Karel Zak [not found] ` <20110525143311.GA14298-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org> 0 siblings, 1 reply; 14+ messages in thread From: Karel Zak @ 2011-05-25 14:33 UTC (permalink / raw) To: rasengan rootish; +Cc: initramfs-u79uwXL29TY76Z2rM5mHXA On Wed, May 25, 2011 at 04:12:24PM +0200, rasengan rootish wrote: > W dniu 25.05.2011 00:39, Karel Zak pisze: >> >> From my point of view it would be ideal to avoid fstab parsing in the >> script at all. >> >> export FSTAB_FILE=/etc/fstab.sys >> >> for $dev in $(findmnt --fstab -o SOURCE -e -n -O no_netdev); do >> >> fsck -T $dev >> mount $dev --target-prefix $NEWROOT >> >> done >> >> Unfortunately mount(8) does not allow to read info about mountpoints >> from alternative fstab file and it does not support --target-prefix >> now. I'll add this to my TODO list. >> >> Karel >> > > Ok, thanks for info (btw, findmnt seems to only handle octal escapes). That's correct. The hex (e.g. \x40) escapes are used by udev for /dev/disk/by-* symlinks only. Karel -- Karel Zak <kzak-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> http://karelzak.blogspot.com ^ permalink raw reply [flat|nested] 14+ messages in thread
[parent not found: <20110525143311.GA14298-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org>]
* [RFC] fstab-sys: concept [not found] ` <20110525143311.GA14298-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org> @ 2011-05-29 0:38 ` Michal Soltys 0 siblings, 0 replies; 14+ messages in thread From: Michal Soltys @ 2011-05-29 0:38 UTC (permalink / raw) To: initramfs-u79uwXL29TY76Z2rM5mHXA Cc: kzak-H+wXaHxf7aLQT0dZR+AlfA, harald.hoyer-Re5JQEeQqe8AvxtiuMwx3w This is a concept of how the fstab.sys could be implemented. The "trickery" relies on using /bin/echo (so we can handle octal codes and to guarantee echo -e is actually functional) and \v as a field separator, which is unlikely to be ever used in practice... fstab-sys would consist of cmdline hook: - producing initqueue/finished check for all the /dev/* stuff - producing \v separated description of what to fsck later and what to mount and pre-pivot hook: - fscking in parallel per pass - specially handling xfs (perhaps others ?) - mounting If such approach is fine, I'll turn it into usable form, along with det_fs/wrap_fsck updates. --- modules.d/95fstab-sys/module-setup.sh | 12 ++++- modules.d/95fstab-sys/parse-fstab-sys.sh | 59 ++++++++++++++++++++++++++ modules.d/95fstab-sys/pre-pivot-fstab-sys.sh | 45 +++++++++++++++++++ 3 files changed, 113 insertions(+), 3 deletions(-) create mode 100755 modules.d/95fstab-sys/parse-fstab-sys.sh create mode 100755 modules.d/95fstab-sys/pre-pivot-fstab-sys.sh diff --git a/modules.d/95fstab-sys/module-setup.sh b/modules.d/95fstab-sys/module-setup.sh index 1fbd55b..f514571 100755 --- a/modules.d/95fstab-sys/module-setup.sh +++ b/modules.d/95fstab-sys/module-setup.sh @@ -7,12 +7,18 @@ check() { } depends() { + # echo fs-lib return 0 } install() { + # will be moved away to fs-lib + # dracut_install /sbin/fsck* + # type -P e2fsck >/dev/null && dracut_install e2fsck + # +xfs stuff + dracut_install /etc/fstab.sys - dracut_install /sbin/fsck* - type -P e2fsck >/dev/null && dracut_install e2fsck - inst_hook pre-pivot 00 "$moddir/mount-sys.sh" + dracut_install echo + inst_hook cmdline 10 "$moddir/parse-fstab-sys.sh" + inst_hook pre-pivot 00 "$moddir/pre-pivot-fstab-sys.sh" } diff --git a/modules.d/95fstab-sys/parse-fstab-sys.sh b/modules.d/95fstab-sys/parse-fstab-sys.sh new file mode 100755 index 0000000..4847766 --- /dev/null +++ b/modules.d/95fstab-sys/parse-fstab-sys.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh + +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh + +local _dev _mp _fs _opts _dump _pass _rest _fsck + +while read _dev _mp _fs _opts _dump _pass _rest; do + [ -z "${_dev%%#*}" ] && continue # Skip comment lines + + # handling block: is an overkill, but let's be consistent + # a little trickery - we will use \v as a separator to simplify our + # life; whole stuff will of course break, if someone actually uses that + # in fstab.sys ... + + # parse special stuff + _dev=$(/bin/echo -en "$_dev") + _mp=$(/bin/echo -en "$_mp") + _opts=$(/bin/echo -en "$_opts") + _fs=$(/bin/echo -en "$_fs") + [ "$_pass" -gt 0 ] && _fsck="$_pass" || _fsck=0 + + case "$_dev" in + block:LABEL=*|LABEL=*) + _dev="${_dev#block:}" + _dev="$(echo -n "$_dev" | sed 's,/,\\x2f,g')" + _dev="/dev/disk/by-label/${_dev#LABEL=}" + ;; + block:UUID=*|UUID=*) + _dev="${_dev#block:}" + _dev="/dev/disk/by-uuid/${_dev#UUID=}" + ;; + esac + + # allow only actual /dev devices to be waited for and fscked + if [ -z "${_dev#/dev/*}" ]; then + echo "[ -b \"$_dev\" ] || return 1" >>/tmp/fstab-sys.sh + else + _fsck=0 + fi + + # prepare "compiled" fstab we will use later + /bin/echo -e "$_dev\v$_mp\v\$_fs\v$_opts" >>/tmp/fstab-sys.compiled + + # export fsck passes + # don't bother with printf to handle $_fsck > 9 alignment, + # but verify that in module-setup.sh + if [ "$_fsck" -gt 0 ]; then + /bin/echo "$_dev\v$_fs" >>/tmp/fstab-sys.pass.$_fsck + fi + +done </etc/fstab.sys + +# add initqueue/finished, only if there's something to add though +if [ -e /tmp/fstab-sys.sh ]; then + echo "return 0" >>/tmp/fstab-sys.sh + mv /tmp/fstab-sys.sh $hookdir/initqueue/finished/fstab-sys.sh +fi diff --git a/modules.d/95fstab-sys/pre-pivot-fstab-sys.sh b/modules.d/95fstab-sys/pre-pivot-fstab-sys.sh new file mode 100755 index 0000000..1a4b9b7 --- /dev/null +++ b/modules.d/95fstab-sys/pre-pivot-fstab-sys.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh + +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh + +local _dev _mp _fs _opts _auto _manual _oldIFS _x + +oldIFS="$IFS" +IFS=$(/bin/echo -ne "\v") + +# fsck pass +_manual= +for _x in /tmp/fstab-sys.pass.[0-9]; do + _auto= + while read _dev _fs; do + _fs=$(IFS="$oldIFS" det_fs "$_dev" "$_fs" "fstab-sys") + if [ $_fs = xfs ]; then + # xfs is special, so treat is specially ;) + _manual=$(/bin/echo -e "${_manual:+${_manual}\v}$_dev") + continue + fi + _auto=$(/bin/echo -e "${_auto:+${_auto}\v}$_dev") + done <$_x + # use updated wrap_fsck in full version + fsck -M -T $_auto +done + +# special fsck pass for xfs and perhaps others +for _dev in $_manual; do + # use updated wrap_fsck in full version + if ! xfs_check "$_dev"; then + warn "*** XFS on '$_dev' is damaged, please assist." + emergency_shell -n "(Repair filesystem)" + fi +done + +# mount pass +while read _dev _mp _fs _opts; do + _fs=$(IFS="$oldIFS" det_fs "$_dev" "$_fs" "fstab-sys") + info "Mounting $_dev" + mount -v -t "$_fs" -o "$_opts" "$_dev" "$NEWROOT/$_mp" 2>&1 | vinfo +done </tmp/fstab-sys.compiled + +IFS="$_oldIFS" -- 1.7.4.2 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck [not found] ` <20110523230507.GC2659-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org> 2011-05-24 20:50 ` Michal Soltys @ 2011-05-25 14:31 ` Karel Zak 1 sibling, 0 replies; 14+ messages in thread From: Karel Zak @ 2011-05-25 14:31 UTC (permalink / raw) To: Michal Soltys; +Cc: initramfs-u79uwXL29TY76Z2rM5mHXA On Tue, May 24, 2011 at 01:05:07AM +0200, Karel Zak wrote: > On Fri, May 20, 2011 at 05:09:25PM +0200, Michal Soltys wrote: > > +fstab_mount() { > > + local _dev _mp _fs _opts _dump _pass _rest > > test -e "$1" || return 1 > > info "Mounting from $1" > > - while read dev mp type opts rest; do > > - [ -z "${dev%%#*}" ]&& continue # Skip comment lines > > - mount -v -t $type -o $opts $dev $NEWROOT/$mp > > - done < $1 | vinfo > > + while read _dev _mp _fs _opts _dump _pass _rest; do > > How does this code handle encoding in fstab? (e.g. /path/foo\x40bar) Sorry, should be "/path/foo\040bar". The mount(8) and friends use octal escapes only. Karel -- Karel Zak <kzak-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> http://karelzak.blogspot.com ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 4/5] 95rootfs-block/mount-root.sh: Rely on det_fs and wrap_fsck [not found] ` <1305904167-14199-1-git-send-email-soltys-R61QfzASbfY@public.gmane.org> ` (2 preceding siblings ...) 2011-05-20 15:09 ` [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck Michal Soltys @ 2011-05-20 15:09 ` Michal Soltys 2011-05-20 15:09 ` [PATCH 5/5] 95rootfs-block/block-genrules.sh: Use > instead of >> Michal Soltys 4 siblings, 0 replies; 14+ messages in thread From: Michal Soltys @ 2011-05-20 15:09 UTC (permalink / raw) To: initramfs-u79uwXL29TY76Z2rM5mHXA Use common fsck and det_fs code. Verify filesystem type more aggressively, which has a chance to be more resistant to accidental mistakes. Also, there's no need to generate custom fstab for the sake of fsck anymore. Signed-off-by: Michal Soltys <soltys-R61QfzASbfY@public.gmane.org> --- modules.d/95rootfs-block/mount-root.sh | 47 ++++++------------------------- 1 files changed, 9 insertions(+), 38 deletions(-) diff --git a/modules.d/95rootfs-block/mount-root.sh b/modules.d/95rootfs-block/mount-root.sh index 8e86024..9334323 100755 --- a/modules.d/95rootfs-block/mount-root.sh +++ b/modules.d/95rootfs-block/mount-root.sh @@ -26,8 +26,10 @@ filter_rootopts() { } if [ -n "$root" -a -z "${root%%block:*}" ]; then - mount -t ${fstype:-auto} -o "$rflags",ro "${root#block:}" "$NEWROOT" \ - && ROOTFS_MOUNTED=yes + + # sanity - determine/fix fstype + rootfs=$(det_fs "${root#block:}" "$fstype" "cmdline") + mount -t ${rootfs} -o "$rflags",ro "${root#block:}" "$NEWROOT" READONLY= fsckoptions= @@ -71,7 +73,6 @@ if [ -n "$root" -a -z "${root%%block:*}" ]; then fsckoptions="-a $fsckoptions" fi - rootfs=${fstype:-auto} rootopts= if getargbool 1 rd.fstab -n rd_NO_FSTAB \ && ! getarg rootflags \ @@ -86,7 +87,8 @@ if [ -n "$root" -a -z "${root%%block:*}" ]; then [ "${dev%%#*}" != "$dev" ] && continue if [ "$mp" = "/" ]; then - rootfs=$fs + # sanity - determine/fix fstype + rootfs=$(det_fs "${root#block:}" "$fs" "$NEWROOT/etc/fstab") rootopts=$opts break fi @@ -96,41 +98,10 @@ if [ -n "$root" -a -z "${root%%block:*}" ]; then fi umount "$NEWROOT" - if [ "$rootfs" = "auto" ]; then - rootfs=$(udevadm info --query=env --name=${root#block:} | \ - while read line; do - if strstr $line ID_FS_TYPE; then - eval $line - echo $ID_FS_TYPE - break - fi - done) - rootfs=${rootfs:-auto} - fi - # backslashes are treated as escape character in fstab - esc_root=$(echo ${root#block:} | sed 's,\\,\\\\,g') - printf '%s %s %s %s,%s 1 1 \n' "$esc_root" "$NEWROOT" "$rootfs" "$rflags" "$rootopts" > /etc/fstab - - if [ -z "$fastboot" -a "$READONLY" != "yes" ]; then - info "Checking filesystems" - info fsck -T -t noopts=_netdev -A $fsckoptions - out=$(fsck -T -t noopts=_netdev -A $fsckoptions) - export RD_ROOTFS_FSCK=$? - echo $RD_ROOTFS_FSCK > /run/initramfs/root-fsck - - # A return of 4 or higher means there were serious problems. - if [ $RD_ROOTFS_FSCK -gt 3 ]; then - warn $out - warn "fsck returned with error code $RD_ROOTFS_FSCK" - warn "*** An error occurred during the file system check." - warn "*** Dropping you to a shell; the system will retry" - warn "*** to mount the system, when you leave the shell." - emergency_shell -n "(Repair filesystem)" - else - echo $out|vinfo - [ $RD_ROOTFS_FSCK -gt 0 ] && warn "fsck returned with $RD_ROOTFS_FSCK" - fi + if [ -z "$fastboot" -a "$READONLY" != "yes" ] && ! strstr "${rflags},${rootopts}" _netdev; then + wrap_fsck "${root#block:}" "$fsckoptions" + echo $? >/run/initramfs/root-fsck fi info "Remounting ${root#block:} with -o ${rflags},${rootopts}" -- 1.7.2.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 5/5] 95rootfs-block/block-genrules.sh: Use > instead of >> [not found] ` <1305904167-14199-1-git-send-email-soltys-R61QfzASbfY@public.gmane.org> ` (3 preceding siblings ...) 2011-05-20 15:09 ` [PATCH 4/5] 95rootfs-block/mount-root.sh: Rely on " Michal Soltys @ 2011-05-20 15:09 ` Michal Soltys 4 siblings, 0 replies; 14+ messages in thread From: Michal Soltys @ 2011-05-20 15:09 UTC (permalink / raw) To: initramfs-u79uwXL29TY76Z2rM5mHXA trivial, blocksymlink.sh shouldn't exist at this point. Signed-off-by: Michal Soltys <soltys-R61QfzASbfY@public.gmane.org> --- modules.d/95rootfs-block/block-genrules.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/modules.d/95rootfs-block/block-genrules.sh b/modules.d/95rootfs-block/block-genrules.sh index 41a220f..4a50aac 100755 --- a/modules.d/95rootfs-block/block-genrules.sh +++ b/modules.d/95rootfs-block/block-genrules.sh @@ -11,7 +11,7 @@ if [ "${root%%:*}" = "block" ]; then } >> $UDEVRULESD/99-root.rules printf '[ -e "%s" ] && { ln -s "%s" /dev/root 2>/dev/null; rm "$job"; }\n' \ - "${root#block:}" "${root#block:}" >> $hookdir/initqueue/settled/blocksymlink.sh + "${root#block:}" "${root#block:}" > $hookdir/initqueue/settled/blocksymlink.sh echo '[ -e /dev/root ]' > $hookdir/initqueue/finished/block.sh fi -- 1.7.2.1 ^ permalink raw reply related [flat|nested] 14+ messages in thread
end of thread, other threads:[~2011-05-29 0:38 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-20 15:09 [RFC/PATCH] Expand fstab-sys, simplify rootfs-block Michal Soltys
[not found] ` <1305904167-14199-1-git-send-email-soltys-R61QfzASbfY@public.gmane.org>
2011-05-20 15:09 ` [PATCH 1/5] dracut-lib.sh: add vwarn() function Michal Soltys
2011-05-20 15:09 ` [PATCH 2/5] dracut-lib.sh: Add det_fs() and wrap_fsck() Michal Soltys
2011-05-20 15:09 ` [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck Michal Soltys
[not found] ` <1305904167-14199-4-git-send-email-soltys-R61QfzASbfY@public.gmane.org>
2011-05-23 23:05 ` Karel Zak
[not found] ` <20110523230507.GC2659-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org>
2011-05-24 20:50 ` Michal Soltys
[not found] ` <4DDC1A05.9030400-R61QfzASbfY@public.gmane.org>
2011-05-24 22:39 ` Karel Zak
[not found] ` <20110524223936.GG2659-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org>
2011-05-25 13:16 ` Harald Hoyer
2011-05-25 14:32 ` Michal Soltys
[not found] ` <4DDD0E48.3060607@rasengan.ppgk.com.pl>
[not found] ` <4DDD0E48.3060607-dAhJnYnFfKxY6LDf3zcCrARSaAK4NQh3@public.gmane.org>
2011-05-25 14:33 ` Karel Zak
[not found] ` <20110525143311.GA14298-sHeGUpI7y9L/9pzu0YdTqQ@public.gmane.org>
2011-05-29 0:38 ` [RFC] fstab-sys: concept Michal Soltys
2011-05-25 14:31 ` [PATCH 3/5] 95fstab-sys: use det_fs and wrap_fsck Karel Zak
2011-05-20 15:09 ` [PATCH 4/5] 95rootfs-block/mount-root.sh: Rely on " Michal Soltys
2011-05-20 15:09 ` [PATCH 5/5] 95rootfs-block/block-genrules.sh: Use > instead of >> Michal Soltys
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.