OpenRC: Difference between revisions

From Alpine Linux
(updated instructions based on https://gitlab.alpinelinux.org/alpine/aports/-/issues/17375#note_530342)
(made further changes based on suggestions from Jose Jurado at https://gitlab.alpinelinux.org/alpine/aports/-/issues/17375#note_530342)
Line 111: Line 111:


* [[XDG_RUNTIME_DIR]] variable must be set even for [[Xorg]]
* [[XDG_RUNTIME_DIR]] variable must be set even for [[Xorg]]
* If $HOME differs from {{path|~/}}, adjust below steps accordingly
* Adjust below steps, if $HOME differs from {{path|~/}}


=== Configuration ===
=== Config files ===


The main configuration file for OpenRC User services for a specific user is {{path|~/.config/rc/rc.conf}}. The folder {{Path|~/.config/rc/runlevels/}} contains the runlevels for OpenRC user services.
The main configuration file for OpenRC User services for a specific user is {{path|~/.config/rc/rc.conf}}. The folder {{Path|~/.config/rc/runlevels/}} contains the runlevels for OpenRC user services.
Line 121: Line 121:
The folders {{path|~/.config/rc/init.d/}} and {{path|~/.config/rc/conf.d/}} have customized service scripts for User services files and their respective configuration files.  
The folders {{path|~/.config/rc/init.d/}} and {{path|~/.config/rc/conf.d/}} have customized service scripts for User services files and their respective configuration files.  


==== Configuration of environment variables ====
=== Configure environment variables ===


===== For Wayland =====
==== For Wayland ====
# Allow propagation of the WAYLAND_DISPLAY environment variables by adding the following lines to file {{path|~/.config/rc/rc.conf}} as follows:{{Cat|~/.config/rc/rc.conf|<nowiki>rc_env_allow="WAYLAND_DISPLAY"</nowiki>}}
# Allow propagation of the WAYLAND_DISPLAY environment variables by adding the following lines to file {{path|~/.config/rc/rc.conf}} as follows:{{Cat|~/.config/rc/rc.conf|<nowiki>rc_env_allow="WAYLAND_DISPLAY"</nowiki>}}
# For [[wayland]], a custom '''gui''' user runlevel needs to be created. To create this, issue the command:{{Cmd|$ mkdir -p "~/.config/rc/runlevels/gui"}}
# For [[wayland]], a custom '''gui''' user runlevel needs to be created. To create this, issue the command:{{Cmd|$ mkdir -p "~/.config/rc/runlevels/gui"}}
#:To start '''gui''' user runlevel, add the line {{ic|openrc -U gui}} to the startup file of your compositor after {{ic|$WAYLAND_DISPLAY}} is set. For eg, for [[Sway]] add:{{Cat|~/.config/sway/config|...
# To start '''gui''' user runlevel, add the line {{ic|openrc -U gui}} to the startup file of your compositor after {{ic|$WAYLAND_DISPLAY}} is set. For eg, for [[Sway]] add:{{Cat|~/.config/sway/config|...
exec openrc -U gui}}
exec openrc -U gui}}


===== For Xorg =====
==== For Xorg ====


For[[Xorg]]/Virtual terminals, if [[Elogind]] is not used, ensure that [[Wayland#Creating_and_exporting_XDG_RUNTIME_DIR_manually|XDG_RUNTIME_DIR]] is set manually in {{path|~/.xinitrc}}. For eg, for [[dwm]] add:{{Cat|~/.xinitrc|<nowiki>...
For[[Xorg]]/Virtual terminals, if [[Elogind]] is not used, ensure that [[Wayland#Creating_and_exporting_XDG_RUNTIME_DIR_manually|XDG_RUNTIME_DIR]] is set manually in {{path|~/.xinitrc}}. For eg, for [[dwm]] add:{{Cat|~/.xinitrc|<nowiki>...
Line 140: Line 140:
exec dwm</nowiki>}}  
exec dwm</nowiki>}}  


{{Note|For both above cases, logout and login for the OpenRC user services to be started.}}  
{{Note|For both the above cases, logout and login for the OpenRC user services to be started, before proceeding further.}}  


==== Enable User service ====
=== User service management ===


Issue the command {{ic|$ rc-status -Ur}} to view and verify the name of the current user runlevel as '''gui''' and '''default''' for Wayland and Xorg respectively before proceeding.
Issue the command {{ic|$ rc-status -Ur}} to view and verify the name of the current user runlevel as '''gui''' and '''default''' for Wayland and Xorg respectively before proceeding.  


# To enable [[PipeWire]] User service, issue the command:
To start [[PipeWire]] user service, issue the command:{{Cmd|$ rc-update -U pipewire start}}
#: for Wayland: {{Cmd|$ rc-update -U add pipewire gui}}
Verify that the above OpenRC user service is started before proceeding further: {{Cmd|$ rc-status -U}}
#: for Xorg: {{Cmd|$ rc-update -U add pipewire default}}
To enable [[PipeWire]] user service, issue the command: {{Cmd|$ rc-update -U add pipewire}}
# Repeat the above steps for other User services like {{ic|pipewire-pulse}}, {{ic|wlsunset}} etc
 
# Logout and login for the [[PipeWire]] user services to be launched.
The above steps can be repeated for other User services like {{ic|pipewire-pulse}}, {{ic|wlsunset}} etc
# Issue the command {{ic|$ rc-status -U}} to view the status of OpenRC user services.


{{Note|Ensure that the startup of above services from {{Path|/etc/xdg/autostart}} folder or from the startup/config file are stopped to prevent duplicate instance of services.}}
{{Note|Ensure that the startup of above services from {{Path|/etc/xdg/autostart}} folder or from the startup/config file are stopped to prevent duplicate instance of services.}}
Line 158: Line 157:


The default installation of OpenRC user services is without PAM support. To ensure that user services do not linger on logout, enable PAM support for OpenRC user services by installing the {{pkg|openrc-user-pam}} package.{{Cmd|# apk add {{pkg|openrc-user-pam}}}}  
The default installation of OpenRC user services is without PAM support. To ensure that user services do not linger on logout, enable PAM support for OpenRC user services by installing the {{pkg|openrc-user-pam}} package.{{Cmd|# apk add {{pkg|openrc-user-pam}}}}  
If [[greetd]] is used, a harmless failed error message appears for {{ic|user.greetd}} service as per {{MR|81612#note_492385}}.


== Preventing slow services from delaying boot ==
== Preventing slow services from delaying boot ==
Line 199: Line 196:


=== XDG_RUNTIME_DIR unset ===
=== XDG_RUNTIME_DIR unset ===
                                                                                                                [ failed ]
While configuring [[#User services|user services]], running the command {{ic|$ doas rc-update add -U pipewire gui}} will generate the above error {{ic|XDG_RUNTIME_DIR unset}}.  Always issue the command as normal user {{ic|$ rc-update add -U pipewire gui}} and do NOT use {{ic|doas}}.


While configuring [[#User services|user services]], running the command {{ic|$ doas rc-update add -U pipewire gui}} will generate the above error {{ic|XDG_RUNTIME_DIR unset}}.  Always issue the command as normal user {{ic|$ rc-update add -U pipewire gui}} and do NOT use {{ic|doas}}.  
=== ERROR: user.greetd failed to start ===
 
While using [[#User services|user services]] with [[greetd]], the above error message will appear. This failed error message for {{ic|user.greetd}} service is harmless as per {{MR|81612#note_492385}}.


== See also ==
== See also ==

Revision as of 06:32, 3 August 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
Managing a service - start,stop and restart
Start <serviceName> now # rc-service <serviceName> start
Stop <serviceName> now # rc-service <serviceName> stop
Restart <serviceName> now # rc-service <serviceName> restart
Adding and removing service from runlevels
Add <serviceName> to <runlevel> # rc-update add <serviceName> <runlevel>
Remove <serviceName> from <runlevel> # rc-update del <serviceName> <runlevel>
Check services in a runlevel and their status
To check status of <serviceName> $ rc-service <serviceName> status
To view services configured at <runlevel> $ rc-update show <runlevel>
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>
Stacked runlevels
To add <s-runlevel> as a stacked <runlevel> # rc-update add -s <s-runlevel> <runlevel>
User Services - adding -U or --user to most of above commands should work
To view currently active User runlevels and state of User services $ rc-status -U
To change to a different user <runlevel> $ openrc -U <runlevel>
Add User <serviceName> to user <runlevel> $ rc-update -U add <serviceName> <runlevel>
Command Usage - add -h or --help to all commands
To view command usage for all openrc commands $ rc-status -h or $ rc-status --help

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.

Configuration

The main configuration file for OpenRC is /etc/rc.conf. The OpenRC service scripts for each service can be found at /etc/init.d/ and their respective service configuration files at /etc/conf.d/.

If the setting rc_parallel="YES" is configured, the OpenRC system tries to start services in parallel for a slight speed improvement. This setting however comes with a message from openRC developers:

Warning: whilst we have improved parallel, it can still potentially lock the boot process. Don't file bugs about this.


To improve boot times, consider the idea suggested in the preventing slow services from delaying boot section.

Cgroups

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. User services are currently experimental and available from v3.22 for the following:

Prerequisites

  • XDG_RUNTIME_DIR variable must be set even for Xorg
  • Adjust below steps, if $HOME differs from ~/

Config files

The main configuration file for OpenRC User services for a specific user is ~/.config/rc/rc.conf. The folder ~/.config/rc/runlevels/ contains the runlevels for OpenRC user services.

The service scripts for each OpenRC user service provided as part of official packages can be found at /etc/user/init.d/ and their respective service configuration files at /etc/user/conf.d/.

The folders ~/.config/rc/init.d/ and ~/.config/rc/conf.d/ have customized service scripts for User services files and their respective configuration files.

Configure environment variables

For Wayland

  1. Allow propagation of the WAYLAND_DISPLAY environment variables by adding the following lines to file ~/.config/rc/rc.conf as follows:

    Contents of ~/.config/rc/rc.conf

    rc_env_allow="WAYLAND_DISPLAY"
  2. For wayland, a custom gui user runlevel needs to be created. To create this, issue the command:

    $ mkdir -p "~/.config/rc/runlevels/gui"

  3. To start gui user runlevel, add the line openrc -U gui to the startup file of your compositor after $WAYLAND_DISPLAY is set. For eg, for Sway add:

    Contents of ~/.config/sway/config

    ... exec openrc -U gui

For Xorg

ForXorg/Virtual terminals, if Elogind is not used, ensure that XDG_RUNTIME_DIR is set manually in ~/.xinitrc. For eg, for dwm add:

Contents of ~/.xinitrc

... if [ -z "$XDG_RUNTIME_DIR" ]; then XDG_RUNTIME_DIR="/tmp/$(id -u)-runtime-dir" mkdir -pm 0700 "$XDG_RUNTIME_DIR" export XDG_RUNTIME_DIR fi openrc -U default exec dwm
Note: For both the above cases, logout and login for the OpenRC user services to be started, before proceeding further.

User service management

Issue the command $ rc-status -Ur to view and verify the name of the current user runlevel as gui and default for Wayland and Xorg respectively before proceeding.

To start PipeWire user service, issue the command:

$ rc-update -U pipewire start

Verify that the above OpenRC user service is started before proceeding further:

$ rc-status -U

To enable PipeWire user service, issue the command:

$ rc-update -U add pipewire

The above steps can be repeated for other User services like pipewire-pulse, wlsunset etc

Note: Ensure that the startup of above services from /etc/xdg/autostart folder or from the startup/config file are stopped to prevent duplicate instance of services.

PAM support

The default installation of OpenRC user services is without PAM support. To ensure that user services do not linger on logout, enable PAM support for OpenRC user services by installing the openrc-user-pam package.

# apk add openrc-user-pam

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 runlevels.

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.

Command usage

To view the command usage for all OpenRC commands (rc-update, rc-service, rc-status, openrc etc.) either use --help or (-h) flag. For eg:$ rc-update --help or $ rc-update -h will show usage information for rc-update.

The busybox command equivalent for traditional GNU/Linux systems is as follows:

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

Troubleshooting

Whenever a openRC service fails to run, to troubleshoot enable debugging option and run the command.

For example, if running the command rc-service greetd start causes greetd service to immediately crash, then alter the command to enable and view the debug:

# rc-service -d greetd restart

XDG_RUNTIME_DIR unset

                                                                                                                [ failed ]

While configuring user services, running the command $ doas rc-update add -U pipewire gui will generate the above error XDG_RUNTIME_DIR unset. Always issue the command as normal user $ rc-update add -U pipewire gui and do NOT use doas.

ERROR: user.greetd failed to start

While using user services with greetd, the above error message will appear. This failed error message for user.greetd service is harmless as per !81612#note_492385.

See also