はじめに
本稿では、RHEL、CentOS、Fedora といった RedHat 系 Linux のコマンドに紐づくソースコードを取得するための方法を記載しています。
一例として、dmesg
のパッケージである util-linux
のソースコードを取得します。
検証環境
[root@hst ~]# uname -r 4.18.11-200.fc28.x86_64 [root@hst ~]# cat /etc/fedora-release Fedora release 28 (Twenty Eight)
上記のとおり、検証環境は Fedora ですが、以降の手順は RHEL や CentOS でも使えるはずです。ただし、RHEL, CentOS, Fedora(21以前)の標準のパッケージマネージャは dnf ではなく yum なので、その点は注意です(具体的なコマンドは併せて載せています)。
ソースコードの取得方法
主な流れは次のとおりです。
- 確認したいコマンドのパッケージ名を確認
- 確認したパッケージのソースパッケージをダウンロード
- ソースパッケージからソースファイルを抽出
※ソースパッケージには、ビルドに必要なファイルなどソースファイル以外も含まれています。
事前準備
はじめに必要なコマンドのパッケージをインストールします。
// Fedora(22以降)の場合 [root@hst ~]# dnf install rpmdevtools // RHEL, CentOS, Fedora(21以前)の場合 [root@hst ~]# yum install rpmdevtools yum-utils
次に実装を確認したいコマンドのパッケージ名を確認します(本稿では dmesg コマンドが対象)。
[root@hst ~]# rpm -qf $(which --skip-alias dmesg) util-linux-2.32-2.fc28.x86_64 ※ .fc28.x86_64 はご使用の環境により変化します。
作業用のディレクトリを作成します(適宜)。以降は、ここで作業するものとします。
[root@hst ~]# mkdir work && cd work
手順
事前準備で確認したパッケージのソースパッケージをダウンロードします。
// Fedora(22以降)の場合 [root@hst work]# dnf download --source util-linux-2.32-2.fc28.x86_64 // RHEL, CentOS, Fedora(21以前)の場合 [root@hst work]# yumdownloader --source util-linux-x.xx-x.xxx
カレントディレクトリに src.rpm ファイルがダウンロードされます。
[root@hst work]# ls util-linux-2.32-2.fc28.src.rpm
ダウンロードしたソースパッケージからソースファイル群を抽出します。
[root@hst work]# rpmdev-extract util-linux-2.32-2.fc28.src.rpm
カレントディレクトリに util-linux-2.32-2.fc28.src というディレクトリが生成されますので、その中にある tar ファイルを解凍します。
[root@hst work]# cd util-linux-2.32-2.fc28.src [root@hst util-linux-2.32-2.fc28.src]# tar xvf util-linux-2.32.tar.xz
解凍すると、ディレクトリ(util-linux-2.32)の中にソースファイルが展開されます。
[root@hst util-linux-2.32-2.fc28.src]# ls -l util-linux-2.32 total 2488 -rw-r--r--. 1 hp-spectre13 hp-spectre13 93787 Mar 21 2018 ABOUT-NLS -rw-rw-r--. 1 hp-spectre13 hp-spectre13 66331 Mar 21 2018 aclocal.m4 -rw-rw-r--. 1 hp-spectre13 hp-spectre13 29121 Mar 21 2018 AUTHORS -rwxrwxr-x. 1 hp-spectre13 hp-spectre13 3569 Sep 18 2017 autogen.sh ... (snip) ... drwxrwxr-x. 2 hp-spectre13 hp-spectre13 4096 Mar 21 2018 tools
最後に dmesg のソースファイルがどこにあるのか探してみます。
[root@hst util-linux-2.32-2.fc28.src]# find util-linux-2.32/ -name "dmesg*" util-linux-2.32/tests/expected/dmesg util-linux-2.32/tests/ts/dmesg util-linux-2.32/bash-completion/dmesg util-linux-2.32/sys-utils/dmesg.1 util-linux-2.32/sys-utils/dmesg.c ★
C言語のソースファイルが見つかりました(dmesg.c)。