From 4c8fd8fab04796311a3f108143e2eb5f16d86abf Mon Sep 17 00:00:00 2001
From: j1nx
Date: Fri, 25 Aug 2023 14:59:36 +0000
Subject: [PATCH] [All] Changes to the overlay system to get rootless podman to
work
---
.../board/ovos/ova/genimage-ova.cfg | 14 +++++++
.../board/ovos/ova/grub-efi.cfg | 2 +-
.../board/ovos/raspberrypi/grub-efi.cfg | 2 +-
.../ovos/raspberrypi/rpi4/genimage-rpi4.cfg | 14 +++++++
buildroot-external/configs/ova_64_defconfig | 20 ++++-----
buildroot-external/configs/rpi4_64_defconfig | 20 ++++-----
.../rootfs-overlay/etc/pam.d/login | 13 ------
.../rootfs-overlay/etc/pam.d/other | 6 +++
.../rootfs-overlay/etc/pam.d/system-auth | 23 ++++++++++
.../rootfs-overlay/mnt/home/.empty | 0
.../lib/systemd/system-preset/10-ovos.preset | 1 -
.../usr/lib/systemd/system/etc.mount | 15 +++++++
.../usr/lib/systemd/system/home.mount | 15 +++++++
.../usr/lib/systemd/system/mnt-home.mount | 17 ++++++++
.../usr/lib/systemd/system/mnt-overlay.mount | 15 +++++++
.../usr/lib/systemd/system/ovos-bind.target | 7 ++++
.../lib/systemd/system/ovos-expand.service | 15 +++++++
.../usr/lib/systemd/system/ovos-home.service | 15 +++++++
.../lib/systemd/system/ovos-overlay.service | 15 +++++++
.../systemd/system/systemd-growfs@.service | 18 ++++++++
.../rootfs-overlay/usr/libexec/home-setup | 6 +++
.../rootfs-overlay/usr/libexec/overlay-setup | 11 ++---
.../rootfs-overlay/usr/libexec/ovos-expand | 42 +++++++++++++++++++
23 files changed, 258 insertions(+), 48 deletions(-)
delete mode 100644 buildroot-external/rootfs-overlay/etc/pam.d/login
create mode 100644 buildroot-external/rootfs-overlay/etc/pam.d/other
create mode 100644 buildroot-external/rootfs-overlay/etc/pam.d/system-auth
create mode 100644 buildroot-external/rootfs-overlay/mnt/home/.empty
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/etc.mount
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/home.mount
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/mnt-home.mount
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/mnt-overlay.mount
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-bind.target
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-expand.service
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-home.service
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-overlay.service
create mode 100644 buildroot-external/rootfs-overlay/usr/lib/systemd/system/systemd-growfs@.service
create mode 100755 buildroot-external/rootfs-overlay/usr/libexec/home-setup
create mode 100755 buildroot-external/rootfs-overlay/usr/libexec/ovos-expand
diff --git a/buildroot-external/board/ovos/ova/genimage-ova.cfg b/buildroot-external/board/ovos/ova/genimage-ova.cfg
index 9142efbf..5e622930 100644
--- a/buildroot-external/board/ovos/ova/genimage-ova.cfg
+++ b/buildroot-external/board/ovos/ova/genimage-ova.cfg
@@ -16,6 +16,14 @@ image overlayfs.ext4 {
ext4 {
use-mke2fs = "true"
}
+ size = 256M
+}
+
+image homefs.ext4 {
+ name = "homefs"
+ ext4 {
+ use-mke2fs = "true"
+ }
size = 64M
}
@@ -52,4 +60,10 @@ image disk.img {
partition-type-uuid = 0fc63daf-8483-4772-8e79-3d69d8477de4
image = "overlayfs.ext4"
}
+
+ partition homefs {
+ partition-uuid = ba3c2691-cce9-4963-b773-42c440c235ec
+ partition-type-uuid = 0fc63daf-8483-4772-8e79-3d69d8477de4
+ image = "homefs.ext4"
+ }
}
diff --git a/buildroot-external/board/ovos/ova/grub-efi.cfg b/buildroot-external/board/ovos/ova/grub-efi.cfg
index 5edef9e3..cc9b0f38 100644
--- a/buildroot-external/board/ovos/ova/grub-efi.cfg
+++ b/buildroot-external/board/ovos/ova/grub-efi.cfg
@@ -12,7 +12,7 @@ set menu_color_highlight=white/red
load_env
-default_cmdline="rootfstype=squashfs init=/sbin/pre-init systemd.machine_id=$MACHINE_ID fsck.repair=yes zram.enabled=1 zram.num_devices=3 console=tty1 systemd.unified_cgroup_hierarchy=1 cgroup_enable=cpuset cgroup_memory=1 $boot_condition rootwait"
+default_cmdline="rootfstype=squashfs systemd.machine_id=$MACHINE_ID fsck.repair=yes zram.enabled=1 zram.num_devices=3 console=console consoleblank=0 loglevel=0 vt.global_cursor_default=0 logo.nologo systemd.show_status=0 systemd.unified_cgroup_hierarchy=1 cgroup_enable=cpuset cgroup_memory=1 $boot_condition rootwait quiet splash"
file_env -f ($root)/cmdline.txt cmdline
regexp --set 1:boothd (.+),.+ ${root}
diff --git a/buildroot-external/board/ovos/raspberrypi/grub-efi.cfg b/buildroot-external/board/ovos/raspberrypi/grub-efi.cfg
index 8d9472b1..24be67ea 100644
--- a/buildroot-external/board/ovos/raspberrypi/grub-efi.cfg
+++ b/buildroot-external/board/ovos/raspberrypi/grub-efi.cfg
@@ -12,7 +12,7 @@ set menu_color_highlight=white/red
load_env
-default_cmdline="rootfstype=squashfs init=/sbin/pre-init systemd.machine_id=$MACHINE_ID fsck.repair=yes zram.enabled=1 zram.num_devices=3 console=tty1 systemd.unified_cgroup_hierarchy=1 cgroup_enable=cpuset cgroup_memory=1 $boot_condition rootwait"
+default_cmdline="rootfstype=squashfs systemd.machine_id=$MACHINE_ID fsck.repair=yes zram.enabled=1 zram.num_devices=3 console=console consoleblank=0 loglevel=0 vt.global_cursor_default=0 logo.nologo systemd.show_status=0 systemd.unified_cgroup_hierarchy=1 cgroup_enable=cpuset cgroup_memory=1 $boot_condition rootwait quiet splash"
file_env -f ($root)/cmdline.txt cmdline
regexp --set 1:boothd (.+),.+ ${root}
diff --git a/buildroot-external/board/ovos/raspberrypi/rpi4/genimage-rpi4.cfg b/buildroot-external/board/ovos/raspberrypi/rpi4/genimage-rpi4.cfg
index 302ee52d..52d25bf3 100644
--- a/buildroot-external/board/ovos/raspberrypi/rpi4/genimage-rpi4.cfg
+++ b/buildroot-external/board/ovos/raspberrypi/rpi4/genimage-rpi4.cfg
@@ -23,6 +23,14 @@ image overlayfs.ext4 {
ext4 {
use-mke2fs = "true"
}
+ size = 256M
+}
+
+image homefs.ext4 {
+ name = "homefs"
+ ext4 {
+ use-mke2fs = "true"
+ }
size = 64M
}
@@ -58,4 +66,10 @@ image disk.img {
partition-type-uuid = 0fc63daf-8483-4772-8e79-3d69d8477de4
image = "overlayfs.ext4"
}
+
+ partition homefs {
+ partition-uuid = ba3c2691-cce9-4963-b773-42c440c235ec
+ partition-type-uuid = 0fc63daf-8483-4772-8e79-3d69d8477de4
+ image = "homefs.ext4"
+ }
}
diff --git a/buildroot-external/configs/ova_64_defconfig b/buildroot-external/configs/ova_64_defconfig
index 1ca0dd5d..b5c88392 100644
--- a/buildroot-external/configs/ova_64_defconfig
+++ b/buildroot-external/configs/ova_64_defconfig
@@ -13,9 +13,7 @@ BR2_TARGET_GENERIC_HOSTNAME="OpenVoiceOS"
BR2_TARGET_GENERIC_ISSUE="Welcome to OpenVoiceOS"
BR2_TARGET_GENERIC_PASSWD_SHA512=y
BR2_INIT_SYSTEMD=y
-# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
BR2_SYSTEM_BIN_SH_BASH=y
-# BR2_TARGET_GENERIC_GETTY is not set
# BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW is not set
BR2_SYSTEM_DHCP="eth0"
# BR2_ENABLE_LOCALE_PURGE is not set
@@ -366,21 +364,15 @@ BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y
BR2_PACKAGE_WPA_SUPPLICANT_DBUS=y
BR2_PACKAGE_CATATONIT=y
BR2_PACKAGE_FILE=y
+BR2_PACKAGE_GNUPG=y
BR2_PACKAGE_SCREEN=y
BR2_PACKAGE_TIME=y
BR2_PACKAGE_TINI=y
BR2_PACKAGE_WHICH=y
BR2_PACKAGE_ACL=y
BR2_PACKAGE_AUDIT=y
-BR2_PACKAGE_BUILDAH=y
BR2_PACKAGE_COREUTILS=y
-BR2_PACKAGE_DOCKER_CLI_BUILDX=y
-BR2_PACKAGE_DOCKER_COMPOSE=y
-BR2_PACKAGE_DOCKER_ENGINE=y
-BR2_PACKAGE_DOCKER_ENGINE_EXPERIMENTAL=y
-BR2_PACKAGE_DOCKER_ENGINE_DRIVER_BTRFS=y
-BR2_PACKAGE_DOCKER_ENGINE_DRIVER_DEVICEMAPPER=y
-BR2_PACKAGE_DOCKER_ENGINE_DRIVER_VFS=y
+BR2_PACKAGE_COREUTILS_INDIVIDUAL_BINARIES=y
BR2_PACKAGE_EFIBOOTMGR=y
BR2_PACKAGE_HTOP=y
BR2_PACKAGE_OPENVMTOOLS=y
@@ -403,13 +395,16 @@ BR2_PACKAGE_SYSTEMD_FIRSTBOOT=y
BR2_PACKAGE_SYSTEMD_HIBERNATE=y
# BR2_PACKAGE_SYSTEMD_HWDB is not set
BR2_PACKAGE_SYSTEMD_LOGIND=y
+BR2_PACKAGE_SYSTEMD_MACHINED=y
BR2_PACKAGE_SYSTEMD_OOMD=y
+BR2_PACKAGE_SYSTEMD_POLKIT=y
BR2_PACKAGE_SYSTEMD_RANDOMSEED=y
BR2_PACKAGE_SYSTEMD_REPART=y
BR2_PACKAGE_SYSTEMD_RFKILL=y
# BR2_PACKAGE_SYSTEMD_VCONSOLE is not set
BR2_PACKAGE_SYSTEMD_BOOTCHART=y
BR2_PACKAGE_TAR=y
+BR2_PACKAGE_UTIL_LINUX_BINARIES=y
BR2_PACKAGE_UTIL_LINUX_HWCLOCK=y
BR2_PACKAGE_UTIL_LINUX_KILL=y
BR2_PACKAGE_UTIL_LINUX_LOGGER=y
@@ -417,8 +412,9 @@ BR2_PACKAGE_UTIL_LINUX_LOGIN=y
BR2_PACKAGE_UTIL_LINUX_LSMEM=y
BR2_PACKAGE_UTIL_LINUX_MESG=y
BR2_PACKAGE_UTIL_LINUX_MORE=y
-BR2_PACKAGE_UTIL_LINUX_NOLOGIN=y
+BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y
BR2_PACKAGE_UTIL_LINUX_PARTX=y
+BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y
BR2_PACKAGE_UTIL_LINUX_SU=y
BR2_PACKAGE_UTIL_LINUX_SULOGIN=y
BR2_PACKAGE_UTIL_LINUX_SWITCH_ROOT=y
@@ -439,6 +435,6 @@ BR2_PACKAGE_HOST_GENIMAGE=y
BR2_PACKAGE_HOST_MKPASSWD=y
BR2_PACKAGE_HOST_MTOOLS=y
BR2_PACKAGE_HOST_PKGCONF=y
-BR2_PACKAGE_GROWDISK_SERVICE=y
BR2_PACKAGE_HOSTNAME_SERVICE=y
BR2_PACKAGE_NCPAMIXER=y
+BR2_PACKAGE_OVOS_SPLASH=y
diff --git a/buildroot-external/configs/rpi4_64_defconfig b/buildroot-external/configs/rpi4_64_defconfig
index 6258fc84..0c88c86f 100644
--- a/buildroot-external/configs/rpi4_64_defconfig
+++ b/buildroot-external/configs/rpi4_64_defconfig
@@ -14,9 +14,7 @@ BR2_TARGET_GENERIC_HOSTNAME="OpenVoiceOS"
BR2_TARGET_GENERIC_ISSUE="Welcome to OpenVoiceOS"
BR2_TARGET_GENERIC_PASSWD_SHA512=y
BR2_INIT_SYSTEMD=y
-# BR2_TARGET_ENABLE_ROOT_LOGIN is not set
BR2_SYSTEM_BIN_SH_BASH=y
-# BR2_TARGET_GENERIC_GETTY is not set
# BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW is not set
BR2_SYSTEM_DHCP="eth0"
# BR2_ENABLE_LOCALE_PURGE is not set
@@ -349,21 +347,15 @@ BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y
BR2_PACKAGE_WPA_SUPPLICANT_DBUS=y
BR2_PACKAGE_CATATONIT=y
BR2_PACKAGE_FILE=y
+BR2_PACKAGE_GNUPG=y
BR2_PACKAGE_SCREEN=y
BR2_PACKAGE_TIME=y
BR2_PACKAGE_TINI=y
BR2_PACKAGE_WHICH=y
BR2_PACKAGE_ACL=y
BR2_PACKAGE_AUDIT=y
-BR2_PACKAGE_BUILDAH=y
BR2_PACKAGE_COREUTILS=y
-BR2_PACKAGE_DOCKER_CLI_BUILDX=y
-BR2_PACKAGE_DOCKER_COMPOSE=y
-BR2_PACKAGE_DOCKER_ENGINE=y
-BR2_PACKAGE_DOCKER_ENGINE_EXPERIMENTAL=y
-BR2_PACKAGE_DOCKER_ENGINE_DRIVER_BTRFS=y
-BR2_PACKAGE_DOCKER_ENGINE_DRIVER_DEVICEMAPPER=y
-BR2_PACKAGE_DOCKER_ENGINE_DRIVER_VFS=y
+BR2_PACKAGE_COREUTILS_INDIVIDUAL_BINARIES=y
BR2_PACKAGE_EFIBOOTMGR=y
BR2_PACKAGE_HTOP=y
BR2_PACKAGE_OPENVMTOOLS=y
@@ -386,13 +378,16 @@ BR2_PACKAGE_SYSTEMD_FIRSTBOOT=y
BR2_PACKAGE_SYSTEMD_HIBERNATE=y
# BR2_PACKAGE_SYSTEMD_HWDB is not set
BR2_PACKAGE_SYSTEMD_LOGIND=y
+BR2_PACKAGE_SYSTEMD_MACHINED=y
BR2_PACKAGE_SYSTEMD_OOMD=y
+BR2_PACKAGE_SYSTEMD_POLKIT=y
BR2_PACKAGE_SYSTEMD_RANDOMSEED=y
BR2_PACKAGE_SYSTEMD_REPART=y
BR2_PACKAGE_SYSTEMD_RFKILL=y
# BR2_PACKAGE_SYSTEMD_VCONSOLE is not set
BR2_PACKAGE_SYSTEMD_BOOTCHART=y
BR2_PACKAGE_TAR=y
+BR2_PACKAGE_UTIL_LINUX_BINARIES=y
BR2_PACKAGE_UTIL_LINUX_HWCLOCK=y
BR2_PACKAGE_UTIL_LINUX_KILL=y
BR2_PACKAGE_UTIL_LINUX_LOGGER=y
@@ -400,8 +395,9 @@ BR2_PACKAGE_UTIL_LINUX_LOGIN=y
BR2_PACKAGE_UTIL_LINUX_LSMEM=y
BR2_PACKAGE_UTIL_LINUX_MESG=y
BR2_PACKAGE_UTIL_LINUX_MORE=y
-BR2_PACKAGE_UTIL_LINUX_NOLOGIN=y
+BR2_PACKAGE_UTIL_LINUX_MOUNTPOINT=y
BR2_PACKAGE_UTIL_LINUX_PARTX=y
+BR2_PACKAGE_UTIL_LINUX_PIVOT_ROOT=y
BR2_PACKAGE_UTIL_LINUX_SU=y
BR2_PACKAGE_UTIL_LINUX_SULOGIN=y
BR2_PACKAGE_UTIL_LINUX_SWITCH_ROOT=y
@@ -421,9 +417,9 @@ BR2_PACKAGE_HOST_GENIMAGE=y
BR2_PACKAGE_HOST_MKPASSWD=y
BR2_PACKAGE_HOST_MTOOLS=y
BR2_PACKAGE_HOST_PKGCONF=y
-BR2_PACKAGE_GROWDISK_SERVICE=y
BR2_PACKAGE_HOSTNAME_SERVICE=y
BR2_PACKAGE_NCPAMIXER=y
+BR2_PACKAGE_OVOS_SPLASH=y
BR2_PACKAGE_RESPEAKER=y
BR2_PACKAGE_USERLAND_TOOLS=y
BR2_PACKAGE_VOCALFUSION=y
diff --git a/buildroot-external/rootfs-overlay/etc/pam.d/login b/buildroot-external/rootfs-overlay/etc/pam.d/login
deleted file mode 100644
index 43ad2e4b..00000000
--- a/buildroot-external/rootfs-overlay/etc/pam.d/login
+++ /dev/null
@@ -1,13 +0,0 @@
-auth required pam_unix.so nullok
-
-account required pam_unix.so
-
-password required pam_unix.so nullok
-
-# session required pam_selinux.so close
-session required pam_limits.so
-session required pam_env.so
-session required pam_unix.so
-session optional pam_lastlog.so
--session optional pam_systemd.so
-# session required pam_selinux.so open
diff --git a/buildroot-external/rootfs-overlay/etc/pam.d/other b/buildroot-external/rootfs-overlay/etc/pam.d/other
new file mode 100644
index 00000000..c1f72965
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/etc/pam.d/other
@@ -0,0 +1,6 @@
+# This file is part of systemd.
+
+auth include system-auth
+account include system-auth
+password include system-auth
+session include system-auth
diff --git a/buildroot-external/rootfs-overlay/etc/pam.d/system-auth b/buildroot-external/rootfs-overlay/etc/pam.d/system-auth
new file mode 100644
index 00000000..c2d62409
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/etc/pam.d/system-auth
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+
+# You really want to adjust this to your local distribution. If you use this
+# unmodified you are not building systems safely and securely.
+
+auth sufficient pam_unix.so
+-auth sufficient pam_systemd_home.so
+auth required pam_deny.so
+
+account required pam_nologin.so
+-account sufficient pam_systemd_home.so
+account sufficient pam_unix.so
+account required pam_permit.so
+
+-password sufficient pam_systemd_home.so
+password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok
+password required pam_deny.so
+
+-session optional pam_keyinit.so revoke
+-session optional pam_loginuid.so
+-session optional pam_systemd_home.so
+-session optional pam_systemd.so
+session required pam_unix.so
diff --git a/buildroot-external/rootfs-overlay/mnt/home/.empty b/buildroot-external/rootfs-overlay/mnt/home/.empty
new file mode 100644
index 00000000..e69de29b
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system-preset/10-ovos.preset b/buildroot-external/rootfs-overlay/usr/lib/systemd/system-preset/10-ovos.preset
index 8329ad8f..dbfad5c3 100644
--- a/buildroot-external/rootfs-overlay/usr/lib/systemd/system-preset/10-ovos.preset
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system-preset/10-ovos.preset
@@ -1,4 +1,3 @@
-enable growdisk.service
enable hostname.service
enable sshd.service
enable bluetooth.service
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/etc.mount b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/etc.mount
new file mode 100644
index 00000000..6ae570e8
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/etc.mount
@@ -0,0 +1,15 @@
+[Unit]
+Description=etc persistent partition overlay
+Requires=mnt-overlay.mount
+After=mnt-overlay.mount
+Requires=ovos-overlay.service
+After=ovos-overlay.service
+
+[Mount]
+What=/mnt/overlay/etc
+Where=/etc
+Type=none
+Options=bind
+
+[Install]
+WantedBy=ovos-bind.target
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/home.mount b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/home.mount
new file mode 100644
index 00000000..e7fe8a24
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/home.mount
@@ -0,0 +1,15 @@
+[Unit]
+Description=home persistent partition overlay
+Requires=mnt-home.mount
+After=mnt-home.mount
+Requires=ovos-home.service
+After=ovos-home.service
+
+[Mount]
+What=/mnt/home
+Where=/home
+Type=none
+Options=bind
+
+[Install]
+WantedBy=ovos-bind.target
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/mnt-home.mount b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/mnt-home.mount
new file mode 100644
index 00000000..8e391d8c
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/mnt-home.mount
@@ -0,0 +1,17 @@
+[Unit]
+Description=OpenVoiceOS home partition
+Wants=ovos-expand.service
+DefaultDependencies=no
+After=ovos-expand.service
+Before=umount.target local-fs.target
+Conflicts=umount.target
+After=systemd-fsck@dev-disk-by\x2dpartlabel-homefs.service
+Wants=systemd-fsck@dev-disk-by\x2dpartlabel-homefs.service systemd-growfs@mnt-home.service
+
+[Mount]
+What=/dev/disk/by-partlabel/homefs
+Where=/mnt/home
+Type=ext4
+
+[Install]
+WantedBy=local-fs.target
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/mnt-overlay.mount b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/mnt-overlay.mount
new file mode 100644
index 00000000..e6ca1b4a
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/mnt-overlay.mount
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenVoiceOS overlay partition
+DefaultDependencies=no
+Before=umount.target local-fs.target
+Conflicts=umount.target
+After=systemd-fsck@dev-disk-by\x2dpartlabel-overlayfs.service
+Wants=systemd-fsck@dev-disk-by\x2dpartlabel-overlayfs.service
+
+[Mount]
+What=/dev/disk/by-partlabel/overlayfs
+Where=/mnt/overlay
+Type=ext4
+
+[Install]
+WantedBy=local-fs.target
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-bind.target b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-bind.target
new file mode 100644
index 00000000..c867a66e
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-bind.target
@@ -0,0 +1,7 @@
+[Unit]
+Description=OpenVoiceOS overlay targets
+Documentation=man:systemd.target(5)
+Before=sysinit.target
+
+[Install]
+WantedBy=multi-user.target
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-expand.service b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-expand.service
new file mode 100644
index 00000000..e14500ce
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-expand.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenVoiceOS home partition resizing
+DefaultDependencies=no
+Before=mnt-home.mount
+RefuseManualStart=true
+RefuseManualStop=true
+Requires=dev-disk-by\x2dpartlabel-homefs.device
+After=dev-disk-by\x2dpartlabel-homefs.device systemd-fsck@dev-disk-by\x2dpartlabel-homefs.service
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/ovos-expand
+
+[Install]
+WantedBy=local-fs.target
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-home.service b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-home.service
new file mode 100644
index 00000000..23bece23
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-home.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenVoiceOS overlay setup
+DefaultDependencies=no
+RefuseManualStart=true
+RefuseManualStop=true
+Before=ovos-bind.target
+After=mnt-home.mount
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/home-setup
+RemainAfterExit=true
+
+[Install]
+WantedBy=local-fs.target
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-overlay.service b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-overlay.service
new file mode 100644
index 00000000..71f3a980
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/ovos-overlay.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=OpenVoiceOS overlay setup
+DefaultDependencies=no
+RefuseManualStart=true
+RefuseManualStop=true
+Before=ovos-bind.target
+After=mnt-overlay.mount
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/overlay-setup
+RemainAfterExit=true
+
+[Install]
+WantedBy=local-fs.target
diff --git a/buildroot-external/rootfs-overlay/usr/lib/systemd/system/systemd-growfs@.service b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/systemd-growfs@.service
new file mode 100644
index 00000000..c4628655
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/lib/systemd/system/systemd-growfs@.service
@@ -0,0 +1,18 @@
+#
+# Extracted from fstab-generator
+#
+
+[Unit]
+Description=Grow File System on %f
+Documentation=man:systemd-growfs@.service(8)
+DefaultDependencies=no
+BindsTo=%i.mount
+Conflicts=shutdown.target
+After=%i.mount
+Before=shutdown.target local-fs.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-growfs %f
+TimeoutSec=0
diff --git a/buildroot-external/rootfs-overlay/usr/libexec/home-setup b/buildroot-external/rootfs-overlay/usr/libexec/home-setup
new file mode 100755
index 00000000..86c74302
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/libexec/home-setup
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# home persistent overlay
+if [ ! -d /mnt/home/mycroft ]; then
+ cp -a /home/mycroft /mnt/home/
+fi
diff --git a/buildroot-external/rootfs-overlay/usr/libexec/overlay-setup b/buildroot-external/rootfs-overlay/usr/libexec/overlay-setup
index fadc621b..05654ea3 100755
--- a/buildroot-external/rootfs-overlay/usr/libexec/overlay-setup
+++ b/buildroot-external/rootfs-overlay/usr/libexec/overlay-setup
@@ -1,17 +1,12 @@
#!/bin/sh
+# etc persistent overlay
if [ ! -d /mnt/overlay/etc ]; then
mkdir -p /mnt/overlay/etc
- cp -a /etc /mnt/overlay/etc
+ cp -a /etc/* /mnt/overlay/etc/
fi
+# root home directory
if [ ! -d /mnt/overlay/root ]; then
mkdir -p /mnt/overlay/root
- cp -a /root /mnt/overlay/root
fi
-
-if [ ! -d /mnt/overlay/home ]; then
- mkdir -p /mnt/overlay/home
- cp -a /home /mnt/overlay/home
-fi
-
diff --git a/buildroot-external/rootfs-overlay/usr/libexec/ovos-expand b/buildroot-external/rootfs-overlay/usr/libexec/ovos-expand
new file mode 100755
index 00000000..c61c9866
--- /dev/null
+++ b/buildroot-external/rootfs-overlay/usr/libexec/ovos-expand
@@ -0,0 +1,42 @@
+#!/bin/bash
+#
+# Credits to hassos-expand original script
+# https://github.com/home-assistant/operating-system/
+
+DEVICE_HOMEFS="$(findfs PARTUUID=ba3c2691-cce9-4963-b773-42c440c235ec)"
+DEVICE_HOMEFS_NAME="$(basename "${DEVICE_HOMEFS}")"
+DEVICE="/dev/$(lsblk -no pkname "${DEVICE_HOMEFS}")"
+PART_NUM="$(cat "/sys/class/block/${DEVICE_HOMEFS_NAME}/partition")"
+PART_TABLE="$(sfdisk -lqJ "${DEVICE}")"
+
+if sfdisk --verify "${DEVICE}" 2>&1 | grep "The backup GPT table is not on the end of the device."; then
+ echo "[INFO] Moving GPT backup header to the end"
+ sfdisk --relocate gpt-bak-std "${DEVICE}"
+
+ # Reload partition label to get correct .partitiontable.lastlba
+ PART_TABLE="$(sfdisk -lqJ "${DEVICE}")"
+fi
+LAST_USABLE_LBA="$(echo "${PART_TABLE}" | jq -r '.partitiontable.lastlba')"
+
+echo "[INFO] Last usable logical block ${LAST_USABLE_LBA}"
+
+JQ_FILTER=".partitiontable.partitions[] | select ( .node == \"${DEVICE_OVERLAYFS}\" ) | .start + .size"
+HOMEFS_PARTITION_END="$(echo "${PART_TABLE}" | jq "${JQ_FILTER}")"
+echo "[INFO] homefs partition end block ${HOMEFS_PARTITION_END}"
+
+UNUSED_BLOCKS=$(( LAST_USABLE_LBA - DATA_PARTITION_END ))
+if [ "${UNUSED_BLOCKS}" -le "16384" ]; then
+ echo "[INFO] No resize of homefs partition needed"
+ exit 0
+fi
+
+echo "[INFO] Update homefs partition ${PART_NUM}"
+echo ", +" | sfdisk --no-reread --no-tell-kernel -N "${PART_NUM}" "${DEVICE}"
+sfdisk -V "${DEVICE}"
+partx -u "${DEVICE}"
+udevadm settle
+partprobe "${DEVICE}"
+
+echo "[INFO] Resizing the homefs partition"
+resize2fs "${DEVICE_HOMEFS}"
+echo "[OK]"