You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
calamares-packaging/debian/patches/unmount-encrypted-devices.p...

103 lines
3.1 KiB

From 739679ad5ab6f7a3fe1edc960fb136d557499781 Mon Sep 17 00:00:00 2001
From: Simon Quigley <simon@tsimonq2.net>
Date: Fri, 22 Nov 2024 19:36:43 -0600
Subject: [PATCH 1/2] [libcalamares] Add a closeCryptsetup function to properly
close LUKS partitions
---
src/libcalamares/partition/Mount.cpp | 9 +++++++++
src/libcalamares/partition/Mount.h | 7 +++++++
2 files changed, 16 insertions(+)
--- a/src/libcalamares/partition/Mount.cpp
+++ b/src/libcalamares/partition/Mount.cpp
@@ -84,6 +84,15 @@ unmount( const QString& path, const QStr
return r.getExitCode();
}
+int
+closeCryptsetup( const QString& luksMapperName )
+{
+ QStringList args = { "cryptsetup", "close", luksMapperName };
+ auto r = Calamares::System::runCommand( QStringList { "cryptsetup", "close", luksMapperName } , std::chrono::seconds( 10 ) );
+ sync();
+ return r.getExitCode();
+}
+
struct TemporaryMount::Private
{
QString m_devicePath;
--- a/src/libcalamares/partition/Mount.h
+++ b/src/libcalamares/partition/Mount.h
@@ -51,6 +51,13 @@ DLLEXPORT int mount( const QString& devi
*/
DLLEXPORT int unmount( const QString& path, const QStringList& options = QStringList() );
+/** @brief Use cryptsetup to close the given @p LUKS mapper name.
+ *
+ * Runs cryptsetup(8) in the host system.
+ *
+ * @returns the program's exit code
+ */
+DLLEXPORT int closeCryptsetup( const QString& luksMapperName );
/** @brief Mount and automatically unmount a device
*
--- a/src/modules/umount/UmountJob.cpp
+++ b/src/modules/umount/UmountJob.cpp
@@ -94,6 +94,38 @@ unmountTargetMounts( const QString& root
}
static Calamares::JobResult
+unmountEncryptedPartitions( const QList<QVariant>& partitions )
+{
+ // Iterate on each partition in global storage
+ for ( const auto& partition : partitions )
+ {
+ // If this partition does not have LUKS information, skip it
+ QVariantMap partitionMap = partition.toMap();
+ if ( !partitionMap.contains("luksMapperName") ) {
+ continue;
+ }
+
+ // Define the mount point and ensure it exists
+ QString luksMapperName = partitionMap.value("luksMapperName").toString();
+ QFile deviceFile(QString("/dev/mapper/%1").arg(luksMapperName));
+ if ( !deviceFile.exists() ) {
+ continue;
+ }
+
+ // Close the device
+ if ( Calamares::Partition::closeCryptsetup( luksMapperName ) )
+ {
+ return Calamares::JobResult::error(
+ QCoreApplication::translate( UmountJob::staticMetaObject.className(),
+ "Could not close encrypted partition on the target system." )
+ );
+ }
+ }
+
+ return Calamares::JobResult::ok();
+}
+
+static Calamares::JobResult
exportZFSPools()
{
auto* gs = Calamares::JobQueue::instance()->globalStorage();
@@ -149,6 +181,15 @@ UmountJob::exec()
if ( !r )
{
return r;
+ }
+ }
+
+ // For encrypted systems, close the partitions
+ {
+ auto r = unmountEncryptedPartitions( gs->value("partitions").toList() );
+ if ( !r )
+ {
+ return r;
}
}