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.
Both comments and pings are currently closed.
Thanks for this. Actually, would be nice if there were more articles about updating and/or fixing code with the superb, detailed explanations like you have supplied. If there were (are, or going to be), I suspect we will get more people studying it and finally plunging in to help out with coding, bugs, and more.
Thanks! I’ll try. 🙂
Thanks for this. Actually, would be nice if there were more articles about updating and/or fixing code with the superb!