From b70ffb70afe7eab0795c7a745e61c245a3c4014b Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sat, 27 Aug 2016 21:46:30 +0200 Subject: [PATCH] Add /boot partition support to sysinstall(8). --- share/man/man7/installation.7 | 25 +++++++++++++++++++------ sysinstall/sysinstall.c | 25 ++++++++++++++++++------- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/share/man/man7/installation.7 b/share/man/man7/installation.7 index a4dc47e5..f848aedb 100644 --- a/share/man/man7/installation.7 +++ b/share/man/man7/installation.7 @@ -151,6 +151,11 @@ wish to use it in a dual boot scheme. The answer will default to yes if no existing partitions are found, or if an existing Sortix installation is found that uses the provided bootloader; and will otherwise default to no. .Pp +The bootloader will be installed on the boot harddisk, which is the harddisk +containing the +.Pa /boot +partition if any, and otherwise the harddisk containing the root filesystem. +.Pp Single-boot configurations should use the offered bootloader. Dual-boot configurations should refuse it and arrange for bootloading by other means. The installer will generate @@ -209,7 +214,7 @@ on the harddisk. .Pp The .Sy ls -command to lists all partitions and unused space on the current device. +command lists all partitions and unused space on the current device. The .Sy mkpart command creates a partition. You will be asked interactive questions to @@ -223,18 +228,26 @@ The command removes a partition table entry and effectively deletes all data on the partition. .Pp -If the device containing the root filesystem uses the GPT partitioning scheme, -and you accepted the included bootloader, then you must create a +If you accepted the included bootloader, it will be installed on the boot +harddisk, which is the harddisk containing the +.Pa /boot +partition if any, and otherwise the harddisk containing the root filesystem. If +the boot harddisk uses the +.Xr gpt 7 +partitioning scheme, then you must create a .Sy biosboot -partition onto which the bootloader is installed. It should be at the start of -the harddisk and a size of 1 MiB will be more than sufficient. +partition on the boot harddisk which is where the bootloader will be installed. +It should be at the start of the boot harddisk and a size of 1 MiB will be more +than sufficient. .Pp You need to make a partition containing the root filesystem mounted at .Pa / . A size of 1 GiB will be comfortable for the base system and ports and basic usage. There is no inherent need for a +.Pa /boot +or a .Pa /home -partition so you are encouraged to make the root filesystem as large as you +partition, so you are encouraged to make the root filesystem as large as you wish. Operating systems upgrades will preserve the root filesystem and the installer handles installing on top of an existing installation and preserves user files and local configuration. diff --git a/sysinstall/sysinstall.c b/sysinstall/sysinstall.c index 8d478e3b..8e2d2833 100644 --- a/sysinstall/sysinstall.c +++ b/sysinstall/sysinstall.c @@ -674,6 +674,8 @@ int main(void) "Type man 8 disked to display the disked(8) man page.\n", mktable_tip); struct filesystem* root_filesystem = NULL; + struct filesystem* boot_filesystem = NULL; + struct filesystem* bootloader_filesystem = NULL; bool not_first = false; while ( true ) { @@ -711,6 +713,7 @@ int main(void) continue; } root_filesystem = NULL; + boot_filesystem = NULL; bool cant_mount = false; for ( size_t i = 0; i < mountpoints_used; i++ ) { @@ -734,17 +737,25 @@ int main(void) } if ( !strcmp(mnt->entry.fs_file, "/") ) root_filesystem = mnt->fs; + if ( !strcmp(mnt->entry.fs_file, "/boot") ) + boot_filesystem = mnt->fs; } if ( cant_mount ) continue; assert(root_filesystem); + bootloader_filesystem = boot_filesystem ? boot_filesystem : root_filesystem; + assert(bootloader_filesystem); if ( !strcasecmp(accept_grub, "yes") && - missing_bios_boot_partition(root_filesystem) ) + missing_bios_boot_partition(bootloader_filesystem) ) { - textf("You are a installing BIOS bootloader and the root " + const char* where = boot_filesystem ? "/boot" : "root"; + const char* dev = device_path_of_blockdevice(bootloader_filesystem->bdev); + assert(dev); + textf("You are a installing BIOS bootloader and the %s " "filesystem is located on a GPT partition, but you haven't " - "made a BIOS boot partition on the root GPT disk. Pick " - "biosboot during mkpart and make a 1 MiB partition.\n"); + "made a BIOS boot partition on the %s GPT disk. Pick " + "biosboot during mkpart and make a 1 MiB partition.\n", + where, dev); char return_to_disked[10]; while ( true ) { @@ -775,12 +786,12 @@ int main(void) } if ( strcasecmp(accept_grub, "yes") == 0 ) { - struct partition* bbp = search_bios_boot_partition(root_filesystem); + struct partition* bbp = search_bios_boot_partition(bootloader_filesystem); if ( bbp ) printf(" %-16s bios boot partition\n", path_of_blockdevice(&bbp->bdev)); printf(" %-16s bootloader installation target\n", - device_path_of_blockdevice(root_filesystem->bdev)); + device_path_of_blockdevice(bootloader_filesystem->bdev)); } text("\n"); @@ -875,7 +886,7 @@ int main(void) { printf(" - Installing bootloader...\n"); execute((const char*[]) { "chroot", "-d", ".", "grub-install", - device_path_of_blockdevice(root_filesystem->bdev), NULL }, + device_path_of_blockdevice(bootloader_filesystem->bdev), NULL }, "_eqQ"); printf(" - Configuring bootloader...\n"); execute((const char*[]) { "chroot", "-d", ".", "update-grub", NULL },