Initial Software RAID creation.

This commit is contained in:
Caio Carvalho 2018-07-31 16:21:51 -03:00
parent 0201171956
commit fed87159da
2 changed files with 48 additions and 1 deletions

View File

@ -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"),

View File

@ -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);