FreeBSD använder både något som heter portar och något som heter paket. Paket är färdigkompilerade binärer av program, likt de pakethanteringsverktyg som finns för de flesta Linuxdistributioner. Portar däremot är en uppsättning Makefiles anpassade för att programmet ska gå att kompilera smärtfritt under FreeBSD. Portar måste alltså kompileras för att installeras. Det som gör att portarna i FreeBSD är så populära trots att de måste kompileras är att de går att anpassa efter eget behov, precis som om du laddade ner källkoden själv och kompilerade paketet. Skillnaden här är att det är mycket enklare. När du gör en make install clean i en port får du upp en dialogruta där du enkelt bockar för eller bockar av de val du vill göra innan kompileringen. En annan fördel med portarna är att det finns något fler portar än paket, och ibland också i nyare versioner.

Fördelen med paketen däremot är att dessa är färdigkompilerade, vilket gör att dessa går mycket fortare att installera. Kan du tänka dig tiden det skulle ta att kompilera hela Xorg tillsammans med hela KDE exempelvis? Detta slipper man med paket.

I tidiga versioner av FreeBSD kunde det vara problematiskt att blanda portar och paket, men i nyare versioner av FreeBSD är detta problemet något mindre. Man bör dock fortfarande undvika att blanda portar och paket allt för mycket.

Själv använder jag endast portar när jag verkligen behöver modifiera standardkonfigurationen i något program. Därefter låser jag paketet så att det inte uppdateras av det vanliga pakethanteringssystemet med standardinställningar.

Lägg märke till att jag här sa att jag låser paketet. Det är nämligen så att systemet i sig inte gör någon som helst skillnad på om ett program är installerat som ett paket eller som en port. När en port har kompilerats klart och ska installeras, kommer denna att installeras som ett paket i systemet. Fördelen med detta är att vi kan använda samma verktyg för att hålla kolla på både portar och paket. Nackdelen är att paket kan uppdatera eller installera om portar där vi har gjort specifika val, eller att det finns nyare versioner av några program som portar, men som vi installerat som paket och vill behålla som paket. Väljer vi då att uppdatera alla portar, kommer även alla utgångna paket att uppdateras med portarna istället.

En annan fördel med att systemet inte gör någon skillnad på portar och paket är att en port använder både paket och portar för uppfylla beroenden, likaså gäller för paket.

Det finns därför lite olika sätt att hantera mjukvaran i ett FreeBSD-system. Inget sätt är helt rätt eller helt fel, utan det tillvägagångssätt som jag går igenom här är helt mina egna preferenser som jag tycker fungerar bra.

Paketsystemet

I 95% av fallen installerar jag mjukvara i FreeBSD med hjälp av pakethanteringssystemet pkg. Anledningen är att det är snabbare och enklare, och det passar mig utmärkt.

Första gången du använder pkg-kommandot får upp en fråga ifall du vill använda det det nya paketsystemet (pkg-ng för new generation), svara ja på den frågan. Det nya pkg är mycket bättre än de gamla pkg_add, pkg_remove och så vidare.

Hitta och installera paket

För att hitta den mjukvara du vill installera kan du söka bland paketen med pkg search. I nedanstående exempel söker jag efter emacs.

root@beastie:~ # pkg search emacs
apel-emacs25-10.8_12           Portable Emacs Library
auctex-emacs25-11.90           Integrated environment for writing LaTeX using GNU Emacs
bbdb-emacs25-2.35_10           Big Brother Database
c-sig-emacs25-3.8_16           Signature insertion tool for Emacs
dictem-emacs25-1.0.4_2         DictEm is a dict client for [X]Emacs
dictionary-emacs25-1.8.7_17    Dictionary client for Emacs
emacs-devel-26.0.50.20170324,2 GNU editing macros
emacs-koi8u-1.0                KOI8-U coding system for [X]Emacs
emacs-lisp-intro-2.04          Introduction to Emacs Lisp programming
emacs-nox11-25.1,3             GNU editing macros
emacs-w3m-emacs25-1.4.567.b.20160924 Simple front-end to w3m for emacs
emacs-wiki-emacs25-2.72_7      Create and use hyperlinks and simple formatting in plain text files
emacs25-25.1,3                 GNU editing macros
...

Listan över paket är mycket längre än exemplet ovan, men på sista raden i ovanstående exempel hittade jag paketet jag var intresserad utav, nämligen emacs25-25.1,3. Jag installerar paketet med pkg install:

root@beastie:~ # pkg install emacs25
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Checking integrity... done (0 conflicting)
The following 16 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	emacs25: 25.1,3
	libotf: 0.9.13_2
	ImageMagick: 6.9.6.4_2,1
	ghostscript9-agpl-x11: 9.16_2
	ghostscript9-agpl-base: 9.16_5
	gsfonts: 8.11_8
	svgalib: 1.4.3_7
	jbig2dec: 0.13
	fftw3: 3.3.6.p1_1
	libwmf: 0.2.8.4_15
	liblqr-1: 0.4.2
	libfpx: 1.3.1.4_1
	pkgconf: 1.3.0,1
	m17n-lib: 1.7.0_2
	m17n-db: 1.7.0
	fribidi: 0.19.7

Number of packages to be installed: 16

The process will require 213 MiB more space.

Proceed with this action? [y/N]:

Här listas alla paket som kommer att installeras som beroenden samt hur mycket utrymme allting kommer att ta på disken. Jag svarar ja (y) på frågan ovan och installationen startar.

Proceed with this action? [y/N]: y  
[1/16] Installing gsfonts-8.11_8...
[1/16] Extracting gsfonts-8.11_8: 100%
[2/16] Installing svgalib-1.4.3_7...
[2/16] Extracting svgalib-1.4.3_7: 100%
[3/16] Installing jbig2dec-0.13...
[3/16] Extracting jbig2dec-0.13: 100%
[4/16] Installing ghostscript9-agpl-base-9.16_5...
[4/16] Extracting ghostscript9-agpl-base-9.16_5: 100%
[5/16] Installing libotf-0.9.13_2...
[5/16] Extracting libotf-0.9.13_2: 100%
[6/16] Installing ghostscript9-agpl-x11-9.16_2...
[6/16] Extracting ghostscript9-agpl-x11-9.16_2: 100%
[7/16] Installing fftw3-3.3.6.p1_1...
[7/16] Extracting fftw3-3.3.6.p1_1: 100%
[8/16] Installing libwmf-0.2.8.4_15...
[8/16] Extracting libwmf-0.2.8.4_15: 100%
[9/16] Installing liblqr-1-0.4.2...
[9/16] Extracting liblqr-1-0.4.2: 100%
[10/16] Installing libfpx-1.3.1.4_1...
[10/16] Extracting libfpx-1.3.1.4_1: 100%
[11/16] Installing pkgconf-1.3.0,1...
[11/16] Extracting pkgconf-1.3.0,1: 100%
[12/16] Installing m17n-db-1.7.0...
[12/16] Extracting m17n-db-1.7.0: 100%
[13/16] Installing fribidi-0.19.7...
[13/16] Extracting fribidi-0.19.7: 100%
[14/16] Installing ImageMagick-6.9.6.4_2,1...
[14/16] Extracting ImageMagick-6.9.6.4_2,1: 100%
[15/16] Installing m17n-lib-1.7.0_2...
[15/16] Extracting m17n-lib-1.7.0_2: 100%
[16/16] Installing emacs25-25.1,3...
[16/16] Extracting emacs25-25.1,3: 100%
Message from ghostscript9-agpl-base-9.16_5:
Note: in order to use the script "dvipdf", dvips must be installed.
This program is provided by another package print/tex-dvipsk.

FAPIfontmap and FAPIcidfmap in /usr/local/share/ghostscript/9.16/Resource/Init
have to be configured if you want to use FAPI feature.
Message from liblqr-1-0.4.2:
==========================================================================
NOTE: In order to compile examples for liblqr, you will
also need pngwriter port (/usr/ports/graphics/pngwriter).
Examples are located in /usr/local/share/examples/liblqr-1
==========================================================================

Hela installationen tog runt 30 sekunder på en 100 mbit/s-uppkoppling.

Radera installerade paket

För att radera ett paket från systemet används pkg remove. Nedan raderar jag emacs från min dator igen.

root@beastie:~ # pkg remove emacs25
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages (of 0 packages in the universe):

Installed packages to be REMOVED:
	emacs25-25.1,3

Number of packages to be removed: 1

The operation will free 113 MiB.

Proceed with deinstalling packages? [y/N]:

Jag svarar ja på frågan och avinstallationen påbörjas.

Proceed with deinstalling packages? [y/N]: y
[1/1] Deinstalling emacs25-25.1,3...
[1/1] Deleting files for emacs25-25.1,3: 100%

Men vi är faktiskt inte klara än. Emacs var ju beroende av en massa andra paket. Dessa avinstalleras med pkg autoremove.

root@beastie:~ # pkg autoremove
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 15 packages:

Installed packages to be REMOVED:
	ImageMagick-6.9.6.4_2,1
	fftw3-3.3.6.p1_1
	m17n-lib-1.7.0_2
	fribidi-0.19.7
	ghostscript9-agpl-x11-9.16_2
	ghostscript9-agpl-base-9.16_5
	gsfonts-8.11_8
	jbig2dec-0.13
	libfpx-1.3.1.4_1
	liblqr-1-0.4.2
	libotf-0.9.13_2
	libwmf-0.2.8.4_15
	m17n-db-1.7.0
	pkgconf-1.3.0,1
	svgalib-1.4.3_7

Number of packages to be removed: 15

The operation will free 100 MiB.

Proceed with deinstalling packages? [y/N]:

Här svarar jag ja på frågan igen och alla beroende (som andra paket inte är beroenden av) tas bort från systemet.

Uppdatera installerade paket

För att uppgradera installerade paket kör man två kommandon, först pkg update för att uppdatera listan över alla nya paket, och sedan pkg upgrade för att faktiskt uppgradera installerade paket.

Just nu på min dator finns inga uppdateringar tillgängliga.

root@beastie:/home/jake # pkg update
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
root@beastie:/home/jake # pkg upgrade
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Checking for upgrades (362 candidates): 100%
Processing candidates (362 candidates): 100%
Checking integrity... done (0 conflicting)
Your packages are up to date.

Om det hade funnits uppdateringar tillgängliga hade jag fått frågan om jag vill uppdatera paketen, och då svarar jag bara y som vanligt.

Information om installerade paket

För att få en lista över alla installerade paket (inklusive portar) används kommandot pkg info. Nu listas alla installerade paket tillsammans med en beskrivning av paketet. Ett utdrag från min egna dator visas här nedanför.

...
gtk-xfce-engine-3.2.0          Xfce GTK2 theme engine
gtk2-2.24.29_3                 Gimp Toolkit for X11 GUI (previous stable version)
gtk3-3.18.8_4                  Gimp Toolkit for X11 GUI (current stable version)
gtksourceview2-2.10.5_5        Widget that adds syntax highlighting to GtkTextView
gvfs-1.26.3_4                  GNOME virtual file system
hal-0.5.14_31                  Hardware Abstraction Layer for simplifying device access
harfbuzz-1.4.6                 OpenType text shaping engine
hicolor-icon-theme-0.15        High-color icon theme shell from the FreeDesktop project
hunspell-1.6.1                 Improved spell-checker for Hungarian and other languages
iceauth-1.0.7                  ICE authority file utility for X
...

Vill du ha information om ett specifikt paket kan du få detta med kommandot pkg info paketnamn, exempelvis pkg info tmux.

root@beastie:/home/jake # pkg info tmux
tmux-2.3_2
Name           : tmux
Version        : 2.3_2
Installed on   : Mon Jun 19 00:20:22 2017 CEST
Origin         : sysutils/tmux
Architecture   : FreeBSD:10:amd64
Prefix         : /usr/local
Categories     : sysutils
Licenses       : ISCL
Maintainer     : mat@FreeBSD.org
WWW            : http://tmux.github.io/
Comment        : Terminal Multiplexer
Options        :
	BACKSPACE      : off
	DOCS           : on
	EXAMPLES       : on
	LIBEVENT_STATIC: off
Shared Libs required:
	libevent-2.1.so.6
Annotations    :
	repo_type      : binary
	repository     : FreeBSD
Flat size      : 611KiB
Description    :
Tmux is a terminal multiplexer, it enables a number of terminals to be accessed
and controlled from a single terminal. tmux is intended to be a simple, modern,
BSD-licensed alternative to programs such as GNU screen.

WWW: http://tmux.github.io/

För att få en lista med alla paketens versioner tillsammans med information om det finns nyare versioner tillgängliga görs detta med pkg version -R. Paket märkta med ett “<”-tecken har en nyare version tillgänglig i paket repon. Observera argumentet -R. Detta talar om att endast kontrollera om det finns en nyare version i just paket repon. Om vi utesluter -R kommer versionerna istället att jämföras mot ports-trädet, om detta finns installerat. I mitt fall finns det just det, och i ports-trädet finns det nyare versioner. Men eftersom jag inte vill blanda in portar bland mina paket här och nu så struntar jag i detta. Jämför nedan de två körningarna med pkg version -R mot pkg version

root@beastie:/home/jake # pkg version -R
...
xorg-7.7_2                         =
xorg-apps-7.7_2                    =
xorg-docs-1.7.1,1                  =
xorg-drivers-7.7_5                 =
xorg-fonts-7.7_1                   =
xorg-fonts-100dpi-7.7              =
xorg-fonts-75dpi-7.7               =
xorg-fonts-cyrillic-7.7            =
xorg-fonts-miscbitmaps-7.7         =
xorg-fonts-truetype-7.7_1          =
xorg-fonts-type1-7.7               =
xorg-libraries-7.7_2               =
xorg-server-1.18.4,1               =
xpr-1.0.4                          =
xprop-1.2.2                        =
xproto-7.0.31                      =
xrandr-1.5.0                       =
xrdb-1.1.0                         =
xrefresh-1.0.5                     =
xset-1.2.3_1                       =
xsetmode-1.0.0                     =
xsetroot-1.1.1                     =
xterm-327                          =
xtrans-1.3.5                       =
xvinfo-1.1.3                       =
xwd-1.0.6                          =
xwininfo-1.1.3_2                   =
xwud-1.0.4                         =



root@beastie:/home/jake # pkg version
...
xorg-7.7_2                         <
xorg-apps-7.7_2                    =
xorg-docs-1.7.1,1                  =
xorg-drivers-7.7_5                 =
xorg-fonts-7.7_1                   =
xorg-fonts-100dpi-7.7              =
xorg-fonts-75dpi-7.7               =
xorg-fonts-cyrillic-7.7            =
xorg-fonts-miscbitmaps-7.7         =
xorg-fonts-truetype-7.7_1          =
xorg-fonts-type1-7.7               =
xorg-libraries-7.7_2               =
xorg-server-1.18.4,1               <
xpr-1.0.4                          =
xprop-1.2.2                        =
xproto-7.0.31                      =
xrandr-1.5.0                       =
xrdb-1.1.0                         =
xrefresh-1.0.5                     =
xset-1.2.3_1                       =
xsetmode-1.0.0                     =
xsetroot-1.1.1                     =
xterm-327                          <
xtrans-1.3.5                       =
xvinfo-1.1.3                       =
xwd-1.0.6                          =
xwininfo-1.1.3_2                   =
xwud-1.0.4                         =

Olika grenar i portsträdet och paket-repon

Anledningen till att det finns så många portar som har nyare versioner än paketen är för att från och med FreeBSD 10.2 används repon quarterly som standard istället för latest. Detta har man gjort för att göra paketen mer stabila. Quarterly släpper uppdateringar varje kvartal, bortsett från säkerhetsuppdateringar som släpps så fort de finns tillgängliga. Det går bra att byta till latest om man vill det, men dock måste man då komma ihåg att ominstallera ALLA paket för att undvika versionskrockar. Instruktioner om hur man byter till latest finns i filen /etc/pkg/FreeBSD.conf.

Det andra alternativet är att följa quarterly även för ports-trädet. Detta kräver dock lite mer manuellt arbete varje gång man vill uppdatera ports-trädet, men å andra sidan får man förhoppningsvis ett mer stabilt system. Valet är upp till dig, och beror på om man vill ha bleeding-edge mjukvara eller ett stabilt system. För desktops känner jag mig bekväm med latest men på servrar vill jag gärna vara på den säkra sidan med quarterly.

Att följa quarterly för ports-trädet var inte lika enkelt eftersom FreeBSD’s egna verktyg portsnap alltid följer latest. Men för den som är intresserad hittade jag mycket bra script, portsfetch.sh som gör att man smidigt kan följa quarterly ports-trädet.

Så länge vi följer samma gren, antingen latest eller quarterly, för både paket och portar, så kan vi mixa portar och paket i vårt system. Jag undviker det dock själv, men ibland behöver jag installera en port istället för ett paket. Ett exempel på detta är nVidida-drivrutinen som jag alltid installerar från ports-trädet för att välja bort “Linux compability support”.

Portar

Så som jag använder portsträdet och paketsystemet, det vill säga att jag följer quarterly för båda två rekommenderar jag dig att hämta hem och hålla portsträdet uppdaterat med scriptet från länken ovanför (portsfetch.sh).

Börja med att hämta hem portsträdet genom att spara ner scriptet i exempelvis /usr/sbin/portsfetch.sh och göra filen körbar med chmod +x /usr/sbin/portsfetch.sh. Om du inte redan har portsträdet installerat måste du skapa katalogen /usr/ports först. Kör sedan kommandot portsfetch.sh och portsträdet hämtas hem.

Hålla portstädet uppdaterat

För att hålla portsträdet uppdaterat med den senaste quarterly grenen körs bara scriptet portsfetch.sh igen. Alla uppdateringar hämtas då hem automatiskt över SVN. Om du istället vill följa latest rekommenderar jag dig att istället använda FreeBSD’s egna portsnap. Mer information om portsnap finns i kapiel 4.5 i FreeBSD manualen.

Söka efter en port

Gå till /usr/ports för att söka efter en specifik port. För att söka efter till exempel programmet lsof skriver du make search lsof. Har du aldrig kört make search förut får du mest troligen upp ett felmeddelande nu, precis som jag fick.

root@beastie:~ # cd /usr/ports
root@beastie:/usr/ports # make search name=lsof
The search target requires INDEX-10. Please run make index or make fetchindex.
make: don't know how to make lsof. Stop

make: stopped in /usr/ports

Det finns alltså inget index att söka i, vi måste därför köra make fetchindex för att hämta hem detta.

Efter att du hämtat indexet kan du testa att söka igen med make search name=lsof. Nu bör det gå lite bättre.

root@beastie:/usr/ports # make search name=lsof
Port:	lsof-4.90.m,8
Path:	/usr/ports/sysutils/lsof
Info:	Lists information about open files (similar to fstat(1))
Maint:	ler@FreeBSD.org
B-deps:	
R-deps:	
WWW:	http://people.freebsd.org/~abe/

Port:	p5-Unix-Lsof-0.0.5_2
Path:	/usr/ports/sysutils/p5-Unix-Lsof
Info:	Unix::Lsof -- a wrapper to the Unix lsof utility
Maint:	gjvc@gjvc.com
B-deps:	p5-IPC-Run3-0.048_1 perl5-5.24.1_1
R-deps:	p5-IPC-Run3-0.048_1 perl5-5.24.1_1
WWW:	http://search.cpan.org/dist/Unix-Lsof/

Här ser vi vart porten finns, nämligen på raden Path: /usr/ports/sysutils/lsof. Vi börjar med att gå i katalogen med cd /usr/ports/sysutils/lsof.

Konfigurerar och installera en port

Nu när vi är inne i rätt katalog är det dags för att börja med att konfigurera porten så som vi vill ha den. Detta gör vi med make config. För just denna port fanns det ingen konfiguration. Om det finns är det bara att bocka för och bocka av det inställningar du vill från en dialogruta.

Nu kommer det lite kniviga med med att installera en port. Om det finns beroenden till porten som inte är uppfyllda på systemet kommer dessa att installeras som portar. Detta är helt ok, men ifall det är ett väldigt stort paket med väldigt många beroenden kommer detta ta väldigt lång tid. För att slippa detta (och eftersom jag sällan installerar portar ändå), så brukar jag ta fram listan över alla beroenden som finns till porten med make all-depends-list och sedan gå igenom listan och installera de beroenden jag saknar som paket istället med pkg install.

I fallet med lsof är beroendelistan väldigt kort.

root@beastie:/usr/ports/sysutils/lsof # make all-depends-list
/usr/ports/ports-mgmt/pkg

Nu vet jag att jag redan har pkg installerat, men för att vara på den säkra sidan kan jag alltid testa att installera med pkg install pkg.

root@beastie:/usr/ports/sysutils/lsof # pkg install pkg
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Checking integrity... done (0 conflicting)
The most recent version of packages are already installed

Precis som jag misstänkte hade jag redan paketet installerat så jag fortsätter med att kompilera och installera porten. Detta görs med make install clean. Utdatan från kommandot är för långt för att visas här, men porten installerades och programmet lsof finns nu installerat.

Vi kan nu se att även fast lsof installerades från en port finns den med i listan över paket.

root@beastie:~ # pkg info lsof
lsof-4.90.i,8
Name           : lsof
Version        : 4.90.i,8
Installed on   : Mon Jun 19 03:54:22 2017 CEST
Origin         : sysutils/lsof
Architecture   : FreeBSD:10:amd64
Prefix         : /usr/local
Categories     : sysutils
Licenses       : lsof
Maintainer     : ler@FreeBSD.org
WWW            : http://people.freebsd.org/~abe/
Comment        : Lists information about open files (similar to fstat(1))
Annotations    :
Flat size      : 229KiB
Description    :
Lsof (LiSt Open Files) lists information about files that are open by the
running processes.  An open file may be a regular file, a directory, a block
special file, a character special file, an executing text reference, a
library, a stream or a network file (Internet socket, NFS file or Unix domain
socket).

See also fstat(1) in the base system.

WWW: http://people.freebsd.org/~abe/

Uppdatera portar

Om du bara har några enstaka portar och dessutom har koll på vilka de är kan man uppdatera dessa manuellt.

Kör först portsfetch.sh-scriptet ovan för att uppdatera hela portsträdet (eller portsnap fetch update om du följer latest). Gå därefter in i portens katalog och ange kommandot make reinstall clean för att ominstallera lsof med den senaste versionen för portsträdet.

Om du har många portar man kan istället använda verktyget portmaster som installeras med pkg install portmaster.

Eftersom en port och ett paket är detsamma för systemet kommer dock portmaster att uppdatera även installerade paket mer en port istället. För att undvika just detta uppdaterar jag alltid först alla paket pkg update och pkg upgrade.

Detsamma gäller tvärtom, det vill säga att pakethanteraren kommer att uppdatera dina portar. Detta är ju inte bra ifall du har gjort specifika inställningar när du kompilerade och installerade porten. Här har man två val. Antingen låsa porten från att uppdateras med pkg lock lsof exempelvis, och sedan efter uppdateringen ta bort låsningen med pkg unlock lsof och därefter uppdatera alla portar som vi hade låsta förut med portmaster -a (eller göra en manuell uppdatering). Vi kan också låta pakethanteraren ersätta våra portar, och därefter ominstallera portarna.

Avslutning

FreeBSD’s paket- och portsystem är väldigt flexibelt och bra, och jag älskar det! Men det har också sitt pris vid just uppdateringar. Det tar ett tag att lära sig och vänja sig vid det, såvida man inte kör med enbart paket. Använder man enbart paket är hur enkelt som helst att handskas med. Men så fort man har vant sig brukar det gå att bland portar och paket smidigt. Det ger en väldigt stor frihet!

Detta blev en långt inlägg, men förhoppningsvis kastar det lite ljus över hur port- och pakethanteringssystemet fungerar. Kom dock ihåg att det finns många fler sätt att hantera det på. Detta är hur jag hanterar mina portar och paket på just mitt system.

Läs gärna kapitel 4 i FreeBSD Handbook för en ännu djupare förståelse.