Creating lxc containers for distro not in template list

Howto make your own CentOS (tested) or Fedora (untested) rootfs.

Because my rootfs is totally untrustworthy :), I will rather describe, how to make your own.

For start, you will need one container with any other disto, that supports rpm, up and running. Ubuntu is fine (then apt-get install rpm). If you are running Fedora or CentOS on x86_64, it may not work; while rpm has an --ignorearch switch, the postinstall scripts will fail to run. Running the commands in other arm distro in container doesn’t have this problem.

Also, the default install of CentOS includes NetworkManager. While it is a nice thing, for a container, it is overkill. In the following, it is replaced by systemd-networkd. Packages, that won’t work in the container (kernel, audit), are of course omitted. An importat thing to note is, that SELinux of course doesn’t work in container either, but the libraries are required by other packages.

So, let’s go to create our rootfs.

Pick a directory, where you will create the rootfs. Further, it is called $root.

  1. Create the rootfs directory:

    mkdir -p $root

  2. Create /dev nodes:

    mkdir $root/dev mknod -m 600 $root/dev/console c 5 1 mknod -m 666 $root/dev/full c 1 7 mknod -m 600 $root/dev/initctl p mknod -m 666 $root/dev/ptmx c 5 2 mknod -m 666 $root/dev/random c 1 8 mknod -m 666 $root/dev/tty c 5 0 mknod -m 666 $root/dev/tty0 c 4 0 mknod -m 666 $root/dev/urandom c 1 9 mknod -m 666 $root/dev/zero c 1 5 chown -R root:root $root/dev

  3. Grab the following packages from your nearby CentOS mirror. Because I’m lazy, the following packages are stock 7.3, non-updated version. Once the container is up and running, you will update it to current version anyway. For base installation, the following ones are necessary:

    basesystem-10.0-7.el7.centos.noarch.rpm
    bash-4.2.46-20.el7.armv7hl.rpm
    coreutils-8.22-18.el7.armv7hl.rpm
    cronie-1.4.11-14.el7.1.armv7hl.rpm
    curl-7.29.0-35.el7.armv7hl.rpm
    filesystem-3.2-21.el7.armv7hl.rpm
    firewalld-0.4.3.2-8.el7.noarch.rpm
    glibc-2.17-157.el7.armv7hl.rpm
    hostname-3.13-3.el7.armv7hl.rpm
    iproute-3.10.0-74.el7.armv7hl.rpm
    iptables-1.4.21-17.el7.armv7hl.rpm
    iputils-20160308-8.el7.armv7hl.rpm
    less-458-9.el7.armv7hl.rpm
    libsysfs-2.1.0-16.el7.armv7hl.rpm
    man-db-2.6.3-9.el7.armv7hl.rpm
    ncurses-5.9-13.20130511.el7.armv7hl.rpm
    passwd-0.79-4.el7.armv7hl.rpm
    policycoreutils-2.5-8.el7.armv7hl.rpm
    procps-ng-3.3.10-10.el7.armv7hl.rpm
    rootfiles-8.1-11.el7.noarch.rpm
    rpm-4.11.3-21.el7.armv7hl.rpm
    rsyslog-7.4.7-16.el7.armv7hl.rpm
    selinux-policy-targeted-3.13.1-102.el7.noarch.rpm
    setup-2.8.71-7.el7.noarch.rpm
    shadow-utils-4.1.5.1-24.el7.armv7hl.rpm
    sudo-1.8.6p7-20.el7.armv7hl.rpm
    systemd-219-30.el7.armv7hl.rpm
    systemd-networkd-219-30.el7.armv7hl.rpm
    systemd-resolved-219-30.el7.armv7hl.rpm
    tar-1.26-31.el7.armv7hl.rpm
    util-linux-2.23.2-33.el7.armv7hl.rpm
    vim-minimal-7.4.160-1.el7.armv7hl.rpm
    yum-3.4.3-150.el7.centos.noarch.rpm

    These will need the following dependencies:

    acl-2.2.51-12.el7.armv7hl.rpm
    audit-libs-2.6.5-3.el7.armv7hl.rpm
    bind-libs-lite-9.9.4-37.el7.armv7hl.rpm
    bind-license-9.9.4-37.el7.noarch.rpm
    binutils-2.25.1-22.base.el7.armv7hl.rpm
    bzip2-libs-1.0.6-13.el7.armv7hl.rpm
    ca-certificates-2015.2.6-73.el7.noarch.rpm
    centos-userland-release-7-3.1611.el7.centos.0.1.armv7hl.rpm
    chkconfig-1.7.2-1.el7.armv7hl.rpm
    cpio-2.11-24.el7.armv7hl.rpm
    cracklib-2.9.0-11.el7.armv7hl.rpm
    cracklib-dicts-2.9.0-11.el7.armv7hl.rpm
    cronie-anacron-1.4.11-14.el7.1.armv7hl.rpm
    crontabs-1.11-6.20121102git.el7.noarch.rpm
    cryptsetup-libs-1.7.2-1.el7.armv7hl.rpm
    cyrus-sasl-lib-2.1.26-20.el7.armv7hl.rpm
    dbus-1.6.12-17.el7.armv7hl.rpm
    dbus-glib-0.100-7.el7.armv7hl.rpm
    dbus-libs-1.6.12-17.el7.armv7hl.rpm
    dbus-python-1.1.1-9.el7.armv7hl.rpm
    device-mapper-1.02.135-1.el7.armv7hl.rpm
    device-mapper-libs-1.02.135-1.el7.armv7hl.rpm
    diffutils-3.3-4.el7.armv7hl.rpm
    dracut-033-463.el7.armv7hl.rpm
    ebtables-2.0.10-15.el7.armv7hl.rpm
    elfutils-libelf-0.166-2.el7.armv7hl.rpm
    elfutils-libs-0.166-2.el7.armv7hl.rpm
    expat-2.1.0-8.el7.armv7hl.rpm
    file-libs-5.11-33.el7.armv7hl.rpm
    findutils-4.5.11-5.el7.armv7hl.rpm
    firewalld-filesystem-0.4.3.2-8.el7.noarch.rpm
    gawk-4.0.2-4.el7.armv7hl.rpm
    gdbm-1.10-8.el7.armv7hl.rpm
    GeoIP-1.5.0-11.el7.armv7hl.rpm
    glib2-2.46.2-4.el7.armv7hl.rpm
    glibc-common-2.17-157.el7.armv7hl.rpm
    glib-networking-2.42.0-1.el7.armv7hl.rpm
    gmp-6.0.0-12.el7.armv7hl.rpm
    gnupg2-2.0.22-4.el7.armv7hl.rpm
    gnutls-3.3.24-1.el7.armv7hl.rpm
    gobject-introspection-1.42.0-1.el7.armv7hl.rpm
    gpgme-1.3.2-5.el7.armv7hl.rpm
    grep-2.20-2.el7.armv7hl.rpm
    groff-base-1.22.2-8.el7.armv7hl.rpm
    gsettings-desktop-schemas-3.14.2-1.el7.armv7hl.rpm
    gzip-1.5-8.el7.armv7hl.rpm
    hardlink-1.0-19.el7.armv7hl.rpm
    info-5.1-4.el7.armv7hl.rpm
    ipset-6.19-6.el7.armv7hl.rpm
    ipset-libs-6.19-6.el7.armv7hl.rpm
    json-c-0.11-4.el7.armv7hl.rpm
    keyutils-libs-1.5.8-3.el7.armv7hl.rpm
    kmod-20-9.el7.armv7hl.rpm
    kmod-libs-20-9.el7.armv7hl.rpm
    kpartx-0.4.9-99.el7.armv7hl.rpm
    krb5-libs-1.14.1-26.el7.armv7hl.rpm
    libacl-2.2.51-12.el7.armv7hl.rpm
    libassuan-2.1.0-3.el7.armv7hl.rpm
    libattr-2.4.46-12.el7.armv7hl.rpm
    libblkid-2.23.2-33.el7.armv7hl.rpm
    libcap-2.22-8.el7.armv7hl.rpm
    libcap-ng-0.7.5-4.el7.armv7hl.rpm
    libcom_err-1.42.9-9.el7.armv7hl.rpm
    libcurl-7.29.0-35.el7.armv7hl.rpm
    libdb-5.3.21-19.el7.armv7hl.rpm
    libdb-utils-5.3.21-19.el7.armv7hl.rpm
    libestr-0.1.9-2.el7.armv7hl.rpm
    libffi-3.0.13-18.el7.armv7hl.rpm
    libgcc-4.8.5-11.el7.armv7hl.rpm
    libgcrypt-1.5.3-12.el7.1.armv7hl.rpm
    libgpg-error-1.12-3.el7.armv7hl.rpm
    libidn-1.28-4.el7.armv7hl.rpm
    libmnl-1.0.3-7.el7.armv7hl.rpm
    libmodman-2.0.1-8.el7.armv7hl.rpm
    libmount-2.23.2-33.el7.armv7hl.rpm
    libnetfilter_conntrack-1.0.4-2.el7.armv7hl.rpm
    libnfnetlink-1.0.1-4.el7.armv7hl.rpm
    libpcap-1.5.3-8.el7.armv7hl.rpm
    libpipeline-1.2.3-3.el7.armv7hl.rpm
    libproxy-0.4.11-10.el7.armv7hl.rpm
    libpwquality-1.2.3-4.el7.armv7hl.rpm
    libselinux-2.5-6.el7.armv7hl.rpm
    libselinux-python-2.5-6.el7.armv7hl.rpm
    libselinux-utils-2.5-6.el7.armv7hl.rpm
    libsemanage-2.5-4.el7.armv7hl.rpm
    libsepol-2.5-6.el7.armv7hl.rpm
    libssh2-1.4.3-10.el7.1.armv7hl.rpm
    libstdc+±4.8.5-11.el7.armv7hl.rpm
    libtasn1-3.8-3.el7.armv7hl.rpm
    libuser-0.60-7.el7.armv7hl.rpm
    libutempter-1.1.6-4.el7.armv7hl.rpm
    libuuid-2.23.2-33.el7.armv7hl.rpm
    libverto-0.2.5-4.el7.armv7hl.rpm
    libxml2-2.9.1-6.el7.3.armv7hl.rpm
    logrotate-3.8.6-12.el7.armv7hl.rpm
    lua-5.1.4-15.el7.armv7hl.rpm
    mozjs17-17.0.0-19.el7.armv7hl.rpm
    ncurses-base-5.9-13.20130511.el7.noarch.rpm
    ncurses-libs-5.9-13.20130511.el7.armv7hl.rpm
    nettle-2.7.1-8.el7.armv7hl.rpm
    nspr-4.11.0-1.el7.armv7hl.rpm
    nss-3.21.0-17.el7.armv7hl.rpm
    nss-softokn-3.16.2.3-14.4.el7.armv7hl.rpm
    nss-softokn-freebl-3.16.2.3-14.4.el7.armv7hl.rpm
    nss-sysinit-3.21.0-17.el7.armv7hl.rpm
    nss-tools-3.21.0-17.el7.armv7hl.rpm
    nss-util-3.21.0-2.2.el7.armv7hl.rpm
    openldap-2.4.40-13.el7.armv7hl.rpm
    openssl-libs-1.0.1e-60.el7.armv7hl.rpm
    p11-kit-0.20.7-3.el7.armv7hl.rpm
    p11-kit-trust-0.20.7-3.el7.armv7hl.rpm
    pam-1.1.8-18.el7.armv7hl.rpm
    pcre-8.32-15.el7.1.armv7hl.rpm
    pinentry-0.8.1-17.el7.armv7hl.rpm
    pkgconfig-0.27.1-4.el7.armv7hl.rpm
    popt-1.13-16.el7.armv7hl.rpm
    pth-2.0.7-23.el7.armv7hl.rpm
    pygobject3-base-3.14.0-3.el7.armv7hl.rpm
    pygpgme-0.3-9.el7.armv7hl.rpm
    pyliblzma-0.5.3-11.el7.armv7hl.rpm
    python-2.7.5-48.el7.armv7hl.rpm
    python-decorator-3.4.0-3.el7.noarch.rpm
    python-firewall-0.4.3.2-8.el7.noarch.rpm
    python-iniparse-0.4-9.el7.noarch.rpm
    python-libs-2.7.5-48.el7.armv7hl.rpm
    python-pycurl-7.19.0-19.el7.armv7hl.rpm
    python-slip-0.4.0-2.el7.noarch.rpm
    python-slip-dbus-0.4.0-2.el7.noarch.rpm
    python-urlgrabber-3.10-8.el7.noarch.rpm
    pyxattr-0.5.1-5.el7.armv7hl.rpm
    qrencode-libs-3.4.1-3.el7.armv7hl.rpm
    readline-6.2-9.el7.armv7hl.rpm
    rpm-build-libs-4.11.3-21.el7.armv7hl.rpm
    rpm-libs-4.11.3-21.el7.armv7hl.rpm
    rpm-python-4.11.3-21.el7.armv7hl.rpm
    sed-4.2.2-5.el7.armv7hl.rpm
    selinux-policy-3.13.1-102.el7.noarch.rpm
    shared-mime-info-1.1-9.el7.armv7hl.rpm
    slang-2.2.4-11.el7.armv7hl.rpm
    sqlite-3.7.17-8.el7.armv7hl.rpm
    systemd-libs-219-30.el7.armv7hl.rpm
    systemd-sysv-219-30.el7.armv7hl.rpm
    sysvinit-tools-2.88-14.dsf.el7.armv7hl.rpm
    tcp_wrappers-libs-7.6-77.el7.armv7hl.rpm
    trousers-0.3.13-1.el7.armv7hl.rpm
    tzdata-2016g-2.el7.noarch.rpm
    ustr-1.0.4-16.el7.armv7hl.rpm
    xz-5.2.2-1.el7.armv7hl.rpm
    xz-libs-5.2.2-1.el7.armv7hl.rpm
    yum-metadata-parser-1.1.4-10.el7.armv7hl.rpm
    yum-plugin-fastestmirror-1.1.31-40.el7.noarch.rpm
    zlib-1.2.7-17.el7.armv7hl.rpm

    Place all the rpms into a directory, which we will further call $rpmdir. Install them using this commdand

    rpm --root=$root -ivh $rpmdir/*.rpm

  4. Now you are almost done, let’s do the final touches. First, disable the arm kernel repo:

    edit $root/etc/yum.repos.d/CentOS-armhfp-kernel.repo, set the line

    enabled=1

    to

    enabled=0

  5. configure your network. Using systemd-networkd, create file $root/etc/systemd/network/50-static.network with the following content, that configures static ip, gateway and dns for IPv4 and DHCP for IPv6:

    [Match]
    Name=eth0
    [Network]
    Address=your_ip/24
    Gateway=your_gw_ip
    DNS=your_dns_ip
    DHCP=ipv6

    These last steps are done, once your container is up and running, finish from inside:

  6. set your machine hostname:

    hostnamectl set-hostname $your_hostname

  7. Enable resolver:

    systemctl enable systemd-resolved systemctl start systemd-resolved ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

  8. If you think, that the entire CentOS installation is quite big, you might be right. Entire 100 MB is being taken by the locale definition data (/usr/lib/locale/locale-archive).

    If you want to make it smaller, the following commands remove all locales except english:

    localedef --list-archive | grep -v -i ^en | xargs localedef --delete-from-archive

    build-locale-archive

    You may also set yum config to make it locale preference aware:

    Edit /etc/yum.conf and set the configuration:

    override_install_langs=en_US.utf8

    In the same file, you can set additional flags:

    tsflags=nodocs

  9. Those feeling adventorous, may add the experimental arm-epel repo: create file /etc/yum.repos.d/epel.repo with following content:

    [epel]
    name=Epel rebuild for armhfp
    baseurl=Index of /repodir/epel-pass-1
    enabled=1
    gpgcheck=0

  10. Update everything to the current version:

    yum update

1 Like