Chap-7. Linux で apache 等をソースからコンパイル

ここでは、以下の考えでコンパイル対象を選びました。

最新のものを使う、となるとディストリが用意するのを待つわけにはいきません。特にカーネル。カーネルの場合、Slackware なら多少(数日程度あるいはもう少し多め)の遅れですが、Debian 系だと対応が随分(月単位で)遅れます。なので、自分で本家からソースをダウンロードしてコンパイルするのが望ましいと思います。
なお、OS は 2019 年時点で私が使っている Slackware 及び Devuan、antiX、MXLinux (以下、この3つを Devuan 等という)とします。Debian と Ubuntu は、基本的に Devuan 等と同じです。

Sec-1.Postfix
Sec-2.Apache
Sec-3.Linux-Kernel
Sec-4.Guile
Sec-5.Lua


Sec-1. Postfix

 Slackware と Devuan 等でコンパイル前の準備が違います。

Devuan 等の準備
バークレーのデータベースライブラリ libdb-dev と m4 プリプロセッサをインストールしておきます。

# apt install libdb-dev m4

これでコンパイル作業に取りかかれます。(この準備は、Debian 、 Ubuntu も同じです)


Slackware の準備
特に何もありません。


コンパイル・インストール作業 (Slackware Devuan 等共通)
以下のように仮定します。

コンパイル作業です

$ cd /usr2/lib
$ tar xf /usr2/src/postfix-3.4.6.tar.gz
$ cd postfix-3.4.6
$ make -f Makefile.init makefiles
$ make
# make install

インストールを打つと、色々と質問してきますが、全部デフォルトのままでいきました。なのでリターンキーを押し続けるだけです。
全部デフォルトのままにするのは、pop サーバ(あるいは dovecot )と連携して同じディレクトリのメールを扱う関係です。自分独自の設定は、きっと具合悪そうです。


インストール後 (Slackware Devuan 等概ね同じ)
インストールが終わったら、/etc/postfix/main.cf を自分の環境に合わせて編集するのと、/etc/aliases (Slackware は /etc/mail/aliases がファイル実体で /etc/alisess にリンクしておく) を編集して、自分のドメインに合わせます。作業後は、# newaliases やってデータベース(/etc/aliases.db)を更新します。
コンパイル・インストール作業は以上です。
 なお、Devuan では /usr/lib/sendmail を /usr/sbin/sendmail へのリンクにしておきます。また devuan では exim4 がデフォルトのメールサーバになっているので、# insserv -r exim4 として、 exim4 が立ち上がらないようにしておくとともに、動いている exim4 を kill しておきます。

これで、# /usr/sbin/postfix start とすると Postfix が動き出します。/var/log/ のログを見て、うまく動いているか確認します。
運用開始後も、継続的にログはチェックし続けます。結構しつこくクラッカーが訪れます。OMG
クラッカーのボットに嫌がらせしてやりたい人は、Chap-6. Sec-3. を見てください。TCP25 (SMTP) に時間制限かけるやりかた、書いてます。嫌がらせすると言っても相手は mirai に乗っ取られたボットなので、どれだけ妨害してやっても嫌がりませんけどね(笑)




Sec-2. Apache

Devuan 等での準備
 HTTPS を有効にするためには、libssl-dev をインストールしておきます。# apt install libssl-dev です。
その後、pcre (正規表現ライブラリ)を入れるのですが、これは Slackware も同じなので、そこに書きます。

Slackware での準備
Slackware は ssl ライブラリを最初から持っているので、そっちの準備は要りません。
で、(Devuan 等も同じですが)正規表現ライブラリをインストールします。最近です、これが必要になったのは。
pcre-8.42.tar.gz を本家からダウンロードしました。ソースは /usr2/src/ にありコンパイルは /usr2/lib/ でやると仮定します。
入れる場所は、/usr2/local/pcre-8.42/ 以下にします。適当に決めました。

$ cd /usr2/lib
$ tar xf /usr2/src/pcre-8.42.tar.gz

ソースを展開した後、以下のとおりです。

$ cd pcre-8.42
$ ./configure --prefix=/usr2/local/pcre-8.42
$ make
$ make install

あっさりしたもんです。

Apache のコンパイル (Slackware、Devuan 等共通)
以下のとおりです。インストール先は適当に決めてます。apr と apr-util が必要です。現時点で、httpd-2.4.39、apr-1.5.1、apr-util-1.5.3 が相性が良いです。ソースは /usr2/src/ にあり、コンパイルは /usr2/lib/ でやると、仮定します。

$ cd /usr2/lib
$ tar xf /usr2/src/httpd-2.4.39.tar.gz
$ cd httpd-2.4.39/srclib/
$ tar xf /usr2/src/apr-1.5.1.tar.gz
$ tar xf /usr2/src/apr-util-1.5.3.tar.gz
$ mv apr-1.5.1  apr
$ mv apr-util-1.5.3 apr-util
$ cd ..
$ configure --prefix=/usr2/local/apache2 --with-pcre=/usr2/local/pcre-8.42
$ make
$ make install

コンパイル時間は、思ったより長いです。
うまくインストール出来たら、# /usr2/local/apache2/bin/apachectl start として、ブラウザで localhost を見てみます。おなじみの it works ! が現れたらオケです。
ssl についても、モジュールをロードしてみて、うまくロードできるか確認します。
後は、Apache の本でも見て、httpd.conf の書き方を覚えます。セキュリティ上からも、これが肝心・大事だと思います。

補足、libssl-dev 等を持たないディストリの場合
 今時、大抵のディストリは libssl-dev 類似のものを持っていると思います。ssl を組み込んだプログラムを開発するための、ヘッダーやライブラリです。
でも、もしも無いときのために、自前でライブラリ作るやり方、書いておきます。やってみると、案外と簡単です。
openssl の本家からソースをダウンロードして、コンパイル・インストールするだけです。

ソースを展開して

$ ./config
$ make
$ make test
# make install

とします。インストール先はシステム標準の場所にします。そうしないと、他のプログラムをコンパイルする時にヘッダーの場所やライブラリを指定しなければならなくなりますから。
なお、インストール後に静的ライブラリだけでなく、動的ライブラリもインストールされますので、一旦 # ldconfig -v やってダイナミックリンクライブラリのキャッシュに入れておきます。ldconfig は、次に OS を立ち上げるときはもうやらなくても良いです。
後は、上記のコンパイルどおりにやれば、多分、HTTPS 対応した Apache がコンパイル出来ると思います。




Sec-3. Linux-Kernel

 カーネルの番号つけについては、以下のサイトの説明がすごく面白いです。この説明が一番的を射た説明かもしれないです。

https://elinux.org/images/f/f6/LinuxKernelReleaseModel_20180417.pdf

もっとも、普通は以下のように考える(説明する)と思います。


 ソースは kernel.org から持ってきます。
カーネルのバージョンは例えば、linux-4.4.185 等と3つの数字が並んでいます。最初のものがメジャー・バージョン番号、大きな機能アップがあると番号が変わります。(ただし、一説によれば「リーナスが番号を変える気になった時」がメジャー番号の変わる時らしいです、笑)

次の4がマイナー・バージョン番号。小規模な規格変更とか小規模機能アップです。
最後の185がバグフィックスやセキュリティーアップの番号、通称メンテナンス番号。機能は変わらず基本的にフィックスするだけ。
Slackware はこの番号をそのまま使っています。

ちなみに、devuan 等ではディストリの用意する番号は大抵4つの数字です。今、devuan 2.0.0 で $ uname -a すると 4.9.0-9-amd64 と表示されます。
この場合、4つめがいわゆるメンテナンスの番号らしい。じゃあ3つ目はなんだろう??

私は、kernel.org からソースを持ってくる時、基本的にメジャー番号とマイナー番号は変えません。メンテナンス番号だけを追いかけています。
万が一、メジャー番号やマイナー番号の違うカーネルを入れて、パニックになると困るから、固くいくようにしています(汗)

Slackware の場合
非UEFI環境(BIOS互換モード)
カーネルのソースを展開し、例えば /usr/src/linux-4.4.185/ 等となります。
/usr/src/ に入って、# ln -s linux-4.4.185 linux とします。その後、/usr/src/linux/ の中にこれまで使った.config をコピーして入れます。
後は、/usr/src/linux/ に入って、次の3つのコマンド入れるだけ。

# make
# make  modules_install
# make  install

これだけです。簡単です。restart すれば新しいカーネルで立ち上がります。uname -a すれば確認できます。

UEFI環境の場合
コマンドの最初の2つは同じ

# make
# make  modules_install

その次が全然違います。いちいち書くのは大変なので、以下のウェブサイトを見てくだだい。elilo 環境のところを見ればオケです。
ここは、すごく丁寧に書いてあります。

http://ja.akionux.net/wiki/index.php/Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E5%86%8D%E6%A7%8B%E7%AF%89

著者さんありがとうございます。参考にさせていただきました。


Devuan 等の場合
UEFI 環境でも、 非UEFI 環境でも同じです。
おそらく、libncurses-dev、libssl-dev をインストールする必要があると思います。
次に、Slackware と同じようにカーネルソースを展開。/usr/src/linux-4.9.185/ 等とできます。これを/usr/src/linux とリンクをはり、これまでの.config を入れます。あるいは、make menuconfig をやって、新しく .config を作ります。後は3つのコマンドだけ。

# make
# make  modules_install
# make  install

やってみると Slackware より簡単でした。なお、MXLinux の 18.3 はデフォルトカーネルに少々問題があって、このとおりに出来ません。個別のチャプタでそのことを説明しておきます。


余談:Devuan でディストリの用意するカーネルを入れる
なお、個人宅の LAN 内部で使うだけのパソコンなら、kernel.org からソースを持ってこなくても、ディストリの用意するNEWカーネルをいれるだけで良いと思います。(というか、その方が一般的には良いと思います)その場合、

$ apt  list  -a   --upgradable 

とすると、もしもアップデート可能なカーネルがあれば、そのように表示されます。例として下記の感じ。

一覧表示... 完了
linux-image-amd64/stable 4.9+80+deb9u7 amd64 [4.9+80+deb9u4 からアップグレード可]
linux-image-amd64/stable-security 4.9+80+deb9u6 amd64
linux-image-amd64/now 4.9+80+deb9u4 amd64 [インストール済み、4.9+80+deb9u7 にアップグレード可]

このように、アップグレード可などと表示がでますので、その場合は

# apt install linux-image-amd64

とすれば、新しいカーネルが入ります。




Sec-4. Guile

インストール先について
 一般的には、/usr/local 以下にインストールすると思います。大抵のフリーソフトでデフォルトの設定はそうなっています。
でも、個人的に私は /usr2/local/guile-2.2.5 etc,,etc, など、自分独自の場所にインストールしています。
デフォルトの設定で入れた時、メリットはヘッダーとかライブラリが必要な時(何かをコンパイルする時とか・・)、場所を指定しなくても良いので、楽です。
ディメリットは、色々入れていくと、何がなんだかわからなくなる。メンテできなくなることです。いっぱい入れると、どのファイルがどの関係だったかなんて、全然わからなくなります。
自分のディレクトリに入れるメリットは、メンテナンス性が良いこと。何か別のものを入れた時に上書きされたりしないこと。等です。
一方、ディメリットは、開発するときにいちいちヘッダーやライブラリの場所を指定しなくてはならないこと。ま、バータです。
複数の人間が一台のマシンを共用するなら、当然 prefix は /usr/local/ だと思います。
しかし私はかなり長年このやり方なので、このチャプターでも一貫してそれで説明しています。宅サバとか宅 UNIX で、ユーザは私一人なので、どうでも好きにしています。


Devuan 等での準備
以下のようにパッケージを入れます。おまじないと思って、とにかく入れます(笑)

# apt  install  libltdl-dev  libgmp3-dev  libunistring-dev  libgc-dev  libffi-dev  pkg-config


Slackware での準備
ありません。


コンパイル作業(Slackware Devuan 等共通)
以下のとおりです。普通のコンパイル。prefix は適当に決めています。

$ ./configure  --prefix=/usr2/local/guile-2.2.5
$ make
$ make install



コンパイル後の作業(Slackware Devuan 等で多少の違い・・)
prefix を自分独自にしている関係で、ダイナミックリンクライブラリのパスを指定して # ldconfig -v やる必要があります。
Slackware では /etc/ld.so.conf というファイルの中にダイナミックリンクライブラリのパスを書き込みます。
Devuan では /etc/ld.so.conf.d/ の中にパスを指定したファイルを入れます。
それらを ldconfig が読んで、/etc/ld.so.cache ってキャシュファイルを作ってるようです。きっとこれ、カーネルロード時に読み込んでますね。
で、必要なファイルを作ります。

Slackware の場合
# emacs /etc/ld.so.conf
(以下、一行次の行を加える)
/usr2/local/guile-2.2.5/lib
(以下、セーブ)

Devuan 等の場合
# emacs /etc/ld.so.conf.d/hogehoge.conf
(以下、ファイル中に次のように書く)
/usr2/local/guile-2.2.5/lib
(以下、セーブ)

この後、# ldconfig -v やると、キャッシュが更新されて、guile のダイナミックリンクライブラリが使える状態になります。
prefix にデフォルト値(/usr/local) 使ってたら、きっと # ldconfig -v だけですみそうです。




Sec-5. Lua

Devuan 等での準備
libreadline-dev をインストールします。

# apt install libreadline-dev

Slackware での準備
ありません。

コンパイル作業(Slackware Devuan 等で共通)
configure でインストール先(prefix)を指定できないので、コンパイルする前に makefile を編集します。prefix のところを修正して、自分の好きな場所に指定します。後は、以下のようにコンパイルするだけです。

$ make linux MYLIBS=-ltermcap
$ make install

これで Lua が問題なく使えるようになります。


補足です
Lua をC言語組み込みではなく、スタンドアロンのプログラミング言語として使うときの話です。
C で作った関数をシェアードライブラリ化して、Lua から読める(使えるように)するなら、Lua をコンパイルするときのコンパイルオプション、少し工夫したほうが良いです。
例えばインストールする Lua が 5.3.5 だとします。ソースを展開します。ディレクトリの中をチェックします。
デフォルトでは lua-5.3.5/src/Makefile のコンパイルオプションが
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)
となっています。これを
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS) -fPIC
としてください。(あるいは、MYCFLAGS = -fPIC としてください)
こうすることで、liblua.a 内のオブジェクトファイルと自分が作った関数のオブジェクトファイルがシェアードライブラリとして合体できるようになります。
これをやっておかないと、スタンドアロンの Lua インタプリタ実行時にC言語の関数を呼べません。