Extending zfsboot.c to allow selecting filesystem from boot.config

Andriy Gapon avg at FreeBSD.org
Wed Oct 19 15:39:53 UTC 2011


on 19/10/2011 09:21 Florian Wagner said the following:

Somewhere about this line an attribution of my text was expected :-)

>> on 15/10/2011 22:43 Florian Wagner said the following:
>>> Hi,
>>> 
>>> from looking at the code in sys/boot/i386/zfsboot/zfsboot.c the ZFS 
>>> aware boot block already allows to select pool to load the kernel from
>>> by adding <POOL>:<FILE TO BOOT> to the boot.config. As this code calls
>>> the zfs_mount_pool function it will look for the bootfs property on the
>>> new pool or use its root dataset to get the file from there.
>>> 
>>> How much work would it be to extend the loader to also allow selecting
>>> a ZFS filesystem?
>>> 
>>> What I'd like to do is place a boot.config on the (otherwise empty) 
>>> root of my system pool and then tell it to get the loader from another
>>> filesystem by putting "rpool/root/stable-8-r226381:/boot/zfsloader" in
>>> there.
>> 
>> Please check out the following changes: 
>> https://gitorious.org/~avg/freebsd/avgbsd/commit/8c3808c4bb2a2cd746db3e9c46871c9bdf943ef6
>>
>> 
https://gitorious.org/~avg/freebsd/avgbsd/commit/0b4279c0d366d9f2b5bb9d4c0dd3229d8936d92b
>> https://gitorious.org/~avg/freebsd/avgbsd/commit/b29ab78b079f27918de1683e88bcb1817a0e5969
>>
>> 
https://gitorious.org/~avg/freebsd/avgbsd/commit/f49add15516dfd582258b6820b8f0254cf9419a3
>> https://gitorious.org/~avg/freebsd/avgbsd/commit/e072b443b0f59fe1ff54a70d2437d63698bbf597
>>
>> 
https://gitorious.org/~avg/freebsd/avgbsd/commit/f701760c10812c5b6925352fb003408c19170063
> 
> Looks great!
> 
> I've applied the patches to my checkout of Stable 8 and gave the resulting
> gptzfsboot and zfsloader a cursory try in a virtual machine.

Thank you for testing!

> Commit f701760c10812c5b6925352fb003408c19170063 breaks the build of the 
> non-ZFS-enabled bootcode. The syntax is wrong in the following snippet if
> LOADER_ZFS_SUPPORT is not defined. Moving the closing bracket ("};") right
> after the second #endif into the preprocessor conditional fixes that.

Thank you for reporting this!

> @@ -52,14 +52,21 @@ u_int32_t	howto; u_int32_t	bootdev; u_int32_t
> bootflags; +#ifdef LOADER_ZFS_SUPPORT union { +#endif struct { u_int32_t
> pxeinfo; u_int32_t	res2; }; +#ifdef LOADER_ZFS_SUPPORT uint64_t	zfspool; 
> +#endif }; u_int32_t	bootinfo; +#ifdef LOADER_ZFS_SUPPORT +    uint64_t
> zfsroot; +#endif } *kargs;
> 
> 
> The only thing I was a bit confused by is that on the boot prompt only the
> pool and filename to be booted are printed.

Do you mean the (gpt)zfsboot prompt?

> Apart from that it worked as expected. Not having to set vfs.root.mountfrom
> in the loader is nice.

Thanks!
-- 
Andriy Gapon


More information about the freebsd-fs mailing list