#author("2022-11-25T19:21:09+09:00","default:kaw","kaw")
#author("2022-12-13T18:22:29+09:00","default:kaw","kaw")
#topicpath
*河豚板でルータを作る ~ アプライアンスの製作例 [#f11d5afe]
RIGHT:EBUG 第83回会合 2022年11月26日 ~
川俣吉広、kaw@on.rim.or.jp

*概要 [#cbab9318]
EBUGの勉強会では、2014年5月に[[実用で使う河豚板>EBUG勉強会/20140507_実用で使う河豚板]]と題して特定のアプリケーションを動かすための専用機(時計表示端末)に仕立てる方法を紹介した。

今回はNSH (network config shell)の河豚板への組み込みを例にとり、現行バージョンの河豚板 7.2を用いたアプライアンスの製作手順を紹介する。

**作業の流れ [#w6035d6a]
導入作業の全体の流れは下図の通り:
                    初回起動          +-----------------------+         モード0で起動し、
 [LiveUSBの作成]-->[起動(モード0)]-->|河豚板の設定:          |--+        OpenBSDの設定
                    手動              |  終了時のファイル保存 |  |        河豚板の設定
                                      |  起動時の自動読込     |  |
                                      |  etc...               |  |
                                      +-----------------------+  |
                                                                 |
               +--------------------[reboot]---------------------+
               |                                                  
               |    2回目の起動       +-----------------------+         NSH関連の設定
               +-->[起動(モード3)]-->|NSHのインストール・設定|--+        インストール
                    自動              +-----------------------+  |        ユーザアカウント作成
                                                                 |        タイムゾーン
               +--------------------[reboot]---------------------+
               |                                                  
               |    3回目以降の起動   +-----------------------+         NSHを運用しながら、
 Power On----->+-->[起動(モード3)]-->|NSHの運用              |--+      設定の修正・調整を実施
               ^    自動              +-----------------------+  |
               |                                                 |
 Power Off<----+--------------------[halt or reboot]-------------+

**NSHについて [#gd288132]
プロジェクトホームページ: https://www.nmedia.net/nsh/ より
>'''NSH は、OpenBSD ベースのネットワークアプライアンスを対象とした CLI です。これは ifconfig, sysctl および route を独自のシンプルなコマンド言語と置き換えるもので 他のデーモンのコンフィギュレーションをひとつの場所にカプセル化し、効果的に アプライアンススタイルで使用するために /etc/netstart と /etc/rc の一部を置き換えています。'''~
'''nshによってカプセル化されたデーモンとサービス: pf, ospfd, ospf6d, bgpd, ripd, ldpd, relayd, ipsecctl, iked, rad.Dvmrpd, sdpf6d, bgpd, ripd, ldpd, relayd, ipsecctl, iked, rad, dvmrpd, sasyncd, dhcpd, snmpd, sshd, ntpd, ifstated, tftp-proxy, ftp-proxy, tftpd, npppd, tftpd, npppd, tftp-proxy, ftp-proxy, tftpd、npppd、resolv.conf、inetd、smtpd、ldapd、ifstated'''

-GitHubリポジトリ: https://github.com/yellowman/nsh

-紹介動画: [[nsh: Network Shell on top of OpenBSD made for network administrators>https://www.youtube.com/watch?v=WMKxIHaWaG0]] (EuroBSDcon 2022)

期間限定で以下のリンクを作成した

-オンラインマニュアル: https://home.fuguita.org/nsh.8.html ~
([[自動翻訳版>https://home-fuguita-org.translate.goog/nsh.8.html?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=wapp]])

作者のChris Cappuccio氏はまた、フラッシュデバイスで動作するOpenBSDイメージを作成する[[flashrd>https://www.nmedia.net/flashrd/]]の作者でもある。

----
#contents

*LiveUSB版河豚板を作成 [#n97624f3]
**ダウンロード [#wa1f8fa3]
[[ダウンロードミラー一覧>FuguIta/Download]]からよさげな場所を選んでダウンロード
 # ftp https://jp2.dl.fuguita.org/SHA256
 Trying 160.16.199.59...
 Requesting https://jp2.dl.fuguita.org/SHA256
 100% |*******************************************************|   640       00:00
 640 bytes received in 0.00 seconds (2.65 MB/s)
 # ftp https://jp2.dl.fuguita.org/FuguIta-7.2-amd64-202211151.img.gz
 Trying 160.16.199.59...
 Requesting https://jp2.dl.fuguita.org/FuguIta-7.2-amd64-202211151.img.gz
 100% |*******************************************************|   332 MB    00:32
 348583114 bytes received in 32.14 seconds (10.34 MB/s)
**ファイルの整合性チェック [#g03c034c]
MD5かSHA256のいずれかを用いてダウンロードしたファイルが壊れていないかチェックする。以下はSHA256の例:
 # sha256 -C SHA256 FuguIta-7.2-amd64-202211151.img.gz
 (SHA256) FuguIta-7.2-amd64-202211151.img.gz: OK
**デバイスに書込み [#w0dbe3e1]
 # zcat FuguIta-7.2-amd64-nsh_test.img.gz | dd of=/dev/rsdXc bs=1m
/dev/rsdXcには適宜デバイス名を充当して実行。

*初回起ち上げ [#i7f54524]
**システムデバイスの指定 [#y868bd2e]
 scanning partitions: sd0a sd0d sd0i
 FuguIta's operating device(s): sd0a.
 
 Which is FuguIta's operating device? [default: sd0a] ->
河豚板デバイスを一つだけ装着しているので、デフォルト(ENTERのみ押下)でOK。

**MFSサイズの指定 [#u9ef51ad]
 available memory: 2031M
 
 Enter mfs size.
   You can add suffix K, M, or G.
   % is a percentage of memory size.
   and %% is a percentage of the total memory and swap.
   otherwise considered "megabytes"
 
 [default: 1523M] ->
 set mfs size to 1523MB
デフォルトでは、実装メモリの75%をMFSに割り当てる。~
(実測したところ、物理メモリは192MB程度以上実装されていれば使用可能となった)

**起動モードの指定 [#b4a16750]
LiveUSBの標準的なモードである起動モード0で起動。
 Boot modes:
    0: fresh boot - standard mode as a live system
    1: fresh boot - less memory, faster boot
 		  (/usr is non-writable, can't pkg_add)
    2: fresh boot - works using only RAM
 		  (about 1GB or more of RAM required)
    3: boot with retrieving saved files from storage device
       or enter passphrase for an encrypted volume
    4: boot with retrieving saved files from floppy disk
    5: interactive shell for maintenance
 -> 0
 Running manual setup.
モード1での起動も可。この場合、運用中は完オン・メモリで動作する。
モード2での起動も可。この場合、運用中は完オン・メモリで動作する。

この後、OSが動作するための基本的な設定について訊かれてゆくので、適宜入力してゆく。
**rootパスワード [#ibee2606]
 Changing password for root.
 New password:
 Retype new password:
 passwd: password updated successfully
簡単すぎるパスワードは弾かれるので注意。

**ネットワーク関連の設定 [#lf7dacc4]
ここでの設定は、河豚板をネットワーククライアントとして使用することを想定している。

今回、ルータなどとしての使用を想定しているので、複数のネットワークインターフェースとその間のフォワーディングなどに関する設定を追加する必要がある。~
それらの設定は、起動後にrootでログインして行うか、あるいはNSH内で行う。

***ホスト名 [#e1fa4ae0]
 Hostname with domain part (FQDN):
 only host name without domain part is also OK.
 -> nshrouter.local

***IPバージョン [#z0417cd1]
今回はIPv4のみでの運用を想定
 IP protocol version(s) to be enabled: 4, 6, 46, 64 or "none"
   4: enable only IPv4
   6: enable only IPv6
   46: give priority to IPv4 name resolution
   64: give priority to IPv6 name resolution
   none: operate as standalone
 [64] ->4

***ネットワークインターフェース [#s3ddee1c]
 Network Interfaces: Choose one
 
   NIC	 type	   Name
 -------- ----- ------------
     vio0 ether unknown
 [vio0] ->

***IPアドレス、デフォルトルート [#e464cca4]
 IPv4 - address and routing:
   Enter "auto" or "IPv4_address[/mask] [default_gateway]"
   "auto" is an automatic setting by DHCP.
   The "/mask" part can be specified in either format,
   such as "/255.255.255.0" or "/24".
   If there is no default gateway,
   set the second field to "none" or leave it blank.
 [auto] -> 100.64.1.3/31 100.64.1.2

***ネームサーバ [#r48f19fb]
 DNS servers: up to 3 IP addresses, separated by spaces
 -> 9.9.9.9

**ログイン方法 [#m74b7f13]
 Do you login with C)onsole or X) Window System?
 [default: C] ->
この後、OpenBSD本来のブートシーケンスが続き、最後にログインプロンプトが表示される。


*ルートでログインして諸々設定 [#if05b470]
起動が完了し、ログインプロンプトが表示されたら、先ほど設定したパスワードを用いてrootでログインし、以降の作業を行う。

**タイムゾーン [#qe6320c8]
 nshrouter# date
 Tue Nov 22 05:28:53 UTC 2022
 nshrouter# ln -sf usr/share/zoneinfo/Asia/Tokyo /etc/localtime
 nshrouter# date
 Tue Nov 22 14:29:02 JST 2022

**シャットダウン時のファイル自動保存 [#w32703d4]
河豚板では、MFS上のデータをUSBメモリ等に保存するにはusbfadmというユティリティを使うが、/etc/rc.shutdownを以下のように編集することでシャットダウン時にusbfadmを実行し、自動的に保存を行うようになる。
 nshrouter# vi /etc/rc.shutdown
 
 force_umount=No   # set Yes for forced umount /ram at shutdown
 force_resync=Yes  # set Yes to re-sync at shutdown  <== これをYesに変更
 
 # stop_all_daemons - to eliminate all daemons at umount /ram
 #
 stop_all_daemons () {
     :
     :

**起動時の設定の自動化 [#c09ecea1]
USBメモリ内のnoasksというファイルを編集することにより、起動時に手動で入力していた設定が自動化される。~
前回の終了時に保存したファイルの読み込みも、このnoasks内で指定する。
 nshrouter# mount /dev/sd0d /mnt
 nshrouter# vi /mnt/livecd-config/7.2/amd64/noasks
 
 #
 # noasks - parameter settings for non-interactive boot
 #
 # Make statements uncommented
 # Then assign real values
 #
 #
 # FuguIta system device
 #   - Use one of two lines
 #noask_rdev=sd0a  # device name format
 noask_rdev=3b5447abd772121d.a  # DUID format  <==河豚板のシステムデバイス
 #                                                常に同じデバイスを指定できる
 # mfs size in MB                                 ので、DUID (Disklabel Unique ID)
 noask_umem=75%  <==MFSのサイズ                   による指定を推奨
 #
 # boot mode
 noask_setup_rw_mode=3  <==起動モード 3=保存されたファイルを読み込んで起動
 #
 # storage device
 #   - Use one of two lines
 #noask_confdev=sd0d  # device name format
 noask_confdev=3b5447abd772121d.d  # DUID format  <==ファイルを読み込むデバイス
 #                                                   noask_rdevと同じくDUID推奨
 # data set name in USB flash drive
 noask_confdir=nshrouter  <==読み込むファイルの保存名
 
 nshrouter# umount /mnt

*リブートの動作確認 [#wa516f7a]
**ここまでの設定をとりあえず保存 [#j7424422]
usbfadmを起動し、保存先、保存名を指定して保存を実行
 nshrouter# usbfadm
 
 Welcome to usbfadm.
 USB flash drive administration tool for FuguIta
 
  Version/Arch: 7.2/amd64  (FuguIta-7.2-amd64-202211151)
     Boot mode: manual
 Target device: not set
 Data saved as: not set
 
 readline capability available
 TAB to complete the reserved words
 
 Type ? for help.
 
 ? : ? ->target
 
 Searching storage device
 Please make sure the device inserted.
 Then press ENTER ->
 sd0a +sd0d
 target device->sd0d
 
 sd0d : ? ->saveas
 Name of saved data->nshrouter
 
 Your data will be saved as ``nshrouter''.
 
 sd0d : nshrouter ->sync
 
 Sync current mfs as ``nshrouter'' , OK? [y/N] -> y
 
 34.4MiB 0:00:04 [8.57MiB/s] [=================================]105% ETA 0:00:00
 waiting for pax to finish ... syncing ... done.
 
 sd0d : nshrouter ->quit
 
 Bye bye...
 nshrouter# 

**リブート [#pca19e77]
 nshrouter# reboot

チェック項目
-シャットダウン時にファイルが自動保存されるか?
-再起動時に自動で立ち上がるか?
-再起動完了後、保存時の環境が復帰されているか?

*NSH関連の設定 [#h311791c]
**NSHのインストール [#x4962962]
packagesからインストールする
 nshrouter# pkg_add nsh
 quirks-6.42(signed) 2022-11-20T19:34:54Z
 quirks-6.42:ok
 Ambiguous:
 a	0: <None>
 	1: nsh-1.0.20220919
 	2: nsh-1.0.20220919-static
 Your choice: 1
 nsh-1.0.20220919:ok
 nshrouter# nsh
 % NSH v1.0
 nshrouter.local/quit
 % Session terminated.
 nshrouter#
nsh-1.0.20220919-staticは、NSHの静的リンク版(chrootして実行したい時などに使用?)。

注: 時計がずれているとTLS通信が失敗し、pkg_addが不成功に終わる場合がある。その場合は、dateコマンドを用い、手動で時刻合わせをするか、あるいは、
 nshrouter# rdate ntp.nict.jp
などとして時刻を合わせる。

**NSHの実行アカウントを作成 [#h58613ed]
adduserコマンドは初回実行時、adduser.confの作成について色々訊かれるが、全部デフォルト(ENTER押下)でよい。
 nshrouter# adduser nsh
 Couldn't find /etc/adduser.conf: creating a new adduser configuration file
 Reading /etc/shells
 Enter your default shell: csh ksh nologin nsh sh [ksh]:
 Your default shell is: ksh -> /bin/ksh
 Default login class: authpf bgpd daemon default pbuild staff unbound vmd xenodm
 [default]:
 Enter your default HOME partition: [/home]:
 Copy dotfiles from: /etc/skel no [/etc/skel]:
 Send welcome message?: /path/file default no [no]:
 Do not send message(s)
 Prompt for passwords by default (y/n) [y]:
 Default encryption method for passwords: auto blowfish [auto]:
 Use option ``-silent'' if you don't want to see all warnings and questions.
 
 Reading /etc/shells
 Check /etc/master.passwd
 Check /etc/group
 
 Ok, let's go.
 Don't worry about mistakes. There will be a chance later to correct any input.
 Enter username []: nsh
 Enter full name []: Network SHell
 Enter shell csh ksh nologin nsh sh [ksh]:
 Uid [1000]:
 Login group nsh [nsh]:
 Login group is ``nsh''. Invite nsh into other groups: guest no
 [no]: wheel
 Login class authpf bgpd daemon default pbuild staff unbound vmd xenodm
 [default]:
 Enter password []:
 Enter password again []:
 
 Name:	     nsh
 Password:    ****
 Fullname:    Network SHell
 Uid:	     1000
 Gid:	     1000 (nsh)
 Groups:	     nsh wheel
 Login Class: default
 HOME:	     /home/nsh
 Shell:	     /bin/ksh
 OK? (y/n) [y]: y
 Added user ``nsh''
 Copy files from /etc/skel to /home/nsh
 Add another user? (y/n) [y]: n
 Goodbye!
 nshrouter# exit
 
 OpenBSD/amd64 (nshrouter.local) (tty00)
 
 login: nsh
 Password:
NSHはroot権限でコマンドを実行するので、nshアカウントはwheelグループに所属させておく。

***/home/nsh/.profileの編集 [#p7452927]
ログイン直後にroot権限でNSHが実行されるようにする。
 nshrouter$ vi ~/.profile
 exec doas /usr/local/bin/nsh
 exit  # for fail safe
pkg_addでNSHをインストールすると、/etc/shellsにnshが登録されるので、これをログインシェルとしてもいいような気もするが、マニュアルページではこの方法は推奨されていない。~
>nsh(8) Section 7 > Adding system users to:~
'''Do NOT add nwrapper (or nsh) to /etc/shells. They should not be entered here.'''

***/etc/doas.confの編集 [#rc995110]
ユーザnshがパスワード無しでroot権限のnshを実行できるように設定
 nshrouter# echo permit nopass nsh cmd /usr/local/bin/nsh > /etc/doas.conf

***設定の保存 [#pd630abd]
以上で、ユーザアカウントnshでログインするとnshが起動するようになった。
念の為、ここまでの状態をUSBメモリに保存しておく
 nshrouter# usbfadm -r
 ========================================
 = Sync /dev/sd0d with current mfs as nshrouter
 =
 sending incremental file list
 etc/fstab
             154 100%    0.00kB/s    0:00:00 (xfr#1, ir-chk=1078/1094)
             :
             :
 var/spool/smtpd/purge/2135993693/
 var/spool/smtpd/temporary/
 nshrouter# 
一度、保存を行っている場合はコマンドラインから usbfadm -r で保存を再実行できる。

データ保存の初回実行時はpaxを使用し、次回からはrsyncによる差分転送を行う。

*トラブルシューティング [#j2f3f283]
**OpenNTPDの設定で警告が出る [#s348a0e8]
 % NSH v1.0
 nshrouter.local/enable
 nshrouter.local(p)/ntp edit
 servers ntp.nict.jp
 configuration OK
 nshrouter.local(p)/ntp disable
 -s option no longer works and will be removed soon.      <== ntpdの -s オプションは古いので
 Please reconfigure to use constraints or trusted servers.    ntpdがこの警告を出す。
 nshrouter.local(p)/ntp enable
 -s option no longer works and will be removed soon.
 Please reconfigure to use constraints or trusted servers.
 nshrouter.local(p)/!ntpctl -s all  <== ntpdの同期状態は、ntpctlコマンドを子プロセスとして
 0/5 peers valid, clock unsynced        呼出し、確認する。
 
 peer
    wt tl st  next  poll		 offset	      delay	 jitter
 133.243.238.163 from pool ntp.nict.jp
     1  3  1    2s    5s		    ---- peer not valid ----
 133.243.238.164 from pool ntp.nict.jp
     1  3  1    4s    7s		    ---- peer not valid ----
 61.205.120.130 from pool ntp.nict.jp
     1  3  1    2s    5s		    ---- peer not valid ----
 133.243.238.243 from pool ntp.nict.jp
     1  3  1    2s    5s		    ---- peer not valid ----
 133.243.238.244 from pool ntp.nict.jp
     1  3  1    3s    6s		    ---- peer not valid ----
 nshrouter.local(p)/
NTPの参照サーバがntp.pool.orgからntp.nict.jpに変っているので、設定変更自体は反映されている。

**nshからreboot/haltでファイルが自動保存されない [#yb6d3791]
 nshrouter.local(p)/reboot  <= nshの特権モードでrebootを実行
 % Reboot initiated
 syncing disks... done  <= ファイルが自動保存されず、いきなりreboot
 vmmci0: powerdown         /etc/rc.shutdownが実行されない
 rebooting...
 
 Using drive 0, partition 3.
 Loading......
 probing: pc0 com0 mem[638K 2046M a20=on]
 disk: hd0+
 >> OpenBSD/amd64 BOOT 3.55/*
これに関しては、マニュアルページにも以下のような記述がある。

>reboot~
Restart the system. Warning no confirmation prompt is issued, configuration changes are NOT automatically saved! User must save configuration manually BEFORE using reboot. Requires privileged access.

NSHのソースで該当部分を見てみる~
''commands.c''
 /*
  * Reboot
  */
 int
 nreboot(void)
 {
         printf ("%% Reboot initiated\n");
         if (reboot (RB_AUTOBOOT) == -1)  <== reboot(2)が呼び出されている
                 printf("%% reboot: RB_AUTOBOOT: %s\n", strerror(errno));
         return(0);
 }
                
 int
 halt(void)
 {
         printf ("%% Shutdown initiated\n");
         if (reboot (RB_HALT) == -1)  <== reboot(2)が呼び出されている
                 printf("%% reboot: RB_HALT: %s\n", strerror(errno));
         return(0);
 }
/etc/rc.shutdownが呼び出されないのは、nshがreboot(2)を直接呼出してOSの停止処理を行っているため。

NSHからwrite-configでファイルに書き出した設定は河豚板ではMFS上に載っているので、いきなりリブートすると、この設定が保存されず都合が悪い。~
シャットダウン時に/etc/rc.shutdownが実行されるようにする必要がある。

**改修 [#s8960891]
ports treeを展開し、/usr/ports/shells/nsh 内にパッチファイルを追加

''/usr/ports/shell/nsh/patches/patch-ctl_c''
 --- ctl.c.orig	Tue Sep 20 04:18:55 2022
 +++ ctl.c	Tue Nov 22 09:37:12 2022
 @@ -412,7 +412,7 @@
  char *ctl_ntp_test[] = { NTPD, "-nf", REQTEMP, NULL };
  struct ctl ctl_ntp[] = {
  	{ "enable",     "enable service",
 -	    { NTPD, "-sf", REQTEMP, NULL }, NULL, DB_X_ENABLE, T_EXEC },
 +	    { NTPD, "-f", REQTEMP, NULL }, NULL, DB_X_ENABLE, T_EXEC },
  	{ "disable",    "disable service",
  	    { PKILL, table, "ntpd", NULL }, NULL, DB_X_DISABLE, T_EXEC },
  	{ "edit",       "edit configuration",

''/usr/ports/shell/nsh/patches/patch-commands_c''
 --- commands.c.orig	Tue Sep 20 04:18:55 2022
 +++ commands.c	Tue Nov 22 09:37:12 2022
 @@ -1962,7 +1962,7 @@
  nreboot(void)
  {
  	printf ("%% Reboot initiated\n");
 -	if (reboot (RB_AUTOBOOT) == -1)
 +	if (system("/sbin/reboot") == -1)
  		printf("%% reboot: RB_AUTOBOOT: %s\n", strerror(errno));
  	return(0);
  }
 @@ -1971,7 +1971,7 @@
  halt(void)
  {
  	printf ("%% Shutdown initiated\n");
 -	if (reboot (RB_HALT) == -1)
 +	if (system("/sbin/halt -p")  == -1)
  		printf("%% reboot: RB_HALT: %s\n", strerror(errno));
  	return(0);
  }

portsにてパッチを適用し、ビルド
 nshrouter# pkg_delete nsh
 nsh-1.0.20220919:ok
 Read shared items:ok
 nshrouter# cd /usr/ports/shells/nsh
 nshrouter# make install
 ===>  Checking files for nsh-1.0.20220919
 >> Fetch https://github.com/yellowman/nsh/archive/fcad0f6af197ab0c96e2c5410c....
 >> (SHA256) nsh-1.0.20220919-fcad0f6a.tar.gz: OK
 ===> nsh-1.0.20220919 depends on: sqlite3-* -> sqlite3-3.39.3
 ===>  Verifying specs:	c curses edit sqlite3
 ===>  found c.96.2 curses.14.0 edit.5.2 sqlite3.37.20
 ===>  Extracting for nsh-1.0.20220919
 ===>  Patching for nsh-1.0.20220919    <== 今ほど追加したパッチが適用されている
 ===>   Applying OpenBSD patch patch-commands_c
 Hmm...	Looks like a unified diff to me...
 The text leading up to this was:
 --------------------------
 |--- commands.c.orig	Tue Sep 20 04:18:55 2022
 |+++ commands.c Tue Nov 22 09:37:12 2022
 --------------------------
 Patching file commands.c using Plan A...
 Hunk #1 succeeded at 1962.
 Hunk #2 succeeded at 1971.
 done
 ===>   Applying OpenBSD patch patch-ctl_c
 Hmm...	Looks like a unified diff to me...
 The text leading up to this was:
 --------------------------
 |--- ctl.c.orig Tue Sep 20 04:18:55 2022
 |+++ ctl.c	Tue Nov 22 09:37:12 2022
 --------------------------
 Patching file ctl.c using Plan A...
 Hunk #1 succeeded at 412.
 done
 ===>  Compiler link: clang -> /usr/bin/clang
 ===>  Compiler link: clang++ -> /usr/bin/clang++
 ===>  Compiler link: cc -> /usr/bin/cc
 ===>  Compiler link: c++ -> /usr/bin/c++
 ===>  Generating configure for nsh-1.0.20220919
 ===>  Configuring for nsh-1.0.20220919
 ===>  Building for nsh-1.0.20220919
 cc -O2 -pipe -Wmissing-prototypes -Wformat -Wall -Wbad-function-cast ....
 sh /ram/usr/ports/pobj/nsh-1.0.20220919/nsh-fcad0f6af197ab0c96e2c5410....
         :
         :
 cc -O2 -pipe -Wmissing-prototypes -Wformat -Wall -Wbad-function-cast ....
 cc -L/usr/local/lib  -o nsh arp.o compile.o main.o genget.o commands ....
 ===>  Faking installation for nsh-1.0.20220919
 /usr/ports/pobj/nsh-1.0.20220919/bin/install -c -s -m 755 /usr/ports ....
 ===>  Building package for nsh-1.0.20220919
 Create /usr/ports/packages/amd64/all/nsh-1.0.20220919.tgz
         :
         :
 Link to /usr/ports/packages/amd64/ftp/nsh-1.0.20220919.tgz
 ===>  Verifying specs: c curses edit sqlite3
 ===>  found c.96.2 curses.14.0 edit.5.2 sqlite3.37.20
 ===>  Installing nsh-1.0.20220919 from /usr/ports/packages/amd64/all/
 nsh-1.0.20220919:9ok
 nshrouter# nsh
 % NSH v1.0
 nshrouter.local/enable

*雑感 [#eca6fa7b]
NSHの利用についてはここまでで、ネットワーク機能の本格的な設定はこれから。

**nshの初期化について [#x5785e02]
''write-config''を実行すると/etc/nshrcに設定が保存される。マニュアルでは、
'''On the next startup of the system, this saved configuration is used.'''
という記述があるが、次の起動では保存された設定は反映されない。

nshの2つのコマンドラインオプション、
:-c '''config-script-file'''|''nsh'' execute the command(s) in the '''config-script-file'''. This is typically used to implement scripted changes to configuration. 
:-i '''rcfile'''|load the inital system configuration from the command(s) in the '''rcfile'''. This is typically used to clear the configuration load a full ''nsh'' configuration script from '''rcfile''' . 

を指定しても、ファイル内のnshコマンドを実行した後、終了する。~
''/etc/nshrc''は以下のように記述した方がよいかもしれない。
 if [ -r /etc/nshrc ]; then
     doas /usr/local/bin/nsh -i /etc/nshrc
 fi
 exec doas /usr/local/bin/nsh
 exit  # fail safe

**この構築手順を用いた他の事例 [#je3f8b61]
設定手順の[[ダウンロード>#wa1f8fa3]]から[[起動時の設定の自動化>#c09ecea1]]までは、河豚板でなにがしかのシステムを構築する場合の定石。~
以下の事例でもこの手順に従ってシステムを構築している。

-Qiita: [[OpenBSDライブシステム「河豚板」の日本語デスクトップ環境を構築する>https://qiita.com/ykaw/items/ca008a34d73d5f1f6dd8]]

-[[How to port PFFW to FuguIta>FuguIta/BBS#r9e5ee9b]]

-[[Desktop environment demo of FuguIta>FuguIta/BBS#r9e5ee9b]]

-[[isotop on FuguIta>FuguIta/BBS/10#vc6211a3]]

-[[温度測定システム>https://twitter.com/yoshi_kaw/status/1534358055101485056]]

*関連情報 [#zfbc39d5]

-[[河豚板ガイド]]

-[[FuguIta Start Guide>FuguIta/StartGuide]]

-YouTube: [[Basic settings for FuguIta (OpenBSD-based Live System)>https://www.youtube.com/watch?v=zyz2Ukcx68Q]]
----
#topicpath

Front page   Edit Diff History Attach Copy Rename Reload   New Page list Search Recent changes   Help   RSS of recent changes