coredump-config: Add config to manager Coredumps
By default it should be in tempfs instead of journal now. If there are
eMMC, then the coredump will be store in the eMMC. During transition,
the coredump are migrate between eMMC and tempfs.
Enable coredump-config by default and will set the coredump to tempffs.
If there are eMMC available, then the coredump is saved in the eMMC.
Google-Bug-Id: 318749470
Tested: N/A
Change-Id: Ibdcbc7eb878a147c3b58f56faa7da591b7098803
Signed-off-by: Willy Tu <wltu@google.com>
(cherry picked from commit f8343a29c742609cc8bc51e9fa5c3018a7601cbd)
diff --git a/recipes-google/coredump-config/coredump-config.bb b/recipes-google/coredump-config/coredump-config.bb
new file mode 100644
index 0000000..49e5c30
--- /dev/null
+++ b/recipes-google/coredump-config/coredump-config.bb
@@ -0,0 +1,40 @@
+DESCRIPTION = "Configures coredump to write to eMMC persistent storage."
+PR = "r1"
+LICENSE = "CLOSED"
+inherit systemd
+
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+RDEPENDS:${PN}:append = " bash"
+
+SRC_URI:append = " \
+ file://coredump-config.sh \
+ file://emmc-coredump-config.conf \
+ file://tmpfs-coredump-config.conf \
+ file://bootup-coredump-config.service \
+ file://coredump-config.service \
+"
+
+S = "${WORKDIR}"
+
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_SERVICE:${PN} += "bootup-coredump-config.service"
+SYSTEMD_SERVICE:${PN} += "coredump-config.service"
+
+FILES:${PN} += " \
+ ${systemd_unitdir}/coredump.conf.d/coredump-config.conf \
+ ${datadir}/coredump-config/emmc-coredump-config.conf \
+ ${datadir}/coredump-config/tmpfs-coredump-config.conf \
+"
+
+do_install:append() {
+ install -d ${D}${systemd_system_unitdir}
+ install -d ${D}${bindir}
+ install -m 0644 bootup-coredump-config.service ${D}${systemd_system_unitdir}
+ install -m 0644 coredump-config.service ${D}${systemd_system_unitdir}
+ install -m 0755 coredump-config.sh ${D}${bindir}
+
+ # Enable Coreump in eMMC via systemd-coredump
+ install -d ${D}${datadir}/coredump-config
+ install -m 0644 emmc-coredump-config.conf ${D}${datadir}/coredump-config
+ install -m 0644 tmpfs-coredump-config.conf ${D}${datadir}/coredump-config
+}
diff --git a/recipes-google/coredump-config/coredump-config/bootup-coredump-config.service b/recipes-google/coredump-config/coredump-config/bootup-coredump-config.service
new file mode 100644
index 0000000..ea19d11
--- /dev/null
+++ b/recipes-google/coredump-config/coredump-config/bootup-coredump-config.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Coredump location setup at bootup
+Requires=local-fs.target
+After=local-fs.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/coredump-config.sh tmpfs
+
+[Install]
+WantedBy=basic.target
diff --git a/recipes-google/coredump-config/coredump-config/coredump-config.service b/recipes-google/coredump-config/coredump-config/coredump-config.service
new file mode 100644
index 0000000..c44c349
--- /dev/null
+++ b/recipes-google/coredump-config/coredump-config/coredump-config.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=Storage management daemon for an encrypted storage device
+BindsTo=emmc-available.target
+After=emmc-available.target
+After=bootup-coredump-config.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/coredump-config.sh emmc
+ExecStop=/usr/bin/coredump-config.sh tmpfs
+
+[Install]
+WantedBy=emmc-available.target
diff --git a/recipes-google/coredump-config/coredump-config/coredump-config.sh b/recipes-google/coredump-config/coredump-config/coredump-config.sh
new file mode 100644
index 0000000..a3626ce
--- /dev/null
+++ b/recipes-google/coredump-config/coredump-config/coredump-config.sh
@@ -0,0 +1,75 @@
+#!/bin/bash
+
+MOUNTPOINT="/mnt/luks-mmcblk0_fs"
+COREDUMP_DIR="/var/lib/systemd/coredump"
+TMP_COREDUMP_DIR="/run/systemd/coredumps"
+tmpfs_mounted="false"
+
+function store_coredumps_in_tmpfs() {
+ echo "coredump-config: eMMC is not available, store coredumps in ${TMP_COREDUMP_DIR}." >&2
+
+ mkdir -p /etc/systemd/coredump.conf.d/
+ cp /usr/share/coredump-config/tmpfs-coredump-config.conf /etc/systemd/coredump.conf.d/coredump-config.conf
+
+ umount "${TMP_COREDUMP_DIR}" || true
+ mkdir -p "${COREDUMP_DIR}" "${TMP_COREDUMP_DIR}" || return
+
+ if mount | grep -q "${COREDUMP_DIR}"
+ then
+ mnt_output=$(mount | grep "${COREDUMP_DIR}")
+ fs_type=$(echo "$mnt_output" | awk '{print $5}')
+ if [[ "${fs_type}" == "tmpfs" ]]; then
+ tmpfs_mounted="true"
+ else
+ umount "${COREDUMP_DIR}" || true
+ fi
+ fi
+
+ if [[ "${tmpfs_mounted}" == "false" ]]; then
+ mount -o bind "${TMP_COREDUMP_DIR}" "${COREDUMP_DIR}" || return
+ fi
+ return
+}
+
+function store_coredumps_in_emmc() {
+ echo "coredump-config: eMMC is available, copying coredumps from ${TMP_COREDUMP_DIR} to eMMC." >&2
+
+ mkdir -p /etc/systemd/coredump.conf.d/
+ cp /usr/share/coredump-config/emmc-coredump-config.conf /etc/systemd/coredump.conf.d/coredump-config.conf
+
+ mkdir -p "${COREDUMP_DIR}" "${TMP_COREDUMP_DIR}" || return
+ mkdir -p "${MOUNTPOINT}/coredump" || return
+
+ mv -f "${TMP_COREDUMP_DIR}"/* "${MOUNTPOINT}/coredump/"
+
+ if ! mount | grep -q "${COREDUMP_DIR}"
+ then
+ mount -o bind "${TMP_COREDUMP_DIR}" "${COREDUMP_DIR}" || return
+ fi
+
+ mount -o bind "${MOUNTPOINT}/coredump" "${TMP_COREDUMP_DIR}" || return
+ return
+}
+
+if [[ "${1}" == "emmc" ]];
+then
+ echo "coredump-config: Configuring coredump path to eMMC storage." >&2
+ if ! mount | grep -q "${MOUNTPOINT}"
+ then
+ echo "coredump-config: ${MOUNTPOINT} does not exist." >&2
+ store_coredumps_in_tmpfs
+ exit
+ else
+ store_coredumps_in_emmc
+ exit
+ fi
+
+elif [[ "${1}" == "tmpfs" ]];
+then
+ store_coredumps_in_tmpfs
+ exit
+fi
+
+echo "coredump-config: Invalid command given: ${1}!" >&2
+
+exit 1
diff --git a/recipes-google/coredump-config/coredump-config/emmc-coredump-config.conf b/recipes-google/coredump-config/coredump-config/emmc-coredump-config.conf
new file mode 100644
index 0000000..1bde758
--- /dev/null
+++ b/recipes-google/coredump-config/coredump-config/emmc-coredump-config.conf
@@ -0,0 +1,3 @@
+[Coredump]
+Storage=external
+MaxUse=100M
diff --git a/recipes-google/coredump-config/coredump-config/tmpfs-coredump-config.conf b/recipes-google/coredump-config/coredump-config/tmpfs-coredump-config.conf
new file mode 100644
index 0000000..f865c84
--- /dev/null
+++ b/recipes-google/coredump-config/coredump-config/tmpfs-coredump-config.conf
@@ -0,0 +1,3 @@
+[Coredump]
+Storage=external
+MaxUse=50M
diff --git a/recipes-phosphor/images/obmc-phosphor-image.bbappend b/recipes-phosphor/images/obmc-phosphor-image.bbappend
index 974282e..ad617bd 100644
--- a/recipes-phosphor/images/obmc-phosphor-image.bbappend
+++ b/recipes-phosphor/images/obmc-phosphor-image.bbappend
@@ -1,2 +1,3 @@
OBMC_IMAGE_EXTRA_INSTALL:append:gbmc = " htop"
OBMC_IMAGE_EXTRA_INSTALL:append:gbmc = " gbmc-dump-ramoops"
+OBMC_IMAGE_EXTRA_INSTALL:append:gbmc = " coredump-config"