気ままにインフラエンジニア

渋谷で働くインフラエンジニアの備忘録。 TwitterID: @nakashii_

ELRepoのspecを参考にkmod対応ドライバをビルドした話

Intelのigbドライバなんかは、tarballにspecが含まれていて

rpmbuild -ta ./SOURCES/igb-3.4.7.tar.gz

こんな感じですぐビルドできるステキな感じになっています。

が、これをやるとビルド時のkernelに依存するドライバができてしまうため、
エラッタでカーネルのアップデートが入った場合に既定のドライバに戻ってしまいます。

Redhat/CentOSには、KMP (Kernel Module Package)、kmodというカーネルに追従するための仕組みがあるので、これをやってみました。

KMP/kmodの仕組み自体はこちらのページがよくまとめていただいています。
http://d.hatena.ne.jp/dayflower/20090728/1248754899

KMP対応のモジュールをビルドするための手引きがCentOSの公式Wikiにあります。*1

http://wiki.centos.org/HowTos/BuildingKernelModules#head-b86b6eec08d5719cf1838929f26a64af88e2b7f0


で、手引きをもとに対応のためのいろいろな手順をやってみていたのですが、けっこう難しく苦戦していたところ以下のようなものがありました。
ELRepo
http://elrepo.org/
名前だけは知っていたのですがハードウェアに関するパッケージを提供するプロジェクトとのことで、上記のCentOSのWikiページを記述された方*2がfounderの一人になっていらっしゃるみたい。

ここにkmod対応版のigbやe1000eなど、各種のパッケージがあります。そのまま使えそうですが、勉強になるのでSRPMから再パッケージしてみました。

SRPMをインストールすると、こんな感じのファイルが展開されます。igbの場合、

SPECS/igb-kmod.spec
SOURCES/igb-X.X.X.tar.gz
SOURCES/kmodtool-igb-el6.sh

kmodtool-igb-el6.shがkmodのためのヘルパースクリプト。
詳細は割愛しますが、kmodtoolスクリプト中でProvidesなどの指定も行われています。私は以下の変更だけ入れてみました。

Provides:         ${kmod_name}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
Provides:         ${kmod_name}-kmod = %{?epoch:%{epoch}:}%{version}-%{release}
Obsoletes:        ${kmod_name}

上記のSRPMをそのままビルドするとkmod-igbというパッケージですが、この変更で既存のigbもkmod対応にyumが入れ替えてくれるようになりました。
めでたしめでたし。

ちなみにRHEL/CentOSのデフォルトのドライバは当然ながらkmodが使われています。igb-3.0.6_k-2.el6_1.src.rpmとかそのあたり。今回は見てないですが、そちらをベースに使ってもよさそう。

次はリビルドじゃなくて一からやってみたいなー。

*1:RedHat6の公式ドキュメントには見つからなかったのですが、関係あるとすればこのあたりでしょうか。 http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/ch-next-steps.html#sect-Driver_update_rpm_packages

*2:http://wiki.centos.org/AkemiYagi

PXE/kickstartによるネットワークインストール時にドライバを追加する

CentOS6.2の場合。オプションはほぼ5.x系でも同じ。

■ブート時に指定
http://docs.redhat.com/docs/ja-JP/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-startinginstall.html

boot: linux ks=hd:partition:/path/ks.cfg dd

この場合、ネットワーク上の場所は指定できないっぽい。

■ksファイルに記述
http://docs.redhat.com/docs/ja-JP/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-options.html

driverdisk (オプション)
    driverdisk <partition> --source=<url> --biospart=<biospart> [--type=<fstype>]

    別の方法として、ネットワークの場所をドライバーディスク用に指定できます。

    driverdisk --source=http://path/to/dd.img

■おまけ
追加したドライバやユーティリティがRHEL用とかでWARNINGが出る場合は、packagesセクションにignoremissingフラグを追加するとプロンプトを回避できます。
http://docs.redhat.com/docs/ja-JP/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-kickstart2-packageselection.html

%packages --ignoremissing

Zabbix 2.0.0 をインストール後にまずやっておいたこと

インストール手順は省略
主に2.0.0の新機能を早めに試したい人向け。

ディスカバリルールの設定

とりあえず下記のようにしてみて検証中。
設定->テンプレート->"Template OS Linux"のディスカバリルール
f:id:oopsops:20120529220339p:plain
Network Interface discovery

正規表現の項目を書き換え -> (eth[0-9])|(bond[0-9])

Mounted filesystem discovery

マクロの項目を書き換え -> {#FSNAME}
正規表現の項目を書き換え -> (^\/$)|(^\/data)

とはいえ、まだあまり検出が安定していないように感じること、ディスカバリルールによるアイテムは今のところホストスクリーンに登録できないので、eth0/eth1やディスク監視などは過去のテンプレート通りアイテムを作っておいたほうがよさそうです。

自動登録アクションの設定

設定->アクション->イベントソース:自動登録->アクションの作成
今のところホスト名でしか判断できないが、Zabbix Agentからアクティブ接続があったときに自動でホスト登録されるようになる。実質Agentをインストールするだけまで簡略化できる。
自動登録アクションは有効になっているものがすべて判定されるようなので、無条件でLinuxのテンプレートに入れた後、dbやmysqlのような文字列があるものには追加でMySQLのテンプレートを適用、のようなことができる。
条件を組み合わせるときはAND条件に注意。

ホストグループをマップに展開

◆設定->ネットワークマップの設定 でマップを作成
◆マップにアイコンを追加し、適当なホストグループを指定(マップの保存を忘れずに)
◆マップをお気に入りに登録(ダッシュボードからアクセス可能にしておく)
f:id:oopsops:20120529232342p:plain
テンプレートに紐付いたホストスクリーンという機能が使えるのだけど、障害時以外どこから見に行ったらいいかわからない不親切仕様。なので、暫定策として適当なホストグループをマップに展開させておく。せっかく集めたトレンドデータを見てサーバーの調整をするなら、個別のサーバーの情報へはせめてダッシュボードから2クリック以内(かつキー入力なし等)で行けないとキツイ。何かパッチを作ったほうがよさそう。

いくつかのアイテムの追加

◆Disk read/write の取得
あまり必要のないトリガーやアイテムが省かれたのはいいと思う。が、なぜかディスク関連も省かれてしまった。
最低限 vfs.dev.read[,ops]、vfs.dev.write[,ops] あたりは追加が必要。

◆ZabbixServerのアイテム数の取得
"Template App Zabbix Server" に zabbix[items] を追加しておく。
これとDisk、MySQLのグラフを合わせれば、どのくらいのアイテム数でどのくらいの負荷になるか後々の参考に。

LDAPの設定

f:id:oopsops:20120529233444p:plain
LDAPでユーザー管理するために管理->認証の認証方式を変更する。
LDAPサーバーに接続できない時のため、管理者グループ(Zabbix Local Administrators等)を作成して、グループの認証方式をZabbixのローカル認証に変更し、Adminをそちらに移しておく。ビルトインのZabbix Administratorsはシステムデフォルト固定のよう。

LinuxサーバーにSSDを使うための情報メモ

Trim周りが最近どうなっているのか調べていましたが、それ以外の情報もまとまっているもののが案外少なかったので。

Trimをサーバーで使える?

# Trimコマンドのサポートの確認(SSD側)
hdparm -I /dev/sda | grep -i TRIM
*    Data Set Management TRIM supported

Trimコマンドの発行にはSSDをSATAのAHCIモードで接続することが必要。
RAIDカード経由でSSDを接続した場合、SSDを直接扱えないのでTrimは使えない。
2012/05現在、Trimに対応したRAIDカードはないようだ。
(ただし、ext4のdiscardコマンドは内部的にはSCSIデバイスに対してUNMAPコマンドが発行されるので、今後RAIDカード側がATAコマンドのTrimに再度変換してくれれば…?無理かな)

一般的な1UサーバーではほとんどがフロントベイからバックプレーンのminiSAS経由で内蔵のRAIDカードへ接続する形態が取られているため、M/BのSATAポートへSingle Connectできない。つまり、この状態ではどうあがいてもTrimを利用することは不可能。
RAIDカードを省略し、オンボードのチップでRAIDを実現しているタイプの安価なサーバー(1U/ハーフU等)では、ドライブとM/BのSATAポートが直接接続されている場合がある。この場合は内蔵のRAID機能をOFFにすることでAHCIが利用できる場合もあるし、BIOSに設定がなくジャンパピンを変更しなければいけないものもある。

TrimコマンドのLinux側サポートはKernel 2.6.33から。
CentOSの場合6系から。(2.6.32だがバックポート有り)
かつ、ファイルシステムにext4を利用の場合のみ。
マウントオプションにdiscardを指定。

Trimコマンドの動作確認

こちらが詳しい。
http://d.hatena.ne.jp/sh2/20110123

戻り値が0の場合、Trimが有効になっている。それ以外の場合(return=-95が1回だけ等)は、Trimができないと返されている。
上述の理由で、SSDがTrim対応でも殆どの場合サーバーでは使えない。確認必須。

その他LinuxのSSDに関すること

設定の確認など

# SSDかどうか
cat /sys/block/sda/queue/rotational
0 -> SSD
1 -> HDD

hdparm -I /dev/sda | grep -i ssd
# 大抵は型番だけ
# 使えない場合はyum install hdparm
SecureErase (SSDリフレッシュ)

hdparmを使う

# SecurityCommand発行可能な状態をセット
hdparm --user-master u --security-set-pass xxxxxxxx /dev/sdx
# SecureEraseを実行
hdparm --user-master u --security-erase xxxxxxxx /dev/sdx

PartedMagic
http://sourceforge.jp/projects/sfnet_partedmagic/
KnoppixとかUbuntuのLiveCDよりはおすすめ

I/Oスケジューラーの設定

I/Oをキューするかどうか

cat /sys/block/sdb/queue/scheduler
# default
noop anticipatory deadline [cfq]
# 設定の変更
echo deadline > /sys/block/sda/queue/scheduler
cat /sys/block/sdb/queue/scheduler
noop anticipatory [deadline] cfq

SSDではnoopやdeadlineが推奨されていることが多い。
http://www.velobit.com/storage-performance-blog/bid/126135/Effects-Of-Linux-IO-Scheduler-On-SSD-Performance
ここの結果を見ると、cfqが劇的に遅いわけではないのであえてnoopに変えなくてもよさそうではある。
noopに変えたら5倍早いとかはないです。シングルスレッドで書き込んでいるとかいないとか、テスト項目の問題。

AHCIの有効化

だいたいBIOSで変更するだけ。

運用に関すること

冗長化/RAID

内蔵のRAIDカードがエントリクラスであればRAID1等で逆に足を引っ張るので、ミドルクラス以上のRAIDカード(WriteCache付きのもの)が推奨。
RAIDカード経由でかつRAID構築済みだと性能劣化をリフレッシュする手段がないので、大手メーカー製でSSDがオプションで選択可能なサーバー群では性能劣化の少なく、信頼性も高い(とされる)Intel製を使っているよう。

あんまり推奨してない。要は、RAID構築時にすべてのブロックに書き込みが発生するので性能劣化するんじゃないか?ということらしい。Redhatのドキュメントを参照のこと
http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/newmds-ssdtuning.html

割りきってRAIDなどの冗長化をせずに使うのも十分あり。

故障

故障率のデータ。HDDに比べると半分程度で、さらにその内Intelは一桁違うレベルで信頼性が高いようだ。
http://raven.air-nifty.com/night/2011/08/ssdhdd-3085.html
http://www.tomshardware.com/reviews/ssd-reliability-failure-rate,2923-3.html

監視

smartmontoolsでsmart値の拡張を監視する。
予約領域の残りと、平均消去回数のインジケーター。

# smartctl -a /dev/sda 
232 Available_Reservd_Space 0x0003   100   100   010    Pre-fail  Always       -       0
233 Media_Wearout_Indicator 0x0002   099   099   000    Old_age   Always       -       0

RAIDカードでArrayを構築済みだと当然だが値は取得できない。




RAID有無でのパフォーマンスの差異などの検証結果は別項で書く予定。
もっといい情報ありましたら教えて下さい。

CentOS6.2にMySQL5.5公式バイナリをインストール時、mysql-libsの依存関係を気にしなくてよくなってた件

半日かかったのに若干しにたい。


CentOS6.2にMySQL公式のバイナリをインストールするしようとすると、下記のような依存性エラーが発生していて、解決を先延ばしにしていた。

Scientific LinuxにMySQL5.5をインストール - cyber_snufkinの日記

postfixはどうしても入ってしまうし、削除するのも気持ち悪いし、remiは本番には使わないことにしているのでどうしようか試行錯誤していたが、結局RHEL系のパッケージ名が問題なのでrpmを直しましょうということになった。

http://bugs.mysql.com/bug.php?id=63433

rpmrebuildというツールでrpmを再パッケージするなどして、できた!と思っていたところだったのだが…先延ばしにしている間にMySQLの5.5.23がリリースされていたので、リリースノートをチェックしてみた。

 The MySQL-shared-compat RPM package enables users of Red
     Hat-privided mysql-*-5.1 RPM packages to migrate to
     Oracle-provided MySQL-*-5.5 packages. MySQL-shared-compat now
     replaces the Red Hat mysql-libs package by replacing
     libmysqlclient.so files of the latter package, thus satisfying
     dependencies of other packages on mysql-libs. This change
     affects only users of Red Hat (or Red Hat-compatible) RPM
     packages. Nothing is different for users of Oracle RPM
     packages. (Bug #13867506)

MySQL 5.5.23 がリリースされました | MySQL, SkySQL, Navicat, チューニング, 保守サポート

…アルェー、コレ公式で解決しちゃってない?
試しにダウンロードしてきたものをそのまま使ってみる。

# yum localinstall --nogpgcheck MySQL-shared-compat-5.5.23-1.el6.x86_64.rpm

===========================================================================================================================================================================
 Package                                 Arch                       Version                             Repository                                                    Size
===========================================================================================================================================================================
Installing:
 MySQL-shared-compat                     x86_64                     5.5.23-1.el6                        /MySQL-shared-compat-5.5.23-1.el6.x86_64                      11 M
     replacing  mysql-libs.x86_64 5.1.52-1.el6_0.1

Transaction Summary
===========================================================================================================================================================================
Install       1 Package(s)

どう見ても完璧です。…わーい。このままMySQL-server突っ込めました。
ていうか採用されたってスレッドに一言書いといて欲しかった…orz


ちなみに、rpmrebuildってツールは既存のバイナリにお手軽に設定ファイルを同梱できる面白いツールでした。EPELで入るので使ってみると良いかも。
http://sourceforge.jp/magazine/07/06/05/0119229/2

MuninのPluginをZabbixで使うwrapper的なものを作ってみた(Zabbix 2.0.0rc2対応)

Zabbix APIPython liblaryを使ってます。(Zabbix 2.0.0rc2で動作確認。1.8系はAPIが違うので、頑張ってJSONの中身を変えて下さい。)

スクリプト本体おきば
https://github.com/oopsops/scripts/blob/master/zabbix/zabbix_munin_plugin.py


使い方

# UserParameterに登録してAgentをリスタート
echo 'UserParameter=munin[*],/usr/share/munin/plugins/$1 |grep "^$2.value" |cut -d " " -f2' > /etc/zabbix/zabbix_agentd.d/userparameter_munin_plugin.conf
service zabbix-agent restart

# 適当なフォルダにスクリプトを設置
git clone git://github.com/oopsops/scripts.git
#
cd scripts/zabbix
# 引数の1つめにプラグイン名 2つめは登録先テンプレート(省略可)
./zabbix_munin_plugin.py memory Template_Linux

こんなことできます

  • /usr/share/munin/plugins/(プラグイン名) をZabbixのアイテムとして取り込みます
  • グラフを自動生成します(ノーマルグラフ、アイテムの色はランダム)
  • APIにアクセス可能なサーバーならどこからでも使えます
  • パスワードプロンプト対応です

基本的にはスクリプトを実行するサーバーできちんとvalueが取れるプラグインを使って下さい。
UserParameterの追加は最初だけでOKです。


memoryプラグインを取り込んだグラフを積算に変更したところ
f:id:oopsops:20120418191355p:plain

わーい。

KVMのゲストを複製した後、MACアドレスを書き換える方法いろいろ+スクリプトで自動化

基本的には、virt-cloneした後にいろいろする。
virt-manager上でクローンした後に行うのも同じ)

  • 直接マウントして書き換える
    • raw形式ならそのままマウントして書き換える
    • qcow2形式ならqemu-nbdを使ってマウントして書き換える
  • libguestfs経由で書き換える

結論としては、今から利用するならlibguestfsを使うほうが便利。CentOS6.2以降であればyumでインストールできる。


以下、いくつか使ってみたツール類。

RHEL5.x/RHEL6.0 の KVM では、virt-clone コマンドにより仮想マシンの複製が可能ですが、この場合、ゲスト OS のホストネームやネットワーク設定などは、別途、手動で変更する必要があります。
添付のスクリプト kvmclone.pl は、virt-clone による仮想マシンの複製とゲスト OS のネットワーク設定の変更を自動化して行います。

・virt-cloneも一括で行えるので便利
・raw形式のHDDでないと利用できない
・引数をすべて指定するのはちょっと面倒
・eth0だけ対応

・かなりいけてるけどシンプロビジョニングは今回考えてない
・eth0だけ対応

・eth0とeth1の2つのデバイス
・all python


今回はインターフェースを2つ利用したいものがあったので、最後のものを参考に改修して使ってみた。

edit-vm-network-setting.py
・(変更)rootデバイスを自動検出
edit-vm-hostname.py
・(追加)hostnameを変更するスクリプト
kvmclone
・(追加)virt-clone から起動まで行うスクリプト


kvmclone original_domain new_domain new_ip_eth0 new_ip_eth1

こんな感じでさくっとコピーして起動まで行きます。KVMホストがCentOS6.2、ゲストがCentOS5.4の環境で確認。
使うには以下のライブラリをYumでインストール。

yum install python-libguestfs libvirt-python python-lxml

同じネットワークアドレス内で使うだけなら、十分かな。eth0しか必要ない場合は、適当にコメントアウトして使って下さい。
時間があればIBMのものとかを参考に、ゲストがCent6系とかの場合にも対応してみたい。

libguestfs/guestfsのmanとか
guestfs-recipes - libguestfs, guestfish and virt tools recipes
guestfs-python - How to use libguestfs from Python