Skip to contentSkip to conversation

xfs: add debian initramfs hook to package

PATCH Superseded Darrick J. Wong 3 participants 9 messages Jul 26, 2018 – Jul 30, 2018

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 xfs: add debian initramfs hook to package

From: Darrick J. Wong <[email protected]>

In Debian bug 904086, the reporter complained that xfs_repair wasn't present in the initramfs, which prevented him from using shutdown -F to force a filesystem fsck after a reboot. Add a hook to put the xfs utilities in the initramfs if xfs is the root filesystem.

---
 debian/local/initramfs.hook |   47 +++++++++++++++++++++++++++++++++++++++++++
 debian/rules                |    1 +
 2 files changed, 48 insertions(+)
 create mode 100644 debian/local/initramfs.hook
debian/local/initramfs.hook new file +47 -0
new file mode 100644
index 00000000..20df5d69
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+# Put XFS utilities in initramfs if the root fs is XFS.
+
+PREREQ=""
+
+prereqs()
+{
+	echo "$PREREQ"
+}
+
+case $1 in
+prereqs)
+	prereqs
+	exit 0
+	;;
+esac
+
+fstab_files()
+{
+	echo /etc/fstab
+	if [ -d /etc/fstab.d ]; then
+		ls -1 /etc/fstab.d | grep '\.fstab$' | sed -e 's;^;/etc/fstab.d/;'
+	fi
+}
+
+rootfs_type() {
+	fstab_files | while read file; do
+		test ! -f "$file" && continue
+
+		while read MNT_FSNAME MNT_DIR MNT_TYPE MNT_OPTS MNT_FREQ MNT_PASS MNT_JUNK; do
+			test "$MNT_DIR" != "/" && continue
+			echo "$MNT_TYPE"
+			break;
+		done < "$file"
+	done
+}
+
+. /usr/share/initramfs-tools/scripts/functions
+. /usr/share/initramfs-tools/hook-functions
+
+if [ "$(rootfs_type)" = "xfs" ]; then
+	copy_exec /sbin/xfs_repair
+	copy_exec /usr/sbin/xfs_db
+	copy_exec /usr/sbin/xfs_metadump
+fi
+exit 0
debian/rules +1 -0
index cb4fa22c..4c50654c 100755
@@ -77,6 +77,7 @@ binary-arch: checkroot built
 	$(pkgdev) $(MAKE) -C . install-dev
 	$(pkgdi)  $(MAKE) -C debian install-d-i
 	$(pkgme)  $(MAKE) dist
+	install -D -m 0755 debian/local/initramfs.hook debian/xfsprogs/usr/share/initramfs-tools/hooks/xfs
 	rmdir debian/xfslibs-dev/usr/share/doc/xfsprogs
 	rm -f debian/xfslibs-dev/lib/libhandle.la
 	rm -fr debian/xfslibs-dev/usr/lib
Reviewed-by on v1 1/1
#1 lore raw
Quoted 9 lines · Darrick J. Wong

From: Darrick J. Wong <[email protected]>

In Debian bug 904086, the reporter complained that xfs_repair wasn't present in the initramfs, which prevented him from using shutdown -F to force a filesystem fsck after a reboot. Add a hook to put the xfs utilities in the initramfs if xfs is the root filesystem.

---

Makes sense.

Quoted 74 lines
 debian/local/initramfs.hook |   47 +++++++++++++++++++++++++++++++++++++++++++
 debian/rules                |    1 +
 2 files changed, 48 insertions(+)
 create mode 100644 debian/local/initramfs.hook
debian/local/initramfs.hook new file +47 -0
new file mode 100644
index 00000000..20df5d69
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+# Put XFS utilities in initramfs if the root fs is XFS.
+
+PREREQ=""
+
+prereqs()
+{
+	echo "$PREREQ"
+}
+
+case $1 in
+prereqs)
+	prereqs
+	exit 0
+	;;
+esac
+
+fstab_files()
+{
+	echo /etc/fstab
+	if [ -d /etc/fstab.d ]; then
+		ls -1 /etc/fstab.d | grep '\.fstab$' | sed -e 's;^;/etc/fstab.d/;'
+	fi
+}
+
+rootfs_type() {
+	fstab_files | while read file; do
+		test ! -f "$file" && continue
+
+		while read MNT_FSNAME MNT_DIR MNT_TYPE MNT_OPTS MNT_FREQ MNT_PASS MNT_JUNK; do
+			test "$MNT_DIR" != "/" && continue
+			echo "$MNT_TYPE"
+			break;
+		done < "$file"
+	done
+}
+
+. /usr/share/initramfs-tools/scripts/functions
+. /usr/share/initramfs-tools/hook-functions
+
+if [ "$(rootfs_type)" = "xfs" ]; then
+	copy_exec /sbin/xfs_repair
+	copy_exec /usr/sbin/xfs_db
+	copy_exec /usr/sbin/xfs_metadump
+fi
+exit 0
debian/rules +1 -1
index cb4fa22c..4c50654c 100755
@@ -77,6 +77,7 @@ binary-arch: checkroot built
 	$(pkgdev) $(MAKE) -C . install-dev
 	$(pkgdi)  $(MAKE) -C debian install-d-i
 	$(pkgme)  $(MAKE) dist
+	install -D -m 0755 debian/local/initramfs.hook debian/xfsprogs/usr/share/initramfs-tools/hooks/xfs
 	rmdir debian/xfslibs-dev/usr/share/doc/xfsprogs
 	rm -f debian/xfslibs-dev/lib/libhandle.la
 	rm -fr debian/xfslibs-dev/usr/lib
--

To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#2 lore raw
In reply to Darrick J. Wong
Quoted 33 lines · Darrick J. Wong

From: Darrick J. Wong <[email protected]>

In Debian bug 904086, the reporter complained that xfs_repair wasn't present in the initramfs, which prevented him from using shutdown -F to force a filesystem fsck after a reboot. Add a hook to put the xfs utilities in the initramfs if xfs is the root filesystem.

---
 debian/local/initramfs.hook |   47 +++++++++++++++++++++++++++++++++++++++++++
 debian/rules                |    1 +
 2 files changed, 48 insertions(+)
 create mode 100644 debian/local/initramfs.hook
debian/local/initramfs.hook new file +13 -0
new file mode 100644
index 00000000..20df5d69
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+# Put XFS utilities in initramfs if the root fs is XFS.
+
+PREREQ=""
+
+prereqs()
+{
+	echo "$PREREQ"
+}
+
+case $1 in
+prereqs)

debian/local/initramfs.hook line 23

Quoted 10 lines
debian/local/initramfs.hook new file +10 -0
+	prereqs
+	exit 0
+	;;
+esac
+
+fstab_files()
+{
+	echo /etc/fstab
+	if [ -d /etc/fstab.d ]; then
+		ls -1 /etc/fstab.d | grep '\.fstab$' | sed -e 's;^;/etc/fstab.d/;'

Is this just a fancy

ls -1 /etc/fstab.d/*.fstab 2>/dev/null

? *shrug* ok :)

Quoted 4 lines
debian/local/initramfs.hook new file +4 -0
+	fi
+}
+
+rootfs_type() {

debian/local/initramfs.hook line 37

Quoted 10 lines
debian/local/initramfs.hook new file +10 -0
+	fstab_files | while read file; do
+		test ! -f "$file" && continue
+
+		while read MNT_FSNAME MNT_DIR MNT_TYPE MNT_OPTS MNT_FREQ MNT_PASS MNT_JUNK; do
+			test "$MNT_DIR" != "/" && continue
+			echo "$MNT_TYPE"
+			break;
+		done < "$file"
+	done
+}

ok, I was scheming up something, uh, more obtuse,

awk '$2 == "/" {print $3}' $(fstab_files)

but *shrug* :)

Actually... this sort of fstqab poses a problem for your function and mine:

#/dev/mapper/vg-lv_root / xfs defaults 1 1
/dev/mapper/vg-lv_root / ext4 defaults 1 1

because it'll happily pick xfs. Need to exclude comment lines, so exclude MNT_FSNAME starting with # -

test ${MNT_FSNAME::1} == "#" && continue

or in my fancy world could do:

awk '(!/^#/) && ($2 == "/") {print $3}' $(fstab_files)

tho I guess mine assumes only one matching line... | head -n 1 ;)

debian/local/initramfs.hook line 45

Quoted 7 lines
debian/local/initramfs.hook new file +7 -0
+. /usr/share/initramfs-tools/scripts/functions
+. /usr/share/initramfs-tools/hook-functions
+
+if [ "$(rootfs_type)" = "xfs" ]; then
+	copy_exec /sbin/xfs_repair
+	copy_exec /usr/sbin/xfs_db
+	copy_exec /usr/sbin/xfs_metadump

Just to be sure, it gets fsck.xfs already? or does it need to?

-Eric

Quoted 19 lines
debian/local/initramfs.hook new file +2 -0
+fi
+exit 0
debian/rules +1 -1
index cb4fa22c..4c50654c 100755
@@ -77,6 +77,7 @@ binary-arch: checkroot built
 	$(pkgdev) $(MAKE) -C . install-dev
 	$(pkgdi)  $(MAKE) -C debian install-d-i
 	$(pkgme)  $(MAKE) dist
+	install -D -m 0755 debian/local/initramfs.hook debian/xfsprogs/usr/share/initramfs-tools/hooks/xfs
 	rmdir debian/xfslibs-dev/usr/share/doc/xfsprogs
 	rm -f debian/xfslibs-dev/lib/libhandle.la
 	rm -fr debian/xfslibs-dev/usr/lib
--

To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#3 lore raw
Quoted 4 lines · Eric Sandeen

Actually... this sort of fstab poses a problem for your function and mine:

#/dev/mapper/vg-lv_root / xfs defaults 1 1
/dev/mapper/vg-lv_root / ext4 defaults 1 1

As would this:

# / on zfs won't work, use ext4:
/dev/sda2	/	ext4	defaults	1 1

... anyway, regardless of likelihood need to filter out comments I think.

Thanks,
-Eric

#4 lore raw
In reply to Eric Sandeen
Quoted 49 lines · Eric Sandeen
Quoted 33 lines · Darrick J. Wong

From: Darrick J. Wong <[email protected]>

In Debian bug 904086, the reporter complained that xfs_repair wasn't present in the initramfs, which prevented him from using shutdown -F to force a filesystem fsck after a reboot. Add a hook to put the xfs utilities in the initramfs if xfs is the root filesystem.

---
 debian/local/initramfs.hook |   47 +++++++++++++++++++++++++++++++++++++++++++
 debian/rules                |    1 +
 2 files changed, 48 insertions(+)
 create mode 100644 debian/local/initramfs.hook
debian/local/initramfs.hook new file +13 -0
new file mode 100644
index 00000000..20df5d69
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+# Put XFS utilities in initramfs if the root fs is XFS.
+
+PREREQ=""
+
+prereqs()
+{
+	echo "$PREREQ"
+}
+
+case $1 in
+prereqs)

debian/local/initramfs.hook line 23

Quoted 10 lines
debian/local/initramfs.hook new file +10 -0
+	prereqs
+	exit 0
+	;;
+esac
+
+fstab_files()
+{
+	echo /etc/fstab
+	if [ -d /etc/fstab.d ]; then
+		ls -1 /etc/fstab.d | grep '\.fstab$' | sed -e 's;^;/etc/fstab.d/;'

Is this just a fancy

Quoted 3 lines

ls -1 /etc/fstab.d/*.fstab 2>/dev/null

? *shrug* ok :)

Yeah, it's ... bizarre, but it matches the debian initramfs scripts for shoving fsck and fsck.$FSTYP into the initramfs.

Quoted 17 lines
Quoted 4 lines
debian/local/initramfs.hook new file +4 -0
+	fi
+}
+
+rootfs_type() {

debian/local/initramfs.hook line 37

Quoted 10 lines
debian/local/initramfs.hook new file +10 -0
+	fstab_files | while read file; do
+		test ! -f "$file" && continue
+
+		while read MNT_FSNAME MNT_DIR MNT_TYPE MNT_OPTS MNT_FREQ MNT_PASS MNT_JUNK; do
+			test "$MNT_DIR" != "/" && continue
+			echo "$MNT_TYPE"
+			break;
+		done < "$file"
+	done
+}

ok, I was scheming up something, uh, more obtuse,

Quoted 3 lines

awk '$2 == "/" {print $3}' $(fstab_files)

but *shrug* :)

Yeah, that fugly mess is also cribbed from the Debian initramfs scripts.

Quoted 8 lines

Actually... this sort of fstqab poses a problem for your function and mine:

#/dev/mapper/vg-lv_root / xfs defaults 1 1
/dev/mapper/vg-lv_root / ext4 defaults 1 1

because it'll happily pick xfs. Need to exclude comment lines, so exclude MNT_FSNAME starting with # -

Quoted 7 lines

test ${MNT_FSNAME::1} == "#" && continue

or in my fancy world could do:

awk '(!/^#/) && ($2 == "/") {print $3}' $(fstab_files)

tho I guess mine assumes only one matching line... | head -n 1 ;)

Might have to add awk as a Depends: dependency in debian/control if you do that. I think it's cleaner....

Quoted 10 lines

debian/local/initramfs.hook line 45

Quoted 8 lines
debian/local/initramfs.hook new file +7 -0
+. /usr/share/initramfs-tools/scripts/functions
+. /usr/share/initramfs-tools/hook-functions
+
+if [ "$(rootfs_type)" = "xfs" ]; then
+	copy_exec /sbin/xfs_repair
+	copy_exec /usr/sbin/xfs_db
+	copy_exec /usr/sbin/xfs_metadump

Just to be sure, it gets fsck.xfs already? or does it need to?

fsck.xfs will be put in the initramfs by /usr/share/initramfs-tools/hooks/fsck if /etc/fstab says the rootfs is pass 1 or greater. I find it weird that the bug reporter has pass == 0 and complains that xfs_repair isn't present even though neither fsck nor fsck.xfs are in his initramfs either!

Buuuut, it would be nice to have the xfs tools show up in the initramfs in case the rootfs is corrupt and the admin boots with 'break=premount' to get a shell to fix the root fs.

--D

Quoted 25 lines

-Eric

Quoted 15 lines
debian/local/initramfs.hook new file +2 -0
+fi
+exit 0
debian/rules +1 -1
index cb4fa22c..4c50654c 100755
@@ -77,6 +77,7 @@ binary-arch: checkroot built
 	$(pkgdev) $(MAKE) -C . install-dev
 	$(pkgdi)  $(MAKE) -C debian install-d-i
 	$(pkgme)  $(MAKE) dist
+	install -D -m 0755 debian/local/initramfs.hook debian/xfsprogs/usr/share/initramfs-tools/hooks/xfs
 	rmdir debian/xfslibs-dev/usr/share/doc/xfsprogs
 	rm -f debian/xfslibs-dev/lib/libhandle.la
 	rm -fr debian/xfslibs-dev/usr/lib
--
Quoted 4 lines

To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#5 lore raw
Quoted 10 lines · Darrick J. Wong
Quoted 10 lines

Actually... this sort of fstqab poses a problem for your function and mine:

#/dev/mapper/vg-lv_root / xfs defaults 1 1
/dev/mapper/vg-lv_root / ext4 defaults 1 1

because it'll happily pick xfs. Need to exclude comment lines, so exclude MNT_FSNAME starting with # -

test ${MNT_FSNAME::1} == "#" && continue

Quoted 8 lines
Quoted 5 lines

or in my fancy world could do:

awk '(!/^#/) && ($2 == "/") {print $3}' $(fstab_files)

tho I guess mine assumes only one matching line... | head -n 1 ;)

Might have to add awk as a Depends: dependency in debian/control if you do that. I think it's cleaner....

Ok, up to you. If this is all just boilerplate from other debian scripts and it's good enough for them I guess I can just merge as is. The only thing that seemed to matter was not ignoring comment lines, which would be trivial to fix.

-Eric

#6 lore raw
Quoted 18 lines · Eric Sandeen
Quoted 15 lines · Darrick J. Wong
Quoted 15 lines

Actually... this sort of fstqab poses a problem for your function and mine:

#/dev/mapper/vg-lv_root / xfs defaults 1 1
/dev/mapper/vg-lv_root / ext4 defaults 1 1

because it'll happily pick xfs. Need to exclude comment lines, so exclude MNT_FSNAME starting with # -

test ${MNT_FSNAME::1} == "#" && continue

or in my fancy world could do:

awk '(!/^#/) && ($2 == "/") {print $3}' $(fstab_files)

tho I guess mine assumes only one matching line... | head -n 1 ;)

Quoted 8 lines
Quoted 3 lines

Might have to add awk as a Depends: dependency in debian/control if you do that. I think it's cleaner....

Ok, up to you. If this is all just boilerplate from other debian scripts and it's good enough for them I guess I can just merge as is. The only thing that seemed to matter was not ignoring comment lines, which would be trivial to fix.

Ok, I'll do that.

--D

Quoted 5 lines

-Eric
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#7 lore raw

PATCH v2 1/1 xfs: add debian initramfs hook to package

In reply to Darrick J. Wong

From: Darrick J. Wong <[email protected]>

In Debian bug 904086, the reporter complained that xfs_repair wasn't present in the initramfs, which prevented him from using shutdown -F to force a filesystem fsck after a reboot. Add a hook to put the xfs utilities in the initramfs if xfs is the root filesystem.

---
v2: ignore comment lines

---
 debian/local/initramfs.hook |   52 +++++++++++++++++++++++++++++++++++++++++++
 debian/rules                |    1 +
 2 files changed, 53 insertions(+)
 create mode 100644 debian/local/initramfs.hook
debian/local/initramfs.hook new file +52 -0
new file mode 100644
index 00000000..5b24eaec
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+# Put XFS utilities in initramfs if the root fs is XFS.
+
+PREREQ=""
+
+prereqs()
+{
+	echo "$PREREQ"
+}
+
+case $1 in
+prereqs)
+	prereqs
+	exit 0
+	;;
+esac
+
+fstab_files()
+{
+	echo /etc/fstab
+	if [ -d /etc/fstab.d ]; then
+		ls -1 /etc/fstab.d | grep '\.fstab$' | sed -e 's;^;/etc/fstab.d/;'
+	fi
+}
+
+rootfs_type() {
+	fstab_files | while read file; do
+		test ! -f "$file" && continue
+
+		while read MNT_FSNAME MNT_DIR MNT_TYPE MNT_OPTS MNT_FREQ MNT_PASS MNT_JUNK; do
+			case "$MNT_FSNAME" in
+			""|\#*)
+				continue;
+				;;
+			esac
+			test "$MNT_DIR" != "/" && continue
+			echo "$MNT_TYPE"
+			break;
+		done < "$file"
+	done
+}
+
+. /usr/share/initramfs-tools/scripts/functions
+. /usr/share/initramfs-tools/hook-functions
+
+if [ "$(rootfs_type)" = "xfs" ]; then
+	copy_exec /sbin/xfs_repair
+	copy_exec /usr/sbin/xfs_db
+	copy_exec /usr/sbin/xfs_metadump
+fi
+exit 0
debian/rules +1 -0
index cb4fa22c..4c50654c 100755
@@ -77,6 +77,7 @@ binary-arch: checkroot built
 	$(pkgdev) $(MAKE) -C . install-dev
 	$(pkgdi)  $(MAKE) -C debian install-d-i
 	$(pkgme)  $(MAKE) dist
+	install -D -m 0755 debian/local/initramfs.hook debian/xfsprogs/usr/share/initramfs-tools/hooks/xfs
 	rmdir debian/xfslibs-dev/usr/share/doc/xfsprogs
 	rm -f debian/xfslibs-dev/lib/libhandle.la
 	rm -fr debian/xfslibs-dev/usr/lib
Reviewed-by on v2 1/1
#8 lore raw
Quoted 8 lines · Darrick J. Wong

From: Darrick J. Wong <[email protected]>

In Debian bug 904086, the reporter complained that xfs_repair wasn't present in the initramfs, which prevented him from using shutdown -F to force a filesystem fsck after a reboot. Add a hook to put the xfs utilities in the initramfs if xfs is the root filesystem.