開発環境
印刷用ページへ

VirtualBoxへのゲストOSインストール【Debian Sarge/GNU開発ツール】

2008年に公開されたDebian Sargeの最終アップデート版である、バージョン3.1 r8をVirtualBox上にインストールし、GNU開発環境を構築します(ホスト環境 Mac OS X)。

Debianのリリース番号には、Toy Storyキャラクターのニックネームを添える習慣があります。2005年に発表されたリリース3.1は、"Sarge"と名付けられました。Sargeは、3年ぶりの新リリースということもあり、Debianルネッサンスとも呼ぶべき、黄金時代を築きました(Debianに関する重要書籍のほとんどは、この時期に出版されています)。

Debian Sargeには、GNU開発ツールの初版が使用しているGCC 3.3.5が、デフォルトのCコンパイラとして採用されており、書籍中のコードを実行するには、最適の環境となっています。しかし、最終版の公開から5年以上が経過しているため、DVDインストール用のISOイメージは、ネット上で見当たりません。

幸い、DebianアーカイブサイトにSargeを始めとする、古いリリースのバイナリーパッケージが保存されていますので、ネットワークインストーラを入手すれば、インターネット経由で手元のマシンにDebian Sargeをインストールすることが可能になります。

なお、Debian Sarge用のVirtualBox設定方法については、次の記事を参照してください。

Debian Sargeネットワーク対応版インストーラ

ISOイメージの入手

まず最初に、ネットワークに対応したCD-ROMインストーラISOイメージを入手します。日本のミラーサイトであれば、理研のDebian archiveディレクトリが良いでしょう。

ページの下方に、細かなリリース毎の保管ディレクトリが用意されています。

Debian Sargeの最終アップデート版である、"3.1 revision 8のディレクトリ"を選択します。

 3.1_r8ディレクトリの内部には、Debianが対応している各アーキテクチャのサブディレクトリが用意されていますが、この中の"i386"を選択します。

CD-ISO, DVD-ISOイメージディレクトリが用意されていますが、今回は"iso-cdディレクトリ"を選択します。

iso-cdディレクトリに用意されているdebian-31r8-i386-netinst.isoが、目指すネットワークインストーラ用のCD-ISOイメージ(ファイルサイズ 110,628,864バイト)です。

仮想光学ドライブへのISOイメージの接続

ダウンロードしたISOイメージの格納場所はどこでも構いませんが、上記例ではVirtualBox VMsディレクトリに用意されている、Debian Sarge仮想マシンフォルダ内部に配置しています。

次に、 仮想光学ドライブにISOファイルイメージを接続します。設定画面の"ストレージ"を選択し、ストレージツリーのCD/DVDドライブアイコンを選択。"IDEセカンダリマスター"の右側にあるCDアイコンをクリックすると、サブメニューが表示されるため、最上段にある"仮想CD/DVDディスクファイルの選択"を実行します。

ここでダウンロードした、debian-31r8-i386-netinst.isoを指定すると、ストレージの設定は完了し、次のような表示になります。

メガバイト(MB)とメビバイト(MiB)

ディスクやメモリの容量を表記する場合に問題になるのが、接頭辞です。SI接頭辞は10の冪乗で数値を表し、1MB (メガバイト)は、106=1,000,000バイトを意味します。一方、二進接頭辞が使われることもあり、この場合は2の冪乗で表現するため、1MiB (メビバイト)は、220=1,048,576バイトとなります。debian-31r8-i386-netinst.isoのファイルサイズは110,628,864バイトでしたから、SI接頭辞で表現すると、110,628,864/1,000,000=110.6MBとなり、二進接頭辞で表現すると、110,628,864/1,048,576= 105.5MiBとなります。

接頭辞は厳密に使い分けるべきですが、FTPサーバーおよびVirtualBoxは、MiBで表記すべきところをMBで記載しています。

仮想マシンの最終確認

最終的な仮想マシンの状態を確認しておきましょう。

final machine statu

ポイントは下記の通りです。

  • IDEプライマリマスターには、仮想ハードディスイメージであるDebian Sarge.vdi (2GB)を接続
  • IDEセカンダリマスターには、仮想CDディスクイメージであるdebian-31r8-i386-netinst.isoを接続
  • フロッピィディスク・ドライブ#0は、仮想ディスケットイメージ未接続
  • ネットワークアダプターは、ブリッジモードで接続
  • インターネット接続されたホストネットワークインターフェースを指定(上記例では有線LAN en0:Ethernet)

Debian Sargeベースシステムのインストール

ホストキーによるキーボードキャプチャ解除

インストール作業をはじめる前に、ひとつ注意点があります。VirtualBoxの仮想マシンに対してキーボード入力やマウス操作を行うと、これらのデバイスは以降ゲスト環境に支配されるようになります(キーボード・マウスのキャプチャ)。

キーボードがゲスト環境に捕捉(capture)されていると、仮想マシンの下に表示されているステータスラインのうち、右から2番目の下向き矢印が""となります(上記例)。この状態では、ホストのカーソルも消え、キーボードから入力されたデータは、すべてゲスト環境に送られます。

逆に、ホスト側でのキーボード・マウス操作が必要になった場合は、"ホストキー"を押して、ゲスト環境から解放する必要があります(下向き矢印はグレーとなる)。

ホストキーは、VirtualBoxメニューの"環境設定⇒入力"で変更可能ですが、デフォルトではMac OS Xの場合、左コマンドキーが割り当てられています(Windowsでは右コントロールキー)。

起動

マネージャーの"起動ボタン"を押して、Debian Sargeのインストールを開始しましょう。

音も無くDebian GNU Linuxのwelcomeメッセージが表示されますが、VirtualBoxの内部では仮想CD-ROMドライブへのアクセスを通して、ブートプログラムがCD ISOイメージから読み込まれています。RETURN (ENTER)キーを押すと、起動メッセージが一瞬流れ去った後に、Debianのインストーラ画面に続きます。

なお、仮想マシン画面の最下段ステータス行において、左から2番目にCD-ROMアイコンが表示されていますが、これは光学ドライブにメディアが挿入されていることを意味しています(実体はdebian-31r8-i386-netinst.iso)。仮想マシン内部で、メディアが擬似的に排出されると、このアイコンはグレー表示となります。

言語の選択

まず最初に、インストール作業の説明に使われる言語を選択します(デフォルトは"English")。日本語に切り替えることも可能ですが、この場合、最終段階で開発環境には不要のパッケージが、多数インストールされてしまうため、今回はRETURNキーを入力し、英語表記のままで進みます。

国の選択

"国の選択"画面に変わります。デフォルトでは"United States"にカーソルが移動していますが、日本の場合は、最下段にある"other (他の国々)"を選択します。

地域毎に分類された、各国の一覧表が表示されます。先頭はNorth Americaですが、ここで"A"を入力すると、アジア地域の先頭に移動します(下向きカーソルでの移動も可能)。

さらに、カーソルキーで"Japan"まで移動し、RETURNキーで決定します。

キーボードレイアウトの選択

次に、キーボードレイアウト(keymap)の設定を行います。ホスト環境で使用しているキーボードが英語仕様の場合は、デフォルトの"American English"を選択します。日本語キーボードの場合は、"J"を押すと"Japanese"までジャンプしますので、RETURNキーで決定してください。

諸設定

キーボードレイアウトの設定が終わると、自動的に以下の処理が実行されます。

  • CD-ROMドライブの検出とマウント処理
  • CD-ROMからインストーラをダウンロード
  • ネットワークアダプタの検出

ネットワークアダプタが検出されると、インストーラはDHCPによる自動設定を試み、成功するとネットワーク設定へと進みます。マニュアルで設定する場合は、メッセージに従い、IPアドレス・ゲートウェイアドレスなどを入力してください。

ネットワークの設定

ホスト名を入力します(デフォルトは"debian")。

次に、ドメイン名を入力します。独自に取得したドメインであれば、その名前を指定しますが、プライベートネットワークでの使用であれば、任意のもので構いません(上記例では、examle.comを指定)。

ちなみに、テスト用のセカンドレベルドメインとしては、正式に下記のドメイン名が用意されています(RFC2606)。

  • example.com
  • example.net
  • example.org
  • example.jp
  • example.co.jp
  • example.ne.jp

ハードディスク・パーティションの初期化

ハードディスクのパーティションをどのようにして決定するかを指示します。本来、パーティション設定はセキュリティにも関わってくる重要なものですが、今回の目的はGNU開発環境の構築であり、インターネットサーバの運用ではありませんので、最も簡単な"erase entire disk (ディスク全体を消去する)"を選択します。

なお、対象ディスク名が"IDE1 (primary channel) マスター"と、仮想マシンの設定通りになっている点を確認しておきましょう。

具体的なパーティションの切り方を指定しますが、ここでは最も単純な"All files in one partition (すべてのディレクトリ階層を1つのパーティションにまとめる)"を指定してください。

本来は、ディレクトリの使用目的に応じて、個別のパーティションに割り当てるべきですが、今回は説明を単純にするため、シングルパーティションとします。

自動的に設定されたパーティション情報が表示されます。先頭に2.0GBの基本パーティション#1を用意、フォーマットはEXT3形式で行い、起動後はルートディレクトにマウントします。後方の論理パーティション#5は、131.6MBのメモリSWAP用領域として使用します。

この設定で問題ありませんので、"Finish partitioning and write changes to disk (パーティショニングの終了とディスクへの変更の書き込み)"を選択してください。

最終確認を求めてきますので、左向き矢印キーで"Yes"を選択すると、ハードディスクのMBR (Master Boot Record)上にあるパーティション情報を書き換えます。

以上で、ハードディスクのパーティション設定は完了です。

べースシステムのインストール

基本パーティションのフォーマット(mkfs: MaKe File System)を行い、マウント処理を行った後に、CD-ROM ISOイメージからコピーした、Debian基本パッケージ群を新しいファイルシステムに展開します。

ブートローダGRUBのインストール

最後に、ハードディスクに、ブートローダであるGRUBをインストールします。

以上で、Debianベースシステムの仮想ハードディスクへのインストールは完了です。続く設定処理は、インストールしたDebian上で行われるため、RETURNキーを押して仮想マシンを再起動させます。

なお、この時点でネットワークインストール用のCD-Rメディアはドライブから"排出される"ため、最下段のステータス行にあるCD-ROMアイコンがグレー表示になっている点に、注意してください。

Debian 起動・初期設定

GRUBからの起動

仮想マシンが起動し、BIOSセットアップが完了すると、ハーディスク上に記録されているブートローダGRUBが実行され、パーティションに格納されているOSの選択画面を表示します。

13.GRUB menu

初期状態では、ふたつのエントリが登録されています。ひとつは今回インストールしたDebian Sarge (kernel 2.4.27)、もうひとつはリカバリーモード用のDebian Sargeです。

ブートメニューが表示されると、自動的に5秒のカウントダウンが始まり、キー入力がなければ先頭のエントリが起動されます。リカバリーモードでDebianを起動する場合は、カーソルキーを移動させ、RETURNキーを押してください。

14.welcome

Debianを最初に起動すると、ウェルカムメッセージが表示されます。これから、タイムゾーン・ルートパスワード・ユーザーの追加など、基本的な諸設定が行われます。

タイムゾーンの設定

15B.GMT

まず最初に、PC搭載の内部クロックがUTC (Universal Coordinated Time)準拠になっているかどうかを尋ねられます。Debianのメッセージでは、GMT(Greenwich Mean Time: グリニッジ標準時)と記載されていますが、厳密には正しくありません(UTCとGMTの定義は異なる)。Mac OS Xの場合、仮想マシンの内部クロックはUTCに設定されています。

$ date -u
2013年 3月 6日 水曜日 15時23分40秒 UTC

ターミナルを起動し、シェル上で"date -u"を実行すると、UTC時刻が表示されますので、Debianで表示されている時刻と比較確認しておきましょう。

タイムゾーンの確認

16.TZ Tokyo

ここまでと同じ手順でインストールを進めていれば、デフォルトのタイムゾーンとして、"Asia/Tokyo"が表示されますので、そのまま"Yes"を選択します。

ルートパスワードの入力

管理者であるrootのパスワードを入力します。

確認のため、再度入力します。

ユーザーアカウントの作成

20B. create a user

root権限は強大であるため、ファイルパーミッションで保護された重要なファイルも削除できますし、操作によっては、システムが再起動できなくなることもあり得ます。

このため、たとえサーバの利用者が管理者一人であっても、一般ユーザのアカウントを作成します。

ユーザのフルネームを入力します。

ユーザのアカウント名を入力します。アカウント名は英字の小文字からスタートし、二文字目からは英小文字または数字を続けます。

ユーザのパスワードを入力します。

確認のためのパスワード再入力が終わると、新しいユーザのアカウントがシステム上に作成されます。

Debianアーカイブへのアクセス方法の指定

Debianは膨大なパッケージを提供していますが、これらを管理するための専用のツールが"apt"です。

最初に、パッケージ群へのアクセス方法を指定します。パッケージの提供方法としては、CD-ROM、DVD-ROM、インターネットなどがあります。

先にも述べた通り、Debian SargeのDVD-ROM ISOイメージは現在配布されていないため、今回はインターネット上のDebianディストリビューション・アーカイブを用います。

25.apt edit

Sargeは古いディストリビューションのため、"edit sources list by hand (手作業によるsources.listの編集)"を選択し、アーカイブサイトのアドレスを手入力する必要があります。

RETURNキーを押すと、システム附属のGNU nanoエディターが起動し、管理ツールaptが参照する /etc/apt/sources.list (アーカイブへのアクセス方法が記される)の編集状態となります。

26.sources list

あらかじめ、"#deb file:///cdrom/ sarge main"という一行が書かれていますが(先頭の#はコメントアウト)、ここに次行を追加します(アーカイブミラーURLの最後のスラッシュを忘れやすいので注意)。

deb http://ftp.riken.jp/Linux/debian/debian-archive/debian/ sarge main

URLの後ろには、リリース名、対象アーカイブエリアを続けます。今回は、リリース名はsargeとし、対象アーカイブエリアはmainのみとしています。アーカイブエリアは全部で3種類あり、mainの他には、contribnon-freeが存在します(必要であれば、contribとnon-freeを併記)。各アーカイブの詳細については、下記のページを参照してください。

入力が完了したら、コントロールキーを押しながら英字のOを押し (コントロールO:^O)、ファイルへの書き出しを指示します。実行前に、"File Name to Write: /etc/apt/sources.list"と、確認メッセージが出力されるので、そのままRETURNキーを押してください。

画面下方に、書き出しが完了したことを示す"[ Wrote 2 lines ]"というメッセージを確認できたら、コントロールX(^X)でnanoエディターを終了します。

ホスト環境からのコピー&ペースト

VirtualBox extension packを利用すると、ホスト環境上でコピーしたテキスト内容をゲスト環境上でペーストすることが可能になります。しかし、Debian Sargeは古すぎるため、この機能が正常に動作しません。SSHによるログインが可能になるまでは、手入力で作業してください。

Debianアーカイブへのアクセス

26B. testing apt sources

/etc/apt/sources.listの編集が終了すると、その内容に従ってアーカイブにアクセスし、パッケージ情報を抽出します。

27.security updates

Debianはパッケージ情報に加えて、セキュリティアップデートに関する情報も公開しています。しかし、Sargeのような古いリリースについては情報公開を中止しているため、"セキュリティアップデートの情報取得に失敗"したというエラーが表示されます。

/etc/apt/sources.list中に追記される、セキュリティデータベース情報は、自動的にコメントアウトされるため、このまま放置して問題ありません。

aptitudeによるソフトウェアパッケージ選択

Debianの膨大なパッケージ群から、自分が必要とするものをひとつひとつ選択し、インストールしていくことは、現実的ではありません。このために、aptitudeと呼ばれるツールが用意されており、デスクトップ環境・Webサーバー・メールサーバーなど、利用目的に応じて一括でパッケージを選択することが可能になっています。

28.software selection

今回は、不要なインストールを避けるため、"manual package selection (マニュアルによるパッケージ選択)"を選択します。カーソルキーで最下段まで移動し、"スペースキー"を押すと"アスタリスク(*)"のマークが付き、RETURNキーを押すと、aptitudeが起動します。

29.aptitude

直ちに"q"(Quit)を入力すると、確認のメッセージが表示されるため、左向きカーソルキーで"Yes"を選択してください。必要な開発ツール類は、後ほど手動でインストールします。

Exim SMTPサーバーの設定

続いて、SMTPサーバーの設定を行います。Debian Sargeでは、デフォルトのSMTPサーバーとして、英国で開発されたEximが採用されています。

30.exim4

UNIX環境では、内部で稼働しているWebサーバーやcronなどから、メール形式でエラーなどのレポートが管理者宛に送信されます。このため、外部へのメール送信がない場合でも、SMTPサーバーが必要となります。

今回の開発用サーバーは、インターネットを通じた外部へのメール送信は行わないため、"local delivery only (ローカル配信のみ)"を選択します。

rootもしくはpostmaster宛てに送信されたメールは、管理者の一般アカウントに転送することが一般的です。ここで、先ほど作成したユーザーアカウント名を入力します。

Debianシステム設定完了

32.complete

以上で、Debianの初期設定はすべて完了しました。RETURNキーを押すと、ログイン画面に変わります。

Debian ログイン・追加パッケージのインストール

rootでのログイン

これからの作業は管理者権限を必要とするものが多いため、rootとしてログインします。先ほど、指定したroot用のパスワードを入力すると、ログインが完了します(rootのシェルプロンプトは)。

インストールパッケージの確認

debian:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 1.8G 164M 1.6G 10% /
tmpfs 189M 0 189M 0% /dev/shm

ディスクの使用状況をdf (Disk Free)コマンドを用いて確認しておきます(-hオプションはhuman readableな接頭辞表記)。仮想ハードディスク2GBのうち、現時点で164MBを使用していることが分かります。

debian:~# dpkg --list
Desired=Unknown/Install/Remove/Purge/Hold
|Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description
+++-==============-==============-============================================
ii adduser 3.63 Add and remove users and groups
ii apt 0.5.28.6 Advanced front-end for dpkg
ii apt-utils 0.5.28.6 APT utility programs
ii aptitude 0.2.15.9-2 terminal-based apt frontend
ii at 3.1.8-11 Delayed job execution and batch processing
ii base-config 2.53.10.3 Debian base system configurator
ii base-files 3.1.2 Debian base system miscellaneous files
ii base-passwd 3.5.9 Debian base system master password and group
ii bash 2.05b-26 The GNU Bourne Again SHell
・・・途中省略・・・
ii sysvinit 2.86.ds1-1 System-V like init
ii tar 1.14-2.4 GNU tar
ii tasksel 2.24 Tool for selecting tasks for installation on
ii tcpd 7.6.dbs-8 Wietse Venema's TCP wrapper utilities
ii telnet 0.17-29 The telnet client
ii usbutils 0.70-8 USB console utilities
ii util-linux 2.12p-4sarge2 Miscellaneous system utilities
ii wget 1.9.1-12 retrieves files from the web
ii whiptail 0.51.6-20 Displays user-friendly dialog boxes from she
ii zlib1g 1.2.2-4.sarge. compression library - runtime

次に、インストール完了直後のDebianパッケージ数を確認します。dpkg (Debian PacKaGe)コマンドに--listオプションを指定すると、インストールされている全パッケージの一覧が表示されます。

debian:~# dpkg --list|wc -l 140

このままでは画面が流れ去ってしまうので、wc (Word Count)コマンドの-l (Line)オプションを用い、パイプ処理で一覧の行数をカウントします。

全体で140行が出力されており、うち先頭5行は説明文のため、現時点でインストールされているパッケージ数は135となります。

SSHのインストール

ホストからゲストへの接続を可能にするために、SSH (Secure SHell)パッケージをインストールします。

debian:~# apt-get install ssh
Reading Package Lists... Done
Building Dependency Tree... Done
Suggested packages:
ssh-askpass xbase-clients
The following NEW packages will be installed:
ssh
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 689kB of archives.
After unpacking 1696kB of additional disk space will be used.
Get:1 http://ftp.riken.jp sarge/main ssh 1:3.8.1p1-8.sarge.6 [689kB]
Fetched 689kB in 1s (504kB/s)
Preconfiguring packages ...

Debianパッケージをインストールするには、apt-getコマンドにinstallオプションと、対象パッケージ名を指定します(apt-get install ssh)。

/etc/apt/sources.listに記述したアーカイブの保存先から(今回は理研のDebianアーカイブサイト)、SSHパッケージ(OpenSSH)をダウンロードすると、自動的にインストール作業が開始されます。

OpenSSHのインストールにあたっては、3つの確認が行われます。最初は、より堅牢なSSH2プロトコルを使用するかどうかを尋ねられますので、デフォルトの"Yes"を選択します。

OpenSSHでは、ホストベース認証を利用する場合に、ユーザープロセスとして走るsshが、ヘルパープログラムであるssh-keysignを利用し、自局の公開鍵を参照します。通常、公開鍵ファイルは管理者しか参照できないパーミッションが設定されていますので、ssh-keysignにSUIDを付与することで、認証を可能とします("Yes")。

sshサーバー(sshd)を起動するかどうかを尋ねられますので、"Yes"を選択します。

debian:~# ps ax
ps ax
PID TTY STAT TIME COMMAND
1 ? S 0:00 init [2]
2 ? S 0:00 [keventd]
3 ? SN 0:00 [ksoftirqd_CPU0]
4 ? S 0:00 [kswapd]
5 ? S 0:00 [bdflush]
6 ? S 0:00 [kupdated]
99 ? S 0:00 [kjournald]
454 ? S 0:00 [khubd]
705 ? Ss 0:00 dhclient -e -pf /var/run/dhclient.eth0.pid -lf /var/r
860 ? Ss 0:00 /sbin/syslogd
863 ? Ss 0:00 /sbin/klogd
895 ? Ss 0:00 /usr/sbin/exim4 -bd -q30m
901 ? Ss 0:00 /usr/sbin/inetd
905 ? Ss 0:00 /usr/sbin/atd
908 ? Ss 0:00 /usr/sbin/cron
914 tty1 Ss+ 0:00 -bash
915 tty2 Ss+ 0:00 /sbin/getty 38400 tty2
916 tty3 Ss+ 0:00 /sbin/getty 38400 tty3
917 tty4 Ss+ 0:00 /sbin/getty 38400 tty4
918 tty5 Ss+ 0:00 /sbin/getty 38400 tty5
919 tty6 Ss+ 0:00 /sbin/getty 38400 tty6
1050 ? Ss 0:00 /usr/sbin/sshd
1058 tty1 R+ 0:00 ps ax

3つの確認が終わると、シェルプロンプトに戻ります。psコマンド(ProcesS)にaxをオプションを与え(ps ax)、起動中のプロセスを表示すると、最下行から2段目に稼働中であるSSHサーバ/usr/sbin/sshdを確認できます。

ホストからDebianサーバへのSSH接続

それでは、SSHを通して、ホスト環境からDebian Sargeへ接続してみましょう。まず、Debian Sargeサーバのインターネットアドレスを、ifconfig (CONFIGure network InterFace)コマンドで確認します。

debian:~# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:20:25:3A
inet addr:192.168.1.39 Bcast:192.168.193.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:708 errors:0 dropped:0 overruns:0 frame:0
TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:94360 (92.1 KiB) TX bytes:6888 (6.7 KiB)
Base address:0xd010 Memory:f0000000-f0020000lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

Ethernet (eth0)とループバック(lo)インターフェースの設定内容が表示され、インターネットアドレスはそれぞれ2行目にinet addrとして表示されます。この例では、DHCPにより192.168.1.39が、eth0インターフェースに割り当てられています。

MacBook $ ssh root@192.168.1.39
The authenticity of host '192.168.1.39 (192.168.1.39)' can't be established.
RSA key fingerprint is d8:12:2f:35:b5:87:11:86:e3:22:12:0b:84:26:89:0b.
Are you sure you want to continue connecting (yes/no)? yes

ホスト環境上で、sshコマンドを実行し、Debian Sargeに接続します。アカウント名(root)の後ろに@マークを添え、インターネットアドレスを指定してください(ssh root@192.168.1.39)。

最初の接続時には、確認メッセージが表示されますので、"yes"を入力します。

Warning: Permanently added '192.168.1.39' (RSA) to the list of known hosts.
Password: **************
Last login: Thu Mar 14 07:29:35 2013
debian:~#

接続が完了すると、Debian Sarge側からパスワード入力を求められるので、rootのパスワードを入力すると、ネットワーク越しのログインが確立します。

基本ツールのインストール

ベースシステムには、lessやbzip2など、一部の汎用ツールが含まれていないため、必要なパッケージを追加でインストールします。vimやemacs、python、rubyなどが必要な場合は、適宜追加してください。

Debian Sargeに用意されているパッケージについては、下記のページが参考になります。

今回は、sudolessfiletimebzip2の5つをインストールしておきます。

debian:~# apt-get install sudo less file time bzip2
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
libbz2-1.0 libmagic1
Suggested packages:
libbz2-dev
The following NEW packages will be installed:
bzip2 file less libbz2-1.0 libmagic1 sudo time
0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded.
Need to get 829kB of archives.
After unpacking 2982kB of additional disk space will be used.
Do you want to continue? [Y/n]

パッケージによっては、特殊な外部ライブラリなどに依存している場合があります。このようなケースでは、apt-getはパッケージ間の依存関係を判断し、必要なパッケージを自動で追加インストールしてくれます(上の例では、libbz2-1.0、libmagic1が相当)。

実際にインストールされるパッケージ一覧を表示した後、確認を求められるので"Y"を入力します。

Do you want to continue? [Y/n] Y
Get:1 http://ftp.riken.jp sarge/main libmagic1 4.12-1sarge2 [233kB]
Get:2 http://ftp.riken.jp sarge/main file 4.12-1sarge2 [28.8kB]
Get:3 http://ftp.riken.jp sarge/main less 382-1 [102kB]
Get:4 http://ftp.riken.jp sarge/main libbz2-1.0 1.0.2-7 [38.7kB]
Get:5 http://ftp.riken.jp sarge/main time 1.7-21 [32.2kB]
Get:6 http://ftp.riken.jp sarge/main bzip2 1.0.2-7 [233kB]
Get:7 http://ftp.riken.jp sarge/main sudo 1.6.8p7-1.4 [161kB]
Fetched 829kB in 1s (702kB/s)
Selecting previously deselected package libmagic1.
(Reading database ... 9671 files and directories currently installed.)
Unpacking libmagic1 (from .../libmagic1_4.12-1sarge2_i386.deb) ...
Selecting previously deselected package file.
Unpacking file (from .../file_4.12-1sarge2_i386.deb) ...
Selecting previously deselected package less.
Unpacking less (from .../archives/less_382-1_i386.deb) ...
Selecting previously deselected package libbz2-1.0.
Unpacking libbz2-1.0 (from .../libbz2-1.0_1.0.2-7_i386.deb) ...
Selecting previously deselected package time.
Unpacking time (from .../archives/time_1.7-21_i386.deb) ...
Selecting previously deselected package bzip2.
Unpacking bzip2 (from .../bzip2_1.0.2-7_i386.deb) ...
Selecting previously deselected package sudo.
Unpacking sudo (from .../sudo_1.6.8p7-1.4_i386.deb) ...
Setting up libmagic1 (4.12-1sarge2) ...Setting up file (4.12-1sarge2) ...
Setting up less (382-1) ...Setting up libbz2-1.0 (1.0.2-7) ...Setting up time (1.7-21) ...Setting up bzip2 (1.0.2-7) ...Setting up sudo (1.6.8p7-1.4) ...
No /etc/sudoers found... creating one for you.

アーカイブサイトからパッケージ群をダウンロードし、展開した後、インストールを実行します。

/etc/sudoersの編集

sudo (Super User DO)は、一般ユーザが管理者権限を必要とする時のみ、手軽に権限を付与する仕組みです。一般ユーザがrootに成り代わる、su (Super User)というコマンドも用意されてはいますが、安全面からsudoを利用することをお勧めします。

デフォルトの設定では、一般ユーザはsudoを利用できないようになっているため、設定ファイル/etc/sudoersを編集しておく必要があります。本設定ファイルは、システム管理上極めて重要なものであるため、rootでさえwriteパーミッションを与えられていません。

-r--r----- 1 root root 281 2013-03-14 12:35 /etc/sudoers

/etc/sudoersを編集する際には、専用のエディターであるvisudoを用います(先頭のviはエディター名に由来しますが、Debianではnanoエディターが起動)。

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
## Host alias specification# User alias specification# Cmnd alias specification# User privilege specification
root ALL=(ALL) ALL
gnu ALL=(ALL) ALL

デフォルトでは、rootアカウントのみに管理者権限が付与されています。最下行に、一般ユーザのアカウント名で(上記例ではgnu)、rootと同じ内容を追記します。

編集が終わったら、コントロールOで内容を書き出し、コントロールXでnanoを終了します。

sudoによる管理者業務の実行

sudoがインストールされましたので、危険なrootアカウントでの作業は止め、一般ユーザとしてのログインに戻りましょう。コントロールD(^D)を入力し、一旦rootアカウントからログアウトします。

debian:~# logout
Connection to 192.168.193.39 closed.
MacBook:~ $

その後、一般ユーザのアカウントで、再びログインを行います。

MacBook:~ $ ssh gnu@192.168.1.39
Password:
Linux debian 2.4.27-3-386 #1 Wed Dec 6 00:38:33 UTC 2006 i686 GNU/LinuxThe programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have mail.Last login: Thu Mar 14 10:33:49 2013 from 192.168.1.39
gnu@debian:~$

ssh gnu@192.168.1.39を実行すると、一般ユーザーgnuアカウントでのログインとなります。

シェルプロンプトは、rootで表示されていた"#"から、一般ユーザを意味する""に変化しています。ここで、先ほど使用したvisudoコマンドを実行してみましょう。

gnu@debian:~$ visudo
-bash: visudo: command not found

"command not found"エラーが表示されます。システム管理コマンドの中には、/sbinや/usr/sbinディレクトリに格納されているものがあります。これらは、一般ユーザのパス(PATH環境変数)に含まれていないため、シェルはコマンドを見つけることができず、エラーになってしまうのです。それでは、絶対パスで起動するとどうでしょうか。

gnu@debian:~$ /usr/sbin/visudo
visudo: /etc/sudoers: Permission denied

/etc/sudoersに対するパーミッションエラーで処理は中断されます(本ファイルは、rootユーザもしくはrootグループのみ読み込み可能)。

最後に、sudoを介してvisudoを起動してみてください(sudo visudo)。今度はrootの時と同じように、nanoエディターが開くはずです。

このように、UNIX環境上で管理者権限が必要になるときは、可能な限りsudoを活用し、不用意なコマンド実行による事故を未然に防ぎます。

開発用ヘッダーファイルのインストール

C言語で開発を行うためには、使用ライブラリに応じたヘッダーファイルを必要とします(stdio.hなど)。ヘッダーファイルは、/usr/includeディレクトリに配置される決まりになっていますが、ベースシステムのインストール直後は、ほぼ空の状態です。

gnu@debian:~$ ls /usr/include/
initreq.h

まず、Linuxカーネルの開発に必要なlinux-kernel-headersパッケージをインストールします(sudo apt-get install linux-kernel-headers)。

gnu@debian:~$ sudo apt-get install linux-kernel-headers
Password:
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
linux-kernel-headers
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 1377kB of archives.
After unpacking 7373kB of additional disk space will be used.
Get:1 http://ftp.riken.jp sarge/main linux-kernel-headers 2.5.999-test7-bk-17 [1377kB]
Fetched 1377kB in 1s (900kB/s)
Selecting previously deselected package linux-kernel-headers.
(Reading database ... 9794 files and directories currently installed.)
Unpacking linux-kernel-headers (from .../linux-kernel-headers_2.5.999-test7-bk-17_i386.deb) ...
Setting up linux-kernel-headers (2.5.999-test7-bk-17) ...

早速、sudoを活用しました。ここで、/usr/includeディレクトリを見てみましょう。

gnu@debian:~$ ls -F /usr/include/
asm/ asm-generic/ initreq.h linux/
gnu@debian:~$ ls -1 /usr/include/linux|wc -l
619

asm、asm-generic、linuxの3つのサブディレクトリが作成されており、linuxディレクトリには600を超えるファイル群が格納されています(lsコマンドの-1オプションは、一行ずつ表示するオプション)。

続いて、Cライブラリ用のlibc6-devパッケージをインストールし(sudo apt-get install libc6-dev)、再び/usr/includeディレクトリを確認します。

gnu@debian:~$ sudo apt-get install libc6-dev
Reading Package Lists... Done
Building Dependency Tree... Done
Suggested packages:
glibc-doc manpages-dev
Recommended packages:
gcc c-compiler
The following NEW packages will be installed:
libc6-dev
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 2532kB of archives.
After unpacking 8733kB of additional disk space will be used.
Get:1 http://ftp.riken.jp sarge/main libc6-dev 2.3.2.ds1-22sarge6 [2532kB]
Fetched 2532kB in 2s (959kB/s)
Selecting previously deselected package libc6-dev.
(Reading database ... 10848 files and directories currently installed.)
Unpacking libc6-dev (from .../libc6-dev_2.3.2.ds1-22sarge6_i386.deb) ...
Setting up libc6-dev (2.3.2.ds1-22sarge6) ...
gnu@debian:~$ ls -F /usr/include/
aio.h err.h ifaddrs.h netdb.h rpc/ syslog.h
aliases.h errno.h initreq.h neteconet/ rpcsvc/ tar.h
alloca.h error.h inttypes.h netinet/ sched.h termio.h
a.out.h execinfo.h langinfo.h netipx/ scsi/ termios.h
argp.h fcntl.h lastlog.h netpacket/ search.h tgmath.h
argz.h features.h libgen.h netrom/ semaphore.h thread_db.h
ar.h fenv.h libintl.h netrose/ setjmp.h time.h
arpa/ fmtmsg.h libio.h nfs/ sgtty.h ttyent.h
asm/ fnmatch.h limits.h nl_types.h shadow.h ucontext.h
asm-generic/ fpu_control.h link.h nss.h signal.h ulimit.h
assert.h fstab.h linux/ obstack.h spawn.h unistd.h
bits/ fts.h locale.h paths.h stab.h ustat.h
byteswap.h ftw.h malloc.h poll.h stdint.h utime.h
complex.h _G_config.h math.h printf.h stdio_ext.h utmp.h
cpio.h gconv.h mcheck.h protocols/ stdio.h utmpx.h
crypt.h getopt.h memory.h pthread.h stdlib.h values.h
ctype.h glob.h mntent.h pty.h string.h wait.h
dirent.h gnu/ monetary.h pwd.h strings.h wchar.h
dlfcn.h gnu-versions.h net/ re_comp.h stropts.h wctype.h
elf.h grp.h netash/ regex.h sys/ wordexp.h
endian.h iconv.h netatalk/ regexp.h syscall.h xlocale.h
envz.h ieee754.h netax25/ resolv.h sysexits.h

stdio.h、stdlib.hなど、馴染みのあるヘッダーファイルが、多数用意されていることが分かります。これらのファイルがなければ、Cコンパイラは、hello.cですら正常にコンパイルすることができません。

開発用manページのインストール

UNIX環境では、コマンド類はもちろん、ライブラリ関数などについても、詳細なマニュアルページが提供されており、manコマンドで参照することができます。

ベースシステムには、開発用のマニュアルページは含まれていないため、別途manpages-devパッケージをインストールする必要があります。

gnu@debian:~$ man frpintf
No manual entry for frpintf

このように、インストール直後の状態では、代表的なCライブラリ関数fprintfのmanページを指定しても、"エントリーが存在しない"とエラーが表示されます。

sudo apt-get install manpages-devを実行し、再度同じコマンドを実施すると、今度はfprintfの解説が表示されます。

gnu@debian:~$ sudo apt-get install manpages-dev
Password:
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
manpages-dev
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 1073kB of archives.
After unpacking 2724kB of additional disk space will be used.
Get:1 http://ftp.riken.jp sarge/main manpages-dev 1.70-1 [1073kB]
Fetched 1073kB in 1s (549kB/s)
Selecting previously deselected package manpages-dev.
(Reading database ... 11286 files and directories currently installed.)
Unpacking manpages-dev (from .../manpages-dev_1.70-1_all.deb) ...
Setting up manpages-dev (1.70-1) ...

開発ツールのインストール

最後に、開発ツール一式をインストールしましょう。C言語による開発に必要なツールは、下記の3点です。

gnu@debian:~$ sudo apt-get install binutils gcc make
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
cpp cpp-3.3 gcc-3.3
Suggested packages:
binutils-doc cpp-doc autoconf automake libtool flex bison gdb gcc-doc
gcc-3.3-doc
The following NEW packages will be installed:
binutils cpp cpp-3.3 gcc gcc-3.3 make
0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded.
Need to get 5586kB of archives.
After unpacking 14.7MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://ftp.riken.jp sarge/main binutils 2.15-6 [2221kB]
Get:2 http://ftp.riken.jp sarge/main cpp-3.3 1:3.3.5-13 [1393kB]
Get:3 http://ftp.riken.jp sarge/main cpp 4:3.3.5-3 [29.6kB]
Get:4 http://ftp.riken.jp sarge/main gcc-3.3 1:3.3.5-13 [1570kB]
Get:5 http://ftp.riken.jp sarge/main gcc 4:3.3.5-3 [4906B]
Get:6 http://ftp.riken.jp sarge/main make 3.80-9 [366kB]
Fetched 5586kB in 7s (765kB/s)
Selecting previously deselected package binutils.
(Reading database ... 12774 files and directories currently installed.)
Unpacking binutils (from .../binutils_2.15-6_i386.deb) ...
Selecting previously deselected package cpp-3.3.
Unpacking cpp-3.3 (from .../cpp-3.3_1%3a3.3.5-13_i386.deb) ...
Selecting previously deselected package cpp.
Unpacking cpp (from .../cpp_4%3a3.3.5-3_i386.deb) ...
Selecting previously deselected package gcc-3.3.
Unpacking gcc-3.3 (from .../gcc-3.3_1%3a3.3.5-13_i386.deb) ...
Selecting previously deselected package gcc.
Unpacking gcc (from .../gcc_4%3a3.3.5-3_i386.deb) ...
Selecting previously deselected package make.
Unpacking make (from .../archives/make_3.80-9_i386.deb) ...
Setting up binutils (2.15-6) ...Setting up cpp-3.3 (3.3.5-13) ...
Setting up cpp (3.3.5-3) ...
Setting up gcc-3.3 (3.3.5-13) ...
Setting up gcc (3.3.5-3) ...Setting up make (3.80-9) ...

sudo apt-get install binutils gcc makeを実施すれば、C言語開発環境が完成します。

gnu@debian:~$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs
Configured with: ../src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --enable-__cxa_atexit --with-system-zlib --enable-nls --without-included-gettext --enable-clocale=gnu --enable-debug --enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i486-linux
Thread model: posix
gcc version 3.3.5 (Debian 1:3.3.5-13)

新たにインストールされたgccコマンドに、-v (Version)オプションを指定して実行すると、バージョン情報などが表示されます。

スリープによる時刻遅れへの対処

ntpdateによる時刻調整

VirtualBoxは仮想環境であるため、ホストマシンがスリープ状態となったり、ゲストOSがVirtualBoxマネージャから一時停止されると、ゲスト環境内部のハードウェアクロックも、その動作を停止します。このため、スリープ状態/一時停止状態が解除されると、ゲスト環境のハードウェアクロックは、実時間に対して遅れてしまいます。

VirtualBox extension packには、この問題を解決するためのLinuxカーネルモジュールが提供されていますが、Debian Sargeは古すぎるため、正常に動作しません。そこで、ゲスト環境のクロック遅れに対処するため、ntpdateとcronを活用してみます。

ntpdateは、インターネットを通じて、NTP (Network Time Protocol)サーバーから正確な時刻を入手し、サーバーに反映させるためのツールです。

ホストがスリープ状態から回復するたびに、Debian Sarge上でntpdateを実行することは現実的ではありませんから、一定期間ごとにプログラムを自動実行するcron (Commands Run ON)デーモン(daemon)を併用します。

gnu@debian:~$ sudo apt-get install ntpdate
Reading Package Lists... Done
Building Dependency Tree... Done
Suggested packages:
ntp
The following NEW packages will be installed:
ntpdate
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 41.6kB of archives.
After unpacking 164kB of additional disk space will be used.
Get:1 http://ftp.riken.jp sarge/main ntpdate 1:4.2.0a+stable-2sarge1 [41.6kB]
Fetched 41.6kB in 0s (108kB/s)
Selecting previously deselected package ntpdate.
(Reading database ... 13030 files and directories currently installed.)
Unpacking ntpdate (from .../ntpdate_1%3a4.2.0a+stable-2sarge1_i386.deb) ...
Setting up ntpdate (4.2.0a+stable-2sarge1) ...
Running ntpdate to synchronize clock.

cronは基本管理ツールとしてインストール済みなので、ntpdateを追加インストールします。

NTPサーバは、世界中で公開されていますが、日本においては下記のサービスが有名です。

今回は、インターネットマルチフィード株式会社が提供しているサーバ (ntp.jst.mfeed.ad.jp)を利用してみます。

gnu@debian:~$ sudo ntpdate ntp.jst.mfeed.ad.jp
5 May 22:49:06 ntpdate[1301]: adjust time server 210.173.160.87 offset -0.007412 sec

ntpdateの実行には、管理者権限が必要なため、sudoを前置してください。ntp.jst.mfeed.ad.jpから、ネットワークを通じてNTPパケットを入手し、時刻を自動調整しています(オフセット -0.007秒)。
この操作をcronデーモンを用いて、自動実行できるようにしてみましょう。

gnu@debian:/etc/init.d$ cat clockadjust.sh
/usr/sbin/ntpdate -s ntp.jst.mfeed.ad.jp
/sbin/hwclock --systohc

まず、/etc/init.d/ディレクトリに上記内容を持つ、clockadjust.shというファイルを用意します。1行目は、先ほどと同じですが、-sオプションを付けメッセージを標準出力ではなく、システムログへ出力するように指示しています。2行目では、hwclockコマンドを用いて、ソフトウェア的に管理されているシステム時刻をハードウェアクロックに反映させます(--systohcオプション)。この2行を実行することで、ゲスト環境のクロックを正確に同期させることができます。

なお、システム起動に関連するスクリプトでは、PATH環境変数の影響を受けないように、各プログラムファイルは絶対パスで記載されます。

gnu@debian:/etc/init.d$ sudo chmod +x clockadjust.sh
gnu@debian:/etc/init.d$ ls -l clockadjust.sh
-rwxr-xr-x 1 root root 65 2013-05-05 23:12 clockadjust.sh

clockadjust.shは実行可能ファイルでなければなりませんので、chmod +xで実行属性を付与しておきます。

最後に、cronの実行スケジュールをcrontab (cron TABle)コマンドを用いて、新しく作成します。

gnu@debian:/etc/init.d$ sudo crontab -l
no crontab for root

cronのスケジュールは、ユーザ毎に設定可能になっています。設定済みスケジュールは、-lオプション(List)で確認することができますが、rootにはまだスケジュールが設定されていません。

スケジュールは、テキスト形式で指定します。詳細については、man 5 crontabを参照してください。

*/10 * * * * /etc/init.d/clockadjust.sh > /dev/null 2>&1

cronでは、月・曜日・日・時間・分でスケジュールを指定することが可能ですが、今回は上記の一文により、10分間隔で/etc/init.d/clockadjust.shを実行させます。"*/10"は10分間隔を意味し、続く4つのアスタリスクは、月・曜日・日・時間はいずれにもマッチ、つまり毎日144回clockadjust.shを実行することになります。続くリダイレクションは、出力メッセージを/dev/nullへ廃棄するための指定です。

gnu@debian:/etc/init.d$ sudo crontab -e
no crontab for root - using an empty one
crontab: installing new crontab

crontabコマンドに、-e オプション(Edit)を指定するとnanoエディターが起動し、編集モードに入ります。上記の一行を入力し、編集を終了すると、cronテーブルが更新されます。

gnu@debian:/var/log$ sudo crontab -l
*/10 * * * * /etc/init.d/clockadjust.sh > /dev/null 2>&1

crontab -lを再度実行すると、新しいスケジュールが、cronテーブルに記録されていることが分かります。
以上でcronテーブルの設定は完了しましたが、現在のcronデーモンは旧設定で稼働しているため、再起動する必要があります。

gnu@debian:/var/log$ ps ax|grep cron
1027 ? Ss 0:00 /usr/sbin/cron

ps axコマンドで稼働中のすべてのプロセスを表示し、grepコマンドを用いて、この中からcronを含む行を取り出します。/usr/sbin/cronプログラムは、プロセス番号1027として稼働中であることが、分かります(プロセス番号は状況によって異なる)。

gnu@debian:/var/log$ sudo kill -HUP 1027

プロセスを再起動するためには、killコマンドに-HUPオプション(Hung UP)を指定します(killコマンドの実行には、管理者権限が必要)。/usr/sbin/cronが再起動すると、設定ファイルが読み込まれ、cronテーブルの更新が有効化されます。

gnu@debian:/var/log$ tail -n 1 /var/log/daemon.log
May 5 23:50:01 localhost ntpdate[1567]: adjust time server 210.173.160.87 offset -0.001464 sec

cron再起動後、ゲストOSの時刻分数が10分の倍数を過ぎたところで、/var/log/daemon.logファイルを参照してみます。daemon.logは、名前の通り各種デーモンの動作を記録するファイルです。

上記例では、tailコマンドに-n 1オプションを指定し、ファイル最後の一行を表示していますが、50:01の時点でntpdateが実行されていることが分かります。cronの仕事により、これから10分おきにntpdateが実行されていきます。

システム終了

Debian Sargeを終了する場合は、必ずsudo haltを実行し、システム上のキャッシュをファイルシステムに反映した上で、仮想マシンを停止します。

gnu@debian:~$ sudo halt

Broadcast message from root (pts/0) (Thu Mar 14 19:42:48 2013):

The system is going down for system halt NOW!
gnu@debian:~$ Connection to 192.168.1.39 closed by remote host.
Connection to 192.168.1.39 closed.
MacBook:~ $

ブロードキャストメッセージがログイン中のユーザに送信された後、SSH接続が切断され、ホストのシェルプロンプトが表示されます。

Deactivating swap...done.
Unmounting local filesystems...done.
flushing ide devices: had hdc
Power down.

VirtualBoxのコンソール画面上に、"Power down."が表示されている事を確認できたら、仮想マシンの電源をOFFにします。

追加パッケージ一覧

今回、初期インストール完了後に追加したパッケージ群は、下記の通りです。

  1. ssh
  2. sudo
  3. less
  4. file
  5. time
  6. bzip2
  7. linux-kernel-headers
  8. libc6-dev
  9. manpages-dev
  10. binutils
  11. gcc
  12. make
  13. ntpdate

好みのエディターなど、適宜追加し、使いやすい開発環境に仕立ててください。

posted by Wataru Nishida.