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

 Postfix、Apache、guile、lua 等について自前でソースからコンパイルしてみます。
以下に、OS 別に順に記述します。
Apache、guile、lua については、すこしクセのある場所にインストールします。これはシステムがアップデート等したときに、上書きされないようにするためです。そのために、システムが見ることのないディレクトリを作ってこれを利用しています。
ご自分のマシンでやるときは、お好きな場所に変更してください。
postfix はディストリのアップデートに怯えながら(笑)、ごく普通の標準的ディレクトリに収容します。

Sec-1.Slackware
Sec-2.Debian 系 (Debian, Ubuntu, Devuan, MXlinux, antiX, LinuxMint、KDEneon、Kubuntu etc)
Sec-3.CentOS
Sec-4.Manjaro、ArcoLinux
Sec-5.Mageia
Sec-6.openSUSE (tw)


Sec-1. Slackware

(1)----- Postfix -----

(準備)
何もありません。

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

コンパイル・インストール作業です

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

(インストール後の作業)

 インストールが終わったら、/etc/postfix/main.cf を自分の環境に合わせて編集するのと、/etc/aliases (Slackware は /etc/mail/aliases がファイル実体で /etc/alisess にリンクしておく) を編集して、自分のドメインに合わせます。
作業後は、# newaliases やってデータベース(/etc/aliases.db)を更新します。




(2)----- Apache -----

(準備)

pcre をインストールします。
入れる場所は、/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

(コンパイル・インストール作業)

インストール先は /usr2/local/apache2/ にします。
コンパイル・インストール作業です
apr 関係のソースも同時に入れておきます。

$ cd /usr2/lib
$ tar xf /usr2/src/httpd-2.4.41.tar.gz
$ cd httpd-2.4.41/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

(インストール後の作業)

httpd.conf を編集して、動作確認します。


(3)----- guile -----

(準備)

何もありません。

(コンパイル・インストール作業)

インストール先は、とりあえず /usr2/local/guile-2.2.6 とします。
作業は以下のとおりです。

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

(インストール後の作業)

prefix を自分独自にしている関係で、ダイナミックリンクライブラリのパスを指定して # ldconfig -v やる必要があります。
Slackware では /etc/ld.so.conf というファイルの中にダイナミックリンクライブラリのパスを書き込みます。
今回のインストールの場合だと、/usr2/local/guile-2.2.6/lib です。


(4)----- Lua -----

(準備)

configure がないので、Makefileを編集して、好きなディレクトリに入れるようにします。
また、src/Makefile を編集して、

MYCFLAGS=ーfPIC

を定義しておきます。これは Lua のライブラリをシェアードオブジェクトと結合できるようにしておくためです。

(コンパイル・インストール作業)

$ make linux MYLIBS=ーltermcap
$ make install

(インストール後の作業)

何もありません。


(5)----- Linux Kernel -----

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

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

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


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

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

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

非UEFI環境(BIOS互換モード)
カーネルのソースを展開し、例えば /usr/src/linux-4.4.185/ 等となります。
/usr/src/ に入って、# ln -s linux-4.4.185 linux とします。その後、/usr/src/linux/ の中にこれまで使った.config をコピーして入れます。
または、make menuconfig やって .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/ の中の 「Linuxカーネル再構築」

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

Slackware の場合、アップデートが割合と頻繁にありますので、実は自分でコンパイルする必要性は薄いです。




Sec-2. Debian 系 (Debian, Ubuntu, Devuan, MXlinux, antiX, LinuxMint、KDEneon、Kubuntu etc)

Debian 系で上記にあげたディストリは、ほとんど、または全く同じだったと思います。

(1)----- Postfix -----

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

# apt install libdb-dev m4

(コンパイル・インストール作業)

Slackware の場合と同じです。

(インストール後の作業)

 基本的にSlackwareの場合と同じです。
ディストリによっては、/usr/lib/senemail を /usr/sbin/sendmail へのリンクにしておきます。(リンクになっていなかったら)
また、別のメルサバ(exim4 等)が動いている場合は、Postfix の動作確認する前に止めておきます。

動作確認するとき、mail コマンドが入っていないことがあります。GNUのソース(mailutils-3.7.tar.gz 等)を持ってきて自分でコンパイル・インストールするか、あるいはパッケージに mailutils というのがあれば、これをインストールします。
ただし、ディストリによっては postfix まで同時に入れる場合があります。そうなると自分でコンパイル・インストールしたものを上書きされそうです。要注意です。
なるべく、mail コマンドは、もしも入ってなければ自分でソースからコンパイルしたほうが無難です。

(2)----- Apache -----

(準備)

いくつかのパッケージをインストールします。

# apt install libapr1-dev libaprutil1-dev libpcre3-dev libssl-dev

(コンパイル・インストール作業)

基本的に Slackware の場合と同じです。

(インストール後の作業)

基本的に Slackware の場合と同じです。


(3)----- guile -----

(準備)

 以下のように、いくつかのパッケージをインストールします。

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

(コンパイル・インストール作業)

基本的に Slackware と同じです。

(インストール後の作業)

やはり Slackware 同様にシェアードオブジェクトの所在をOSに登録する必要があります。
たいてい、/etc/ld.so.conf.d/ ディレクトリの中にライブラリの場所を書いたファイルを入れます。後は ldconfig やるだけ。


(4)----- Lua -----

(準備)

 libreadline-dev パッケージをインストールします。
その他は、Slackware と同じです。

(コンパイル・インストール作業)

基本的に Slackware と同じです。

(インストール後の作業)

何もありません。


(5)----- Linux Kernel -----

 カーネルコンパイルについては、Debian 及び Debian の直系(Devuan、MXLinux、antiX)だけを対象としています。Ubuntu 系は LTS カーネルじゃなくて既にディスコンのカーネルを Ubuntu が独自にアップデートしています。なので Ubuntu 系について自分でカーネルコンパイルすることは無いと思います。

準備として、まずカーネルをコンパイルするのに必要なパッケージを入れます。4.19 系列だと下のとおりです。
もちろん、make、gcc、g++ などは入っていると仮定しています。

# apt install libncurses-dev bison flex autoconf autoconf2.64 libssl-dev libelf-dev

4.9 系列だと libncurses-dev と libssl-dev だけで良かったように思いますが、もしも不足していたら上記のように入れてください。少しくらい余分に入れても、害はありません。

コンパイル作業自体は、4.9.x 系列のカーネルを使っているディストリ(Devuan, antiX )の場合は、Slackware の BIOS 互換モードのところと同じです。
また、4.19.x 系列のカーネルを使っているディストリ(Debian, MXLinux) の場合は、初回のみ、.config ファイルについて、以下の2行を修正してからコンパイルします。
二度目からは、この修正しなくても良いです。

CONFIG_SYSTEM_TRUSTED_KEYS=""    (8254行目付近、""の中を空にする)
# CONFIG_MODULE_SIG         (854行目付近、コメントアウトする)

以下、コンパイルは Slackware の BIOS 互換モードのところと同じです。

なお、公開サーバではメンテナンス番号の新しいカーネルを入れることが、セキュリティ上、重要だと思います。なるべくなら、自分でコンパイル・インストールすることが望ましいと思います。(そのほうが早くフィックスに対応できる)

一方で、LAN内部で使うものなら、

# apt update
# apt upgrade

だけで良いと思います。つまりカーネルのアップはディストリまかせにします。

補足:(2020-06-17)最近、気のせいかもしれませんが、Debian のカーネルアップが割合と頻繁にあるようです。もう、自前でコンパイルしなくても良いかもしれない・・・・です。




Sec-3. CentOS

 どちらかと言うと業務用の色彩が強い CentOS で、その正反対に Geek っぽくやってみました。使ったのは CentOS 8.1 です。

(2020-05-29)
 最初にこのセクションアップしたときは、コンパイルに必要な開発用パッケージを見つけられなくて、かなり力技的な強引なやりかたでやりました(汗)。
その後、必要な開発用パッケージを見つけて、前よりも簡単にコンパイル出来るようになったので修正しました。


(1)----- Postfix -----

(準備)
postfix は 3.4.10, 3.5.2 等が対象です。
準備として以下のパッケージをインストールします。

# dnf install libdb-devel
# dnf --enablerepo=PowerTools install libnsl2-devel
最初にこの Sec-3. アップしたときは、あらかじめ libnsl2-devel-1.2.0-2.20180605git4a062cf.el8.x86_64.rpm を取ってきました。前は、そんな書き方でした。
でも、dnf コマンドが自動的に取ってくるので、あらかじめダウンロードしておく必要はなかったです(汗)。失礼しました。

(コンパイル・インストール作業)
基本的に、Slackware と同じです。

(インストール後の作業)
特に他のディストリと変わりません。
mailx package を入れれば mail コマンドが使えます


(2)----- Apache -----

(準備)
あらかじめいくつかのパッケージを入れておきます。

# dnf install apr-devel  apr-util-devel pcre-devel openssl-devel

準備は、これだけです。

(コンパイル・インストール作業)
Apache のソースだけを展開し(apr, apr-utilのソース展開は不要。pcre の事前インストールも不要です)

$ ./configure --prefix=hogehoge
$ make
$ make install

これだけです。簡単です。

(インストール後の作業)
Slackware と同じです。
無事に https に対応した apache-2.4.43 が動きます。


(3)----- guile -----

(準備)
あらかじめ以下のパッケージをインストールします。

# dnf install libtool-ltdl-devel  gmp-devel  libffi-devel
# dnf --enablerepo=PowerTools install libunistring-devel  gc-devel

準備はこれだけです。

(コンパイル・インストール作業)
Slackware と同じです。

(インストール後の作業)
Slackware と同じです。
無事に guile-3.0.2 が動きます。


(4)----- Lua -----

(準備)
簡単な準備です。

# dnf install readline-devel

これで普通にコンパイル出来ます。

(コンパイル・インストール作業)
Slackware と同じです。

(インストール後の作業)
何も作業はありません。無事に lua-5.3.5 が動きます。


(5)----- Linux Kernel -----

CentOS の場合、kernel 4.18.x ってちょっと変わったバージョンを使っています。もう、とっくにディスコン。
要するに redhat 社で独自にサポートしてるわけですね。なので、セキュリティフィックス・バグフィックスのソースが出回ることは、基本的にありません。
自前のコンパイルは、ヤメです。無理。(笑)


---- 以上 -----
以上です。なんとか全て、無事にコンパイルして動かすことが出来ました。




Sec-4. Manjaro、ArcoLinux

 この2つは、最新のソフトウェアを使うようにアップデートがなされます。ものすごく積極的にアップデートし続けるディストリです。Arch 系の特色らしくて、素晴らしいです。(アップデートしすぎることで困る点もありますが・・・)
これなら、カーネル及び言語処理系は自分でコンパイルしなくても、ディストリの用意したもので良いと思います。
サーバソフトも普通にディストリの環境をそのまま利用するなら、以下の作業は不要です。
ただし、私はサーバソフトのみ自分でコンパイルします。

(1)----- Postfix -----

(準備)
 /usr/include/resolv.h を修正する必要があります。他の多くのディストリにある3つの定義がこのディストリでは欠けています。なので、書き込みます。
幸い、単なる定義値なのでライブラリの追加は不要です。以下の3行を 135 行目付近に挿入しセーブします。

#define RES_INSECURE1   0x00000400
#define RES_INSECURE2   0x00000800
#define RES_USE_INET6   __glibc_macro_warning ("RES_USE_INET6 is deprecated") 0x00002000

準備はこれだけです。

(コンパイル・インストール作業)
いつものとおりのコンパイル・インストールです。ソース展開したディレクトリで以下のように make します。

$ make -f Makefile.init makefiles
$ make
# make install  

(インストール後の作業)

/etc/postfix/main.cf を編集することと、/etc/aliases ファイルを作り # newaliases やってデータベースファイルを作ります。それだけです。

なお、Manjaro は mail コマンドを持っていますが、ArcoLinux は mail コマンドを使うなら自分でインストールする必要があります。

# pacman -S mailutils  s-nail

これで mail コマンドが使えるようになります。この後、あらかじめ /var/spool/mail/ ディレクトリにユーザ名の空ファイルを作っておいたほうが、便利だと思います。

# cd /var/spool/mail
# touch user-name
# chown user-name.user-name user-name

これでいきなり mail コマンドやってメールの有無をチェックしてもエラーが出なくなります。


(2)----- Apache -----

(準備)

ssl の関係は2つのディストリとも、あらかじめ入っています。Manjaro は apr、apr-util、pcre もあらかじめ入っています。
ArcoLinux は apr、apr-util、pcre が入っていないので、インストールします。

# pacman -S apr  apr-util  pcre (これは ArcoLinux のみ)

(コンパイル・インストール作業)

Apache のソースのみを展開し、コンパイル・インストールします。

$ ./configure --prefix=hogehoge
$ make  
# (or $) make install

(インストール後の作業)

httpd.conf を編集後にアパッチを起動します。htdocs/index.html をそのままにしておいてブラウザでローカルホストを見れば「it works!」と表示されます。


(3)----- Lua、Guile -----

特に説明しませんが、もしも仮に自分でコンパイルする場合、本当に何も準備不要です。ソースを展開して make 一発で簡単に作れます。


 今回、始めて Arch 系を使ってみました。すごく Geek 向けに作られたディストリだと感じました。ほとんどのフリーソフトウェアがパッケージ等入れなくても、make 一発で作れます。CentOS が業務向けに作られた印象なのと対象的です。まるで Geek が Geek のために作ったディストリです(笑)。
ArcoLinux も良いですが、特に Manjaro が好印象でした。

Manjaro の補足
 2020年11月にインストールしてみたら、以下のパッケージがデフォルトでは入っていませんでした。もしコンパイルするなら、入れる必要があります。
m4、pkg-config、apr、apr-util
どうやら、ローリングリリースのスナップショットと言っても、インストールする時期によって含まれるパッケージに多少の差があるようです。




Sec-5. Mageia

 パッケージは rpm で RedHat、CentOS 風ですが、系統としては Mandriva 系らしいです。
なお、このディストリはマメにカーネルアップしてるようです。自前のカーネル・コンパイルはしません。ディストリ任せで良さそうです。
また、サーバソフト類や開発系も割合と新しいです。なので、やりたい人や必要のある人がコンパイルします。
コンパイルの必要が無ければ、パッケージ使えばオケです(笑)。

(1)----- Postfix -----

(準備)
あらかじめいくつかのパッケージを入れておきます。

# urpmi --i lib64db4.8-devel  m4

(コンパイル・インストール作業)
以下のとおりです。

$ make -f Makefile.init makefiles
$ make  
# make install

(インストール後の作業)
適宜、/etc/postfix/main.cf を編集。また /etc/aliases を編集し、# newaliases コマンドを入れます。
これで LAN 内でも DMZ のサーバでもイケます。


(2)----- Apache -----

(準備)
あらかじめいくつかのパッケージを入れておきます。

# urpmi --i apr-devel apr-util-devel pcre-devel

(コンパイル・インストール作業)
Apache のソースだけを展開し(apr, apr-utilのソース展開は不要。pcre の事前インストールも不要です)

$ ./configure --prefix=hogehoge
$ make
$ make install (または # make install )

これだけです。簡単です。

(インストール後の作業)
Slackware と同じです。
無事に https に対応した apache-2.4.43 が動きます。


(3)----- guile -----

(準備)
あらかじめ以下のパッケージをインストールします。

# urpmi --i  lib64ltdl-devel lib64gmp-devel lib64unistring-devel lib64ffi-devel lib64gc-devel

(コンパイル・インストール作業)

$ ./configure --prefix=hoge
$ make  
$ make install (または# make install)

(インストール後の作業)
Slackware と同じです。
無事に guile-3.0.2 が動きます。


(4)----- Lua -----

(準備)
簡単な準備です。

# urpmi --i lib64readline-devel

また、./configure が無いので、Makefile を編集し、インストール先を決めます。また、src/Makefile の中の MYCFLAGS = -fPIC をやっておきます。

(コンパイル・インストール作業)

$ make linux MYLIBS=-ltermcap
$ make install (または # make install )

(インストール後の作業)
何も作業はありません。無事に lua-5.3.5 が動きます。


割合と、すんなりと全部コンパイル出来ます。良い感じです。

---- 以上 -----




Sec-6. openSUSE (tw)

 コンパイルするために必要なパッケージは、以下のとおりです。

(lua)
# zypper install readline-devel

(apache)
# zypper install libopenssl-devel apr-devel apr-util-devel pcre-devel

(postfix)
# zypper install gcc-c++ libdb-4_8-devel m4 libnsl-devel

(guile)
# zypper install libtool gmp-devel libunistring-devel libffi-devel gc-devel

なお、コンパイルの際、以下の点が他のディストリと少々異なっています。
まず、postfix をコンパイルする際、最初の make は

$ make -f Makefile.init makfiles  AUXLIBS="-lnsl"

とします。これは、本来なら nsl2 の開発パッケージが必要なのです。しかし openSUSE にはそれがないので、nsl2 でなく nsl で間に合わせるためです。
また lua のコンパイルは

$ make linux

です。make linux MYLIBS=-ltermcap ではありません。
その他の点は他のディストリと同じです。