Re: Booting off raidz *mostly* work

From: Adam McDougall <mcdouga9_at_egr.msu.edu>
Date: Fri, 25 Sep 2009 19:04:39 -0400
Ollivier Robert wrote:
> According to Ollivier Robert:
>> By popular demand:
>> http://www.keltia.net/howtos/zfsboot
> 
> I've succeeded in booting off raidz!
> 
> There is a remaining issue with /boot/loader getting zfs errors at boot time
> resulting in loader.conf not being read. After setting the various variables
> manually (vm.kmem_size, vfs.root.mountfrom) and loading zfs, it works...
> 
> http://static.keltia.net/download/raidz-boot.png
> 
> I've updated the howto to reflect that.
> 
> Any help in tackling the last issue is welcome.
> 

I don't have help for raid-z, but I can contribute some parts of my own 
procedure that have been helpful:

--------------------------------------------------------------------------

- If you would prefer to SSH into the livefs shell (have network access 
but hate typing out the commands manually, or you have to put up with a 
painful console terminal such as serial, not to mention that ctrl-c 
makes the livefs shell abort and try to go back to sysinstall):

ifconfig foo0 inet 10.0.0.2/24
route add default 10.0.0.1
echo "nameserver 10.0.0.1" >> /etc/resolv.conf
echo "domain example.com" >> /etc/resolv.conf
mkdir /etc/ssh
ssh-keygen -t rsa1 -b 1024 -f /etc/ssh/ssh_host_key -N ""
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ""
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
cp /dist/etc/ssh/sshd_config /tmp/
echo "PermitRootLogin yes" >> /tmp/sshd_config
env > /tmp/env
ln -s /mnt2/bin/csh /bin/csh
/mnt2/usr/sbin/sshd -Ddf /tmp/sshd_config

 From the network:

ssh root_at_10.0.0.2
sh
. /tmp/env
. /mnt2/.profile

(I used /tmp/env to get the PATH settings from the sysinstall shell 
propagated to the ssh shell, and I specifically used -Dd so you can only 
login once since root has no password!)

----------------------------------------------------------------------------

- Thinking ahead to when I need to reinstall a system in the future 
(happens many times during testing), I need to remember to wipe out
existing gmirror or partitions/partition tables:

gmirror clear /dev/da0p2 /dev/da1p2
gpart delete -i 3, 2, 1, gpart destroy da0 etc

I strongly suggest putting swap on a gmirror if it isn't going to be 
protected by another form of raid, even though it contains no valuable 
data, I don't want my system to go down because of a failure on a 
non-redundant swap volume.

Something like:
gmirror label -v -b prefer swap /dev/da0p2 /dev/da1p2 && \
echo '/dev/mirror/swap none swap sw 0 0' >> /rpool/ROOT/freebsd/etc/fstab

It would also be handy to enable gmirror status checks in periodic.conf 
although I used a cronned script so I get paged more than once a day if 
there is a problem.

---------------------------------------------------------------------

- You could use jot to duplicate various gpart commands to multiple 
drives, examples:

Clear 2 drives with up to 3 partitions each:
jot -w "gpart delete -i 3 da" -s \; 2 0 1 | sh
jot -w "gpart delete -i 2 da" -s \; 2 0 1 | sh
jot -w "gpart delete -i 1 da" -s \; 2 0 1 | sh
jot -w "gpart destroy da" -s \; 2 0 1 | sh

Clear 8 drives with up to 3 partitions each:
jot -w "gpart delete -i 3 da" -s \; 8 0 7 | sh
jot -w "gpart delete -i 2 da" -s \; 8 0 7 | sh
jot -w "gpart delete -i 1 da" -s \; 8 0 7 | sh
jot -w "gpart destroy da" -s \; 8 0 7 | sh

-----------------------------------------------------------------------

- In 8.0-BETA2 or above, you can use some new features in gpart for gpt 
auto sizing to automatically calculate the starting sector or even let 
your last partition use all remaining space: (helpful so you don't need 
to do as much math and less typing)

Create gpt, set partition active, create 3 partitions on 2 drives using 
all remaining space after the boot and swap:
jot -w "gpart create -s GPT da" -s \; 2 0 1 | sh
jot -w "echo 'a 1' | fdisk -f - -q /dev/da" -s \; 2 0 1 | sh
jot -w "gpart add -s 128 -t freebsd-boot da" -s \; 2 0 1 | sh
jot -w "gpart add -s 4194304 -t freebsd-swap da" -s \; 2 0 1 | sh
jot -w "gpart add -t freebsd-zfs da" -s \; 2 0 1 | sh

Similar for installing boot code for 2 drives:
jot -w "gpart bootcode -b /rpool/ROOT/freebsd/boot/pmbr -p \
/rpool/ROOT/freebsd/boot/gptzfsboot -i 1 da" -s \; 2 0 1 | sh

------------------------------------------------------------------------

- Instead of extracting dists from the install media, I chose to build 
tar files of a system image using procedures gleaned from the jail 
manpage (its pretty easy), that way I can add loader support and plenty 
of customizations to my image, use an up to date build, even include the 
source and ports trees for convenience into my tar, and the tar tends to 
extract in just a couple minutes on the destination system (70-180 
seconds depending on the system and what is in the tar).  This way I can 
also use the 8.0 livefs to install either 7.x or 8.x just based on which 
tar I download.  Obviously this has more benefit if you have more than a 
small number of systems to install; if its just one or two then 
pre-customizing isn't worth it.  I stopped including the portsnap files 
dir in favor of a post-install fresh 'portsnap fetch' though, because 
after just a couple weeks, it seemed like my 'portsnap fetch' and 
'update' took longer than getting a fresh copy.  Since I track -stable 
on my servers, its nice to keep my tar updated every month or few weeks 
and then my new installs don't each require a source update since they 
start life being fairly up to date already.  Also a very nice result is 
by adding NO_FOO options to the image build, the resulting image never 
has parts of the base that you never wanted in the first place, for 
example if you leave out sendmail or lpr, so you don't have to worry 
about 'make check-old' being complete enough.
Received on Fri Sep 25 2009 - 21:04:43 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:56 UTC