インフラエンジニアが今より深くLinuxを理解する方法


インフラエンジニアの方でLinuxを触っている方は多いと思いますが、みなさんどの様に勉強されてますか?お仕事で使うのはRHEL系のディストリビューション(RedHatEnterpriseLinux, CentOS等)が多いと思いますが、たまにubuntu触ったりすると使い方が解らなくて困ってたりしませんか?

この記事ではどんなディストリビューションでも容易に扱うことができるようになる為にもっと深くLinuxを勉強する方法を紹介します。



Linuxとは何か?


Linuxのディレクトリ構造の基本はFHS

みなさんFHSってご存知ですか?

FHSはFilesystem Hierarchy Standard(ファイルシステム ヒエラルキー スタンダード)の略です。日本語で言うとファイルシステム 階層 標準 というところでしょうか。要するにディレクトリ構造の標準を定めている決まりごとです。
現在主流のLinuxディストリビューションは基本的にこのFHSに従ってディレクトリ構造を決めています。

最新のFHSのバージョンは3.0で以下サイトで公開されています。

http://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html

英語で分かりにくいという方はWikipediaのページに概略が載ってます。

https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

このディレクトリ構造を把握しておけば基本的にどのディストリビューションでも、どこにどんなファイルが有るのかが判ります。
知っていることが大事です。主要なディレクトリ意外は記憶しなくて良いのでFHSという物が存在することを知っておきましょう。

Linuxの起動システムの基本はSystemVからsystemdへ

現在のLinuxの起動システムの主流はほとんどのディストリビューションでsystemdです。ですので基本的にsystemdを知っていれば問題は無い・・・のですが、よくインフラエンジニアの仕事であるのが、古いシステムのリプレースで旧システムのOSの情報を調べなきゃならないなんて案件です。RHELでSystemV(SysV)が使われていたのはRHEL5迄なので、まだそういう仕事は残っているんじゃないでしょうか。

SysVには大変古い歴史があります。初期のUnixシステムから続いてきたものです。現在のLinuxではsystemdが主流となっていますが、今現在も多くのUnixではSystemVが使われていたりします。

SysVはsystemd程洗練されてはいませんが、それだけシンプルに動きます。つまりLinuxはどういう仕組みで動いているのかsystemdよりも判りやすいと思います。

ですので、systemdだけ知っているのではなく、SystemVも勉強しておいた方が良いです。混同するのはよくありませんが、知っていると仕事の幅が圧倒的に広がります。

カーネルの再構築は一度でいいから経験しておくべき

Linuxのインフラエンジニアで詳しい方でも意外とやった事がない人が多いのがカーネルコンパイルです。現在のディストリビューションではまず経験することは無いと思います。実質的に業務使用しているサーバでやる必要性は全く無いです。

ですがやった事が有るのと無いのとでは知識は雲泥の差です。Linuxのカーネルにはどの様な設定項目があるのかを知り、また再構築するのにどれぐらいの時間がかかるのかを知っておくのも重要な経験だと思います。「カーネルを再構築した事がある」というのはどこか自身の根底で自信になります。一度でいいから経験しておきましょう。

Linux Systemを作ろう


ここまでの項目は前置きです。ここからが本題です。

ちょっと冗長な説明になりますが、知らない人の為にここからは少々クドい感じに説明します。

Linuxと言うのは2つの意味があります。「狭義のLinux」と「広義のLinux」です。

「狭義のLinux」とはLinuxカーネルそのものを指します。
「広義のLinux」とはLinuxカーネルを使ったシステムの事を指します。

RHELやubuntuを「Linux」と読んでいるのは「広義のLinux」の事です。

「広義のLinux」つまりLinuxの「ディストリビューション」の事ですが、この「ディストリビューション」というのは何かご存知でしょうか。この「広義のLinux」を配布する形態の事を「ディストリビューション」と言います。何を配布しているのかは前述した通り「広義のLinux」です。つまりLinuxシステムです。

「ディストリビューション」には沢山の種類があります。RHELやCentOS、debianやubuntuやsuseやslackware等々、ものすごい種類があります。ではなんでたくさんの種類があるのでしょうか?

答えはLinuxカーネル以外のソフトウェア構成がそれぞれ違うからです。Linuxカーネルなのはどのディストリビューションでも同じですが、それ以外は違います。違う理由は思想や安定性や用途等さまざまです。求める機能によって必要な人が必要な物を使って構築したLinuxシステムを他の人にも使って貰うために配布しているのが「ディストリビューション」です。

Linuxのシステムは自分の作りたいように作ることができます。それを配布するかどうかはまた別の話ですが、Linuxカーネルと各ソフトウェアのソースコードをコンパイルして作り上げる事が出来るのです。そうやって世界中の人が自分の好きなソフトウェアを組み合わせて作っているのが「広義のLinux」というわけです。それを配布しているのが「ディストリビューション」です。

いくら自由に作れると言ってもそれぞれが自由に作ってしまうとソフトウェアの作者が互換性を保てなくなるので困ります。昔は/etcの中に実行ファイルがあるディストリビューションもありました。本当にカオスだったのです。
そこである程度の決まりというか目安に沿って作りましょうという事になりました。それがFHSです。基本的にディストリビューションを作成する時はこのディレクトリ構成にしましょう、という決まりを策定しました。これで今のような安定したLinuxディストリビューションが乱発する違った意味でカオスな状態になったのです。

ここまで言えばもう判ると思いますが、もっと深くLinuxの仕組みを理解したいのであれば、ソースコードから自分の好きな構成でLinuxシステムを作るべきです。

これをディストリビューションと言っていいのかいまだに謎ですが、ゼロからLinuxを構築できるディストリビューションがあります。それが「LFS」です。

LFS(Linux From Scratch)は文字通りLinuxをスクラッチから作るディストリビューションです。カーネルから何から全てソースコードで配布されており、それを必要なものを選んで全て自分自身でコンパイルして作るディストリビューションです。

この「LFS」で一回でいいのでLinuxシステムを作るだけでLinuxの知識量は他のエンジニアと圧倒的に差がつきます。大人と子供と言うより人間と犬ぐらい違います。それぐらいLFSでシステムを作る経験というのは物凄く良い経験になります。もしこれから先もずっとインフラエンジニアで食べて行きたいのであれば、絶対にやっておいた方がいいです。

LFSの始め方


ソースコードからシステムを作ると言ってもいきなりソースコードを渡されて好きなようにコンパイルしろって事じゃありません。ちゃんとLFSにはシステムを構築するための手引書と言える物が用意されています。それが「LFSブック」です。LFSというディストリビューションはこの「LFSブック」が全てと言っていいと思います。この「LFSブック」の通りに作っていけば出来上がります。

LFS公式

LFS Book(英語)

LFSブック(日本語訳)

あとはこのLFSブック通りに進めていくだけなのですが、一つ問題があります。それがLFSを構築するPCです。LFSを構築するのは1日では終わりません。PCを1台しか持っていない方は今使用されているPCで構築してしまうと構築が終わるまでPCを使うことができなくなります。

そこでLinuxの勉強の為にLFSを構築するという前提で、仮想環境でLFSを構築することをお勧めします。実機よりもコンパイルの速度が遅いため、構築するのに期間はかかりますが、空いた時間にVMを立ち上げて作って行くことが出来ますし、コンパイル中に他のことができますので勉強にはもってこいです。

これから始める人にお勧めする方法がもう一つあって、秋葉原等で古いノートパソコンを買ってきてそこでLFSを構築する事です。できれば64bitの複数コアのノートPCが良いです。古いジャンクのメモリを最大限に積んであげれば立派なLinuxPCにすることが出来ます。お勧めするのはThinkpadシリーズです。堅牢ですしユーザが分解交換出来るように作られてるので古いPCでもパーツが手に入りやすいです。

まとめ

普通にLinuxを使用しているだけであればLFSをやる必要はありません。でもインフラエンジニアとしてLinuxに携わっていくのであればやっておいて損はありません。

LFSブックはとてもわかり易く解説されているので、Linuxのコマンドが判っている人間であれば簡単に読み進めていくことが出来ます。構築に時間がかかるだけでそこまでハードルは高くないので、是非やってみてください。