Ubuntu のデフォルトでは gcc でコンパイルできないので build-essential を入れておく

先日インストールした、Ubuntu Linux 8.04 LTS で gcc を使って C 言語のプログラムをコンパイルしようとしたら、「stdio.h がありません」、と出た。
いろいろ調べてみたら、デフォルトのインストールのままでは、libc が入っている build-essential のパッケージが入っていないそうなので、追加でインストールしておいた。

ubuntu@ubuntu:~$ gcc test.c
test.c:1:19: error: stdio.h: No such file or directory
test.c: In function 'main':
test.c:5: 警告: incompatible implicit declaration of built-in function 'printf'

エラーはこんな感じ。「stdio.h がありません」、「printf の宣言がわかりません」、などと言っている。
なので、sudo apt-get install build-essential とコマンドを打ってみる。

ubuntu@ubuntu:~$ sudo apt-get install build-essential
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  dpkg-dev g++ g++-4.2 libc6-dev libstdc++6-4.2-dev libtimedate-perl
  linux-libc-dev patch
提案パッケージ:
  debian-keyring g++-multilib g++-4.2-multilib gcc-4.2-doc libstdc++6-4.2-dbg
  glibc-doc manpages-dev libstdc++6-4.2-doc diff-doc
以下のパッケージが新たにインストールされます:
  build-essential dpkg-dev g++ g++-4.2 libc6-dev libstdc++6-4.2-dev
  libtimedate-perl linux-libc-dev patch
アップグレード: 0 個、新規インストール: 9 個、削除: 0 個、保留: 3 個。
8701kB のアーカイブを取得する必要があります。
この操作後に追加で 34.3MB のディスク容量が消費されます。
続行しますか [Y/n]? Y

Y キーを押す

...省略
build-essential (11.3ubuntu1) を設定しています ...
ubuntu@ubuntu:~$ 

build-essential パッケージがインストールされた。

ubuntu@ubuntu:~$ gcc test.c
ubuntu@ubuntu:~$ ./a.out
hello
ubuntu@ubuntu:~$ 

コンパイル & プログラム実行に成功。

うまくネットワークからインストールできない場合 (LiveCD などの場合) は、このようになる。

ubuntu@ubuntu:~$ sudo apt-get install build-essential
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
E: パッケージ build-essential が見つかりません

システム→システム管理→ソフトウェアソースで、「インターネットからダウンロード」の欄のいくつかにチェックが入っているか確認して、「閉じる」を押す。
アプリケーション→追加と削除で、アプリケーションのアップデートを行っておく。
端末を閉じて、もう一度、sudo apt-get install build-essential コマンドを実行すればインストールできた。


ここ 2~3 日で、研究室のマシンや、3年生の後輩のノート PC などがたくさん Ubuntu になったので楽しいな。

研究室で共用の Windows Vista ワークステーションでは Ubuntu の LiveCD が恐ろしく快適に動作するので、Vista を削除して Ubuntu をインストールしようかと思ったけど、絶対に怒られそうなのでやめた。

ThinkPad X61 に Windows Vista と Ubuntu Linux をデュアルブートする

僕はあくまでも IT コンシェルジュという名の IT 雑用係なので、外出先で使用するノート PC は Windows も Linux も使えなくちゃいけない。 それでこの前購入した Lenovo ThinkPad X61 に Ubuntu Linux 8.04 LTS をデュアルブートしておいた。ThinkPad も Ubuntu も初めてなので試行錯誤したけど、以下の手順でできた。

ThinkPad はデフォルトで HDD の全領域を C ドライブに割り当てられていて非常に使いづらい上に、リカバリのメニューからも自由にパーティションを設定できなくて困っていたので、ついでにパーティションを設定し直して、Windows に D ドライブを作成しておいた。大まかには以下の流れでできる。


1. リカバリディスクを作成する
ThinkPad にはリカバリディスクが付属せず、HDD の隠し領域からリカバリできるようになっている。いまどきのノート PC なら当たり前だけど。
しかし、HDD のパーティションを壊した場合に備えて、念のためリカバリディスクを作成しておく。
Windows Vista を起動し、スタート→ すべてのプログラム → ThinkVantage → Create Recovey Media から作成できる。

リカバリディスクは 1 セットだけしか作成できないようになっているけど、HDD からリカバリを行えば、また作成できるようになる。Windows のレジストリのどこかをいじってもまた作成できるようになると思う。たぶん。
(Lenovo リカバリー・メディア を作成する方法 - ThinkPad / ThinkCentre - Japan)

2. Ubuntu Linux をインストール
Ubuntuの入手 からダウンロードした、ISO イメージを CD-R に書き込み、CD-R を入れて ThinkPad を起動する。
Windows からアプリケーションとして起動させるのではなく、 ブート時に起動プログラムを実行させるので注意。

3.パーティションの設定
次へ→次へ→次へ・・・で、パーティションの設定が行える。
ここの画面では、Windows のパーティションを自由に減らしたり増やしたりできる。Fedora や Vine Linux では Partition Magic などのソフトウェアを使用するか、Windows を新たにインストールし直す必要があったけど、Ubuntu のインストーラだけでデュアルブート用のパーティション構成がすべてできる。ここが Ubuntu の優秀なところ。

ここで、購入直後でない場合はリカバリするなどして、C ドライブの使用セクタを先頭に固めるのがミソ。
ついでに、Windows Vista の領域 (C ドライブ) をぐんと少なめにして、NTFS の領域をもうひとつ作れば、D ドライブの完成。さらに空いた領域に Ubuntu をインストールすればよい。ただ単に D ドライブを作りたいだけなら、パーティションを記録してからセットアップを中断すればよい(たぶん)。

先頭に見える約 4GB 分のボリュームは ThinkVantage。リカバリ用のデータなどが入っている領域なので消さないでおく。
4 つめ以降のボリュームは物理ボリュームではなく、論理ボリュームとして作成しないといけないので、注意する。

最終的に、このような構成になったはず。
・ThinkVantage 4GB
・C: 60GB
・D: 約65GB (C: に 60GB、Ubuntu に 20GB を割り当てた結果、余った分の容量)
・/ 18G
・swap 2G

4. その他インストール
IP アドレスの設定、アカウントやパスワードの設定など行う。Ubuntu には Fedora やCentOS と違って root がないので若干戸惑ったけど、「Ubuntu には root はない」そうなので、気にしなくてよい。
残りも「次へ」→「次へ」でサクサクと進める。

5. 完成
CD-ROM を取り除いて、ThinkPad を起動すると、Lenovo の起動画面の後に、ブートローダが起動し、
・Ubuntu (最新版のカーネル)
・Ubuntu (前の版のカーネル)
・Memtest86 (メモリの診断ツール)
・Windows Vista (ThinkVantage)
・通常の Windows Vista
の 5 つの起動メニューが現れる。

ブートローダのデフォルトが Ubuntu になっていて都合が悪いので、暇な時に Windows Vista に設定しなおしておく。

もちろん、デュアルブート後も 指紋センサーや ThinkVantage AccessConnentions などといった ThinkPad の偉大な恩恵を享受することができる。
Ubuntuでは、デフォルトのままでは指紋センサーは動作しないけど、無線 LAN などは問題なく使用できる。トラックポイントのスクロール機能が使えないのは残念だけど。


追記 (2008.10.09) ブートローダのデフォルトの OS を Windows Vista に設定する

sudo gedit /boot/grub/menu.lst

ブートローダ GRUB の設定ファイルを gedit で開く。vim でも構わない。

## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
# WARNING: If you are using dmraid do not use 'savedefault' or your
# array will desync and will not let you boot your system.
default		5

default で始まる行に、ブートローダに表示されるの起動 OS 一覧で、デフォルトにしたい OS の順番を記入する。
0 から始まるので注意するほか、「Other operating systems:」の行もカウントするので注意する。

保存して、再起動して確認しておく。

Linux でメモリを抜き差しすると SELinux が勝手に Enforced になる

研究室 4 日目に CMOS を初期化して自分のものにした デスクトップ PC はメモリが 256MB で使い物にならないので、自己所有のサーバ (Fedora 8) のメモリ 256MB を抜いてきて、合わせて 512MB にした。

メモリを抜いてサーバを起動すると、サーバに入れているはずの Web が見れない。SSH は接続できたので、確かめてみると、Apache のデーモンが立ち上がっていない。

とりあえず起動させてみる。

[root@ws hira]# /sbin/service httpd start
httpd を起動中: Syntax error on line 280 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
                                                           [失敗]

そういえば DocumentRoot は /home/hira/public_html にしているため、SELinux の設定を面倒くさがって無効 (Permissive) にしていた。もしかして SELinux が原因か?ということで、

[root@ws hira]# /usr/sbin/getenforce
Enforced

やっぱり Enforced になってたので無効にする。

[root@ws hira]# /usr/sbin/setenforce 0
[root@ws hira]# /usr/sbin/getenforce
Permissive

無効になっていることを確認して Apache を起動する。

[root@ws hira]# /sbin/service httpd start
httpd を起動中:                                            [  OK  ]

これで Apache が起動した。

研究室 5 日目は昼間からソフトボールで夕方からバーベキューで夜になったら麻雀という、リア充な生活を強いられたので疲労がたまった。でもソフトボールは楽しいな。

「Firefoxは起動していますが応答しません...」の対処法

追記 (2007.07.14)
Windows版のFirefoxの場合はこちら。
BlueSky Lab.「Windowsでも「Firefoxは起動していますが応答しません...」」

エラー対処法のメモ。

Linux版のFirefoxで突然以下のようなメッセージが出力され、Firefoxが起動できなくなった。

「Firefoxは起動していますが応答しません。新しいウィンドウを開くには既存のFirefoxプロセスを終了させるか、コンピュータを再起動させなければなりません。」

psコマンドで調べてもプロセスは立ち上がってない模様。
再起動してもまた同じエラー。これで一生Firefoxは使えなくなったようだ。

さすがに困るので、ネットで検索。
筑波大学 学術情報メディアセンター教育用等計算機システム Q&Aによると、Firefoxの設定ファイルを削除すればいいらしいが、うちの学校のPCでは設定ファイルが見当たらない。

プロフィールを削除すれば何とかなるかも。ということで、コマンドラインから「$ firefox -profilemanager」でプロフィール管理画面から「Default User」を削除。
新しいプロフィールを作成し、Firefoxを起動させると、無事復活。

実験中だったので焦った...。

scriptコマンドの説明が面白い

実験のレポートを作成していますが、プログラムの実行結果を出力するのに便利なのがscriptコマンド。
学校のPCではマニュアルが英語で表示されたので気づかなかったが、自宅のCentOSでは日本語でこんなメッセージが。

[hira@localhost ~]# man script
名前
   script - 端末セッションの写し (typescript) を作成する。

書式
   script [-a] [-c COMMAND] [-f] [-q] [-t] [file]

説明
   script は端末に表示されたものすべての写し (typescript) を作成する。これは
   宿題を出された学生が、インタラクティブなセッションのハードコピーを必要と
   する場合などに便利だろう。記録された typescript ファイルを、後で lpr(1)
   などを使って印刷すれば良い。

   引き数 file が指定されると、 script はすべての記録を file に保存する。
   ファイル名が与えられなければ、写しは typescript というファイルに保存される。

まさにピッタリな説明に感動。