Today: update the update process!
Yesterday a colleague asked me if it would be possible to apply a driver update (DUD) to the rescue system. He wanted to use a new btrfsprogs
package.
My immediate reaction was: no, you can’t do it. But then, there’s no technical reason why it shouldn’t be possible – it actually nearly works. The updates are downloaded as usual – just not applied to the rescue system.
So I thought: “Why not make a driver update so driver updates work also for the rescue system?”
Here’s how I did it.
First, let’s find out how driver updates are usually applied. The code is here:
https://github.com/openSUSE/installation-images/blob/master/data/root/etc/inst_setup#L84-L87
We need just these three lines:
for i in /update/[0-9]*/inst-sys ; do [ -d "$i" ] && adddir "$i" / done
linuxrc
downloads the driver updates and stores them in an /update
directory. One (numbered) subdirectory for each update.
It obviously uses some adddir
script. So we’ll need it as well. Luckily, it’s not far away:
https://github.com/openSUSE/installation-images/blob/master/data/root/etc/adddir
Next, we’ll have to find the spot where the rescue system is set up. It’s done in this script:
https://github.com/openSUSE/installation-images/blob/master/data/initrd/scripts/prepare_rescue
Let’s do some copy-and-paste programming and insert the above code near the end of the script. It then might look like this
# driver update: add files to rescue system if [ -d /mounts/initrd/update ] ; then cp -r /mounts/initrd/update / for i in /update/[0-9]*/inst-sys ; do [ -d "$i" ] && /mounts/initrd/scripts/adddir "$i" / done fi
Some notes:
- You have to know that
prepare_rescue
is run as the last thing before we exec toinit
. So everything is already in place, the left-over files from initrd are mounted at/mounts/initrd
and will be removed at the end of the script. - This means we have to copy our updates into the new root directory, else they will be lost.
- Also, we plan to make the
adddir
script available at/scripts/adddir
by our driver update (see below).
Now let’s create the driver update:
mkdud --create dud_for_rescue.dud \ --dist tw --dist leap42.1 --dist leap42.2 --dist sle12 \ --name 'Apply DUD also to rescue system' \ --exec 'cp adddir prepare_rescue /scripts' \ adddir prepare_rescue
Here’s what this call does, line-by-line:
- the fix works for all current SUSE distributions, so let’s support them
- give the driver update some nice name
- this command is run right after the driver update got loaded; we copy the scripts out of the driver update to their final location
- add
adddir
and our modifiedprepare_rescue
script
Here is the result: dud_for_rescue.dud.
Now, back to the original problem: how to use this to update a package in the rescue system? That’s easy:
mkdud --create new_btrfs.dud \ --dist sle12 \ dud_for_rescue.dud btrfsprogs.rpm
creates a driver update (for SLE12) that updates btrfsprogs
also in the rescue system.