From 4a0d9bef07434e0fc789195074581bf749be3d3e Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 22 Jul 2014 00:04:20 +0200 Subject: [PATCH] installer: Add support for RAID. --- config/rootfiles/installer/mdadm | 3 ++ langs/de/install/lang_de.c | 4 +++ langs/en/install/lang_en.c | 4 +++ langs/es/install/lang_es.c | 4 +++ langs/fr/install/lang_fr.c | 4 +++ langs/nl/install/lang_nl.c | 4 +++ langs/pl/install/lang_pl.c | 4 +++ langs/ru/install/lang_ru.c | 4 +++ langs/tr/install/lang_tr.c | 4 +++ src/install+setup/install/hw.c | 51 ++++++++++++++++++++++++++++++-- src/install+setup/install/hw.h | 4 +++ src/install+setup/install/main.c | 18 ++++++++++- 12 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 config/rootfiles/installer/mdadm diff --git a/config/rootfiles/installer/mdadm b/config/rootfiles/installer/mdadm new file mode 100644 index 0000000000..bd68e7847d --- /dev/null +++ b/config/rootfiles/installer/mdadm @@ -0,0 +1,3 @@ +lib/udev/rules.d/64-md-raid.rules +sbin/mdadm +sbin/mdmon diff --git a/langs/de/install/lang_de.c b/langs/de/install/lang_de.c index fe68fb3a67..f982bea1bc 100644 --- a/langs/de/install/lang_de.c +++ b/langs/de/install/lang_de.c @@ -359,6 +359,10 @@ char *de_tr[] = { "Hänge Dateisysteme ein...", /* TR_UNABLE_TO_MOUNT_FILESYSTEMS */ "Die Dateisysteme konnten nicht eingehangen werden.", +/* TR_BUILDING_RAID */ +"Erstelle RAID...", +/* TR_UNABLE_TO_BUILD_RAID */ +"Das RAID konnte nicht erstellt werden.", /* TR_NO_IPCOP_TARBALL_FOUND */ "Auf dem Webserver wurde kein ipcop-Tarball gefunden.", /* TR_NO_ORANGE_INTERFACE */ diff --git a/langs/en/install/lang_en.c b/langs/en/install/lang_en.c index aa63b01c4f..3c6baa08ef 100644 --- a/langs/en/install/lang_en.c +++ b/langs/en/install/lang_en.c @@ -355,6 +355,10 @@ char *en_tr[] = { "Mounting filesystems...", /* TR_UNABLE_TO_MOUNT_FILESYSTEMS */ "Unable to mount filesystems.", +/* TR_BUILDING_RAID */ +"Building RAID...", +/* TR_UNABLE_TO_BUILD_RAID */ +"Unable to build RAID.", /* TR_NO_IPCOP_TARBALL_FOUND */ "No ipcop tarball found on Web Server.", /* TR_NO_ORANGE_INTERFACE */ diff --git a/langs/es/install/lang_es.c b/langs/es/install/lang_es.c index 084ff271f3..c16927289a 100644 --- a/langs/es/install/lang_es.c +++ b/langs/es/install/lang_es.c @@ -351,6 +351,10 @@ char *es_tr[] = { "Mounting filesystems...", /* TR_UNABLE_TO_MOUNT_FILESYSTEMS */ "Unable to mount filesystems.", +/* TR_BUILDING_RAID */ +"Building RAID...", +/* TR_UNABLE_TO_BUILD_RAID */ +"Unable to build RAID.", /* TR_NO_IPCOP_TARBALL_FOUND */ "No se encontró ningun archivo tarball de ipcop en el servidor web", /* TR_NO_ORANGE_INTERFACE */ diff --git a/langs/fr/install/lang_fr.c b/langs/fr/install/lang_fr.c index 1f61d68596..4a33564f80 100644 --- a/langs/fr/install/lang_fr.c +++ b/langs/fr/install/lang_fr.c @@ -351,6 +351,10 @@ char *fr_tr[] = { "Mounting filesystems...", /* TR_UNABLE_TO_MOUNT_FILESYSTEMS */ "Unable to mount filesystems.", +/* TR_BUILDING_RAID */ +"Building RAID...", +/* TR_UNABLE_TO_BUILD_RAID */ +"Unable to build RAID.", /* TR_NO_IPCOP_TARBALL_FOUND */ "Aucun tarball ipcop trouvé sur le serveur Web.", /* TR_NO_ORANGE_INTERFACE */ diff --git a/langs/nl/install/lang_nl.c b/langs/nl/install/lang_nl.c index 934d9bf4ab..83cc74859b 100644 --- a/langs/nl/install/lang_nl.c +++ b/langs/nl/install/lang_nl.c @@ -355,6 +355,10 @@ char *nl_tr[] = { "Mounting filesystems...", /* TR_UNABLE_TO_MOUNT_FILESYSTEMS */ "Unable to mount filesystems.", +/* TR_BUILDING_RAID */ +"Building RAID...", +/* TR_UNABLE_TO_BUILD_RAID */ +"Unable to build RAID.", /* TR_NO_IPCOP_TARBALL_FOUND */ "Er is geen ipcop tarball gevonden op de webserver.", /* TR_NO_ORANGE_INTERFACE */ diff --git a/langs/pl/install/lang_pl.c b/langs/pl/install/lang_pl.c index ac75e38138..0163ddd27a 100644 --- a/langs/pl/install/lang_pl.c +++ b/langs/pl/install/lang_pl.c @@ -351,6 +351,10 @@ char *pl_tr[] = { "Mounting filesystems...", /* TR_UNABLE_TO_MOUNT_FILESYSTEMS */ "Unable to mount filesystems.", +/* TR_BUILDING_RAID */ +"Building RAID...", +/* TR_UNABLE_TO_BUILD_RAID */ +"Unable to build RAID.", /* TR_NO_IPCOP_TARBALL_FOUND */ "Nie znaleziono archiwum tar ipcop na serwerze Web.", /* TR_NO_ORANGE_INTERFACE */ diff --git a/langs/ru/install/lang_ru.c b/langs/ru/install/lang_ru.c index d2fb5c5867..78deeef18f 100644 --- a/langs/ru/install/lang_ru.c +++ b/langs/ru/install/lang_ru.c @@ -349,6 +349,10 @@ char *ru_tr[] = { "Mounting filesystems...", /* TR_UNABLE_TO_MOUNT_FILESYSTEMS */ "Unable to mount filesystems.", +/* TR_BUILDING_RAID */ +"Building RAID...", +/* TR_UNABLE_TO_BUILD_RAID */ +"Unable to build RAID.", /* TR_NO_IPCOP_TARBALL_FOUND */ "На сервере не найден архив ipcop.", /* TR_NO_ORANGE_INTERFACE */ diff --git a/langs/tr/install/lang_tr.c b/langs/tr/install/lang_tr.c index 2253c95719..eee17bb615 100644 --- a/langs/tr/install/lang_tr.c +++ b/langs/tr/install/lang_tr.c @@ -355,6 +355,10 @@ char *tr_tr[] = { "Mounting filesystems...", /* TR_UNABLE_TO_MOUNT_FILESYSTEMS */ "Unable to mount filesystems.", +/* TR_BUILDING_RAID */ +"Building RAID...", +/* TR_UNABLE_TO_BUILD_RAID */ +"Unable to build RAID.", /* TR_NO_IPCOP_TARBALL_FOUND */ "Web sunucuda hiçbir ipfire arşivi bulunamadı.", /* TR_NO_ORANGE_INTERFACE */ diff --git a/src/install+setup/install/hw.c b/src/install+setup/install/hw.c index 0e1f499000..e7d60acd32 100644 --- a/src/install+setup/install/hw.c +++ b/src/install+setup/install/hw.c @@ -116,7 +116,7 @@ char* hw_find_source_medium(struct hw* hw) { // Skip everything what we cannot work with if (strstartswith(dev_path, "/dev/loop") || strstartswith(dev_path, "/dev/fd") || - strstartswith(dev_path, "/dev/ram")) + strstartswith(dev_path, "/dev/ram") || strstartswith(dev_path, "/dev/md")) continue; if (hw_test_source_medium(dev_path)) { @@ -173,7 +173,8 @@ struct hw_disk** hw_find_disks(struct hw* hw) { // Skip everything what we cannot work with if (strstartswith(dev_path, "/dev/loop") || strstartswith(dev_path, "/dev/fd") || - strstartswith(dev_path, "/dev/ram") || strstartswith(dev_path, "/dev/sr")) { + strstartswith(dev_path, "/dev/ram") || strstartswith(dev_path, "/dev/sr") || + strstartswith(dev_path, "/dev/md")) { udev_device_unref(dev); continue; } @@ -410,6 +411,7 @@ struct hw_destination* hw_make_destination(int part_type, struct hw_disk** disks } else if (part_type == HW_PART_TYPE_RAID1) { dest->disk1 = *disks++; dest->disk2 = *disks; + dest->raid_level = 1; snprintf(dest->path, sizeof(dest->path), "/dev/md0"); } @@ -675,3 +677,48 @@ int hw_umount_filesystems(struct hw_destination* dest, const char* prefix) { return 0; } + +int hw_setup_raid(struct hw_destination* dest) { + char* cmd = NULL; + + assert(dest->is_raid); + + asprintf(&cmd, "echo \"y\" | /sbin/mdadm --create --verbose --metadata=0.9 %s", dest->path); + + switch (dest->raid_level) { + case 1: + asprintf(&cmd, "%s --level=1 --raid-devices=2", cmd); + break; + + default: + assert(0); + } + + if (dest->disk1) { + asprintf(&cmd, "%s %s", cmd, dest->disk1->path); + } + + if (dest->disk2) { + asprintf(&cmd, "%s %s", cmd, dest->disk2->path); + } + + int r = mysystem(cmd); + free(cmd); + + // Wait a moment until the device has been properly brought up + if (r == 0) { + unsigned int counter = 10; + while (counter-- > 0) { + sleep(1); + + if (access(dest->path, R_OK) == 0) + break; + } + } + + return r; +} + +int hw_stop_all_raid_arrays() { + return mysystem("/sbin/mdadm --stop --scan"); +} diff --git a/src/install+setup/install/hw.h b/src/install+setup/install/hw.h index 27f07bd125..eb2908cb61 100644 --- a/src/install+setup/install/hw.h +++ b/src/install+setup/install/hw.h @@ -70,6 +70,7 @@ struct hw_destination { char path[DEV_SIZE]; int is_raid; + int raid_level; const struct hw_disk* disk1; const struct hw_disk* disk2; @@ -112,4 +113,7 @@ int hw_create_filesystems(struct hw_destination* dest); int hw_mount_filesystems(struct hw_destination* dest, const char* prefix); int hw_umount_filesystems(struct hw_destination* dest, const char* prefix); +int hw_setup_raid(struct hw_destination* dest); +int hw_stop_all_raid_arrays(); + #endif /* HEADER_HW_H */ diff --git a/src/install+setup/install/main.c b/src/install+setup/install/main.c index 645bee37d7..ebcc0f594f 100644 --- a/src/install+setup/install/main.c +++ b/src/install+setup/install/main.c @@ -239,7 +239,8 @@ int main(int argc, char *argv[]) { // Load common modules mysystem("/sbin/modprobe vfat"); // USB key - + hw_stop_all_raid_arrays(); + /* German is the default */ for (choice = 0; langnames[choice]; choice++) { @@ -454,6 +455,19 @@ int main(int argc, char *argv[]) { goto EXIT; } + // Setting up RAID if needed. + if (destination->is_raid) { + statuswindow(60, 4, title, ctr[TR_BUILDING_RAID]); + + rc = hw_setup_raid(destination); + if (rc) { + errorbox(ctr[TR_UNABLE_TO_BUILD_RAID]); + goto EXIT; + } + + newtPopWindow(); + } + // Execute the partitioning... statuswindow(60, 4, title, ctr[TR_PARTITIONING_DISK]); @@ -619,6 +633,8 @@ EXIT: free(destination); } + hw_stop_all_raid_arrays(); + if (selected_disks) hw_free_disks(selected_disks); -- 2.39.2