Wstęp:
FreeBSD instaluje się bezproblemowo, jeżeli chcemy przeznaczyć na nie cały dysk. Niestety kiedy chcemy zainstalować ten system obok innego istniejącego, to oryginalny instalator niewiele w tym pomaga. Z drugiej strony daje możliwość przygotowania systemu plików w zupełnie dowolny sposób, jednak wymaga to odrobinę wiedzy.
Tekst niniejszy bazuje na opublikowanych w sieci artykułach, do których linki można znaleźć na końcu. Podejrzewam, że dla wielu są one wystarczające … i może dla mnie też, bo nawet z nich korzystałem 😉 … ale postanowiłem przetestować procedurę pod VirtualBox a przy okazji spisać ewentualne uwagi 🙂
Instalacja innego systemu:
Zaczynamy od instalacji tego drugiego systemu, u mnie było to akurat Ubuntu 24.04 LTS. Założeniem był start z UEFI i instalacja na GPT. Jak chodzi o Ubuntu całość systemu plików poszła na jedną partycję (co pewnie nie jest najlepsze) a resztę dysku zamierzałem podzielić podczas instalacji FreeBSD. Instalacja w odwrotnej kolejności jest możliwa, ale nie ułatwi to instalacji FreeBSD – i tak trzeba będzie zrobić to ręcznie, bo instalator w trybie automatycznym zabiera cały dysk 🙁
Instalacja FreeBSD:
Po uruchomieniu instalatora z płyty lub pendrajwa wybieramy Install:

Ustawiamy klawiaturę, ustawiamy nazwę hosta i wybieramy co instalować (ja zwykle dodaję ports i src). Jeżeli to potrzebne, to konfigurujemy sieć. Dochodzimy do ekranu związanego z partycjonowaniem dysku:

I tutaj nie korzystamy nawet z opcji Manual przeznaczonej dla ekspertów, a wybieramy opcję Shell. Pojawia się komunikat:
Use this shell to set up partitions for the new system. When finished, mount the system at /mnt and place an fstab file for the new system at /tmp/bsdinstall_etc/fstab. Then type 'exit'. You can also enter the partition editor at any time by entering 'bsdinstall partedit'.
#
Czyli teraz należy przygotować całą strukturę systemu plików a po zakończeniu podmontować ją do /mnt i wrócić do programu instalacyjnego. No to zaczynamy. Aktualnie tablica partycji wygląda tak:
# gpart show da0
=> 2048 419428319 da0 GPT (200G)
2048 2095104 1 efi (1.0G)
2097152 16775168 2 linux-swap (8.0G)
18872320 83886080 3 linux-data (40G)
102758400 316671967 - free - (151G)
Oprogramowanie startowe dodamy do istniejącej już partycji efi, potrzebujemy utworzyć partycje na pamięć wirtualną (freebsd-swap) i na system plików (freebsd-zfs). Dla partycji swap ustalamy rozmiar, a partycja ZFS zajmie resztę dostępnej przestrzeni dysku:
# gpart add -a 1m -s 8G -t freebsd-swap -l swap0 da0
# gpart add -a 1m -t freebsd-zfs -l disk0 da0
W rezultacie mamy:
# gpart show da0
=> 2048 419428319 da0 GPT (200G)
2048 2095104 1 efi (1.0G)
2097152 16775168 2 linux-swap (8.0G)
18872320 83886080 3 linux-data (40G) 102758400 16775168 4 freebsd-swap (8.0G)
119535616 299892736 5 freebsd-zfs (143G)419428352 2015 - free - (1.0M)
To teraz przyszedł czas, żeby utworzyć i podmonotować strukturę systemu plików:
# mount -t tmpfs tmpfs /mnt
# zpool create -o altroot=/mnt zroot da0p5
ZFS filesystem version: 5
ZFS storage pool version: features support (5000)
# zfs set compress=on zroot
# zfs create -o mountpoint=none zroot/ROOT
# zfs create -o mountpoint=none zroot/ROOT/default
# mount -t zfs zroot/ROOT/default /mnt
Jak widać powyżej moduł jądra do obsługi ZFSa załadowała się automatycznie. Kolejny krok to utworzenie pełnej hierarchii systemu plików:
zfs create -o mountpoint=/tmp -o exec=on -o setuid=off zroot/tmp
zfs create -o canmount=off -o mountpoint=/usr zroot/usr
zfs create zroot/usr/home
zfs create -o exec=off -o setuid=off zroot/usr/src
zfs create zroot/usr/obj
zfs create -o mountpoint=/usr/ports -o setuid=off zroot/usr/ports
zfs create -o exec=off -o setuid=off zroot/usr/ports/distfiles
zfs create -o exec=off -o setuid=off zroot/usr/ports/packages
zfs create -o canmount=off -o mountpoint=/var zroot/var
zfs create -o exec=off -o setuid=off zroot/var/audit
zfs create -o exec=off -o setuid=off zroot/var/crash
zfs create -o exec=off -o setuid=off zroot/var/log
zfs create -o atime=on -o exec=off -o setuid=off zroot/var/mail
zfs create -o exec=on -o setuid=off zroot/var/tmp
Do kompletu kilka linków symbolicznych:
ln -s /usr/home /mnt/home
chmod 1777 /mnt/var/tmp
chmod 1777 /mnt/tmp
Konfigurujemy środowisko startowe:
zpool set bootfs=zroot/ROOT/default zroot
Oraz tworzymy plik fstab (/tmp/bsdinstall_etc/fstab) z następującą zawartością:
# Device Mountpoint FStype Options Dump Pass#
/dev/gpt/swap0 none swap sw 0 0
System będzie startowany z poziomu GRUBa, który został wcześniej zainstalowany wraz z Ubuntu. Warto jednak przygotować sobie system plików pod taką konfigurację:
# mount -t msdosfs /dev/ada0p1 /media
# mkdir -p /media/efi/freebsd
# cp /boot/loader.efi /media/EFI/freebsd/loader.efi
# efibootmgr --create --activate --label "FreeBSD" --loader "/media/EFI/freebsd/loader.efi"
# umount /media
Wpisanie powyższych komend powoduje, że start FreeBSD jest domyślnym w UEFI. Można zmienić kolejność poleceniem efibootmgr -o albo później z poziomu oprogramowania UEFI. Na koniec wpisujemy exit i wracamy do instalacji systemu. Ustawiamy hasło roota, dodajemy użytkowników a kiedy pojawi się pytanie, to otwieramy shella i dokonujemy modyfikacji w świeżo zainstalowanym systemie:

Do /etc/rc.conf dopisujemy:
zfs_enable="YES"
Oraz do /boot/loader.conf dodajemy:
zfs_load="YES"
Ponownie wpisujemy exit i restartujemy komputer. Po restarcie uruchamiamy wcześniej zainstalowane Ubuntu.
Konfiguracja GRUBa:
Po uruchomieniu Ubuntu edytujemy plik /etc/grub.d/40_custom (numer na początku nazwy pliku może być inny, zależnie od wersji Ubuntu – początek pliku powinien wyglądać podobnie do widocznego poniżej) i dopisujemy pogrubiony fragment:
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.
# Simply type the menu entries you want to add after this comment.
# Be careful not to change the 'exec tail' line above.
menuentry "FreeBSD" {
insmod part_gpt
insmod fat
set root=(hd0,gpt1)
chainloader /efi/freebsd/loader.efi
}
Dodatkowo modyfikacji wymaga plik /etc/default/grub:
GRUB_DEFAULT="FreeBSD"
# GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=5
Po ustawieniu wszystkich opcji aktualizujemy GRUBa wpisując:
$ sudo update-grub
Po następnym restarcie pojawi się menu startowe GRUBa a jeżeli niczego nie wybierzemy uruchomi się FreeBSD.
Zmiana dysku na większy/mniejszy:
Założeniem przy wymianie dysku jest taka modyfikacja struktury partycji, że modyfikacji podlega tylko rozmiar partycji freebsd-zfs (czyli da0p5 zgodnie z tablicą partycji GPT przedstawioną wyżej).
Zacznijmy od wymiany dysku na większy:
Podłączamy do komputera obydwa dyski, czyli ten stary mniejszy i nowy większy. Uruchamiamy system z płyty instalacyjnej FreeBSD. Wybieramy opcję Live CD (patrz obraz wcześniej) i kopiujemy dyski używając dd:
# dd if=/dev/da0 of=/dev/da1 bs=4M status=progress
Po tej operacji zostanie skopiowany zostanie cały dysk źródłowy (/dev/da0) na dysk docelowy (/dev/da1), ale ponieważ rozmiary dysków były inne to tablica partycji jest uszkodzona:
# gpart show
=> 2048 419428319 da0 GPT (400G)
Najpierw naprawiamy tablicę partycji:
# gpart recover da0
da0 recovered
Później powiększamy partycję freebsd-zfs:
# gpart resize -a 1M -i 5 da0
Jako wyniki mamy:
% gpart show da0
=> 40 838860720 da0 GPT (400G)
40 2008 - free - (1.0M)
2048 2095104 1 efi (1.0G)
2097152 16775168 2 linux-swap (8.0G)
18872320 83886080 3 linux-data (40G)
102758400 16777216 4 freebsd-swap (8.0G)
119535616 719323136 5 freebsd-zfs (343G)
838858752 2008 - free - (1.0M)
Teraz mamy partycję z systemem plików odpowiednio dużą, ale rozszerzenia wymaga jeszcze sam system plików.
Literatura:
Dodaj komentarz