kraftsrv.net

Raspberry Pi 上での FreeBSD 15.0-RELEASE 環境の構築

Raspberry Pi 3 Model B+ 上に FreeBSD 15.0-RELEASE の環境を構築する手順です。
初期環境からの基本的な設定変更までを行います。

事前準備

SD カードイメージファイルの取得

FreeBSD-15.0-RELEASE-arm64-aarch64-RPI.img.xz を取得します。
取得したファイルは xz 形式で圧縮されているため 7-Zip 等のツールを使用して解凍します。

SD カードイメージファイルの SD カードへの書き込み

SD カードイメージファイルの書き込み』を参照して SD カードイメージファイル (FreeBSD-15.0-RELEASE-arm64-aarch64-RPI.img) を SD カードに書き込みます。
書き込みを行った SD カードを Raspberry Pi に挿入します。

ネットワーク機器への接続

本稿ではネットワーク機器へは有線での接続を行うこととします。
LAN ケーブルを Raspberry Pi に接続します。

入出力機器の接続

FreeBSD の SD カードイメージファイルは DHCP クライアントならびに sshd の起動が有効化の状態で作成されています。
本稿ではネットワーク内に DHCP サーバが存在することを前提として、初回ログイン時からリモート接続での操作を行うこととします。

FreeBSD の起動

電源投入

Raspberry Pi の電源を投入 (micro USB ケーブルを接続) します。

FreeBSD へのログイン

ユーザ名『freebsd』、パスワード『freebsd』で SSH 接続でログインします。
Tera Term を使用してログインする場合は SSH 認証画面にて『キーボードインタラクティブ認証を使う』にチェックを入れます。
以下のプロンプトが表示されます。

freebsd@generic:~ %

root ユーザにスイッチします。
パスワードは『root』となります。

freebsd@generic:~ % su -
Password:
root@generic:~ #

ルートパーティション拡張の確認

初回起動時には growfs の実行によるルートパーティションの拡張が自動で行われます。
ルートパーティションのサイズが SD カードの容量となっていることを確認します。
※以下は SD カードの容量が 16G の場合の例となります。

root@generic:~ # df -h
Filesystem          Size    Used   Avail Capacity  Mounted on
/dev/ufs/rootfs      13G    2.1G    9.5G    18%    /
devfs               1.0K      0B    1.0K     0%    /dev
/dev/msdosfs/EFI     50M     26M     24M    52%    /boot/efi
tmpfs               2.3G    4.0K    2.3G     0%    /tmp

初期環境の設定変更

ネットワーク情報の設定

初期環境のネットワーク情報は DHCP による動的な設定となっているため、静的 (固定) 情報による設定に変更します。

IP アドレス

dhclient を停止します。

root@generic:~ # service dhclient stop ue0
Stopping dhclient.
Waiting for PIDS: 1463.

/etc/rc.conf の『ifconfig_DEFAULT="DHCP inet6 accept_rtadv"』の設定をコメントアウト (または削除) して、『ifconfig_ue0=』の設定を追加します。
以下は IP アドレスを『172.16.0.200/24』とする場合の例となります。

#ifconfig_DEFAULT="DHCP inet6 accept_rtadv"
ifconfig_ue0="inet 172.16.0.200 netmask 255.255.255.0"

ゲートウェイ

/etc/rc.conf に『defaultrouter=』の設定を追加します。
以下はゲートウェイの IP アドレスを『172.16.0.1』とする場合の例となります。

defaultrouter="172.16.0.1"

DNS サーバ

/etc/resolv.conf に DNS サーバの設定を行います。
以下は DNS サーバを『8.8.8.8』と『8.8.4.4』 (Google Public DNS) とする場合の例となります。

nameserver 8.8.8.8
nameserver 8.8.4.4

変更したネットワーク情報の反映を行います。
※コマンド実行後に接続が切断されます。

root@generic:~ # service netif restart

以降の手順は設定した静的 (固定) IP アドレスにて再度ログインした状態で行うこととします。

システムの環境設定

ホスト名の設定

/etc/rc.conf の『hostname=』の設定を変更します。
以下はホスト名を『raspberrypi』とする場合の例となります。

#hostname="generic"
hostname="raspberrypi"

時刻同期の設定

Raspberry Pi には RTC (ハードウェアクロック) が搭載されていないため、FreeBSD の起動後は現在時刻と大幅な差異がある状態となります。
起動時に ntpdate コマンド実行による時刻補正と起動後の ntpd による時刻同期の設定を行います。

時刻同期先 NTP サーバの変更

本稿では時刻同期先をインターネットマルチフィード株式会社の PUBLIC NTP サーバに変更を行うこととします。
/etc/ntp.conf の時刻同期先サーバの設定を変更します。
※デフォルトでは ntpdate コマンドならびに ntpd の何れも時刻同期先の情報は /etc/ntp.conf の設定を参照します。

#pool 0.freebsd.pool.ntp.org iburst
#pool 2.freebsd.pool.ntp.org iburst
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst

ntpdate コマンド実行による時刻同期の有効化

/etc/rc.conf に『ntpdate_enable="YES"』の設定を追加します。
本稿では実行結果を /var/log/messages に出力するよう『-s』オプションの設定も併せて追加することとします。

ntpdate_enable="YES"
ntpdate_flags="-b -s"

起動後の ntpd による時刻同期の有効化

/etc/rc.conf に『ntpd_enable="YES"』の設定を追加します。

ntpd_enable="YES"

タイムゾーンの設定

タイムゾーンを日本 (Asia/Tokyo) に変更します。
tzsetup コマンドを実行します。

root@generic:~ # tzsetup

『Select local or UTC (Greenwich Mean Time) clock』画面が表示されます。
そのまま Enter を押下 (『Yes』を選択) します。

┌───┤Select local or UTC (Coordinated Universal Time) clock├───┐
│Is this machine's CMOS clock set to UTC?  If it is set to local time, │
│or you dont' know, please choose No here!                             │
│                                                                      │
├───────────────────────────────────┤
│                        [ Yes  ]     [  No  ]                         │
└───────────────────────────────────┘

『Time Zone Selector』画面が表示されます。
『5 Asia』を選択して Enter を押下します。

┌──┤Time Zone Selector├────┐
│Select a region                   │
│┌───────────────┐│
││0  UTC                        ││
││1  Africa                     ││
││2  America -- North and South ││
││3  Antarctica                 ││
││4  Arctic Ocean               ││
││5  Asia                       ││
││6  Atlantic Ocean             ││
││7  Australia                  ││
││8  Europe                     ││
││9  Indian Ocean               ││
││10 Pacific Ocean              ││
│└───────────────┘│
├─────────────────┤
│      [  OK  ]     [Cancel]       │
└─────────────────┘

『Countries in Asia』画面が表示されます。
『20 Japan』を選択して Enter を押下します。

┌──────┤Countries in Asia ├───────┐
│Select a country or region                      │
│┌↑↑↑───────────────────┐│
││14  Hong Kong                               ││
││15  India                                   ││
││16  Indonesia                               ││
││17  Iran (Islamic Republic of)              ││
││18  Iraq                                    ││
││19  Israel                                  ││
││20  Japan                                   ││
││21  Jordan                                  ││
││22  Kazakhstan                              ││
││23  Korea (Democratic People's Republic of) ││
││24  Korea (Republic of)                    ││
││25  Kuwait                                 ││
││26  Kyrgyzstan                             ││
││27  Lao People's Democratic Republic       ││
││28  Lebanon                                ││
││29  Macao                                  ││
│└↓↓↓────────────── 52%───┘│
├────────────────────────┤
│              [  OK  ]     [Cancel]             │
└────────────────────────┘

『Confirmation』画面が表示されます。
そのまま Enter を押下 (『Yes』を選択) します。

┌─────────────┤Confirmation├─────────────┐
│Does the timezone abbreviation `JST' look reasonable?               │
├──────────────────────────────────┤
│                        [ Yes  ]     [  No  ]                       │
└──────────────────────────────────┘

キーマップの設定

コンソール接続時のキーマップの設定を日本語 (JP106) に変更します。
/etc/rc.conf に『keymap="jp"』の設定を追加します。

keymap="jp"

不要なシステム設定の無効化

/etc/rc.conf の不要なシステム設定を無効化します。

ルートパーティション拡張

growfs の実行によるルートパーティションの拡張は初回起動時以降は不要となるため無効化します。
『growfs_enable="YES"』の設定をコメントアウト (または削除) します。

#growfs_enable="YES"

設定の反映

ここまでの手順による設定の反映を行うため FreeBSD を再起動します。

root@generic:~ # shutdown -r now

設定反映確認

再起動後に設定が反映されていることを確認します。

ホスト名

『raspberrypi』が表示されることを確認します。

root@raspberrypi:~ # uname -n
raspberrypi

ntpdate コマンド実行による時刻同期

/var/log/messages に時刻同期の実行結果が出力されていることを確認します。

root@raspberrypi:~ # grep ntpdate /var/log/messages
May 17 23:44:36 raspberrypi ntpdate[1638]: step time server 210.173.160.87 offset +14714369.736307 sec

ntpd による時刻同期の有効化

何れかの時刻同期先サーバの先頭に『*』マークが表示されることを確認します。

root@raspberrypi:~ # ntpq -np
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*210.173.160.27  133.243.236.17   2 u   22   64    3    4.454   -0.349   1.197
+210.173.160.57  133.243.236.17   2 u   22   64    3    4.648   -0.385   1.407
+210.173.160.87  133.243.236.17   2 u   21   64    3    3.887   -1.637   1.219

タイムゾーン

『JST』が表示されることを確認します。

root@raspberrypi:~ # date
Sun May 17 23:46:55 JST 2026

バイナリパッケージの管理操作

ブートストラップユーティリティの実行

ブートストラップユーティリティを実行します。
※ブートストラップユーティリティを実行する必要があるのは FreeBSD 環境の構築後 (pkg コマンドの初回実行時) の一度だけです。

pkg bootstrap コマンド実行後、確認のプロンプトが表示されます。
『y』を入力します。

root@raspberrypi:~ # pkg bootstrap
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y

ブートストラップ処理が行われます。

Bootstrapping pkg from pkg+https://pkg.FreeBSD.org/FreeBSD:15:aarch64/quarterly, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
Installing pkg-2.6.2_1...
Extracting pkg-2.6.2_1: 100%

メタデータとリポジトリの最新化

メタデータとリポジトリを最新化します。

root@raspberrypi:~ # pkg update
Updating FreeBSD-ports repository catalogue...
Fetching meta.conf: 100%     179 B   0.2 kB/s    00:01
Fetching data: 100%    10 MiB   5.4 MB/s    00:02
Processing entries: 100%
FreeBSD-ports repository update completed. 36062 packages processed.
Updating FreeBSD-ports-kmods repository catalogue...
Fetching meta.conf: 100%     179 B   0.2 kB/s    00:01
Fetching data: 100%    17 KiB  17.3 kB/s    00:01
Processing entries: 100%
FreeBSD-ports-kmods repository update completed. 80 packages processed.
All repositories are up to date.

バイナリパッケージのインストール

本稿では操作例として bash のインストールを行うこととします。

インストールするパッケージを検索します。

root@raspberrypi:~ # pkg search ^bash
bash-5.3.9                     GNU Project's Bourne Again SHell
bash-completion-2.17.0_1,2     Programmable completion library for Bash
bash-completion-freebsd-1.5.0  FreeBSD-oriented extension to the Bash completion library
bash-completion-zfs-2.4.1      OpenZFS extension to the Bash completion library
bash-static-5.3.9              GNU Project's Bourne Again SHell
bashc-5.1.8_1                  GNU Bourne Again shell extended with two-panel file manager
bashdb-5.0.1.1.2_1             Source-code debugger for bash
bashtop-0.9.25_1               Linux/OSX/FreeBSD resource monitor

パッケージをインストールします。
pkg install コマンド実行後、インストール確認のプロンプトが表示されます。
『y』を入力します。

root@raspberrypi:~ # pkg install bash
Updating FreeBSD-ports repository catalogue...
FreeBSD-ports repository is up to date.
Updating FreeBSD-ports-kmods repository catalogue...
FreeBSD-ports-kmods repository is up to date.
All repositories are up to date.
Updating database digests format: 100%
The following 3 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        bash: 5.3.9 [FreeBSD-ports]
        gettext-runtime: 1.0 [FreeBSD-ports]
        indexinfo: 0.3.1_1 [FreeBSD-ports]

Number of packages to be installed: 3

The process will require 12 MiB more space.
2 MiB to be downloaded.

Proceed with this action? [y/N]: y

インストール処理が行われます。

[1/3] Fetching indexinfo-0.3.1_1: 100%    5676 B   5.7 kB/s    00:01
[2/3] Fetching bash-5.3.9: 100%  1880 KiB   1.9 MB/s    00:01
[3/3] Fetching gettext-runtime-1.0: 100%   292 KiB 299.2 kB/s    00:01
Checking integrity... done (0 conflicting)
[1/3] Installing indexinfo-0.3.1_1...
[1/3] Extracting indexinfo-0.3.1_1: 100%
[2/3] Installing gettext-runtime-1.0...
[2/3] Extracting gettext-runtime-1.0: 100%
[3/3] Installing bash-5.3.9...
[3/3] Extracting bash-5.3.9: 100%

ユーザの管理操作

root ユーザのパスワード変更

root ユーザのパスワードを予め設定されているものから変更します。

root@raspberrypi:~ # passwd root
Changing local password for root
New Password:
Retype New Password:

一般ユーザの作成

以下例の情報の通り一般ユーザの作成を行います。
なお root ユーザへのスイッチを可能とするため wheel グループにも所属させます。
※デフォルトでは wheel グループに所属しているユーザのみ root ユーザへのスイッチが可能に設定されています。

ユーザ名 admin
プライマリグループ admin ※未指定時のデフォルト
追加グループ wheel
ホームディレクトリ /home/admin ※未指定時のデフォルト
ログインシェル /bin/sh ※未指定時のデフォルト
root@raspberrypi:~ # pw useradd admin -G wheel -m

作成した一般ユーザのパスワードを設定します。

root@raspberrypi:~ # passwd admin
Changing local password for admin
New Password:
Retype New Password:

以降の手順は作成した一般ユーザにて再度ログインした状態で行うこととします。

一般ユーザの環境設定

ロケールの変更

本稿では操作例として UTF-8 への変更を行うこととします。
~/.login_conf に以下の設定を追加します。

me:\
        :charset=UTF-8:\
        :lang=ja_JP.UTF-8:

ログインシェルの変更

本稿では操作例として bash への変更を行うこととします。
chsh コマンド実行後、パスワード入力のプロンプトが表示されます。
パスワードを入力して Enter を押下します。

admin@raspberrypi:~ $ chsh -s /usr/local/bin/bash
Password:

※ロケールならびにログインシェルの変更反映には再度のログインが必要です。

一般ユーザの削除

既存の一般ユーザ『freebsd』を削除します。

root@raspberrypi:~ # pw userdel freebsd -r

事後作業

システムバックアップ

SD カード全体のバックアップ』を参照して適宜 FreeBSD 環境のシステムバックアップを行います。