From fed87159da7b9ddf065554270b3512d24e8a0e14 Mon Sep 17 00:00:00 2001 From: Caio Carvalho Date: Tue, 31 Jul 2018 16:21:51 -0300 Subject: [PATCH] Initial Software RAID creation. --- src/core/raid/softwareraid.cpp | 45 +++++++++++++++++++++++++++++++++- src/core/raid/softwareraid.h | 4 +++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/core/raid/softwareraid.cpp b/src/core/raid/softwareraid.cpp index 21aebd9..4802f05 100644 --- a/src/core/raid/softwareraid.cpp +++ b/src/core/raid/softwareraid.cpp @@ -380,7 +380,26 @@ bool SoftwareRAID::createSoftwareRAID(Report &report, const qint32 raidLevel, const qint32 chunkSize) { - return false; + QStringList args; + args << QStringLiteral("--create") << name; + args << QStringLiteral("--level=") + QString::number(raidLevel); + args << QStringLiteral("--chunk=") + QString::number(chunkSize); + args << QStringLiteral("--raid-devices=") + QString::number(devicePathList.size()); + + for (const QString path : qAsConst(devicePathList)) { + if (!eraseDeviceMDSuperblock(path)) + return false; + + args << path; + } + + ExternalCommand cmd(QStringLiteral("mdadm"), args); + + if (!cmd.run(-1) || cmd.exitCode() != 0) + return false; + + // TODO: Support custom config files. + return updateConfigurationFile(QStringLiteral("/etc/mdadm.conf"), cmd.output()); } bool SoftwareRAID::deleteSoftwareRAID(Report &report, @@ -456,6 +475,30 @@ qint64 SoftwareRAID::mappedSector(const QString &partitionPath, qint64 sector) c return -1; } +bool SoftwareRAID::eraseDeviceMDSuperblock(const QString &path) +{ + ExternalCommand cmd(QStringLiteral("mdadm"), + { QStringLiteral("--misc"), QStringLiteral("--zero-superblock"), path}); + + return cmd.run(-1) && cmd.exitCode() == 0; +} + +bool SoftwareRAID::updateConfigurationFile(const QString &configurationPath, const QString &info) +{ + QFile config(configurationPath); + + if (!config.open(QIODevice::WriteOnly | QIODevice::Append)) + return false; + + QTextStream out(&config); + + out << info << QLatin1Char('\n'); + + config.close(); + + return true; +} + QString SoftwareRAID::getDetail(const QString &path) { ExternalCommand cmd(QStringLiteral("mdadm"), diff --git a/src/core/raid/softwareraid.h b/src/core/raid/softwareraid.h index 803ec54..9269b97 100644 --- a/src/core/raid/softwareraid.h +++ b/src/core/raid/softwareraid.h @@ -95,6 +95,10 @@ protected: qint64 mappedSector(const QString &partitionPath, qint64 sector) const override; private: + static bool eraseDeviceMDSuperblock(const QString& path); + + static bool updateConfigurationFile(const QString& configurationPath, const QString& info); + static QString getDetail(const QString& path); static QString getRAIDConfiguration(const QString& configurationPath);