2012年11月24日土曜日

RAID

Cです。SoftwareRAIDについて。

HardwareRAIDとSoftwareRAIDの違いはなにかな?
まあ名前の通りなんだけど、こう考えている。
「RAID処理を自分のCPUで処理しているかしていないか」かな。

ストレージ処理に特化させたLinuxを組んで
SoftwareRAIDで組んだディスクをFC等でサーバに見せてあげると
サーバからしてみればHardwareRAIDと同じことだし
うーん。どうでもいいね。

■現在のRAID情報取得

# cat /proc/mdstat
# mdadm --detail --scan
# mdadm --detail /dev/md0


■RAID作成 (この前にパーティションタイプ0xfdでフォーマットしとけ)

# mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
# cat /proc/mdstat | grep -A 3 md3
md3 : active raid1 sdd1[1] sdc1[0]
488381848 blocks super 1.2 [2/2] [UU]
[>....................] resync = 0.7% (3733440/488381848) finish=81.3min speed=99319K/sec


待つこと1時間、500GBのresyncなのでちょっと時間かかった

■設定を保存

# mdadm --detail --scan >> /etc/mdadm.conf


ここからはLVM組んでマウントする設定

■lv作成

# pvcreate /dev/md3
# vgcreate vg_vm /dev/md3
# lvcreate -l 100%FREE -n lv_vm vg_vm


■ファイルシステム作成

# mkfs -t ext4 /dev/vg_vm/lv_vm


あとは/etc/fstabに自動マウントの設定を書いとこう。
もちろんUUIDで。

以上、

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を選定した。

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