Subject: Re: port-shark/35576 - Make sysinst clear MBR
To: None <jmmv@NetBSD.org, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org,>
From: Julio M. Merino Vidal <jmmv84@gmail.com>
List: netbsd-bugs
Date: 03/11/2007 20:20:03
The following reply was made to PR port-shark/35576; it has been noted by GNATS.

From: "Julio M. Merino Vidal" <jmmv84@gmail.com>
To: David Laight <david@l8s.co.uk>
Cc: gnats-bugs@NetBSD.org, "Julio M. Merino Vidal" <jmmv@NetBSD.org>,
	netbsd-bugs@netbsd.org, Dan McMahill <dmcmahill@NetBSD.org>
Subject: Re: port-shark/35576 - Make sysinst clear MBR
Date: Sun, 11 Mar 2007 21:17:46 +0100

 On 11/03/2007, at 21:10, David Laight wrote:
 
 > On Sun, Mar 11, 2007 at 08:05:06PM +0000, Julio M. Merino Vidal wrote:
 >> The following reply was made to PR port-shark/35576; it has been  
 >> noted by GNATS.
 >>
 >>  Hi,
 >>
 >>  The attached patch for sysinst asks the user if he wants to clear  
 >> the
 >>  MBR and does so.  It also tells him how to configure the firmware to
 >>  boot from the on-disk kernel.
 >>
 >>  But... I feel the question is useless.  Is it there any reason  
 >> not to
 >>  clear the MBR?  If there is not, I'll change the code to
 >>  unconditionally clear it and only add a message at the end of the
 >>  installation to tell the user what to do on the firmware.
 >
 > What do you mean by 'clear the mbr' ?
 > I suspect you want the mbr editor ?
 
 No, the first sector has to be cleared, as in "filled with zeros".  See:
 
 http://www.netbsd.org/Ports/shark/faq.html#gen_shark_disk_boot
 
 >>   
 >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0ARCS=20file:=20=
 >>  /cvsroot/src/distrib/utils/sysinst/arch/shark/ 
 >> md.c,v=0Aretrieving=20=
 >>  revision=201.19=0Adiff=20-u=20-p=20-u=20-r1.19=20md.c=0A---=20=
 >>  arch/shark/md.c=095=20Apr=202006=2016:55:07=20-0000=091.19=0A+++=20=
 >
 > Unreadable....
 
 Ew, I wonder why...
 
 Repasting without any of the translations, just the english messages  
 to avoid encoding problems:
 
 Index: arch/shark/md.c
 ===================================================================
 RCS file: /cvsroot/src/distrib/utils/sysinst/arch/shark/md.c,v
 retrieving revision 1.19
 diff -u -p -u -r1.19 md.c
 --- arch/shark/md.c	5 Apr 2006 16:55:07 -0000	1.19
 +++ arch/shark/md.c	11 Mar 2007 20:00:06 -0000
 @@ -53,6 +53,31 @@
 #include "msg_defs.h"
 #include "menu_defs.h"
 +/*
 + * Clears the disk's first sector by writing all zeros over it.
 + * Returns 0 on success, -1 on failure.  Leaves the disk's path in
 + * the output diskpath buffer for further usage in error messages.
 + */
 +static int
 +clear_mbr(const char *disk, char *diskpath, size_t diskpathlen)
 +{
 +	int fd;
 +	char sector[512];
 +
 +	fd = opendisk(disk, O_WRONLY, diskpath, diskpathlen, 0);
 +	if (fd < 0)
 +		return -1;
 +
 +	memset(sector, 0, sizeof(sector));
 +	if (pwrite(fd, &sector, sizeof(sector), 0) < 0) {
 +		close(fd);
 +		return -1;
 +	}
 +
 +	close(fd);
 +	return 0;
 +}
 +
 int
 md_get_info(void)
 {
 @@ -109,6 +134,18 @@ md_pre_disklabel(void)
 int
 md_post_disklabel(void)
 {
 +
 +	msg_display(MSG_clearmbr);
 +	process_menu(MENU_yesno, NULL);
 +	if (yesno) {
 +		char diskpath[MAXPATHLEN];
 +
 +		if (clear_mbr(diskdev, diskpath, sizeof(diskpath)) == -1) {
 +			msg_display(MSG_badclearmbr, diskpath);
 +			process_menu(MENU_ok, NULL);
 +		}
 +	}
 +
 	return 0;
 }
 Index: arch/shark/msg.md.en
 ===================================================================
 RCS file: /cvsroot/src/distrib/utils/sysinst/arch/shark/msg.md.en,v
 retrieving revision 1.6
 diff -u -p -u -r1.6 msg.md.en
 --- arch/shark/msg.md.en	12 Jun 2003 11:20:13 -0000	1.6
 +++ arch/shark/msg.md.en	11 Mar 2007 20:00:06 -0000
 @@ -77,3 +77,28 @@ message arm32fspart
 message set_kernel_1
 {Kernel (GENERIC)}
 +
 +message clearmbr
 +{The DNARD's firmware can load a NetBSD kernel straight from a FFS  
 partition
 +on the local hard disk.  However, it will not recognize the disk as  
 bootable
 +if it has an i386-like MBR on the first sector.
 +
 +Furthermore, to automatically boot the system from the disk you will  
 need to
 +manually run the following command from OpenFirmare's shell, unless  
 it is
 +already configured appropriately:
 +
 +setenv boot-device disk:\\netbsd.aout
 +
 +Do you want me to clear the first sector to ensure the disk is  
 bootable?
 +Note that the firmware's configuration will be left untouched.
 +
 +}
 +
 +message badclearmbr
 +{Failed to clear the disk's first sector.  If the firmware cannot  
 see the
 +disk, try to run the following command manually from the installer's  
 shell
 +utility:
 +
 +dd if=/dev/zero of=%s bs=512 count=1
 +
 +}
 
 -- 
 Julio M. Merino Vidal <jmmv84@gmail.com>