本ブログは自身の技術メモのために始めたハズなのに、最近、電子決済(Pay)とかGoogle Adsenseの記事を書いたところ、アクセス数が急激に増えました。正直嬉しかったのですが、肝心の技術ネタをサボり気味な自分を発見。原点回帰でLinuxに戻ってきました。


【関連記事】


【キーワード】
The Linux Kernel Archive、uname、mainline、stable、longterm、linux-next、Stephen Rothwell氏、tarball、jargon(ジャーゴン)、xz、pgp、gpg、patch、inc.patch、view diff、browse、changelog
  • 2019/7/7
①前置き的な話

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


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

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

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

まず初心者向けKernelのビルド手順本家Linux カーネルをコンパイルして仮想PCで起動する初めてのカーネル再構築(コンパイルとインストール)を読んだ。どれも断片的だが、まずThe Linux Kernel Archive(本家)からソースを落とすと言うところは共通しているので、ソースを落としてみるか。

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

我が家は【解決シリーズ】①(Dynabook N514/25L(TOSHIBA NB-10-series)にUbuntu14.04をインストールするのは難しかった)でインストールした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 カーネル名

% 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 マシンのハードウェア名、プロセッサの種類、ハードウェアプラットフォーム、すべてこれが表示された

% 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のようです。まずこのページの単語から調べてみよう。
1

まず真ん中あたりにカーネルVerらしきものが列挙されているが、その左に記載されたmainline、stable、longterm、linux-nextの違いを知るためLinuxカーネルのソースコードを読んで、システムコールを探る (1/3)を読んだ。
mainline 最新バージョン
stable 安定バージョン
longterm 長期メンテナンスが行われるバージョン
linux-nextが良く分からないので更に2017年3月6日 「ルールを守らないリクエストはもう受け付けない」―Linus,やや不機嫌ながらLinux 4.11-rc1を公開を読んでみると、以下のことが分かった。とにかく新しいカーネルにパッチを入れたいときは、まずここに入れないとライナス氏の怒りを買うみたいですね。
linux-next Stephen Rothwellが管理するGitリポジトリで、開発者は次期カーネルにマージさせたいパッチがあれば、まずここに入れる。パッチのIDをlinux-nextとマージウィンドウで一致させるためだ。だがルールは必ずしも守られない。Linusは「fixesやstartxのシステムコール関連などのパッチはある程度しかたない。でも<linux/sched.h>に関してはかなりひどい。そして今回目立ったのはサブシステムやInfiniBandDRMbtrfsなど」と具体的なソースをあげ「⁠こんな簡単なルールすら守れないならそれに見合った結果を手にすることになるだろう」とコメント次のマージウィンドウではそういう"自分勝手なパイバス行為"はいっさい受け付けない。もし次回、linux-nextに入っていないコードをマージさせようとするヤツがいて、そいつが僕の“⁠クソリスト⁠”の常連なら、また僕に怒鳴られることになるだろう」と強い口調で警告している。

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

次に気になったのがtarballtar ball(ターボール)って何?と思って調べてみるとかなり深かった!を読むと、tar(wikipedia)に以下の解説がある。tarballはjargon(専門用語、隠語)の類みたい。イマイチジョーク(面白さ)が理解できませんが、まあいいか。
UNIX系コミュニティでは、圧縮したtar形式のファイルを"tarball"(ターボール)と呼ぶこともある。
この語は、元々は「リーマスじいや(英語版)」の童話『タールの赤ん坊(英語版)』に由来し、それに油塊(タールボール)を引っ掛けたジョーク的用語である。
jargonと言うと、ついついヨーダ記法を思い浮かべてしまう。
ヨーダ記法とは左辺に定数を持ってくるスタイル。スターウォーズのヨーダがこういう文法・語順で喋ることに由来しますが、私の周りではあまり人気がありません。

 if( NULL == parameter )
 
stable(5.1.16)のtarballをクリックするとlinux-5.1.16.tar.xzというファイル名である。
1

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を開くとこういうのが出てくる。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-----
次にpatchinc.patch。両方落としてみたが、どっちも普通のパッチだった。patchのリンクにマウスを持っていくと「Download to previous mainline」と表示される。inc.patchのリンクにマウスを持っていくと「Download incremental patch」と表示される。まだ違いが分かってない。いつか調べよう。

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

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

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

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

続く

詳解 Linuxカーネル 第3版
Daniel P. Bovet
オライリー・ジャパン
2007-02-26


組み込みLinuxシステム構築 第2版
Karim Yaghmour
オライリージャパン
2009-10-26


Linuxデバイスドライバ 第3版
Jonathan Corbet
オライリージャパン
2005-10-22




スポンサードリンク