この章では、不揮発性 RAM (NVRAM) のシステム変数にアクセスし、変更する方法について説明します。
システム変数はシステム NVRAM に格納されます。それらの変数は、起動時のマシン構成と関連する通信特性を設定します。システム変数のデフォルト値は変更することができ、行った変更は電源再投入後も有効です。システム変数は常に注意深く調整する必要があります。
この章で説明する手順は、ユーザーインタフェースに入っているものとしています。ユーザーインタフェースに入る方法については、第 1 章「概要」を参照してください。
表 3-1 に、IEEE Standard 1275-1994 の定義に従う標準的セットの NVRAM システム変数の一覧を示します。
表 3-1 標準システム変数
変数名 |
設定値 |
説明 |
---|---|---|
auto-boot? |
true |
true の場合、電源投入後またはリセット後に自動的に起動します。 |
boot-command |
boot |
auto-boot? が true の場合に実行されるコマンド。 |
boot-device |
disk net |
起動するデバイス。 |
boot-file |
空白文字 |
起動するプログラムに渡される引数。 |
diag-device |
net |
診断起動ソースデバイス。 |
diag-file |
空白文字 |
診断モードで起動するプログラムに渡される引数。 |
diag-switch? |
false |
true の場合、診断モードで実行します。 |
fcode-debug? |
false |
true の場合、差し込み式デバイス FCode の名前フィールドを取り入れます。 |
input-device |
keyboard |
コンソール入力デバイス (通常 keyboard、ttya、ttyb) |
nvramrc |
空白文字 |
NVRAMRCの内容。 |
oem-banner |
空白文字 |
カスタム OEM バナー (oem-banner? が true で使用可能になります)。 |
oem-banner? |
false |
true の場合、カスタム OEM バナーを使用します。 |
oem-logo |
デフォルトなし |
バイト配列カスタム OEM ロゴ (oem-logo? が true で使用可能になります)。 16 進で表示。 |
oem-logo? |
false |
true の場合、カスタム OEM ロゴを使用します (true でない場合は、サンロゴを使用します)。 |
output-device |
screen |
コンソール出力デバイス (通常 screen、ttya、ttyb)。 |
screen-#columns |
80 |
画面上のカラム数 (文字数/行)。 |
screen-#rows |
34 |
画面上の行数。 |
security-#badlogins |
デフォルトなし |
誤ったセキュリティーパスワードの試行回数。 |
security-mode |
none |
ファームウェアセキュリティーレベル (none、command、full)。 |
security-password |
デフォルトなし |
ファームウェアセキュリティーパスワード (表示されません)。 |
use-nvramrc? |
false |
ファームウェアセキュリティーパスワード (表示されません)。 |
上記以外に、IEEE Standard 1275-1994 の SBus 版でシステム変数が定義されています。それらの変数を表 3-2 に示します。
表 3-2 SBus システム変数
変数名 |
設定値 |
説明 |
---|---|---|
sbus-probe-list |
0123 |
プローブされる SBus スロットとそれらがプローブされる順番。 |
OpenBoot の実装が異なると、使用するデフォルトやシステム変数も異なる場合があります。
NVRAM システム変数は、表 3-3 に示すコマンドを使用して表示、変更できます。
表 3-3 システム変数の表示と変更
コマンド |
説明 |
---|---|
printenv |
すべての現在の変数とデフォルト値を表示します。 printenv variable は指定する変数の現在値を表示します。 |
setenv variable value |
variable を 10 進またはテキスト値 value に設定します。 (変更は永続的ですが、通常はリセット後に初めて有効になります。) |
set-default variable |
指定する変数 (variable) の値を工場出荷時のデフォルトに設定します。 |
set-defaults |
変数設定を工場出荷時のデフォルトに戻します。 |
password |
security-password を設定します。 |
以降でこれらのコマンドをどのように使用できるかを示します。
Sun OS は OpenBoot システム変数を変更するための eeprom (1M) ユーティリティーを備えています。
変数の現在の設定の表示システムの現在の変数設定のリストを表示するには、次のように入力します。
ok printenv Variable Name Value Default Value oem-logo 2c 31 2c 2d 00 00 00 00 ... oem-logo? false false oem-banner oem-banner? false false output-device ttya screen input-device ttya keyboard sbus-probe-list 03 0123 diag-file diag-device net net boot-file boot-device disk disk net auto-boot? false true fcode-debug? true false use-nvramrc? false false nvramrc screen-#columns 80 80 screen-#rows 34 34 security-mode none none security-password security-#badlogins 0 diag-switch? true false ok |
現在の設定の書式付きリストでは、数値変数は 10 進数で示されます。
変数設定を変更するには、次のように入力します。
ok setenv variable-name value |
variable-name は変数の名前であり、value は変数に該当する数値またはテキスト文字列です。数値のデータ型は、0x を前に付けなければ 10 進になります。0x は 16 進数の修飾子です。
たとえば、auto-boot? 変数の設定を false に変更するには、次のように入力します。
ok setenv auto-boot? false ok |
多くの場合、変数の値を変更しても、そのままでは OpenBoot ファームウェアの動作には無効です。次の電源再投入またはシステムリセットで初めて、ファームウェアはそれらの変数の新しい値を使用します。
set-default 変数と set-defaults コマンドを使用して、変数の特定の 1 つまたは大部分をもとのデフォルト設定に戻すことができます。
たとえば、auto-boot? 変数をそのもとのデフォルト設定 (true) に戻すには、次のように入力します。
ok set-default auto-boot? ok |
大部分の変数をそれぞれのもとのデフォルト設定に戻すには、次のように入力します
ok set-defaults ok |
SPARC システムでは、マシンのパワーアップ処理の間「Stop-N」 を押し下げておくことにより、NVRAM 変数をそれぞれのデフォルト設定に戻すことができます。このコマンドを発行するときは、SPARC システムに電源を投入した直後に「Stop-N」を押し、数秒間またはバナーが表示されるまで (ディスプレイが使用できる場合)、押さえたままにしておきます。これにより、SPARC と互換性のあるマシンの NVRAM の内容をデフォルト設定に戻すことができます。
NVRAM のシステムセキュリティー用として次に示す変数があります。
security-mode
security-password
security-#badlogins
security-mode は、ユーザーがユーザーインタフェースから実行できる一連の処理を制限できます。3 つのセキュリティーモードを、セキュリティーの高い順序で示すと次のとおりです。
表 3-4 security-mode 設定用コマンド
モード |
コマンド |
---|---|
full |
go 以外のコマンドはすべてパスワードを必要とします。 |
command |
boot および go 以外のコマンドはすべてパスワードを必要とします。 |
none |
パスワードを必要としません (デフォルト)。 |
security-mode を設定しているときは、
boot コマンドだけを入力する場合、パスワードは必要ありません。ただし、引数を付けて boot コマンドを使用すると、パスワードが必要です。
go コマンドはパスワードを要求しません。
その他のコマンドを実行するにはパスワードが必要です。
次に画面で例を示します。
ok boot (パスワード必要なし) ok go (パスワード必要なし) ok boot filename (パスワード必要) Password: (入力時パスワードは画面表示されない) ok reset-all (パスワード必要) Password: (入力時パスワードは画面表示されない) |
セキュリティーパスワードを絶対に忘れないようにしてください。また、セキュリティーモードを設定する前にセキュリティーパスワードを設定してください。このパスワードを忘れると、システムが使用できなくなります。購入先に連絡してマシンを再び起動可能にする必要があります。
セキュリティーパスワードと command セキュリティーモードを設定するには、ok プロンプトで次のように入力します。
ok password ok New password (only first 8 chars are used): ok Retype new password: ok setenv security-mode command ok |
設定するセキュリティーパスワードは 0 〜 8 つの文字でなければなりません。8 文字目より後の文字は無視されます。システムをリセットする必要はありません。セキュリティー機能はコマンドを入力した直後に有効になります。
誤ったセキュリティーパスワードを入力した場合は、約 10 秒の遅延があってから次の起動プロンプトが現れます。誤ったセキュリティーパスワードを入力した回数は security-#badlogins 変数に格納されます。
full セキュリティーモードは最も制限の多いモードです。security-mode を full に設定した場合は、
boot コマンドの入力時にはパスワードが必要です。
go コマンドはパスワードを要求しません。
その他のコマンドを実行するにはパスワードが必要です。
次に例を示します。
ok go (パスワード必要なし) ok boot (パスワード必要) Password: (入力時パスワードは画面表示されない) ok boot filename (パスワード必要) Password: (入力時パスワードは画面表示されない) ok reset-all (パスワード必要) Password: (入力時パスワードは画面表示されない) |
セキュリティーパスワードを絶対に忘れないようにしてください。また、セキュリティーモードを設定する前にセキュリティーパスワードを設定してください。このパスワードを忘れると、システムが使用できなくなります。購入先に連絡してマシンを再び起動可能にする必要があります。
セキュリティーパスワードと full セキュリティーを設定するには、ok プロンプトで次のように入力します。
ok password ok New password (only first 8 chars are used): ok Retype new password: ok setenv security-mode full ok |
バナー構成用として次の変数があります。
oem-banner
oem-banner?
oem-logo
oem-logo?
電源投入時バナーを表示するには、次のように入力します。
ok banner Sun Ultra 1 SBus (UltraSPARC 167 MHz),Keyboard PresentPROM Rev. 3.0, 64MB memory installed, Serial # 289Ethernet address 8:0:20:d:e2:7b, Host ID: 80000121 ok |
システムによりバナーはこれとは異なることがあります。
バナーは、テキストフィールドとロゴの 2 つの部分からなっています (シリアルポートを介す場合は、テキストフィールドしか表示されません)。oem-banner と oem-banner? システム変数を使用して、既存のテキストフィールドを、カスタマイズしたテキストメッセージに置き換えることができます。
作成カスタマイズしたバナー電源投入時バナーにカスタマイズしたテキストフィールドを挿入するには、次のように入力します。
ok setenv oem-banner Hello Mom and Dad ok setenv oem-banner? true ok banner Hello Mom and Dad ok |
システムは、前の画面に示すように、新しいメッセージ付きのバナーを表示します。
図形ロゴは多少異なる方法で取り扱わなければなりません。oem-logo は、64×64 に配列された合計 4096 ビットからなる 512 バイトの配列です。各ビットはそれぞれ 1 ピクセルに相当します。最初のバイトの最上位ビット (MSB) が左上コーナのピクセルを制御します。次のビットはその右のピクセルを制御し、以下同様に各ビットは順次にピクセルに対応します。
新しいロゴを作成するには、まず、正しいデータを収容した Forth 配列を作成し、次にこの配列を oem-logo にコピーします。次にこの配列を $setenv で oem-logo にインストールします。次の例では、oem-logo の上側の半分に昇順パターンを書き込んでいます。
ok create logoarray d# 512 allot ok logoarray d# 256 0 do i over i + c! loop drop ok logoarray d# 256 " oem-logo" $setenv ok setenv oem-logo? true ok banner |
初期設定のサンの電源投入時バナーを復元するには、oem-logo? および oem-banner? 変数を false に設定します。
ok setenv oem-logo? false ok setenv oem-banner? false ok |
oem-logo 配列は非常に大きいので、printenv は最初のほぼ 8 バイト (16 進) しか表示しません。配列全体を表示するには、oem-logo dump コマンドを使用します。 oem-logo 配列は、データの復元が難しいことがあるので、set-defaultsによって消去されません。しかし、set-defaults を実行すると、oem-logo? が false に設定され、したがってカスタマイズしたロゴはそれ以降表示されなくなります。
一部のシステムは oem-logo 機能をサポートしません。
コンソールは、OpenBoot とユーザーとの間の第一の対話手段として使用されます。コンソールは、ユーザーから与えられる情報を受け取るために使用される入力デバイスと、ユーザーに情報を送るために使用される出力デバイスからなっています。一般的に、コンソールはテキスト・グラフィックス両用ディスプレイデバイスとキーボードの組み合わせか、シリアルポートに接続された ASCII 端末です。
システム入出力の制御関係の構成用として次に示すシステム変数があります。
input-device
output-device
screen-#columns
screen-#rows
これらの変数を使用してコンソール用の電源投入時デフォルトを割り当てます。これらの値は次の電源再投入またはシステムリセットまで有効になりません。
input-device および output-device 変数は、電源投入リセット後のファームウェア入出力デバイスの選択を制御します。input-device のデフォルト値は keyboard であり、output-device のデフォルト値は screen です。input-device、output-device の値はデバイス指定子でなければなりません。多くの場合、別名 keyboard、screen がこれらの変数の値として使用されます。
システムをリセットすると、指定したデバイスが初めのフォームウェアのコンソールの入力または出力デバイスになります。(入力または出力デバイスを一時的に変更する場合は、第 4 章「Forth ツールの使用方法」で説明する input または output コマンドを使用します。)
設定デフォルト入出力デバイス ttya を電源投入時初期コンソール入力デバイスとして設定するには、次のように入力します。
ok setenv input-device ttya ok |
input-device として keyboard を選択したが、このデバイスが接続されていない場合は、次の電源再投入またはシステムリセット後は、入力は予備のデバイス (通常 ttya) から受け入れられます。output-device として screen を選択したが、フレームバッファーが存在しない場合は、次の電源再投入またはシステムリセット後は、出力は予備のデバイスに送られます。
デフォルト出力デバイスとして SBus フレームバッファーを指定するには (特にシステムに複数のフレームバッファーが存在する場合)、次のように入力します。
ok setenv output-device /sbus/SUNW,leo ok |
設定シリアルポート特性シリアルポートの代表的な通信特性の範囲は次のとおりです。
baud = 110、300、1200、2400、4800、9600、19200、または 38400 ビット/秒
#bits = 5、6、7、または 8 (データビット)
parity = n (なし)、e (偶数)、または o (奇数)、パリティービット
#stop = 1 (1)、. (1.5)、または 2 (2) ストップビット
システムによっては、rts/cts および xon/xoff ハンドシェークは実装されていません。選択したプロトコルが実装されていないときは、ハンドシェーク変数は受け入れられますが、無視されます。メッセージは何も表示されません。
次にシステム変数を使用して、電源再投入またはシステムリセット後にシステムを自動的に起動させるかどうかを設定できます。
auto-boot?
auto-boot? が true で OpenBoot が診断モードではない場合は、システムは電源再投入またはシステムのリセット後 (boot-device と boot-file の値を使用して) 自動的に起動します。
手動起動時にも、これらの変数を使用して起動デバイスと起動するプログラムを選択することができます。たとえば、Ethernet からの自動起動を指定するには、次のように入力します。
ok setenv boot-device net ok |
boot-file と boot-device に対する変更は、次に起動 (boot) が実行されたときに有効になります。
電源投入時自己診断テスト用として次に示す変数があります。
diag-switch?
diag-device
diag-file
diag-level
diag-switch? を true に設定すると、diagnostic-mode? が true を返します。diagnostic-mode? が true を返すと、システムは次のように動作します。
以降の電源投入やシステムリセットプロセスでは、完全な 自己診断テストを実行します。
追加ステータスメッセージ (詳細は実装によって異なります) を表示することがあります。
異なる起動用システム変数を使用します。(起動処理に対する影響についての詳細は、第 2 章「システムの起動とテスト」を参照してください。)
大部分のシステムでは、diag-switch? 変数の工場出荷時のデフォルトは false です。diag-switch? を true に設定するには、次のように入力します。
ok setenv diag-switch? true ok |
一部のシステムは diagnostic-mode? が true を返すハードウェアの診断スイッチを備えています。そのハードウェアスイッチが設定されているか、または diag-switch? が true に設定されている場合は、システムは電源投入時にフルテストを実行します。
一部の実装では、電源投入時に実装によって決まるキー入力処理を使用して diag-switch? を true に強制設定できる場合があります。詳細は、システムのマニュアルまたは本書の付録 C 「障害追跡ガイド」を参照してください。
diag-switch? を false に設定するには、次のように入力します。
ok setenv diag-switch? false ok |
診断モードではない場合は、(テストでエラーが発生しなければ) システムは診断テスト実行中は報告せず、診断の一部を実行します。
nvramrc システム変数はスクリプトと呼ばれる内容を持ち、起動時に実行されるユーザー定義コマンドを格納します。
一般的に、nvramrc は起動時のシステム変数を保存したり、デバイスドライバコードをパッチしたり、インストール先固有のデバイス構成とデバイスの別名を定義するためにデバイスドライバが使用します。また、バグパッチまたはユーザーインストールの拡張用にも使用できます。コマンドは、ユーザーがコンソールから入力するように ASCII で格納されます。
use-nvramrc? システム変数が true の場合は、そのスクリプトが OpenBoot の起動処理で次のように評価されます。
電源投入時自己診断テスト (POST)を実行します。
システムの初期化を実行します。
(use-nvramrc? が true の場合) スクリプトを評価します。
probe-all を実行します (FCode を評価します)。
install-console を実行します。
banner を実行します。
二次診断を実行します。
(auto-boot? が true の場合) デフォルト起動を実行します。
場合によっては、probe-all install-console banner の処理を変更することが必要な場合があります。たとえば、差し込み式ディスプレイデバイスのプローブが終わってからコンソールデバイスの選択が終わるまでに、差し込み式デバイスの特性を変更するコマンドを実行する必要があることがあります。そのようなコマンドは、probe-all と install-console の間で実行する必要があります。出力をコンソールに表示するコマンドを install-console または banner の後に入れる必要があります。
これは、banner か suppress-banner を内容とするカスタムスクリプトを作成することにより実現できます。それは、そのスクリプトから banner か suppress-banner が実行されれば、probe-all、install-console および banner 処理が実行されないためです。つまり、そのスクリプト内部で probe-all、install-console、banner を場合により他のコマンドと混用する形で使用することができ、スクリプト終了後にそれらのコマンドを再び実行させないようにできます。
次の例外を除く、ほとんどすべてのユーザーインタフェースコマンドがスクリプトで使用できます。
boot
go
nvedit
password
reset-all
setenv security-mode
スクリプトエディタである nvedit では、表 3-5 に示すコマンドを使用して、スクリプトの内容を作成、変更することができます。
表 3-5 NVRAMAC に影響するコマンド
コマンド |
説明 |
---|---|
nvalias alias device-path |
スクリプトにコマンド devalias alias device-path を格納します。この別名は、nvunalias または set-defaults コマンドが実行されるまで有効です。 |
$nvalias |
スタックから引数 name-string と device-string を使用する以外は、nvalias と同じ機能です。 |
nvedit |
スクリプトエディタを起動します。前の nvedit セッションからのデータが一時バッファー内に残っている場合は、以前の内容の編集を再開します。残っていない場合は、nvramrc の内容を一時バッファーに読み取って、それらの編集を開始します。 |
nvquit |
一時バッファーの内容を、nvramrc に書き込まないで捨てます。捨てる前に、確認を求めます。 |
nvrecover |
nvramrc の内容が set-defaults の実行結果として失われている場合、それらの内容を回復し、次に nvedit の場合と同様にこのエディタを起動します。nvramrc の内容が失われたときから nvrecover が実行されるまでの間に nvedit を実行した場合は、nvrecover は失敗します。 |
nvrun |
一時バッファーの内容を実行します。 |
nvstore |
一時バッファーの内容を nvramrc にコピーします。一時バッファーの内容は捨てます。 |
nvunalias alias |
対応する別名を nvramrc から削除します。 |
$nvunalias |
スタックから引数 name-string を使用する以外は、nvunalias と同じ機能です。 |
表 3-6 にスクリプトエディタで使用できる編集コマンドを示します。
表 3-6 スクリプトエディタキー操作コマンド
キー操作 |
説明 |
---|---|
Control-B |
1 文字位置戻ります。 |
Escape B |
1 語戻ります。 |
Control-F |
1 文字位置進みます |
Escape F |
1 語進みます。 |
Control-A |
行の先頭に戻ります。 |
Control-E |
行の終わりに進みます。 |
Control-N |
スクリプト編集バッファーの次の行に進みます。 |
Control-P |
スクリプト編集バッファーの前の行に戻ります。 |
Return (Enter) |
カーソル位置に改行を挿入し、次の行に進みます。 |
Control-O |
カーソル位置に改行を挿入し、現在の行にとどまっています。 |
Control-K |
カーソル位置から行の終わりまで消去し、消去した文字を保存バッファーに格納します。カーソルが行の終わりにある場合は、現在の行に次の行をつなぎます (つまり、改行を削除します)。 |
Delete |
前の 1 文字を削除します。 |
Backspace |
前の 1 文字を削除します。 |
Control-H |
前の 1 文字を削除します。 |
Escape H |
語の先頭からカーソルの直前まで消去し、消去した文字を保存バッファーに格納します。 |
Control-W |
語の先頭からカーソルの直前まで消去し、消去した文字を保存バッファーに格納します。 |
Control-D |
次の 1 文字を消去します。 |
Escape D |
カーソルから語の終わりまで消去し、消去した文字を保存バッファーに格納します。 |
Control-U |
1 行全体を消去し、消去した文字を保存バッファーに格納します。 |
Control-Y |
保存バッファーの内容をカーソルの前に挿入します。 |
Control-Q |
次の文字の前に引用符を付けます (つまり、制御文字を挿入できます)。 |
Control-R |
1 行を入力し直します。 |
Control-L |
編集バッファーの内容全体を表示します。 |
Control-C |
エディタを終了し、OpenBoot コマンドインタプリタに戻ります。一時バッファーは保存されていますが、スクリプトには戻されません。(後で nvstore を使用して書いて戻してください。) |
次の手順で、スクリプトコマンドファイルを作成し起動してください。
エディタのコマンドを使用してスクリプトの内容を編集します。
変更を保存するために nvstore をまだ入力していない場合、nvrun と入力して一時編集バッファーの内容を実行できます。
nvstore と入力して変更結果を保存します。
次のように入力して、スクリプトを有効にします。
setenv use-nvramrc? true |
reset-all と入力してシステムをリセットしてからスクリプトの内容を実行するか、次のように入力してスクリプトの内容を直接実行します。
nvramrc evaluate |
次の例で、nvramrc 内に単純なコロン定義を作成する方法を示します。
ok nvedit 0: : hello ( -- ) 1: ." Hello, world. " cr 2: ; 3: ^C ok nvstore ok setenv use-nvramrc? true ok reset-all ... ok hello Hello, world. ok |
上の例で nvedit の行番号のプロンプト (0:、1:、2:、3:) に注意してください。これらのプロンプトはシステムによって異なることがあります。