Set up crypttab for encrypted dump target

Resolves: RHEL-11196
Signed-off-by: Coiby Xu <coxu@redhat.com>
This commit is contained in:
Coiby Xu 2025-10-13 12:22:50 +08:00
parent c98f400649
commit e48fe3aa5f
4 changed files with 357 additions and 1 deletions

84
0005.patch Normal file
View File

@ -0,0 +1,84 @@
From: Coiby Xu <coiby.xu@gmail.com>
Subject: Check /usr/bin/systemctl instead of /systemctl
Relates: https://issues.redhat.com/browse/RHEL-29039
Conflict: None
commit 067afd2904bb77d3f87b241506216eae98e111c0
Author: Coiby Xu <coiby.xu@gmail.com>
Date: Wed Aug 13 12:06:33 2025 +0800
Check /usr/bin/systemctl instead of /systemctl
The early patch checks sysroot/systemctl by mistake. Fix it.
Fixes: 25c549c ("Handle the case where systemd isn't installed")
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
diff --git a/com_redhat_kdump/service/installation.py b/com_redhat_kdump/service/installation.py
index 1e0096aa5edb6c054228ff9eec9cc528731c7ed3..aae58c173cc4e879a2ff772417eb17fd8ca29864 100644
--- a/com_redhat_kdump/service/installation.py
+++ b/com_redhat_kdump/service/installation.py
@@ -17,7 +17,6 @@
#
import logging
import os
-import shutil
from pyanaconda.core import util
from pyanaconda.modules.common.constants.objects import BOOTLOADER
@@ -143,7 +142,7 @@ class KdumpInstallationTask(Task):
# Anaconda may be used to create minimal container image which doesn't
# have systemd installed
# https://issues.redhat.com/browse/RHEL-41082?focusedId=26969576&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-26969576
- if not shutil.which(self._sysroot + "/systemctl"):
+ if not os.path.exists(self._sysroot + "/usr/bin/systemctl"):
log.debug("systemd not installed, skip KdumpInstallationTask")
return
diff --git a/test/unit_tests/test_installation.py b/test/unit_tests/test_installation.py
index 43f51669303c147d6528728f26a4d8ffca2a103a..e0d4109ad2fd9996c62a7c746e558fc09f1f5315 100644
--- a/test/unit_tests/test_installation.py
+++ b/test/unit_tests/test_installation.py
@@ -181,9 +181,9 @@ class KdumpInstallationTestCase(TestCase):
assert mock_exec.call_count == 2
@patch("com_redhat_kdump.service.installation.util")
- @patch("shutil.which")
- def test_installation_kdump_disabled(self, mock_shutil, mock_util):
- mock_shutil.return_value = True
+ @patch("os.path.exists")
+ def test_installation_kdump_disabled(self, mock_os_path, mock_util):
+ mock_os_path.return_value = True
task = KdumpInstallationTask(
sysroot="/mnt/sysroot",
kdump_enabled=False
@@ -196,9 +196,9 @@ class KdumpInstallationTestCase(TestCase):
)
@patch("com_redhat_kdump.service.installation.util")
- @patch("shutil.which")
- def test_installation_kdump_enabled(self, mock_shutil, mock_util):
- mock_shutil.return_value = True
+ @patch("os.path.exists")
+ def test_installation_kdump_enabled(self, mock_os_path, mock_util):
+ mock_os_path.return_value = True
task = KdumpInstallationTask(
sysroot="/mnt/sysroot",
kdump_enabled=True
@@ -211,9 +211,9 @@ class KdumpInstallationTestCase(TestCase):
)
@patch("com_redhat_kdump.service.installation.util")
- @patch("shutil.which")
- def test_installation_kdump_disable_no_systemctl(self, mock_shutil, mock_util):
- mock_shutil.return_value = False
+ @patch("os.path.exists")
+ def test_installation_kdump_disable_no_systemctl(self, mock_os_path, mock_util):
+ mock_os_path.return_value = False
task = KdumpInstallationTask(
sysroot="/mnt/sysroot",
kdump_enabled=False

202
0006.patch Normal file
View File

@ -0,0 +1,202 @@
From: Coiby Xu <coiby.xu@gmail.com>
Subject: Call kdumpctl setup-crypttab so kdump will work on boot for encrypted dump target
Resolves: https://issues.redhat.com/browse/RHEL-29039
Conflict: None
commit 181815c59574005582e4ff769e50638f4a0e0214
Author: Coiby Xu <coiby.xu@gmail.com>
Date: Wed Sep 17 14:59:29 2025 +0800
Call kdumpctl setup-crypttab so kdump will work on boot for encrypted dump target
Resolves: https://issues.redhat.com/browse/RHEL-29039
Call "kdumpctl setup-crypttab" to set up /etc/crypttab so the volume
keys can be passed to the crash kernel.
Note Anaconda writes to /etc/crypttab at "Early storage configuration"
phase. So we set up /etc/crypttab at "Anaconda addon configuration"
phase which happens before Anaconda generates initramfs. So the updated
crypttab will be built into the initramfs.
01:52:19,877 INF installation: Queue started: Early storage configuration (3/18)
...
...
01:56:17,041 INF installation: Queue started: Anaconda addon configuration (15/18)
01:56:17,044 INF installation: Queue started: Initramfs generation (16/18)
One benefit of setting up crypttab via kdump is "kdumpctl setup-crypttab" will
continue only the dumping target is truly encrypted and the logic to
detect encrypted dumping target is already there.
After all architectures supports encrypted dump target, the current
implementing of detecting if any volume has been encrypted which may not
necessary be a dump target can be dropped.
Assisted-by: Claude Code
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
diff --git a/com_redhat_kdump/service/installation.py b/com_redhat_kdump/service/installation.py
index aae58c173cc4e879a2ff772417eb17fd8ca29864..9f65a81e50037212559553882de425c91f5fb6f8 100644
--- a/com_redhat_kdump/service/installation.py
+++ b/com_redhat_kdump/service/installation.py
@@ -29,7 +29,7 @@ from com_redhat_kdump.common import getLuksDevices
log = logging.getLogger(__name__)
-__all__ = ["KdumpBootloaderConfigurationTask", "KdumpInstallationTask"]
+__all__ = ["KdumpBootloaderConfigurationTask", "KdumpInstallationTask", "KdumpCrypttabSetupTask"]
class KdumpBootloaderConfigurationTask(Task):
@@ -156,3 +156,40 @@ class KdumpInstallationTask(Task):
[systemctl_action, "kdump.service"],
root=self._sysroot
)
+
+
+class KdumpCrypttabSetupTask(Task):
+ """The task for setting up crypttab for kdump."""
+
+ def __init__(self, sysroot):
+ """Create a task."""
+ super().__init__()
+ self._sysroot = sysroot
+
+ @property
+ def name(self):
+ return "Setup crypttab for kdump"
+
+ def _has_setup_crypttab_command(self):
+ """Check if kdumpctl has setup-crypttab subcommand by checking help output."""
+ try:
+ help_output = util.execWithCapture("kdumpctl", ["help"], root=self._sysroot)
+ return "setup-crypttab" in help_output
+ except FileNotFoundError:
+ log.debug("kdumpctl command not found")
+ return False
+ except Exception as e:
+ log.warning("Failed to check kdumpctl help: %s", e)
+ return False
+
+ def run(self):
+ """Run the task."""
+ if not self._has_setup_crypttab_command():
+ log.debug("kdumpctl setup-crypttab command not available, skipping")
+ return
+
+ try:
+ util.execWithRedirect("kdumpctl", ["setup-crypttab"], root=self._sysroot)
+ log.debug("Successfully executed kdumpctl setup-crypttab")
+ except Exception as e:
+ log.warning("Failed to execute kdumpctl setup-crypttab: %s", e)
diff --git a/com_redhat_kdump/service/kdump.py b/com_redhat_kdump/service/kdump.py
index 8356d193e58000b35cb807e75862f34f1d845ffb..cecbfc3ec6ae34ab9602809091398b3f64917589 100755
--- a/com_redhat_kdump/service/kdump.py
+++ b/com_redhat_kdump/service/kdump.py
@@ -26,7 +26,7 @@ from pyanaconda.modules.common.structures.requirement import Requirement
from com_redhat_kdump.common import getMemoryBounds
from com_redhat_kdump.constants import KDUMP
-from com_redhat_kdump.service.installation import KdumpBootloaderConfigurationTask, KdumpInstallationTask
+from com_redhat_kdump.service.installation import KdumpBootloaderConfigurationTask, KdumpInstallationTask, KdumpCrypttabSetupTask
from com_redhat_kdump.service.kdump_interface import KdumpInterface
from com_redhat_kdump.service.kickstart import KdumpKickstartSpecification
@@ -137,13 +137,22 @@ class KdumpService(KickstartService):
:return: a list of tasks
"""
- return [
+ tasks = [
KdumpInstallationTask(
sysroot=conf.target.system_root,
kdump_enabled=self.kdump_enabled,
)
]
+ if self.kdump_enabled:
+ tasks.append(
+ KdumpCrypttabSetupTask(
+ sysroot=conf.target.system_root
+ )
+ )
+
+ return tasks
+
def configure_bootloader_with_tasks(self, kernels):
return [
KdumpBootloaderConfigurationTask(
diff --git a/test/unit_tests/test_installation.py b/test/unit_tests/test_installation.py
index e0d4109ad2fd9996c62a7c746e558fc09f1f5315..8bff6059db4a5ba926cbd70f8df852ec854aaf34 100644
--- a/test/unit_tests/test_installation.py
+++ b/test/unit_tests/test_installation.py
@@ -1,7 +1,7 @@
from unittest.case import TestCase
from unittest.mock import patch
from com_redhat_kdump.constants import FADUMP_CAPABLE_FILE
-from com_redhat_kdump.service.installation import KdumpBootloaderConfigurationTask, KdumpInstallationTask
+from com_redhat_kdump.service.installation import KdumpBootloaderConfigurationTask, KdumpInstallationTask, KdumpCrypttabSetupTask
SYSROOT = "/sysroot"
@@ -220,3 +220,55 @@ class KdumpInstallationTestCase(TestCase):
)
task.run()
mock_util.execWithRedirect.assert_not_called()
+
+ @patch("pyanaconda.core.util.execWithCapture")
+ def test_crypttab_setup_check_help_with_setup_crypttab(self, mock_exec):
+ mock_exec.return_value = "setup-crypttab Setup crypttab for kdump"
+ task = KdumpCrypttabSetupTask(sysroot="/mnt/sysroot")
+ result = task._has_setup_crypttab_command()
+ mock_exec.assert_called_once_with("kdumpctl", ["help"], root="/mnt/sysroot")
+ assert result is True
+
+ @patch("pyanaconda.core.util.execWithCapture")
+ def test_crypttab_setup_check_help_without_setup_crypttab(self, mock_exec):
+ mock_exec.return_value = "start Start kdump\nstop Stop kdump"
+ task = KdumpCrypttabSetupTask(sysroot="/mnt/sysroot")
+ result = task._has_setup_crypttab_command()
+ mock_exec.assert_called_once_with("kdumpctl", ["help"], root="/mnt/sysroot")
+ assert result is False
+
+ @patch("pyanaconda.core.util.execWithCapture")
+ def test_crypttab_setup_check_help_kdumpctl_not_found(self, mock_exec):
+ mock_exec.side_effect = FileNotFoundError()
+ task = KdumpCrypttabSetupTask(sysroot="/mnt/sysroot")
+ result = task._has_setup_crypttab_command()
+ mock_exec.assert_called_once_with("kdumpctl", ["help"], root="/mnt/sysroot")
+ assert result is False
+
+ @patch("pyanaconda.core.util.execWithRedirect")
+ @patch("com_redhat_kdump.service.installation.KdumpCrypttabSetupTask._has_setup_crypttab_command")
+ def test_crypttab_setup_run_with_command_available(self, mock_has_command, mock_exec):
+ mock_has_command.return_value = True
+ task = KdumpCrypttabSetupTask(sysroot="/mnt/sysroot")
+ task.run()
+ mock_has_command.assert_called_once()
+ mock_exec.assert_called_once_with("kdumpctl", ["setup-crypttab"], root="/mnt/sysroot")
+
+ @patch("pyanaconda.core.util.execWithRedirect")
+ @patch("com_redhat_kdump.service.installation.KdumpCrypttabSetupTask._has_setup_crypttab_command")
+ def test_crypttab_setup_run_without_command_available(self, mock_has_command, mock_exec):
+ mock_has_command.return_value = False
+ task = KdumpCrypttabSetupTask(sysroot="/mnt/sysroot")
+ task.run()
+ mock_has_command.assert_called_once()
+ mock_exec.assert_not_called()
+
+ @patch("pyanaconda.core.util.execWithRedirect")
+ @patch("com_redhat_kdump.service.installation.KdumpCrypttabSetupTask._has_setup_crypttab_command")
+ def test_crypttab_setup_run_execution_failure(self, mock_has_command, mock_exec):
+ mock_has_command.return_value = True
+ mock_exec.side_effect = Exception("Command failed")
+ task = KdumpCrypttabSetupTask(sysroot="/mnt/sysroot")
+ task.run()
+ mock_has_command.assert_called_once()
+ mock_exec.assert_called_once_with("kdumpctl", ["setup-crypttab"], root="/mnt/sysroot")

64
0007.patch Normal file
View File

@ -0,0 +1,64 @@
From: Coiby Xu <coiby.xu@gmail.com>
Subject: Don't emit ENCRYPTION_WARNING for x86_64
Resolves: https://issues.redhat.com/browse/RHEL-29039
Conflict: None
commit a6c2cf4313e937e1ff43d6907c9df445f982e0ef
Author: Coiby Xu <coiby.xu@gmail.com>
Date: Wed Sep 17 09:43:55 2025 +0800
Don't emit ENCRYPTION_WARNING for x86_64
Resolves: https://issues.redhat.com/browse/RHEL-29039
x86_64 now supports encrypted dump target. There is no need for this
warning.
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
diff --git a/com_redhat_kdump/gui/spokes/kdump.py b/com_redhat_kdump/gui/spokes/kdump.py
index c313f43479142d23c94e74bc329d8f3af70dc0c4..1339cff1713a23136ec8382dd702309ba6af55b0 100644
--- a/com_redhat_kdump/gui/spokes/kdump.py
+++ b/com_redhat_kdump/gui/spokes/kdump.py
@@ -31,6 +31,7 @@ from pyanaconda.ui.categories.system import SystemCategory
from pyanaconda.ui.gui.spokes import NormalSpoke
from pyanaconda.ui.gui.utils import fancy_set_sensitive
from pyanaconda.ui.communication import hubQ
+import blivet.arch
from com_redhat_kdump.i18n import _, N_
from com_redhat_kdump.constants import FADUMP_CAPABLE_FILE, KDUMP, ENCRYPTION_WARNING
@@ -135,7 +136,7 @@ class KdumpSpoke(NormalSpoke):
self._enableButton.emit("toggled")
self.clear_info()
- if self._luks_devs:
+ if self._luks_devs and blivet.arch.get_arch() != "x86_64":
self.set_warning(_(ENCRYPTION_WARNING))
def apply(self):
diff --git a/com_redhat_kdump/service/kdump.py b/com_redhat_kdump/service/kdump.py
index cecbfc3ec6ae34ab9602809091398b3f64917589..33d329089fb4e6ea76947f90815bd01ea25c8980 100755
--- a/com_redhat_kdump/service/kdump.py
+++ b/com_redhat_kdump/service/kdump.py
@@ -29,6 +29,7 @@ from com_redhat_kdump.constants import KDUMP
from com_redhat_kdump.service.installation import KdumpBootloaderConfigurationTask, KdumpInstallationTask, KdumpCrypttabSetupTask
from com_redhat_kdump.service.kdump_interface import KdumpInterface
from com_redhat_kdump.service.kickstart import KdumpKickstartSpecification
+import blivet.arch
log = logging.getLogger(__name__)
@@ -144,7 +145,7 @@ class KdumpService(KickstartService):
)
]
- if self.kdump_enabled:
+ if self.kdump_enabled and blivet.arch.get_arch() == "x86_64":
tasks.append(
KdumpCrypttabSetupTask(
sysroot=conf.target.system_root

View File

@ -4,7 +4,7 @@
Name: kdump-anaconda-addon
Version: 006
Release: 15.%{snapshotdate}git%{gitshortcommit}%{?dist}
Release: 16.%{snapshotdate}git%{gitshortcommit}%{?dist}
Url: https://github.com/daveyoung/kdump-anaconda-addon
License: GPLv2
Summary: Kdump configuration anaconda addon
@ -23,6 +23,9 @@ Patch1: 0001.patch
Patch2: 0002.patch
Patch3: 0003.patch
Patch4: 0004.patch
Patch5: 0005.patch
Patch6: 0006.patch
Patch7: 0007.patch
%description
Kdump anaconda addon
@ -46,6 +49,9 @@ Kdump anaconda addon
%{_datadir}/icons/hicolor/scalable/apps/kdump.svg
%changelog
* Mon Oct 13 2025 Coiby Xu <coxu@redhat.com> - 006-16.20220128git9603258
- Feature: Set up crypttab
* Tue Apr 29 2025 Coiby Xu <coxu@redhat.com> - 006-15.20220128git9603258
- Handle the case where systemd isn't installed (RHEL-86873)