kraftsrv.net

Raspberry Pi 上での NetBSD 10.0 環境の構築

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

事前準備

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

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

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

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

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

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

入出力機器の接続

入出力機器 (HDMI ディスプレイ、USB キーボード) を Raspberry Pi に接続します。

なお NetBSD の SD カードイメージファイルは DHCP クライアントならびに sshd の起動が有効化の状態で作成されていますが、デフォルトでは sshd_config の PermitRootLogin の設定が『prohibit-password』であり且つ一般ユーザが存在しないため、初回ログイン時はコンソール接続が必要となります。

NetBSD の起動

電源投入

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

NetBSD へのログイン

ユーザ名『root』でログインします。
※パスワードの入力は不要です。
以下のプロンプトが表示されます。

arm64#

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

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

arm64# df -h
Filesystem     Size   Used  Avail %Cap Mounted on
/dev/dk1        14G   1.3G    12G   9% /
/dev/dk0        79M    32M    47M  40% /boot
ptyfs          1.0K   1.0K     0B 100% /dev/pts
procfs         4.0K   4.0K     0B 100% /proc
tmpfs          233M   4.0K   233M   0% /var/shm

初期環境の設定変更

一般ユーザの作成

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

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

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

arm64# passwd admin
Changing local password for admin.
New Password:
Retype New Password:

ネットワーク情報の設定

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

IP アドレス

dhcpcd を停止します。

arm64# service dhcpcd stop

/etc/rc.conf の『dhcpcd=YES』の設定をコメントアウト (または削除) します。

#dhcpcd=YES

/etc/rc.conf の dhcpcd_flags を設定する箇所をコメントアウト (または削除) します。

#if checkyesno ec2_init ; then
#       dhcpcd_flags="$dhcpcd_flags -w"
#else
#       dhcpcd_flags="$dhcpcd_flags -b"
#fi

/etc/ifconfig.mue0 を新規に作成して IP アドレスとネットマスク (16 進表記) を設定します。
以下は IP アドレスを『172.16.0.210/24』とする場合の例となります。

172.16.0.210 netmask 0xffffff00

ゲートウェイ

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

defaultroute=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

変更したネットワーク情報の反映を行います。

arm64# service network restart

本稿では以降の手順はリモート接続でログインした状態で行うこととします。

システムの環境設定

ホスト名の設定

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

#hostname=arm64
hostname=raspberrypi

時刻同期の設定

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

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

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

#pool 2.netbsd.pool.ntp.org iburst
#server 2404:1a8:1102::b
#server 2404:1a8:1102::a
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=YES』の設定を追加します。

ntpdate=YES

タイムゾーンの設定

タイムゾーンを日本 (Asia/Tokyo) に変更します。
/etc/localtime のリンク先を変更します。

arm64# ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

キーマップの設定

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

encoding jp

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

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

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

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

#resize_gpt=YES
#resize_root=YES
#resize_root_flags="-p"
#resize_root_postcmd="/sbin/reboot -n"

mdnsd

本稿では mdnsd (mDNS とサービス検出) の自動起動は行わないこととします。
『mdnsd=YES』の設定をコメントアウト (または削除) します。

#mdnsd=YES

設定の反映

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

arm64# shutdown -r now

設定反映確認

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

ホスト名

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

raspberrypi# uname -n
raspberrypi

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

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

raspberrypi# grep ntpdate /var/log/messages
Jun  9 22:58:45 raspberrypi ntpdate[802]: step time server 210.173.160.87 offset +13.594598 sec

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

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

raspberrypi# ntpq -np
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+210.173.160.27  133.243.236.17   2 u   43   64    3    8.318   +2.111   4.124
+210.173.160.57  133.243.236.18   2 u   40   64    3    6.893   +1.196   1.817
*210.173.160.87  133.243.236.19   2 u   43   64    3    7.932   +2.479   2.662

タイムゾーン

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

raspberrypi# date
Sun Jun  9 23:02:03 JST 2024

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

PKG_PATH の設定

/root/.profile の『#export PKG_PATH=』の設定のコメントアウトを解除します。

export PKG_PATH="https://cdn.NetBSD.org/pub/pkgsrc/packages/NetBSD/$(uname -p)/$(uname -r|cut -f '1 2' -d.|cut -f 1 -d_)/All"

PKG_PATH の設定 (.profile の再読み込み) を行います。

raspberrypi# . /root/.profile

pkgin のインストール

本稿ではバイナリパッケージの管理に pkgin を使用することとします。
pkgin をインストールします。

raspberrypi# pkg_add pkgin

初期データベースの構築を行います。

raspberrypi# pkgin update

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

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

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

raspberrypi# pkgin search bash
bash-5.2.26nb1       The GNU Bourne Again Shell
bash-2.05.2.13       The GNU Bourne Again Shell (version 2)
bash-completion-2.11  Programmable completion specifications for bash
bash-doc-2.05.2nb1   Documentation for the GNU Bourne Again Shell
bash-preexec-0.5.0   Preexec and precmd hook functions a la zsh
bats-0.4.0           Testing framework for Bash
dash-0.5.12          Debian Almquist shell, POSIX-compliant shell faster than bash
fff-2.2              Simple file manager written in bash
git-sh-1.3           Customized bash environment suitable for git work
memo-0.6nb1          A simple memo tool written in bash
py310-argcomplete-3.2.3  Bash and other shells tab completion for argparse
py310-bracex-2.4     Bash style brace expander
py311-argcomplete-3.2.3  Bash and other shells tab completion for argparse
py311-bracex-2.4     Bash style brace expander
py312-argcomplete-3.2.3  Bash and other shells tab completion for argparse
py312-bracex-2.4     Bash style brace expander
py38-argcomplete-3.2.3  Bash and other shells tab completion for argparse
py38-bracex-2.4      Bash style brace expander
py39-argcomplete-3.2.3  Bash and other shells tab completion for argparse
py39-bracex-2.4      Bash style brace expander
shfmt-3.7.0nb8       Shell formatter with bash support
tree-sitter-bash-0.20.5  Bash grammar for tree-sitter
xonsh-0.10.1nb4      Python-ish, BASHwards-looking shell language and command prompt

=: package is installed and up-to-date
<: package is installed but newer version is available
>: installed package has a greater version than available package

パッケージをインストールします。
pkgin install コマンド実行後、インストール確認のプロンプトが表示されます。
そのまま Enter を押下します。

raspberrypi# pkgin install bash
calculating dependencies...done.

1 package to install:
  bash-5.2.26nb1

0 to remove, 0 to refresh, 0 to upgrade, 1 to install
3178K to download, 10M of additional disk space will be used

proceed ? [Y/n]

ユーザの管理操作

root ユーザのパスワード設定

root ユーザのパスワードを設定します。

raspberrypi# passwd root
Changing password for root.
New Password:
Retype New Password:

一般ユーザの環境設定

ロケールの変更

本稿では操作例として UTF-8 への変更を行うこととします。
~/.profile に『export LANG=ja_JP.UTF-8』の設定を追加します。

export LANG=ja_JP.UTF-8

ログインシェルの変更

本稿では操作例として bash への変更を行うこととします。
chsh コマンドを実行します。

raspberrypi$ chsh -s /usr/pkg/bin/bash

事後作業

システムバックアップ

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