grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] added support for whole disk zfs embedding


From: Andrei Borzenkov
Subject: Re: [PATCH] added support for whole disk zfs embedding
Date: Thu, 16 Apr 2015 07:38:09 +0300

В Wed, 15 Apr 2015 23:00:11 +0300
Toomas Soome <address@hidden> пишет:

> hi!
> 
> well, scratch please the previous zfs related updates, sorry for confusion:)
> 
> anyhow, next small chunk adds support for "whole disk" (GPT partitioned) 
> zpool embedding. if the disk already got BIOS boot partition, it will be 
> used, if there is none, zfs partition is used and grub is embedded to zpool 
> bootblock area.

No. Linux never paid any attention to partition types (neither MBR nor
GPT) and we have no idea how partition is used. That is why
grub-bios-setup actually checks that we *do* know what is on this
partition and ensures there is reserved space for embedding.

bios_grub is different - here we explicitly declare this partition type
as reserved for GRUB.

The right thing to do is to decouple boot code from core.img on
install similar to

grub-(install|buis-setup) --embed /dev/sda1 /dev/sda

which will embed into reserved area on /dev/sda1 and write boot code
into MBR pointing at /dev/sda1. 

I'm fine with making it --boot-code /dev/sda /dev/sda1 :)

> 
> rgds,
> toomas
> 
> ---
>  grub-core/fs/zfs/zfs.c       |    2 +-
>  grub-core/partmap/gpt.c      |    9 +++++++++
>  include/grub/gpt_partition.h |    7 +++++++
>  3 files changed, 17 insertions(+), 1 deletion(-)
> 
> diff --git a/grub-core/fs/zfs/zfs.c b/grub-core/fs/zfs/zfs.c
> index 0cbb84b..2689986 100644
> --- a/grub-core/fs/zfs/zfs.c
> +++ b/grub-core/fs/zfs/zfs.c
> @@ -4291,7 +4291,7 @@ static struct grub_fs grub_zfs_fs = {
>  #ifdef GRUB_UTIL
>    .embed = grub_zfs_embed,
>    .reserved_first_sector = 1,
> -  .blocklist_install = 0,
> +  .blocklist_install = 1,

Why? Nothing in your patch enables blocklists support on ZFS nor is it
even remotely possible for all I can tell.

>  #endif
>    .next = 0
>  };
> diff --git a/grub-core/partmap/gpt.c b/grub-core/partmap/gpt.c
> index 83bcba7..cacc8e8 100644
> --- a/grub-core/partmap/gpt.c
> +++ b/grub-core/partmap/gpt.c
> @@ -24,6 +24,8 @@
>  #include <grub/dl.h>
>  #include <grub/msdos_partition.h>
>  #include <grub/gpt_partition.h>
> +#include <grub/zfs/zio.h>
> +#include <grub/zfs/vdev_impl.h>
>  #include <grub/i18n.h>
>  
>  GRUB_MOD_LICENSE ("GPLv3+");
> @@ -37,6 +39,7 @@ static const grub_gpt_part_type_t 
> grub_gpt_partition_type_empty = GRUB_GPT_PARTI
>  
>  #ifdef GRUB_UTIL
>  static const grub_gpt_part_type_t grub_gpt_partition_type_bios_boot = 
> GRUB_GPT_PARTITION_TYPE_BIOS_BOOT;
> +static const grub_gpt_part_type_t grub_gpt_partition_type_zfs = 
> GRUB_GPT_PARTITION_TYPE_ZFS;
>  #endif
>  
>  /* 512 << 7 = 65536 byte sectors.  */
> @@ -162,6 +165,12 @@ find_usable_region (grub_disk_t disk __attribute__ 
> ((unused)),
>        return 1;
>      }
>  
> +  if (! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_zfs, 16))
> +    {
> +      ctx->start = p->start + (VDEV_BOOT_OFFSET >> GRUB_DISK_SECTOR_BITS);
> +      ctx->len = (VDEV_BOOT_SIZE >> GRUB_DISK_SECTOR_BITS);
> +      return 1;
> +    }
>    return 0;
>  }
>  
> diff --git a/include/grub/gpt_partition.h b/include/grub/gpt_partition.h
> index 1b32f67..04c9f97 100644
> --- a/include/grub/gpt_partition.h
> +++ b/include/grub/gpt_partition.h
> @@ -50,6 +50,13 @@ typedef struct grub_gpt_part_type grub_gpt_part_type_t;
>       { 0x85, 0xD2, 0xE1, 0xE9, 0x04, 0x34, 0xCF, 0xB3 }      \
>    }
>  
> +#define GRUB_GPT_PARTITION_TYPE_ZFS \
> +  { grub_cpu_to_le32_compile_time (0x6A898CC3U),\
> +      grub_cpu_to_le16_compile_time (0x1DD2), \
> +      grub_cpu_to_le16_compile_time (0x11B2),               \
> +     { 0x99, 0xA6, 0x08, 0x00, 0x20, 0x73, 0x66, 0x31 }      \
> +  }
> +
>  struct grub_gpt_header
>  {
>    grub_uint8_t magic[8];




reply via email to

[Prev in Thread] Current Thread [Next in Thread]