--- /dev/null
+lib/udev/rules.d/64-md-raid.rules
+sbin/mdadm
+sbin/mdmon
"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 */
"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 */
"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 */
"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 */
"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 */
"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 */
"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 */
"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 */
// 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)) {
// 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;
}
} 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");
}
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");
+}
char path[DEV_SIZE];
int is_raid;
+ int raid_level;
const struct hw_disk* disk1;
const struct hw_disk* disk2;
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 */
// Load common modules
mysystem("/sbin/modprobe vfat"); // USB key
-
+ hw_stop_all_raid_arrays();
+
/* German is the default */
for (choice = 0; langnames[choice]; choice++)
{
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]);
free(destination);
}
+ hw_stop_all_raid_arrays();
+
if (selected_disks)
hw_free_disks(selected_disks);