From 158e11de1e370ab264b38c3c186ae08084ed7611 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Feb 2020 13:21:49 +0100 Subject: [PATCH 1/6] [partition] Indicate that a filesystem is new in GS --- src/modules/partition/jobs/FillGlobalStorageJob.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/partition/jobs/FillGlobalStorageJob.cpp b/src/modules/partition/jobs/FillGlobalStorageJob.cpp index 12faaf969..f779434a1 100644 --- a/src/modules/partition/jobs/FillGlobalStorageJob.cpp +++ b/src/modules/partition/jobs/FillGlobalStorageJob.cpp @@ -100,6 +100,7 @@ mapForPartition( Partition* partition, const QString& uuid ) map[ "fs" ] = untranslatedFS( dynamic_cast< FS::luks& >( partition->fileSystem() ).innerFS() ); } map[ "uuid" ] = uuid; + map[ "new" ] = partition->state() == Partition::StateNew; // Debugging for inside the loop in createPartitionList(), // so indent a bit From 1b80cf82defe1cab94d37a5436a7d350d6bc8135 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Feb 2020 21:13:37 +0100 Subject: [PATCH 2/6] [fstab] Don't add swap that wasn't made new for us --- src/modules/fstab/main.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index 4a696f46b..1c7cb2da2 100644 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -218,7 +218,6 @@ class FstabGenerator(object): else: dct = self.generate_fstab_line_info(partition) - if dct: self.print_fstab_line(dct, file=fstab_file) @@ -245,6 +244,10 @@ class FstabGenerator(object): return None if not mount_point: mount_point = "swap" + # Existing swap partitins should not be used + if filesystem == "swap" and not partition["new"]: + libcalamares.utils.debug("fstab ignoring old swap {}".format(disk_name)) + return None options = self.get_mount_options(filesystem, mount_point) From f9d9cd2df420892546d35f8dad8d8ecc376de3b0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sun, 16 Feb 2020 21:42:08 +0100 Subject: [PATCH 3/6] [fstab] Document the remapping of fs names - Shuffle the code a little so it's clear where the remapping happens, and explain why we look for "swap" in fstab and "linuxswap" elsewhere. --- src/modules/fstab/main.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index 1c7cb2da2..3581efc37 100644 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -232,14 +232,21 @@ class FstabGenerator(object): self.print_fstab_line(dct, file=fstab_file) def generate_fstab_line_info(self, partition): - """ Generates information for each fstab entry. """ + """ + Generates information (a dictionary of fstab-fields) + for the given @p partition. + """ + # Some "fs" names need special handling in /etc/fstab, so remap them. filesystem = partition["fs"].lower() + filesystem = FS_MAP.get(filesystem, filesystem) has_luks = "luksMapperName" in partition mount_point = partition["mountPoint"] disk_name = disk_name_for_partition(partition) is_ssd = disk_name in self.ssd_disks - filesystem = FS_MAP.get(filesystem, filesystem) + # Swap partitions are called "linuxswap" by parted. + # That "fs" is visible in GS, but that gets mapped + # to "swap", above, because that's the spelling needed in /etc/fstab if not mount_point and not filesystem == "swap": return None if not mount_point: From 35a2db064b1839fa949a7666c73ae172739fcf1b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Feb 2020 11:59:48 +0100 Subject: [PATCH 4/6] [partition] Make debug-logging match the functionality - `createPartitionList()` is called for the summary widget (via `prettyDescription()`), and from `exec()`. Only the latter actually *writes* to Global Storage, so it's misleading to think that the pretty-printed version ends up in GS. - This makes the "new" key useless, since by the time `exec()` is called the partitoons are no longer new. --- src/modules/partition/jobs/FillGlobalStorageJob.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/partition/jobs/FillGlobalStorageJob.cpp b/src/modules/partition/jobs/FillGlobalStorageJob.cpp index f779434a1..c96687b82 100644 --- a/src/modules/partition/jobs/FillGlobalStorageJob.cpp +++ b/src/modules/partition/jobs/FillGlobalStorageJob.cpp @@ -214,6 +214,7 @@ FillGlobalStorageJob::exec() { Calamares::GlobalStorage* storage = Calamares::JobQueue::instance()->globalStorage(); storage->insert( "partitions", createPartitionList() ); + cDebug() << "Saving partition information map to GlobalStorage[\"partitions\"]"; if ( !m_bootLoaderPath.isEmpty() ) { QVariant var = createBootLoaderMap(); @@ -237,7 +238,7 @@ FillGlobalStorageJob::createPartitionList() const { UuidForPartitionHash hash = findPartitionUuids( m_devices ); QVariantList lst; - cDebug() << "Writing to GlobalStorage[\"partitions\"]"; + cDebug() << "Building partition information map"; for ( auto device : m_devices ) { cDebug() << Logger::SubEntry << "partitions on" << device->deviceNode(); From 5247c13f9870ab2711a3cf9566edd206c4ee06f9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Feb 2020 12:07:18 +0100 Subject: [PATCH 5/6] [partition] Follow 'claimed' settings for claiming swap - By the time the GS is actually written, new (for partition state) is always false. So "new" is the wrong thing to track. It should have had a better name anyway, - We store custom properties on the partition objects to indicate what happens to them; use those properties (instead of state, as done originally), call it "claimed" to indicate that the partition is part of this installation. For now, only new (as in, formatted, created-by-us) partitions are claimed. - The effect here is that only "new" swap will be added to the system, so in erase-disk installations, or manual partitioning. - Install-alongside and replace will now **not** claim the swap already on the disk; I think we'll need another UI knob for that one. FIXES #1316 --- src/modules/fstab/main.py | 6 +++--- src/modules/partition/core/PartitionCoreModule.h | 4 ++-- src/modules/partition/jobs/FillGlobalStorageJob.cpp | 9 ++++++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py index 3581efc37..c58e8eb11 100644 --- a/src/modules/fstab/main.py +++ b/src/modules/fstab/main.py @@ -251,9 +251,9 @@ class FstabGenerator(object): return None if not mount_point: mount_point = "swap" - # Existing swap partitins should not be used - if filesystem == "swap" and not partition["new"]: - libcalamares.utils.debug("fstab ignoring old swap {}".format(disk_name)) + + if filesystem == "swap" and not partition.get("claimed", None): + libcalamares.utils.debug("Ignoring foreign swap {!s} {!s}".format(disk_name, partition.get("uuid", None))) return None options = self.get_mount_options(filesystem, mount_point) diff --git a/src/modules/partition/core/PartitionCoreModule.h b/src/modules/partition/core/PartitionCoreModule.h index 7faf67863..38a52249f 100644 --- a/src/modules/partition/core/PartitionCoreModule.h +++ b/src/modules/partition/core/PartitionCoreModule.h @@ -224,10 +224,10 @@ public: */ QList< SummaryInfo > createSummaryInfo() const; - void dumpQueue() const; // debug output - const OsproberEntryList osproberEntries() const; // os-prober data structure, cached + void dumpQueue() const; // debug output + Q_SIGNALS: void hasRootMountPointChanged( bool value ); void isDirtyChanged( bool value ); diff --git a/src/modules/partition/jobs/FillGlobalStorageJob.cpp b/src/modules/partition/jobs/FillGlobalStorageJob.cpp index c96687b82..c909ba913 100644 --- a/src/modules/partition/jobs/FillGlobalStorageJob.cpp +++ b/src/modules/partition/jobs/FillGlobalStorageJob.cpp @@ -100,15 +100,18 @@ mapForPartition( Partition* partition, const QString& uuid ) map[ "fs" ] = untranslatedFS( dynamic_cast< FS::luks& >( partition->fileSystem() ).innerFS() ); } map[ "uuid" ] = uuid; - map[ "new" ] = partition->state() == Partition::StateNew; + map[ "claimed" ] = PartitionInfo::format( partition ); // If we formatted it, it's ours // Debugging for inside the loop in createPartitionList(), // so indent a bit Logger::CDebug deb; using TR = Logger::DebugRow< const char* const, const QString& >; deb << Logger::SubEntry << "mapping for" << partition->partitionPath() << partition->deviceNode() - << TR( "mtpoint:", PartitionInfo::mountPoint( partition ) ) << TR( "fs:", map[ "fs" ].toString() ) - << TR( "fsName", map[ "fsName" ].toString() ) << TR( "uuid", uuid ); + << TR( "mtpoint:", PartitionInfo::mountPoint( partition ) ) + << TR( "fs:", map[ "fs" ].toString() ) + << TR( "fsName", map[ "fsName" ].toString() ) + << TR( "uuid", uuid ) + << TR( "claimed", map[ "claimed" ].toString() ); if ( partition->roles().has( PartitionRole::Luks ) ) { From 50161cdab9080e398b636648909a2cae90324932 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Thu, 20 Feb 2020 16:59:05 +0100 Subject: [PATCH 6/6] [grubcfg] Use own swap - In situations where there are more swap partitions, only use partitions this install "owns". --- src/modules/grubcfg/main.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/modules/grubcfg/main.py b/src/modules/grubcfg/main.py index 5d9428eeb..0df255e75 100644 --- a/src/modules/grubcfg/main.py +++ b/src/modules/grubcfg/main.py @@ -80,6 +80,9 @@ def modify_grub_default(partitions, root_mount_point, distributor): if have_dracut: for partition in partitions: + if partition["fs"] == "linuxswap" and not partition.get("claimed", None): + # Skip foreign swap + continue has_luks = "luksMapperName" in partition if partition["fs"] == "linuxswap" and not has_luks: swap_uuid = partition["uuid"] @@ -94,6 +97,9 @@ def modify_grub_default(partitions, root_mount_point, distributor): ] else: for partition in partitions: + if partition["fs"] == "linuxswap" and not partition.get("claimed", None): + # Skip foreign swap + continue has_luks = "luksMapperName" in partition if partition["fs"] == "linuxswap" and not has_luks: swap_uuid = partition["uuid"]