[arch-projects] [netctl] netctl, cloud-init, and systemd

Conrad Hoffmann ch at bitfehler.net
Mon Jun 17 16:02:05 UTC 2019


Ohai!

One of my pet projects atm is creating useful Arch Linux cloud images
(mostly EC2 AMIs), which mostly means giving some lovin' to the
cloud-init AUR package [1]. My dream is for Arch to one day have
official cloud images, but that's a completely different story ;)

So, it turns out the default kernel and two AUR packages [1][2] already
get you a pretty long way. One thing that remains a bit difficult though
is network configuration, and that's what this is about.

In case you are not familiar with cloud-init, the idea is that you can
build a single OS image that runs cloud-init on boot, and cloud-init
will take care of such things as network configuration, so that the same
image will work regardless of the network setup you choose for the cloud
instance.

The current cloud-init implementation for Arch uses netctl [3]. The
implementation is correct in such a way that it does indeed render the
right netctl profile(s) and enables them. However there is a problem:
they are not being started. AFAICT this is because cloud-init does this
while the systemd boot is already in process, and changing the
dependency graph (by adding new units) does not have any effect until
the next run (everything works right on second boot). Note that I even
tried having cloud-init run `systemd daemon-reload` after enabling the
units, but it didn't help either.

The reason I am posting this here is that this seems to be an issue due
to the particular way netctl use systemd units. Since you don't know the
names or the number of profiles (units) that will be generated during
image creation, you cannot enable them at that time. But doing so during
first boot does not seem to work.

Just for comparison, if one were to use e.g. systemd-networkd instead,
you would just enable the systemd-networkd unit during image creation,
cloud-init could generate the appropriate config for any number of
devices, and when the unit starts it will do the right thing. Likewise
on other distros, e.g. Debian with /etc/network/interfaces or such.

Now, from my point of view, there could be several approaches to solve this:

1. systemd supports updates of the dep graph during boot
2. support such a use case in netctl
3. change cloud-init to use systemd-networkd for Arch

Let me quickly elaborate:

1. is intentionally not phrased as something to be done. It might
already be a thing, I just couldn't figure out how to do it. If someone
knows more about this, I would love to hear about it. If this works, it
would be the easiest solution. However, if it doesn't, I don't have my
hopes up high for this being added to systemd anytime soon.

2. is the main reason I am writing this. Things that came to mind were
another special unit (netctl-all?), or even just a well-defined
interface to write devices into the state file, so that the plain netctl
unit would work. I would be very interested to hear how such a thing
sounds to you, the developers?

3. Is of course an option, but would require quite a bit of work in
cloud-init. That work, if done right, might however at some point
benefit other distros, should they be using systemd-networkd as well.
The main reason I am also bringing this up that I was wondering if there
are possibly any plans to abandon netctl anyways at some point in favor
of distro-agnostic solutions (be it systemd-networkd or any other).

So, sorry for the long mail, but I probably omitted a few crucial
details already, so don't hesitate to ask for clarifications :)

I would love to hear your thoughts on this!

Thanks a lot,
Conrad

[1] https://aur.archlinux.org/packages/cloud-init/
[2] https://aur.archlinux.org/packages/growpart/
[3] https://git.launchpad.net/cloud-init/tree/cloudinit/distros/arch.py


More information about the arch-projects mailing list