Spis Treści
- Podział na partycje w celu możliwości użycia beadm
- Kroki do wykonania po instalacji
- Dodatki dla serwerów HP
- Dalsze kroki po pierwszym restarcie
| /BootUefi |
Podział na partycje w celu możliwości użycia beadm
Niniejszy dokument prezentuje jak podzielić system na partycje, aby dobrze działał beadm
Źródła w sieci internet
Jest tego sporo. Zważywszy, że zarówno sam system FreeBSD jak również beadm "żyją". Ale podstawowe źródła to:
Blog Dana Langille, a konkretnie artyuł poświęcony beadm
Dodatkowo może posłużyć artykuł Dana Langilla poświęcony wykonaniu upgrade
Wpis 1 na blogu Devil Detail
Wpis 2 na blogu Devil Detail
Jak naprawić partycję GPT - może się rzydać - patrz poniżej
Dokumentacja instalacji serwerów zapisana przez jednego z commiter-ów: Jasona Unovitcha
Instalacja FreeBSD dla płyt głównych z UEFI - np. Supermicro
Sprawdzenie, czy nie uruchomił się graid
Domyślam się, że jest to uproszczenie instalacji dla bardzo początkujących. Konfiguracja danego serwera pozwala na automatyczne uruchomienie się graid-a. Ale popsuje on całą misterną konfigurację. Można go usunąć poprzez poniższe polecenia:
graid stop r0
# w razie potrzeby wywołanie helpa (@@@ do uzupełnienia @@@)
#
graid help
Zamazanie poprzednich prób
Jeżeli były nieudane próby instalacji lub dyski nie są nowe, to trzeba je nieco przeczyścić:
zpool status
zpool import -f -o altroot=/mnt system
zpool destroy system
# spradzenie, ile jest założonych partycji
#
gpart show
for i in 5 4 3 2 1; do gpart delete -i $i ada0; done
for i in 5 4 3 2 1; do gpart delete -i $i ada1; done
gpart destroy -F ada0
gpart destroy -F ada1
# zaoranie informacji o partycjach (tak dla zasady)
for i in 1 2; do dd if=/dev/random of=/dev/ada0 bs=1M count=1024; done
for i in 1 2; do dd if=/dev/random of=/dev/ada1 bs=1M count=1024; done
# albo mocniej
for i in 1 2; do dd if=/dev/random of=/dev/ada0 bs=1G count=8; done
for i in 1 2; do dd if=/dev/random of=/dev/ada1 bs=1G count=8; done
# jezeli nadal zostaly reszti po zfs
#
zpool labelclear -f ada0pN
Podział na partycje
Możliwy błąd i jego obejście
Jeżeli jest komunikat Operation not permitted, to trzeba wykonać polecenie:
sysctl kern.geom.debugflags=0x10
Podział dla dwóch dysków
Poniżej przykład dla dwóch dysków (klasyczny serwer), które będą posiadać tylko partycje freebsd-zfs:
Komentarz 1:
Podział klasyczny
gpart create -s gpt ada0
gpart add -a 4k -s 512k -t freebsd-boot -l boot0 ada0
gpart add -a 4k -s <POLOWA_RAM> -t freebsd-swap -l swap0 ada0
gpart add -a 4k -t freebsd-zfs -l zfs0 ada0
Podział z dodatkową partycją zfs
Powyższy przepis ma jedną wadę: w przypadku zapchania partycji zfs, np. dla samba przypycha się wolne miejsce również dla partycji (zfs) systemowej (jak podano poniżej sys/data jest "podkatalogiem" całej partycji ZFS. Dlatego też dla dużych dysków zrobić dwie partycje freebsd-zfs: pod system, oraz na dane (np. samba, backupy, itd).
gpart create -s gpt ada0
gpart add -a 4k -s 512k -t freebsd-boot -l boot0 ada0
gpart add -a 4k -s <POLOWA_RAM> -t freebsd-swap -l swap0 ada0
gpart add -a 4k -s 64G -t freebsd-zfs -l zfs0 ada0
gpart add -a 4k -t freebsd-zfs -l zdata0 ada0
Kopia podziału na partycje na drugi dysk
# przekopiowanie ca/lej struktury na dysk adaN
gpart backup ada0 | sed -E 's/([a-z])0/\11/' | gpart restore -l ada1
Dodanie bootcode
Dodanie bootcode należy wykonać zgodnie z przepisami podziału na partycje.
Podział na partycje z wykorzystaniem UEFI
Na podstawie informacji z sieci (patrz odnośniki do dokumentacji w sieci internet) należy wykonać następujący podział na partycje:
gpart create -s gpt ada0
gpart add -a 4k -s 800K -t efi -l efi0 ada0
gpart add -a 4k -s 512k -t freebsd-boot -l boot0 ada0
gpart add -a 4k -s <POLOWA_RAM> -t freebsd-swap -l swap0 ada0
gpart add -a 4k -t freebsd-zfs -l zfs0 ada0
Przygotowanie partycji z EFI
Zgodnie z dokumentacją forum FreeBSD należy wykonać partycję FAT16, z której będzie bootowany system.
_Komentarz 1_
newfs_msdos -L FreeBSD_EFI /dev/ada0p1
# zamontowanie partycji
mount -t msdosfs /dev/ada0p1 /mnt
mkdir -p /mnt/efi/boot/
cp /boot/boot1.efi /mnt/efi/boot/BOOTx64.efi
# Utworzenie partycji do bootowania
mkdir -p /mnt/boot
# to już jest niepotrzebne - boot1.efi umie wystartować z ZFS - od wersji 10.3
# utworzenie skryptu startowego
cat > /mnt/boot/loader.rc << EOF
unload
set currdev=zfs:sys/bootenv/default:
load boot/kernel/kernel
load boot/kernel/zfs.ko
autoboot
EOF
Następnie sprawdzamy zawartość partycji EFI:
find /mnt
Oraz należy odmontować partycję EFI:
umount /dev/ada0p1
Analogiczne kroki należy wykonać dla kolejnego dysku w mirrorze (np. ada1)
Następnie należy wykonać gpart bootcode tylko dla partycji 2:
gpart bootcode -b/boot/pmbr -p /boot/gptzfsboot -i 2 ada0
gpart bootcode -b/boot/pmbr -p /boot/gptzfsboot -i 2 ada1
Utworzenie ZFSów
W celu ujednolicenia nazewnictwa wykonywany mirror będzie nazwany sys:
gnop create -S 4096 /dev/gpt/zfs*
zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache -O mountpoint=none -O atime=off -O setuid=off -O exec=off sys mirror /dev/gpt/zfs0.nop /dev/gpt/zfs1.nop
# albo mozna podac
zpool create [...] /dev/gpt/*.nop
zpool export sys
gnop destroy /dev/gpt/*.nop
zpool import -d /dev/gpt -N -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache sys
# sprawdzenie poprawności zdb
zdb -U /var/tmp/zpool.cache | grep ashift
Utworzenie odpowiedniego zestawu katalogów
To jest najbardziej istotna część partycjonowania, aby była możliwa łatwa integracja z beadm (kroki do wykonania po zpool import):
# utworzenie poszczególnych partycji w ramach ZFS
#
zfs set mountpoint=none sys
zfs set canmount=off sys
zfs set checksum=fletcher4 sys
zfs set compress=lz4 sys
# mozna pominac
zfs set atime=off sys
# utworzenie partycji nadrzędnej dla beadm
#
zfs create -o canmount=off sys/bootenv
zfs create -o canmount=off sys/data
# utworzenie partycji dla beadm oraz ustawienie punktu "bootowania"
#
zfs create -o mountpoint=/ -o exec=on -o setuid=on sys/bootenv/default
zpool set bootfs=sys/bootenv/default sys
# utworzenie kolejnych partycji
#
zfs create sys/bootenv/default/tmp
zfs create sys/bootenv/default/usr
zfs create sys/bootenv/default/usr/local
zfs create sys/bootenv/default/usr/obj
zfs create -o exec=off -o setuid=off sys/bootenv/default/usr/src
# partycja /var oraz pozostałe podkatalogi
#
zfs create -o exec=off -o setuid=off sys/bootenv/default/var
# katalogi wspólne dla każdego ze środowisk bootowania
#
# (tutaj mo/ze by/c zgrzyt, aby poprawnie to zamontować na czas instalacji jako np. /mnt/usr/ports)
#
zfs create -o canmount=off sys/data/u
zfs create -o exec=on -o setuid=on -o mountpoint=/usr/home sys/data/u/home
zfs create -o exec=on -o setuid=on -o mountpoint=/usr/jails sys/data/jails
zfs create -o mountpoint=/usr/ports sys/data/u/ports
# obecnie do pominiecia
zfs create sys/data/u/ports/distfiles
zfs create sys/data/u/ports/packages
zfs create -o canmount=off sys/data/v
zfs create -o mountpoint=/var/audit sys/data/v/audit
zfs create -o mountpoint=/var/backups sys/data/v/backups
zfs create -o mountpoint=/var/db sys/data/v/db
# (ew. podkatalogi dla db jak dspam, openldap, postgres, itd.)
zfs create -o mountpoint=/var/empty sys/data/v/empty
zfs create -o mountpoint=/var/log sys/data/v/log
zfs create -o mountpoint=/var/mail sys/data/v/mail
zfs create -o mountpoint=/var/run sys/data/v/run
zfs create -o mountpoint=/var/spool sys/data/v/spool
zfs create -o mountpoint=/var/tmp sys/data/v/tmp
zfs create -o mountpoint=/var/service -o exec=on sys/data/v/service
##zfs create -o mountpoint=/var/www sys/data/v/www
### albo prościej za pomocą pętli
###
for d in audit backups cache crash db empty log mail run service spool tmp www; do zfs create -o mountpoint=/var/$d sys/data/v/$d; done
# wykonanie dodatkowych katalogów dla narzędzia pkg
zfs create -p sys/data/v/cache/pkg
zfs create -p sys/data/v/db/pkg
# wykonanie katalogu dla baz danych PostgreSQL 10+
zfs create -p sys/data/v/db/postgres
# ustawienie EXEC dla wybranych katalogów (zfs-ów)
zfs set exec=on sys/data/v/service
zfs set exec=on sys/data/v/tmp
o
chmod 1777 /mnt/tmp /mnt/var/tmp
Kroki do wykonania po instalacji
Skopiowanie zpool.cache
Bardzo ważny krok - inaczej po reboocie zfs nie montuje się poprawnie i trzeba wymuszać ponowny import.
Trzeba to zrobić z konsoli nr 4 (ALT-F4)1.
cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
Wykonanie /boot/loader.conf
Dalsze kroki również warto wykonać z konsoli nr 4. Poniższa zawartość (przynajmniej zaczątek) powinien być zapisany w /mnt/boot/loader.conf:
loader.conf
#
# loader.conf
#
# Lokalna konfiguracja bootowania systemu operacyjnego
#
# --- Za/ladowanie modu/l/ow do obs/lugi system/ow plik/ow -----------------
#
opensolaris_load="YES"
zfs_load="YES"
# szyfrowana partycja SWAP
geom_eli_load="YES"
# je/zeli jest wsparcie w procesorze dla AESNI:
aesni_load="YES"
# wy/l/aczenie gptid
kern.geom.label.gpt.enable="1"
kern.geom.label.gptid.enable="0"
kern.geom.label.disk_ident.enable="0"
# --- ustawienie konsoli VT (zamiast SC) -----------------------------------
#
hw.vga.textmode=1
kern.vty=vt
# dla serwer/ow, kt/ore to wspieraj/a (np. HP, Dell, etc.)
ipmi_load="YES"
# --- Za/ladowanie modu/l/o/w odpowiedzialnych za interfejsy sieciowe ------
#
miibus_load="YES"
if_bge_load="YES"
### potrzebne w celu posiadania klawiatury PS/2 (szczeg/olnie przez KVM via JNLP)
### UWAGA!!! Dopisa/c dopiero przed instalacj/a oraz uruchomieniem w/lasnego kernela!
### Wpisanie poni/zszego dla kernela "instalacyjnego" powoduje problem z bootowaniem
###
# --- Za/ladowanie oraz konfiguracja obs/lugi wielu klawiatur ---------------
#
kbdmux_load="YES"
hint.atkbdc.0.at="isa"
hint.atkbdc.0.port="0x060"
hint.atkbd.0.at="atkbdc"
hint.atkbd.0.irq="1"
# --- Konfiguracja rozmiaru pami/eci dla kernela oraz ZFS -------------------
#
# vm.kmem_size= 150% fizycznej pami/eci RAM
# zfs.zfs.arc_max= 50% fizycznej pami/eci RAM
#
vm.kmem_size="NNG"
zfs.zfs.arc_max="NNG"
# --- /scie/zka, z kt/orej nale/zy startowa/c system ------------------------
#
vfs.root.mountfrom="zfs:sys/bootenv/default"
# accf accept filters are used so the server will not have to context switch several times
# before performing the initial parsing of the request. This could decrease server load by
# reducing the amount of CPU time to handle incoming requests.
# Wait for data accept filter. For nginx https servers add "listen
# 127.0.0.1:443 ssl spdy accept_filter=dataready;"
##accf_data_load="YES"
# buffer incoming connections until complete HTTP requests arrive (nginx
# apache) for nginx http add, "listen 127.0.0.1:80 accept_filter=httpready;"
##accf_http_load="YES"
# Wait for full DNS request accept filter (unbound)
accf_dns_load="YES"
# Je/zeli nie jest wkompilowane w kernel:
# Advanced Host Controller Interface (AHCI)
#ahci_load="YES"
# Asynchronous I/O, or non-blocking I/O is a form of input/output processing
# permiting other processing to continue before the transmission has finished.
# AIO is used for accelerating Nginx on ZFS. Check for our tutorials on both.
aio_load="YES"
# Increase VDEV read ahead cache size. This reduces scrub times and
# metadata-intensive tasks for a small cost in RAM. The vdev cache uses a
# simple FIFO rolling data set.
vfs.zfs.vdev.cache.size="64M"
vfs.zfs.vdev.cache.max="64M"
vfs.zfs.txg.synctime_ms="3000" # default 1000
Monitorowanie temperatury procesora
Potrzebne w szczególności dla collectd.
# thermal sensors for intel or amd cpus
coretemp_load="YES"
# dla procesor/ow AMD
#amdtemp_load="YES"
Optymalizacja dla SAMBA
# Commit async writes if the maximum I/O requests pending on each device reach
# the limit.
vfs.zfs.vdev.max_pending="32" # default 10
# Enable the optimized version of soreceive() for stream (TCP) sockets.
# soreceive_stream() only does one sockbuf unlock/lock per receive independent
# of the length of data to be moved into the uio compared to soreceive() which
# unlocks/locks per *mbuf*. soreceive_stream() can significantly reduced CPU
# usage and lock contention when receiving fast TCP streams. Additional gains
# are obtained when the receiving application is using SO_RCVLOWAT to batch up
# some data before a read (and wakeup) is done.
net.inet.tcp.soreceive_stream="1" # (default 0)
# qlimit for igmp, arp, ether and ip6 queues only (netstat -Q) (default 256)
net.isr.defaultqlimit="2048" # (default 256)
# Size of the syncache hash table, must be a power of 2 (default 512)
net.inet.tcp.syncache.hashsize="1024"
# Limit the number of entries permitted in each bucket of the hash table. (default 30)
net.inet.tcp.syncache.bucketlimit="100"
# CUBIC Congestion Control allows for more fairness between flows since the
# window growth is independent of RTT.
cc_cubic_load="YES"
Obsługa tmpfs
# TMPFS na potrzeby poudriere
#
tmpfs_load="YES"
Dodatki dla serwerów HP
multikonsole
Domyślna prędkość konsoli (Serial-over-LAN) to 9600 kB/s. Niemniej przestawiając w BIOSie oraz w loader.conf można uzyskać prędkość nawet 115200 (całkiem dobrze można pracować).
# --- wielokonsolowo/s/c ------------------------------
#
# Zgodnie z informacjami znalezionymi w sieci HP ML 110 G6 posiada emulacj/e PS/2
# opart/a na USB. Jednocze/snie nie mo/zna ustawi/c "USB Legacy", a zatem w trakcie
# bootowania nie ma klawiatury
# Poprzez przekierowanie konsoli na ttyu0 mo/zna sterowa/c procesem bootowania poprzez
# dedykowany port "MGMT" w serwerze
# Linki w sieci:
# https://www.freebsd.org/doc/handbook/serialconsole-setup.html
# http://h30499.www3.hp.com/t5/ProLiant-Servers-ML-DL-SL/ML110-G6-ILO-Password/td-p/2326467
# http://h20000.www2.hp.com/bc/docs/support/SupportManual/c02063205/c02063205.pdf
#
boot_multicons="YES"
boot_serial="YES"
comconsole_speed="9600"
comconsole_speed="115200"
console="comconsole,vidconsole"
Niestabilne działanie karty sieciowej
Zdarzyło się, że karta sieciowa zgłaszała problemy z działaniem. Na konsoli pojawiał się komunikat "watchdog timeout resetting". Rozwiązaniem problemu jest dopisanie wpisu w pliku loader.conf:
# --- ustawbilizownie pracy BGE - 'watchdog timeout resetting" -------------
#
hw.bge.allow_asf=0
Wykonanie /etc/fstab !!!
Należy pamiętać, o wykonaniu /etc/fstab. Inaczej system nie wstanie!!!
# poniższe kroki tylko dla systemów < 11.x
#
mkdir -p /tmp/bsdinstall_etc/
touch /tmp/bsdinstall_etc/fstab
# wykonanie fstab: właściwe
# UWAGA!!! W przypadku instalacji systemu 11.x "zaplątał" się freebsd-ins do fstab. Przed restartem trzeba sprawdzić zawartość utworzonego pliku
#
mount -p | egrep '(mnt|proc)' | sed -E 's|mnt/?||' > /mnt/etc/fstab
# dopisanie ZFS-a do rc.conf
#
echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf
Modyfikacja (rozbudowa) /etc/fstab
fdescfs jest na potrzeby instalacji bash-a:
/dev/gpt/swap0.eli none swap sw 0 0 /dev/gpt/swap1.eli none swap sw 0 0 /dev/cd0 /media/cdrom cd9660 ro,noauto 0 0 /dev/da0s1 /media/flash msdosfs rw,sync,noauto,longnames,-Lpl_PL.UTF-8 0 0 fdescfs /dev/fd fdescfs rw 0 0
Albo można skorzystać z pliku fstab.addons, który jest umieszczony w repozytorium konfiguracji.
Utworzenie katalogów dla mediów zewnętrznych (można wykonać po pierwszym uruchomieniu nowego serwera):
mkdir -p /media/cdrom /media/flash
Utworzenie puli partycji na dane
Komentarz 2:
Jeżeli został wykonany podział na dwie partycje ZFSowe, to schemat tworzenia dodatkowych partycji trzeba powtórzyć ponownie:
gnop create -S 4096 /dev/gpt/z*
zpool create -O mountpoint=none -O atime=off -O setuid=off -O exec=off tank mirror /dev/gpt/zdata0.nop /dev/gpt/zdata1.nop
zpool export tank
gnop destroy /dev/gpt/*.nop
zpool import -d /dev/gpt -N tank
# sprawdzenie poprawności zdb
zdb | grep ashift
Katalogi dodatkowe
Dla podziału na dwie partycje ZFSowe (patrz wyżej) dla partycji data warto wykonać wszystkie katalogi /opt. Być może ten podział warto zrobić po zainstalowniu samego systemu (w końcu są to czyste dane i nie jest to tak istotne na etapie instalacji.
# utworzenie poszczególnych partycji w ramach ZFS
#
zfs set mountpoint=none tank
zfs set canmount=off tank
zfs set checksum=fletcher4 tank
zfs set compress=lz4 tank
zfs create -o mountpoint=/opt tank/o
# utworzenie potrzebnych katalog/ow, aby monotowanie partycji w trakcie startu systemu nie zwraca/lo b/led/ow
# je/zeli kt/orego/s katalogu ma nie by/c, to mo/zna pomin/a/c odpowiednie sekcje
#
mkdir -p /opt/samba /opt/backups /opt/squid
# partycje dla SaMBa
zfs create -p tank/o/samba/homes
zfs create -p tank/o/samba/shares
# partycje na backupy
zfs create -p tank/o/backups/bsdbackup
zfs create -p tank/o/backups/mysql-data
zfs create -p tank/o/backups/openldap-data
zfs create -p tank/o/backups/pgsql-data
# partycje dla squida
zfs create -p tank/o/squid/cache
zfs create -p tank/o/squid/logs
Włączenie deduplikacji
Dla katalogów, które mają przechowywać backupy, to warto włączyć deduplikację w celu zaoszczędzenia miejsca na dysku:
zfs set dedup=on tank/o/backups
Dalsze kroki po pierwszym restarcie
Aktualizacja źródeł nowego serwera
Zbudowanie nowego systemu (wersja 10.x i nowsze)
(c) 2004 - 2026 BSD Serwis Krzysztof Stryjek. W przypadku błędów, poprawek proszę kontaktować się z administratorem wiki.
Dotyczy systemów 10.x. Dla 11.x konsola nr 1 oraz nr 4 po instalacji wyglądają na tożsame (1)

Przy pierwszej instalacji wg niniejszego przepisu miało miejsce zdarzenie, że uruchomił się graid i zaczął psuć całą konfigurację. Trzeba było go "ubić" i skorzystać z naprawnia partycji GPT podany w/w odnośnikach.