CentOS(Linux)でコマンドのコードリーディングをする準備(ソースコード編)
こんにちは。技術書を買いすぎて破綻の足音が後ろから近づいているきたけーです。
最近、低レイヤーの知識を深めるためにC言語の勉強をしているのですが、ただC言語の勉強をしていても意味がありません(まぁ、メモリを意識したりはできるようになりますが)。実際の生きたコードを読まねば。
と、突然、目的もなくLinuxカーネルやApacheのソースコードを読もうとすると爆死するのは目に見えていますよね。とりあえずは普段使っているコマンドのソースコードを読むことでシステムコールやライブラリへの理解を深めていきたいと思います。
ということで、今回はCentOS6.4(Linux)でのコマンドのソースコードを用意する方法をまとめました。
ls や cat などの基本的なコマンドのソースコードを用意する
ls や cat などの基本的なコマンドのソースコードを用意しましょう。
Linuxの場合、GNUがcoreutilsという名前で配布しているものを使っているのでこれを用意します。
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 ダウンロードしたパッケージ
あとは展開されたディレクトリの中にソースコードが含まれているので潜り込んでいきましょう。
- debian系の場合はこちらを参考にどうぞ http://d.hatena.ne.jp/benikujyaku/20130106/1357449983
まとめ
CentOS6.4でcoreutilsのソースをGNUから直接取得する方法と、rpmでソースを含むパッケージの取得方法を説明しました。次回は実際になにかのコマンドのコードリーディングをおこなってみます。