summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sade
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2004-08-04 23:04:14 +0000
committermarcel <marcel@FreeBSD.org>2004-08-04 23:04:14 +0000
commit9c9fafff0c59e38408811a3afe58c0cf5c49729e (patch)
treeca1c80448aca655da14b9283eeac6568ff5ff4e0 /usr.sbin/sade
parent41618225a8195e5dce8cd72ec583953369a9694f (diff)
downloadFreeBSD-src-9c9fafff0c59e38408811a3afe58c0cf5c49729e.zip
FreeBSD-src-9c9fafff0c59e38408811a3afe58c0cf5c49729e.tar.gz
ia64 specific:
o Remove the code that creates the boot directory on the EFI file system after it has been mounted, as well as remove the code that creates the symlink from /boot -> /efi/boot (*). As a result, /boot will be extracted onto the root file system. o Add a function efi_mountpoint() that returns the mount point of the EFI file system or NULL if no EFI partition is created. This function is used to both check whether there's an EFI file system and to return what its mount point is. o When there's no EFI file system, ask the user if this is what he or she wants. Since we extract /boot onto the root file system, we do not actually need an EFI file system for the installation to work. Whether one wants to install without an EFI partition is of course an entirely different question. We allow it... o When we're done installing and need to fix up the various bits and pieces, check if there's an EFI partition and if yes, move /boot to /efi/boot and create a symlink /boot -> /efi/boot (*). This is a much more reliable way to get /boot onto the EFI partition than creating the symlink up front and hope its being respected. It so happened that we never had the boot directory end up on the EFI partition. We make the symlink relative. (*) /efi is a place holder for the actual EFI mount point of course.
Diffstat (limited to 'usr.sbin/sade')
-rw-r--r--usr.sbin/sade/install.c67
1 files changed, 46 insertions, 21 deletions
diff --git a/usr.sbin/sade/install.c b/usr.sbin/sade/install.c
index d98bc50..7166eb9 100644
--- a/usr.sbin/sade/install.c
+++ b/usr.sbin/sade/install.c
@@ -68,6 +68,33 @@ static void fixit_common(void);
static void installConfigure(void);
+#ifdef __ia64__
+static const char *
+efi_mountpoint(void)
+{
+ Device **devs;
+ Disk *disk;
+ Chunk *c;
+ PartInfo *pi;
+ int i;
+
+ devs = deviceFind(NULL, DEVICE_TYPE_DISK);
+ for (i = 0; devs[i] != NULL; i++) {
+ if (!devs[i]->enabled)
+ continue;
+ disk = (Disk *)devs[i]->private;
+ for (c = disk->chunks->part; c != NULL; c = c->next) {
+ if (c->type == efi && c->private_data != NULL) {
+ pi = (PartInfo *)c->private_data;
+ if (pi->mountpoint[0] == '/')
+ return (pi->mountpoint);
+ }
+ }
+ }
+ return (NULL);
+}
+#endif
+
Boolean
checkLabels(Boolean whinge, Chunk **rdev, Chunk **sdev, Chunk **udev, Chunk **vdev, Chunk **tdev, Chunk **hdev)
{
@@ -248,6 +275,12 @@ checkLabels(Boolean whinge, Chunk **rdev, Chunk **sdev, Chunk **udev, Chunk **vd
"if you do not have enough RAM. Continue anyway?"))
status = FALSE;
}
+#ifdef __ia64__
+ if (efi_mountpoint() == NULL && whinge) {
+ if (msgYesNo("No EFI system partition found. Is this what you want?"))
+ status = FALSE;
+ }
+#endif
return status;
}
@@ -824,6 +857,9 @@ installFixupBase(dialogMenuItem *self)
{
FILE *fp;
int kstat = 1;
+#ifdef __ia64__
+ const char *efi_mntpt;
+#endif
/* All of this is done only as init, just to be safe */
if (RunningAsInit) {
@@ -858,6 +894,16 @@ installFixupBase(dialogMenuItem *self)
vsystem("mtree -deU -f /etc/mtree/BSD.var.dist -p /var");
vsystem("mtree -deU -f /etc/mtree/BSD.usr.dist -p /usr");
+#ifdef __ia64__
+ /* Move /boot to the the EFI partition and make /boot a link to it. */
+ efi_mntpt = efi_mountpoint();
+ if (efi_mntpt != NULL) {
+ vsystem("if [ ! -L /boot ]; then mv /boot %s; fi", efi_mntpt);
+ vsystem("if [ ! -e /boot ]; then ln -sf %s/boot /boot; fi",
+ efi_mntpt + 1); /* Skip leading '/' */
+ }
+#endif
+
/* Do all the last ugly work-arounds here */
}
return DITEM_SUCCESS | DITEM_RESTORE;
@@ -912,9 +958,6 @@ installFilesystems(dialogMenuItem *self)
PartInfo *root;
char dname[80];
Boolean upgrade = FALSE;
-#if defined(__ia64__)
- char efi_bootdir[FILENAME_MAX];
-#endif
/* If we've already done this, bail out */
if (!variable_cmp(DISK_LABELLED, "written"))
@@ -1121,24 +1164,6 @@ installFilesystems(dialogMenuItem *self)
performNewfs(pi, dname, QUEUE_YES);
command_func_add(pi->mountpoint, Mount_msdosfs, c1->name);
-
- /*
- * Create a directory boot on the EFI filesystem and create a
- * link boot on the root filesystem pointing to the one on the
- * EFI filesystem. That way, we install the loader, kernel
- * and modules on the EFI filesystem.
- */
- sprintf(bootdir, "%s", RunningAsInit ? "/mnt" : "");
- sprintf(efi_bootdir, "%s/%s", bootdir, pi->mountpoint);
- strcat(bootdir, "/boot");
- strcat(efi_bootdir, "/boot");
- command_func_add(pi->mountpoint, Mkdir_command, efi_bootdir);
-
- /* Make a relative link. */
- p = &efi_bootdir[(RunningAsInit) ? 4 : 0];
- while (*p == '/')
- p++;
- symlink(p, bootdir);
}
#endif
}
OpenPOWER on IntegriCloud