From a78d6b7a5e4524f67e9cfea93e3aee153e80f540 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 29 Aug 2013 11:24:00 +0100
Subject: [PATCH] format: Set MBR partition type byte appropriately
(RHBZ#1000428).
Windows won't see a filesystem unless the MBR partition type
byte is set correctly.
$ ./run ./format/virt-format -a /tmp/test.img
$ ./run ./cat/virt-filesystems -a /tmp/test.img --all --long -h
Name Type VFS Label MBR Size Parent
/dev/sda1 filesystem unknown - - 1.0G -
/dev/sda1 partition - - 83 1.0G /dev/sda
/dev/sda device - - - 1.0G -
$ ./run ./format/virt-format -a /tmp/test.img --filesystem=ntfs
$ ./run ./cat/virt-filesystems -a /tmp/test.img --all --long -h
Name Type VFS Label MBR Size Parent
/dev/sda1 filesystem ntfs - - 1.0G -
/dev/sda1 partition - - 07 1.0G /dev/sda
/dev/sda device - - - 1.0G -
$ ./run ./format/virt-format -a /tmp/test.img --filesystem=vfat
$ ./run ./cat/virt-filesystems -a /tmp/test.img --all --long -h
Name Type VFS Label MBR Size Parent
/dev/sda1 filesystem vfat - - 1.0G -
/dev/sda1 partition - - 0b 1.0G /dev/sda
/dev/sda device - - - 1.0G -
$ ./run ./format/virt-format -a /tmp/test.img --lvm --filesystem=vfat
$ ./run ./cat/virt-filesystems -a /tmp/test.img --all --long -h
Name Type VFS Label MBR Size Parent
/dev/VG/LV filesystem vfat - - 1020M -
/dev/VG/LV lv - - - 1020M /dev/VG
/dev/VG vg - - - 1020M /dev/sda1
/dev/sda1 pv - - - 1020M -
/dev/sda1 partition - - 8e 1.0G /dev/sda
/dev/sda device - - - 1.0G -
Thanks: Gerd Hoffmann (kraxel)
(cherry picked from commit d432ab2b5a965110bab542bfd397785eee9753dd)
---
format/format.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/format/format.c b/format/format.c
index 3418d2c..718fb2b 100644
--- a/format/format.c
+++ b/format/format.c
@@ -364,6 +364,31 @@ do_format (void)
exit (EXIT_FAILURE);
}
free_dev = 1;
+
+ /* Set the partition type byte appropriately, otherwise Windows
+ * won't see the filesystem (RHBZ#1000428).
+ */
+ if (STREQ (ptype, "mbr") || STREQ (ptype, "msdos")) {
+ int mbr_id = 0;
+
+ if (vg && lv)
+ mbr_id = 0x8e;
+ else if (filesystem) {
+ if (STREQ (filesystem, "msdos"))
+ mbr_id = 0x01;
+ else if (STREQ (filesystem, "fat") || STREQ (filesystem, "vfat"))
+ mbr_id = 0x0b;
+ else if (STREQ (filesystem, "ntfs"))
+ mbr_id = 0x07;
+ else if (STRPREFIX (filesystem, "ext"))
+ mbr_id = 0x83;
+ else if (STREQ (filesystem, "minix"))
+ mbr_id = 0x81;
+ }
+
+ if (mbr_id > 0)
+ guestfs_part_set_mbr_id (g, devices[i], 1, mbr_id);
+ }
}
if (vg && lv) {
--
1.8.3.1