A while ago I wrote about Compiling and running VPP inside LXD container.
Since then this has become my primary workflow - one LXD container per work task, pleasant, modular, reproducible and easy to clean.
Needless to say, manually going through all the steps is quite boring. So I wrote a couple of scripts automating the creation of the logistics - so I can issue a command and attend to other things, and a few minutes later I have the container with all the dependencies installed, VPP tree checked out and all the things done up to and including "make build". This is quite handy for me, so I thought to document this for anyone interested.
First, create a directory called "shared" in your home directory. This is not VPP-specific, just very very handy for exchanging the data, and as a default persistent data store that survives the container being deleted.
Then ensure your LXD profiles are set up right. Run "lxc profile create hugepages", "lxc profile create tuntap" and then "lxc profile edit hugepages" and "lxc profile edit tuntap" and "lxc profile edit default", to edit the profiles so that you get the results of "lxc profile show ..." identical to below:
ayourtch@xenial:~$ lxc profile show hugepages name: hugepages config: raw.lxc: | lxc.mount.entry = hugetlbfs dev/hugepages hugetlbfs rw,relatime,create=dir 0 0 security.privileged: "true" description: "" devices: {} ayourtch@xenial:~$ lxc profile show tuntap name: tuntap config: {} description: "" devices: tun: path: /dev/net/tun type: unix-char ayourtch@xenial:~$ lxc profile show default name: default config: {} description: Default LXD profile devices: eth0: name: eth0 nictype: bridged parent: lxdbr0 type: nic shared: path: /shared source: /home/ayourtch/shared type: disk ayourtch@xenial:~$
NOTE: You still MUST ensure hugepages are enabled on the host, i.e. this step from the previous blog post is done:
ayourtch@xenial:~$ echo "vm.nr_hugepages=1024" | sudo tee -a /etc/sysctl.d/20-hugepages.conf vm.nr_hugepages=1024 ayourtch@xenial:~$ ayourtch@xenial:~$ sudo sysctl --system ayourtch@xenial:~$ sudo sysctl vm.nr_hugepages vm.nr_hugepages = 1024 ayourtch@xenial:~$
Then, copy the "vpp-bootstrap" file, which you can find at this blogpost below, into ~/shared/vpp-bootstrap. You can call this file yourself from a newly created container, or use the "16-vpp-new-dev" script to create and adjust the container for you.
You will also notice that the scripts try to copy the files from /shared/dot-ssh/* into the new container - I use this to avoid having to re-add the ssh keys ont the server side each time I create the container. Since the containers stay on the same host, are the same user, I think it is a reasonable approach.
Contact me on twitter @ayourtch or via email with any feedback!