mirror of
https://github.com/vincentmli/bpfire.git
synced 2026-05-13 16:11:37 +02:00
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 <arne_f@ipfire.org>
This commit is contained in:
@@ -31,7 +31,7 @@ install() {
|
|||||||
|
|
||||||
# Filesystem support
|
# Filesystem support
|
||||||
inst_multiple parted mkswap mke2fs mkreiserfs mkfs.xfs mkfs.vfat
|
inst_multiple parted mkswap mke2fs mkreiserfs mkfs.xfs mkfs.vfat
|
||||||
instmods ext4 iso9660 reiserfs vfat xfs
|
instmods ext4 iso9660 reiserfs vfat xfs ntfs3
|
||||||
|
|
||||||
# Extraction
|
# Extraction
|
||||||
inst_multiple tar gzip zstd
|
inst_multiple tar gzip zstd
|
||||||
|
|||||||
@@ -202,6 +202,15 @@ int hw_umount(const char* source, const char* prefix) {
|
|||||||
static int hw_test_source_medium(const char* path) {
|
static int hw_test_source_medium(const char* path) {
|
||||||
int ret = hw_mount(path, SOURCE_MOUNT_PATH, "iso9660", MS_RDONLY);
|
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
|
// If the source could not be mounted we
|
||||||
// cannot proceed.
|
// cannot proceed.
|
||||||
if (ret != 0)
|
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** ret = hw_create_disks();
|
||||||
struct hw_disk** disks = ret;
|
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);
|
struct udev_enumerate* enumerate = udev_enumerate_new(hw->udev);
|
||||||
|
|
||||||
udev_enumerate_add_match_subsystem(enumerate, "block");
|
udev_enumerate_add_match_subsystem(enumerate, "block");
|
||||||
@@ -298,8 +321,8 @@ struct hw_disk** hw_find_disks(struct hw* hw, const char* sourcedrive) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip sourcedrive if we need to
|
// Skip sourcedisk if we need to
|
||||||
if (sourcedrive && (strcmp(dev_path, sourcedrive) == 0)) {
|
if (sourcedisk && (strcmp(dev_path, sourcedisk) == 0)) {
|
||||||
udev_device_unref(dev);
|
udev_device_unref(dev);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -416,6 +416,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
// Load common modules
|
// 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);
|
hw_stop_all_raid_arrays(logfile);
|
||||||
|
|
||||||
if (!config.unattended) {
|
if (!config.unattended) {
|
||||||
@@ -555,7 +556,10 @@ int main(int argc, char *argv[]) {
|
|||||||
assert(sourcedrive);
|
assert(sourcedrive);
|
||||||
|
|
||||||
int r = hw_mount(sourcedrive, SOURCE_MOUNT_PATH, "iso9660", MS_RDONLY);
|
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"),
|
snprintf(message, sizeof(message), _("Could not mount %s to %s:\n %s\n"),
|
||||||
sourcedrive, SOURCE_MOUNT_PATH, strerror(errno));
|
sourcedrive, SOURCE_MOUNT_PATH, strerror(errno));
|
||||||
errorbox(message);
|
errorbox(message);
|
||||||
|
|||||||
Reference in New Issue
Block a user