[arch-projects] [mkinitcpio][PATCH 10/11] fsck: implement basic fsck support

Dave Reisner d at falconindy.com
Fri Nov 11 21:55:20 EST 2011


This adds support for fsck'ing root at bootstrap if the fsck binary and
necessary helpers are included.

Signed-off-by: Dave Reisner <dreisner at archlinux.org>
---
 init           |   15 +++++++++++++++
 init_functions |   22 ++++++++++++++++++----
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/init b/init
index 975368b..30677de 100644
--- a/init
+++ b/init
@@ -78,6 +78,21 @@ if [ "${break}" = "y" ] || [ "${break}" = "premount" ]; then
     launch_interactive_shell
 fi
 
+rootdev=$(resolve_device "$root") && root=$rootdev
+unset rootdev
+
+if [ -z "$skipfsck" ]; then
+    fsck_device "$root"
+    fsckret=$?
+    if [ "$fsckret" -ne 255 ]; then
+        if [ $(( $fsckret & 2 )) -eq 2 ]; then
+            msg "***** reboot required *****"
+            launch_interactive_shell --exec
+        fi
+        echo "$fsckret" > /run/initramfs/root-fsck
+    fi
+fi
+
 # Mount root at /new_root
 ${mount_handler:-default_mount_handler} /new_root
 
diff --git a/init_functions b/init_functions
index 85c1344..62c6af7 100644
--- a/init_functions
+++ b/init_functions
@@ -58,6 +58,9 @@ parse_cmdline() {
                     fi
                     [ "$lhs" = "${lhs//[^0-9a-zA-Z]}" ] && [ "$lhs" = "${lhs#[0-9]}" ] && eval ${lhs}=\${rhs}
                     ;;
+                forcefsck)
+                    FORCEFSCK="-f"
+                    ;;
                 *)  lhs=${w//[-.]/_}
                     [ "$lhs" = "${lhs//[^0-9a-zA-Z]}" ] && [ "$lhs" = "${lhs#[0-9]}" ] && eval ${lhs}=y
                     ;;
@@ -74,6 +77,19 @@ parse_cmdline() {
     done
 }
 
+fsck_device() {
+    [ -x /sbin/fsck ] || return 255
+
+    if [ ! -b "$1" ]; then
+        err "device '$1' not found. Skipping fsck."
+        return 255
+    fi
+
+    msg ":: performing fsck on '$1'"
+    FSTAB_FILE=/dev/null fsck -Ta -C"$FSCK_FD" "$1" -- $FORCEFSCK
+}
+
+
 resolve_device() {
     local major minor dev device=$1
 
@@ -120,9 +136,7 @@ resolve_device() {
 }
 
 default_mount_handler() {
-    local rootdev
-
-    if ! rootdev=$(resolve_device "$root"); then
+    if [ ! -b "$root" ]; then
         err "Unable to determine major/minor number of root device '$root'."
         echo "You are being dropped to a recovery shell"
         echo "    Type 'exit' to try and continue booting"
@@ -130,7 +144,7 @@ default_mount_handler() {
         msg "Trying to continue (this will most likely fail) ..."
     fi
 
-    if ! mount ${fstype:+-t $fstype} -o ${rwopt:-ro}${rootflags:+,$rootflags} "$rootdev" "$1"; then
+    if ! mount ${fstype:+-t $fstype} -o ${rwopt:-ro}${rootflags:+,$rootflags} "$root" "$1"; then
         echo "You are now being dropped into an emergency shell."
         launch_interactive_shell
         msg "Trying to continue (this will most likely fail) ..."
-- 
1.7.7.3



More information about the arch-projects mailing list