kraftsrv.net

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

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

事前準備

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

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

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

SD カードイメージファイルの書き込み』を参照して SD カードイメージファイル (FreeBSD-14.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    3.0G    8.6G    26%    /
devfs               1.0K      0B    1.0K     0%    /dev
/dev/msdosfs/EFI     50M     25M     25M    50%    /boot/efi
tmpfs               2.2G    4.0K    2.2G     0%    /tmp

初期環境の設定変更

ネットワーク情報の設定

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

IP アドレス

dhclient を停止します。

root@generic:~ # service dhclient stop ue0

/etc/rc.conf の『ifconfig_DEFAULT="DHCP"』の設定をコメントアウト (または削除) して、『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』とする場合の例となります。

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 (Greenwich Mean 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                   │
│┌───────────────┐│
││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              ││
││11 UTC                        ││
│└───────────────┘│
├─────────────────┤
│      [  OK  ]     [Cancel]       │
└─────────────────┘

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

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

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

┌─────────────┤Confirmation├─────────────┐
│Does the 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
Jun  5 23:01:59 raspberrypi ntpdate[1001]: step time server 210.173.160.87 offset +17983094.068572 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   28   64    3    7.880   +3.852   3.860
+210.173.160.57  133.243.236.18   2 u   28   64    3    7.290   +3.976   3.195
*210.173.160.87  133.243.236.19   2 u   28   64    3    7.032   +3.331   3.843

タイムゾーン

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

root@raspberrypi:~ # date
Wed Jun  5 23:02:19 JST 2024

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

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

ブートストラップユーティリティを実行します。
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

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

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

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

root@raspberrypi:~ # pkg update

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

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

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

root@raspberrypi:~ # pkg search ^bash
bash-5.2.26_1                  GNU Project's Bourne Again SHell
bash-completion-2.12.0,2       Programmable completion library for Bash
bash-static-5.2.26_1           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 repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Updating database digests format: 100%
The following 4 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        bash: 5.2.26_1
        gettext-runtime: 0.22.5
        indexinfo: 0.3.1
        readline: 8.2.10

Number of packages to be installed: 4

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

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

ユーザの管理操作

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 環境のシステムバックアップを行います。