OpenRC: Difference between revisions

From Alpine Linux
m (minor reformatting of sentence)
(fixed wikitable formatting, added user services, renamed heading)
Line 5: Line 5:
== Quickstart  ==
== Quickstart  ==


{| class="wikitable"
{|align="center" style="width:100%; border:1px #0771a6 solid; background:#f9f9f9; text-align:left; border-collapse:collapse;"
! Action !! Command !! Remarks
|- style="background:#333333; color:#ffffff; font-size: 0.9em; text-align:center;"
| width="40%" |Action
|            |Command
| width="20%" |Remarks
|-
|-
! colspan="3" | Managing services - start,stop and restart  
|- style="background:#333333; color:#ffffff; font-size: 0.9em; text-align:center;"
| colspan="3" | '''Managing services - start,stop and restart'''
|-
|-
| Start <example.service> now || {{ic|rc-service <example.service> start}} ||  
| Start <example.service> now || {{ic|rc-service <example.service> start}} ||  
Line 16: Line 20:
| Restart <example.service> now || {{ic|rc-service <example.service> restart}} ||  
| Restart <example.service> now || {{ic|rc-service <example.service> restart}} ||  
|-
|-
! colspan="3" | Adding and removing services from runlevels
|- style="background:#333333; color:#ffffff; font-size: 0.9em; text-align:center;"
| colspan="3" | '''Adding and removing services from runlevels'''
|-
|-
| Add <example.service> to <runlevel> || {{ic|rc-update add <example.service> <runlevel>}} ||  
| Add <example.service> to <runlevel> || {{ic|rc-update add <example.service> <runlevel>}} ||  
Line 22: Line 27:
| Remove <example.service> from <runlevel> || {{ic|rc-update del <example.service> <runlevel>}} ||  
| Remove <example.service> from <runlevel> || {{ic|rc-update del <example.service> <runlevel>}} ||  
|-
|-
! colspan="3" | check services and their status
|- style="background:#333333; color:#ffffff; font-size: 0.9em; text-align:center;"
| colspan="3" | ''' check services and their status'''
|- style="background:#333333; color:#ffffff; font-size: 0.9em; text-align:center;"
|-
|-
| To check status of  <example.service> || {{ic|rc-service <example.service> status}} ||  
| To check status of  <example.service> || {{ic|rc-service <example.service> status}} ||  
|-
|-
| To check services and their set runlevels || {{ic|rc-status}} ||  
| To view currently active runlevels and state of services || {{ic|rc-status}} ||  
|-
|- style="background:#333333; color:#ffffff; font-size: 0.9em; text-align:center;"
| colspan="3" | ''' check and manage runlevels'''
|- style="background:#333333; color:#ffffff; font-size: 0.9em; text-align:center;"
|-
|-
| To view available runlevels || {{ic|rc-status -l}} ||  
| To view available runlevels || {{ic|rc-status -l}} ||  
Line 42: Line 53:
== Runlevels ==
== Runlevels ==


The openRC runlevels available are:
A runlevel is basically a collection of services that needs to be started. Instead of random numbers they are named, and users can create their own if needed. The default startup uses the runlevels sysinit, boot, and default, in that order. Shutdown uses the shutdown runlevel.
 
The available runlevels are:
* '''default''' - Used if no runlevel is specified. (This is generally the runlevel you want to add services to.)
* '''default''' - Used if no runlevel is specified. (This is generally the runlevel you want to add services to.)
* '''hotplugged'''
* '''hotplugged'''
Line 55: Line 68:
* '''shutdown''' - Changes to the shutdown runlevel and then halts the host.
* '''shutdown''' - Changes to the shutdown runlevel and then halts the host.


=== Runlevel stacking ===
=== Stacked runlevels ===


Runlevel "inheritance" is acheived through [https://docs.alpinelinux.org/user-handbook/0.1a/Working/openrc.html#_runlevel_stacking runlevel stacking]. For more detailed information, refer [https://wiki.gentoo.org/wiki/OpenRC/Stacked%20runlevel stacked runlevels].
Runlevel "inheritance" is acheived through [https://docs.alpinelinux.org/user-handbook/0.1a/Working/openrc.html#_runlevel_stacking runlevel stacking]. For more detailed information, refer [https://wiki.gentoo.org/wiki/OpenRC/Stacked%20runlevel Gentoo wiki].


== Preventing slow services from delaying boot ==
== Preventing slow services from delaying boot ==
Line 91: Line 104:
to auto mount the cgroup filesystem on boot.
to auto mount the cgroup filesystem on boot.


== User services ==
OpenRC supports managing services for users.
The [[XDG_RUNTIME_DIR]] variable must be set before calling openrc --user, as it's used to store state for openrc itself and the services it runs.
== See also ==
== See also ==



Revision as of 16:29, 15 February 2025

Alpine Linux uses openrc for its init system. The init system manages the services, startup and shutdown of your computer.

Refer to the excellent guide working with OpenRC from Alpine Linux documentation project to learn the basics quickly. Refer Writing Init Scripts and Multiple instances of services pages for more advanced information.

Quickstart

Action Command Remarks
Managing services - start,stop and restart
Start <example.service> now rc-service <example.service> start
Start <example.service> now rc-service <example.service> stop
Restart <example.service> now rc-service <example.service> restart
Adding and removing services from runlevels
Add <example.service> to <runlevel> rc-update add <example.service> <runlevel>
Remove <example.service> from <runlevel> rc-update del <example.service> <runlevel>
check services and their status
To check status of <example.service> rc-service <example.service> status
To view currently active runlevels and state of services rc-status
check and manage runlevels
To view available runlevels rc-status -l
To change to a different <runlevel> openrc <runlevel>
To add <s-runlevel> as a stacked <runlevel> rc-update add -s <s-runlevel> <runlevel>


  • Reboot/Halt/Poweroff: (And their equivalent from traditional GNU/Linux systems):

    # reboot # ⇔ shutdown now -r # halt # ⇔ shutdown now -H # poweroff # ⇔ shutdown now -P

Runlevels

A runlevel is basically a collection of services that needs to be started. Instead of random numbers they are named, and users can create their own if needed. The default startup uses the runlevels sysinit, boot, and default, in that order. Shutdown uses the shutdown runlevel.

The available runlevels are:

  • default - Used if no runlevel is specified. (This is generally the runlevel you want to add services to.)
  • hotplugged
  • manual

The special runlevels are:

  • sysinit - Brings up system specific stuff such as /dev, /proc and optionally /sys for Linux based systems. It also mounts /lib/rc/init.d as a ramdisk using tmpfs where available unless / is mounted rw at boot. rc uses /lib/rc/init.d to hold state information about the services it runs. sysinit always runs when the host first starts and should not be run again.
  • boot - Generally the only services you should add to the boot runlevel are those which deal with the mounting of filesystems, set the initial state of attached peripherals and logging. Hotplugged services are added to the boot runlevel by the system. All services in the boot and sysinit runlevels are automatically included in all other runlevels except for those listed here.
  • single - Stops all services except for those in the sysinit runlevel.
  • reboot - Changes to the shutdown runlevel and then reboots the host.
  • shutdown - Changes to the shutdown runlevel and then halts the host.

Stacked runlevels

Runlevel "inheritance" is acheived through runlevel stacking. For more detailed information, refer Gentoo wiki.

Preventing slow services from delaying boot

Services that take a while to start will block the boot process until they complete. E.g.: iwd and networking might delay startup of an interactive system rather than start in the background.

This can be remedied as per Patrycja's blog post titled OpenRC: Start services after login prompt. This solution makes use of stacked runlevel.

Warning: If the file /etc/inittab is edited wrongly, the system may not boot. Take backup and learn how to restore using rescue disk before proceeding.


  • Create a custom runlevel (name is “async” here, but it doesn’t matter)

    # mkdir /etc/runlevels/async

  • Add default as a stacked runlevel

    # rc-update add -s default async

  • Remove slow services from default and add them to async

    # rc-update del chronyd # rc-update add chronyd async

  • Add changing of runlevel to async by adding the line ::once:/sbin/openrc async to /etc/inittab file as follows:

    Contents of /etc/inittab

    ... ::wait:/sbin/openrc default ::once:/sbin/openrc async -q # Set up a couple of getty's tty1::respawn:/sbin/getty 38400 tty1 ...

After rebooting, services from async will start separately. This change does not affect other services that start from Default runlevel and they may still block agetty from running due to the wait label.

cgroups v2

Since openrc 0.51 cgroups v2, or "unified", is the default. You can enable hybrid cgroups v1 & v2 by editing /etc/rc.conf and setting rc_cgroup_mode="hybrid".

Then you should run

# rc-service cgroups start

to take effect and

# rc-update add cgroups

to auto mount the cgroup filesystem on boot.

User services

OpenRC supports managing services for users. The XDG_RUNTIME_DIR variable must be set before calling openrc --user, as it's used to store state for openrc itself and the services it runs.

See also