initramfs: kernel update adds unwanted driver?

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

initramfs: kernel update adds unwanted driver?

Grant Edwards
On Fedora 27 with kernel recently updated to 4.15.15-300.fc27.i686, I
ran into a problem when I installed a new version of a driver (we'll
call "foo") in /lib/modules/$(uname -r)/kernel/drivers/[...].

Doing a "rmmod foo; modprobe foo" loads the new driver and everything
works great.  However, rebooting loads a 15-year old version of the
driver (which doesn't work great).

lsinitrd shows that the 15-year old driver is present in the
initramfs.  On a clean install of Fedora 27 (running an identical
kernel version) the initramfs does not contain the "foo" driver at
all.

Did the kernel upgrade process muck up the initramfs by adding the old
version of the "foo" driver?  The "old" version is the one that's
shipped with the kernel package, but I've never seen it included in
the initramfs before.

What's the best way to remove the old, broken driver from the
initramfs so that the driver in the root filesystem is used on boot?

Is there a way to prevent the kernel update process from adding the
driver back to the initramfs the next time a kernel is updated?

Alternatively, I suppose I could add a "service" that runs at boot
time and does a "rmmod foo; modrobe foo", but that seems like the
wrong way to fix this...

--
Grant
_______________________________________________
users mailing list -- [hidden email]
To unsubscribe send an email to [hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: initramfs: kernel update adds unwanted driver?

Rick Stevens-3
On 04/13/2018 09:34 AM, Grant Edwards wrote:

> On Fedora 27 with kernel recently updated to 4.15.15-300.fc27.i686, I
> ran into a problem when I installed a new version of a driver (we'll
> call "foo") in /lib/modules/$(uname -r)/kernel/drivers/[...].
>
> Doing a "rmmod foo; modprobe foo" loads the new driver and everything
> works great.  However, rebooting loads a 15-year old version of the
> driver (which doesn't work great).
>
> lsinitrd shows that the 15-year old driver is present in the
> initramfs.  On a clean install of Fedora 27 (running an identical
> kernel version) the initramfs does not contain the "foo" driver at
> all.
>
> Did the kernel upgrade process muck up the initramfs by adding the old
> version of the "foo" driver?  The "old" version is the one that's
> shipped with the kernel package, but I've never seen it included in
> the initramfs before.
>
> What's the best way to remove the old, broken driver from the
> initramfs so that the driver in the root filesystem is used on boot?
>
> Is there a way to prevent the kernel update process from adding the
> driver back to the initramfs the next time a kernel is updated?
>
> Alternatively, I suppose I could add a "service" that runs at boot
> time and does a "rmmod foo; modrobe foo", but that seems like the
> wrong way to fix this...

Uhm, probably do a "rmmod foo;modprobe foo", THEN rebuild the initramfs
image. Also check both the /etc/dracut.conf file and /etc/dracut.conf.d
directory to see if they're specifying some ancient version of your
module. At worst, add a --add-modules=<modulename>" to the command.
----------------------------------------------------------------------
- Rick Stevens, Systems Engineer, AllDigital    [hidden email] -
- AIM/Skype: therps2        ICQ: 22643734            Yahoo: origrps2 -
-                                                                    -
-              Death is nature's way of dropping carrier             -
----------------------------------------------------------------------
_______________________________________________
users mailing list -- [hidden email]
To unsubscribe send an email to [hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: initramfs: kernel update adds unwanted driver?

Grant Edwards
On 2018-04-13, Rick Stevens <[hidden email]> wrote:
> On 04/13/2018 09:34 AM, Grant Edwards wrote:

>> What's the best way to remove the old, broken driver from the
>> initramfs so that the driver in the root filesystem is used on boot?
>>
>> Is there a way to prevent the kernel update process from adding the
>> driver back to the initramfs the next time a kernel is updated?
[...]

> Uhm, probably do a "rmmod foo;modprobe foo", THEN rebuild the
> initramfs image. Also check both the /etc/dracut.conf file and
> /etc/dracut.conf.d directory to see if they're specifying some
> ancient version of your module. At worst, add a
> --add-modules=<modulename>" to the command.

Except the goal is to _not_ have the driver in the initramfs.  There
is absolutely no reason it needs to be there, and eliminating it from
the initramfs avoids a source of confusion.

I've identified a couple options:

First create a file named /etc/dracut.conf.d/foo containing the line
omit_drivers+="foo".  Then either

1. Rebuild the initramfs with the 'dracut' command.  I haven't tested
   this yet. It seems a bit risky, since (AFAICT) I don't have any way
   of knowing what command-line options were used to generate the
   current, working initramfs, and I might end up making unintentional
   changes when I regenerate it.  One presumes that a well-behaved
   admin would edit the dracut config files rather than use
   command-line options, but I one should not assume customers are all
   well-behaved.

or

2. Unpack the current initramfs-*.img file, delete the foo.ko.xz file
   and re-pack the initramfs-*.img file. I've written a bash shell
   script to do that, and its seems to work fine.  This feels a little
   less risky than regenerating the initramfs from scratch.

In either case, the omit_drivers setting should prevent re-breaking
the system with future runs of dracut (either manually by the admin or
as part of a kernel upgrade).

--
Grant Edwards               grant.b.edwards        Yow! ... or were you
                                  at               driving the PONTIAC that
                              gmail.com            HONKED at me in MIAMI last
                                                   Tuesday?
_______________________________________________
users mailing list -- [hidden email]
To unsubscribe send an email to [hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: initramfs: kernel update adds unwanted driver?

Francis.Montagnac

Hi.

On Fri, 13 Apr 2018 21:03:34 -0000 Grant Edwards wrote:

> First create a file named /etc/dracut.conf.d/foo containing the line
> omit_drivers+="foo".  Then either

Beware, this file should have .conf as suffix.

> 1. Rebuild the initramfs with the 'dracut' command.  I haven't tested
>    this yet. It seems a bit risky, since (AFAICT) I don't have any way
>    of knowing what command-line options were used to generate the
>    current, working initramfs, and I might end up making unintentional
>    changes when I regenerate it.

You can simply execute the postrans of the kernel-core RPM

    rpm -q --scripts kernel-core-$(uname -r)
    ...
    posttrans scriptlet (using /bin/sh):
    /bin/kernel-install add 4.15.4-300.fc27.x86_64 /lib/modules/4.15.4-300.fc27.x86_64/vmlinuz || exit $?

Thus, for the running kernel:

    /bin/kernel-install add $(uname -r) /lib/$(uname -r)/vmlinuz

It will regenerate the initramfs and eventually other things like the
grub.cfg.

I tested to add a /etc/dracut.conf.d/test.conf to omit a driver. It
works: the driver is no more in the initramfs.

--
francis
_______________________________________________
users mailing list -- [hidden email]
To unsubscribe send an email to [hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: initramfs: kernel update adds unwanted driver?

Grant Edwards
On 2018-04-14, [hidden email] <[hidden email]> wrote:
> On Fri, 13 Apr 2018 21:03:34 -0000 Grant Edwards wrote:
>
>> First create a file named /etc/dracut.conf.d/foo containing the line
>> omit_drivers+="foo".  Then either
>
> Bexware, this file should have .conf as suffix.

Ah yes, thanks for pointing that out.

>> 1. Rebuild the initramfs with the 'dracut' command.  I haven't tested
>>    this yet. It seems a bit risky [...]

> You can simply execute the postrans of the kernel-core RPM
>
>     rpm -q --scripts kernel-core-$(uname -r)
>     ...
>     posttrans scriptlet (using /bin/sh):
>     /bin/kernel-install add 4.15.4-300.fc27.x86_64 /lib/modules/4.15.4-300.fc27.x86_64/vmlinuz || exit $?
>
> Thus, for the running kernel:
>
>     /bin/kernel-install add $(uname -r) /lib/$(uname -r)/vmlinuz
>
> It will regenerate the initramfs and eventually other things like the
> grub.cfg.
>
> I tested to add a /etc/dracut.conf.d/test.conf to omit a driver. It
> works: the driver is no more in the initramfs.

Thanks!  That looks like a good option.  I may prompt the user for
confirmation before doing that step in my driver install script -- how
likely is it that the admin has done something manually which that
script will undo? [It's been a long time since I ran RedHat much. I
think RedHat 8.0 was the last version I used regularly.]

--
Grant




_______________________________________________
users mailing list -- [hidden email]
To unsubscribe send an email to [hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: initramfs: kernel update adds unwanted driver?

Francis.Montagnac

On Sat, 14 Apr 2018 15:07:28 -0000 Grant Edwards wrote:
> On 2018-04-14, [hidden email] <[hidden email]> wrote:
>> Thus, for the running kernel:
>>     /bin/kernel-install add $(uname -r) /lib/$(uname -r)/vmlinuz

> Thanks!  That looks like a good option.  I may prompt the user for
> confirmation before doing that step in my driver install script -- how
> likely is it that the admin has done something manually which that
> script will undo?

IMO it is really unlikely since there is many ways to hook the
postrans action of the kernel-core RPM, ex:

  /usr/lib/kernel/install.d/
  /etc/kernel/install.d/
  /etc/kernel/postinst.d/

I use for example postinst.d for regenerating the grub.cfg with
grub2-mkconfig.

--
francis
_______________________________________________
users mailing list -- [hidden email]
To unsubscribe send an email to [hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: initramfs: kernel update adds unwanted driver?

Roger Heflin
You can also use lsinitrd to show the current files in any initramfs
and/or cat out the contents of single files you see in the initramfs.

On Sat, Apr 14, 2018 at 10:43 AM,  <[hidden email]> wrote:

>
> On Sat, 14 Apr 2018 15:07:28 -0000 Grant Edwards wrote:
>> On 2018-04-14, [hidden email] <[hidden email]> wrote:
>>> Thus, for the running kernel:
>>>     /bin/kernel-install add $(uname -r) /lib/$(uname -r)/vmlinuz
>
>> Thanks!  That looks like a good option.  I may prompt the user for
>> confirmation before doing that step in my driver install script -- how
>> likely is it that the admin has done something manually which that
>> script will undo?
>
> IMO it is really unlikely since there is many ways to hook the
> postrans action of the kernel-core RPM, ex:
>
>   /usr/lib/kernel/install.d/
>   /etc/kernel/install.d/
>   /etc/kernel/postinst.d/
>
> I use for example postinst.d for regenerating the grub.cfg with
> grub2-mkconfig.
>
> --
> francis
> _______________________________________________
> users mailing list -- [hidden email]
> To unsubscribe send an email to [hidden email]
_______________________________________________
users mailing list -- [hidden email]
To unsubscribe send an email to [hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: initramfs: kernel update adds unwanted driver?

Grant Edwards
In reply to this post by Francis.Montagnac
On 2018-04-14, [hidden email] <[hidden email]> wrote:

> Thus, for the running kernel:
>
>   /bin/kernel-install add $(uname -r) /lib/$(uname -r)/vmlinuz
>
> It will regenerate the initramfs and eventually other things like the
> grub.cfg.
>
> I tested to add a /etc/dracut.conf.d/test.conf to omit a driver. It
> works: the driver is no more in the initramfs.

That mostly works: it omits the kernel module itself (which we'll call
"foo").  Howevr, it still includes in the initramfs the files
etc/modprobe.d/foo.conf and /etc/modules-load.d/foo.conf.

That doesn't seem to cause any real harm other than an annoying error
message in the syslog:

  Apr 16 05:00:19 beta systemd-modules-load[192]: Failed to find module 'foo'

I've been re-reading the dracut docs, and can't figure out how to tell
it to omit those files (I suspect the latter of the two is the
critical one).  I suppose I could remove those files, regenerate the
initramfs, then re-install them.

That's annoying. :/

--
Grant Edwards               grant.b.edwards        Yow! Look!  A ladder!
                                  at               Maybe it leads to heaven,
                              gmail.com            or a sandwich!
_______________________________________________
users mailing list -- [hidden email]
To unsubscribe send an email to [hidden email]