parent
bdd1161a51
commit
e99da83d3f
@ -0,0 +1,119 @@
|
||||
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(+)
|
||||
|
||||
diff --git a/src/libcalamares/partition/Mount.cpp b/src/libcalamares/partition/Mount.cpp
|
||||
index 03b776f4be..e4c3d06b94 100644
|
||||
--- a/src/libcalamares/partition/Mount.cpp
|
||||
+++ b/src/libcalamares/partition/Mount.cpp
|
||||
@@ -84,6 +84,15 @@ unmount( const QString& path, const QStringList& options )
|
||||
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;
|
||||
diff --git a/src/libcalamares/partition/Mount.h b/src/libcalamares/partition/Mount.h
|
||||
index 3781c4feb2..e197594a1d 100644
|
||||
--- a/src/libcalamares/partition/Mount.h
|
||||
+++ b/src/libcalamares/partition/Mount.h
|
||||
@@ -51,6 +51,13 @@ DLLEXPORT int mount( const QString& devicePath,
|
||||
*/
|
||||
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
|
||||
*
|
||||
|
||||
From f6fc0d19493afbb084f57f81e451c9f0d0844281 Mon Sep 17 00:00:00 2001
|
||||
From: Simon Quigley <simon@tsimonq2.net>
|
||||
Date: Fri, 22 Nov 2024 19:38:15 -0600
|
||||
Subject: [PATCH 2/2] [umount] After unmounting partitions, close any encrypted
|
||||
partitions that are still open
|
||||
|
||||
---
|
||||
src/modules/umount/UmountJob.cpp | 41 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 41 insertions(+)
|
||||
|
||||
diff --git a/src/modules/umount/UmountJob.cpp b/src/modules/umount/UmountJob.cpp
|
||||
index 1e207d9eae..8cc8796ac9 100644
|
||||
--- a/src/modules/umount/UmountJob.cpp
|
||||
+++ b/src/modules/umount/UmountJob.cpp
|
||||
@@ -93,6 +93,38 @@ unmountTargetMounts( const QString& rootMountPoint )
|
||||
return Calamares::JobResult::ok();
|
||||
}
|
||||
|
||||
+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()
|
||||
{
|
||||
@@ -152,6 +184,15 @@ UmountJob::exec()
|
||||
}
|
||||
}
|
||||
|
||||
+ // For encrypted systems, close the partitions
|
||||
+ {
|
||||
+ auto r = unmountEncryptedPartitions( gs->value("partitions").toList() );
|
||||
+ if ( !r )
|
||||
+ {
|
||||
+ return r;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
// For ZFS systems, export the pools
|
||||
{
|
||||
auto r = exportZFSPools();
|
Loading…
Reference in new issue