How can I force a Mac OS X kext to load prior to login?

6

1

I have a kext that I would like to be loaded at startup time. It doesn't need to be loaded particularly early in the process, but I would like it to be loaded before a user logs in.

The kext in question is InsomniaT, and, unlike a device driver, there is nothing that is automatically going to request that it be loaded into the kernel, so just putting it in /System/Library/Extensions won't do anything.

What's the best way to do this?

wfaulk

Posted 2009-09-26T15:47:16.617

Reputation: 5 692

Why not add the kext to /Library/Extensions, set the permissions to 755 and the owner/group to root:wheel, and rebuild the kernel cache after loading it? – Chealion – 2009-09-26T20:36:36.937

My understanding is that it won't actually be loaded unless something requests it. So I can do that, but I'm still left with getting something to request it. – wfaulk – 2009-09-26T22:13:47.333

Answers

6

Use a launch daemon to run /sbin/kextload at start up.

You might want something along these lines... link text

Steve Folly

Posted 2009-09-26T15:47:16.617

Reputation: 5 293

your link is not valid – Usman Nisar – 2015-08-10T11:03:01.927

1

Thank's Mani. The dangers of posting links, eh?! wfaulk's answer below http://superuser.com/a/47373 describes the solution that the linked used to describe

– Steve Folly – 2015-08-11T11:28:28.727

13

Steve Folly's link is accurate, but to have it here:

Create a plist file (which is just a plain text XML document) named something like com.domain.identifier.plist in /Library/LaunchDaemons with contents similar to this:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>KeepAlive</key>
        <false/>
        <key>Label</key>
        <string>com.domain.identifier</string>
        <key>ProgramArguments</key>
        <array>
                <string>/sbin/kextload</string>
                <string>/System/Library/Extensions/MyExtension.kext</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/dev/null</string>
        <key>StandardOutPath</key>
        <string>/dev/null</string>
        <key>UserName</key>
        <string>root</string>
</dict>
</plist>

(There's a manpage, launchd.plist(5) that specifies the syntax of LaunchDaemon plist files.)

I then converted it to a binary plist file just for some trivial syntax checking:

plutil -convert binary1 com.domain.identifier.plist

Then activate the LaunchDaemon to run at startup:

launchctl load -w /Library/LaunchDaemons/com.domain.identifier.plist

And check to make sure that it's in there:

launchctl list | grep com.domain.identifier

The LaunchDaemon should run at startup and load the kext.

wfaulk

Posted 2009-09-26T15:47:16.617

Reputation: 5 692

1plutil also has a -lint option for syntax checking, which is also the default option for no arguments. – Will Ross – 2012-01-05T23:44:39.513