From 68a50dd12df884743ac2f885d4d36a7b99126e99 Mon Sep 17 00:00:00 2001 From: Arne Fitzenreiter Date: Sun, 16 Jan 2022 13:46:36 +0000 Subject: [PATCH] installer: add partitions as installation source This add compatiblity for rufus usb-keys that convert the iso to fat or ntfs partition. Signed-off-by: Arne Fitzenreiter --- src/installer/dracut-module/module-setup.sh | 2 +- src/installer/hw.c | 27 +++++++++++++++++++-- src/installer/main.c | 8 ++++-- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/installer/dracut-module/module-setup.sh b/src/installer/dracut-module/module-setup.sh index 5550ec7630..c68b51d260 100755 --- a/src/installer/dracut-module/module-setup.sh +++ b/src/installer/dracut-module/module-setup.sh @@ -31,7 +31,7 @@ install() { # Filesystem support inst_multiple parted mkswap mke2fs mkreiserfs mkfs.xfs mkfs.vfat - instmods ext4 iso9660 reiserfs vfat xfs + instmods ext4 iso9660 reiserfs vfat xfs ntfs3 # Extraction inst_multiple tar gzip zstd diff --git a/src/installer/hw.c b/src/installer/hw.c index b532bb16e2..17e0bbb01e 100644 --- a/src/installer/hw.c +++ b/src/installer/hw.c @@ -202,6 +202,15 @@ int hw_umount(const char* source, const char* prefix) { static int hw_test_source_medium(const char* path) { int ret = hw_mount(path, SOURCE_MOUNT_PATH, "iso9660", MS_RDONLY); + if (ret != 0) { + // 2nd try, ntfs for a rufus converted usb key + ret = hw_mount(path, SOURCE_MOUNT_PATH, "ntfs3", MS_RDONLY); + } + if (ret != 0) { + // 3rd try, vfat for a rufus converted usb key + ret = hw_mount(path, SOURCE_MOUNT_PATH, "vfat", MS_RDONLY); + } + // If the source could not be mounted we // cannot proceed. if (ret != 0) @@ -275,6 +284,20 @@ struct hw_disk** hw_find_disks(struct hw* hw, const char* sourcedrive) { struct hw_disk** ret = hw_create_disks(); struct hw_disk** disks = ret; + // Determine the disk device of source if it is a partition + char* sourcedisk = NULL; + char syssource[PATH_MAX]; + (void)snprintf(syssource, sizeof(syssource) - 1, "/sys/class/block/%s", sourcedrive + 5); + struct udev_device* s_dev = udev_device_new_from_syspath(hw->udev, syssource); + const char* s_devtype = udev_device_get_property_value(s_dev, "DEVTYPE"); + if (s_devtype && (strcmp(s_devtype, "partition") == 0)) { + struct udev_device* p_dev = udev_device_get_parent_with_subsystem_devtype(s_dev,"block","disk"); + if (p_dev) { + sourcedisk = udev_device_get_devnode(p_dev); + } + } + if (!sourcedisk) sourcedisk = sourcedrive; + struct udev_enumerate* enumerate = udev_enumerate_new(hw->udev); udev_enumerate_add_match_subsystem(enumerate, "block"); @@ -298,8 +321,8 @@ struct hw_disk** hw_find_disks(struct hw* hw, const char* sourcedrive) { continue; } - // Skip sourcedrive if we need to - if (sourcedrive && (strcmp(dev_path, sourcedrive) == 0)) { + // Skip sourcedisk if we need to + if (sourcedisk && (strcmp(dev_path, sourcedisk) == 0)) { udev_device_unref(dev); continue; } diff --git a/src/installer/main.c b/src/installer/main.c index fabc0ef524..b31b096a54 100644 --- a/src/installer/main.c +++ b/src/installer/main.c @@ -415,7 +415,8 @@ int main(int argc, char *argv[]) { } // Load common modules - mysystem(logfile, "/sbin/modprobe vfat"); // USB key + mysystem(logfile, "/sbin/modprobe vfat"); // USB key + mysystem(logfile, "/sbin/modprobe ntfs3"); // USB key hw_stop_all_raid_arrays(logfile); if (!config.unattended) { @@ -555,7 +556,10 @@ int main(int argc, char *argv[]) { assert(sourcedrive); int r = hw_mount(sourcedrive, SOURCE_MOUNT_PATH, "iso9660", MS_RDONLY); - if (r) { + if (r) r = hw_mount(sourcedrive, SOURCE_MOUNT_PATH, "ntfs3", MS_RDONLY); + if (r) r = hw_mount(sourcedrive, SOURCE_MOUNT_PATH, "vfat", MS_RDONLY); + if (r) + { snprintf(message, sizeof(message), _("Could not mount %s to %s:\n %s\n"), sourcedrive, SOURCE_MOUNT_PATH, strerror(errno)); errorbox(message); -- 2.39.2