fdisk from util-linux doesn't write boot code into the msdos MBR when it updates the partition table. Neither does libparted when updating the protective partition in the MBR as part of a GPT. Writing boot code is the responsibility of boot loader installation, not a partitioning tool.
New behaviour, matching what fdisk does: 1. If there's no recognisable msdos partition table then a new MBR will be written including zeroed boot code. 2. When updating an msdos partition table existing boot code in the MBR will be maintained. Original report: Unwanted install of loader in MBR https://gitlab.gnome.org/GNOME/gparted/-/issues/205 Signed-off-by: Mike Fleetwood <[email protected]> --- NEWS | 7 +++- libparted/labels/dos.c | 22 ----------- libparted/mbr.s | 85 ------------------------------------------ 3 files changed, 6 insertions(+), 108 deletions(-) delete mode 100644 libparted/mbr.s diff --git a/NEWS b/NEWS index 7cfca99..7b44674 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,12 @@ GNU parted NEWS -*- outline -*- * Noteworthy changes in release ?.? (????-??-??) [?] +** New Features + +** Bug Fixes + + Stop replacing boot code in the MBR when updating an existing msdos + partition table. * Noteworthy changes in release 3.6 (2023-04-10) [stable] @@ -19,7 +25,6 @@ GNU parted NEWS -*- outline -*- Add display of GPT disk and partition UUIDs in JSON output - ** Bug Fixes Fix use of enums in flag limits by switching to using #define diff --git a/libparted/labels/dos.c b/libparted/labels/dos.c index e6a0105..443209e 100644 --- a/libparted/labels/dos.c +++ b/libparted/labels/dos.c @@ -35,23 +35,6 @@ #include "misc.h" #include "pt-tools.h" -/* this MBR boot code is loaded into 0000:7c00 by the BIOS. See mbr.s for - * the source, and how to build it - */ - -static const char MBR_BOOT_CODE[] = { - 0xfa, 0xb8, 0x00, 0x10, 0x8e, 0xd0, 0xbc, 0x00, - 0xb0, 0xb8, 0x00, 0x00, 0x8e, 0xd8, 0x8e, 0xc0, - 0xfb, 0xbe, 0x00, 0x7c, 0xbf, 0x00, 0x06, 0xb9, - 0x00, 0x02, 0xf3, 0xa4, 0xea, 0x21, 0x06, 0x00, - 0x00, 0xbe, 0xbe, 0x07, 0x38, 0x04, 0x75, 0x0b, - 0x83, 0xc6, 0x10, 0x81, 0xfe, 0xfe, 0x07, 0x75, - 0xf3, 0xeb, 0x16, 0xb4, 0x02, 0xb0, 0x01, 0xbb, - 0x00, 0x7c, 0xb2, 0x80, 0x8a, 0x74, 0x01, 0x8b, - 0x4c, 0x02, 0xcd, 0x13, 0xea, 0x00, 0x7c, 0x00, - 0x00, 0xeb, 0xfe -}; - #define MSDOS_MAGIC 0xAA55 #define PARTITION_MAGIC_MAGIC 0xf6f6 @@ -1443,11 +1426,6 @@ msdos_write (const PedDisk* disk) return 0; DosRawTable *table = (DosRawTable *) s0; - if (!table->boot_code[0]) { - memset (table, 0, 512); - memcpy (table->boot_code, MBR_BOOT_CODE, sizeof (MBR_BOOT_CODE)); - } - /* If there is no unique identifier, generate a random one */ if (!table->mbr_signature) table->mbr_signature = generate_random_uint32 (); diff --git a/libparted/mbr.s b/libparted/mbr.s deleted file mode 100644 index 8ac2240..0000000 --- a/libparted/mbr.s +++ /dev/null @@ -1,85 +0,0 @@ -; libparted - a library for manipulating disk partitions -; Copyright (C) 1999-2000, 2007, 2009-2014, 2019-2023 Free Software -; Foundation, Inc. -; -; This program is free software; you can redistribute it and/or modify -; it under the terms of the GNU General Public License as published by -; the Free Software Foundation; either version 3 of the License, or -; (at your option) any later version. -; -; This program is distributed in the hope that it will be useful, -; but WITHOUT ANY WARRANTY; without even the implied warranty of -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -; GNU General Public License for more details. -; -; You should have received a copy of the GNU General Public License -; along with this program. If not, see <http://www.gnu.org/licenses/>. - -; NOTE: I build this with: -; $ as86 -b /dev/stdout mbr.s | hexdump -e '8/1 "0x%02x, " "\n"' -; -; The build isn't done automagically by make, because as86 may not be on many -; machines (particularly non-x86). Also, it seems rather difficult to get -; as86 to build object files that can be linked, especially as it's 16 bit -; code... - -USE16 - -; This code, plus the partition table is loaded into 0000:7C00 by the BIOS - -.text - -; set top of stack to 1000:B000 - - cli - - mov ax, #0x1000 - mov ss, ax - mov sp, #0xB000 - - mov ax, #0x0000 - mov ds, ax - mov es, ax - - sti - -; Copy what the BIOS loaded (i.e. the MBR + head of partition table) from -; 0000:7c00 to 0000:0600 - - mov si, #0x7c00 - mov di, #0x0600 - mov cx, #0x200 - rep - movsb - -; Jump to the copy of the MBR - - jmp 0x0000:find_boot_partition + 0x0600 - -find_boot_partition: - mov si, #0x07BE - -check_next_bootable: - cmp [si], al - jnz found_bootable - add si, #0x0010 - cmp si, #0x07FE - jnz check_next_bootable - jmp error - -found_bootable: - -; Load in the boot sector at 0000:7c00 - - mov ah, #2 ; BIOS command (read) - mov al, #1 ; count - mov bx, #0x7c00 ; destination pointer - mov dl, #0x80 ; drive - mov dh, byte ptr [si + 1] ; head - mov cx, word ptr [si + 2] ; sector / cylinder - int #0x13 ; BIOS read interrupt - - jmp 0x0000:0x7c00 ; hand control to boot sector - -error: - jmp error -- 2.43.7
