Daniel Wikar Personal blog about Analytics, Big Data, Microsoft and IT

Flatcar Container Linux - Bare Metal Simple Installation Guide

One of the main reasons I wanted to get netboot.xyz up and running was to simplify installation of various linux machines and more specifically Flatcar Container Linux which have really caught my interest as a minimal, immutable and always up-to-date container host.

Kinvolk, the company behind Flatcar, was also acquired by Microsoft recently which piqued my curiosity even more.

I wrote up this little step-by-step bare metal installation guide and to be able to follow this method you would need to have a spare Linux instance with Docker. I used my OpenWRT router once again but you could also use WSL2 on Windows, a Raspberry Pi with Docker or whatever you prefer.

1. Create password

Using your existing Linux/Docker instance create a password hash to be used in the config.yaml for Flatcar.

docker run --rm --interactive --tty fscm/mkpasswd --method=SHA-512 --rounds=4096 yourpassword

https://www.flatcar.org/docs/latest/provisioning/cl-config/examples/#generating-a-password-hash

2. Create config.yaml (Container Linux Config)

I created a directory /home/daniel/ignition and this minimal config.yaml.

nano config.yaml

In the password_hash section paste the hash from 1. I also added a static IP (additional comment under 6) and made my user a member of the sudo group.

passwd:
  users:
    - name: daniel
      password_hash: "$6$rounds=4096$this_is_where_you_paste_your_really_long_password_hash"
      groups: ["sudo"]
networkd:
  units:
    - name: enp0s25.network
      contents: |
        [Match]
        Name=enp0s25

        [Network]
        DNS=1.1.1.1
        Address=192.168.100.252/24
        Gateway=192.168.100.1

https://www.flatcar.org/docs/latest/provisioning/cl-config/examples/

https://www.flatcar.org/docs/latest/provisioning/config-transpiler/configuration/

3. Transpile config.yaml into ignition.json

cat config.yaml | docker run --rm -i ghcr.io/flatcar-linux/ct:latest > ignition.json

https://flatcar-linux.org/docs/latest/provisioning/config-transpiler/

4. Setup local webserver

Setup a local webserver to host the ignition.json file and serve this during the Flatcar installation. I decided to share the directory /home/daniel/ignition using port 7080 in order to not conflict with an existing webserver.

docker run --name nginx-ignition -v /home/daniel/ignition:/usr/share/nginx/html:ro -p 7080:80 -d nginx

5. Local installation

Everything is now prepared and we’re ready to boot into a live version of Flatcar either via ISO or PXE on the target machine.

Using netboot.xyz you can pass the ignition.json already during first boot but since we’re going to do a local installation we can skip this step.

Once booted you will automatically be logged into a shell on the console without prompting for a password.

Now it’s time to transfer the ignition.json file locally using the webserver from 4.

wget http://192.168.1.1:7080/ignition.json

If you are unsure of your disk setup you can check this with…

lsblk

And you then perform the installation by running…

sudo flatcar-install -d /dev/sda -i ignition.json

6. Network configuration (Optional)

During my first installation I specified the wrong interface name (should have been Name=enp0s25) in the config.yaml and I haven’t figured out how the automatic naming works so on my second try I ran…

netstat -i

To list all active network devices…

Kernel Interface table
Iface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
docker0          1500        0      0      0 0             7      0      0      0 BMU
enp0s25          1500    58858      0    420 0         26959      0      0      0 BMRU
lo              65536        0      0      0 0             0      0      0      0 LRU

Then I modified config.yaml with the correct interface and transpiled again through step 3 before installing 5.

Done

Now you should be able to ssh into your freshly installed Flatcar Container Linux instance.

Full documentation is found here.

Good luck!

comments powered by Disqus