This article is a work in progress. Information here is probably incomplete or inaccurate.
====== LXD ======
[[https://linuxcontainers.org|LXD]] is a system container and virtual machine management tools primarily targeted for Linux machines. Similar in concept to [[docker]], unlike docker it is //vastly// easier to manage and much more sane in scope.
list of features include:
* Sane cli utility for container management.
* Containers are rootless //by default// ((as they should be)).
* Easily send/receive files from a container.
* Decently rich set of publicly-available images (the important ones being alpine/ubuntu/void).
* Tool for creating your own images locally without any friction.
* Storage pools with ceph/zfs/btrfs
===== Basic Usage =====
Containers with LXD are managed by the cli utility ''lxc'' ((dont confuse this with lxc, as that is the low-level tooling that lxd itself utilizes for its functionality.))
echo "hi"
====== LXD sane build from source ======
Long story short the [[https://linuxcontainers.org/lxd/docs/latest/installing/#installing-lxd-from-source|official docs]] on the LXD source install are quite terrible. It doesnt actually spit out normal libs and binaries, rather it uses go's ugly ''install'' subcommand that really sucks for anything other than small cli utilities.\\
This guide aims to build & install LXD on any system. This guide also assumes that you have a recent version of go installed, if you dont go install that too.
**NOTE:** you should also have [[https://linuxcontainers.org/lxc/downloads/|lxc (the lib) installed]]
The build has 3 parts:
* raft
* dqlite
* LXD
We will be building each dependency in this order.
===== raft =====
Start by installing the latest release archive from the [[https://github.com/canonical/raft/releases|releases]] page.
wget -O raft-1.17.1.tar.gz "https://github.com/canonical/raft/archive/refs/tags/v1.17.1.tar.gz"
tar -xvf raft-1.17.1.tar.gz
cd raft-1.17.1
Now for configure/build (typical autotools bullshittery)
autoreconf -i
./configure --prefix=/usr
make
Finally the install
sudo make install
===== dqlite =====
Start by installing the latest release archive from the [[https://github.com/canonical/dqlite/releases|releases]] page.
wget -O dqlite-1.14.0.tar.gz "https://github.com/canonical/dqlite/archive/refs/tags/v1.14.0.tar.gz"
tar -xvf dqlite-1.14.0.tar.gz
cd dqlite-1.14.0
Now for configure/build (again the typical autotools bullshittery)
autoreconf -i
./configure --prefix=/usr
make
Finally slap it into your prefix
sudo make install
===== LXD =====
Now that we have all of the required dependencies installed we can get to building LXD. Start by getting the latest release tarball from the [[https://linuxcontainers.org/lxd/downloads/|downloads]] page.
# this is for version 5.13 but should literally be whatever is the latest
wget "https://linuxcontainers.org/downloads/lxd/lxd-5.13.tar.gz"
tar -xvf lxd-5.13.tar.gz
cd lxd-5.13
Next configure both go and cgo inital flags.
export GOFLAGS="-buildmode=pie -trimpath"
export CGO_LDFLAGS_ALLOW="-Wl,-z,now"
CGO_LDFLAGS="-static" go build -v -tags "agent" -o bin/ ./lxd-agent/...
go build -v -tags "netgo" -o bin/ ./lxd-migrate/...
for tool in fuidshift lxc lxc-to-lxd lxd lxd-benchmark lxd-user; do
go build -v -tags "libsqlite3" -o bin/ ./$tool/...
done
And now for the really painful part, installing everything, first lets get all the basic things where they need to be
for tool in fuidshift lxc lxc-to-lxd lxd lxd-agent lxd-benchmark lxd-migrate lxd-user; do
sudo install -v -p -Dm755 "bin/$tool" "/usr/bin/$tool"
done
Now most people are gonna run systemd on their prod machines, so this guide //assumes// that. If you in particular dont, you are //certainly// smart enough to figure out porting this you your preferred init.
create the following files:
* ''/usr/lib/systemd/system/lxd.service''
[Unit]
Description=LXD Container Hypervisor
After=network-online.target lxcfs.service
Requires=network-online.target lxcfs.service lxd.socket
Documentation=man:lxd(1)
[Service]
Environment=LXD_OVMF_PATH=/usr/share/ovmf/x64
ExecStart=/usr/bin/lxd --group=lxd --logfile=/var/log/lxd/lxd.log
ExecStartPost=/usr/bin/lxd waitready --timeout=600
ExecStop=/usr/bin/lxd shutdown
TimeoutStartSec=600s
TimeoutStopSec=30s
Restart=on-failure
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
* ''/usr/lib/systemd/system/lxd.socket''
[Unit]
Description=LXD - unix socket
Documentation=man:lxd(1)
[Socket]
ListenStream=/var/lib/lxd/unix.socket
SocketMode=0660
SocketGroup=lxd
Service=lxd.service
[Install]
WantedBy=sockets.target
* ''/usr/lib/sysusers.d/lxd.conf''
g lxd - -
Log dir
install -v -dm700 "/var/log/lxd"
Some extra bash completions
sudo install -v -p -Dm644 "scripts/bash/lxd-client" /usr/share/bash-completion/completions/lxd
===== Notes for Debian 12 Machines =====
You may need to re-install the following pagkages:
libacl1-dev
libuv1-dev
libcap-dev
ibudev-dev