Developer's Blog

助けて! サーバー(物理)が息してないの!

新規事業部の高田です。

社内でリポジトリサーバを運用していたりすることってありますよね。私もその一人です。

新規事業部内では wiki + CI (Jenkins) + Git repository (gitbucket) + テスト用DB (MySQL or Mroonga) + お助けツール が同居したローカルサーバー(物理)を運用していたりします。

先週末(2018-02-23)の定時後に、書いたコードを commit して push しようとしたらリポジトリサーバーに繋がらないんですね。数日前から時々繋がらないことがあって、適宜再起動していたのですが、遂に 音信不通 オフライン になってしまったので、そこからの生々しい奮闘記をお送りしようと思います。

兆候

サーバーの不調には兆候があったりなかったりします。晴れのち曇り、所により雨または雷雨、または雪みたいなことを言っていますが、冗談抜きでそんな感じです。

サーバーが死ぬときには大きく分けて「突然死」と「衰弱死」のようなパタンがありまして、今回は後者のパタンでした。とは言え、その兆候から症状にすぐ気づくということは常に死活に気を配っていたりしないと難しかったりするもので、私が今回復旧したサーバーのようなゆるふわ運用(転んでも泣かない)をしていたりすると困難を窮めたりします。

今回は、「サーバー内に立てている HTTP サーバー (nginx) のレスポンスが返ってこなかったり、gitbucket に git push しようとすると失敗することがある」なんてことがありましたが、それらも時々起こる程度で再現性が取れず、「あれ? 社内ネットワークの調子が悪いのかな?」ぐらいにしか思っていませんでした。

2018-02-23 18:03 (JST):あれ、繋がらないぞ?

どうやっても git push が失敗するので、 ssh で乗り込むことにしました。しかし、何度やっても port が反応しないと言われてしまいます。ping も打ってみますが、梨の礫。

「うーん、こりゃ困ったな」と渋々サーバルームに入っていき、管理しているサーバーにモニタとキーボードを繋いで直接再起動をしようと思ったら

「んんん!?」 

鯖死は突然に

形あるものはいずれ壊れる。当然、それが M/B 上のチップであったとしても。

私の今までの経験上、メーカー製の民生機をサーバー転用すると 1 年くらいで NIC がイカれたりする事があります。

何故死ぬのかは知らないですが、時々こういう事象に遭遇したりします。

 

そんなことよりも早く復旧させないと、安心しておうちに帰れないよ。

とりあえず復旧させよう

ログを見ていると tg3 driver で何かがあったようにも見えます。

カーネルレベルのバグも脳裏をよぎったのですが、同じカーネルで動作していた中からの鯖死なので、今回はその面での調査はしないことにしました。

半分思考停止状態のまま、再起動して boot 時に grub から一つ前のカーネルを選択して起動させてみる。

それでもダメなら更に一つ前……前……前……m(ry

って、どのカーネルでもあかんがな!!

仕方がないので、物理的な手段に出ることを決意します。

「すみません、NIC を分けてください」

物理的な修理しか思いつかない状況に陥ったため、情報システム部の人に物乞いをしに行きました。

「ジャンクで構わないんです。NIC を、NIC を分けてくれませんか……」

墓場ではなくサーバ室に出現する真夏の幽霊ならぬ冬場の幽霊が如く、フラフラっと助けを求めに行った所、幸いにも状態が良さそうな Intel 製の NIC を一枚譲っていただけることに。

いつも変なお願いばかりすみません。ありがとうございます。

ブラケットのサイズが合わない

マシンの PCI スロットは Low Profile PCI 。受け取った NIC のブラケットは標準の PCI スロットサイズ。

ジャンク部品のため、Low Profile PCI 用のブラケットはどこにもない。幸いにもボードのサイズは収まりそうなので、金属加工でブラケットを短くし、強引に捩じ込むことに。

???「えいえい、折れた?」 ???「折れてないよ」

???「えいえい、折れた?」 ???「折れてないよ」

周りに「あいつまた何か工作してるわ……」と奇異の目で見られながら加工をすすめるのであった。

挿したけど認識しない

電源を落として放電し、静電気に気をつけながらボードを増設。

突貫加工のブラケットも上手く収まり、マシンの電源を入れて boot してみた所、何故か新しい NIC が認識されない。

「せっかく加工までしたのに、ここで頓挫か」と挫折しかけたが、「ああ、そもそも Driver 入れてないからか」と気付く。

「仕方ないね、先ず apt-get update で……」と思いかけた所で

「って、 NIC 死んでるからネットワーク繋がってないんだって!」

無ければ作れ。先ずは build だ。

Intel のことだからきっと driver を公開しているはずだと期待して探してみると、運良くソースコードが見つかりました。

 ・Intel® Network Adapter Driver for PCIe* Intel® Gigabit Ethernet Network Connections Under Linux*

e1000e-*.tar.gz をダウンロードし、手元で展開。(今回は 3.4.0.2)

メインマシン障害が起きた時に借りていた USB 接続の HDD が未だに手元にあったのでこちらにソースコードを乗せて障害が起きているマシンに複写。

# これ、もし USB 経由でのデータのやり取りを制限するような何かが入ってたら確実に詰んでましたね

障害が起きたマシンには偶々 gcc が入っていたのでそのまま make 。

$ cd e1000e-3.4.0.2/src/
$ sudo make install
$ sudo modprobe -r e1000e
$ sudo modprobe e1000e

すかさず、modprobe でカーネルにモジュールを食わせます。

しかし、まだネットワークにはつながりませんでした。

ネットワーク設定を書き換える必要がありそうですが、その前にネットワークインターフェイスを確認しましょう。

$ sudo lshw -short -class network
H/W path         Device      Class       Description
====================================================
/0/100/1c.1/0    ens33       network     82574L Gigabit Network Connection
/0/100/1c.2/0    enp3s0      network     NetLink BCM57788 Gigabit Ethernet PCIe

BCM57788 は Broadcom 製のチップ名ですね。今回お亡くなりなのはこのチップ。82574L は Intel 製のチップ。どうやら ens33 が使いたいネットワークインターフェイスのようです。

これを何処かにメモして、 /etc/network/interfaces を書き換えます

$ sudo vi /etc/network/interfaces
# The secondary network interface
auto ens33
iface ens33 inet static
address (サーバ用の固定 IP)
netmask (ネットマスク)
gateway (デフォルトゲートウェイ)
dns-nameservers (社内の DNS サーバ)

これらの設定を入れて再起動したら、無事ネットワークに繋がるようになりました。

DKMS 対応

このままでも動いてはいるんですが、今後カーネルのバージョンが上がるとネットワークが不通になってしまいます。

折角なので、この driver を DKMS で組み込んでしまいましょう。

DKMS が入っていないので、早速復帰したネットワーク経由でインストールします。

$ sudo apt-get install dkms

インストールが終わったら、先ほどの e1000e のディレクトリを引っ越して、dkms.conf を作成します。

$ sudo mv e1000e-3.4.0.2 /usr/src/
$ sudo vi /usr/src/e1000e-3.4.0.2/dkms.conf
PACKAGE_NAME="e1000e"
PACKAGE_VERSION="3.4.0.2"
BUILT_MODULE_LOCATION=src
BUILT_MODULE_NAME[0]="e1000e"
DEST_MODULE_LOCATION[0]="/kernel/drivers/net/e1000e/"
AUTOINSTALL="yes"
MAKE[0]="BUILD_KERNEL=${kernelver} make -C src CFLAGS_EXTRA=-DDISABLE_PM"
CLEAN[0]="make -C src clean"
REMAKE_INITRD=yes

ここまで用意出来たら、DKMS で組込みます。

$ sudo dkms -m e1000e -v 3.4.0.2 add 
$ sudo dkms -m e1000e -v 3.4.0.2 build 
$ sudo dkms -m e1000e -v 3.4.0.2 install

これで今後は、カーネルを更新しても NIC の driver は自動で組み込まれていくはずです。

今回は都度々々で「うわ、詰んだかな」と思う場面が多数ありましたが、なんやかんやで乗り越えることが出来ました。

我々はデータ勝負なので、データを失うというのはかなりの痛手です。

何事も、壊れることを前提に最悪を想定して準備しておかないといけないですね。

ではでは。


フェンリルのオフィシャル Twitter アカウントでは、フェンリルプロダクトの最新情報などをつぶやいています。よろしければフォローしてください!

フェンリル採用チームの Twitter アカウントです。応募前のお問い合わせや、ちょっとした相談ごとなどお気軽にどうぞ!

Copyright © 2018 Fenrir Inc. All rights reserved.