2012年11月21日水曜日

ディスクのシリアル番号

Cです。お久しぶりです。
生きていました。

Linuxのディスク認識についてちょっと書く。
新仮想化基盤サーバ構築中に気になったものでね。

下記のような理想のように素直に認識してくれればいいのだが、
実際には入れ違っちゃうこともある、SATA3(接続コネクタポート名)以降は
もうぐっちゃぐちゃになることがおおい。SATAポート増設とかすると特に

■理想
SATA1 = /dev/sda
SATA2 = /dev/sdb
SATA3 = /dev/sdc
SATA4 = /dev/sdd
SATA5 = /dev/sde
SATA6 = /dev/sdf
SATA7 = /dev/sdg
SATA8 = /dev/sdh
SATA9 = /dev/sdi
SATA10 = /dev/sdj

■現実
SATA1 = /dev/sda
SATA2 = /dev/sdb
SATA4 = /dev/sdc
SATA3 = /dev/sdd
SATA7 = /dev/sde
SATA8 = /dev/sdf
SATA9 = /dev/sdg
SATA10 = /dev/sdh
SATA5 = /dev/sdi
SATA6 = /dev/sdj
↑実際はどのSATAコネクタなのかわからない。

これはものすごい困る。別に動いてるぶんにはいいんだけど、
HDDが壊れたときにどのディスクを交換すればいいのかわからない。

■解決法
まずはHDD固体のシリアルちゃんと管理しとこう。
物理固体にはシリアルが書いてないことがあるのでこうしよう。
1個だけHDDがつながってる状態にして「hdparmコマンド」でシリアルをとっとこう。


# echo "/dev/sda 右だよ " > disk_management.txt
# hdparm -I /dev/sda | grep "Serial Number" >> disk_management.txt


ほかにもシリアルナンバーを取得する方法はある。


# scsi_id --page=0x83 -whitelisted --device=/dev/sda


これでもいけるな。


# udevadm info -q all -n /dev/sda | grep D_SERIAL_SHORT


そして2個目をつないでまた同じことを繰り返していく。
これでシリアルと場所とデバイス名を管理できる。

/etc/fstab もUUIDで書いておくと何とかなるだろう。
ほんとはudevで固定したかったんだけど、やり方がわからなかった

/etc/udev/rules.d/10-local.rules を作成して下記のように指定したが
思うようには動きやがらんです。

SUBSYSTEM=="block", ENV{ID_BUS}=="ata", ENV{ID_MODEL}=="SPCC_Solid_State_DiskB28", ENV{ID_TYPE}=="disk", ENV{ID_SERIAL_SHORT}=="120614271030000000D8", NAME="sda%n"

やり方を知っている人がいたら教えてくれ。

2012年7月14日土曜日

AVR ダイナミック点灯

Cです。

「ダイナミック点灯」とはめちゃくちゃ早い速度で、
点灯する物を切り替える事によって、複数の物が点灯しているように見せること。

下の写真は3桁表示されているように見えるが、実際には
同時に表示されているのは1桁で人間どもには、確認できない速さで
切り替わって表示されている。

何でこんな事をするのかというと、
1個ずつちゃんと表示してたらマイコンの足がいくらあっても足りないから。















#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
    unsigned char cnt=0;
    unsigned char seg[10] = {0b00111111, 0b00000110,
                             0b01011011, 0b01001111,
                             0b01100110, 0b01101101,
                             0b01111101, 0b00100111,   
                             0b01111111, 0b01101111};

ISR ( TIMER0_COMPA_vect ){
    static unsigned char sel=0;
    unsigned char dig1, dig10, dig100;
    static unsigned char i;
    dig1    = seg[cnt % 10];
    dig10   = seg[(cnt / 10) % 10];
    dig100  = seg[(cnt / 100) % 10];
    switch(sel){
        case 0: PORTB = 0b00000001;
                PORTD = dig1;
                break;
        case 1: PORTB = 0b00000010;
                PORTD = dig10;
                break;
        case 2: PORTB = 0b00000100;
                PORTD = dig100;
                break;
    }
    sel++;
    if(sel == 3){ sel = 0; }
   
    i++;
    if(i == 200){ cnt++; i = 0; }
}
int main(void) {
    DDRB = 0b11101111;  //PB4のみ入力
    DDRD = 0b11111111;  //すべて出力
    PORTB = 0b00010000; //
    PORTD = 0b00000000; //D初期化
    TCCR0A = 0b00000010;    //CTC
    TCCR0B = 0b00000101;    //約1kHz
    OCR0A = 5;              //5msで割り込む
    TIMSK0 = 0b00000010;    //COMPA割り込み
    sei();                  //全体割り込み許可
    while(1) {
    }
    return 0;
}

AVR PORTDチェック関数

Cです。
PORTDの出力チェックを実施する。
PD0~7にLEDでもつないでおこう。

#include<util/delay.h>

void PORTD_test(char w_cnt){

    char i;

    for(i = 0; i < w_cnt; i++){
        PORTD = 0b00000001;
        _delay_ms(200);
        PORTD = 0b00000010;
        _delay_ms(200);
        PORTD = 0b00000100;
        _delay_ms(200);
        PORTD = 0b00001000;
        _delay_ms(200);
        PORTD = 0b00010000;
        _delay_ms(200);
        PORTD = 0b00100000;
        _delay_ms(200);
        PORTD = 0b01000000;
        _delay_ms(200);
        PORTD = 0b10000000;
        _delay_ms(200);
    }
}

int main(void) {
    DDRD = 0b11111111;           //すべて出力
    PORTD = 0b00000000; //D初期化
    while(1) {
    PORTD_test(1);
    }
    return 0;
}

AVR

Cです。
メモリやタイマーなどを作ってきたんだけど。
これはマイコンを使うまでにいろんな基礎知識を養う為のものだった。

これからはマイコンメインでやっていく。半導体技術のすごさを身をもって感じた。

マイコンはAVRを選定した。

どんどん弄繰り回していこう。

2012年6月2日土曜日

ローカル DNSサーバ

Cです。

今日はDNSサーバの設定を書いておこう。
Debianだけど考え方とか設定内容はRHEL(CentOS)も一緒だ。

■フォワードオンリー設定
自分には問い合わせの回答を持たずに、別のDNSサーバに丸投げする設定。
別のDNSサーバから頂戴した回答は一定時間キャッシュとして保持する。

/etc/bind/named.conf.options <-これはdebian独特だけどnamed.confから読み込んでるだけ。

        version                 "aho";  <-bindのバージョンをばれないように設定しとこう
        max-cache-size          10M;  <-キャッシュ保存容量
        max-cache-ttl           604800; <-キャッシュ保持時間(1週間はちょっと長い?
        max-ncache-ttl          10800;  <-ネガティブキャッシュ保持期間
        recursive-clients       10;   <-再起問い合わせを受け付けるクライアント数
        allow-query { 192.168.24.0/24; 127.0.0.1; }; <-クエリを受け付けるIP
        forward only; <-フォワードしかしないよ
        forwarders { 8.8.8.8; }; <-丸投げ先


■ローカルDNSサーバ
ローカルネットワークでの名前解決に使うための設定。

/etc/bind/named.conf.local

        zone "localdomain.local" IN {
        type master;
        file "/etc/bind/localdomain.local/localdomain.local.zone";
};

zone "24.168.192.in-addr.arpa" IN {
        type master;
        file "/etc/bind/lcaldomain.local/lcaldomain.local.rev";
};


/etc/bind/localdomain.local/localdomain.net.zone <-正引き用


$TTL    604800
@       IN      SOA     hostname.localdomain.local   root.localdomain.local. (
                            20120604            ; Serial
                              604800            ; Refresh
                               86400            ; Retry
                             2419200            ; Expire
                              604800 )          ; Negative Cache TTL
;
@               IN      NS      localhost.
@               IN      A       192.168.24.70
gw              IN      A       192.168.24.1
hostname        IN      A       192.168.24.70


/etc/bind/localdomain.local/localdomain.net.rev <-逆引き用

$TTL    604800
@       IN      SOA     hostname.localdomain.local   root.localdomain.local. (
                            20120604            ; Serial
                              604800            ; Refresh
                               86400            ; Retry
                             2419200            ; Expire
                              604800 )          ; Negative Cache TTL
;
@               IN      NS      localhost.
                IN      PTR     hostname.
                IN      A       255.255.255.0
70              IN      PTR     hostname.
1               IN      PTR     gw.


クライアント側、サーバ側ともに/etc/resovl.confの設定をしておこう。