2012-01-25 09:20:38 +08:00
|
|
|
systemd System and Service Manager
|
2010-05-13 09:30:21 +08:00
|
|
|
|
|
|
|
DETAILS:
|
|
|
|
http://0pointer.de/blog/projects/systemd.html
|
|
|
|
|
|
|
|
WEB SITE:
|
2017-02-21 22:56:04 +08:00
|
|
|
https://www.freedesktop.org/wiki/Software/systemd
|
2010-05-13 09:30:21 +08:00
|
|
|
|
|
|
|
GIT:
|
2015-06-03 06:57:50 +08:00
|
|
|
git@github.com:systemd/systemd.git
|
|
|
|
https://github.com/systemd/systemd
|
2010-05-13 09:30:21 +08:00
|
|
|
|
|
|
|
MAILING LIST:
|
2017-02-21 22:56:04 +08:00
|
|
|
https://lists.freedesktop.org/mailman/listinfo/systemd-devel
|
2010-05-13 09:30:21 +08:00
|
|
|
|
|
|
|
IRC:
|
|
|
|
#systemd on irc.freenode.org
|
|
|
|
|
|
|
|
BUG REPORTS:
|
2015-06-03 06:57:50 +08:00
|
|
|
https://github.com/systemd/systemd/issues
|
2010-05-13 09:30:21 +08:00
|
|
|
|
|
|
|
AUTHOR:
|
2012-04-12 06:20:58 +08:00
|
|
|
Lennart Poettering
|
|
|
|
Kay Sievers
|
|
|
|
...and many others
|
2010-05-13 09:30:21 +08:00
|
|
|
|
2011-07-15 05:53:53 +08:00
|
|
|
LICENSE:
|
2012-04-12 06:20:58 +08:00
|
|
|
LGPLv2.1+ for all code
|
2015-06-09 20:27:33 +08:00
|
|
|
- except src/basic/MurmurHash2.c which is Public Domain
|
|
|
|
- except src/basic/siphash24.c which is CC0 Public Domain
|
2013-08-15 04:58:21 +08:00
|
|
|
- except src/journal/lookup3.c which is Public Domain
|
|
|
|
- except src/udev/* which is (currently still) GPLv2, GPLv2+
|
2011-07-15 05:53:53 +08:00
|
|
|
|
2010-05-13 09:30:21 +08:00
|
|
|
REQUIREMENTS:
|
2017-03-03 02:11:37 +08:00
|
|
|
Linux kernel >= 3.13
|
2015-09-06 21:58:20 +08:00
|
|
|
Linux kernel >= 4.2 for unified cgroup hierarchy support
|
2014-03-23 01:27:35 +08:00
|
|
|
|
|
|
|
Kernel Config Options:
|
2013-03-07 02:36:39 +08:00
|
|
|
CONFIG_DEVTMPFS
|
2014-05-04 01:15:23 +08:00
|
|
|
CONFIG_CGROUPS (it is OK to disable all controllers)
|
2013-03-07 02:36:39 +08:00
|
|
|
CONFIG_INOTIFY_USER
|
|
|
|
CONFIG_SIGNALFD
|
|
|
|
CONFIG_TIMERFD
|
|
|
|
CONFIG_EPOLL
|
2013-03-07 02:51:52 +08:00
|
|
|
CONFIG_NET
|
2013-03-07 02:36:39 +08:00
|
|
|
CONFIG_SYSFS
|
2013-12-09 23:04:06 +08:00
|
|
|
CONFIG_PROC_FS
|
2014-02-16 00:21:49 +08:00
|
|
|
CONFIG_FHANDLE (libudev, mount and bind mount handling)
|
2013-03-07 02:36:39 +08:00
|
|
|
|
2017-02-26 11:42:27 +08:00
|
|
|
Kernel crypto/hash API
|
|
|
|
CONFIG_CRYPTO_USER_API_HASH
|
|
|
|
CONFIG_CRYPTO_HMAC
|
|
|
|
CONFIG_CRYPTO_SHA256
|
|
|
|
|
2014-08-30 17:34:20 +08:00
|
|
|
udev will fail to work with the legacy sysfs layout:
|
2013-03-07 03:01:45 +08:00
|
|
|
CONFIG_SYSFS_DEPRECATED=n
|
2013-03-07 02:36:39 +08:00
|
|
|
|
|
|
|
Legacy hotplug slows down the system and confuses udev:
|
|
|
|
CONFIG_UEVENT_HELPER_PATH=""
|
|
|
|
|
2014-08-30 17:34:20 +08:00
|
|
|
Userspace firmware loading is not supported and should
|
|
|
|
be disabled in the kernel:
|
2013-03-07 02:36:39 +08:00
|
|
|
CONFIG_FW_LOADER_USER_HELPER=n
|
|
|
|
|
|
|
|
Some udev rules and virtualization detection relies on it:
|
|
|
|
CONFIG_DMIID
|
|
|
|
|
2013-09-15 13:29:25 +08:00
|
|
|
Support for some SCSI devices serial number retrieval, to
|
|
|
|
create additional symlinks in /dev/disk/ and /dev/tape:
|
|
|
|
CONFIG_BLK_DEV_BSG
|
|
|
|
|
2018-01-16 00:55:11 +08:00
|
|
|
Required for PrivateNetwork= in service units:
|
2014-04-01 02:28:23 +08:00
|
|
|
CONFIG_NET_NS
|
2014-12-30 22:57:01 +08:00
|
|
|
Note that systemd-localed.service and other systemd units use
|
2018-01-16 00:55:11 +08:00
|
|
|
PrivateNetwork so this is effectively required.
|
2014-04-01 02:28:23 +08:00
|
|
|
|
2017-02-07 04:13:21 +08:00
|
|
|
Required for PrivateUsers= in service units:
|
2017-01-24 10:18:07 +08:00
|
|
|
CONFIG_USER_NS
|
|
|
|
|
2013-03-07 02:36:39 +08:00
|
|
|
Optional but strongly recommended:
|
|
|
|
CONFIG_IPV6
|
|
|
|
CONFIG_AUTOFS4_FS
|
|
|
|
CONFIG_TMPFS_XATTR
|
2018-01-04 15:53:44 +08:00
|
|
|
CONFIG_{TMPFS,EXT4_FS,XFS,BTRFS_FS,...}_POSIX_ACL
|
2013-03-07 03:01:45 +08:00
|
|
|
CONFIG_SECCOMP
|
2016-09-06 06:16:13 +08:00
|
|
|
CONFIG_SECCOMP_FILTER (required for seccomp support)
|
2015-05-18 22:35:24 +08:00
|
|
|
CONFIG_CHECKPOINT_RESTORE (for the kcmp() syscall)
|
2013-03-07 02:36:39 +08:00
|
|
|
|
2015-07-12 01:18:35 +08:00
|
|
|
Required for CPUShares= in resource control unit settings
|
2014-06-11 05:29:30 +08:00
|
|
|
CONFIG_CGROUP_SCHED
|
|
|
|
CONFIG_FAIR_GROUP_SCHED
|
|
|
|
|
2015-07-12 01:18:35 +08:00
|
|
|
Required for CPUQuota= in resource control unit settings
|
2014-11-18 23:13:43 +08:00
|
|
|
CONFIG_CFS_BANDWIDTH
|
|
|
|
|
2017-11-22 06:54:20 +08:00
|
|
|
Required for IPAddressDeny= and IPAddressAllow= in resource control
|
|
|
|
unit settings
|
|
|
|
CONFIG_CGROUP_BPF
|
|
|
|
|
2013-03-07 03:01:45 +08:00
|
|
|
For UEFI systems:
|
2014-03-22 08:41:12 +08:00
|
|
|
CONFIG_EFIVAR_FS
|
2013-03-07 03:01:45 +08:00
|
|
|
CONFIG_EFI_PARTITION
|
|
|
|
|
2015-07-12 01:18:35 +08:00
|
|
|
We recommend to turn off Real-Time group scheduling in the
|
|
|
|
kernel when using systemd. RT group scheduling effectively
|
|
|
|
makes RT scheduling unavailable for most userspace, since it
|
|
|
|
requires explicit assignment of RT budgets to each unit whose
|
|
|
|
processes making use of RT. As there's no sensible way to
|
|
|
|
assign these budgets automatically this cannot really be
|
|
|
|
fixed, and it's best to disable group scheduling hence.
|
|
|
|
CONFIG_RT_GROUP_SCHED=n
|
|
|
|
|
2017-07-24 17:28:04 +08:00
|
|
|
It's a good idea to disable the implicit creation of networking bonding
|
|
|
|
devices by the kernel networking bonding module, so that the
|
|
|
|
automatically created "bond0" interface doesn't conflict with any such
|
2017-08-02 20:41:18 +08:00
|
|
|
device created by systemd-networkd (or other tools). Ideally there
|
|
|
|
would be a kernel compile-time option for this, but there currently
|
|
|
|
isn't. The next best thing is to make this change through a modprobe.d
|
|
|
|
drop-in. This is shipped by default, see modprobe.d/systemd.conf.
|
2017-07-24 17:28:04 +08:00
|
|
|
|
2018-01-16 00:55:11 +08:00
|
|
|
Required for systemd-nspawn:
|
|
|
|
CONFIG_DEVPTS_MULTIPLE_INSTANCES or Linux kernel >= 4.7
|
|
|
|
|
2013-05-10 06:14:12 +08:00
|
|
|
Note that kernel auditing is broken when used with systemd's
|
|
|
|
container code. When using systemd in conjunction with
|
2013-10-22 07:50:48 +08:00
|
|
|
containers, please make sure to either turn off auditing at
|
2013-05-10 06:14:12 +08:00
|
|
|
runtime using the kernel command line option "audit=0", or
|
|
|
|
turn it off at kernel compile time using:
|
|
|
|
CONFIG_AUDIT=n
|
2014-03-11 12:40:36 +08:00
|
|
|
If systemd is compiled with libseccomp support on
|
|
|
|
architectures which do not use socketcall() and where seccomp
|
|
|
|
is supported (this effectively means x86-64 and ARM, but
|
2014-05-04 01:15:24 +08:00
|
|
|
excludes 32-bit x86!), then nspawn will now install a
|
2014-03-11 12:40:36 +08:00
|
|
|
work-around seccomp filter that makes containers boot even
|
|
|
|
with audit being enabled. This works correctly only on kernels
|
|
|
|
3.14 and newer though. TL;DR: turn audit off, still.
|
2013-05-10 06:14:12 +08:00
|
|
|
|
2015-04-11 01:39:17 +08:00
|
|
|
glibc >= 2.16
|
2011-02-17 02:09:11 +08:00
|
|
|
libcap
|
2017-09-15 20:47:57 +08:00
|
|
|
libmount >= 2.30 (from util-linux)
|
|
|
|
(util-linux *must* be built without --enable-libmount-support-mtab)
|
2016-10-05 19:58:55 +08:00
|
|
|
libseccomp >= 2.3.1 (optional)
|
2014-12-13 08:56:56 +08:00
|
|
|
libblkid >= 2.24 (from util-linux) (optional)
|
2013-10-18 01:49:19 +08:00
|
|
|
libkmod >= 15 (optional)
|
2011-02-17 02:09:11 +08:00
|
|
|
PAM >= 1.1.2 (optional)
|
|
|
|
libcryptsetup (optional)
|
|
|
|
libaudit (optional)
|
2011-07-12 19:57:48 +08:00
|
|
|
libacl (optional)
|
2011-02-17 02:09:11 +08:00
|
|
|
libselinux (optional)
|
2011-07-12 19:57:48 +08:00
|
|
|
liblzma (optional)
|
2018-10-30 01:32:51 +08:00
|
|
|
liblz4 >= 1.3.0 / 130 (optional)
|
2012-09-28 06:46:32 +08:00
|
|
|
libgcrypt (optional)
|
|
|
|
libqrencode (optional)
|
|
|
|
libmicrohttpd (optional)
|
2012-11-22 22:30:50 +08:00
|
|
|
libpython (optional)
|
2017-05-10 09:56:34 +08:00
|
|
|
libidn2 or libidn (optional)
|
2018-07-27 05:47:50 +08:00
|
|
|
gnutls >= 3.1.4 (optional, >= 3.5.3 is required to support DNS-over-TLS with gnutls)
|
|
|
|
openssl >= 1.1.0 (optional, required to support DNS-over-TLS with openssl)
|
2014-06-23 18:42:17 +08:00
|
|
|
elfutils >= 158 (optional)
|
2017-11-14 04:54:45 +08:00
|
|
|
polkit (optional)
|
2017-07-03 08:21:34 +08:00
|
|
|
pkg-config
|
2017-08-06 06:30:37 +08:00
|
|
|
gperf
|
2017-07-03 08:21:34 +08:00
|
|
|
docbook-xsl (optional, required for documentation)
|
|
|
|
xsltproc (optional, required for documentation)
|
|
|
|
python-lxml (optional, required to build the indices)
|
2018-05-15 19:18:24 +08:00
|
|
|
python >= 3.5, meson >= 0.46, ninja
|
2017-07-03 08:21:34 +08:00
|
|
|
gcc, awk, sed, grep, m4, and similar tools
|
2012-11-22 22:30:50 +08:00
|
|
|
|
2013-10-22 07:50:48 +08:00
|
|
|
During runtime, you need the following additional
|
|
|
|
dependencies:
|
2012-11-22 22:30:50 +08:00
|
|
|
|
2015-11-03 00:05:20 +08:00
|
|
|
util-linux >= v2.27.1 required
|
2018-07-20 16:07:26 +08:00
|
|
|
dbus >= 1.9.14 (strictly speaking optional, but recommended)
|
2016-12-20 17:53:53 +08:00
|
|
|
NOTE: If using dbus < 1.9.18, you should override the default
|
|
|
|
policy directory (--with-dbuspolicydir=/etc/dbus-1/system.d).
|
2012-11-22 22:30:50 +08:00
|
|
|
dracut (optional)
|
2018-07-16 18:44:24 +08:00
|
|
|
polkit (optional)
|
2011-02-17 02:09:11 +08:00
|
|
|
|
2017-04-19 09:52:30 +08:00
|
|
|
To build in directory build/:
|
|
|
|
meson build/ && ninja -C build
|
|
|
|
|
|
|
|
Any configuration options can be specfied as -Darg=value... arguments
|
|
|
|
to meson. After the build directory is initially configured, meson will
|
|
|
|
refuse to run again, and options must be changed with:
|
|
|
|
mesonconf -Darg=value...
|
|
|
|
mesonconf without any arguments will print out available options and
|
|
|
|
their current values.
|
|
|
|
|
|
|
|
Useful commands:
|
|
|
|
ninja -v some/target
|
|
|
|
ninja test
|
|
|
|
sudo ninja install
|
|
|
|
DESTDIR=... ninja install
|
|
|
|
|
2017-07-03 08:21:34 +08:00
|
|
|
A tarball can be created with:
|
2015-06-23 19:40:53 +08:00
|
|
|
git archive --format=tar --prefix=systemd-222/ v222 | xz > systemd-222.tar.xz
|
|
|
|
|
2013-10-22 07:50:48 +08:00
|
|
|
When systemd-hostnamed is used, it is strongly recommended to
|
|
|
|
install nss-myhostname to ensure that, in a world of
|
|
|
|
dynamically changing hostnames, the hostname stays resolvable
|
2011-05-18 01:35:56 +08:00
|
|
|
under all circumstances. In fact, systemd-hostnamed will warn
|
2013-01-24 17:31:34 +08:00
|
|
|
if nss-myhostname is not installed.
|
2011-05-18 01:35:56 +08:00
|
|
|
|
2017-11-17 18:39:14 +08:00
|
|
|
nss-systemd must be enabled on systemd systems, as that's required for
|
|
|
|
DynamicUser= to work. Note that we ship services out-of-the-box that
|
|
|
|
make use of DynamicUser= now, hence enabling nss-systemd is not
|
|
|
|
optional.
|
|
|
|
|
2018-07-16 18:18:36 +08:00
|
|
|
Note that the build prefix for systemd must be /usr. (Moreover,
|
|
|
|
packages systemd relies on — such as D-Bus — really should use the same
|
|
|
|
prefix, otherwise you are on your own.) -Dsplit-usr=false (which is the
|
|
|
|
default and does not need to be specified) is the recommended setting,
|
|
|
|
and -Dsplit-usr=true should be used on systems which have /usr on a
|
|
|
|
separate partition.
|
2017-11-17 18:39:14 +08:00
|
|
|
|
2016-10-16 08:51:19 +08:00
|
|
|
Additional packages are necessary to run some tests:
|
|
|
|
- busybox (used by test/TEST-13-NSPAWN-SMOKE)
|
|
|
|
- nc (used by test/TEST-12-ISSUE-3171)
|
|
|
|
- python3-pyparsing
|
|
|
|
- python3-evdev (used by hwdb parsing tests)
|
|
|
|
- strace (used by test/test-functions)
|
2017-02-12 13:22:20 +08:00
|
|
|
- capsh (optional, used by test-execute)
|
2016-10-16 08:51:19 +08:00
|
|
|
|
2013-03-06 01:53:21 +08:00
|
|
|
USERS AND GROUPS:
|
2013-03-06 02:15:31 +08:00
|
|
|
Default udev rules use the following standard system group
|
|
|
|
names, which need to be resolvable by getgrnam() at any time,
|
|
|
|
even in the very early boot stages, where no other databases
|
|
|
|
and network are available:
|
|
|
|
|
2017-11-20 19:30:42 +08:00
|
|
|
audio, cdrom, dialout, disk, input, kmem, kvm, lp, render, tape, tty, video
|
2013-03-06 02:04:48 +08:00
|
|
|
|
2013-10-22 07:50:48 +08:00
|
|
|
During runtime, the journal daemon requires the
|
2013-03-06 02:19:26 +08:00
|
|
|
"systemd-journal" system group to exist. New journal files will
|
2013-10-22 07:50:48 +08:00
|
|
|
be readable by this group (but not writable), which may be used
|
2015-01-19 04:05:40 +08:00
|
|
|
to grant specific users read access. In addition, system
|
|
|
|
groups "wheel" and "adm" will be given read-only access to
|
|
|
|
journal files using systemd-tmpfiles.service.
|
2013-03-06 01:53:21 +08:00
|
|
|
|
2018-05-01 14:15:44 +08:00
|
|
|
The journal remote daemon requires the
|
|
|
|
"systemd-journal-remote" system user and group to
|
2013-03-06 02:15:31 +08:00
|
|
|
exist. During execution this network facing service will drop
|
|
|
|
privileges and assume this uid/gid for security reasons.
|
|
|
|
|
2014-06-28 06:48:28 +08:00
|
|
|
Similarly, the network management daemon requires the
|
2014-06-04 17:17:32 +08:00
|
|
|
"systemd-network" system user and group to exist.
|
|
|
|
|
2014-06-28 06:48:28 +08:00
|
|
|
Similarly, the name resolution daemon requires the
|
2014-06-04 17:17:32 +08:00
|
|
|
"systemd-resolve" system user and group to exist.
|
|
|
|
|
2016-02-09 06:35:24 +08:00
|
|
|
Similarly, the coredump support requires the
|
|
|
|
"systemd-coredump" system user and group to exist.
|
|
|
|
|
2014-08-20 03:55:10 +08:00
|
|
|
NSS:
|
2016-07-15 01:19:49 +08:00
|
|
|
systemd ships with four glibc NSS modules:
|
2014-08-20 03:55:10 +08:00
|
|
|
|
|
|
|
nss-myhostname resolves the local hostname to locally
|
|
|
|
configured IP addresses, as well as "localhost" to
|
|
|
|
127.0.0.1/::1.
|
|
|
|
|
|
|
|
nss-resolve enables DNS resolution via the systemd-resolved
|
|
|
|
DNS/LLMNR caching stub resolver "systemd-resolved".
|
|
|
|
|
2016-07-15 01:19:49 +08:00
|
|
|
nss-mymachines enables resolution of all local containers registered
|
|
|
|
with machined to their respective IP addresses. It also maps UID/GIDs
|
|
|
|
ranges used by containers to useful names.
|
2014-08-20 03:55:10 +08:00
|
|
|
|
2016-07-15 01:19:49 +08:00
|
|
|
nss-systemd enables resolution of all dynamically allocated service
|
|
|
|
users. (See the DynamicUser= setting in unit files.)
|
2014-08-20 03:55:10 +08:00
|
|
|
|
2016-07-15 01:19:49 +08:00
|
|
|
To make use of these NSS modules, please add them to the "hosts:",
|
|
|
|
"passwd:" and "group:" lines in /etc/nsswitch.conf. The "resolve"
|
|
|
|
module should replace the glibc "dns" module in this file (and don't
|
|
|
|
worry, it chain-loads the "dns" module if it can't talk to resolved).
|
2014-08-20 03:55:10 +08:00
|
|
|
|
2016-07-15 01:19:49 +08:00
|
|
|
The four modules should be used in the following order:
|
|
|
|
|
|
|
|
passwd: compat mymachines systemd
|
|
|
|
group: compat mymachines systemd
|
2018-05-01 14:18:10 +08:00
|
|
|
hosts: files mymachines resolve [!UNAVAIL=return] dns myhostname
|
2014-08-20 03:55:10 +08:00
|
|
|
|
2015-05-27 23:04:49 +08:00
|
|
|
SYSV INIT.D SCRIPTS:
|
|
|
|
When calling "systemctl enable/disable/is-enabled" on a unit which is a
|
|
|
|
SysV init.d script, it calls /usr/lib/systemd/systemd-sysv-install;
|
|
|
|
this needs to translate the action into the distribution specific
|
|
|
|
mechanism such as chkconfig or update-rc.d. Packagers need to provide
|
|
|
|
this script if you need this functionality (you don't if you disabled
|
|
|
|
SysV init support).
|
|
|
|
|
|
|
|
Please see src/systemctl/systemd-sysv-install.SKELETON for how this
|
|
|
|
needs to look like, and provide an implementation at the marked places.
|
|
|
|
|
2011-02-23 08:12:07 +08:00
|
|
|
WARNINGS:
|
2017-11-17 18:39:48 +08:00
|
|
|
systemd will warn during early boot if /usr is not already mounted at
|
|
|
|
this point (that means: either located on the same file system as / or
|
|
|
|
already mounted in the initrd). While in systemd itself very little
|
|
|
|
will break if /usr is on a separate, late-mounted partition, many of
|
|
|
|
its dependencies very likely will break sooner or later in one form or
|
|
|
|
another. For example, udev rules tend to refer to binaries in /usr,
|
|
|
|
binaries that link to libraries in /usr or binaries that refer to data
|
|
|
|
files in /usr. Since these breakages are not always directly visible,
|
|
|
|
systemd will warn about this, since this kind of file system setup is
|
|
|
|
not really supported anymore by the basic set of Linux OS components.
|
2011-03-02 06:44:26 +08:00
|
|
|
|
2014-02-26 09:54:37 +08:00
|
|
|
systemd requires that the /run mount point exists. systemd also
|
2015-05-30 16:31:41 +08:00
|
|
|
requires that /var/run is a symlink to /run.
|
2014-02-26 09:54:37 +08:00
|
|
|
|
2011-03-04 12:07:01 +08:00
|
|
|
For more information on this issue consult
|
2017-02-22 01:26:23 +08:00
|
|
|
https://www.freedesktop.org/wiki/Software/systemd/separate-usr-is-broken
|
2011-03-04 12:07:01 +08:00
|
|
|
|
2018-05-14 04:28:24 +08:00
|
|
|
To run systemd under valgrind, compile with meson option
|
|
|
|
-Dvalgrind=true and have valgrind development headers installed
|
|
|
|
(i.e. valgrind-devel or equivalent). Otherwise, false positives will be
|
|
|
|
triggered by code which violates some rules but is actually safe. Note
|
|
|
|
that valgrind generates nice output only on exit(), hence on shutdown
|
|
|
|
we don't execve() systemd-shutdown.
|
2014-11-06 22:27:13 +08:00
|
|
|
|
2018-03-26 16:40:45 +08:00
|
|
|
STABLE BRANCHES AND BACKPORTS
|
|
|
|
|
|
|
|
Stable branches with backported patches are available in the
|
|
|
|
systemd-stable repo at https://github.com/systemd/systemd-stable.
|
|
|
|
|
|
|
|
Stable branches are started for certain releases of systemd and named
|
|
|
|
after them, e.g. v238-stable. Stable branches are managed by
|
|
|
|
distribution maintainers on an as needed basis. See
|
|
|
|
https://www.freedesktop.org/wiki/Software/systemd/Backports/ for some
|
|
|
|
more information and examples.
|
|
|
|
|
2015-12-10 18:57:08 +08:00
|
|
|
ENGINEERING AND CONSULTING SERVICES:
|
|
|
|
Kinvolk (https://kinvolk.io) offers professional engineering
|
|
|
|
and consulting services for systemd. Please contact Chris Kühl
|
|
|
|
<chris@kinvolk.io> for more information.
|