Debian Squeeze jest pierwszym wydaniem wspierającym oficjalnie jądra z FreeBSD. Jednym z ciekawszych funkcjonalności wbudowanych w te systemy jest natywne obsługa ZFS [1]. Także instalator wspiera ten system plików, jednak (pomimo kilku prób) nie udało mi się zainstalować z jego pomocą systemu, którego rootfs byłby na ZFS-ie (na ogół błędy dotyczyły zakładania systemu plików lub instalacji gruba). Poniżej przedstawię metodę ręcznej instalacji z wykorzystaniem działającego systemu Debian GNU/kFreeBSD, tak aby całość systemu (łącznie z /boot) znajdowała się pod ZFS-em.

Przygotowanie dysków

Utworzenie tablicy partycji

Tworzymy tablice partycji typu GPT [2].

root@debian-bsd:~# parted /dev/da0 'mklabel gpt'
Warning: The existing disk label on /dev/da1 will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
Information: You may need to update /etc/fstab.

Utworzenie partycji

Zakładamy dwie partycje: do wgrania gruba (w przykładzie 1 MB) oraz wgrania systemu (w przykładzie 999 GB), możemy też zostawić trochę miejsca ...

root@debian-bsd:~# parted /dev/da0 'mkpart'
Partition name?  []? grub
File system type?  [ext2]?
Start? 0
End? 1049kB
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? I
Information: You may need to update /etc/fstab.

root@debian-bsd:~# parted /dev/da0 'mkpart'
Partition name?  []? zfs
File system type?  [ext2]?
Start? 1000MB
End? 1000GB
Information: You may need to update /etc/fstab.

oraz ustawiamy flagę (dla 1 MB partycji) informującą, iż jest ona przeznaczona pod wgranie gruba (nie jest to /boot, a jedynie partycja bez systemu plików dla samego gruba). Brak tego kroku skutkowałby błędem: "This GPT partition label has no BIOS Boot Partition; embedding won't be possible!".

root@debian-bsd:~# parted /dev/da0 'set 1 bios_grub on'
Information: You may need to update /etc/fstab.

Wszystkie te kroki powtarzamy dla drugiego dysku (w przypadku niektórych systemów wielodyskowych - takich jak Sun Fire X4540, na którym powstawał ten opis - należy zwrócić uwagę aby oba dyski należały do grupy dysków umożliwiających bootowanie maszyny)

Utworzenie poola ZFS-owego

zpool create rpool mirror /dev/da0p2 /dev/da1p2

Instalacja systemu

Do instalacji systemu na przygotowanym dysku można wykorzystać debootstrap lub sklonować system, z którego dokonywaliśmy instalacji poprzez:

root@debian-bsd:~# cd / && tar -cf - --exclude="./rpool/*" --exclude="./proc/*" --exclude="./sys/*" --exclude="./dev/*" --exclude="./tmp/*" . | tar --numeric-owner -C /rpool/ -xf -

Instalacja grub2

Po zainstalowaniu systemu na docelowym dysku należy dokonać instalacji bootloadera, w tym celu skorzystamy z chrootowanego środowiska:

chroot /rpool/

W ramach niego powinniśmy zamontować systemy takie jak /dev, /proc, ...:

mount -t devfs devfs /dev
mount -t linprocfs linprocfs /proc/
mount -t linsysfs linsysfs /sys

A następnie zainstalować gruba i zaktualizować jego konfigurację:

grub-install /dev/da0
grub-install /dev/da1
update-grub

Poprawny wpis uruchomieniowy powinien wyglądać podobnie do poniższego:

insmod part_gpt
insmod zfs
set root='(hd0,2)'
search --no-floppy --fs-uuid --set f3d36c1b24128f4f
echo            'Loading kernel of FreeBSD 8.1-1-amd64 ...'
kfreebsd        //@/boot/kfreebsd-8.1-1-amd64.gz
kfreebsd_module_elf     //@/lib/modules/8.1-1-amd64/opensolaris.ko
kfreebsd_module_elf     //@/lib/modules/8.1-1-amd64/zfs.ko
kfreebsd_module     //@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
set kFreeBSD.vfs.root.mountfrom=zfs:rpool
set kFreeBSD.vfs.root.mountfrom.options=rw

Uwagi dodatkowe

Jeżeli instalatorowi systemu, który klonowaliśmy lub debootstrapowi coś nie do końca wyszło, możemy spotkać się z problemami przy restartowaniu usług poprzez /etc/init.d/XXX restart (komunikat "Warning: Fake start-stop-daemon called, doing nothing") lub invoke-rc.d XXX reload (komunikat "invoke-rc.d: policy-rc.d denied execution of reload."). Pierwszy z problemów rozwiązuje: apt-get install dpkg --reinstall drugi natomiast rm /usr/sbin/policy-rc.d.


Przypisy:

  1. http://pl.wikipedia.org/wiki/ZFS
  2. http://pl.wikipedia.org/wiki/GUID_Partition_Table