Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LXC without chroot

Tags:

linux

lxc

cgroups

Is there any way to use LXC for resource management using process groups without creating containers? I am working on a service that runs arbitrary code inside a sandbox, for which I am only interested in hardware resource management. I don't want any chrooting; I just want these process groups to have access to the main file system.

I was told that lxc is light weight, but all the examples that I see create a new container (I.e. a dir with a full OS) for every lxc process. I don't really see how this is much lighter than any other VM solution.

So is there any way that LXC can be used to control and manage multiple process groups, without creating separate containers for each and every one of them?

like image 477
Jeroen Ooms Avatar asked Nov 21 '12 01:11

Jeroen Ooms


People also ask

Does LXC use chroot?

Furthermore, LXC does not require a chroot, and even when you give it a chroot, you can bind-mount directories from the host system into the container, sharing those particular directory trees between the host and the container.

Do containers use chroot?

A chroot operation is necessary to understand how containers are layered to limit or deny access outside of a designated directory tree. >> So a container, is kinda three different kernel features put together. One of them here is, I'm gonna say change root because every time I say cha-root, I feel ridiculous.

Is LXC faster than Docker?

LXC boasts fast boot times when compared to a virtual machine – it doesn't need to package an entire OS and a complete machine setup with network interfaces, virtual processors, and a hard drive. Docker containers are also lightweight, which contributes significantly to their speed.

Do LXC containers have their own kernel?

LXC containers are often considered as something in the middle between a chroot and a full-fledged virtual machine. The goal of LXC is to create an environment as close as possible to a standard Linux installation but without the need for a separate kernel.


1 Answers

LXC isn't a monolithic system. It's a collection of kernel features that can be used to isolate processes in various different ways, and a userspace tool to use all of these features together to create full-fledged containers. But the individual features are still usable on their own, without LXC. Furthermore, LXC does not require a chroot, and even when you give it a chroot, you can bind-mount directories from the host system into the container, sharing those particular directory trees between the host and the container.

For instance, cgroups are used by LXC to set resource limits on containers. But they can be used to set resource limits on groups of processes without using the LXC tools at all. You can manipulate /sys/fd/cgroup/memory or /sys/fs/cgroup/cpuacct directly, to put process into cgroups that limit the amount of memory or CPU they are allowed to use. Or if you're on a system using systemd, you can control the memory limits for a group of processes using MemoryLimit=200M or the like in the .service file for a given service.

If you want to use LXC to do lightweight resource management, you can do that with or without a chroot. When starting an LXC container, you can choose which resources you want to isolate; so you could create a container with only a virtualized network, and nothing else; or a container with only memory limits, but sharing everything else with the host. The only things that will be isolated are those specified in the configuration file for your container. For example, lxc ships with several example container definitions that only isolate the network; they share a root partition and almost everything else with the host. Here's how to run a container identical to the host system except it has no network interface:

 sudo lxc-execute -n foo -f /usr/share/doc/lxc/examples/lxc-no-netns.conf /bin/bash

If you want some files to be shared with the host, but not others, you have two choices; you could use a shared root directory, and mount over the files that you want to be different in the container; or you could use a chroot, but mount the files that you do want to share in the container.

For example, here's the configuration for a container that shares everything with the host except for /home; it instead bind-mounts /home/me/fake-home over /home within the container:

lxc.mount.entry = /home/me/fake-home /home none rw,bind 0 0

Or if you want to have a completely different root, but still share some directories like /usr, you can bind mount a few directories into a directory, and use that as the root of the filesystem.

So you have lots of options, and can choose to isolate just one component, more than one, or as many as LXC supports, depending on your needs.

like image 69
Brian Campbell Avatar answered Sep 17 '22 22:09

Brian Campbell