[BACK]Return to installboot.c CVS log [TXT][DIR] Up to [local] / src / usr.sbin / installboot

File: [local] / src / usr.sbin / installboot / installboot.c (download)

Revision 1.16, Tue Nov 8 12:08:53 2022 UTC (18 months, 3 weeks ago) by kn
Branch: MAIN
CVS Tags: OPENBSD_7_5_BASE, OPENBSD_7_5, OPENBSD_7_4_BASE, OPENBSD_7_4, OPENBSD_7_3_BASE, OPENBSD_7_3, HEAD
Changes since 1.15: +5 -1 lines

Make "prepare filesystem" softraid aware, fix arm64 softraid install

On EFI platforms, 'installboot -p' on a softraid volume will only prepare
the filesysem inside the volume and leave physical softraid chunks untouched
which leaves you with unbootable chunks.

The current workaround is to prepare chunks manually (see regress).

Fix it in the same spirit the actual "install" already works in softraid.c.

This is what mlarkin has already been tested in a combined diff with the
MD -> MI softraid merge bits from the previous commit.

Works fine on amd64, arm64 and sparc64 upgrades and installations.

OK jsing

/*	$OpenBSD: installboot.c,v 1.16 2022/11/08 12:08:53 kn Exp $	*/

/*
 * Copyright (c) 2012, 2013 Joel Sing <jsing@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <util.h>

#include "installboot.h"

int	nowrite;
int	prepare;
int	stages;
int	verbose;

char	*root;
char	*stage1;
char	*stage2;

static __dead void
usage(void)
{
	fprintf(stderr, "usage:\t%1$s [-nv] [-r root] disk [stage1%2$s]\n"
	    "\t%1$s [-nv] -p disk\n",
	    getprogname(), (stages >= 2) ? " [stage2]" : "");

	exit(1);
}

int
main(int argc, char **argv)
{
	char *dev, *realdev;
	int devfd, opt;

	md_init();

	while ((opt = getopt(argc, argv, "npr:v")) != -1) {
		switch (opt) {
		case 'n':
			nowrite = 1;
			break;
		case 'p':
			prepare = 1;
			break;
		case 'r':
			root = optarg;
			break;
		case 'v':
			verbose = 1;
			break;
		default:
			usage();
		}
	}

	argc -= optind;
	argv += optind;

	if (argc < 1 || argc > stages + 1)
		usage();
	if (prepare && (root != NULL || argc > 1))
		usage();

	dev = argv[0];
	if (argc > 1)
		stage1 = argv[1];
	if (argc > 2)
		stage2 = argv[2];

	if ((devfd = opendev(dev, (nowrite ? O_RDONLY : O_RDWR), OPENDEV_PART,
	    &realdev)) == -1)
		err(1, "open: %s", realdev);

	if (prepare) {
#if SOFTRAID
		sr_prepareboot(devfd, dev);
#else
		md_prepareboot(devfd, realdev);
#endif
		return 0;
	}

	/* Prefix stages with root, unless they were user supplied. */
	if (root == NULL)
		root = "/";
	if (verbose)
		fprintf(stderr, "Using %s as root\n", root);
	if (argc <= 1 && stage1 != NULL) {
		stage1 = fileprefix(root, stage1);
		if (stage1 == NULL)
			exit(1);
	}
	if (argc <= 2 && stage2 != NULL) {
		stage2 = fileprefix(root, stage2);
		if (stage2 == NULL)
			exit(1);
	}

        if (verbose) {
		fprintf(stderr, "%s bootstrap on %s\n",
		    (nowrite ? "would install" : "installing"), realdev);
		if (stage1 || stage2) {
			if (stage1)
				fprintf(stderr, "using first-stage %s", stage1);
			if (stage2)
				fprintf(stderr, ", second-stage %s", stage2);
			fprintf(stderr, "\n");
		}
	}

	md_loadboot();

#ifdef SOFTRAID
	sr_installboot(devfd, dev);
#else
	md_installboot(devfd, realdev);
#endif

	return 0;
}