From 6e706df7d6d29afe19bf425b00f794daded00a71 Mon Sep 17 00:00:00 2001 From: Pawel Jakub Dawidek Date: Sun, 17 Oct 2010 20:10:00 +0000 Subject: MFC r213133,r213135,r213136,r213137,r213245: r213133: Add three GPT attributes: GPT_ENT_ATTR_BOOTME - this is bootable partition GPT_ENT_ATTR_BOOTONCE - try to boot only once from this partition GPT_ENT_ATTR_BOOTFAILED - set this flag if we cannot boot from partition containing GPT_ENT_ATTR_BOOTONCE flag; note that if we cannot boot from partition that contains only GPT_ENT_ATTR_BOOTME flag, the GPT_ENT_ATTR_BOOTFAILED flag won't be set According to wikipedia Microsoft TechNet says that attributes are divided into two halves: the lower 4 bytes representing partition independent attributes, and the upper 4 bytes are partition type dependent. Microsoft is already using bits 60 (read-only), 62 (hidden) and 63 (do not automount) and I'd like to not collide with those, so we are using bit 59 (bootme), 58 (bootonce) and 57 (bootfailed). Reviewed by: arch (Message-ID: <20100917234542.GE1902@garage.freebsd.pl>) r213135: Allow to configure GPT attributes. It shouldn't be allowed to set bootfailed attribute (it should be allowed only to unset it), but for test purposes it might be useful, so the current code allows it. Reviewed by: arch@ (Message-ID: <20100917234542.GE1902@garage.freebsd.pl>) r213136: - Split code shared by almost any boot loader into separate files and clean up most layering violations: sys/boot/i386/common/rbx.h: RBX_* defines OPT_SET() OPT_CHECK() sys/boot/common/util.[ch]: memcpy() memset() memcmp() bcpy() bzero() bcmp() strcmp() strncmp() [new] strcpy() strcat() strchr() strlen() printf() sys/boot/i386/common/cons.[ch]: ioctrl putc() xputc() putchar() getc() xgetc() keyhit() [now takes number of seconds as an argument] getstr() sys/boot/i386/common/drv.[ch]: struct dsk drvread() drvwrite() [new] drvsize() [new] sys/boot/common/crc32.[ch] [new] sys/boot/common/gpt.[ch] [new] - Teach gptboot and gptzfsboot about new files. I haven't touched the rest, but there is still a lot of code duplication to be removed. - Implement full GPT support. Currently we just read primary header and partition table and don't care about checksums, etc. After this change we verify checksums of primary header and primary partition table and if there is a problem we fall back to backup header and backup partition table. - Clean up most messages to use prefix of boot program, so in case of an error we know where the error comes from, eg.: gptboot: unable to read primary GPT header - If we can't boot, print boot prompt only once and not every five seconds. - Honour newly added GPT attributes: bootme - this is bootable partition bootonce - try to boot from this partition only once bootfailed - we failed to boot from this partition - Change boot order of gptboot to the following: 1. Try to boot from all the partitions that have both 'bootme' and 'bootonce' attributes one by one. 2. Try to boot from all the partitions that have only 'bootme' attribute one by one. 3. If there are no partitions with 'bootme' attribute, boot from the first UFS partition. - The 'bootonce' functionality is implemented in the following way: 1. Walk through all the partitions and when 'bootonce' attribute is found without 'bootme' attribute, remove 'bootonce' attribute and set 'bootfailed' attribute. 'bootonce' attribute alone means that we tried to boot from this partition, but boot failed after leaving gptboot and machine was restarted. 2. Find partition with both 'bootme' and 'bootonce' attributes. 3. Remove 'bootme' attribute. 4. Try to execute /boot/loader or /boot/kernel/kernel from that partition. If succeeded we stop here. 5. If execution failed, remove 'bootonce' and set 'bootfailed'. 6. Go to 2. If whole boot succeeded there is new /etc/rc.d/gptboot script coming that will log all partitions that we failed to boot from (the ones with 'bootfailed' attribute) and will remove this attribute. It will also find partition with 'bootonce' attribute - this is the partition we booted from successfully. The script will log success and remove the attribute. All the GPT updates we do here goes to both primary and backup GPT if they are valid. We don't touch headers or partition tables when checksum doesn't match. Reviewed by: arch (Message-ID: <20100917234542.GE1902@garage.freebsd.pl>) Obtained from: Wheel Systems Sp. z o.o. http://www.wheelsystems.com r213137: Add gptboot script that is responsible for: - looking for partition with 'bootonce' attribute alone (without 'bootme' attribute), removing it and logging that we successfully booted from this partition. - looking for partitions with 'bootfailed' attribute, removing it and logging that we failed to boot from this partition. Reviewed by: arch (Message-ID: <20100917234542.GE1902@garage.freebsd.pl>) Obtained from: Wheel Systems Sp. z o.o. http://www.wheelsystems.com r213245: Document recently added GPT attributes (bootme, bootonce, bootfailed) and list other schemes attributes. Reviewed by: simon, rpaulo --- sbin/geom/class/part/gpart.8 | 105 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) (limited to 'sbin') diff --git a/sbin/geom/class/part/gpart.8 b/sbin/geom/class/part/gpart.8 index 60fb4632b21e..9dd999229792 100644 --- a/sbin/geom/class/part/gpart.8 +++ b/sbin/geom/class/part/gpart.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd Sep 24, 2010 +.Dd September 28, 2010 .Dt GPART 8 .Os .Sh NAME @@ -382,6 +382,9 @@ about its use. .\" ==== SET ==== .It Cm set Set the named attribute on the partition entry. +See the section entitled +.Sx "ATTRIBUTES" +below for a list of available attributes. .Pp Additional options include: .Bl -tag -width 10n @@ -406,6 +409,9 @@ action and can be used to undo any changes that have not been committed. .\" ==== UNSET ==== .It Cm unset Clear the named attribute on the partition entry. +See the section entitled +.Sx "ATTRIBUTES" +below for a list of available attributes. .Pp Additional options include: .Bl -tag -width 10n @@ -502,6 +508,103 @@ This type is known as .Qq Li "!024dee41-33e7-11d3-9d69-0008c781f39f" by GPT. .El +.Sh ATTRIBUTES +The scheme-specific attributes for EBR: +.Bl -tag -width ".Ar active" +.It Ar active +.El +.Pp +The scheme-specific attributes for GPT: +.Bl -tag -width ".Ar bootfailed" +.It Ar bootme +When set, the +.Nm gptboot +stage 1 boot loader will try to boot the system from this partition. +Multiple partitions might be marked with the +.Ar bootme +attribute. +In such scenario the +.Nm gptboot +will try all +.Ar bootme +partitions one by one, until the next boot stage is successfully entered. +.It Ar bootonce +Setting this attribute automatically sets the +.Ar bootme +attribute. +When set, the +.Nm gptboot +stage 1 boot loader will try to boot the system from this partition only once. +Partitions with both +.Ar bootonce +and +.Ar bootme +attributes are tried before partitions with only the +.Ar bootme +attribute. +Before +.Ar bootonce +partition is tried, the +.Nm gptboot +removes the +.Ar bootme +attribute and tries to execute the next boot stage. +If it fails, the +.Ar bootonce +attribute that is now alone is replaced with the +.Ar bootfailed +attribute. +If the execution of the next boot stage succeeds, but the system is not fully +booted, the +.Nm gptboot +will look for +.Ar bootonce +attributes alone (without the +.Ar bootme +attribute) on the next system boot and will replace those with the +.Ar bootfailed +attribute. +If the system is fully booted, the +.Pa /etc/rc.d/gptboot +start-up script will look for partition with the +.Ar bootonce +attribute alone, will remove the attribute and log that the system was +successfully booted from this partition. +There should be at most one +.Ar bootonce +partition when system is successfully booted. +Multiple partitions might be marked with the +.Ar bootonce +and +.Ar bootme +attribute pairs. +.It Ar bootfailed +This attribute should not be manually managed. +It is managed by the +.Nm gptboot +stage 1 boot loader and the +.Pa /etc/rc.d/gptboot +start-up script. +This attribute is used to mark partitions that had the +.Ar bootonce +attribute set, but we failed to boot from them. +Once we successfully boot, the +.Pa /etc/rc.d/gptboot +script will log all the partitions we failed to boot from and will remove the +.Ar bootfailed +attributes. +.El +.Pp +The scheme-specific attributes for MBR: +.Bl -tag -width ".Ar active" +.It Ar active +.El +.Pp +The scheme-specific attributes for PC98: +.Bl -tag -width ".Ar bootable" +.It Ar active +.It Ar bootable +.El .Sh OPERATIONAL FLAGS Actions other than the .Cm commit -- cgit v1.3