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
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:
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:
Next, we’ll have to find the spot where the rescue system is set up. It’s done in this script:
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
- You have to know that
prepare_rescueis run as the last thing before we exec to
init. 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
adddirand our modified
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.