最近のLenovoのノートPCにはAtherosのAR8151っていうNICを積んでいるのだが、Linuxのカーネルは2.6.36以降の対応とのことでLennyで対応するのは大変面倒だったので、ドライバ認識させるまでの手順をメモ。
ターゲットはノートPCでDebianはUSBメモリからNetInstallさせる環境なので、NICが認識できない状況は大変困った。
んじゃ、続きから今回とった手順を。
前にlennyをGanymedeを動かしたエントリを書いたけど、同じことしようとしたらミラーが無くてアホみたいにダウンロードに時間がかかっていたので、Heliosを動かすようにした。
大雑把に手順を
# update-alternatives --config java
でJavaVMの切り替え
-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
を追加
あとは色々足りないライブラリ突っ込んでSVNからプロジェクトファイルを落として無事完了できた。
これまで瞬電や短期間の停電に対してのバックアップ電源として期待して、ノートPCをサーバとして利用してきたが、東電の計画停電下において十分なバッテリー容量を確保できないので、バッテリー容量の低下に合わせて、自動的にシャットダウンする仕組みを導入することにした。
こちらでまさしくそのものを公開されていたので、ありがたく使わせていただく。
特にsyslogへの保存は不要だったので、一部改変。
#!/bin/sh
AC_STATE=`cat /proc/acpi/ac_adapter/AC/state |awk '{ print $2 }'`
BAT_REM=`cat /proc/acpi/battery/BAT0/state |grep "remaining capacity" |awk '{ print $3 }'`
LIMIT=400
if [ $AC_STATE = "on-line" ]; then
echo "on-line"
exit 0
elif [ $AC_STATE = "off-line" -a $BAT_REM -gt $LIMIT ]; then
echo "discharging: Capacity:$BAT_REM > Limit:$LIMIT"
exit 0
else
/sbin/shutdown -h now
echo "shutdonw -h now!"
exit 0
fi
exit 0
後は、700に権限を変更して、crontab -eでcrondに登録すればおけ。
テストは帰宅したときにでもやるか・・・
Linuxの製品として売り出す関係でセットアップの自動化を進めていたのだが、
そのテスト中どうにもcronで記述した処理が動かない現象にあたった。
セットアップ手順としては、cronはLennyの基本インストールで勝手に入るので特に操作はせず、
/var/spool/cron/crontab/rootに予め作っておいたcronの設定ファイルをコピーした。
下記を実行してもちゃんと中身は存在してる状態である。
# ps aux | grep cron
# crontab -l
いろいろ検索したが全くそれっぽいサイトは見つからず、結局/var/spool下に置くだけじゃ駄目だったと言うわけで、
# crontab -e
で開いたら、変更しなくても書き込んで終了する。
を行って動くようになった。
なにこの罠orz
Netbookをサーバに仕立てるため、debian lennyを入れるのだが、残念ながらCD-ROMドライブがないため、USBメモリからインストールすることになった。
そこで、unetbooinを使うことにし、USBメモリにイメージを書き込んだがbootしない。まずここでハマる。
散々悩んだ結果、USBメモリの相性が悪いというダメな結論に達し、USBメモリを交換。無事ブートする。
こんなのも試したのに・・・
インストール作業を進め、パーティションの設定で違和感。USBメモリが/dev/sdaにHDDが/dev/sdbになってる・・・。
ここは冷静に/dev/sdbにファイルシステムを構築し、Grubのインストール先も/dev/sdbにインストールを行う。
ま、Grubのインストール何も考えずMBRを選択したら、USBに書きに行きやがって、USBのイメージつくり直すはめになったけどなw
そしてインストール完了。インストール用USBメモリを抜いて、最初のboot…できずorz
もう解決した後だからサラッと流すけど、そりゃUSBメモリ引っこ抜いてbootさせたらHDDは/dev/sdaになるよね。
インストールした時点ではGrubのBoot対象はhd1だったから仕方がない。rootをhd0に変更してboot。
すると、bootが途中で止まる。もちろん原因はsdbがsdaになったこと。
止まったところでrootにログインして、/etc/fstabにある/bootの/dev/sdbのマウントを/dev/sdaに変える。
そして、再起動。grubの書き換えって永続じゃないことに気づくorz
上と同じくrootをhd1からhd0に変更し、boot。
今度は無事起動完了。
/boot/grub/menu.lstの中のhd1をhd0に置換して全ての修正完了。
これまで、インストール時点でHDDの/devの順番が変わることなんてなかったから、
ティンと来なくて、これだけで4時間くらい使った。疲れた。
Tags: debian, lenny, linux, unetbootin
「Web技術者のための大規模サービス技術入門」をタイトルだけで購入。
はてなのインターン向けの教材がベースということで、正直とくに目新しいものは見て取れなかった。
しかしこのレベルをインターンの子がこなせるっていうのは、やっぱり優秀な人が集まる魅力的な会社なんだなぁと。
社会人向けにどんな本かと説明するなら、スケールとかパフォーマンスとか運用を気にしたこと無い開発者や、運用系の人が開発がきちんと考えて作っているかを判断するために、基本的な知識を得るための本ってあたりかな。
同じ著者でも前読んだ(けど書評を書くのを忘れていた)「24時間365日サーバ/インフラを支える技術」のほうが、技術的に深いところが書かれており、ある程度経験のあるエンジニアなら後者をおすすめする。
逆に自分が特に得る物があったと思うのは、具体的な性能指標がかかれていた14章、15章。
具体的な数値というのは賞味期限が短いが、当時のスペックでどれくらいの性能がでていたかを自前のマシン以外から情報を得られたのは収穫。
スケールさせる基準や、チューニングの指標にできるからね。
世の中、SNMP AgentをC言語で実装する記事はあるのだが、SNMPマネージャをC言語で書く記事がないなぁと思って、C言語からコマンドラインのsnmpgetをpopenで呼んだりしてたのだが、オーバーヘッドの大きさに閉口。
本格的に探したところ、サンプルが公式にあったorz
公式のサンプルからさらに最低限必要な処理を抽出する。
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <string.h>
int main(int argc, char ** argv)
{
struct snmp_session session;
struct snmp_session *sess_handle;
struct snmp_pdu *pdu;
struct snmp_pdu *response;
struct variable_list *vars;
oid id_oid[MAX_OID_LEN];
oid serial_oid[MAX_OID_LEN];
size_t id_len = MAX_OID_LEN;
size_t serial_len = MAX_OID_LEN;
int status;
/*********************/
init_snmp("SNMP Test");
snmp_sess_init( &session );
session.version = SNMP_VERSION_1;
session.community = "public";
session.community_len = strlen(session.community);
session.peername = "127.0.0.1";
sess_handle = snmp_open(&session);
pdu = snmp_pdu_create(SNMP_MSG_GET);
read_objid(".1.3.6.1.2.1.1.1.0", id_oid, &id_len);
snmp_add_null_var(pdu, id_oid, id_len);
status = snmp_synch_response(sess_handle, pdu, &response);
for(vars = response->variables; vars; vars = vars->next_variable)
print_value(vars->name, vars->name_length, vars);
snmp_free_pdu(response);
snmp_close(sess_handle);
return (0);
}
このサンプル見てておもったのだが、snmp_pdu_create()で返ってきたポインタって、開放してないんだよね。
requestとsess_handleは開放してるっぽいAPI呼んでるからいいんだけど…
いろいろグクっても開放しているところが見当たらないから、たぶんsnmp_synch_responseで開放してると思うんだけど、一応ソースコード確認しておくかな・・・
Webサーバをapacheからlighttpdに移行する過程で、httpでリクエストしたコンフィグファイルがちゃんと読めなくなっていた。
なんでかと思って、WireSharkで拾ってみたところ、Content Typeがapacheでは「text/plain」となっていたところが、lighttpdでは「application/octet-stream」となっており、おまけにおしりに改行コードが追加されていた。
lighttpdは軽量化のため、拡張子でContent Typeを判断しており、コンフィグファイルを独自の拡張子を使用したため、デフォルトで上記のような挙動となったらしい。
lighttpd.confのmimetype.assignをいじれば良いことがわかり修正。
ついでに改行コードの付加程度では動作に影響しないように、コンフィグファイルのReaderの修正もした。