Re: Should reboot(8) be modified so that it can become the recommended way to reboot a system?
Cy Schubert <[email protected]>
| Newsgroups | gmane.os.freebsd.architechture |
|---|---|
| Organization | KOMQUATS |
| Message-ID | <20250212121617.7b3a0db2@slippy> |
On Mon, 10 Feb 2025 10:04:06 -0700 Warner Losh <[email protected]> wrote: > On Sun, Feb 9, 2025 at 10:00 AM Poul-Henning Kamp <[email protected]> > wrote: > > > -------- > > Daniel Tameling writes: > > > > > Part of the problem is that reboot indeed reboots the system. > > > > I understand what you are saying, but there's no way it can be a > > "problem" that a command called "reboot" reboots the system :-) > > > > If we dont want to make this a flag-day and break a lot of scripts, > > and other automation, the only option, is to make reboot(8) and > > halt(8) print a message and sleep long enough that people can > > change their mind. > > > > My suggestion would be: > > > > If reboot(8) or halt(8) is invoked with any other argument than > > '-p', they behave as documented today. > > > > If they are invoked without arguments, or with only the '-p' argument, > > it goes something like: > > > > # reboot > > > > If you want things to be stop nicely: > > > > Press CTRL-C now, and use the shutdown(8) command instead. > > > > 3 > > 2 > > 1 > > rebooting > > > > That clearly communicates what the concern is, gives people a sensible > > chance to change their mind, and does not break any existing scripts. > > > I have a contrary view. I think we should make some changes. But we can't > just exec shutdown, the args / history / evolution of reboot is too > complicated for that. > > tl;dr: (1) reboot -r is the hardest thing. It's actually a FreeBSD specific > thing that people care about and is different than shutdown -r, so we can't > make reboot a link to shutdown. The rest is very straight-forward with only > one real behavior change. > > fasthalt and fastboot should all remain unchanged: they reboot w/o killing > system processes. This is in line with historic practice, but that history > is from the 90s so nice to have, but not super relevant. This also matches > what Linux does. It also preserves a fast way to start over. Add -f for > linux compatibility too. -q remains unchanged, since it would force -f. > Though for linux compat we may want to consider not doing that last detail: > reboot -q -> shutdown -r -q in linux (the latter has the same meaning in > FreeBSD: quietly shutdown rather than quickly.) But, alas, '-q' doesn't > klil all the processes. > > w/o args we change from calling reboot(2) directly to execing shutdown. > There the change is intentional: /etc/rc.shutdown is run where it wasn't > before. People that have scripts that depend on this detail are kinda hozed > anyway: killing the demons unexpectedly will leave things in a weird state > and this pushes that behavior to intentionally using -f rather than being > just a historical accident. I'd be happy with a 3 second countdown like > the above but with the message flipped. If people really really need it, > env var to enable old behavior (and even then it would print the new > message phk recommends, etc). reboot/halt -c, -p -> same behavior, and > those flags are passed to shutdown. This would also fix the mismatch > between halt -p and poweroff. > > -e, -d, -D, -k, -l, -o -> no change: reboot handles managing nextboot. > shutdown not invoked. > > -n -> passed to shutdown > > -N should just invoke shutdown and be otherwise swallowed up. > > -r -> becomes a new reroot program (maybe a symlink to reboot, I've not > looked at how much code is shared) and reboot -r prints a warning about it > moving there. It is an outlier in the reboot program, though there's some > good logic for why it landed there. Right now, it just signals init to > reroot, so that causes rc.shutdown to run. > > In the early 2000s, I thought we needed things like we had/have them. Since > then, I've shot my foot more times than not and $WORK has 'alias reboot > shutdown -r' in our .cshrc. That works great, until I want to do nextboot > things, so I'm not recommending it as a way forward. Once or twice I've > really wanted the don't run /etc/rc.shutdown behavior, the other 10k times > I've rebooted a system I've either not cared about skipping it or thought > running it was a good thing. > > In summation, there's the following ways to reboot (not reroot): > > (1) -q just call reboot, don't kill anything > (2) kill everything with SIGTERM to allow those programs that catch a > signal to do so and terminate more or less gracefully (delays, plus waiting > for paging to stop, etc) > (3) have shutdown do it (so -o flag). This is shutdown calling (2) after > the waiting period, but is otherwise identical to (2). > (4) Kill init and have it sort the mess. The first thing init does is run > /etc/rc.shutdown and then kills straggler processes. > > It's all a confusing mess today, though people have learned it well. People > are asking that some things now cause (4) to happen rather than (2). I > think I've enumerated them above, but see my initial "too complicated" > comment. It's even messier. If we look at Linux, they (specifically Red Hat but others also) document systemctl reboot as the correct way to reboot a system. In our team the junior admins use this approach. The reboot (and shutdown) commands are now linked to to systemctl -- it's a systemd world. Even init 6 is interpreted by systemd as a systemctl command. I don't think we can approximate the current approach being pushed by the Linux community. And like Red Hat documenting systemctl reboot as the correct way to reboot a server we should focus on documentation, maybe documenting reboot(8) in an advanced section of the handbook. Even to say in the reboot(8) man page that the use of shutdown(8) is the correct (not preferred but correct) way to reboot a FreeBSD system. As most of the Linux world has embraced systemd, to try to have any semblance of a Linux approach to reboot isn't possible. reboot(8) is to be used in those circumstances that an admin absolutely needs to interface directly with the kernel. reboot(8) should be discouraged in favour of shutdown(8). Just like Linux vendors discourage the use of reboot(8) and shutdown(8) to use systemctl(8) instead. Again, anyone new to sysadmin in the Linux world doesn't know about reboot(8) and shutdown(8), at least not at our shop. It's all done through systemctl(8). > > Warner -- Cheers, Cy Schubert <[email protected]> FreeBSD UNIX: <[email protected]> Web: https://FreeBSD.org NTP: <[email protected]> Web: https://nwtime.org e^(i*pi)+1=0