達人が語る、インフラエンジニアの心得

第5回エンジニアとしてやっていくための勉強法

これまでは、もうエンジニアになっているケースでの心得について書いてきましたが、前回の「エンジニア不足を解消しよう」からの流れとして、インフラエンジニアになるにはなにを学べばいいのか、という点に焦点を当ててみたいと思います。

もちろん以前に書いたように、トラブルが一番成長の糧になるのは間違いないのですが、ただ必要最低限のスキルというか体力が必要なのもまた事実です。まったく何もカケラも知らない状態では、トラブルに遭遇しても成長も何もなく、もしかしたらトラウマだけが残るかもしれません。

ステップ1:OSインストール

筆者が、まず最初にやると良いと思うのは(おもにUNIX系の)OSインストールです。

はあ?と思うかもしれませんが、OSインストールにはシステム管理のツボとも言うべきものが多く含まれています。そのためには、OSを入れて「できた」と思うのではなく、何度もいろいろなパターンでOSインストールしてみることが大事です。

最初はあまり何もわからないので、推奨設定のまま進んで、とりあえずOSが起動するだけでも十分だと思います。そのときは、IPもDHCPからもらっていて、各種ソフトウェアも標準で推奨されるものがインストール、起動設定され、HDDのパーティションも典型的なものになっていることでしょう。

そしてうまく起動までこぎつけたら、それで満足せず、いろいろなことを試してみてください。いろいろいじってうまくいかなくても誰も困らない、というかそもそもそれが勉強なので、臆せずチャレンジしてみてほしいと思います。

繰り返しになりますが、OSインストールには実にいろいろな要素が入っています。staticにIPを振るのであれば、IPアドレスの体系やnetmask、broadcast、network adressやdefault routeなどの知識が必要です。それに各種ソフトウェアについても、各カテゴリを全部、端から端まで見てみると、それだけで数百(数千?)のソフトウェアの存在を知ることができます。

これを何度も繰り返していると、それまでは特に気にとめていなかった設定項目についても「そういえば何故これはこうなんだ?」といった疑問を持つようになると思います。筆者がnewbie(初心者)のころは、Linuxはあまり普及していなかった、というか業務で使われることはなかったので、SunOSやSolarisのインストールばかりしていましたが、そこからもいろいろなことを学びました。

少なくとも10回くらいは(できればもっと)OSインストールはしてみるといいと思います。また、いまはほとんどLinux(クライアントだとUbuntuでしょうが、サーバだとだいたいCentOS)だと思いますが、せっかくなのでFreeBSDやOpenSolarisなども試してみると良いかもしれません。複数のOSを知り、比較することでわかることもあるものです。

ステップ2:ネットワークの基礎

次にチャレンジして欲しいのは、ネットワークの基礎知識です。インフラというかサーバ管理者の勉強というのは、基本実践が一番だと思いますが、ネットワークだけは必要最低限、理屈を知っていたほうが良いです。とはいっても、Etherパケットを読めるようになれ、とかそこまではいらないので、いわゆるOSI 7層で言うところの2、3、4層あたりについて、一通りの概要がわかるくらいで良いと思います。IPアドレスとはなにか、Macアドレスとはなにか、なんでわかれているのか、ルーティングとは、サブネットとブロードキャストドメインとは、TCPとUDPとは、ICMPとは、MTUとは、あとそもそもレイヤーという考え方とは、くらいで十分でしょう(いま思いついていないだけで、もっとあるかもしれませんが⁠⁠。

正直、ダイナミックルーティングはこの時点ではあまりいらないでしょう。ネットワークの勉強を実践で試すには、マシンが複数あると良いですが、そうもいかないケースも多いので、まあそれは可能な範囲でという感じです。

ステップ3:OSSのインストール/セットアップ

次はやはり各種ソフトウェアです。それも、オープンソースのものですね。OSインストールを何回もやるのは基礎体力をつけるようなものですが、OSSをいろいろ試すのは応用体力を付けるようなものです。

そしてそのときは、かならずソースからmakeするようにしましょう。こういうことを書くと「MySQLはバイナリのほうがパフォーマンスが出る」とか「FreeBSDのportsはすばらしい文化だ」とか「yumはシステム管理のひとつだ」とか言われる気がしますが、いま話しているのはどう各種アプリケーションを管理するかの方針について議論したいのではなくて、⁠サーバエンジニアとして基礎的なものを学ぶには何をするのがいいか」です。

それには、configureしてmakeしたりxmkmfしたりとか(これはあまりしないか…⁠⁠、Makefileを手直ししたり、ヘッダファイルを直したりとか、ldconfigを使えるようになったり、.aと.soってなによ、っていう疑問を持ったりとか、そういう試行錯誤が重要で、それらの過程で体力が付いていくものだと思います。

まあ筆者くらい年寄りになると「昔はconfigureなんてなかったんだ。そもそもMakefileは」とか言う人もいるかと思いますが、configureくらいは別にいいじゃん、と思います。ただ、configureのオプションは必ず全部見るようにしましょう。オプションなしでだいたいOKなものも結構ありますが、ApacheやMySQLなどのサーバ系ソフトはconfigureのオプションを使いこなせることが必須です。学習過程では使いこなせる必要はないですが、⁠なんでこういうオプションがあるんだろう」と思うことが重要です。

また、メンテナがたくさんいるメジャーなソフトはだいたい一発でうまくいきますが、マイナーなものやメンテされてないものはconfigure && makeではうまくいかないケースもままあります。よくあるところでは、djb系だとerror.hを修正しないとmakeできなかったりします(そもそもconfigureがないですが⁠⁠。

そういう問題に遭遇して解決していくうちに、応用的な体力が付いていきます。今はどの関数がどのライブラリに入ってるか知らないと困るケースなどはほとんどないので、nmといったコマンドを使うケースはないと思いますが、lddはいまでもかなりの頻度で使うと思うので、ライブラリ関連の知識は多いに越したことはありません。

ステップ4:基本コマンドを実行する

その次にやると良いと思うのは、/bin、/usr/bin、/sbin、/usr/sbin以下のコマンドを片っ端から触ってみることです。

まあこの件とOSSインストールのどっちが先が良いかは順不同ですが。LinuxやUNIXには、実にいろいろなコマンドが入っています。/usr/localや/optに入れるものはサーバごとに違うでしょうが、/bin、/usr/bin、/sbin、/usr/sbin以下にあるものは大事なものばかりです。

いま筆者が原稿を書いているサーバで(筆者はMewで原稿を書くので)ためしてみたら、4000以上のコマンドがありました。まあ筆者も4000全部を知ってるわけではないですが、昔もっと少なかったころは片っ端からコマンドを試してみたものです。

もちろん/sbin以下を不用意に試してマシンが死ぬこともあるでしょうが、それもまた経験です。昔あった笑い話で/usr/bin/[というコマンドを、なにかのゴミファイルだと思って削除してシェルスクリプトが動かなくなったというネタがありますが、まあ実にいろいろなコマンドがあるものです。

ステップ5:設定ファイルの探訪

その次は、/etc以下をいろいろ探検してみましょう。

rc系のディレクトリがとくに面白いと思います。rc系のディレクトリ以下を見ていくと、OSがどういう順序で起動していくかが全部わかります。しょせんLinuxなんていうものは、initが起動してあとはinittabの内容に従って順にshell scriptが実行されているだけです。つまりrcから先を見れば、⁠どこで何が起こっているかが全部わかる」のです。

これが、サーバとしてはWindowsよりLinuxやUNIXのほうが良いと思われる要因のひとつではないでしょうか。なんたって全部plain textなファイルに仕組みが書いてあるんですから。

ほかにも/etc以下には、ld.so系とかcrontabとかresolve.confとかhostsとか面白いものがたくさんあります。全部が全部というわけではありませんが、基本「OSの設定は全部/etcにある」ので、ぜひ端から見てみましょう。


さて、ここまで書いてきたものは、全部「片っ端からやってみよう」系のものばかりでした。そして、サーバエンジニアとしてやっていくなら、どこかで一度はこの「片っ端から」をやってみるほうが良いでしょう。少しスキルが付いてきて、仕事を任されるようになってからでは、必要なことを追うのにいっぱいいっぱいで、なかなか片っ端からやる機会は得られません。ぜひnewbieのうちにやってみることをオススメします。

ステップ6:情報を集めるために押さえておきたいこと

次に身につけないといけないのは、情報収集のスキルです。

エンジニアとしての一歩を踏み出したら、身につけないといけない知識はもうそれこそ山のようにあります。それらをいかに効率的に調べることができるかも重要なスキルです。数えあげてみると、manを読む、--helpや-hでオプションを調べる、ソースを読む、stringsやgdbでダンプやバイナリファイルの中身を見る、tcpdumpでパケットを見る、strace(Linuxの場合)でシステムコールを見る、などがあります。

ここに挙げたものは、全部マシンの中から得られる情報ばかりです。それ以外の、もちろん重要なのは、⁠Google先生⁠と仲良くすることです。いまはネットにかなりの情報量があるので、書籍を山ほど買い込まなくても⁠Google先生⁠に聞くコツを知っていると、かなりの確率で答えを教えてくれます。

スキルが上がって任される範囲が広がると、英語力も必要にはなってきます。これは筆者の持論ですが、英語は必要なら身につくし、必要でなければ身につかないものです。⁠どうしたら英語が覚えられますか?」と聞かれたら、⁠覚えられないうちはまだ必要じゃないってことだよ」と答えます。

もちろん、いまは⁠Google先生⁠がいるから書籍が全然いらないということではありません。良書というのは成長を支えてくれるものです。ただ、昔はやはり書籍メインだったために、良書というか定番の書籍というのがあったものですが(筆者がnewbieだったころはなんといっても『SUNシステム管理』でした。あのころのアスキーは良書の山だった⁠⁠、今はあまり定番というのがないような気もします。せいぜいO'Reillyシリーズでしょうか。でもO'Reillyはリファレンスぽいものが多いので、取っ付きづらいですね。

あとは雑誌を購読するようにしましょう。昔(昔の話ばかりですみません)は、⁠UNIX Magazine』『UNIX USER』は外せないところでしたが、⁠UNIX USER』は廃刊だし、⁠UNIX Magazine』は正直、今はちょっと(以下自主規制…⁠⁠。

今はやっぱり、『Software Design』『WEB+DB PRESS』ではないですかね。これはgihyo.jpの連載だからそう書いているわけではなくて、実際いま筆者が購読しているのもこの2つだけです。⁠WEB+DB PRESS』はシステム管理とはちょっと違いますが…。やはり世の中に新しいものは随時出てきますので、こういったトレンドを追うのは重要だと思います。

いろいろ書いてみましたが、ここに挙げたことを一通りやると、サーバエンジニアとしてやっていく体力が付くのではないかな、と思います。

おすすめ記事

記事・ニュース一覧