Date: Fri, 29 Sep 2023 16:32:46 -0500 From: Jason Bacon <bacon4000@gmail.com> To: Warner Losh <imp@bsdimp.com>, Chris <bsd-lists@bsdforge.com> Cc: Guido Falsi <mad@madpilot.net>, FreeBSD Hackers <freebsd-hackers@freebsd.org> Subject: Re: Single-user actions on reboot Message-ID: <22a305ca-bd0a-af58-31d1-31875ed28629@gmail.com> In-Reply-To: <CANCZdfqRzxGHLUZ7RvWc0F4tKtFV6gm-Dkj9ykQOS_EqU4_j2A@mail.gmail.com> References: <b70d24e3-ce25-f2fb-1f0f-9526f16173b0@gmail.com> <67d9160e-c1fc-4e60-93fb-8c18afc2ac41@madpilot.net> <e5a3b651c3e1e6f74b8114ce8822c929@bsdforge.com> <CANCZdfqRzxGHLUZ7RvWc0F4tKtFV6gm-Dkj9ykQOS_EqU4_j2A@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
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.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?22a305ca-bd0a-af58-31d1-31875ed28629>