Re: Single-user actions on reboot
- In reply to: Warner Losh : "Re: Single-user actions on reboot"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 29 Sep 2023 21:32:46 UTC
On 9/29/23 11:56, Warner Losh wrote:
>
>
> On Fri, Sep 29, 2023, 10:12 AM Chris <bsd-lists@bsdforge.com
> <mailto:bsd-lists@bsdforge.com>> wrote:
>
> On 2023-09-29 06:49, Guido Falsi wrote:
> > On 29/09/23 15:21, Jason Bacon wrote:
> >>
> >> I'm wondering if there's a canonical way to schedule a command
> to run
> >> automatically during the next boot cycle, but before going
> multiuser.
> >>
> >> This would be useful, for example, to run certain tunefs
> commands on /,
> >> which can only be done in single-user mode, on remotely managed
> systems.
> >>
> >> Running things after going multiuser is easy, of course, but not
> sufficient
> >> for tunefs commands that cannot be performed on a filesystem
> mounted rw.
> >>
> >> Thanks...
> >>
> >
> > AFAIK there is no ready made tool in base (or ports) for that.
> >
> > But ezjail uses this trick with rc scripts (removing itself):
> >
> >
> https://erdgeist.org/gitweb/ezjail/tree/examples/example/etc/rc.d/ezjail.flavour.example <https://erdgeist.org/gitweb/ezjail/tree/examples/example/etc/rc.d/ezjail.flavour.example>
> >
> > This is effective but requires the disk mounted r/w which maybe
> is not
> > enough for you.
> >
> > Problem is, without any writable media mounted, how can any
> script register
> > it has
> > already ran?
> >
> > One idea that comes to mind is adding some hook to the main rc
> script,
> > before
> > mounting disk r/w, and a second script that removes existing
> hooks once
> > disks are
> > r/w.
> Indeed. Maybe at the same point the system tastes the disk(s) to see if
> they've been dismounted
> properly and then running fsck(8) if not. Using the same method to
> perform
> your task(s)?
>
>
> At work we just have a custom rc script to do that for all our content
> disks (only os disks are in fstab).
>
> As for writable media... you could set a uefi variable... or create a
> small MD partition (call it /once) that an rc script in a later phase
> could use to mop up and then free. The latter is easier, but in many
> environments the former is more durable and reliable if there's an early
> crash that happens before mopup and you can really only run something
> once...
>
> Warner
>
Thanks for the brainstorming, guys. This is about what I expected to
hear. What I had done to automate completion of base upgrades after the
required reboot is add the following to /etc/rc.local:
# Would be nice if this were added to the default rc.local
rc_dir=/etc/rc.local.d
for script in $rc_dir/*; do
/bin/sh $script
done
Then drop a very simple self-removing script into
/etc/rc.local.d/freebsd-update-install.sh:
#!/bin/sh -e
/usr/sbin/freebsd-update install
/usr/sbin/pkg upgrade -y
rm -f $rc_dir/freebsd-update-install.sh
I just realized I could do the same thing by creating a new rc script
such as /etc/rc.d/local.single, modeled on /etc/rc.d/local, but running
earlier and using a different script and directory, e.g.
/etc/rc.local.single and /etc/rc.local.single.d/.
Cheers,
J
--
Life is a game. Play hard. Play fair. Have fun.