開発環境
印刷用ページへ

VirtualBoxの設定【GNU開発ツール用 仮想ハードディスクイメージ使用】

書籍"GNU開発ツール"のために用意された仮想ハードディスクイメージを用いて、VirtualBox上にDebian Sarge/GNU開発環境を構築します(ホスト環境 Mac OS X)。

Debian Sarge仮想ハードディスクイメージ

本インストールでは、別項の解説に基づいて作成した、Debian Sarge 3.1 r8の仮想ハードディスクイメージを使用します。zip形式で圧縮してありますので、展開した上でご利用ください(展開ファイル名 Debian Sarge.vdi, 展開ファイルサイズ 484MB)。

展開後のファイル Debian Sarge.vdi は、ダウンロードフォルダ、もしくはデスクトップなどに配置しておいてください。

Oracle社による仮想環境 VirtualBox

VirtualBoxは、x86/Intel64/AMD64 PCアーキテクチャを対象とした仮想環境であり、ORACLE社がソースリストと共に公開しています。

VirtualBoxが稼働するホスト環境としては、Windows、Mac OS X、Linux、Solarisの4種類が用意されています(ホスト:VirtualBoxを起動するOS、ゲスト:VirtualBoxの仮想環境上で実行されるOS)。本稿では、Mac OS X上での操作手順を紹介しています。

仮想マシンの新規登録

VirtualBoxを起動すると、次のようなマネージャ画面が表示されます。

これから、新しい仮想マシンを作成するので、ウィンドウ上段左側の"新規"アイコンをクリックします。

作成する仮想マシンの名前と、インストール予定のOSを指定します。今回は、Debian Sarge用の仮想マシンを作成しますので、名前に"Debian Sarge"と入力しました。VirtualBoxは名前を解析し、OSのタイプを"Linux"、ディストリビューションを"Debian"と、自動的に選択します。適切に選択されなかった場合は、手動でプルダウンメニューから指定します。

次に、仮想マシンで使用するメモリ容量を指定します。今回は、デフォルトの"384MB"のままで良いでしょう。

最初に、デフォルトで搭載されているSATAコントローラを削除する必要があるため、ここでは"仮想ハードドライブを追加しない"を選択します。

警告メッセージが表示されますが、無視して"続ける"を選択します。

以上で仮想マシンの初期セットアップは完了し、新たに登録された"Debian Sarge"のマシン環境がマネージャー上に表示されます。

initial-settings

上記内容を見ると、ハードディスクのコントローラにはSATAインターフェース、EthernetネットワークアダプタにはIntel PRO/1000MTが接続されています。

仮想ハードディスクファイルの配置

この時点で、ユーザのホームディレクトリ上には、"VirtualBox VMs"フォルダの下に、"Debian Sarge"(最初に指定した名前)フォルダが作成されています。

ダウンロードした、Debian Sarge.vdi ファイルを Debian Sarge フォルダ内部に移動してください

IDEインターフェースへの切り替え

最新版のOSでは、上記のハードウェア環境で問題ありませんが、Debian Sargeのインストーラは、SATAコントローラを認識できないため、インストール途中で異常終了を引き起こします。

そこで、旧式のインストーラが正しく認識できるように、ハードディスクインターフェースを古典的なIDEインターフェースへ切り替えます。

SATAコントローラの削除

まず最初に、VirtualBoxマネージャに表示されているDebian Sarge仮想マシンの"ストレージ"をクリックします(マネージャー上部の設定ボタンからストレージを選択することも可能)。

SATAコントローラを選択した上で、サブメニューを表示させ、"コントローラーを除去"という項目を実行します。

IDEコントローラにホストのCD-ROM/DVD-ROMドライブが接続されている場合

設定状態によっては、IDEコントローラにホストの光学ドライブが、接続されていることがあります。

ホストの光学ドライブ(上記例では"MATSHITA DVD-R")を選択し、右側のウィンドウに表示されているCD/DVDドライブのプルダウンメニューをクリックすると、IDEコントローラの4つの接続先が表示され、ホストドライブが接続されている箇所には、チェックマークが表示されます(上記例ではIDEセカンダリマスター)。

IDEコントローラには、プライマリとセカンダリの2チャンネルが存在し、それぞれマスターとスレイブを接続することができます。昔のPCでは、ハードディスクドライブをプライマリマスター、光学ドライブをセカンダリーマスターに接続する習慣がありました(CPUの割り込み番号がプライマリ・セカンダリに独立して割り当てられているため、より効率的な転送が期待できる)。

IDEコントローラにホストドライブが接続されている場合、ホストの光学ドライブにCD-Rを挿入すると、ゲスト環境から直接アクセスできるという利点があります。しかし、ゲスト環境が動作している間は、ホスト環境上で光学ドライブを扱えないという問題も生じます。

VirtualBoxには、CD-ROMやDVDなどのISOファイルイメージを仮想ドライブに見立てる機能が用意されているため、物理的なホスト光学ドライブは不要になります。そこで、CD/DVDドライブのプルダウンメニューの右側にある、CDアイコンをクリックし、"仮想ドライブからディスクを除去"を実行します。

先ほどまで表示されていた、ホストの光学ドライブ名が消え、""と表示されます(仮想光学ドライブにメディアが未挿入であることを意味)。この結果、ホスト上の光学ドライブ本体はVirtualBoxから解放され、ホスト環境の支配下に戻ります。

IDEハードディスクの追加

"コントローラー:IDE"の右横には、一枚の円盤および三枚積み上げられた円盤、計2種類のアイコンが並んでいます。一枚の円盤は光学ドライブ、三枚の円盤はハードディスクドライブを意味しており、それぞれをクリックすると、新しいドライブが追加されます。今回は、Debian Sarge用にハードディスクドライブを追加します。

仮想ハードディスクファイルには、用意してある Debian Sarge.vdi を指定します。"既存のディスクを選択"し、

"VirtualBox VMs/Debian Sarge"フォルダの中にある、Debian Sarge.vdi イメージをオープンすれば、

Debian Sarge.vdiが仮想ハードディスクドライブとして、IDEプライマリマスターに接続されます。

フロッピィディスク・ドライブの追加

せっかくですから、この機会に、仮想フロッピィディスクも使用できるようにしておきましょう。

ストレージ画面の下、4つ並んでいるアイコンのうち、右から2番目のアイコンをクリックすると新しいコントローラを追加することができます。

メニューの最下段にある、"フロッピーコントローラーを追加"を実施します。

マネージャ上に新しくフロッピィコントローラが表示されていますので、右側のフロッピィアイコンをクリックし、フロッピィドライブを追加します。

起動フロッピィディスクを使用する場合は、"ディスクを選択"をクリックし、ディスクイメージ(ファイルサイズは1.44MiB)を指定します。Debian SargeのインストールではCD-ROMを使用するため、"空のドライブ"を選択してください。

フロッピィコントローラの下にフロッピィデバイス0が接続され、その中身は""と表示されています。これは、先ほどの光学ドライブと同様、ブランクディスクという意味ではなく、ディスケットが挿入されていないことを指しています。

以上で、ストレージ関連の初期設定は完了です。

起動順序の確認

PCが起動するためには、ブートローダー(初期化用プログラム)が書き込まれた、起動ディスクが必要になります。今回の仮想マシンでは、ハードディスク・光学ディスク・フロッピィディスクの3種類のメディアから起動させることができますが、もしも3つが同時に装着されていた場合、どのデバイスから起動するかを定めたものが、起動順序(initial boot sequence)です。

本物のPCでは、BIOS設定画面から起動順序を指定しますが、VirtualBoxでは"システム"から設定します。

29.boot sequence

起動順序の横にデバイスが並んでいますが、上から順番にスキャンされ、実際に接続可能であれば起動ディスクとして選択されます。デフォルトでは、フロッピィディスク⇒CD/DVD-ROM⇒ハードディスクの順になっています。チェックマークが外れていたり、起動順序がずれていたりすると、仮想マシンを起動できませんから、設定を確認しておきましょう。

ネットワーク・インターフェースの設定

VirtualBoxがサポートするネットワークは、デフォルトで"NAT (Network Address Translation)"が設定されています。NAT機能により、ゲスト環境から外部ネットワークには自由にアクセスできるのですが、ホストとゲスト間での通信はできません

SSH接続などで、ホストからゲスト、ゲストからホストにアクセスする必要がある場合は、"ブリッジアダプター"を選択します(ゲストのIPアドレスは、ホストと同じネットワークアドレス上に割り当てられる)。

次に、仮想マシンに接続する、ホストのネットワークインターフェースを指定します。"名前"の横に、現在接続されているホストのネットワークインターフェースが表示されていますが、クリックすると利用可能なインターフェース全てが表示されます。上記例では、MacBook Proの有線LAN(en0)がデフォルトで設定されており、次に無線LAN(en1)が並んでいます。

ホストが常に有線LANでネットに接続されていれば、"en0"のままで良いのですが、状況に応じて無線LANを使用する場合は、その度に"en1"へ切り替える必要があります。VirtualBoxには、ホストの利用状況に応じて、ネットワークインターフェースを自動的に切り替える機能はありません。

Debian Sarge用仮想マシンの完成

以上で、Debian Sarge用の仮想マシン設定は完了です。ポイントは下記の6点になります。

  • 仮想ハードディスクドライブ(Debian Sarge.vdi)は、IDEプライマリ・マスターに接続
  • 仮想光学ドライブは、IDEセカンダリ・マスターに接続(空)
  • フロッピィディスクコントローラおよび仮想フロッピィディスクドライブ(#0)を追加(空)
  • ネットワークは、ブリッジアダプターとして接続
  • ネットワークアダプタに有効なホスト・ネットワークインターフェースが、対応していることを確認(有線LAN en0:Ethernet, 無線LAN en1:Wi-Fi)
  • 起動順序を確認する(フロッピィディスク⇒CD/DVD-ROM⇒ハードディスク)

Debian Sargeの起動

それでは、出来たての仮想マシンを起動してみましょう。マネージャの上段にある緑の起動矢印をクリックすると、Debian Sarge仮想マシンがブートします。

画面では分かりませんが、仮想マシン内部ではBIOSの初期化処理がスタートし、ORACLE社とVirtualBoxのロゴイメージが表示されます。しばらくすると、

13.GRUB menu

ブートローダGRUBが起動し、OSの選択画面が表示されます。初期状態では、ふたつのエントリが登録されており、通常は先頭のエントリを使用します(2番目はリカバリーモード用)。

ブートメニューが表示されると自動的に5秒のカウントダウンが始まり、キー入力がなければ、先頭のエントリが起動されます。

login

様々な初期化メッセージがコンソール上に表示された後、ログインプロンプトが表示されます。

今回用意した Debian Sarge GNU開発ツール版の主要設定項目は、下記の通りです。

  • ホスト名 debian
  • IPアドレス割り当て DHCP
  • root パスワード gcc
  • ユーザアカウント名 gnu
  • gnu ユーザパスワード gcc

ログイン後は、直ちにpasswdコマンドでパスワードの変更を行ってください。

Debian Sarge 仮想マシンの終了方法

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にします。

仮想マシンを終了するためには、仮想マシンウィンドウの赤いクローズボタンを押すか、仮想マシン名を副ボタンでクリックします(閉じる⇒電源オフ)。

後者の場合は、サブメニューを通じて一時停止やリセットなど、より細かな制御が可能です。

posted by Wataru Nishida.
開発環境
印刷用ページへ

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.
開発環境
印刷用ページへ

VirtualBoxの設定【Debian Sarge 新規インストール】

2008年最終公開版のDebian Sarge 3.1 r8をインストールするために、VirtualBox仮想マシンを作成します(ホスト環境 Mac OS X)。

Oracle社による仮想環境 VirtualBox

VirtualBoxは、x86/Intel64/AMD64 PCアーキテクチャを対象とした仮想環境であり、ORACLE社がソースリストと共に公開しています。

VirtualBoxが稼働するホスト環境としては、Windows、Mac OS X、Linux、Solarisの4種類が用意されています(ホスト:VirtualBoxを起動するOS、ゲスト:VirtualBoxの仮想環境上で実行されるOS)。本稿では、Mac OS X上での操作手順を紹介しています。

仮想マシンの新規登録

VirtualBoxを起動すると、次のようなマネージャ画面が表示されます。

Debian Sarge用に、新しい仮想マシンを作成するので、ウィンドウ上段左側の"新規"アイコンをクリックします。

作成する仮想マシンの名前と、インストール予定のOSを指定します。今回は、Debian Sarge用の仮想マシンを作成しますので、名前に"Debian Sarge"と入力しました。VirtualBoxは名前を解析し、OSのタイプを"Linux"、ディストリビューションを"Debian"と、自動的に選択します。適切に選択されなかった場合は、手動でプルダウンメニューから指定します。

次に、仮想マシンで使用するメモリ容量を指定します。今回は、デフォルトの"384MB"のままで良いでしょう。

仮想マシンを起動するためには、外部記憶装置(ハードディスクドライブ、フロッピィディスク、CD-ROMなど)が必要になります。開発環境用のサーバーを運用するためには、ハードディスクドライブが必須ですから、"仮想ハードドライブを作成する"を選択します。

Live-CDやフロッピィディスクのみで運用する場合、仮想ハードドライブは必要ありません。

仮想環境上では、ハードディスクドライブは単体のファイルでエミュレートされます。VirtualBoxが操作可能な仮想ハードディスクドライブのファイルイメージは、全部で6種類ありますが、通常は"VDI (Virtualbox Disk Image)"形式を使用します。

ここで、64GBの容量を持つ仮想ハードディスクドライブを準備したとしますと、対応するファイルイメージは64GBの大きさとなります。実際には、この一部しか利用しない訳ですが、これではホスト環境のファイル資源を無駄遣いしてしまうことになります。そこで、VirtualBoxでは仮想環境でのファイル使用量に応じて、自動的にファイルサイズを拡張する機能を提供しています(縮小機能はなし)。今回は、この"可変サイズ"機能を選択します。

次に、仮想ハードディスクドライブの名前とサイズを指定します。上記例では、"Debian Sarge"と名付け、ドライブサイズとして2GBを手入力しています(デフォルトサイズは8GB)。GNU開発サーバ(デスクトップ環境なし)の構築が目的であれば、2GBで十分です。

仮想マシンに関連するファイル群は、ユーザのホームディレクトリの中に自動的に作成される、"VirtualBox VMs"フォルダの中に格納されます(Windows版も同様)。これ以外の場所に格納する場合は、名前の右にある、フォルダアイコンをクリックします。

新しく作成した仮想マシンに関連するファイル群は、先ほど指定した名前(Debian Sarge)のフォルダ内に配置されています。2GBの仮想ハードディスクドライブの実体である"Debian Sarge.vdi"は、可変サイズ機能のおかげで、最初はわずか12KBのサイズしかありません。

以上で仮想マシンのセットアップは完了し、新たに登録された"Debian Sarge"のマシン環境がマネージャー上に表示されます。

この内容を見ると、ハードディスクのコントローラにはSATAインターフェース、EthernetネットワークアダプタにはIntel PRO/1000MTが接続されています。

最新版のOSでは、このハードウェア環境で問題ありませんが、Debian Sargeのインストーラは、SATAコントローラを認識できないため、インストール途中でエラーとなってしまいます。

IDEインターフェースへの切り替え

そこで、旧式のインストーラが正しく認識できるように、ハードディスクインターフェースを古典的なIDEインターフェースへ切り替えます。

SATAコントローラの削除

まず最初に、VirtualBoxマネージャに表示されているDebian Sarge仮想マシンの"ストレージ"をクリックします(マネージャー上部の"設定"ボタンからストレージを選択することも可能)。

初期設定状態では、IDEコントローラには""の仮想光学ドライブ、SATAコントローラには仮想ハードディスクドライブ(実体はDebian Sarge.vdiファイル)が接続されています。SATAコントローラは、今回の仮想マシンでは使用しないため、削除します。

SATAコントローラを選択した上で、サブメニューを表示させ、"コントローラーを除去"という項目を実行します。

IDEコントローラにホストのCD-ROM/DVD-ROMドライブが接続されている場合

設定状態によっては、IDEコントローラにホストの光学ドライブが、接続されていることがあります。

ホストの光学ドライブ(上記例では"MATSHITA DVD-R")を選択し、右側のウィンドウに表示されているCD/DVDドライブのプルダウンメニューをクリックすると、IDEコントローラの4つの接続先が表示され、ホストドライブが接続されている箇所には、チェックマークが表示されます(上記例ではIDEセカンダリマスター)。

IDEコントローラには、プライマリとセカンダリの2チャンネルが存在し、それぞれマスターとスレイブを接続することができます。昔のPCでは、ハードディスクドライブをプライマリマスター、光学ドライブをセカンダリーマスターに接続する習慣がありました(CPUの割り込み番号がプライマリ・セカンダリに独立して割り当てられているため、より効率的な転送が期待できる)。

ホストドライブがIDEコントローラに接続されている場合、ホストの光学ドライブにCD-Rを挿入すると、ゲスト環境から直接アクセスできるという利点があります。しかし、ゲスト環境が動作している間は、ホスト環境上で光学ドライブを扱えないという問題も生じます。

VirtualBoxには、CD-ROMやDVDなどのISOファイルイメージを仮想ドライブに見立てる機能が用意されているため、物理的なホスト光学ドライブは不要になります。そこで、CD/DVDドライブのプルダウンメニューの右側にある、CDアイコンをクリックし、"仮想ドライブからディスクを除去"を実行します。

先ほどまで表示されていた、ホストの光学ドライブ名が消え、""と表示されます(仮想光学ドライブにメディアが未挿入であることを意味)。この結果、ホスト上の光学ドライブ本体はVirtualBoxから解放され、ホスト環境の支配下に戻ります。

IDEハードディスクの追加

"コントローラー:IDE"の右横には、一枚の円盤および三枚積み上げられた円盤、計2種類のアイコンが並んでいます。一枚の円盤は光学ドライブ、三枚の円盤はハードディスクドライブを意味しており、それぞれをクリックすると、新しいドライブが追加されます。今回は、Debian Sarge用にハードディスクドライブを追加します。

仮想ハードディスクには、既に作成している Debian Sarge.vdi イメージを指定します。"既存のディスクを選択"し、

"VirtualBox VMs/Debian Sarge"フォルダの中にある、Debian Sarge.vdi イメージをオープンすれば、

Debian Sarge.vdiが仮想ハードディスクドライブとして、IDEプライマリマスターに接続されます。

フロッピィディスク・ドライブの追加

せっかくですから、この機会に、仮想フロッピィディスクも使用できるようにしておきましょう。

ストレージ画面の下、4つ並んでいるアイコンのうち、右から2番目のアイコンをクリックすると新しいコントローラを追加することができます。

メニューの最下段にある、"フロッピーコントローラーを追加"を実施します。

マネージャ上に新しくフロッピィコントローラが表示されていますので、右側のフロッピィアイコンをクリックし、フロッピィドライブを追加します。

起動フロッピィディスクを使用する場合は、"ディスクを選択"をクリックし、ディスクイメージ(ファイルサイズは1.44MiB)を指定します。Debian SargeのインストールではCD-ROMを使用するため、"空のドライブ"を選択してください。

フロッピィコントローラの下にフロッピィデバイス0が接続され、その中身は""と表示されています。これは、先ほどの光学ドライブと同様、ブランクディスクという意味ではなく、ディスケットが挿入されていない状態を指しています。

以上で、ストレージ関連の初期設定は完了です。

起動順序の確認

PCが起動するためには、ブートローダー(初期化用プログラム)が書き込まれた、起動ディスクが必要になります。今回の仮想マシンでは、ハードディスク・光学ディスク・フロッピィディスクの3種類のメディアから起動させることができますが、もしも3つが同時に装着されていた場合、どのデバイスから起動するかを定めたものが、起動順序(initial boot sequence)です。

本物のPCでは、BIOS設定画面から起動順序を指定しますが、VirtualBoxでは"システム"から設定します。

29.boot sequence

起動順序の横にデバイスが並んでいますが、上から順番にスキャンされ、実際に接続可能であれば起動ディスクとして選択されます。デフォルトでは、フロッピィディスク⇒CD/DVD-ROM⇒ハードディスクの順になっています。チェックマークが外れていたり、起動順序がずれていたりすると、仮想マシンを起動できませんから、設定を確認しておきましょう。

ネットワーク・インターフェースの設定

VirtualBoxがサポートするネットワークは、デフォルトで"NAT (Network Address Translation)"が設定されています。NAT機能により、ゲスト環境から外部ネットワークには自由にアクセスできるのですが、ホストとゲスト間での通信はできません

SSH接続などで、ホストからゲスト、ゲストからホストにアクセスする必要がある場合は、"ブリッジアダプター"を選択します(ゲストのIPアドレスは、ホストと同じネットワークアドレス上に割り当てられる)。

次に、仮想マシンに接続する、ホストのネットワークインターフェースを指定します。"名前"の横に、現在接続されているホストのネットワークインターフェースが表示されていますが、クリックすると利用可能なインターフェース全てが表示されます。上記例では、MacBook Proの有線LAN(en0)がデフォルトで設定されており、次に無線LAN(en1)が並んでいます。

ホストが常に有線LANでネットに接続されていれば、"en0"のままで良いのですが、状況に応じて無線LANを使用する場合は、その度に"en1"へ切り替える必要があります。VirtualBoxには、ホストの利用状況に応じて、ネットワークインターフェースを自動的に切り替える機能はありません。

Debian Sarge用仮想マシンの完成

以上で、Debian Sarge用の仮想マシン設定は完了です。ポイントは下記の6点になります。

  • 仮想ハードディスクドライブ(Debian Sarge.vdi)は、IDEプライマリ・マスターに接続
  • 仮想光学ドライブは、IDEセカンダリ・マスターに接続(空)
  • フロッピィディスクコントローラおよび仮想フロッピィディスクドライブ#0を追加(空)
  • ネットワークは、ブリッジアダプターとして接続
  • ネットワークアダプタに有効なホスト・ネットワークインターフェースが、対応していることを確認(有線LAN en0:Ethernet, 無線LAN en1:Wi-Fi)
  • 起動順序を確認する(フロッピィディスク⇒CD/DVD-ROM⇒ハードディスク)

仮想マシンのブート

それでは、出来たての仮想マシンを起動してみましょう。マネージャの上段にある緑の起動矢印をクリックすると、Debian Sarge仮想マシンがブートします。

画面では分かりませんが、仮想マシン内部ではBIOSの初期化処理がスタートし、ORACLE社とVirtualBoxのロゴイメージが表示されます。しばらくすると画面は暗転し、

"FATAL: No bootable medium found! System halted. (致命的エラー:起動可能なメディアが見つからないためシステム停止)"というメッセージが表示された後、仮想マシンはフリーズします。初期化しただけの、仮想ハードディスクドライブ(Debian Sarge.vdi)には、起動コード(IPL:Initial Program Loader)が書き込まれていないからです。

仮想マシンを終了するためには、仮想マシンウィンドウの赤いクローズボタンを押すか、仮想マシン名を副ボタンでクリックします(閉じる⇒電源オフ)。

後者の場合は、サブメニューを通じて一時停止やリセットなど、より細かな制御が可能です。

Debian Sargeのインストールへ

以上で、仮想マシンの準備は完了です。続いて、ゲストOSであるDebian Sargeのインストールに進みましょう。

posted by Wataru Nishida.
開発環境
印刷用ページへ

GNU開発ツールのインストール【Mac OS X Mountain Lion版】

この記事では、Mac OS X環境上に、GNU開発ツール(コマンドライン版)をインストールする方法を紹介します。

 

開発環境が未整備であることの確認

Macの出荷状態、もしくはMac OS Xインストール直後の状態では、開発環境は含まれていないため、別途インストールする必要があります。

これからインストールを開始する前に、GNU開発ツール関連が未整備であることを確認しておきましょう。まず、GNU開発ツール(GCC: GNU Compiler Collection)のコントロールセンターでもある、gccドライバの実行を試みます。

$ gcc
-bash: gcc: command not found

"command not found"と表示され、gccというコマンドは現時点で存在しないことが分かります。

次に、Cライブラリを利用する際に必要となる、各種インクルードヘッダーファイルをチェックしてみます。UNIX環境では、Cライブラリのヘッダーファイル群は、/usr/include/ディレクトリに格納される習慣があります。

$ ls -F /usr/
X11/		bin/		libexec/	share/
X11R6@		lib/		sbin/		standalone/

/usr/include/ディレクトリそのものが、現時点では存在していないことを確認できたところで、作業を開始します。

 

AppStoreからXcodeを入手

最初に、AppStore経由でMac専用の開発環境Xcode(無料)を入手しましょう(執筆時点でバージョン 4.5.2, ダウンロードサイズ 1.5GiB)。

AppStoreアプリケーションを起動し、検索窓で"xcode"と入力すると、目指すXcodeのアイコンが表示されます。

Xcodeのページに切り替わると、左端に"無料"のボタンが表示されますので、このボタンをクリックします(ダウンロードという名前のボタンは、本ページ上に設置されていないため注意)。

無料ボタンをクリックすると、"Appをインストール"というボタンに変化しますので、再度クリックすると、インストールが開始されます(サインインしていない場合は、Apple IDを入力)。

しばらくの間、ボタンは"インストール中"という表示に切り替わりますが、処理が完了すると"インストール済み"となります。/Applications/フォルダの中に、Xcodeアプリが登録されていますので、起動してください(Xcode バージョン 4.2までは、/Developer/Applications/フォルダに格納)。

 

コマンドラインツールのインストール

Xcodeインストール時には、コマンドライン版のGNU開発ツールが用意されていないため、別途ダウンロードする必要があります。

Xcodeを最初に起動すると、使用許諾書が表示されますので、同意(Agree)ボタンを押します。

状況によっては、上の画面のように追加コンポーネントを要求されますので、適宜インストールを実施します。

無事、Xcodeが起動したら、メニューバーからPreferencesを選択します。

設定項目には、左からGeneral, Behaviors, Fonts&Colors, Text Editing, Key Bindings, Downloads, Locationsと並んでいますが、右からふたつめの"Downloads"を選択します。

"Command Line Tools"と表示されている行のインストールボタンをクリックすると、GNU開発ツール・コマンドライン版がインストールされます。

 

開発環境の確認

GNU開発ツールが正常にインストールされたかどうか、コマンドラインで確認してみましょう。

$ gcc
i686-apple-darwin11-llvm-gcc-4.2: no input file

先ほどは、"command not found"と表示されましたが、今度は"no input file"に変わっています。これは、ソースファイルが指定されていないことを示す、エラーメッセージです。

GCCのバージョン情報を表示させる、-v オプションを指定してみましょう。

$ gcc -v
Using built-in specs.
Target: i686-apple-darwin11
Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~67/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~67/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

今回インストールされたGCCのバージョンは、4.2.1であることが分かります。最後に、/usr/ディレクトリを見てみましょう。

$ ls -F /usr/
X11/		bin/		lib/		llvm-gcc-4.2/	share/
X11R6@		include/	libexec/	sbin/		standalone/

新たに、/usr/include/ディレクトリが作成されています。その中身は、どうなっているでしょうか。

$ ls -F /usr/include/
AssertMacros.h		iso646.h		python2.7@
Availability.h		isql.h			ranlib.h
AvailabilityInternal.h	isqlext.h		readline/
AvailabilityMacros.h	isqltypes.h		readpassphrase.h
Block.h			krb5/			regex.h
CommonCrypto/		krb5.h			removefile.h
ConditionalMacros.h	langinfo.h		resolv.h
DNSServiceDiscovery/	launch.h		rpc/
FlexLexer.h		lber.h			rpcsvc/
MacTypes.h		lber_types.h		rune.h
NSSystemDirectories.h	ldap.h			runetype.h
TargetConditionals.h	ldap_cdefs.h		sandbox.h
TargetConfig.h		ldap_features.h		sasl/
Xplugin.h		ldap_schema.h		sched.h
_locale.h		ldap_utf8.h		search.h
_structs.h		ldif.h			secure/
_types.h		libc.h			security/
_wctype.h		libcharset.h		semaphore.h
_xlocale.h		libexslt/		servers/
aio.h			libgen.h		setjmp.h
alloca.h		libkern/		sgtty.h
apache2/		libpq/			signal.h
apr-1/			libpq-events.h		slapi-plugin.h
ar.h			libpq-fe.h		spawn.h
architecture/		libproc.h		sql.h
arpa/			libunwind.h		sql3types.h
asl.h			libxml2/		sqlca.h
assert.h		libxslt/		sqlda-compat.h
bitstring.h		limits.h		sqlda-native.h
bsm/			localcharset.h		sqlda.h
bzlib.h			locale.h		sqlext.h
c++/			mach/			sqlite3.h
cache.h			mach-o/			sqlite3ext.h
cache_callbacks.h	mach_debug/		sqltypes.h
checkint.h		machine/		sqlucode.h
com_err.h		malloc/			stab.h
complex.h		math.h			standards.h
copyfile.h		membership.h		stdbool.h
cpio.h			memcached/		stddef.h
crt_externs.h		memory.h		stdint.h
ctype.h			menu.h			stdio.h
cups/			miscfs/			stdlib.h
curl/			monetary.h		strhash.h
curses.h		monitor.h		string.h
cxxabi.h		mpool.h			stringlist.h
db.h			nameser.h		strings.h
default_pager/		nc_tparm.h		struct.h
device/			ncurses.h@		sys/
dirent.h		ncurses_dll.h		sysexits.h
disktab.h		ndbm.h			syslog.h
dispatch/		net/			tar.h
dlfcn.h			net-snmp/		tcl.h@
dns.h			netdb.h			tclDecls.h@
dns_sd.h		netinet/		tclPlatDecls.h@
dns_util.h		netinet6/		tclTomMath.h@
dtrace.h		netkey/			tclTomMathDecls.h@
ecpg_config.h		nfs/			term.h
ecpg_informix.h		nl_types.h		term_entry.h
ecpgerrno.h		nlist.h			termcap.h
ecpglib.h		notify.h		termios.h
ecpgtype.h		notify_keys.h		tic.h
editline/		ntsid.h			tidy/
err.h			objc/			time.h
errno.h			odbcinst.h		timeconv.h
eti.h			openssl/		tk.h@
execinfo.h		os/			tkDecls.h@
expat.h			panel.h			tkIntXlibDecls.h@
expat_external.h	paths.h			tkMacOSX.h@
fcntl.h			pcap/			tkPlatDecls.h@
fenv.h			pcap-bpf.h		ttyent.h
ffi/			pcap-namedb.h		tzfile.h
fmtmsg.h		pcap.h			ucontext.h
fnmatch.h		pexpert/		ulimit.h
form.h			pg_config.h		unctrl.h
fsproperties.h		pg_config_manual.h	unistd.h
fstab.h			pg_config_os.h		unwind.h
fts.h			pgtypes_date.h		util.h
ftw.h			pgtypes_error.h		utime.h
get_compat.h		pgtypes_interval.h	utmp.h
getopt.h		pgtypes_numeric.h	utmpx.h
glob.h			pgtypes_timestamp.h	uuid/
grp.h			php/			vfs/
gssapi/			poll.h			vis.h
gssapi.h		postgres_ext.h		vproc.h
hfs/			postgresql/		wchar.h
histedit.h		profile.h		wctype.h
i386/			protocols/		wordexp.h
iconv.h			pthread.h		xar/
ifaddrs.h		pthread_impl.h		xlocale/
inttypes.h		pthread_spis.h		xlocale.h
iodbcext.h		pwd.h			xpc/
iodbcinst.h		python2.5@		zconf.h
iodbcunix.h		python2.6@		zlib.h

驚くほど多くのヘッダーファイルとサブディレクトリが用意されています。この中には、C言語では有名な stdio.h というヘッダーファイルも登場しますが、これから私達はこれらのファイルにお世話になることになります。

posted by Wataru Nishida.