clearfog: Introduce a /cfg partition for persistent changes

The idea is to store whatever important bits that need real persistence
in there.

Note that I am deliberately *not* using this as the upper directory for
the /etc overlay. I inherited that company-wide worrying about flash
lifetime, and hence I would like to limit the amount of writes to some
reasonable minimum. That doesn't play terribly well with SW such as
sysrepo which happily stores both persistent and run-time data on disk,
in the same directory -- hence these ugly detours...

I've tried to do the right thing with the alignment:

- we need a 1MB of nothing at the very beginning for U-Boot and its
environment
- the eMMC version of the microSOM has 8GB of storage
- it probably makes sense to split that into two halves for
future-proofness, so that we don't have to deal with overlapping
partitions later
- finally, the 1MB gap between the end of cfg-A and the beginning of
rootfs-B is there to be symmetric with regards to the U-Boot's reserved
space in the first 1MB

Hopefully, we should be able to just (more or less) `dd` stuff in-place.

There's one missing piece: nothing explicitly puts stuff to /cfg/etc/,
yet.

Change-Id: Idc540ecfedf1b17615b01f28cdce5dca9b976260
diff --git a/board/czechlight/common/mk-empty-cfg-fs.sh b/board/czechlight/common/mk-empty-cfg-fs.sh
new file mode 100755
index 0000000..90966c7
--- /dev/null
+++ b/board/czechlight/common/mk-empty-cfg-fs.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+CFG_FS=${BINARIES_DIR}/cfg.ext4
+rm -f ${CFG_FS}
+${HOST_DIR}/sbin/mkfs.ext4 -L cfg -O ^64bit -e panic ${CFG_FS} 256M
diff --git a/board/czechlight/common/overlay/cfg/.keep b/board/czechlight/common/overlay/cfg/.keep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/board/czechlight/common/overlay/cfg/.keep
diff --git a/board/czechlight/common/overlay/usr/lib/systemd/system/cfg-restore-etc.service b/board/czechlight/common/overlay/usr/lib/systemd/system/cfg-restore-etc.service
new file mode 100644
index 0000000..0540bc9
--- /dev/null
+++ b/board/czechlight/common/overlay/usr/lib/systemd/system/cfg-restore-etc.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Restore /etc from the Persistent config
+DefaultDependencies=no
+Conflicts=umount.target
+Before=local-fs.target umount.target
+After=cfg-storage.service
+Requires=cfg-storage.service etc-overlay.service
+ConditionDirectoryNotEmpty=/cfg/etc
+
+[Service]
+Type=oneshot
+ExecStart=/bin/sh -c 'cp -a /cfg/etc/* /etc/'
diff --git a/board/czechlight/common/overlay/usr/lib/systemd/system/cfg-storage.service b/board/czechlight/common/overlay/usr/lib/systemd/system/cfg-storage.service
new file mode 100644
index 0000000..e1256a8
--- /dev/null
+++ b/board/czechlight/common/overlay/usr/lib/systemd/system/cfg-storage.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Mount persistent config at /cfg
+DefaultDependencies=no
+Conflicts=umount.target
+Before=local-fs.target umount.target
+After=etc-overlay.service
+
+[Service]
+Type=oneshot
+# This is ugly, but required due to the limitations of the mount units' names
+# (I need two "duplicates" which differ in the ConditionKernelCommandLine)
+ExecStart=/bin/sh -c '(grep -q rauc.slot=A /proc/cmdline && mount -o relatime,nodev,nosuid /dev/mmcblk0p2 /cfg) || (grep -q rauc.slot=B /proc/cmdline && mount -o relatime,nodev,nosuid /dev/mmcblk0p4 /cfg)'
diff --git a/board/czechlight/common/overlay/usr/lib/systemd/system/local-fs.target.wants/cfg-restore-etc.service b/board/czechlight/common/overlay/usr/lib/systemd/system/local-fs.target.wants/cfg-restore-etc.service
new file mode 120000
index 0000000..7ee72f5
--- /dev/null
+++ b/board/czechlight/common/overlay/usr/lib/systemd/system/local-fs.target.wants/cfg-restore-etc.service
@@ -0,0 +1 @@
+../cfg-restore-etc.service
\ No newline at end of file
diff --git a/board/czechlight/common/overlay/usr/lib/systemd/system/local-fs.target.wants/cfg-storage.service b/board/czechlight/common/overlay/usr/lib/systemd/system/local-fs.target.wants/cfg-storage.service
new file mode 120000
index 0000000..600c2b9
--- /dev/null
+++ b/board/czechlight/common/overlay/usr/lib/systemd/system/local-fs.target.wants/cfg-storage.service
@@ -0,0 +1 @@
+../cfg-storage.service
\ No newline at end of file