2008年12月14日

USB無線LAN導入 ドライバインストール編

使ったのは I-O DATA WN-G54/USL 。
チップは zd1211b とのこと。

vine4.2にはrpmも用意されてますが、WN-G54/USLは動作未確認とかの理由で対応してくれてません。

ということで、srpmを拾ってrebuildしてやりました。

手順は以下の通り。
  1. srpmを拾ってきます。
    $ apt-get source zd1211
    パッケージリストを読みこんでいます... 完了
    依存情報ツリーを作成しています... 完了
    452kB のソースアーカイブを取得します。
    取得:1 http://updates.vinelinux.org 4.2/i386/plus zd1211 2.22.0.0-2vl4 (srpm) [452kB]
    452kB を 0s 秒で取得しました (1332kB/s)
       1:zd1211                 ########################################### [100%]
  2. srpmを ~/rpm/SRPM に置きます。※rpmをユーザ権限で作れる環境が出来ているのが前提です。
  3. ソースを取り出します。
    $ rpm -i zd1211-2.22.0.0-2vl4.src.rpm
       1:zd1211                 ########################################### [100%]
    こんな感じ↓にソース類が展開されます。
    ~/rpm/SOURCES/ZD1211LnxDrv_2_22_0_0.tar.gz
                  zd1211-install-path.patch
                  zd1211-WLI-U2-KG54L.patch
          SPECS/zd1211.spec
  4. tar玉を展開して、WN-G54/USL用のパッチを作成します。
    $ tar xvzf ZD1211LnxDrv_2_22_0_0.tar.gz
    ZD1211LnxDrv_2_22_0_0/src/zdusb.c の usb_device_id に 以下のように WN-G54/USL 用のを追加して、diffでパッチを取ります。
         { USB_DEVICE(0x04BB, 0x0938) }, // Add, 2008.12.02 I-O DATA WN-G54/USL
    # diff -c ZD1211LnxDrv_2_22_0_0/src/zdusb.c.org ZD1211LLnxDrv_2_22_0_0s/src/zdusb.c > zd1211-WN-G54-USL.patch
    作ったパッチは rpm/SOURCES に置きましょう。
  5. specファイルを修正して、patchが当たるようにします。
    <前略>
    Source0:        ZD1211LnxDrv_2_22_0_0.tar.gz
    Patch0:         zd1211-install-path.patch
    Patch10:        zd1211-WLI-U2-KG54L.patch
    Patch20:        zd1211-WN-G54-USL.patch
    <中略>
    %patch0 -p1 -b .install-path
    %patch10 -p1 -b .WLI-U2-KG54L
    %patch20 -p1 -b .WN-G54-USL
    <後略>
    Patch20/patch20 の行が追加した行。 このまま rebuild するとバイナリファイルが元のと同じ名前になってしまうので、それがヤなときは先頭のほうにある
    %define rel     2%{_dist_release}
    この行の 2 を 3 とかにしとくといいです。
  6. リビルドします。 -ba オプションで rpm と srpm 両方を作っておきました。
    $ rpm -ba zd1211.spec
    これで、rpm/SRPMS に srpm 、 rpm/RPMS/i386 に rpm が出来上がります。
  7. インストールします。 root でどーぞ。
    # rpm -ivh kernel-module-zd1211-2.22.0.0_2.6.16_76.39vl4-3vl4.i386.rpm 
    準備中...                   ########################################### [100%]
       1:kernel-module-zd1211   ########################################### [100%]
posted by nariki at 12:28| Comment(2) | TrackBack(0) | 自宅サーバ | このブログの読者になる | 更新情報をチェックする

2008年11月30日

USBメモリからLinuxをインストール

ということで、やっとエントリ。

手順は意外と簡単で、syslinuxってやつを使って、USBメモリをブータブルにして、ISOイメージから起動させてやるだけ。

ちなみに自分はデジカメの予備microSDをUSBアダプタ使ってメモリ代わりでやってみました。

http://www.hot-linux.org/redhat/?rec_no=61

こちらのサイトの手順ほぼそのまんまだけど、一応コマンド載せてこうと思います。

まずはsyslinuxを持ってきます。

http://www.kernel.org/pub/linux/utils/boot/syslinux/

こっからどーぞ。今の最新版は3.72っぽいんで syslinux-3.72.zip をDL。

自分はwindows環境で作業したんで、DOS窓開いて、解凍したフォルダに移動(windows用コマンドはwin32フォルダに入ってます)して、

c:\syslinux\win32>syslinux -ma l:


でOK。l:はUSBメモリのドライブです。

続いて、インストールCD内のisolinuxフォルダ以下のファイルをUSBメモリのルートにコピー。
同名ファイルがあった場合も上書きだそうな。
isolinux.cfgをsyslinux.cfgとファイル名を変更。
syslinux.cfgが既にあった場合は既存のを消してからどうぞ。

ほいで、ISOイメージをUSBメモリのルートに置いたら完了です。

対象マシンに挿してUSBから起動させてみませう。
もちろん、BIOS設定で起動ドライブの優先順はUSBメモリがHDDより先になるようにしといて下さいね。

無事にインストーラ画面が出てくれば後は普通のCDからのインストールと基本的には同じです。

違うのは、最初にインストールイメージがCDにあるかHDDにあるか聞かれるので、そこでローカルHDDを選択後、/dev/sda1を指定してやる必要があります。

※USBメモリはたいていはsda1だと思いますが、環境によっては違うかもなので、適切に選らんで下さい。

いやしかし、CDイメージがUSBメモリにフツーに入るわけですよね。
FDのやり取りしてた頃を考えるとすげー不思議。

-----

■追記■
grubがなぜかsdaにしかインストール出来ず、後からhdaにインストールしてやらなきゃいけなかった。
なぜだろーか。

# grub-install /dev/hda

※rootで実行して下さいね。

これだけだとmenu.lstがsda用になっててだめなので、(hd1,0)を(hda0,0)に変更してやって再起動したらきちんと立ち上がりましたとさ。

ちなみに、grubはBIOSの認識順にhd0,hd1・・・とするそうで、これはそれこそ環境によるようです。

うちの場合は ATA HDD : hd0、USBメモリ:hd1、という具合だった模様。
posted by nariki at 01:28| Comment(0) | TrackBack(0) | 自宅サーバ | このブログの読者になる | 更新情報をチェックする

2008年04月25日

dicedでDDNSのIP更新に失敗したら?

ZoneEditを使っている、ウチの自宅サーバですが、IP更新時のDDNS自動更新にDicedを使ってます。

が、たまに更新に失敗します。。。
しかもリトライしてくれないぽ(´・ω・`)

しかも、何故か家を離れているときに多い(涙

そんなわけで、dicedのログを監視して、IPが変わったのにDDNSのIP更新に失敗したときに、メールで通知するスクリプト(daemon動作可)を書いてみました。
#!/usr/bin/perl -w

use strict;
use POSIX qw(strftime);
use POSIX qw(setsid);

######################################################################
# 設定項目
######################################################################

# デーモンにするか?: 1(オン) / 0 (オフ)
our $DAEMON = 1;

# スリープの間隔(秒)
our $SLEEP_INTERVAL = 600;

# このスクリプトのログファイル名
our $LOG_FILE = "/var/log/chk-diced-log.log";

# diced のログファイル名(パスを含む)
our $DICED_LOG_FILE = "/usr/local/DiCE/log/events.log";

# pidファイル
our $PID_FILE = "/var/run/chk-diced-log.pid";

######################################################################
# メイン処理
######################################################################

&init;
&run;

######################################################################
# サブルーチン
######################################################################

#---------------------------------------------------------------------
# メイン処理
#---------------------------------------------------------------------
sub action {
    # 現在日時を取得
    my $now_time = strftime "%-m/%-d %-H:%M", localtime;

    print "wake at $now_time\n";

    # 自ログから前回の実行時間を取得
    my ($prev_time,$prev_ip) = &get_prev_info;

    # dicedのログをチェック
    my $ng_flg = 0;
    my $current_ip;

    open IN, $DICED_LOG_FILE or die "can't open diced log file!";

    foreach(<IN>){
        if( />(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/ ){
            # 最新のIPを保持
            $current_ip = $1;
        }
        if( /▲/ ){
            # 実行に失敗しました
            $ng_flg = 1;
        }
        if( /★/ ){
            # 実行されました
            $ng_flg = 0;
        }
    }

    close IN;

    # 失敗したまま&以前のIPと変化があったなら通知を出す
    if( $ng_flg ){
        if( $current_ip ne $prev_ip ){
            # 通知
            &send_notify_mail( $now_time, $current_ip );
            # ログファイル書き出し
            &write_log( $now_time, $current_ip );
        }
    }
}

#---------------------------------------------------------------------
# 自ログから前回の実行時間とその時点のIPを取得
#---------------------------------------------------------------------
sub get_prev_info {
    my @prev_info;
    my $line;
    # ログファイルがなければ、空データを返す
    if( ! -e $LOG_FILE ){
        @prev_info = ( "", "" );
        return @prev_info;
    }

    # ログファイルを開く
    open IN, $LOG_FILE or die "can't open log file!";

    # ログファイルから前回実行時間とその時点のIPを取り出す
    $line = <IN>;
    close IN;
    chomp($line);
    @prev_info = split( /<>/, $line );
    return @prev_info;
}

#---------------------------------------------------------------------
# ログ書き出し
#---------------------------------------------------------------------
sub write_log {
    open OUT, ">$LOG_FILE" or die "can't open log file for writing!";

    print OUT "$_[0]<>$_[1]";

    close OUT;
}

#---------------------------------------------------------------------
# 更新失敗を通知
#---------------------------------------------------------------------
sub send_notify_mail {
    #open OUT, ">>/tmp/hoge.txt";
    #print OUT "send mail at $_[0]\n";
    #print OUT "new ip : $_[1]\n";
    #close OUT;
}

#---------------------------------------------------------------------
# pid書き出し
#---------------------------------------------------------------------
sub write_pid {
    open OUT, ">$PID_FILE";

    print OUT $$;

    close OUT;
}

#---------------------------------------------------------------------
# 割り込みハンドラ
#---------------------------------------------------------------------
sub interrupt {
    my $sig = shift;
    setpgrp;                 # I *am* the leader
    $SIG{$sig} = 'IGNORE';
    kill $sig, 0;            # death to all-comers
    die "killed by $sig";

    exit(0);
}

#---------------------------------------------------------------------
# 初期設定
#---------------------------------------------------------------------
sub init {
    $SIG{INT}  = 'interrupt';         # Ctrl-C が押された場合
    $SIG{HUP}  = 'interrupt';         # HUP  シグナルが送られた場合
    $SIG{QUIT} = 'interrupt';         # QUIT シグナルが送られた場合
    $SIG{KILL} = 'interrupt';         # KILL シグナルが送られた場合
    $SIG{TERM} = 'interrupt';         # TERM シグナルが送られた場合

    # daemon動作?
    if( $DAEMON ){
        # カレントディレクトリを移動しとく。
        chdir '/';
        # 標準入出力を閉じる
        open STDOUT, ">/dev/null";
        open STDIN,  ">/dev/null";
        # 一時的に無視
        $SIG{CHLD} = 'IGNORE';

        my $pid = fork;
        # forkできた?
        if( $pid < 0 ){
            # 失敗
            exit -1;
        }elsif( $pid ){
            # 成功したので、親側はさようなら。
            exit 0;
        }

        # 子プロセスで動く処理
        # 無視してたのを戻す
        $SIG{CHLD} = 'DEFAULT';
        # プロセスIDを書き出しておく
        &write_pid or exit 1;

        # セッションを新しく始める
        setsid or die "Can't start a new session: $!";
        # 標準エラーも閉じる
        open STDERR, ">/dev/null";
    }
}

#---------------------------------------------------------------------
# デーモン動作
#---------------------------------------------------------------------
sub run {

    while(1) {

        # SLEEP_INTERVAL ごとに action を呼び出す
        &action;

        sleep($SLEEP_INTERVAL);
    }
}

1;

サービス登録用のスクリプトは近日中には。。。
posted by nariki at 16:40| Comment(0) | TrackBack(0) | 自宅サーバ | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は90日以上新しい記事の投稿がないブログに表示されております。