--- /dev/null
+Integration with systemd
+========================
+
+systemd is a system and service manager for Linux, compatible with SysV
+and LSB init scripts. systemd heavily uses control groups to manage and control
+services.
+
+Most of the libcgroup tools and APIs can be safely used on systems with systemd
+without any problems. This document attempts to describe the configuration of
+systemd and libcgroup so they can safely co-exist and mutually benefit each
+other.
+
+References
+==========
+[1] http://www.freedesktop.org/wiki/Software/systemd
+Systemd home page.
+
+[2] http://www.freedesktop.org/wiki/Software/systemd/PaxControlGroups
+This is the most useful document describing systemd expectations on applications
+(incl. libcgroup tools).
+
+
+Compilation
+===========
+As stated in [2], libcgroup should not interact with the 'name=systemd'
+hierarchy. Compile libcgroup with the --enable-opaque-hierarchy configure option
+to do so:
+
+./configure --enable-opaque-hierarchy=name=systemd
+
+Consequently, the 'name=systemd' hierarchy will not be visible to libcgroup and
+all of its tools. For example, the lscgroup command will not list systemd
+cgroups and the cgclear command will not remove them.
+
+Start-up and services
+====================
+
+Systemd automatically mounts all available controllers on system boot ('cpu' and
+'cpuacct' together in one hierarchy by default) and can automatically put
+service processes into control groups with configured parameters — by default,
+each service is automatically put into the 'cpu,cpuacct:/system/$service_name'
+control group. The System Administrator has full control of parameters in each
+control group and of which controllers are used. Consult systemd
+documentation, mainly systemd.conf(5) and systemd.exec(5) man pages, for
+details.
+
+In the vast majority of use cases, this behavior is sufficient and libcgroup
+does not need to be used.
+
+For specific use cases, e.g. when a different tree of control groups is needed,
+libcgroup provides cgconfig service. This service can create arbitrary control
+group hierarchies. In this case, follow these steps:
+
+1. Set 'DefaultControllers=' in /etc/systemd/system.conf so that systemd does
+not create control groups for services automatically.
+
+2. Prepare /etc/cgconfig.conf and enable the cgconfig service. The service will
+parse the /etc/cgconfig.conf file during machine boot and create all control
+groups which are defined in it. The service automatically sets '+t' ("sticky")
+bit on the tasks files as recommended in [2].
+
+3. For each service that should start in a specific control group, add the
+following lines into its unit file:
+ After=cgconfig.service
+ ControlGroup=<name of the control group(s)>
+
+This ensures the service is started only after cgconfig creates the necessary
+hierarchy for it. It also tells systemd which control group it should use to
+start the service.