CentOS(Linux)でコマンドのコードリーディングをする準備(ソースコード編)

こんにちは。技術書を買いすぎて破綻の足音が後ろから近づいているきたけーです。

最近、低レイヤーの知識を深めるためにC言語の勉強をしているのですが、ただC言語の勉強をしていても意味がありません(まぁ、メモリを意識したりはできるようになりますが)。実際の生きたコードを読まねば。
と、突然、目的もなくLinuxカーネルやApacheソースコードを読もうとすると爆死するのは目に見えていますよね。とりあえずは普段使っているコマンドのソースコードを読むことでシステムコールやライブラリへの理解を深めていきたいと思います。

ということで、今回はCentOS6.4(Linux)でのコマンドのソースコードを用意する方法をまとめました。

ls や cat などの基本的なコマンドのソースコードを用意する

ls や cat などの基本的なコマンドのソースコードを用意しましょう。
Linuxの場合、GNUcoreutilsという名前で配布しているものを使っているのでこれを用意します。

cd /usr/src
sudo wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.14.tar.xz
sudo tar xvf coreutils-8.14.tar.xz

coreutils-8.14/srcディレクトリにls.cなどコマンドのソースがあるのが分かると思います。 libディレクトリには標準Cライブラリのソースがあります。

coreutilsのソースは読みにくいという評判なので、芯の部分が知りたい場合は適宜FreeBSDのソースを読むとよいかもしれません。 http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/
coreutilsはrpmパッケージにもあるので下の手順で用意することも可能です。

rpmパッケージで入ったコマンドのソースコードを用意する

コマンドが含まれるパッケージ名を調べる

以下のようなコマンドを実行します。

rpm -qf `which --skip-alias コマンド名`

試しにlsで調べてみましょう。

rpm -qf `which --skip-alias ls`
# coreutils-8.4-19.el6.x86_64

SRPMリポジトリ設定を追加

SRPMパッケージをダウンロードするためにリポジトリを追加します。SRPMパッケージは「ソースコードを含んだrpmパッケージのこと」です。

[os-srpm-centos]
name=CentOS OS $releasever - $basearch - Source from centos
baseurl=http://vault.centos.org/6.4/os/Source/
enabled=1
priority=1
 
[updates-srpm-centos]
name=CentOS UPDATES $releasever - $basearch - Source from centos
baseurl=http://vault.centos.org/6.4/updates/Source/
enabled=1
priority=1
 
[extras-srpm-centos]
name=CentOS EXTRAS $releasever - $basearch - Source from centos
baseurl=http://vault.centos.org/6.4/extras/Source/
enabled=1
priority=1
 
[centosplus-srpm-centos]
name=CentOS CENTOSPLUS $releasever - $basearch - Source from centos
baseurl=http://vault.centos.org/6.4/centosplus/Source/
enabled=0
priority=1
 
[contrib-srpm-centos]
name=CentOS CONTRIB $releasever - $basearch - Source from centos
baseurl=http://vault.centos.org/6.4/contrib/Source/
enabled=0
priority=1
 
[fasttrack-srpm-centos]
name=CentOS FASTTRACK $releasever - $basearch - Source from centos
baseurl=http://vault.centos.org/6.4/fasttrack/Source/
enabled=0
priority=1
 
[cr-srpm-centos]
name=CentOS CR $releasever - $basearch - Source from centos
baseurl=http://vault.centos.org/6.4/cr/Source/
enabled=0
priority=1

yumdownloaderでSRPMパッケージをダウンロード

yumdownloaderコマンドでSRPMパッケージをダウンロードします。

sudo yum clean all
yumdownloader --source パッケージ名

パッケージはホームディレクトリにダウンロードされます。

パッケージの展開

どのようなファイルがアーカイブされているか確認

rpm -qpl ダウンロードしたパッケージ

パッケージの展開にはrpmdev-extractコマンドを使います(全て展開しなくてもrpm2cpioコマンドでパッケージ内の特定のファイルのみ取り出すこともできます)。入っていない場合はrpmdevtoolsパッケージをインストールします。

rpmdev-extract ダウンロードしたパッケージ

あとは展開されたディレクトリの中にソースコードが含まれているので潜り込んでいきましょう。

まとめ

CentOS6.4でcoreutilsのソースをGNUから直接取得する方法と、rpmでソースを含むパッケージの取得方法を説明しました。次回は実際になにかのコマンドのコードリーディングをおこなってみます。

参考サイト