====== LXC container in AstLinux ======
Starting with AstLinux 1.3.10 it is possible to run [[https://linuxcontainers.org/lxc/introduction/#LXC|LXC containers]] within AstLinux.
The containers are using the same kernel and hardware as AstLinux.
===== Quick Start Guide =====
__Enable LXC Support:__
\\
* Define ''LXC_BRIDGE0'' in ''user.conf'' using a physical or VLAN interface (e.g. ''LXC_BRIDGE0="eth3"'')
* Assign the newly created ''lxcbr0'' to an internal interface in the **Network tab**
* Reboot
Then from the CLI:
lxc-create -t download -n debian10 -- -d debian -r buster -a amd64 --no-validate
service lxc init
lxc-attach debian10
passwd
apt update
apt install openssh-server iputils-ping curl
...
exit
\\
__Disable LXC Support:__
\\
First from the CLI:
service lxc stop
lxc-destroy debian10
If you don't want to re-enable LXC in the near future:
* Remove ''LXC_BRIDGE0'' in ''user.conf''
* Reassign where ''lxcbr0'' was an internal interface in the **Network tab** to another interface
* Reboot
\\
===== Networking =====
There are different [[https://linuxcontainers.org/lxc/manpages//man5/lxc.container.conf.5.html#lbAO|networking modes]] for LXC. We are using ''veth'', that needs a bridge on the host (configured in ''user.conf'') e.g.
LXC_BRIDGE0="eth3"
!!Tip ->!! If you have multiple LAN interfaces defined in the Network tab, assign ''lxcbr0'' to **[[userdoc:tt_firewall_overview|The DMZ Interface]]**. In this configuration the firewall will allow any **LAN Interface** to access the container, but the container's network can only initiate access via the **External Interface** unless additional firewall rules are added (e.g. DNS will not work!).
!!Tip ->!! If you run out of physical interfaces to assign to the bridge, create a VLAN, for example:
In the **Network tab**:
VLANS: eth3.10
The DMZ Interface: lxcbr0
In your ''user.conf'' config:
LXC_BRIDGE0="eth3.10"
\\
===== Linux Container Config =====
Per the above "Quick Start Guide" example with the ''debian10'' container, the default, auto-generated config looks like this:
# Template used to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template: -d debian -r buster -a amd64 --no-validate
# Template script checksum (SHA-1): a37305b11025a13952335f1e0a9f26e5201a26d1
# For additional config options, please look at lxc.container.conf(5)
# Container Auto Start: 0 (no) or 1 (yes), defaults to 0
lxc.start.auto=1
# Distribution configuration
lxc.include = /usr/share/lxc/config/common.conf
lxc.arch = linux64
# Container specific configuration
lxc.tty.max = 0
#lxc.cgroup.memory.limit_in_bytes = 1024M
#lxc.cgroup.cpuset.cpus = 1,3
lxc.rootfs.path = dir:/var/lib/lxc/debian10/rootfs
lxc.uts.name = debian10
# Network configuration
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.name = eth0
#lxc.net.0.ipv4.address = 192.168.101.10/24
#lxc.net.0.ipv4.gateway = auto
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:43:a5:1e
!!Note ->!! The ''lxc.net.0.hwaddr'' is auto-generated with a random value.
The standard location for this config file is ''/var/lib/lxc/debian10/config'' which AstLinux symlinks to ''/mnt/kd/lxc/container/debian10/config''
You may tweak this config file to your liking.
To determine if the container auto-starts:
# Container Auto Start: 0 (no) or 1 (yes), defaults to 0
lxc.start.auto=1
By default DHCP is enabled in the recommended base installs, but if you want to enable a static IP address, uncomment these lines:
lxc.net.0.ipv4.address = 192.168.101.10/24
lxc.net.0.ipv4.gateway = auto
and adjust the ''192.168.101.10/24'' network to be valid on your ''lxcbr0'' network.
If you would like your ''veth'' interface names to be descriptive, add to the "Network configuration"
lxc.net.0.veth.pair = veth_debian10
!!Tip ->!! Keep the name short, as the length is limited, also begin the name with ''veth''.
\\
After making a change in the config with ''lxc.start.auto=1'', the container can be restarted with:
service lxc restart
Alternatively, if ''lxc.start.auto=0'', you can manually start the container with:
lxc-start debian10
If you are using the Web Interface, both the **Network tab** and **Edit tab** support "Restart Linux Containers".
\\
===== Destroy All Containers =====
If you want to disable all LXC container support, or start fresh, from the CLI:
!!Warning ->!! This action is not undoable, All LXC containers and download caches will be deleted!
service lxc stop
rm -rf /mnt/kd/lxc
service lxc init
\\
===== Recommended Base Installs =====
lxc-create -t download -n debian12 -- -d debian -r bookworm -a amd64 --no-validate
lxc-create -t download -n debian11 -- -d debian -r bullseye -a amd64 --no-validate
lxc-create -t download -n debian10 -- -d debian -r buster -a amd64 --no-validate
Typical base installs use less than 1 GB of disk space.
\\
===== Optional =====
Here are few useful optional configuration options that amongst others limit the resources of the [[https://linuxcontainers.org/lxc/manpages//man5/lxc.container.conf.5.html|container]]:
lxc.environment = TERM=linux
lxc.cgroup.memory.limit_in_bytes = 512M
#lxc.cgroup.cpu.shares = 256
# Define which actual cores (e.g. 0 to 3) are allowed to use - comma separated (it's NOT the count of cores!)
lxc.cgroup.cpuset.cpus = 1,3
\\