compute-tools: Host Setup (with systemd-networkd)
=================================================


1. Debian Packages
-------------------

apt install systemd-networkd bridge-utils

Make sure to enable networkd (sudo systemctl enable systemd-networkd)
and convert /etc/network/interfaces (see systemd-networkd documentation).


2. Boot Parameters
------------------

2.1 CGroup Memory Controller (optional)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In order to enable the memory controller the following boot parameter needs to be used:

	cgroup_enable=memory


2.2 CGroup Swap Controller (optional)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In order to enable the swap controller the following boot parameter needs to be used:

	swapaccount=1

2.3 vsyscall (legacy)
~~~~~~~~~~~~~~~~~~~~~

In order to be able to execute binaries linked to older libc versions
(<= wheezy) on newer linux versions (>= buster), add the following boot
parameter (see #881813 for more information):

	vsyscall=emulate


3. Networking
~~~~~~~~~~~~~

3.1 Configure Network Bridge
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3.1.1 Bridge: 1 Interface, standalone, DHCP
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

cat > /etc/systemd/network/bridge0.netdev << EOF
[NetDev]
Name=bridge0
Kind=bridge
EOF

cat > /etc/systemd/network/bridge0.network << EOF
[Match]
Name=bridge-0

[Network]
DHCP=yes
EOF


3.1.2 Bridge: 1 Interface, standalone, static
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

cat > /etc/systemd/network/bridge0.netdev << EOF
[NetDev]
Name=bridge0
Kind=bridge
EOF

cat > /etc/systemd/network/bridge0.network << EOF
[Match]
Name=bridge-0

[Network]
Address=10.0.0.2/24
Gateway=10.0.0.1
EOF


3.1.3 Bridge: 3 physical Interfaces, vlan, bonding, static
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

cat > /etc/systemd/network/eno2.network<< EOF
[Match]
Name=eno2

[Network]
Bond=bond0
EOF

cat > /etc/systemd/network/eno3.network<< EOF
[Match]
Name=eno3

[Network]
Bond=bond0
EOF

cat > /etc/systemd/network/bond0.netdev << EOF
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=802.3ad
TransmitHashPolicy=layer3+4
MIIMonitorSec=0.1
UpDelaySec=0.2
DownDelaySec=0.2
EOF

cat > /etc/systemd/network/bond0.network << EOF
[Match]
Name=bond0

[Network]
VLAN=100
EOF

cat > /etc/systemd/network/vlan-100.netdev << EOF
[NetDev]
Name=vlan-100
Kind=vlan

[VLAN]
Id=100
EOF

cat > /etc/systemd/network/vlan-100.netdev << EOF
[Match]
Name=vlan-100

[Network]
Bridge=bridge-100
EOF

cat > /etc/systemd/network/bridge-100.netdev << EOF
[NetDev]
Name=bridge-100
Kind=bridge
EOF

cat > /etc/systemd/network/bridge-100.network << EOF
[Match]
Name=bridge-100

[Network]
Address=10.100.0.2/24
Gateway=10.100.0.1
EOF


4. Enabling user namespace for unprivileged containers
------------------------------------------------------

Linux supports unprivileged containers with the user namespace.
By default the user namespace is disabled on Debian systems (see #898446).
To enable user namespace, edit the following file for a permant change:

  /etc/sysctl.d/zz-compute-tools.conf
  sysctl -p

or enable it manually with:

  echo 1 > /proc/sys/kernel/unprivileged_userns_clone

Note that containers need to be started with the correct
configuration in /etc/compute-tools/container/config to run unpriviled
(private-users option).


5. Enabling container-shell
---------------------------

Managing privileged containers requires root privileges. In order to allow
unprivileged users to manage privileged containers without granting them
privileges or accounts, the container-shell can be used together with sudo
and a container user.

  sudo adduser --gecos "compute-tools,,," \
	--home /var/lib/open-infrastructure/container-shell \
	--shell /usr/bin/container-shell


6. IPv4 and IPv6 dual-stack
---------------------------

Examples for /etc/network/interfaces above work for IPv6 too when using correct
IPv6 addresses and netmasks.

In order to use dual-stack, bridges must have a IPv4 address assigned
(can be a dummy one from a privacy range or 127.0.0.0/8).

Let me repeat: dual-stack only works when you assign a primary IPv6 address
(private or public, doesn't matter) *and* add an additional IPv4 address.
Yes, the IPv4 address can be a private address, the containers can still
have a public IPv4 address.

A complete example looks like this:

auto bridge0
iface bridge0 inet6 static
	address			2a07:6b47:4::4:1
	netmask			48

	up			ip addr add 127.4.4.1 dev $IFACE
	down			ip addr del 127.4.4.1 dev $IFACE

	bridge_fd		0
	bridge_maxwait		0
	bridge_stp		0
	bridge-mcquerier	1
