Hi Stephane,
First, Happy New Year 2020 to you all the whole Linux Containers team! It looks like your will be very busy with lots of projects on this front
Thanks for your answer concerning the configuration part, I have tried updating my yaml file and indeed the error about the configuration part has disappeared.
Here is the updated YAML file (quickpath.yml
below), updated as per your suggestions:
image:
description: Shortcut for Packer development
distribution: ubuntu
release: 0.1
source:
downloader: ubuntu-http
packages:
manager: apt
targets:
lxc:
create-message: |-
This "shortcut" container was created out of a Packer build by distrobuilder.
config:
- type: all
content: |-
lxc.include = LXC_TEMPLATE_CONFIG/common.conf
# For Ubuntu 14.04
lxc.mount.entry = /sys/kernel/debug sys/kernel/debug none bind,optional 0 0
lxc.mount.entry = /sys/kernel/security sys/kernel/security none bind,optional 0 0
lxc.mount.entry = /sys/fs/pstore sys/fs/pstore none bind,optional 0 0
lxc.mount.entry = mqueue dev/mqueue mqueue rw,relatime,create=dir,optional 0 0
- type: user
content: |-
lxc.include = LXC_TEMPLATE_CONFIG/userns.conf
# For Ubuntu 14.04
lxc.mount.entry = /sys/firmware/efi/efivars sys/firmware/efi/efivars none bind,optional 0 0
lxc.mount.entry = /proc/sys/fs/binfmt_misc proc/sys/fs/binfmt_misc none bind,optional 0 0
- type: all
content: |-
lxc.arch = {{ image.architecture_personality }}
The container creation does not output any error anymore:
$ sudo distrobuilder pack-lxc quickpath.yml /var/lib/lxc/lxc_app-backend_ubuntu/ /tmp/vincent/
$ sudo lxc-create -n backend-respawn -t local -- -m /tmp/vincent/meta.tar.xz -f /tmp/vincent/rootfs.tar.xz
The created container does not start though. With logging enabled, I can see this is because /sbin/init
cannot be found:
$ sudo lxc-start -n backend-respawn --logfile=/tmp/lxc-start.txt
lxc-start: backend-respawn: lxccontainer.c: wait_on_daemonized_start: 872 Received container state "ABORTING" instead of "RUNNING"
lxc-start: backend-respawn: tools/lxc_start.c: main: 329 The container failed to start
lxc-start: backend-respawn: tools/lxc_start.c: main: 332 To get more details, run the container in foreground mode
lxc-start: backend-respawn: tools/lxc_start.c: main: 334 Additional information can be obtained by setting the --logfile and --logpriority options
$ cat /tmp/lxc-start.txt
lxc-start backend-respawn 20200107124444.562 ERROR start - start.c:start:2121 - No such file or directory - Failed to exec "/sbin/init"
lxc-start backend-respawn 20200107124444.562 ERROR sync - sync.c:__sync_wait:61 - An error occurred in another process (expected sequence number 7)
lxc-start backend-respawn 20200107124444.582 ERROR lxccontainer - lxccontainer.c:wait_on_daemonized_start:872 - Received container state "ABORTING" instead of "RUNNING"
lxc-start backend-respawn 20200107124444.583 ERROR start - start.c:__lxc_start:2036 - Failed to spawn container "backend-respawn"
lxc-start backend-respawn 20200107124444.583 ERROR lxc_start - tools/lxc_start.c:main:329 - The container failed to start
lxc-start backend-respawn 20200107124444.583 ERROR lxc_start - tools/lxc_start.c:main:332 - To get more details, run the container in foreground mode
lxc-start backend-respawn 20200107124444.583 ERROR lxc_start - tools/lxc_start.c:main:334 - Additional information can be obtained by setting the --logfile and --logpriority options
Looking at the new container root FS, I can see some of its rootfs got expanded outside the rootfs
directory, which appear to contain the original rootfs:
$ sudo ls /var/lib/lxc/backend-respawn/rootfs -ls
total 32
4 -rw-r--r--. 1 root root 363 Jan 7 12:03 config
4 drwxr-xr-x. 3 root root 4096 Jan 7 13:43 dev
4 drwxr-xr-x. 2 root root 4096 Jan 7 12:09 etc
4 drwxr-xr-x. 2 root root 4096 Jan 7 12:09 proc
4 drwxr-xr-x. 22 root root 4096 Jan 7 12:03 rootfs
4 drwxr-xr-x. 2 root root 4096 Jan 7 12:09 run
4 drwxr-xr-x. 2 root root 4096 Jan 7 12:09 sys
4 drwxr-xr-x. 2 root root 4096 Jan 7 12:09 tmp
$ sudo ls /var/lib/lxc/backend-respawn/rootfs/rootfs -al
total 88
drwxr-xr-x. 22 root root 4096 Jan 7 12:03 .
drwxr-xr-x. 9 root root 4096 Jan 7 13:44 ..
drwxr-xr-x. 2 root root 4096 Jan 7 10:35 bin
drwxr-xr-x. 2 root root 4096 Apr 24 2018 boot
drwxr-xr-x. 3 root root 4096 Jan 7 10:35 dev
drwxr-xr-x. 74 root root 4096 Jan 7 10:37 etc
drwxr-xr-x. 4 root root 4096 Jan 7 10:36 home
drwxr-xr-x. 12 root root 4096 Jan 7 10:37 lib
drwxr-xr-x. 2 root root 4096 Dec 30 08:43 lib64
drwxr-xr-x. 2 root root 4096 Dec 30 08:42 media
drwxr-xr-x. 2 root root 4096 Dec 30 08:42 mnt
drwxr-xr-x. 2 root root 4096 Dec 30 08:42 opt
drwxr-xr-x. 2 root root 4096 Apr 24 2018 proc
drwx------. 7 root root 4096 Jan 7 12:03 root
drwxr-xr-x. 2 root root 4096 Dec 30 08:45 run
drwxr-xr-x. 2 root root 4096 Jan 7 10:35 sbin
drwxr-xr-x. 2 root root 4096 Dec 30 08:42 srv
drwxr-xr-x. 2 root root 4096 Apr 24 2018 sys
drwxrwxrwt. 2 root root 4096 Jan 7 10:44 tmp
drwxr-xr-x. 10 root root 4096 Dec 30 08:42 usr
drwxr-xr-x. 12 root root 4096 Dec 30 08:44 var
drwxr-xr-x. 10 vincent docker 4096 Jan 7 10:36 xdt
I also note that the original container got polluted in the same vein with those additional directories (that did not exist before distrobuilder
was called):
$ ls -l /var/lib/lxc/lxc_redpesk-backend_ubuntu/
total 32K
-rw-r--r--. 1 root root 363 Jan 7 11:37 config
drwxr-xr-x. 2 root root 4.0K Jan 7 11:40 dev/
drwxr-xr-x. 2 root root 4.0K Jan 7 11:40 etc/
drwxr-xr-x. 2 root root 4.0K Jan 7 11:40 proc/
drwxr-xr-x. 22 root root 4.0K Jan 7 11:37 rootfs/
drwxr-xr-x. 2 root root 4.0K Jan 7 11:40 run/
drwxr-xr-x. 2 root root 4.0K Jan 7 11:40 sys/
drwxr-xr-x. 2 root root 4.0K Jan 7 11:40 tmp/
I have checked the new container config file and the rootfs path appears correct:
$ sudo cat /var/lib/lxc/backend-respawn/config
# Template used to create this container: /usr/share/lxc/templates/lxc-local
# Parameters passed to the template: -m /tmp/vincent/meta.tar.xz -f /tmp/vincent/rootfs.tar.xz
# Template script checksum (SHA-1): 381a40a454bdaf18de159d6d50bba0cf7425af4b
# For additional config options, please look at lxc.container.conf(5)
# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)
# Distribution configuration
lxc.include = /usr/share/lxc/config/common.conf
# For Ubuntu 14.04
lxc.mount.entry = /sys/kernel/debug sys/kernel/debug none bind,optional 0 0
lxc.mount.entry = /sys/kernel/security sys/kernel/security none bind,optional 0 0
lxc.mount.entry = /sys/fs/pstore sys/fs/pstore none bind,optional 0 0
lxc.mount.entry = mqueue dev/mqueue mqueue rw,relatime,create=dir,optional 0 0
lxc.arch = linux64
# Container specific configuration
lxc.rootfs.path = dir:/var/lib/lxc/backend-respawn/rootfs
lxc.uts.name = backend-respawn
# Network configuration
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:a3:74:f9
Do you know what could be causing this directory messup? Is there a particular layout the container directory should abide by when distrobuilder
is called to pack it into config/rootfs?
Thanks much for your help!
Edit: I tried to use distrobuilder build-dir
as per the doc at https://distrobuilder.readthedocs.io/en/latest/building/ to inspect the input state of pack-lxc
but this fails:
$ sudo distrobuilder build-dir ~/Documents/Dev/repos/community/lxc-ci/images/ubuntu.yaml /tmp/vincent-lxc-ci
I: usage: [OPTION]... <suite> <target> [<mirror> [<script>]]
I: Try `debootstrap --help' for more information.
E: You must specify a suite and a target.
Error: Error while downloading source: exit status 1
According to the Jenkins logs at https://jenkins.linuxcontainers.org/job/image-ubuntu/architecture=amd64,release=bionic,restrict=lxc-priv,variant=default/2/console, it looks like the doc might be missing some parameters. I can indeed see the Jenkins invocation as being:
distrobuilder --timeout 3600 build-dir image.yaml rootfs -o image.serial=20200107_07:42 -o image.architecture=amd64 -o image.release=bionic -o image.variant=default -o source.url=http://us.archive.ubuntu.com/ubuntu