— sekitar 8 menit membaca

FreeBSD di Raspberry Pi4

mencoba memasang FreeBSD 14 dan Jail Postgresql serta miniflux di Raspi4

Saya ada Raspberry Pi4 Model B yang rencananya mau dipakai sebagai home lab. Raspberry Pi4 ini datang dengan CPU Armv7 di frequensi 1500Mhz 4 cores dan memory 2GB. Untuk storage saya pakai micro SD merek Sandisk berkapasitas 16Gb.

Untuk OS saya install FreeBSD 14 versi RPI (khusus untuk Raspberry Pi), harus pakai image ini karena saya sudah coba pakai versi armv6/7 tidak bisa dipakai. Proses installasi mengikuti standar saja. Download image kemudian burn ke micro SD dan jalankan Raspberry Pi-nya.

Kemudian login dengan username/password root/root atau freebsd/freebsd. Setelah login ganti password dengan perintah passwd.

Update patch dan atur CPU frequency

Hal pertama yang selalu saya lakukan adalah mengunduh patch terbaru (14.0-RELEASE-p6) dan update pkg

Update patch

# freebsd-version
14.0-RELEASE
# freebsd-update fetch install
# freebsd-version
14.0-RELEASE-p6

Update pkg

# pkg update
# pkg upgrade

Raspberry Pi4 memiliki clock frequency di 1500Mhz namun FreeBSD fresh install akan mengatur frequency berjalan di batas minimal, biasanya di 300Mhz. Untuk itu perlu dilakukan pengaturan agar bisa berjalan di 1500Mhz.

# sysctl dev.cpu.0.freq
dev.cpu.0.freq: 300
# sysctl dev.cpu.0.freq=1500
dev.cpu.0.freq: 1500

tapi pengaturan ini akan kembali ke default setelah Raspberry Pi4 di reboot. Agar pengaturan menjadi permanen maka perlu mengatur di file /etc/systctl.conf dan tambahkan dev.cpu.0.freq=1500 di baris paling akhir, kemudian reboot agar pengaturan diterapkan.

Secara default RPI akan mengatur generic sebagai hostname dari perangkat ini, untuk merubahnya saya perlu mengedit file /etc/rc.conf dan masukkan pengaturan hostname="rpi4" untuk mengubah hostname menjadi rpi4 dan kemudian reboot.1

Jail’s

Jails adalah sejenis container yang dibangun diatas konsep chroot untuk menciptakan sebuah safe environtment yang terisolasi dari sistem utama. Semua proses yang terjadi di dalam Jail tidak bisa mengakses semua resources dari sistem utama atau host. Di Linux lebih mirip dengan LXC tapi bagi yang pernah pakai Docker maka Jail memiliki konsep yang sama.

Di Raspberry Pi ini saya hendak install Jail sehingga di host nanti tidak ada aplikasi selfhost yang berjalan sehingga di host tidak akan banyak package yang terinstall.

Saya mempergunakan bastilleBSD sebagai Jail manager. Apakah harus pakai BastilleBSD?. Jawabannya tidak, FreeBSD sudah menyediakan Jail manager bawaan namun BastilleBSD membuat proses manajemen Jail lebih mudah dengan koleksi shell script yang lengkap2.

BastilleBSD bisa diinstall melalui pkg

[RPI4] # pkg install bastille

Agar BastilleBSD bisa jalan setiap sistem boot, maka tambahkan pengaturan dibawah ke dalam file /etc/rc.conf

bastille_enable="YES"

atau bisa langsung melalui command line

[RPI4] # sysrc bastille_enable="YES"

Setelah bastilleBSD terdaftar di rc.conf maka sistem akan memiliki kemampuan untuk mengelola bastilleBSD melalui service. Sebagai contoh untuk memulai jalankan bastilleBSD bisa dengan perintah service bastille start. Opsi perintah lainnya adalah stop dan restart.

Loopback

Sebelum memulai mengatur Jail, saya perlu memeriksa daftar network interfaces yang tersedia di perangkat Raspberry Pi4,

[RPI4] # ifconfig
genet0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
	options=68000b<RXCSUM,TXCSUM,VLAN_MTU,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
	ether dc:a6:32:35:0a:c2
	inet 192.168.1.46 netmask 0xffffff00 broadcast 192.168.37.255
	inet6 fe80::dea6:32ff:fe35:ac2%genet0 prefixlen 64 scopeid 0x1
	media: Ethernet autoselect (1000baseT <full-duplex>)
	status: active
	nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
	options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
	inet 127.0.0.1 netmask 0xff000000
	inet6 ::1 prefixlen 128
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
	groups: lo
	nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>

dari hasil ifconfig di atas ditemukan bahwa interfaces ethernet Raspberry Pi4 saya adalah genet0 dan lo0 untuk interface loopback dan IP 192.168.1.46.

BastilleBSD sendiri mengsyaratkan pemakaian loopback jaringan untuk memberikan IP kepada masing - masing Jail. Oleh karena itu perlu melakukan pembuatan loopback interfaces di host. Caranya sebagai berikut

[RPI4] # sysrc cloned_interfaces+=lo1
[RPI4] # sysrc ifconfig_lo1_name="bastille0"
[RPI4] # service netif cloneup

Perintah diatas akan membuat kloning atas interfaces lo0 dan diberi nama lo1. Kemudian saya rubah nama lo1 agar muncul di ifconfig dengan nama bastille0. Terakhir jalankan service netif cloneup untuk memulai kloning interface lo0.

Setelah itu seharusnya ketika di ifconfig akan muncul hasil sebagai berikut

[RPI4] # ifconfig
genet0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
	options=68000b<RXCSUM,TXCSUM,VLAN_MTU,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
	ether dc:a6:32:35:0a:c2
	inet 192.168.1.46 netmask 0xffffff00 broadcast 192.168.37.255
	inet6 fe80::dea6:32ff:fe35:ac2%genet0 prefixlen 64 scopeid 0x1
	media: Ethernet autoselect (1000baseT <full-duplex>)
	status: active
	nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
	options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
	inet 127.0.0.1 netmask 0xff000000
	inet6 ::1 prefixlen 128
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
	groups: lo
	nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
bastille0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
	options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
	inet6 fe80::1%bastille0 prefixlen 64 scopeid 0x3
	groups: lo
	nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>

Packet Filter

Interface bastille0 yang sudah dibuat akan menjadi interface yang memberikan IP kepada masing - masing Jail yang sudah dibuat. Untuk memberikan akses agar Jail bisa diakses dari internet maka perlu dibuatkan NAT.

Untungnya FreeBSD sudah menyediakan aplikasi seperti pf3 untuk mengatur lalu lintas jaringan. Buat sebuah file /etc/pf.conf kemudian isi dengan script seperti ini

ext_if="genet0"

set block-policy return
scrub in on $ext_if all fragment reassemble
set skip on lo

table <jails> persist
nat on $ext_if from <jails> to any -> ($ext_if:0)
rdr-anchor "rdr/*"

block in all
pass out quick keep state
antispoof for $ext_if inet

pass in inet proto tcp from any to any port ssh flags S/SA keep state

Setelah itu simpan dan masukkan service pf ke rc.conf dan mulai jalankan dengan4

[RPI4] # sysrc pf_enable="YES"
[RPI4] # service pf start

Bootstrap dan mulai membuat Jail

Sebelum membuat Jail, sistem perlu melakukan boostrap atas rilis FreeBSD di host. Di atas saya sudah melakukan update patch sampai ke 14.0-RELEASE-p6 sehingga versi ini yang akan saya bootstrap.

[RPI4] # bastille bootsrap 14.0-RELEASE update

tambahan update di perintah diatas akan membuat FreeBSD melakukan pemeriksaan jika ada update terbaru. Ini opsional, agar lebih cepat kadang saya tak pakai perintah update. Meskipun tidak menyertakan rilis patch namun hasil bootstrap tetap sesuai rilis patch yang terakhir.

Setelah bootstrap berhasil, saatnya membuat kontainer Jail

[RPI4] # bastille create postgres 14.0-RELEASE 10.1.1.1/24

perintah diatas akan membuat sebuah Jail dengan nama postgres dengan mempergunakan rilis 14.0-RELEASE dan diberi IP 10.1.1.1/245.

Untuk melihat daftar Jail yang sudah dibuat,

[RPI4] # bastille list
JID State IP Address Published Ports Hostname Release Path
postgres Up 10.1.1.1 -  14.0-RELEASE-p6 /usr/local/bastille/jails/postgres/root

BastilleBSD secara otomatis akan menjalankan container setelah proses create selesai.

Menginstall PostgreSQL di Jail

Setelah pembuatan Jail selesai, saya ingin memasang postgresql di dalam Jail postgres. Untuk mempergunakan postgresql dari dalam Jail, saya perlu merubah/menambah konfigurasi Jail (jail.conf) yang bisa diakses dengan perintah sebagai berikut

[RPI4] # bastille edit postgres

kemudian saya tambahkan konfigurasi

allow.raw_sockets=1;
allow.sysvipc=1;

konfigurasi allow.raw_sockets=1; diperlukan agar bisa melakukan ping atau perintah berkaitan penggunaan sockets6, sedangan allow.sysvipc diperlukan untuk meload module kernel agar postgresql bisa berjalan baik.

Untuk menginstall postgresql saya perlu melakukan chroot ke dalam Jail postgres.

[RPI4] # bastille console postgres

perintah ini akan membawa saya masuk ke dalam environtment root di dalam Jail postgres. Hal pertama yang perlu saya lakukan adalah mengaktifkan pkg untuk menginstall packages.

[postgres] # pkg update
[postgres] # pkg install postgresql16-server postgresql16-client postgresql16-contrib

akan muncul notifikasi bahwa pkg belum terpasang dan perlu melakukan bootsrap. Tekan "Y" untuk setuju dan secara otomatis pkg akan mengunduh beberapa data yang diperlukan. Setelah selesai pkg akan melakukan update dilanjutkan pemasangan postgresql.

Agar postgresql berjalan saat sistem booting maka saya aktifkan postgresql di /etc/rc.conf dan jalankan.

[postgres] # sysrc postgresql_enable="YES"
[postgres] # service postgresql initdb
[postgres] # service postgresql start

dengan perintah initdb postgresql akan melakukan pembuatan database awal dan semua proses akan berjalan dibawah user baru bernama postgres. Hal pertama yang biasanya saya lakukan adalah mengubah password dari user postgres.

[postgres] # su - postgres
$ psql -c "ALTER USER postgres WITH PASSWORD 'olala'"

perintah diatas akan merubah password user postgres dengan olala. Gunakan perintah psql untuk masuk ke prompt postgresql. Sampai disini layanan database postgresql sudah aktif dan berjalan di Jail postgres di IP 10.1.1.1 dengan port default 5432.

Menginstall miniflux di Jail

Untuk mencoba layanan postgresql yang sudah aktif di Jail postgres, saya akan memasang miniflux.

Miniflux adalah aplikasi feed reader minimalis yang mempergunakan database postgresql sebagai penyimpanan. Contoh aplikasi yang tepat untuk menguji layanan postgresql yang sudah diinstall sebelumnya.

Sebelum memasang miniflux, saya siapkan dulu database postgresql dengan kredensial nama database miniflux dan user mnflx

[postgres] # su - postgres
$ createuser -P mnflx
Enter password for new role:
$ createdb miniflux -O mnflx
$ psql miniflux -c 'create extension hstore'

Database miniflux ini akan diakses dari Jail yang lain, maka saya perlu memberikan ijin akses. Rencananya saya akan membuat Jail dengan IP 10.1.1.2 sehingga saya edit file /var/db/postgres/data16/pg_hba.conf dan tambahkan pengaturan sebagai berikut

# Jail IP
host    miniflux        mnflx        10.1.1.2          trust

Setelah database siap, saya buat Jail khusus untuk miniflux

[RPI4] # bastille create miniflux 14.0-RELEASE 10.1.1.2/24
[RPI4] # bastille console miniflux
[miniflux] # pkg update

Package miniflux sudah tersedia di FreeBSD dan bisa diinstall dengan perintah berikut

[miniflux] # pkg install miniflux

Kemudian buat pengaturan database di miniflux, edit file /usr/local/etc/miniflux.env dan tambahkan database connection seperti berikut

DATABASE_URL=`postgres://mnflx:miniflux@10.1.1.1/miniflux?sslmode=disable`

Karena postgresql dihost di Jail yang lain maka saya gunakan connection string dengan format seperti diatas. Selanjutnya lakukan migrasi dan buat akun admin untuk miniflux.

miniflux -c /usr/local/etc/miniflux.env -migrate
miniflux -c /usr/local/etc/miniflux.env -create-admin

Selesai! Agar miniflux berjalan saat sistem booting maka saya aktifkan miniflux di /etc/rc.conf dan jalankan. Miniflux harusnya sudah bisa berjalan di IP 10.1.1.2:8080 dan bisa dikonfirmasi melalui netstat atau sockstat.

Tapi bagaimana caranya supaya bisa diakses melalui browser?

Nginx Reverse Proxy

Agar aplikasi miniflux bisa diakses melalui browser maka saya perlu memasang aplikasi seperti nginx.

[RPI4] # pkg install nginx
[RPI4] # sysrc nginx_enable="YES"
[RPI4] # service nginx start

Kemudian saya atur reverse proxy dengan mengedit file /usr/local/etc/nginx/nginx.conf seperti berikut

user nobody;
worker_processes 1;
events {
 }
http {
	server {
		listen 80;
		location / {
		proxy_pass http://10.1.1.2:8080;
		proxy_set_header Host $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		}
	}
}

simpan, cek konfigurasi apakah ada yang keliru dan restart nginx.

[RPI4] # nginx -T
[RPI4] # service nginx restart

Jika semua berjalan lancar, maka miniflux bisa diakses melalui browser di alamat IP 192.168.1.46:80 alias IP dari Raspberry Pi4.

Penutup

FreeBSD sudah mendukung perangkat Raspberry Pi secara out of the box namun sayangnya masih kurang populer di kalangan pecinta home lab karena Raspberry Pi sendiri sudah membawa OS sendiri yaitu Raspbian yang tentu saja akan berjalan secara optimal di perangkatnya sendiri. Namun FreeBSD bisa menjadi alternatif yang menarik selain Raspbian.

kembali ke atas