2012年11月26日月曜日

KVMと仮想スイッチ

Cです。KVMとVLANの話。

最近は用途にもよるけど、サーバ仮想化の検討が当たり前になっている。
1仮想化基盤の中に、別のネットワークセグメントが存在したりすることもよくある。
その場合には、仮想化基盤を分けるべきなんだけど金と仮想化対象サーバの数によっては
1台に収めたい場合もあるだろう。

4ネットワークセグメントが混在する場合の設定を。
KVMとCatlyst2950を使ってやってみた。

■作るもの 画像はみ出た




bondingの設定とcatlyst側のEtherChannelの設定いらないんじゃない?と
疑問に思った人がいるかもしれない。
bondingを組まずに各仮想ブリッジ(br)にVLANつけたサブインターフェイスを
そのまま割り当ててればいいと思うかもしれない。

しかしそれだとパケットの流れがだいぶ変わる。
ほんとにスイッチの動きとなってしまい
仮想マシンからのパケットを転送するだけの動きとなる。
L2ブロードキャストやMACテーブルに覚えていない場合、
「eth0 - eth3」の全部のポートからパケットが出て行くのだ。
いらんだろ。

画像ではcatlyst同士繋がっていないが
それをするとL2ループがおきちゃうこともある。
仮想スイッチでSTPは組むのはネットワークが複雑になりすぎるし嫌だ。
(各メーカーや技術者も「仮想ネットワークでSTPを組むな」と言っている。)
↑これに関して技術的な観点でなく管理的な面で言っている。
仮想スイッチでSTPを有効にしてやればできないことも無い。
いらんだろ。

bonding mode 0 でEtherchannelを組んで、
そのポートを仮想ブリッジに参加させた場合は
ちゃんと使えるインターフェイスを判断して
そこからパケットを転送してくれる。

※設定するときは通信が途切れないように工夫せよ

■いるもの

# yum install bridge-utils


■VLAN有効

# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hostname
NETWORKING_IPV6=no
GATEWAY=xxx.xxx.xxx.xxx
LVAN=yes


■VLANタグのついたサブインターフェイス作成


# vi /etc/sysconfig/network-script/ifcfg-eth0.10
DEVICE="eth0.10"
MASTER="bond10"
SLAVE="yes"
BOOTPROTO="none"
ONBOOT="yes"

# vi /etc/sysconfig/network-script/ifcfg-eth0.20
DEVICE="eth0.20"
MASTER="bond20"
SLAVE="yes"
BOOTPROTO="none"
ONBOOT="yes"

# vi /etc/sysconfig/network-script/ifcfg-eth0.30
DEVICE="eth0.30"
MASTER="bond30"
SLAVE="yes"
BOOTPROTO="none"
ONBOOT="yes"

# vi /etc/sysconfig/network-script/ifcfg-eth0.40
DEVICE="eth0.40"
MASTER="bond40"
SLAVE="yes"
BOOTPROTO="none"
ONBOOT="yes"

~長いし省略~ 
他のインターフェイスにもVLANタグのついたサブインターフェイスを
同じように作っていく。


■仮想ブリッジの設定

# vi /etc/sysconfig/network-script/ifcfg-br10
DEVICE=br10
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
DELAY=0

# vi /etc/sysconfig/network-script/ifcfg-br20
DEVICE=br20
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
DELAY=0

# vi /etc/sysconfig/network-script/ifcfg-br30
DEVICE=br30
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
DELAY=0

# vi /etc/sysconfig/network-script/ifcfg-br40
DEVICE=br40
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
DELAY=0


■bondingのalieas設定

# vi /etc/modprobe.d/bonding.conf
alias bond10 bonding
alias bond20 bonding
alias bond30 bonding
alias bond40 bonding


■bondインターフェイスの作成

# vi /etc/sysconfig/network-scripts/ifcfg-bond10
DEVICE="bond10"
ONBOOT="yes"
BOOTPROTO=static
TYPE="Ethernet"
BRIDGE="br10"

BONDING_OPTS="mode=0 miimon=100"

~長いし省略~ 
bond40まで作成しよう。


ここまできたら勇気をもって/etc/init.d/network restart だ。
※eth0にでもIP振っておいたほうがいいぞ。

■確認しとこう

# brctl show
# ifconfig


あとは仮想マシンのNIC設定でどの仮想スイッチ(br)の中に属するかを設定すればOKだ。

設定はややこしいかもしれない、
もっと設定を簡単にして「動く」だけのものを作っても
思うように転送速度が出なかったり、障害時の原因特定が困難になったり
良いことは無いだろう。

以上

NTPサーバの設定

Cです。NTPの話。

NTPって他のプロトコルとちょっと変な感じだ。
NTP時刻参照先(上位)とNTPクライアント(下位)が
お互いserverとclientになりあって時刻を調整している。
下位になるほうにも上位NTPからのアクセス許可ルールを書かないといけない。

■設定

# driftfileの指定(上位NTPとの差を記録するファイル)
driftfile /var/lib/ntp/ntp.drift

# デフォルトですべてのNTPアクセス拒否
restrict default ignore

# ローカルホストからはNTPアクセス許可
restrict 127.0.0.1

# 各クライアントからのリクエスト許可
restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap

# 各上位NTPからのNTPアクセス許可
restrict 133.243.238.163 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.164 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.243 mask 255.255.255.255 nomodify notrap noquery
restrict 133.243.238.244 mask 255.255.255.255 nomodify notrap noquery
restrict xxx.xxx.xxx.xxx mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.27 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.57 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery

# 上位NTPサーバの指定
server ntp.nict.jp
server ntp.nict.jp
server ntp.nict.jp
server プロバイダのNTP
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp

# RTC
server 127.127.1.0
fudge 127.127.1.0 stratum 10

# 認証の指定
authenticate no

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"

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