Browse code

Fix initramfs for the upgrade scenario

Change-Id: I68f587df99558307bfc1b3d167d7cd523595692b
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/3377
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Alexey Makhalov <amakhalov@vmware.com>

Bo Gan authored on 2017/08/01 11:50:47
Showing 5 changed files
... ...
@@ -1,7 +1,7 @@
1 1
 Summary:	initramfs
2 2
 Name:		initramfs
3 3
 Version:	2.0
4
-Release:	2%{?dist}
4
+Release:	3%{?dist}
5 5
 Source0:	fscks.conf
6 6
 License:	Apache License
7 7
 Group:		System Environment/Base
... ...
@@ -18,53 +18,92 @@ mkdir -p %{buildroot}%{_sysconfdir}/dracut.conf.d
18 18
 install -D -m644 %{SOURCE0} %{buildroot}%{_sysconfdir}/dracut.conf.d/
19 19
 install -d -m755 %{buildroot}%{_localstatedir}/lib/initramfs/kernel
20 20
 
21
-%define watched_path %{_sbindir} %{_libdir}/udev/rules.d %{_libdir}/systemd/system  /lib/modules
21
+%define watched_path %{_sbindir} %{_libdir}/udev/rules.d %{_libdir}/systemd/system /lib/modules %{_sysconfdir}/dracut.conf.d
22 22
 %define watched_pkgs e2fsprogs, ostree, systemd, kpartx, device-mapper-multipath
23 23
 
24
-%define removal_action \
25
-rm -rf %{_localstatedir}/lib/rpm-state/initramfs.regenerate \
26
-rm -rf %{_localstatedir}/lib/rpm-state/initramfs.pending
24
+%define removal_action() rm -rf %{_localstatedir}/lib/rpm-state/initramfs
27 25
 
28
-%define pkgs_trigger_action \
29
-[ -f %{_localstatedir}/lib/rpm-state/initramfs.regenerate ] && exit 0 \
30
-mkdir -p %{_localstatedir}/lib/rpm-state \
31
-touch %{_localstatedir}/lib/rpm-state/initramfs.regenerate \
32
-echo "initramfs (re)generation triggered" >&2
26
+# How it works:
27
+#
28
+# We would like initramfs generation to happen if a given set of packages
29
+# are changed, including installing/upgrading/uninstalling.
30
+#
31
+# Hence, Two sets of triggers:
32
+#
33
+# package triggers for setting the `regenerate` flag
34
+# upon critical package install/upgrade/uninstall
35
+#
36
+# file transaction triggers which overlaps the set of files in those packages
37
+# so that we have an opportunity to check for the flag and (re)generate
38
+# initrd for all the kernels.
39
+#
40
+# All the flags will be put in /var/lib/rpm-state/initramfs
41
+#
42
+# This ensures the easy removal of the intermediate state,
43
+# postun is essential here, as it guarantees that no intermediate states
44
+# will be left over for the new initramfs rpm, since triggerin/un
45
+# in the new rpm will execute after the postun in the old rpm
46
+#
47
+# The order of the scriptlet is critical. The heavy lifting mkinitrd is
48
+# always done post transaction, as it's always invoked in posttrans/
49
+# transfiletriggerin/transfiletriggerpostun. Whereas the creation of flag
50
+# is in the middle of transaction.
51
+#
52
+# The kernel rpm has triggers for initramfs. This is an optimization, as
53
+# we don't want mkinitrd be invoked for all the kernels if some of the kernel
54
+# rpms is being installed/upgraded/uninstalled. Hence, there is no trigger
55
+# in initramfs watching for linux, but there is file transaction trigger
56
+# watching for /lib/modules. The triggerin in linux.rpm will create flag as
57
+#
58
+# pending/%{uname_r}
59
+#
60
+# which indicates only the corresponding initrd will be (re)generated, and
61
+# the triggerun in linux.rpm will remove the corresponding initrd.
33 62
 
34
-%define file_trigger_action \
63
+%define pkgs_trigger_action() \
64
+[ -f %{_localstatedir}/lib/rpm-state/initramfs/regenerate ] && exit 0 \
65
+mkdir -p %{_localstatedir}/lib/rpm-state/initramfs \
66
+touch %{_localstatedir}/lib/rpm-state/initramfs/regenerate \
67
+echo "initramfs (re)generation" %* >&2
68
+
69
+%define file_trigger_action() \
35 70
 cat > /dev/null \
36
-if [ -f %{_localstatedir}/lib/rpm-state/initramfs.regenerate ]; then \
37
-    echo "(re)generate initramfs for all kernels" >&2 \
71
+if [ -f %{_localstatedir}/lib/rpm-state/initramfs/regenerate ]; then \
72
+    echo "(re)generate initramfs for all kernels," %* >&2 \
38 73
     mkinitrd -q \
39
-elif [ -d %{_localstatedir}/lib/rpm-state/initramfs.pending ]; then \
40
-    for k in `ls %{_localstatedir}/lib/rpm-state/initramfs.pending/`; do \
41
-        echo "generate initramfs for $k" >&2 \
74
+elif [ -d %{_localstatedir}/lib/rpm-state/initramfs/pending ]; then \
75
+    for k in `ls %{_localstatedir}/lib/rpm-state/initramfs/pending/`; do \
76
+        echo "(re)generate initramfs for $k," %* >&2 \
42 77
         mkinitrd -q /boot/initrd.img-$k $k \
43 78
     done; \
44 79
 fi \
45
-%{removal_action}
80
+%removal_action
46 81
 
47
-%post
48
-%{pkgs_trigger_action}
82
+%posttrans
83
+echo "initramfs" %{version}-%{release} "posttrans" >&2
84
+%removal_action
85
+mkinitrd -q
49 86
 
50 87
 %postun
51
-[ $1 -eq 0 ] || exit 0
52
-%{removal_action}
53
-
54
-%posttrans
55
-%{file_trigger_action}
88
+echo "initramfs" %{version}-%{release} "postun" >&2
89
+#cleanup the states
90
+%removal_action
56 91
 
57 92
 %triggerin -- %{watched_pkgs}
58
-%{pkgs_trigger_action}
93
+[ $1 -gt 1 ] && exit 0
94
+#Upgrading, let the posttrans of new initramfs handles it
95
+%pkgs_trigger_action triggerin $* %{version}-%{release}
59 96
 
60 97
 %triggerun -- %{watched_pkgs}
61
-%{pkgs_trigger_action}
98
+[ $1 -eq 0 ] && exit 0
99
+#Uninstalling, let the linux.rpm removes initrd for themselves
100
+%pkgs_trigger_action triggerun $* %{version}-%{release}
62 101
 
63 102
 %transfiletriggerin -- %{watched_path}
64
-%{file_trigger_action}
103
+%file_trigger_action transfilertriggerin %{version}-%{release}
65 104
 
66 105
 %transfiletriggerpostun -- %{watched_path}
67
-%{file_trigger_action}
106
+%file_trigger_action transfiletriggerpostun %{version}-%{release}
68 107
 
69 108
 %files
70 109
 %defattr(-,root,root,-)
... ...
@@ -72,6 +111,8 @@ fi \
72 72
 %dir %{_localstatedir}/lib/initramfs/kernel
73 73
 
74 74
 %changelog
75
+*   Thu Jul 27 2017 Bo Gan <ganb@vmware.com> 2.0-3
76
+-   Move all states to one directory
75 77
 *   Fri May 26 2017 Bo Gan <ganb@vmware.com> 2.0-2
76 78
 -   Discard stdin before dracut
77 79
 *   Wed Apr 12 2017 Bo Gan <ganb@vmware.com> 2.0-1
... ...
@@ -1,9 +1,9 @@
1 1
 %triggerin -- initramfs
2
-mkdir -p %{_localstatedir}/lib/rpm-state/initramfs/kernel.pending
3
-touch %{_localstatedir}/lib/rpm-state/initramfs/kernel.pending/%{uname_r}
2
+mkdir -p %{_localstatedir}/lib/rpm-state/initramfs/pending
3
+touch %{_localstatedir}/lib/rpm-state/initramfs/pending/%{uname_r}
4 4
 echo "initrd generation of kernel %{uname_r} will be triggered later" >&2
5 5
 
6 6
 %triggerun -- initramfs
7
-rm -rf %{_localstatedir}/lib/rpm-state/initramfs/kernel.pending/%{uname_r}
7
+rm -rf %{_localstatedir}/lib/rpm-state/initramfs/pending/%{uname_r}
8 8
 rm -rf /boot/initrd.img-%{uname_r}
9 9
 echo "initrd of kernel %{uname_r} removed" >&2
... ...
@@ -2,7 +2,7 @@
2 2
 Summary:        Kernel
3 3
 Name:           linux-esx
4 4
 Version:        4.9.38
5
-Release:        2%{?dist}
5
+Release:        3%{?dist}
6 6
 License:        GPLv2
7 7
 URL:            http://www.kernel.org/
8 8
 Group:          System Environment/Kernel
... ...
@@ -187,6 +187,8 @@ ln -sf linux-%{uname_r}.cfg /boot/photon.cfg
187 187
 /usr/src/linux-headers-%{uname_r}
188 188
 
189 189
 %changelog
190
+*   Wed Jul 26 2017 Bo Gan <ganb@vmware.com> 4.9.38-3
191
+-   Fix initramfs triggers
190 192
 *   Thu Jul 20 2017 Alexey Makhalov <amakhalov@vmware.com> 4.9.38-2
191 193
 -   Disable scheduler beef up patch
192 194
 *   Tue Jul 18 2017 Alexey Makhalov <amakhalov@vmware.com> 4.9.38-1
... ...
@@ -2,7 +2,7 @@
2 2
 Summary:        Kernel
3 3
 Name:           linux-secure
4 4
 Version:        4.9.38
5
-Release:        5%{?dist}
5
+Release:        6%{?dist}
6 6
 License:        GPLv2
7 7
 URL:            http://www.kernel.org/
8 8
 Group:          System Environment/Kernel
... ...
@@ -255,6 +255,8 @@ ln -sf linux-%{uname_r}.cfg /boot/photon.cfg
255 255
 /usr/src/linux-headers-%{uname_r}
256 256
 
257 257
 %changelog
258
+*   Fri Aug 04 2017 Bo Gan <ganb@vmware.com> 4.9.38-6
259
+-   Fix initramfs triggers
258 260
 *   Tue Aug 01 2017 Anish Swaminathan <anishs@vmware.com> 4.9.38-5
259 261
 -   Allow some algorithms in FIPS mode
260 262
 -   Reverts 284a0f6e87b0721e1be8bca419893902d9cf577a and backports
... ...
@@ -2,7 +2,7 @@
2 2
 Summary:        Kernel
3 3
 Name:           linux
4 4
 Version:        4.9.38
5
-Release:        5%{?dist}
5
+Release:        6%{?dist}
6 6
 License:    	GPLv2
7 7
 URL:        	http://www.kernel.org/
8 8
 Group:        	System Environment/Kernel
... ...
@@ -295,6 +295,8 @@ ln -sf %{name}-%{uname_r}.cfg /boot/photon.cfg
295 295
 /usr/share/doc/*
296 296
 
297 297
 %changelog
298
+*   Fri Aug 04 2017 Bo Gan <ganb@vmware.com> 4.9.38-6
299
+-   Fix initramfs triggers
298 300
 *   Tue Aug 01 2017 Anish Swaminathan <anishs@vmware.com> 4.9.38-5
299 301
 -   Allow some algorithms in FIPS mode
300 302
 -   Reverts 284a0f6e87b0721e1be8bca419893902d9cf577a and backports