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_rescueis 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/initrdand 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
adddirscript available at/scripts/adddirby 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
adddirand our modifiedprepare_rescuescript
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!