皆さん、明けましておめでとうございます。Ubuntu Japanese Teamの吉田と申します。
UbuntuはDebianベースの、デスクトップOSとしての機能に注力したLinuxディストリビューションです(今後はサーバ周りも充実していく予定です) 。
Weekly RecipeではUbuntuの強力なデスクトップ機能を活用するためのレシピを、毎週一つずつお届けします。
system preparation tool for Ubuntu
ありがたいことに、UbuntuはデスクトップLinuxの代表例の一つとして、一定の評価を頂けるようになりました。これにより、ホワイトボックスPC(ショップブランドPC)やリサイクルPCの中には、プリイントールOSとしてUbuntuを選択できるモデルが出てきています。
こうしたプリインストール用途のために、Ubuntuには「OEMインストール」という専用のインストールタイプが用意されています。これはメーカー製PCにインストールされたWindowsと同じように、エンドユーザが設定するべき項目、すなわち、「 初期設定ユーザの名前」「 地域・言語の設定」「 キーボードレイアウトの選択」などを選択するダイアログを提供することができます。これはベンダ側で、あらかじめ特定のハードウェア向けのドライバ設定や壁紙の変更など、必要な変更を追えた段階で一定の操作を行った上で、「 エンドユーザ向け起動モード」に変更する、という流れで利用するものです。
こういった作業を行うためのツールは、Windows環境では「sysprep (system preparation) 」ツールとして提供されており、これを用いることでプロダクトキーの入力・タイムゾーンの設定・初期ユーザの登録など、エンドユーザが行うべき初期設定を再度行えるようになっています(こうした、エンドユーザが利用する最小限の入力を促す画面は「ミニ・セットアップ」と呼ばれることが多いようです)( 注1 ) 。
OEMインストールを用いることで、「 UbuntuをプリインストールOSとして利用する(特にノートPCのような、機種ごとに細かな設定を追加する必要がある場合) 」や、「 企業内で事務端末として利用する場合に、事前に共通設定を行っておき、必要になった時点で最終段階のセットアップだけを行ってエンドユーザに渡す」といった運用が可能になります。
端的な利用例としては、Ubuntu Japanese Teamで配布している仮想マシン が、OEMインストールを用いた例の一つです。
[1] ただし、Windows環境におけるsysprepツールはミニ・セットアップの起動だけでなく、プロダクトキーの再入力(=アクティベーション処理)や、プロダクトキー以上に重要なSecurity ID(SID)の初期化を担っていることから、UbuntuのOEMインストールと完全に同じものではありません。Windows(特にActive Directory環境)におけるSIDはPCごとにユニークであることを期待されるものです。しかし、SIDはHDD上のレジストリハイブに保存されているため、HDDを単純にコピーするだけではSIDの重複を招いてしまいます。Active Directory上のシステム識別やNTFSのユーザ認証もSIDを活用して行われているため、Windowsのsysprepツールは単なるミニ・セットアップの起動以上の意味を持っています。
また、sysprepツールはPlug And Playの再実行を始めとしたハードウェア認識を自動でやり直してくれますが、UbuntuのOEMインストールでは(まだ)そういった機能はサポートされていません(ただし、WindowsとLinuxのドライバモデルの違いにより、ハードウェア自動認識が行われないことによる問題はほとんど起こりません) 。
OEMインストールの実際
さて、実際のOEMインストールの手順を見ていきましょう。
OEMインストールを行う場合も通常のインストールと同じく、「 Desktop CD」を用いて行います(なお、Ubuntuの通常のインストールCDはKnoppixなどと同じように、CDからブートしてシステムを体験できるLiveCDを兼ねており、Desktop CDと呼ばれています) 。
1.OEMインストールモードでの起動
Desktop CDを用意し、CDからシステムをブートします。
CDがロードされると次のような画面になりますので、「 OEMインストール(メーカー向け) 」を選択して[Enter]を入力します。LiveCDが通常と同じようにブートされますが、OSインストールのために用いられる"Ubiquity"はOEMインストール向けモードで準備されています(起動時オプションにoem-config/enable=trueが与えられます) 。
図1 CDがロードされたあとの画面
2.Ubiquityからのインストール
LiveCDが起動し、GNOMEデスクトップが表示された時点で、デスクトップには「インストール」というUbiquityへのショートカットが用意されています。通常の(OEMモードでない)インストールの場合、これをダブルクリックすることでUbuntuをインストールします。これはOEMモードでも同様で、「 インストール」アイコンを用いてUbiquityを起動し、システムへの導入を行います。ただし、OEMモードでは手順1.の操作によって起動時オプションが変更されているため、UbiquityもOEMインストールモードで起動されます。
Ubiquityを起動した直後のダイアログが下記です。ダイアログの下部に"You are installing in system manufacturer mode....(略)"という表示があることを確認してください(通常のインストールではこれは表示されません) 。
図2 Ubiquityを起動した直後のダイアログ
(ここには、"Please enter a unique name for this batch of systems. This name will be saved on...(略)"というエディットボックスがあります。これはベンダ側でリビジョンなどを管理するためのバッチ名称を入力するために用意されています。ここで入力した名称は、/var/log/installer/oem-idに保存され、インストール後のユーザからの問い合わせなどに利用できるようになります……と言いたいのですが、どうもバグがあり、この機能は上手く動作していないようです) 。
ここからの処理は通常のインストールと同様に行われます。異なる点は「初期ユーザとして登録されるのは、無条件に"oem, uid=29999, OEM Configuration ( temporary user) )"というユーザになる」ということだけです[2] 。パスワードの設定のみ行ってください。
図3 初期ユーザとして、OEM Configuration ( temporary user)が登録される
[2] 厳密には、OEMセットアップモードでインストールされた場合、oem-configという専用のパッケージが追加でインストールされます。このパッケージは後述のoem-config-*を始めとする各種処理を行うためのものです。
3.OEMベンダ向けセットアップモード
インストールが完了し、再起動を行うと、セットアップモードになります。ログインには先ほどパスワードを設定した、ユーザ「oem」を用います。
ログイン後は、通常とまったく同様に振る舞うことができます(ただし、デスクトップにある"Prepare for shipping to end user"アイコンはまだ起動しないでください。後述の通り、このスクリプトを起動するとエンドユーザ向けの最終処理が準備されてしまいます) 。この状態でハードウェア周りの設定(特に制限付きドライバや、ndiswrapperなどの追加ドライバ類)や、システムのアップデートを行います。
4.エンドユーザ向けの最終処理&ミニ・セットアップの起動
エンドユーザに渡す前に行う作業が終了したら、デスクトップの"Prepare for shipping to end user"スクリプトを起動します。これにより、次回起動時に、
が行われるようにセットされます。以上でOEMインストールは完了です。
この状態のHDDをコピーしておくことで、エンドユーザが行うべき最低限の設定を行うことで、すぐにUbuntuを利用できるようになります。
What is update-rc.d?
ここまでの手順のうち、"Prepare for shipping to end user"の実行により、oemユーザの削除と、ミニ・セットアップの起動がセットされる原理を見ていきましょう。当該スクリプトのアイコンを右クリックし、プロパティを表示させると分かりますが、ここで実行されるスクリプトの実体は/usr/sbin/oem-config-prepareです。
このコマンドを端末上で直接実行すると、以下のような出力が得られます。
Adding system startup for /etc/init.d/oem-config ...
/etc/rc2.d/S12oem-config -> ../init.d/oem-config
/etc/rc3.d/S12oem-config -> ../init.d/oem-config
/etc/rc4.d/S12oem-config -> ../init.d/oem-config
/etc/rc5.d/S12oem-config -> ../init.d/oem-config
この出力は、Debian系ディストリビューションで起動スクリプトの管理に使われる、update-rc.dコマンドのものです。これはRed Hatなどのchkconfigコマンドに相当するもので、/etc/init.d/ 以下のスクリプトの自動起動のOn/Offを設定します。
oem-config-prepareの実体はZenity(GNOME上で利用できる、シェルスクリプトからGUIダイアログを呼び出せるコマンド)を利用したシェルスクリプトで、実行されると権限のチェックの後、次が実行されます。
# update-rc.d oem-config start 12 2 3 4 5 .
update-rc.dの引数は(詳細はman update-rc.dを確認してください) 、次のようになります。
update-rc.d <スクリプト名> <start|stop> <起動タイミング> <ランレベル....>
これにより、次回起動時に/etc/init.d/oem-configシェルスクリプトが起動されるようになります。この/etc/init.d/oem-configがOEMインストールの主要なスクリプトです。起動時に/etc/init.d/oem-configが実行され、この中から/usr/sbin/oem-config-firstbootの起動→oemユーザの削除(+oemユーザがuid=29999で作成されたことによる、「 次のuid」値を30000から1000に戻すための処理) →以降はoem-configが起動しないように、次のコマンドが実行されます。
# update-rc.d -f oem-config remove
その上でミニ・セットアップ画面(/usr/sbin/oem-config-dm)を起動し、言語の選択(図4 )や、エンドユーザの情報登録・アカウント作成(図5 )といった流れで処理が行われます(ダイアログ左下のステップ表示が常に1/4と表示されてしまっていますが、8.04では改善されます。https://launchpad.net/ubuntu/hardy/+source/oem-config/1.24 ) 。
図4 言語の選択
図5 エンドユーザの情報登録・アカウント作成
なお、ミニ・セットアップの起動後も、oem-configパッケージそのものはインストールされたままです。
また、ロゴの表示やhostnameの再決定など、oem-config標準では行えない処理を追加したい場合、/usr/lib/oem-config/post-installにスクリプトを設置することで行えます(oem-config-firstbootスクリプトを変更することでも行えますが、この場合は単にスクリプトを改変するのではなく、oem-configパッケージそのものをcustom buildする方がよいでしょう) 。このようなカスタマイズを行った後、動作確認を行う場合はoem-config-firstbootを--debugオプション付で起動してください。
参考となるドキュメント
OEMインストールについて:
https://wiki.ubuntu.com/Ubiquity/OEM
update-rc.d関連:
https://help.ubuntu.com/community/UbuntuBootupHowto
Ubuntu(Debian)のランレベルについて:
https://help.ubuntu.com/community/InitScriptList