[launchd-dev] early boot hook in launchd/launchctl?
Damien Sorresso
dsorresso at apple.com
Tue Jun 23 21:08:25 PDT 2009
On Jun 23, 2009, at 6:20 PM, Greg Shenaut wrote:
> Until recently, it was possible to put arbitrary code into /etc/
> rc.server to perform scripted maintenance activities in the early
> boot context (i.e., system disk still write-only, limited driver
> access, etc). In the version distributed with 10.5.7, rc.server
> shows up later in the sequence (i.e., system disk mounted read-
> write). In any case, adding code to rc.server always was a kludge.
What exactly are you doing that requires a read-only filesystem (I
assume that's what you meant). What do you mean by "limited driver
access"? Single-user mode doesn't stop the kernel from loading kexts
as needed.
> Now, the cleanest way to do it seems to be to put code into /.env
> and use "nvram boot-args=-s ; reboot" to run it. This is actually a
> much cooler kludge, because /.env (the value of ENV in single-user
> mode) is normally run only in single-user mode, because otherwise
> the HOME variable will be set, and for root that will cause ENV
> normally to be defined as /var/root/.env. Because /.env only gets
> run in single-user mode, you can put in fairly elaborate checks to
> make sure you're in in the right place without negatively impacting
> startup time for normal root shell scripts.
>
> But I'm concerned that this method, like rc.server, will someday be
> seen by the launchd developers as a bug (that is, HOME not being
> defined in single-user mode); in this case, it too will suddenly
> disappear and some other kludge will have to be found.
.env is a feature of the shell, not launchd. Though it's not mentioned
in bash(1). Perhaps you're referring to /etc/profile? If that's the
case, I suppose we could someday invoke the shell with --noprofile or
something in the future, but I don't see a compelling reason to do
that. Also, we don't set ENV when invoking the shell for single-user
mode.
Also, the existence of rc.server is considered to be more of a
necessary evil than a bug. :)
> So what I'm wondering is whether it might not be a good idea to
> provide a conventional hook for early-boot maintenance. It could
> simply be a shell script in a standard location such as /etc/
> rc.earlyboot which gets executed by launchd if present, owned by
> root, and not writable except by root. This would keep people who
> insist on doing this kind of thing from having to keep finding new
> and better kludges.
>
> Or, of course, the /.env thing and the HOME-less single-user shell
> could become a feature of launchd that is reserved for this purpose.
This might come in the future, but not in the form you're expecting.
--
Damien Sorresso
BSD Engineering
Apple Inc.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2425 bytes
Desc: not available
URL: <http://lists.macosforge.org/pipermail/launchd-dev/attachments/20090623/1b4b2876/attachment.bin>
More information about the launchd-dev
mailing list