]> git.ipfire.org Git - ipfire-2.x.git/commitdiff
installer: Add support for RAID.
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 21 Jul 2014 22:04:20 +0000 (00:04 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 21 Jul 2014 22:04:20 +0000 (00:04 +0200)
12 files changed:
config/rootfiles/installer/mdadm [new file with mode: 0644]
langs/de/install/lang_de.c
langs/en/install/lang_en.c
langs/es/install/lang_es.c
langs/fr/install/lang_fr.c
langs/nl/install/lang_nl.c
langs/pl/install/lang_pl.c
langs/ru/install/lang_ru.c
langs/tr/install/lang_tr.c
src/install+setup/install/hw.c
src/install+setup/install/hw.h
src/install+setup/install/main.c

diff --git a/config/rootfiles/installer/mdadm b/config/rootfiles/installer/mdadm
new file mode 100644 (file)
index 0000000..bd68e78
--- /dev/null
@@ -0,0 +1,3 @@
+lib/udev/rules.d/64-md-raid.rules
+sbin/mdadm
+sbin/mdmon
index fe68fb3a672154eeed62de0b7c84907ec3a07fa3..f982bea1bc1c34acbf13262867b29ac677872af9 100644 (file)
@@ -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 */
index aa63b01c4f5bbb840eece088bdd92c6d8bba2c1b..3c6baa08eff94d1ddaa2b920523e4cb015ffd00f 100644 (file)
@@ -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 */
index 084ff271f3b2f675dbaaf824dc5990bca39937ba..c16927289a7afaced53836c18fafe0909fcb46b4 100644 (file)
@@ -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 */
index 1f61d68596e9517f33508c1a6a7b98c1378b8222..4a33564f80b259e151d2337538b6ddaaa1202dab 100644 (file)
@@ -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 */
index 934d9bf4ab9c459c39d64e9e11d9f0a135f2d249..83cc74859b7a5e3bbdf2a4f595bab8fd1af50dd7 100644 (file)
@@ -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 */
index ac75e38138bc25feaf3a9090da40b07726387c14..0163ddd27a1b5535abbed4b9d76f7ba80d69f456 100644 (file)
@@ -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 */
index d2fb5c5867d97fdb8686291f545f74483d84c9ab..78deeef18f2228d697da504c82edcd1c05ed0b63 100644 (file)
@@ -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 */
index 2253c95719a73e166c52a9550c128efd5b33ef26..eee17bb615c854822060074564eb780cea153d17 100644 (file)
@@ -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 */
index 0e1f499000fa46a04c1546eb71108040008c5ab8..e7d60acd32f032fff31f5ef58928b8c0fbe0383d 100644 (file)
@@ -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");
+}
index 27f07bd1255dcc5b7570cd585cac9aa034f81cbf..eb2908cb61cc9e046c2994dcc416c06daabde90e 100644 (file)
@@ -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 */
index 645bee37d741f2f0694db2904e3dc343c6c5bb24..ebcc0f594f3032c01c7d34bf65b3bcfb5e33219a 100644 (file)
@@ -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);