[manjaro-dev] [PATCH] Thus GPT/UEFI support fixes
Philip Müller
philm at manjaro.org
Fri Dec 13 11:10:43 CET 2013
Hi Ramon,
thx for the patch. One question: how did you test your work? In advanced
mode or in automatic?
Do you know about followed issues we are currently working on?
https://github.com/Antergos/Cnchi/issues/63
https://github.com/Antergos/Cnchi/issues/65
kind regards
Phil
On 12/13/2013 03:05 AM, Ramon Buldo wrote:
> Hello,
> I made some fixes to Thus GTP/UEFI support
>
> - Creation of partitions in a gpt disk
> - Format EFI partition, and mount it on /boot/efi
> - grub2-efi installation
>
> grub2-efi installation isn't done in a chroot because when efibootmgr
> runs it doesn't detect a uefi environment and fails to add a new uefi
> boot entry.
>
> I tested all installation "modes", and the only thing that doesn't
> work is encryption without lvm.
>
> Also another problem I found is if the disk is formatted in mbr, when
> you create the gpt partition you need to reboot for the kernel to
> properly recognize the new disk and be able to create partitions
> without problems.
>
> diff --git a/src/auto_partition.py b/src/auto_partition.py
> index 12b8ed2..ce72c7e 100644
> --- a/src/auto_partition.py
> +++ b/src/auto_partition.py
> @@ -195,6 +195,7 @@ class AutoPartition(object):
>
> def get_devices(self):
> """ Set (and return) all partitions on the device """
> + efi = ""
> boot = ""
> swap = ""
> root = ""
> @@ -206,6 +207,7 @@ class AutoPartition(object):
> # self.auto_device is of type /dev/sdX or /dev/hdX
>
> if self.uefi:
> + efi = self.auto_device + "2"
> boot = self.auto_device + "3"
> swap = self.auto_device + "4"
> root = self.auto_device + "5"
> @@ -242,18 +244,21 @@ class AutoPartition(object):
> if self.home:
> home = "/dev/antergosVG/ManjaroHome"
>
> - return (boot, swap, root, luks, lvm, home)
> + return (efi, boot, swap, root, luks, lvm, home)
>
> def get_mount_devices(self):
> """ Mount_devices will be used when configuring GRUB in
> modify_grub_default() in installation_process.py """
>
> - (boot_device, swap_device, root_device, luks_devices,
> lvm_device, home_device) = self.get_devices()
> + (efi_device, boot_device, swap_device, root_device,
> luks_devices, lvm_device, home_device) = self.get_devices()
>
> mount_devices = {}
> mount_devices["/boot"] = boot_device
> mount_devices["/"] = root_device
> mount_devices["/home"] = home_device
> -
> +
> + if self.uefi:
> + mount_devices["/boot/efi"] = efi_device
> +
> if self.luks:
> mount_devices["/"] = luks_devices[0]
> if self.home and not self.lvm:
> @@ -269,13 +274,16 @@ class AutoPartition(object):
> def get_fs_devices(self):
> """ fs_devices will be used when configuring the fstab file
> in installation_process.py """
>
> - (boot_device, swap_device, root_device, luks_devices,
> lvm_device, home_device) = self.get_devices()
> + (efi_device, boot_device, swap_device, root_device,
> luks_devices, lvm_device, home_device) = self.get_devices()
>
> fs_devices = {}
>
> fs_devices[boot_device] = "ext2"
> fs_devices[swap_device] = "swap"
> -
> +
> + if self.uefi:
> + fs_devices[efi_device] = "vfat"
> +
> if self.luks:
> fs_devices[luks_devices[0]] = "ext4"
> if self.home:
> @@ -327,9 +335,11 @@ class AutoPartition(object):
> if self.uefi:
> gpt_bios_grub_part_size = 2
> uefisys_part_size = 512
> + empty_space_size = 1
> else:
> gpt_bios_grub_part_size = 0
> uefisys_part_size = 0
> + empty_space_size = 0
>
> # Get just the disk size in 1000*1000 MB
> device = self.auto_device
> @@ -359,7 +369,7 @@ class AutoPartition(object):
> if mem_total <= 1572864:
> swap_part_size = mem_total / 1024
>
> - root_part_size = disc_size - (gpt_bios_grub_part_size +
> uefisys_part_size + boot_part_size + swap_part_size)
> + root_part_size = disc_size - (empty_space_size +
> gpt_bios_grub_part_size + uefisys_part_size + boot_part_size +
> swap_part_size)
>
> home_part_size = 0
> if self.home:
> @@ -403,26 +413,26 @@ class AutoPartition(object):
> subprocess.check_call(["dd", "if=/dev/zero", "of=%s" %
> device, "bs=512", "count=2048", "status=noxfer"])
> subprocess.check_call(["wipefs", "-a", device])
> # Create fresh GPT
> - subprocess.check_call(["sgdisk", "--clear", device])
> + subprocess.check_call(['sgdisk --clear %s' % device], shell=True)
> # Create actual partitions
> - subprocess.check_call(['sgdisk',
> '--set-alignment="2048"', '--new=1:1M:+%dM' % gpt_bios_grub_part_size,
> - '--typecode=1:EF02', '--change-name=1:BIOS_GRUB', device])
> - subprocess.check_call(['sgdisk',
> '--set-alignment="2048"', '--new=2:0:+%dM' % uefisys_part_size,
> - '--typecode=2:EF00', '--change-name=2:UEFI_SYSTEM', device])
> - subprocess.check_call(['sgdisk',
> '--set-alignment="2048"', '--new=3:0:+%dM' % boot_part_size,
> - '--typecode=3:8300', '--attributes=3:set:2',
> '--change-name=3:MANJARO_BOOT', device])
> + subprocess.check_call(['sgdisk --set-alignment="2048"
> --new=1:1M:+%dM --typecode=1:EF02 --change-name=1:BIOS_GRUB %s'
> + % (gpt_bios_grub_part_size, device)], shell=True)
> + subprocess.check_call(['sgdisk --set-alignment="2048"
> --new=2:0:+%dM --typecode=2:EF00 --change-name=2:UEFI_SYSTEM %s'
> + % (uefisys_part_size, device)], shell=True)
> + subprocess.check_call(['sgdisk --set-alignment="2048"
> --new=3:0:+%dM --typecode=3:8300 --attributes=3:set:2
> --change-name=3:MANJARO_BOOT %s'
> + % (boot_part_size, device)], shell=True)
>
> if self.lvm:
> - subprocess.check_call(['sgdisk',
> '--set-alignment="2048"', '--new=4:0:+%dM' % lvm_pv_part_size,
> - '--typecode=4:8200',
> '--change-name=4:MANJARO_LVM', device])
> + subprocess.check_call(['sgdisk --set-alignment="2048"
> --new=4:0:+%dM --typecode=4:8E00 --change-name=4:MANJARO_LVM %s'
> + % (lvm_pv_part_size, device)], shell=True)
> else:
> - subprocess.check_call(['sgdisk',
> '--set-alignment="2048"', '--new=4:0:+%dM' % swap_part_size,
> - '--typecode=4:8200',
> '--change-name=4:MANJARO_SWAP', device])
> - subprocess.check_call(['sgdisk',
> '--set-alignment="2048"', '--new=5:0:+%dM' % root_part_size,
> - ' --typecode=5:8300',
> '--change-name=5:MANJARO_ROOT', device])
> + subprocess.check_call(['sgdisk --set-alignment="2048"
> --new=4:0:+%dM --typecode=4:8200 --change-name=4:MANJARO_SWAP %s'
> + % (swap_part_size, device)], shell=True)
> + subprocess.check_call(['sgdisk --set-alignment="2048"
> --new=5:0:+%dM --typecode=5:8300 --change-name=5:MANJARO_ROOT %s'
> + % (root_part_size, device)], shell=True)
> if self.home:
> - subprocess.check_call(['sgdisk',
> '--set-alignment="2048"', '--new=6:0:+%dM' % home_part_size,
> - ' --typecode=6:8300',
> '--change-name=5:MANJARO_HOME', device])
> + subprocess.check_call(['sgdisk
> --set-alignment="2048" --new=6:0:+%dM --typecode=6:8300
> --change-name=5:MANJARO_HOME %s'
> + % (home_part_size, device)], shell=True)
>
> logging.debug(check_output("sgdisk --print %s" % device))
> else:
> @@ -465,10 +475,14 @@ class AutoPartition(object):
> # Wait until /dev initialized correct devices
> subprocess.check_call(["udevadm", "settle"])
>
> - (boot_device, swap_device, root_device, luks_devices,
> lvm_device, home_device) = self.get_devices()
> + (efi_device, boot_device, swap_device, root_device,
> luks_devices, lvm_device, home_device) = self.get_devices()
>
> - if not self.home:
> + if not self.home and self.uefi:
> + logging.debug("EFI %s, Boot %s, Swap %s, Root %s",
> efi_device, boot_device, swap_device, root_device)
> + elif not self.home and not self.uefi:
> logging.debug("Boot %s, Swap %s, Root %s", boot_device,
> swap_device, root_device)
> + elif self.home and self.uefi:
> + logging.debug("EFI %s, Boot %s, Swap %s, Root %s, Home
> %s", efi_device, boot_device, swap_device, root_device, home_device)
> else:
> logging.debug("Boot %s, Swap %s, Root %s, Home %s",
> boot_device, swap_device, root_device, home_device)
>
> @@ -500,7 +514,9 @@ class AutoPartition(object):
> self.mkfs(root_device, "ext4", "/", "ManjaroRoot")
> self.mkfs(swap_device, "swap", "", "ManjaroSwap")
> self.mkfs(boot_device, "ext2", "/boot", "ManjaroBoot")
> -
> + # Format the EFI partition
> + if self.uefi:
> + self.mkfs(efi_device, "vfat", "/boot/efi", "ManjaroEFI")
> if self.home:
> self.mkfs(home_device, "ext4", "/home", "ManjaroHome")
>
> diff --git a/src/installation_process.py b/src/installation_process.py
> index a1ad613..95e8055 100644
> --- a/src/installation_process.py
> +++ b/src/installation_process.py
> @@ -783,13 +783,8 @@ class InstallationProcess(multiprocessing.Process):
>
> self.chroot_mount_special_dirs()
>
> - self.chroot(['grub-install', \
> - '--directory=/usr/lib/grub/%s-efi' % uefi_arch, \
> - '--target=%s-efi' % uefi_arch, \
> - '--bootloader-id="manjaro_grub"', \
> - '--boot-directory=/boot', \
> - '--recheck', \
> - grub_device])
> + subprocess.check_call(['grub-install --target=%s-efi
> --efi-directory=/install/boot/efi --bootloader-id=manjaro_grub '
> + '--boot-directory=/install/boot --recheck' % uefi_arch], shell=True)
>
> self.chroot_umount_special_dirs()
>
> @@ -800,28 +795,6 @@ class InstallationProcess(multiprocessing.Process):
> self.chroot(['sh', '-c', 'LANG=%s grub-mkconfig -o
> /boot/grub/grub.cfg' % locale])
> self.chroot_umount_special_dirs()
>
> - grub_cfg = "%s/boot/grub/grub.cfg" % self.dest_dir
> - grub_standalone =
> "%s/boot/efi/EFI/manjaro_grub/grub%s_standalone.cfg" % (self.dest_dir,
> spec_uefi_arch)
> - try:
> - shutil.copy2(grub_cfg, grub_standalone)
> - except FileNotFoundError:
> - self.queue_event('warning', _("ERROR installing GRUB(2)
> configuration file."))
> - return
> - except FileExistsError:
> - # ignore if already exists
> - pass
> -
> - self.chroot_mount_special_dirs()
> - self.chroot(['grub-mkstandalone', \
> - '--directory=/usr/lib/grub/%s-efi' % uefi_arch, \
> - '--format=%s-efi' % uefi_arch, \
> - '--compression="xz"', \
> -
> '--output="/boot/efi/EFI/manjaro_grub/grub%s_standalone.efi' %
> spec_uefi_arch, \
> - 'boot/grub/grub.cfg'])
> - self.chroot_umount_special_dirs()
> -
> - # TODO: Create a boot entry for Manjaro in the UEFI boot
> manager (is this necessary?)
> -
> def install_bootloader_grub2_locales(self):
> """ Install Grub2 locales """
> dest_locale_dir = os.path.join(self.dest_dir, "boot/grub/locale")
> diff --git a/thus.py b/thus.py
> old mode 100644
> new mode 100755
>
> -------------------------
> Ramon Buldó
> _______________________________________________
> manjaro-dev mailing list
> manjaro-dev at manjaro.org
> http://lists.manjaro.org/cgi-bin/mailman/listinfo/manjaro-dev
More information about the manjaro-dev
mailing list