Linux

【PC】Linuxビルドのノウハウ ①カーネルソースコードのダウンロード

【※ 当記事は2020年7月2日時点の情報です】

ペイヴメント(@pavement1234)です。

エンジニア
エンジニア

Linuxのカーネルビルドの方法を知りたいけど簡単にまとめられた情報源がない

こんな悩みを解決します。

今回やることは3つ。

  1. カーネルのビルド方法をWEBで調査
  2. 自分の使っているLinuxのカーネルバージョンを調べる
  3. Linuxカーネルソースコードをダウンロード

バージョン情報

Linux Kernel 3.14

前置き的な話

Linuxのビルドってなんか複雑。Yoctoは色々自動化されてて基本を理解するのには適さない気がするので、ソースを落として自分でmakeしたい。しかし、いきなり詳しくなれないし、王道の手順を知っておきたいので、得意な人に聞いたり、ネットで調べたり、ポイントを押さえながら進めていきたいです。が、最終的には過去に購入したLinuxの本たちを読み込み深く理解したいと思ってます(言うのは自由)。また、自分のスキルを促成栽培したいわけではなくて、応用力を付けるためにも途中で疑問に思ったことを寄り道しながら1つずつ解消していきたいです。

組込LinuxはBSPのマニュアル通りに進めればビルドしたu-boot、カーネル、ファイルシステムで比較的簡単に起動できますが、カーネルを自力でバージョンUPしたり、カスタマイズしようとすると、色々わかってないことが多いことに気づきます。しかもハードウェアが特殊なのでハマると抜け出すのに時間がかかるのでまずはPC Linuxから始めてみることにしました。

何はともあれThe Linux Kernel Archive(本家)のソースを落とし、カーネルとモジュールにパッチを当て、ビルドする、インストールする、という一連の手順を少しずつ見ていきます。…ってこういう話、5年くらい前から言ってるけど全然出来てないワタクシでした。今回はやり遂げたいです。

カーネルビルド方法を調べる

まず初心者向けKernelのビルド手順本家Linux カーネルをコンパイルして仮想PCで起動するを読みました。断片的ですがまずThe Linux Kernel Archive(本家)からソースを落とすのが基本の様子。

そもそも自分が使ってるカーネルバージョンなんだっけ

我が家はUbuntu14.04を使ってます。unameで色々調べてみるとカーネル3.13でした。カーネル3.14あたりにUPDATEするならハードル低めですかね。

% uname -a
Linux pavement1234 3.13.0-165-generic #215-Ubuntu SMP Wed Jan 16 11:46:47 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux すべて表示

% uname -s
Linux OS(System)名

% uname -n
pavement1234 ノード名

% uname -r
3.13.0-165-generic カーネルリリース番号

% uname -v
#215-Ubuntu SMP Wed Jan 16 11:46:47 UTC 2019 カーネルバージョン

% uname -m
% uname -p
% uname -i
x86_64 マシンのハードウェア名、プロセッサの種類、ハードウェアプラットフォーム。-m, -p, -i, の3つは同じ表示。

% uname -o
GNU/Linux OS名

$ uname –version
uname (GNU coreutils) 8.21
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 David MacKenzie uname自体のバージョン情報

The Linux Kernel Archive(本家)でカーネル3.14をダウンロードする

さて、The Linux Kernel Archive(本家)に来ました。最新のstable(安定版)は5.1.16のようです。まずこのページの単語から調べてみよう。

まず真ん中あたりにカーネルVerらしきものが列挙されていますが、その左に記載されたmainline、stable、longterm、linux-nextの違いを知るためLinuxカーネルのソースコードを読んで、システムコールを探る (1/3)を読みました。

mainline 最新バージョン
stable 安定バージョン
longterm 長期メンテナンスが行われるバージョン

linux-next ???

linux-nextが良く分からないので更に2017年3月6日 「ルールを守らないリクエストはもう受け付けない」―Linus,やや不機嫌ながらLinux 4.11-rc1を公開を読んでみると、以下のことが分かりました。とにかく新しいカーネルにパッチを入れたいときは、まずlinux-nextに入れないとライナス氏の怒りを買うみたいですね。

linux-next Stephen Rothwellが管理するGitリポジトリで、開発者は次期カーネルにマージさせたいパッチがあれば、まずここに入れる。パッチのIDをlinux-nextとマージウィンドウで一致させるためだ。だが、ルールは必ずしも守られない。Linusは「fixesやstartxのシステムコール関連などのパッチはある程度しかたない。でも<linux/sched.h>に関してはかなりひどい。そして今回目立ったのはサブシステムやInfiniBand、DRM、btrfsなど」と具体的なソースをあげ、「?こんな簡単なルールすら守れないなら、それに見合った結果を手にすることになるだろう」とコメント、「次のマージウィンドウではそういう”自分勝手なパイバス行為”はいっさい受け付けない。もし次回、linux-nextに入っていないコードをマージさせようとするヤツがいて、そいつが僕の“クソリスト”の常連なら、また僕に怒鳴られることになるだろう」と強い口調で警告している。

Stephen Rothwell氏。The linux-next and -stable treesに写真がのってました。

次に気になったのがtarballtar ball(ターボール)って何?と思って調べてみるとかなり深かった!を読むと、tar(wikipedia)に以下の解説がありました。tarballはjargon(専門用語、隠語)の類みたいです。イマイチジョーク(面白さ)が理解できなかったけど、まあいいか。

UNIX系コミュニティでは、圧縮したtar形式のファイルを”tarball”(ターボール)と呼ぶこともある。
この語は、元々は「リーマスじいや(英語版)」の童話『タールの赤ん坊(英語版)』に由来し、それに油塊(タールボール)を引っ掛けたジョーク的用語である。

jargonと言うと、ついついヨーダ記法を思い浮かべてしまう。

ヨーダ記法とは左辺に定数を持ってくるスタイル。スターウォーズのヨーダがこういう文法・語順で喋ることに由来しますが、私の周りではあまり人気がありません。

 if( NULL == parameter )

stable(5.1.16)のtarballをクリックするとlinux-5.1.16.tar.xzというファイル名。

xzって何?Linux で tar.xz 形式のファイルを解凍するを見るとこう書いてある。

xz

LZMA2のデータ圧縮アルゴリズムを採用したデータ圧縮フォーマット、およびその圧縮プログラム。圧縮に時間がかかるが圧縮率は優秀です。

xzを解凍するときはこんな感じ。

①xzの解凍 → tarの解凍と順番に行う方法

$ xz -dv xxx.tar.xz
$ tar xfv xxx.tar

②tar.xz をまとめて解凍

$ xz -dc xxx.tar.xz | tar xfv –

③xz -dc の代わりに xzcat

$ xzcat xxx.tar.xz | tar xfv –

④GNU tar 1.22 から xzフォーマットをサポートしてる

$ tar Jxfv xxx.tar.xz

せっかくなので、気になったことを一通り調べてみることにしました。

tarballの横にあるpgpを開くと—–BEGIN PGP SIGNATURE—–から始まる以下のテキストが表示されます。PGP 鍵を用いたファイルの暗号化を読むとgpgと言うコマンドでPGP鍵を使えるみたい。ちょっと脱線しすぎなので一旦戻ります。

—–BEGIN PGP SIGNATURE—–
Comment: This signature is for the .tar version of the archive
Comment: git archive –format tar –prefix=linux-5.1.16/ v5.1.16
Comment: git version 2.22.0

iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl0cjh4ACgkQONu9yGCS
aT4MTg//SueSNjP5VAfAhFYCeYmZ5iNu1WIxqYJNOd0Th0kePJXimL1k6ULA1QMX
gP7LVERLMsE7HnLAp7zI11U2Hm6Nu2jlRBKM19wsGDywVWiu7iBbwHIKfZBslvHV
7ZfevSAf65FWUay5i6OA4LcvuKx6l+luYIDXKpKQJql8T4KL/B6W3Yy32DVsLCJw
cWIdzTq/Natwm+Uf/7IFkjCaigXdXUXgSUZTMOH+6hk8tNwad9Vo2uJQdzxz3zzN
mqAsWBZCE6FTxnRrGQIg+2/Q68RRjHrtQT5Y0NzzlL9+rlDgOQxfCsEJ/h+A0Wk4
VbdHLjptg45tUA9AkUbY1Aa5I9XeJ440F4kL4JiRd4ZJ6ahRD20To7wdzBuANMpc
kaZXP7Eer3Azy8DZ3xDy3vLZdu024924lcdayaf4NgxoCuhWw/AS4gKRXi/xkstg
9BUvS93Sh6fRxpcWoRXSuzvXa/jl9XVOCJcObN8RoJlqF0eV9ISsqiE8lQL0IA94
QDMyFNOmKnPWkS61cQNFl0HTqNr/34rDeH5ch3+uGv+r/wUNQnID5ogMW1OUjniL
H2A4beR0Gc8fKyHp7JSUBNiYzyxqBO5HXoCQJfgvQF+dgt7ja4fU4S2z49nsFQyX
Gd1nnuRzJNmChkaAICPNcVZ/mZb+8ShbLT/4GbYleORNOm/S0RE=
=canC
—–END PGP SIGNATURE—–

次にpatch、inc.patch。両方落としてみましたが、どっちも普通のパッチでした。patchのリンクにマウスを持っていくと「Download to previous mainline」と表示されます。inc.patchのリンクにマウスを持っていくと「Download incremental patch」と表示されます。まだ2つの違いが分かってません。いつか調べようと思います。

view diff。要はパッチ化した差分をGUIで見れるようにしたやつ?。

browse。これはすごく便利。ディレクトリ階層を掘っていけばソースを見れます。

changelog。コミットのログですね。要は更新履歴。

これでThe Linux Kernel Archive(本家)のトップページに書いてある単語は一応理解しました。次はHTTP、GIT、RSYNCと書いてあるリンクを掘ってみます。実はちょっと掘ってみてこんな感じのディレクトリ階層が見えたのですが、どれを選べばよいのかイマイチわかりません。

適当にlinux→kernel→v3.xと掘ったところ、カーネル3.14が居そうな感じです。

カーネル3.14は3.14.79が一番新しいバージョンみたいです(2016年9月11日8:05 75M )

ダウンロードしました(74.9MB)。

まとめ

今回、カーネルビルド方法をWEBで調査、自分が使っているLinuxのカーネルバージョンを調べ、LinuxカーネルソースコードをWindows PCにダウンロードするところまで実施しました。次回、カーネルソースコードをLinuxにコピーしてビルドの準備を行います。
ABOUT ME
ペイヴメント
ペイヴメントのエンジニア塾(当ブログ)では20年以上の経験から得られたプログラミング系ノウハウについてベテランにも満足して頂けるような内容の濃いコンテンツを初心者にも分かりやすい形で日々発信しています。【経歴】ベンチャーのソフトハウスで4年勤務後、精密機器メーカーのソフト開発部門に勤務し今に至ります。