ZFS booting without partitions (was: ZFS boot on zfs mirror)

Enrico M. enricom at teppisti.it
Sun May 31 13:11:30 UTC 2009


On Thursday 28 May 2009 15:58:04 Lorenzo Perone wrote:
> Hi,
>
> I tried hard... but without success ;(
>
> the result is, when choosing the disk with the zfs boot
> sectors in it (in my case F5, which goes to ad6), the kernel
> is not found. the console shows:
>
> forth not found
> definitions not found
> only not found
> (the above repeated several times)
>
> can't load 'kernel'
>
> and I get thrown to the loader prompt.
> lsdev does not show any ZFS devices.
>
> Strange thing: if I boot from the other disk, F1, which is my
> ad4 containing the normal ufs system I used to make up the other
> one, and escape to the loader prompt, lsdev actually sees the
> zpool which is on the other disk, and shows:
> zfs0: tank
>
> I tried booting with boot zfs:tank or zfs:tank:/boot/kernel/kernel,
> but there I get the panic: free: guard1 fail message.
> (would boot zfs:tank:/boot/kernel/kernel be correct, anyways?)
>
> Sure I'm doing something wrong, but what...? Is it a problem that
> the pool is made out of the second disk only (ad6)?
>
> Here are my details (note: latest stable and biosdisk.c merged
> with changes shown in r185095. no problems in buildworld/kernel):
>
> <snip>
>
> Machine: p4 4GHz 4 GB RAM (i386)
>
> Note: the pool has actually a different name (heidi
> instead of tank, if this can be of any relevance...),
> just using tank here as it's one of the conventions...
>
> mount (just to show my starting situation)
>
> /dev/mirror/gm0s1a on / (ufs, local)
> devfs on /dev (devfs, local)
> /dev/mirror/gm0s1e on /tmp (ufs, local, soft-updates)
> /dev/mirror/gm0s1f on /usr (ufs, local, soft-updates)
> /dev/mirror/gm0s1d on /var (ufs, local, soft-updates)
>
> gmirror status
>        Name    Status  Components
> mirror/gm0  DEGRADED  ad4
> (ad6 used to be the second disk...)
>
> echo 'LOADER_ZFS_SUPPORT=yes' >> /etc/make.conf
>
> cd /usr/src
> make buildworld && make buildkernel KERNCONF=HEIDI
> make installkernel KERNCONF=HEIDI
> mergemaster
> make installworld
> shutdown -r now
>
> dd if=/dev/zero of=/dev/ad6 bs=512 count=32
>
> zpool create tank ad6
> zfs create tank/usr
> zfs create tank/var
> zfs create -V 4gb tank/swap
> zfs set org.freebsd:swap=on tank/swap
> zpool set bootfs=tank tank
>
> rsync -avx / /tank
> rsync -avx /usr/ /tank/usr
> rsync -avx /var/ /tank/var
> cd /usr/src
> make installkernel KERNCONF=HEIDI DESTDIR=/tank
>
> zpool export tank
>
> dd if=/boot/zfsboot of=/dev/ad6 bs=512 count=1
> dd if=/boot/zfsboot of=/dev/ad6 bs=512 skip=1 seek=1024
>
> zpool import tank
>
> zfs set mountpoint=legacy tank
> zfs set mountpoint=/usr tank/usr
> zfs set mountpoint=/var tank/var
>
> shutdown -r now ...
>
> at the 'mbr prompt' I pressed F5 (the second disk, ad6)
> .. as written above, loader gets loaded (at this stage
> I suppose it's the stuff dd't after block 1024?),
> but kernel not found.
>
> /usr/src/sys/i386/conf/HEIDI:
> (among other things...):
> options KVA_PAGES=512
>
> (/tank)/boot/loader.conf:
> vm.kmem_size="1024M"
> vm.kmem_size_max="1024M"
> vfs.zfs.arc_max="128M"
> vfs.zfs.vdev.cache.size="8M"
> vfs.root.mountfrom="zfs:tank"
>
> (/tank)/etc/fstab:
> # Device		Mountpoint	FStype	Options		Dump	Pass#
> tank		/		zfs	rw		0	0
> /dev/acd0		/cdrom		cd9660	ro,noauto	0	0
>
> </snap>
>
> any help is welcome... don't know where to go from here right now.
>
> BTW: I can't stop thanking the team for the incredible
> pace at which bugs are fixed these days!
>
>
> Regards,
>
> Lorenzo
>
> On 26.05.2009, at 18:42, George Hartzell wrote:
> > Andriy Gapon writes:
> >> on 26/05/2009 19:21 George Hartzell said the following:
> >>> Dmitry Morozovsky writes:
> >>>> On Tue, 26 May 2009, Mickael MAILLOT wrote:
> >>>>
> >>>> MM> Hi,
> >>>> MM>
> >>>> MM> i prefere use zfsboot boot sector, an example is better than
> >>>> a long talk:
> >>>> MM>
> >>>> MM> $ zpool create tank mirror ad4 ad6
> >>>> MM> $ zpool export tank
> >>>> MM> $ dd if=/boot/zfsboot of=/dev/ad4 bs=512 count=1
> >>>> MM> $ dd if=/boot/zfsboot of=/dev/ad6 bs=512 count=1
> >>>> MM> $ dd if=/boot/zfsboot of=/dev/ad4 bs=512 skeep=1  seek=1024
> >>>> MM> $ dd if=/boot/zfsboot of=/dev/ad6 bs=512 skeep=1  seek=1024
> >>>>
> >>>> s/skeep/skip/ ? ;-)
> >>>
> >>> What is the reason for copying zfsboot one bit at a time, as opposed
> >>> to
> >>>
> >>>  dd if=/boot/zfsboot of=/dev/ad4 bs=512 count=2
> >>
> >> seek=1024 for the second part? and no 'count=1' for it? :-)
> >>
> >> [Just guessing] Apparently the first block of zfsboot is some form
> >> of MBR and the
> >> rest is zfs-specific code that goes to magical sector 1024.
> >
> > Ok, I managed to read the argument to seek as "one block", apparently
> > my coffee hasn't hit yet.
> >
> > I'm still confused about the two parts of zfsboot and what's magical
> > about seeking to 1024.
> >
> > g.

I obtained the same result with FreeBSD 7 stable.
I installed first a new system in a scsi disk with ufs
I put LOADER_ZFS_SUPPORT=yes in /etc/make.conf, updated src and made 
buildworld without trouble.
I built a new kernel, installed it and installed new world.
Until here, that's all right

Then, I tried with a PATA hard drive, ad2
I resetted the mbr and the partition table with dd if=/dev/zero of=/dev/ad2 
bs=512 count=63
I created a new pool and filesystems:
zpool create test ad2
zfs create test/usr
zfs create test/var
zfs create test/tmp
zfs create test/home
zfs create test/root
zfs create -V 1gb test/swap
zfs set org.freebsd:swap=on test/swap
zpool set bootfs=test test

So, I copied the system in the pool:
find -x / | cpio -pmd /test

... and put "vfs.root.mountfrom=zfs:test" in /test/boot/loader.conf

I set the mountpoints:
zfs set mountpoint=/usr test/usr 
.......
and installed the zfsboot:
zpool export test
dd if=/boot/zfsboot of=/dev/ad2 bs=512 count=1
dd if=/boot/zfsboot of=/dev/ad2 bs=512 skip=1 seek=1024
zpool import test

Help me, please

Enrico




More information about the freebsd-stable mailing list