xinit
Related articles
The ~/.xinitrc
file is a shell script read by xinit and by its front-end startx. It is mainly used to execute desktop environments, window managers and other programs when starting the X server (e.g., starting daemons and setting environment variables). The xinit program starts the X Window System server and works as first client program on systems that are not using a display manager.
One of the main functions of ~/.xinitrc
is to dictate which client for the X Window System is invoked with startx or xinit programs on a per-user basis. There exists numerous additional specifications and commands that may also be added to ~/.xinitrc
as you further customize your system.
Most display managers also source the similar xprofile before xinit.
Contents
Installation
Install the xorg-xinit package, which provides both xinit, startx, and a default xinitrc configuration file.
Configuration
xserverrc
The xserverrc
file is a shell script responsible for starting up the X server. Both startx and xinit execute ~/.xserverrc
if it exists, startx will use /etc/X11/xinit/xserverrc
otherwise.
In order to maintain an authenticated session with logind
and to prevent bypassing the screen locker by switching terminals, Xorg has to be started on the same virtual terminal where the login occurred.[1] Therefore it is recommended to specify vt$XDG_VTNR
in the ~/.xserverrc
file:
~/.xserverrc
#!/bin/sh exec /usr/bin/Xorg -nolisten tcp "$@" vt$XDG_VTNR
Alternatively, if you wish to have the X display on a separate console from the one where the server is invoked, you can do so by using the X server wrapper provided by /usr/lib/systemd/systemd-multi-seat-x
. For convenience, xinit and startx can be set up to use this wrapper by modifying your ~/.xserverrc
.
xinitrc
If .xinitrc
is present in a user's home directory, startx and xinit execute it. Otherwise startx will run the default /etc/X11/xinit/xinitrc
.
This default xinitrc will start a basic environment with Twm, xorg-xclock and Xterm (assuming that the necessary packages are installed). Therefore, to start a different window manager or desktop environment, first create a copy of the default xinitrc
in home directory:
$ cp /etc/X11/xinit/xinitrc ~/.xinitrc
The reason of doing this (instead of creating one from scratch) is to preserve some desired default behaviour in the original file, such as sourcing shell scripts from /etc/X11/xinit/xinitrc.d
. Scripts in this directory without .sh
extension are not sourced.
Append desired commands and remove/comment the conflicting lines. Remember, lines following exec
would be ignored. For example, to start openbox:
~/.xinitrc
... if [ -d /etc/X11/xinit/xinitrc.d ] ; then for f in /etc/X11/xinit/xinitrc.d/?*.sh ; do [ -x "$f" ] && . "$f" done unset f fi # twm & # xclock -geometry 50x50-1+1 & # xterm -geometry 80x50+494+51 & # xterm -geometry 80x20+494-0 & # exec xterm -geometry 80x66+0+0 -name login ## some applications that should be run in the background xscreensaver & xsetroot -cursor_name left_ptr & exec openbox-session
Long-running programs started before the window manager, such as a screensaver and wallpaper application, must either fork themselves or be run in the background by appending an &
sign. Otherwise, the script would halt and wait for each program to exit before executing the window manager or desktop environment. Note that some programs should instead not be forked, to avoid race bugs, as is the case of xrdb. Prepending exec
will replace the script process with the window manager process, so that X does not exit even if this process forks to the background.
Usage
To now run Xorg as a regular user, issue:
$ startx
or
$ xinit -- :1
Your window manager (or desktop environment) of choice should now start correctly.
To quit X, run your window manager's exit function (assuming it has one). If it lacks such functionality, run:
$ pkill -15 Xorg
Autostart X at login
Make sure that startx is properly configured.
For Bash, add the following to the bottom of ~/.bash_profile
. If the file does not exist, copy a skeleton version from /etc/skel/.bash_profile
. For Zsh, add it to ~/.zprofile
.
if [ -z "$DISPLAY" ] && [ -n "$XDG_VTNR" ] && [ "$XDG_VTNR" -eq 1 ]; then exec startx fi
See also Fish#Start X at login and Systemd/User#Automatic login into Xorg without display manager.
Automatic login to the virtual console
This method can be combined with automatic login to virtual console.
Tips and tricks
Override xinitrc from command line
If you have a working ~/.xinitrc
, but just want to try other window manager or desktop environment, you can run it by issuing startx followed by the path to the window manager:
$ startx /full/path/to/window-manager
If the window manager takes arguments, they need to be enquoted to be recognized as part of the first parameter of startx:
$ startx "/full/path/to/window-manager --key value"
Note that the full path is required. Optionally, you can also specify custom options for #xserverrc script by appending them after --
, e.g.:
$ startx /usr/bin/enlightenment -- -br +bs -dpi 96
See also man startx
.
Switching between desktop environments/window managers
If you are frequently switching between different desktop environments or window managers, it is convenient to either use a display manager or expand .xinitrc
to make the switching possible.
The following example ~/.xinitrc
shows how to start a particular desktop environment or window manager with an argument:
~/.xinitrc
... # Here Xfce is kept as default session=${1:-xfce} case $session in awesome ) exec awesome;; bspwm ) exec bspwm;; catwm ) exec catwm;; cinnamon ) exec cinnamon-session;; dwm ) exec dwm;; enlightenment ) exec enlightenment_start;; ede ) exec startede;; fluxbox ) exec startfluxbox;; gnome ) exec gnome-session;; gnome-classic ) exec gnome-session --session=gnome-classic;; i3|i3wm ) exec i3;; icewm ) exec icewm-session;; jwm ) exec jwm;; kde ) exec startkde;; mate ) exec mate-session;; monster|monsterwm ) exec monsterwm;; notion ) exec notion;; openbox ) exec openbox-session;; unity ) exec unity;; xfce|xfce4 ) exec startxfce4;; xmonad ) exec xmonad;; # No known session, try to run it as command *) exec $1;; esac
To pass the argument:
$ xinit $ xinit gnome $ xinit kde $ xinit wmaker
or
$ startx $ startx ~/.xinitrc gnome $ startx ~/.xinitrc kde $ startx ~/.xinitrc wmaker
Starting applications without a window manager
It is possible to start only specific applications without a window manager, although most likely this is only useful with a single application shown in full-screen mode. For example:
~/.xinitrc
... exec chromium
With this method you need to set each application window's geometry through its own configuration files, if possible at all.
See also Display manager#Starting applications without a window manager.