From b216daf5741f8a3a302a46999c14d23f4d00b1e9 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 24 Jun 2019 13:19:24 +0200 Subject: [PATCH 1/5] [initramfs] Prepare for C++-ification --- src/modules/initramfs/CMakeLists.txt | 9 +++++++++ src/modules/initramfs/module.desc | 5 ----- 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 src/modules/initramfs/CMakeLists.txt delete mode 100644 src/modules/initramfs/module.desc diff --git a/src/modules/initramfs/CMakeLists.txt b/src/modules/initramfs/CMakeLists.txt new file mode 100644 index 000000000..79bb650c5 --- /dev/null +++ b/src/modules/initramfs/CMakeLists.txt @@ -0,0 +1,9 @@ +calamares_add_plugin( initramfs + TYPE job + EXPORT_MACRO PLUGINDLLEXPORT_PRO + SOURCES + InitramfsJob.cpp + LINK_PRIVATE_LIBRARIES + calamares + SHARED_LIB +) diff --git a/src/modules/initramfs/module.desc b/src/modules/initramfs/module.desc deleted file mode 100644 index 321a03782..000000000 --- a/src/modules/initramfs/module.desc +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: "job" -name: "initramfs" -interface: "python" -script: "main.py" From 8d712276ad670a5321797b6ec26016ca3df5681a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 24 Jun 2019 14:38:56 +0200 Subject: [PATCH 2/5] [initramfs] Replace module with C++ implementation - new implementation handles blank (maps to "all") configuration, - allows specifying "$uname" as kernel name, to use `uname -r`, - allows specifying a specific kernel. --- src/modules/initramfs/InitramfsJob.cpp | 74 ++++++++++++++++++++++++++ src/modules/initramfs/InitramfsJob.h | 49 +++++++++++++++++ src/modules/initramfs/main.py | 51 ------------------ 3 files changed, 123 insertions(+), 51 deletions(-) create mode 100644 src/modules/initramfs/InitramfsJob.cpp create mode 100644 src/modules/initramfs/InitramfsJob.h delete mode 100644 src/modules/initramfs/main.py diff --git a/src/modules/initramfs/InitramfsJob.cpp b/src/modules/initramfs/InitramfsJob.cpp new file mode 100644 index 000000000..302d15fff --- /dev/null +++ b/src/modules/initramfs/InitramfsJob.cpp @@ -0,0 +1,74 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#include "InitramfsJob.h" + +#include "utils/CalamaresUtilsSystem.h" +#include "utils/Logger.h" +#include "utils/Variant.h" + +InitramfsJob::InitramfsJob( QObject* parent ) + : Calamares::CppJob( parent ) +{ +} + +InitramfsJob::~InitramfsJob() {} + + +QString +InitramfsJob::prettyName() const +{ + return tr( "Creating initramfs." ); +} + + +Calamares::JobResult +InitramfsJob::exec() +{ + auto r = CalamaresUtils::System::instance()->targetEnvCommand( + { "update-initramfs", "-k", m_kernel, "-c", "-t" }, QString(), QString(), 10 ); + return r.explainProcess( "update-initramfs", 10 ); +} + + +void +InitramfsJob::setConfigurationMap( const QVariantMap& configurationMap ) +{ + m_kernel = CalamaresUtils::getString( configurationMap, "kernel" ); + if ( m_kernel.isEmpty() ) + { + m_kernel = QStringLiteral( "all" ); + } + else if ( m_kernel == "$uname" ) + { + auto r = CalamaresUtils::System::runCommand( + CalamaresUtils::System::RunLocation::RunInHost, { "/bin/uname", "-r" }, QString(), QString(), 3 ); + if ( r.getExitCode() == 0 ) + { + m_kernel = r.getOutput(); + cDebug() << "*initramfs* using running kernel" << m_kernel; + } + else + { + cWarning() << "*initramfs* could not determine running kernel, using 'all'." << Logger::Continuation + << r.getExitCode() << r.getOutput(); + } + } +} + +CALAMARES_PLUGIN_FACTORY_DEFINITION( InitramfsJobFactory, registerPlugin< InitramfsJob >(); ) diff --git a/src/modules/initramfs/InitramfsJob.h b/src/modules/initramfs/InitramfsJob.h new file mode 100644 index 000000000..63aed4136 --- /dev/null +++ b/src/modules/initramfs/InitramfsJob.h @@ -0,0 +1,49 @@ +/* === This file is part of Calamares - === + * + * Copyright 2019, Adriaan de Groot + * + * Calamares is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Calamares is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Calamares. If not, see . + */ + +#ifndef INITRAMFSJOB_H +#define INITRAMFSJOB_H + +#include "CppJob.h" +#include "PluginDllMacro.h" +#include "utils/PluginFactory.h" + +#include +#include + +class PLUGINDLLEXPORT InitramfsJob : public Calamares::CppJob +{ + Q_OBJECT + +public: + explicit InitramfsJob( QObject* parent = nullptr ); + virtual ~InitramfsJob() override; + + QString prettyName() const override; + + Calamares::JobResult exec() override; + + void setConfigurationMap( const QVariantMap& configurationMap ) override; + +private: + QString m_kernel; +}; + +CALAMARES_PLUGIN_FACTORY_DECLARATION( InitramfsJobFactory ) + +#endif // INITRAMFSJOB_H diff --git a/src/modules/initramfs/main.py b/src/modules/initramfs/main.py deleted file mode 100644 index 7ff32bafb..000000000 --- a/src/modules/initramfs/main.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# === This file is part of Calamares - === -# -# Copyright 2014, Philip Müller -# Copyright 2017, Alf Gaida -# Copyright 2019, Adriaan de Groot -# -# Calamares is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Calamares is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Calamares. If not, see . - -import libcalamares -from libcalamares.utils import target_env_call - - -import gettext -_ = gettext.translation("calamares-python", - localedir=libcalamares.utils.gettext_path(), - languages=libcalamares.utils.gettext_languages(), - fallback=True).gettext - - -def pretty_name(): - return _("Creating initramfs.") - - -def run(): - """ Generate an initramfs image. - - :return: - """ - return_code = target_env_call(["update-initramfs", "-k", "all", "-c", - "-t"]) - - if return_code != 0: - libcalamares.utils.debug("update-initramfs returned {}".format(return_code)) - return ( - _("Failed to run update-initramfs on the target"), - _("The exit code was {}").format(return_code) - ) From a2d7fdcb8aa8705e5c4d7807586504fdbb777471 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 24 Jun 2019 16:35:54 +0200 Subject: [PATCH 3/5] [initramfs] Document settings - Move the README text into the config file - Document the *kernel* setting --- src/modules/initramfs/README.md | 12 ------------ src/modules/initramfs/initramfs.conf | 29 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 12 deletions(-) delete mode 100644 src/modules/initramfs/README.md create mode 100644 src/modules/initramfs/initramfs.conf diff --git a/src/modules/initramfs/README.md b/src/modules/initramfs/README.md deleted file mode 100644 index f7de44f2f..000000000 --- a/src/modules/initramfs/README.md +++ /dev/null @@ -1,12 +0,0 @@ -## initramfs module - -This module is specific to Debian based distros. Post installation on Debian -the initramfs needs to be updated so as to not interrupt the boot process -with a error about fsck.ext4 not being found. - -## Debian specific notes - -If you're using live-build to build your ISO and setup the runtime env -make sure that you purge the live-\* packages on the target system -before running this module, since live-config dpkg-diverts update-initramfs -and can cause all sorts of fun issues. diff --git a/src/modules/initramfs/initramfs.conf b/src/modules/initramfs/initramfs.conf new file mode 100644 index 000000000..a399e9212 --- /dev/null +++ b/src/modules/initramfs/initramfs.conf @@ -0,0 +1,29 @@ +## initramfs module +# +# This module is specific to Debian based distros. Post installation on Debian +# the initramfs needs to be updated so as to not interrupt the boot process +# with a error about fsck.ext4 not being found. +# +## Debian specific notes +# +# If you're using live-build to build your ISO and setup the runtime env +# make sure that you purge the live-\* packages on the target system +# before running this module, since live-config dpkg-diverts update-initramfs +# and can cause all sorts of fun issues. +--- +# There is only one configuration item for this module, +# the kernel to be loaded. This can have the following +# values: +# - empty or unset, interpreted as "all" +# - the literal string "$uname" (without quotes, with dollar), +# which will use the output of `uname -r` to determine the +# running kernel, and use that. +# - any other string. +# +# Whatever is set, that string is passed as *version* argument to the +# `-k` option of *update-initramfs*. +# +# The default is empty/unset, leading to the behavior from Calamares +# 3.2.9 and earlier which passed "all" as version. + +# kernel: all From 6ae8bd82fa4ee2d30838c827588ac8876fb7328e Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 24 Jun 2019 16:37:58 +0200 Subject: [PATCH 4/5] [initramfs] Log what kernel will be passed to update-initramfs --- src/modules/initramfs/InitramfsJob.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/initramfs/InitramfsJob.cpp b/src/modules/initramfs/InitramfsJob.cpp index 302d15fff..db9f8038a 100644 --- a/src/modules/initramfs/InitramfsJob.cpp +++ b/src/modules/initramfs/InitramfsJob.cpp @@ -40,6 +40,7 @@ InitramfsJob::prettyName() const Calamares::JobResult InitramfsJob::exec() { + cDebug() << "Updating initramfs with kernel" << m_kernel; auto r = CalamaresUtils::System::instance()->targetEnvCommand( { "update-initramfs", "-k", m_kernel, "-c", "-t" }, QString(), QString(), 10 ); return r.explainProcess( "update-initramfs", 10 ); From f7cbb7b5ea22144d079be0782309463e87e376de Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 24 Jun 2019 16:47:20 +0200 Subject: [PATCH 5/5] Changes: Note modified initramfs module - Also add note about $uname handling. --- CHANGES | 5 +++++ src/modules/initramfs/initramfs.conf | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index dcc32eea0..ea4019376 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,11 @@ require changes in the slideshow. ## Modules ## + - *initramfs* has been changed from a Python module to a C++ module. + Packaging will need to adjust now it installs a .so instead of a .py. + The module itself functions as before. It does have a new configuration + option, to change the version passed as to the `-k` option of + update-initramfs. #1180 - *partition* Now has its own setting for *requiredStorage*, duplicating the same setting in the *welcome* module. This is useful for configurations where no *welcome* module is used, but a minimum diff --git a/src/modules/initramfs/initramfs.conf b/src/modules/initramfs/initramfs.conf index a399e9212..c9803a3b1 100644 --- a/src/modules/initramfs/initramfs.conf +++ b/src/modules/initramfs/initramfs.conf @@ -21,7 +21,9 @@ # - any other string. # # Whatever is set, that string is passed as *version* argument to the -# `-k` option of *update-initramfs*. +# `-k` option of *update-initramfs*. Take care that both "$uname" operates +# in the host system, and might not be correct if the target system is +# updated (to a newer kernel) as part of the installation. # # The default is empty/unset, leading to the behavior from Calamares # 3.2.9 and earlier which passed "all" as version.