====== LXD =======
{{tag>[lxd]}}
===== install =====
apt remove lxd lxd-client
snap install lxd
# create zfs dataset on pool rpool
zfs create rpool/lxd
# create lxd storage called zfspool using previous defined dataset
lxc storage create zfspool zfs source=rpool/lxd
# define default storage pool
lxc profile device add default root disk path=/ pool=zfspool
# initialize network
sudo lxd init
Because group membership is only applied at login, you then either need to close
and re-open your user session or use the "newgrp lxd" command in the shell you're going to interact with lxd from
newgrp lxd
#!/bin/bash
NAME=$1
ALIAS=$2
ALIAS=${ALIAS:=xenial}
lxc image show $ALIAS >/dev/null 2>&1
if [ ! $? = 0 ]; then
echo lxc image copy images:ubuntu/xenial/amd64 local: --alias xenial
exit 0
fi
if [ ! -f /etc/apt/apt.conf.d/proxy.conf ]; then
sudo apt install apt-cacher-ng
PROXY=$( lxc network show lxdbr0 | sed -n 's/\s\+ipv4.address: \([0-9\.]\+\).*/\1/p' )
echo "Acquire::http::Proxy \"http://$PROXY:3142\";" | sudo tee /etc/apt/apt.conf.d/proxy.conf
echo "PfilePattern = .*" | sudo tee -a /etc/apt-cacher-ng/acng.conf
echo "PassThroughPattern: .*" | sudo tee -a /etc/apt-cacher-ng/acng.conf
systemctl restart apt-cacher-ng
fi
lxc info $NAME >/dev/null 2>&1
if [ ! $? = 0 ]; then
lxc launch $ALIAS $NAME
fi
if [ -f /etc/apt/apt.conf.d/proxy.conf ]; then
lxc file push /etc/apt/apt.conf.d/proxy.conf $NAME/etc/apt/apt.conf.d/
fi
lxc file push /etc/inputrc $NAME/etc/
===== basic =====
list remote images
lxc image list images:
auto update remote images
lxc config set images.auto_update_cached true
import image
lxc image copy images:ubuntu/xenial/amd64 local: --alias xenial
create profile
lxc profile create juju-default
cat profile.yaml | lxc profile edit juju-default
profile.yaml
name: juju-default
config:
boot.autostart: "true"
security.nesting: "true"
security.privileged: "true"
linux.kernel_modules: openvswitch,nbd,ip_tables,ip6_tables
devices:
eth0:
mtu: "9000"
name: eth0
nictype: bridged
parent: br-mng
type: nic
kvm:
path: /dev/kvm
type: unix-char
mem:
path: /dev/mem
type: unix-char
root:
path: /
type: disk
tun:
path: /dev/net/tun
type: unix-char
create container from local image
lxc image list
lxc launch xenial test1 --profile juju-default
create container from remote image
lxc launch images:ubuntu/xenial/amd64 xenial1
lxc config set xenial1 boot.autostart false
lxc list
create custom image from local container
lxc publish local-container --alias mycustomimage
create container from previous image
lxc launch mycustomimage newcontainer
bash inside
lxc exec trusty1 -- /bin/bash
stop and delete
lxc stop trusty1
lxc delete trusty1
autostart on host boot
lxc config set boot.autostart true
show container configuration
lxc config show
proxy
apt install apt-cacher-ng
NAME=x11test
lxc file push /etc/apt/apt.conf.d/proxy.conf $NAME/etc/apt/apt.conf.d/
Acquire::http::Proxy "http://10.106.191.1:3142";
===== network =====
lxc network create br0
lxc network show br0
lxc network edit br0
static IP container
istance=c1
lxc stop $instance
lxc network attach lxdbr0 $istance eth0 eth0
lxc config device set $istance eth0 ipv4.address 10.99.10.42
lxc start $istance
===== servers =====
prepare lxd server
# bind to port 8443
lxc config set core.https_address "[::]"
# password
lxc config set core.trust_password some-password
from client add remote server
lxc remote add myserver
run command
lxc exec myserver:trusty1 -- bash
===== xorg integration =====
* https://bitsandslices.wordpress.com/2015/12/08/creating-an-lxd-container-for-graphics-applications/
==== container ====
create container
NAME=x11test
lxc launch images:ubuntu/bionic/amd64 $NAME
install simpler X program
lxc exec $NAME -- apt install xterm
lxc exec $NAME bash
apt install mesa-utils x11-apps
NAME=nvidia-sdk-manager
# lxc config set $NAME environment.DISPLAY :0
lxc config set $NAME environment.DISPLAY :0
lxc config device add $NAME X0 disk path=/tmp/.X11-unix/X0 source=/tmp/.X11-unix/X0
lxc config device add $NAME Xauthority disk path=/root/.Xauthority source=${XAUTHORITY}
==== on host ====
for gmd (ubuntu >= 17.10) or ...
[security]
DisallowTCP=false
[xdmcp]
Enable=true
... or for lightdm
xserver-allow-tcp=true
xserver-command=X -listen tcp
add ip of container on /etc/X0.hosts
NAME=x11test
lxc info $NAME | sed -n "s/\s*eth0:\s*inet\s\([0-9\.]*\).*/\1/p" >> /etc/X0.hosts
launch X application in container
xhost +
lxc exec $NAME -- xterm
===== audio integration =====
* https://bitsandslices.wordpress.com/2015/12/10/using-audio-in-lxd-containers/
===== misc devices =====
lxc config device add rfxcom unix-char path=/dev/ttyACM0
lxc config device set rfxcom mode 666
===== share folder =====
# only first time
echo "root:$UID:1" | sudo tee -a /etc/subuid
echo "root:${id -d}:1" | sudo tee -a /etc/subgid
lxc profile set default security.privileged true
# for every share
# lxc init stretch giano
lxc config set gianocop security.privileged true
lxc config set giano raw.idmap "both $UID $UID"
# source is on host, path is inside container
lxc config device add giano develop disk source=/mnt/giano path=/mnt/giano
===== migration =====
on host-destination
lxc config set core.https_address 0.0.0.0:8443
lxc config set core.trust_password PASSWORDhere
on host-origin
# add destination lxd
lxc remote add other-server
# take snap0 on gianocop container
lxc snapshot gianocop snap0
lxc copy gianocop/snap0 other-server:gianocop --verbose
lxc delete gianocop/snap0
on host-destination delete volatile in "lxc config"
volatile.base_image: 6adc9ca1a1124ebd954ba787e83dd9318866fd0b9ddce1cffc612559cfe3bc88
volatile.eth0.hwaddr: 00:16:3e:50:f6:e8
volatile.eth0.name: eth0
volatile.idmap.base: "0"
volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":165536,"Nsid":0,"Maprange":1000},{"Isuid":true,"Isgid":true,"Hostid":1000,"Nsid":1000,"Maprange":1},{"Isuid":true,"Isgid":false,"Hostid":166537,"Nsid":1001,"Maprange":64535},{"Isuid":false,"Isgid":true,"Hostid":165536,"Nsid":0,"Maprange":1000},{"Isuid":true,"Isgid":true,"Hostid":1000,"Nsid":1000,"Maprange":1},{"Isuid":false,"Isgid":true,"Hostid":166537,"Nsid":1001,"Maprange":64535}]'
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":165536,"Nsid":0,"Maprange":1000},{"Isuid":true,"Isgid":true,"Hostid":1000,"Nsid":1000,"Maprange":1},{"Isuid":true,"Isgid":false,"Hostid":166537,"Nsid":1001,"Maprange":64535},{"Isuid":false,"Isgid":true,"Hostid":165536,"Nsid":0,"Maprange":1000},{"Isuid":true,"Isgid":true,"Hostid":1000,"Nsid":1000,"Maprange":1},{"Isuid":false,"Isgid":true,"Hostid":166537,"Nsid":1001,"Maprange":64535}]'
volatile.last_state.power: STOPPED
===== export image from container =====
{{tag>[wiki lxd 'profile network' apache vlan]}}
===== Vlan attach =====
apt-get install vlan
sudo modprobe 8021q
sudo vconfig add eth1 10
sudo ip addr add 10.0.0.1/24 dev eth1.10
ip addr del 10.22.30.44/16 dev eth0
sudo ip link set up eth1.10
sudo su -c 'echo "8021q" >> /etc/modules'
auto eth1.10
iface eth1.10 inet static
address 10.0.0.1
netmask 255.255.255.0
vlan-raw-device eth1
===== Send file to your new host =====
On image hosts
lxc publish --force 'name of container" --alias 'new name'
example
lxc publish --force 'lxc-limesurvey' --alias 'lxc-docuwiki'
Export image
lxc image export 'new name'
Output is in efaa243331f0a7c175376edaf796545a01ad09bb47f25a297b798e09fe66ee66.tar.gz
Show size of export
du -h efaa243331f0a7c175376edaf796545a01ad09bb47f25a297b798e09fe66ee66.tar.gz
==== check sum of image ====
md5sum efaa243331f0a7c175376edaf796545a01ad09bb47f25a297b798e09fe66ee66.tar.gz > exportmd5.txt
cat exportmd5.txt | nc 10.18.49.73 1234
cat efaa243331f0a7c175376edaf796545a01ad09bb47f25a297b798e09fe66ee66.tar.gz | nc 10.18.49.73 1234
**NB**: 10.18.49.73 is your new lxd host
1234 is a free port
===== Transfer image and checksum to new LXD host =====
nc -l 1234 > efaa243331f0a7c175376edaf796545a01ad09bb47f25a297b798e09fe66ee66.tar.gz
nc -l 1234 > exportmd5.txt
check file
md5sum efaa243331f0a7c175376edaf796545a01ad09bb47f25a297b798e09fe66ee66.tar.gz
md5sum -c exportmd5.txt
===== Import image to new LXD host ======
lxc image import efaa243331f0a7c175376edaf796545a01ad09bb47f25a297b798e09fe66ee66.tar.gz --alias lxc-docuwiki
Transferring image: 100%
lxc launch image_name container_name
Creating container_name
Starting container_name
In some instances the publish command may lead to a split xz tar-ball --- but both formats are supported. Simply import the meta-data and rootfs components with
lxc image import --alias image_name
=== Edit LXD default profile: networking ===
Put lxc network interface to host network
lxc stop lxc-docuwiki
lxc profile device set default eth0 parent ens3
lxc profile device set default eth0 nictype macvlan
service lxd restart
service lxd-containers restart
launch your container
lxc start lxc-docuwiki
lxc exec lxc-docuwiki /bin/bash