カテゴリー: Linux Page 1 of 2

Vagrantのboxサイズを拡張する

提供されているboxが8GBしかなかったので拡張したのですが、結構大変だったのでメモします。

ディスクの拡張

boxから普通にインスタンスを作成。
インスタンスを作成したらシャットダウンして作業を行います。

VirtualBoxではディスクサイズが可変のタイプは .vdiなのですが、
Vagrantのboxとできるディスクタイプはvmdkとなります。
まずは、現在のvmdkディスクをクローンしてvdi形式のディスクを作成します。

その後、カレントディレクトリを作成した仮想サーバのディスクがある所まで移動して

VBoxManage clonehd "box-disk1.vmdk" "clone-box-disk1.vdi" --format vdi

クローンしたディスクの容量を拡張します。ここでは20GBにしたいと仮定して20480を設定しています。
(20(GB) * 1024(MB) = 20480)

VBoxManage modifyhd clone-box-disk1.vdi --resize 20480

次に、ディスク拡張されたvdiをvmdkにクローンします。

VBoxManage clonehd "clone-box-disk1.vdi" "box-disk2.vmdk" --format vmdk

拡張したディスクを差し替えます。
この作業は、VirtualBoxから行ってもいいかもしれません。
–port 0 –device 0 の部分はbox-disk1.vmdkが入っていたものを指定します。
ちなみに、server_default_1448874918650_80404 は仮想サーバー名です。

VBoxManage storageattach server_default_1448874918650_80404 --storagectl "SATA" --port 0 --device 0 --type hdd --medium box-disk2.vmdk

この設定を行った後、起動してみて無事に起動すればOKです。
確認できたら、またまたシャットダウンします。

パーティション操作

現在ディスクは20GBに拡張しましたが、パーティションは8GBまでしか使用されていない状態です。
パーティションを操作して、8GBを20GBに拡張します。

新たに作成された box-disk2.vmdk を適当な仮想サーバにアタッチします。
アタッチ後、lsblkコマンドでディスクの様態をチェック。

# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda    202:65   0   8G  0 disk /
└ sda1 202:145  0   1G  0 part
└─sda2 202:145  0   8G  0 part
sdb    202:144  0  20G  0 disk
└ sdb1 202:145  0   1G  0 [SWAP]
└─sdb2 202:145  0   8G  0 part

今回くっつけたものはsdbとして認識されていました。
partedでパーティション操作を行っていきます。

ない場合は、 yum install parted か apt-get install partedでインストールします。

# parted /dev/sdb
GNU Parted 2.1
/dev/sdb を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。

表記をセクターに変更します。

(parted) unit s

現在の情報を表示します。

(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 41943040s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number  Start     End        Size       Type     File system     Flags
1      2048s     1953791s   1951744s   primary  linux-swap(v1)
2      1953792s  15988735s  15986688s  primary   ext4            boot

この情報はあとで使用するため、メモしておきましょう。
今回は、特にNumber2の行が重要になります。

次に、パーティションを削除します。

(parted) rm 2

パーティションを作成します。

(parted) mkpart
Partition name? []?
File system type? [ext2]? ext4
Start? 1953792s
End? 100%

パーティションサイズ以外は、元のパーティションと同じになるように修正します。

(parted) set 2 boot on
(parted) set 2 LBA off

ここまでできたら、EndとSize以外は元と同じになっているか確認します。

(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 41943040s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number  Start     End        Size       Type     File system     Flags
1      2048s     1953791s   1951744s   primary  linux-swap(v1)
2      1953792s  41943039s  39989248s  primary  ext4            boot

終了!

(parted) quit

20GBに拡張されていることを確認します。

# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda    202:65   0   8G  0 disk /
└ sda1 202:145  0   1G  0 part
└─sda2 202:145  0   8G  0 part
sdb    202:144  0  20G  0 disk
└ sdb1 202:145  0   1G  0 [SWAP]
└─sdb2 202:145  0  19G  0 part

念のため、ディスクチェックをかけましょう。

e2fsck -f /dev/sdb2

ここまでできたら、適当な仮想サーバをシャットダウンしてディスクを外します。

パーティション拡張したディスクで起動

インスタンスを起動します。

resize2fs /dev/sda2

ここで、サイズが20GBに拡張されたら完了です。

box作成

あとはVagrantfileがあるディレクトリでboxを作成して終了です。

vagrant package

td-agentにてAWSのRDS(postgres)のログをTDに送信

AWSのRDSはLinuxサーバではない為、こちらからいろいろな設定ができません。

その為、どのようにPostgresのログを送信すればよいか、いろいろ試行錯誤したのでその備忘録です。
前提として、RDSに接続できるLinuxインスタンスにtd-agentが入っている状態が必要です。

fluent-plugin-rds-pgsql-log

https://github.com/shinsaka/fluent-plugin-rds-pgsql-log
RDSのpostgresのログを取得するには上記のプラグインを利用します。

このプラグインはAWS RDSのログを取得し、td-agentのsourceとして利用できるようにするプラグインです。

ただ導入にあたり、依存関係に「AWS SDK」があるのですが、パッケージで導入したtd-agentでは
fluentd-gem fluent-plugin-rds-pgsql-log にて導入ができませんので、以下のように導入します。

まず、td-agentに入っているrubyからaws-sdkをインストール

/usr/lib64/fluent/ruby/bin/gem install aws-sdk

fluent-plugin-rds-pgsql-logのプラグインを直接プラグインディレクトリにほおりこむ

wget https://raw.githubusercontent.com/shinsaka/fluent-plugin-rds-pgsql-log/master/lib/fluent/plugin/in_rds_pgsql_log.rb -P /etc/td-agent/plugin

これでpostgresのログをTDに送信できました。

<match td.postgres.log>
type tdlog
apikey *****************************
auto_create_table
database postgres
table log
buffer_type file
buffer_path /var/log/td-agent/buffer/td
flush_interval 180s
</match>
<source>
  type rds_pgsql_log
  region ap-northeast-1
  db_instance_identifier prod-auth
  access_key_id ******************
  secret_access_key *********************************
  refresh_interval  30
  tag td.postgres.log
  pos_file /var/log/td-agent/pgsql-prod-auth-log-pos.dat
</source>

こんな感じのデータが送信されます

{"message_level"=>"LOG", "time"=>"1436510427", "ident"=>"postgres", "host"=>"10.0.0.21(22112)", "database"=>"[unknown]", "user"=>"[unknown]", "pid"=>"6080", "log_file_name"=>"error/postgresql.log.2015-07-10-00", "message"=>"  connection received: host=10.0.0.21 port=53253"}

host部分がSQL発行元IPになる

管理の上ではhost部分はRDSの名前になっているのが望ましいので、host部分を強制的に変更します。
データをリフォームする為に「fluent-plugin-record-reformer」というプラグインを利用しました。

https://github.com/sonots/fluent-plugin-record-reformer

wget https://raw.githubusercontent.com/sonots/fluent-plugin-record-reformer/master/lib/fluent/plugin/out_record_reformer.rb -P /etc/td-agent/plugin

最終的なtd-agent.confは以下のようになりました。

<match td.postgres.log>
type record_reformer
renew_record false
enable_ruby false
tag reformed.td.postgres.log
# 強制的に文言を変更する
host rds-postgres01
ident postgres
</match>
<match reformed.td.postgres.log>
  type tdlog
  apikey *****************************
  auto_create_table
  database postgres
  table log
  buffer_type file
  buffer_path /var/log/td-agent/buffer/td
flush_interval 180s
</match>
<source>
  type rds_pgsql_log
  region ap-northeast-1
  db_instance_identifier prod-auth
  access_key_id ******************
  secret_access_key *********************************
  refresh_interval  30
  tag td.postgres.log
  pos_file /var/log/td-agent/pgsql-prod-auth-log-pos.dat
</source>

VimでGo言語を書く環境を設定する

概要

Go言語をインストールして実行できる環境を作り、
VimでGo言語を書く設定をしていきます。

Goのインストール

以下のページでバイナリをダウンロードし、ホームディレクトリに設置します。
https://golang.org/dl/

wget https://storage.googleapis.com/golang/go1.3.3.linux-amd64.tar.gz
tar xvzf go1.3.3.linux-amd64.tar.gz
mv go1.3.3.linux-amd64 ~/go

Goパッケージの保存先であるディレクトリを作成します。

mkdir ~/go/packages

.bashrcなどに、以下の環境変数を設定します。

export GOROOT=~/go
export GOPATH=$GOROOT/packages
export PATH=$PATH:$GOROOT/bin

「source ~/.bashrc」で設定を有効にすると、goコマンドが使用できるようになります。

Vimの設定

goコマンドを使用して、以下のパッケージをインストールしておきます。

パッケージ 機能
gocode 入力補完
golint コーディング規約チェック
godef 定義ジャンプ

インストールコマンドは以下のようになります。

go get github.com/nsf/gocode
go get github.com/golang/lint/golint
go get code.google.com/p/rog-go/exp/cmd/godef

Goに対するVimの設定ですが、パッケージに同封されているVim設定ファイルを使用します。
上記の方法でインストールしている場合は、~/go/misc/vimに存在しています。

※現在のGoリポジトリにはmisc/vimは入っていないようです。将来的には少し違う設定になると思います。http://vim-jp.org/blog/2014/09/02/vim-go-extra.html

.vimrcに以下の設定を追記します。

filetype off
filetype plugin indent off
set runtimepath+=$GOROOT/misc/vim
filetype plugin indent on
syntax on
autocmd FileType go autocmd BufWritePre  Fmt
set rtp+=$GOPATH/src/github.com/nsf/gocode/vim
set rtp+=$GOPATH/src/github.com/golang/lint/misc/vim
set completeopt=menu,preview

これで自動補完や自動フォーマットが動作するようになります。

以下、よく使うコマンドを表にしておきます。

コマンド 意味
:Import {コマンド名} importにパッケージ名を追加
:Drop {パッケージ名} importにパッケージ名を削除
:GoDoc {パッケージ名} パッケージのドキュメントを閲覧する
:Godef {定数名/関数名など} 定義ジャンプ

参考

Vimを使ったGo言語開発手法
http://mattn.kaoriya.net/software/vim/20130531000559.htm

Go言語のインストール
http://golang.jp/install

GOPATH は適当に決めて問題ない
http://qiita.com/yuku_t/items/c7ab1b1519825cc2c06f

Go言語の開発環境構築 (Golang + Mac OS X + Vim)
http://note-of-engineer-b.blogspot.jp/2013/12/golang-setup.html

linux‘find‘コマンドのご紹介

こんにちは、サーバーインフラエンジニアの葉です。
遅くなりましたが、明けましておめでとうございます。
本年も何卒よろしくお願いいたします。

今日は、findをご紹介します。
条件を指定してファイルやディレクトリを検索するコマンドで、検索結果を別のコマンドの引数として実行することが出来ます。

find基本的使い方

[code]
find 検索開始ディレクトリ 検索条件 コマンド
[/code]

検索条件

-name

  検索するファイルを指定。

[code]
find /home/yo -name “test
[/code]
というコマンドを実行するとき
カレントディレクトリ以下に
[code]
/home/yo/test3.txt.gz
/home/yo/test6.txt
/home/yo/test1.txt.gz
/home/yo/test5.txt
/home/yo/test2.txt.gz
/home/yo/test4.txt
[/code]
-iname file

  検索するファイル名を指定。大文字小文字を区別しない以外は -name と同じ。

-atime [+-]n
n日前にアクセスされたファイル。

-atime 2 2日前にアクセスされたファイル
-atime +2 3日以前にアクセスされたファイル
-atime -2 1日以内にアクセスされたファイル

-ctime [+-]n
n日前にファイルステータスが変更されたファイル

-ctime 2 ちょうど2日前にファイルステータスが変更されたファイル
-ctime +2 3日以前にファイルステータスが変更されたファイル
-ctime -2 1日以内にファイルステータスが変更されたファイル

-mtime [+-]n
n日前に修正されたファイル

-mtime 2 ちょうど2日前に修正されたファイル
-mtime +2 3日以前に修正されたファイル
-mtime -2 1日以内に修正されたファイル

アクション

次に検索結果を引数にして実行するのに -exec というアクションを使います。使い方は、
[code]
-exec [command] {} \;
[/code]

過去n日を除き削除してみる

ホームディレクトリ以下に yo ディレクトリで過去90日ごとのファイルを作ります。

  このディレクトリの中の 90日前より古いファイルを削除してみます。いきなり 削除するのは危険なのでまずは検索だけして、目的の結果が得られたことを確認してから削除しましょう。

[code]
find /home/yo -name “test” -exec ls –axl {} \;
[/code]
[code]
-rw-r–r– 1 root root 0 9月 1 12:00 /home/yo/test1.txt
-rw-r–r– 1 root root 0 10月 1 12:00 /home/yo/test3.txt
-rw-r–r– 1 root root 11 1月 6 17:22 /home/yo/test6.txt
-rw-r–r– 1 root root 0 12月 1 12:00 /home/yo/test5.txt
-rw-r–r– 1 root root 0 11月 1 12:00 /home/yo/test4.txt
-rw-r–r– 1 root root 0 8月 1 12:00 /home/yo/test2.txt
[/code]
今日は 1月6日なので 90日前の 11月よりも古いファイル、つまり 8、9、10月のファイルが出力されたので目的の結果が得られたことが確認できたので -exec で繋げて削除します。※-okで繋げたら削除前、削除確認あります。

[code]
find /home/yo -name “test” -exec rm -f {} \;
[/code]
もう一回検索だけして、
[code]
find /home/yo -name “test” -exec ls –axl {} \;
[/code]
[code]
-rw-r–r– 1 root root 11 1月 6 17:22 /home/yo/test6.txt
-rw-r–r– 1 root root 0 12月 1 12:00 /home/yo/test5.txt
-rw-r–r– 1 root root 0 11月 1 12:00 /home/yo/test4.txt
[/code]
成功しました。

まとめ

find コマンドは本当に便利です。特に大量ファイルを削除とか圧縮するときに、めっちゃ使いやすいです。
ぜひ使いこなしてください。

NFSインストール&設定

向寒のみぎり、お健やかにお過ごしのことと存じます。
サーバーインフラエンジニアの葉です。
今日、NFS centos用の設定をご紹介します。

使用環境

nfsサーバー(192.168.56.22)
nfs-clientサーバー(192.168.56.21)

環境インストール

nfsサーバー

nfsサーバーインストール
[code]
yum install nfs-utils
[/code]

nfs-clientサーバー

nfs-clientサーバーインストール
[code]
yum install rpcbind
[/code]

nfs設定

共有ディレクトリを作成します

[code]
mkdir /home/nfs
[/code]

exportsの編集

vi /etc/exports
[code]
/home/nfs 192.168.56.0/24(rw,no_wdelay,root_squash)

・/home/nfs #公開ディレクト
・192.168.56.0/24 #接続を許可するクライアント
・(rw,no_wdelay,root_squash) #オプション。
[/code]

exportfsコマンドで設定の反映と確認を行います。

[code]
exportfs -ra
exportfs -v
[/code]

オプション。詳細は下記参照

※一般的なオプションの説明

オプション名 説明
ro 読み込み専用で
rw 読み書きを許可して
sync asyncと反対。ファイル更新が直ちに行われる
async ディレクトリ内のファイルは非同期に反映される
wdelay 複数の書き込み処理を1度に行う。NFSサーバ側での更新を一括して行う
no_wdelay wdelayのとは反対。syncオプションと併用する
noaccess 共有しない

マッピングに関するオプションの説明

オプション名 説明
all_squash 全てのUID,GIDを匿名アカウントへマッピング(nfsnobody)
anonuid 全てのUIDを匿名アカウントへマッピング
anongid 全てのGIDを匿名グループへマッピング(nfsnobody)
squash_uids 指定UIDを匿名アカウントに変換
squash_gids 指定したGIDユーザをすべて匿名グループへマッピング
map_daemon 動的なUID,GID変換を有効
map_identity UID,GIDに関する変換を行わない。
map_static UID,GIDに関する変換を定義するマップファイルを指定する
map_nis NISベースのUID,GID変換を有効
root_squash root特権をnfsnobodyに変換する
no_root_squash root_squashの反対。root特権有効

nfs起動

nfsサーバー

[code]
/etc/init.d/rpcbind start
/etc/init.d/nfslock start
/etc/init.d/nfs start
[/code]

自動起動の設定を行います。

[code]
chkconfig rpcbind on
chkconfig nfslock on
chkconfig nfs on
[/code]

nfs-clientサーバー

rpcbindを起動します。

[code]
/etc/init.d/rpcbind start
[/code]

マウント

[code]
mount -t nfs 192.168.56.22:/home/nfs /home/nfs/
[/code]
マウントした、あれ?エラーがでました。
・下記のエラーが出る場合
mount: 間違ったファイルシステムタイプ、不正なオプション、
192.168.56.22:/home/nfs のスーパーブロックが不正、コードページまたは
ヘルパープログラムの未指定、或いは他のエラー
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount. helper program)
In some cases useful info is found in syslog – try
dmesg | tail or so
[code]
yum install nfs-utils nfs-utils-libパッケージをインストールすればokです。
[/code]

自動マウントの設定

vi /etc/fstab
192.168.56.22:/home/nfs /home/nfs nfs rw 0 0

まとめ

同期時間、2.4GBのファイル22秒くらいです。
お役に立ちそうでしたら、ぜひご参考ください。

PS3 Media Server をDebian(wheezy)にインストールしてDLNAサーバにする

自宅のDebiansambaを入れてファイルサーバとして使用しています。

今回、このサーバーに保存された動画をリビングの大きいテレビで再生したいと思いました。
再生側はPS3ですのでPS3 Media Serverを導入してDLNAサーバーとし、PS3から再生できるようにします。

PS3 Media Serverとは

PS3用のDLNAサーバソフトです。
javaで作成されており、WindowsMAC、そしてLinuxでも動作します。

DLNAとは

DLNA(Digital Living Network Alliance)とは、AV家電やパソコン、スマホタブレットなど、
機器やメーカーを問わず、LANを通じて、映像・音楽・写真をやりとりできるようにするための規格です。

PS3DLNA対応機器ですので、DebianサーバーをDLNAサーバとすればリビングのPS3Debianサーバーの動画を再生することができるようになります。

インストール手順

sources.list にマルチメディア関連のリポジトリを追加

vi /etc/apt/sources.list
deb http://www.deb-multimedia.org wheezy main non-free

マルチメディアリポジトリのキーリングを入れる

apt-get install deb-multimedia-keyring

リポジトリ情報を更新

apt-get update

必要パッケージのインストール

apt-get install openjdk-6-jre openjdk-6-jre-headless openjdk-6-jre-lib unzip
apt-get install mediainfo mplayer mencoder ffmpeg

PS3 Media Server の本体をインストール

PS3 Media Server の本体をhttp://ps3mediaserver.googlecode.com/ からインストール

cd /usr/local/src
wget http://sourceforge.net/projects/ps3mediaserver/files/pms-1.90.1-generic-linux-unix.tar.gz/download
tar zxvf pms-1.90.1-generic-linux-unix.tar.gz
cd pms-1.90.1
mkdir /opt/pms
mkdir /var/log/pms
cp -r ./pms-1.90.1/* /opt/pms/

設定ファイルを編集

vi /opt/pms/PMS.conf
language = ja
minimized = true
folders = /home/data/video1,/home/data/video2

foldersに公開したいディレクトリをカンマ区切りで記述します

起動ファイルを準備

起動ファイルがフォーラムで配られているのでダウンロードして使わせてもらう

cd /opt/pms/
wget http://www.ps3mediaserver.org/forum/download/file.php?id=1741\&amp;sid=eaf9e0f97250b087e1bc6c608627a963 -O PS3MediaServer30.zip
unzip PS3MediaServer30.zip
mv PS3MediaServer /etc/init.d/.
chmod a+x /etc/init.d/PS3MediaServer
chown root:root /etc/init.d/PS3MediaServer

起動ファイルを修正

vi /etc/init.d/PS3MediaServer

実行ユーザーがマルコさんになってるのでrootに変更する

PMSUSER=marco
PMSGROUP=sfz
↓
PMSUSER=root
PMSGROUP=root

自動起動設定を行う

update-rc.d PS3MediaServer defaults

PS3 Media Server を起動!

/etc/init.d/PS3MediaServer start

PS3から確認する

PS3を起動して、PS3 Media Server が項目に現れれば成功です。
選択して動画の再生をテストしましょう。

参考

参考というかほぼこのままです
Debian に PS3 Media Server 導入 -squeeze編-

LPIC試験受けましょう!

  サーバーインフラエンジニアの葉です。

LPICという資格をご存知ですか?

  「LPIC(エルピック)」とは、NPO法人/Linux技術者認定機関「LPI」が
実施している世界共通・世界最大・最高品質の「Linux技術者認定制度」です。

LPICはどんな資格ですか?

  

1.LPICは世界で通用するIT資格です。

世界共通基準で認定を行っており、150カ国以上の方々に受験されています。
  

2.LPICLinuxの技術力を中立公正に判定するIT資格です。

Linuxの技術力を客観的に評価する資格です。

LPICの試験の種類

LPICには、全部でレベルが3つがあります。
LPICレベル1、LPICレベル2、LPICレベル3です。

今回、私はレベル1を受けることになりました。

LPICレベル1概要

望まれるスキルレベル
LPICレベル1は、下記が問題なく行えるというレベルの試験内容となっております。
Linuxコマンドラインで作業を行うユーザの支援、大規模システムへのユーザの追加。
・バックアップとリストア、停止と再起動といった、簡単な保守作業を実行する(Xを含む)。
ワークステーションのインストールと設定や、そのワークステーションのLANへの接続、
 またはモデム経由でのスタンドアロンPCのインターネットへの接続を行う。
認定要件
「101試験」と「102試験」の2試験に合格するとLPICレベル1に認定されます。
受験する順番は、「101試験」と「102試験」のどちらからでも構いません。
※ ただし、認定されるためには2試験(101試験と102試験)を5年以内に合格する必要があります。
参考資料:www.lpi.or.jp/

まとめ

私の目標は、先ずLPICレベル1資格を合格することです。
そしてその次は、LPICレベル2に合格することを目指して頑張ります!
皆さんも興味が湧きましたら、ぜひ受けてみてください。

HP ProLiant Gen8サーバーにCentOS6.4(64bit)を入れる

HPのサーバーをCentOSで使いたい事が出てきてインストールにいろいろ試行錯誤したので備忘録です。
今回やりたい事はCentOS6.4でDynamic Smart Arrayを使ってRAID1を構築し、管理したいという内容となります。
HP ProLiant DL320e Gen8 v2に入れてみました

準備

・CentOS6.4(64bit)のCD
・光学ドライブがないのでUSBの外付けCDドライブ
・USBメモリ
・その他管理ツールのパッケージをHPのサポートページからダウンロード

HP ProLiant本体のRAID設定

HP ProLiant DL320e Gen8 v2はHP Dynamic Smart Array B120iコントローラが標準でついているので、これを使ってRAIDを組みます。

コントローラーの有効化

起動時にF9を押してRBSUなるメニューを開きます。
[システム オプション]>[SATAコントローラーオプション]>[内蔵SATA設定]>[ダイナミックHP SmartアレイB120i RAIDサポートを有効]の順に選択。

参考
HP Dynamic SmartアレイRAIDコントローラー ユーザー ガイド

RAID1の構築

起動時にF5を押してアレイ設定ツールを開く
ウィザードのタブから、ディスクを選択して、ミラーリングの設定をする

CentOSのインストール

上記作業でRAID構築は完了したはずなのですが、
通常通りインストールを行おうと思ってもSmart Arrayコントローラが認識されず、HDDが2個と認識されてしまいます。
これはCentOSにSmart Arrayのドライバが存在しない事が原因なのでOSインストール時にドライバを読み込ませる必要があります。

Smart Arrayのディスケットドライバの入手

まずはSmart ArrayのディスケットドライバをHPサポートセンター のページから入手します。
ちなみにHP Dynamic Smart Array B120iのものはこちらから入手できました。

今回はCentOS6.4ですのでRHEL6 update4 のディスケットドライバをダウンロードします。
この記事を書いている2013/12/06時点ではhpvsa-1.2.6-27.rhel6u4.x86_64.dd.gz というファイルでした。
ドライバをダウンロードしたら解凍します。dd.imgというファイルが出来たのでそちらをUSBメモリにコピーします。

CentOSインストール時にディスケットドライバの読み込み

さきほどのディスケットドライバを保存したUSBをサーバーに刺し、CentOSのインストールCDからブートを行います。
CentOSのインストールメニューが出たら、「ESC」キーを押してインストール起動パラメータを入力します。

linux dd blacklist=ahci

としてエンターを押します。
※上記のような起動パラメータでインストールしないと、カーネルがAHCIのモジュールを自動で読み込みPanicを起こします。

ドライバの読み込みするか?といった質問が出るのでyesを選択し、[sda]か何かを開きます。
USBの中身がメニューが出ますので保存していたディスケットドライバを選択します。
※ここのメニューでHDDがいっぱい認識されていればインストール起動パラメータが間違っているかもです。

あとは普通にインストールを行えばOKです。
変なとこにインストールしないように任意のタイミングでUSBは抜くといいとおもいます。

HPのユーティリティインストール

CentOSが起動してからの作業です。
以下のredhat用パッケージをHPサポートセンター のページから入手します。
kmod-hpsa hp-health hpsmh hp-smh-templates cpqacuxe hpacucli hp-snmp-agents hpdiags のパッケージを入手します。rhel6u4でx86_64のものを選択します。

ユーティリティの入手

今回使用しているHP ProLiant DL320e Gen8 v2(Dynamic Smart Array B120i)では以下のページにて入手できました。
cpqacuxe 及び hpacucliについてはDynamic Smart Array B120i用ドライバ のページから入手し、
その他のパッケージはHP Service Pack for ProLiantのisoファイル内の/hp/swpackages 内に存在しました。

これらのファイルをインストールしたCentOSサーバーに転送します。

CentOS側ではhp のユーティリティインストールで、CentOS をRHELとして認識させる為に以下の変更を行います。

mv /etc/redhat-release /etc/redhat-release.old
echo "Red Hat Enterprise Linux Server release 6.4 (Santiago)" > /etc/redhat-release

また、ユーティリティソフトはsnmpを必要とする為、snmpパッケージをインストールしておき、簡単な設定を行っておきます。

yum install net-snmp net-snmp-libs
echo "dlmod cmaX /usr/lib64/libcmaX64.so" >> /etc/snmp/snmpd.conf
echo "rwcommunity private 127.0.0.1" >> /etc/snmp/snmpd.conf
echo "rocommunity public 127.0.0.1" >> /etc/snmp/snmpd.conf

ユーティリティのインストール

ダウンロードしたユーティリティのディレクトリに移動し、以下のようにインストールします。

yum localinstall kmod-hpsa-3.4.2-4.rhel6u4.x86_64.rpm \
cpqacuxe-9.40-12.0.x86_64.rpm \
hpacucli-9.40-12.0.x86_64.rpm \
hp-health-9.40-1602.44.rhel6.x86_64.rpm \
hpsmh-7.2.2-8.x86_64.rpm \
hp-smh-templates-9.4.0-1327.37.noarch.rpm \
hp-snmp-agents-9.40-2506.37.rhel6.x86_64.rpm \
hpdiags-9.5.0-938.linux.x86_64.rpm \
hponcfg-4.2.0-0.x86_64.rpm

snmpの設定を設定し、hp-snmp-agentsを起動します。

/etc/init.d/snmpd restart
sed -i 's/^exclude/exclude\ cpqriisd\ cmarackd/' /opt/hp/hp-snmp-agents/cma.conf
/etc/init.d/hp-snmp-agents restart

確認作業

まずはCLIが動作しているか確認します。

# hpacucli
HP Array Configuration Utility CLI 9.40.12.0
Detecting Controllers...Done.
Type "help" for a list of supported commands.
Type "exit" to close the console.
=&gt; ctrl slot=0 show config
Dynamic Smart Array B120i RAID in Slot 0 (Embedded)
array A (SATA, Unused Space: 0  MB)
logicaldrive 1 (1.8 TB, RAID 1, OK)
physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SATA, 2 TB, OK)
physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SATA, 2 TB, OK)
=&gt;

ちゃんとOKのステータスが確認できました。

引数の指定の仕方がすごい違和感ですが
ctrl slot=0 show configでコントローラ スロット0の設定を見る って感じみたいですね。

続いてWEBUIを確認します。
Smart Array 設定ツール (WEBUI)のリモート接続を許可します。
こちらはCentOSの起動時に自動実行させるようにしておいてもよいかもしれません。

cpqacuxe -R

以下のようなURLで接続する事でsystems management homepageが開きます。

https://[ホスト名 or IP]:2381/

うまくインストールできていればログイン画面が出ます。
Linuxのrootユーザーでログインします。

ログインが成功し、さらにcpqacuxeのインストールが成功していれば、ストレージメニューに「アレイコンフィギュレーションユーティリティ」のメニューがあるので、そちらをクリックします。

Smart Array (RAIDコントローラ)の設定が可能なWEBIUが開きます。

hpacucliが使えない時

WEBUIのSmartArrayを起動するとこんな感じのエラーが出てhpacucliは使用できなくなります。

# hpacucli
HP Array Configuration Utility CLI 9.40.12.0
Detecting Controllers...
Error: Another instance of ACU is already running (possibly a service). Please
terminate the ACU application before running the ACU CLI. Press ENTER to
exit.

CLIを使用する際はcpqacuxe をストップして下さい。

cpqacuxe -stop

確認

# hpacucli
HP Array Configuration Utility CLI 9.40.12.0
Detecting Controllers...Done.
Type "help" for a list of supported commands.
Type "exit" to close the console.
=>

webUIを使用の際は起動は同じくこちらのコマンドで。

cpqacuxe -R

メールを大量にテスト受信するサーバを作ってみた話

とにかく大量のメールを受信するだけサーバが欲しかったのでPerlで作ってみました。

Net::Server::Mail::SMTP + Parallel::Preforkを使ったプリフォーク型サーバにしました。
Net::Server::Mail::SMTPSMTPコマンドそれぞれの処理を書き、
Parallel::Preforkでプリフォークの制御を行っています。

以下がサーバのプログラムになります。
プログラムの構成としては、Starletのコードを参考にしています。

package TestMailReceiver;
use strict;
use warnings;
use IO::Socket::INET;
use Parallel::Prefork;
use Net::Server::Mail::SMTP;
use Socket qw(IPPROTO_TCP TCP_NODELAY);
sub new {
my ($class, %args) = @_;
my $self = bless {
host        =&gt; $args{host} || 0,
port        =&gt; $args{port} || 25,
max_workers =&gt; $args{max_workers} || 10,
};
$self;
}
sub setup_listener {
my $self = shift;
$self-&gt;{listen_sock} ||= IO::Socket::INET-&gt;new(
Listen    =&gt; SOMAXCONN,
LocalPort =&gt; $self-&gt;{port},
LocalAddr =&gt; $self-&gt;{host},
Proto     =&gt; 'tcp',
ReuseAddr =&gt; 1,
) or die "failed to listen to port $self-&gt;{port}:$!";
if ($^O eq 'linux') {
setsockopt($self-&gt;{listen_sock}, IPPROTO_TCP, 9, 1)
and $self-&gt;{_using_defer_accept} = 1;
}
}
sub accept_loop {
my ($self, $max_reqs_per_child) = @_;
my $proc_req_count = 0;
while (! defined $max_reqs_per_child || $proc_req_count &lt; $max_reqs_per_child) {
if (my $conn = $self-&gt;{listen_sock}-&gt;accept) {
$self-&gt;{_is_deferred_accept} = $self-&gt;{_using_defer_accept};
$conn-&gt;blocking(0)
or die "failed to set socket to nonblocking mode:$!";
$conn-&gt;setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
or die "setsockopt(TCP_NODELAY) failed:$!";
$proc_req_count++;
my $smtp = Net::Server::Mail::SMTP-&gt;new( 'socket' =&gt; $conn );
$smtp-&gt;set_callback( 'RCPT' =&gt; sub { return (1) } );
$smtp-&gt;set_callback( 'DATA' =&gt; sub { return (1, 250, 'message queued') });
$smtp-&gt;process;
$conn-&gt;close;
}
}
}
sub run {
my ($self) = @_;
$self-&gt;setup_listener();
if ($self-&gt;{max_workers} != 0) {
# use Parallel::Prefork
my %pm_args = (
max_workers =&gt; $self-&gt;{max_workers},
trap_signals =&gt; {
TERM =&gt; 'TERM',
HUP  =&gt; 'TERM',
},
);
my $pm = Parallel::Prefork-&gt;new(\%pm_args);
while ($pm-&gt;signal_received !~ /^(TERM|USR1)$/) {
$pm-&gt;start and next;
$self-&gt;accept_loop();
$pm-&gt;finish;
}
} else {
# run directly, mainly for debugging
local $SIG{TERM} = sub { exit 0; };
while (1) {
$self-&gt;accept_loop();
}
}
}
1;
package main;
my $server = TestMailReceiver-&gt;new(
host =&gt; '',
port =&gt; 25,
max_workers =&gt; 200,
);
$server-&gt;run;

メールを受信してファイル書き込まずに捨てるだけのサーバです。
メールをファイルに書き出す処理など、普通のサーバで行われる処理を全部無くしているので、
大量のメールを受信してもだいぶ軽い動作になりました。

TODOとしては、テストでメール受信統計などを取ることができるようになればいいなと思ってます。

以下、主に使っているモジュールについての解説です。

Net::Server::Mail::SMTP

Net::Server::Mail::SMTPSMTPプロトコルを実装したモジュールです。
Net::Server::Mail::SMTPを使えば、自前のSMTPサーバを簡単に作ることができます。
HELO, MAIL, RCPT, DATAなどのコマンドに対する処理をコールバックの形で書きます。

use strict;
use warnings;
use utf8;
use IO::Socket::INET;
use Net::Server::Mail::SMTP;
my @local_domains = qw(example.com example.org localhost);
my $msgid = 1;
sub add_queue {
return $msgid++;
}
my $server = IO::Socket::INET-&gt;new(
Listen =&gt; 1,
LocalPort =&gt; 2500,
);
my $conn;
while ($conn = $server-&gt;accept) {
my $smtp = Net::Server::Mail::SMTP-&gt;new(
socket =&gt; $conn,
);
# HELOコマンドの処理
$smtp-&gt;set_callback(
HELO =&gt; sub {
my ($session, $hostname) = @_;
if ($hostname eq 'localhost') {
return (0, 553, q(I don't like this hostname, try again.));
}
return 1;
},
);
# RCPTコマンドの処理
$smtp-&gt;set_callback(
RCPT =&gt; sub {
my ($session, $recipient) = @_;
my $domain;
if ($recipient =~ /@(.*)\s*$/) {
$domain = $1;
}
if (not defined $domain) {
return (0, 513, 'Syntax error.');
}
elsif (not(grep $domain eq $_, @local_domains)) {
return (0, 554, "$recipient: Recipient address rejected: Relay access denied");
}
return (1);
}
);
# DATAコマンドの処理
$smtp-&gt;set_callback(
DATA =&gt; sub {
my ($session, $data) = @_;
my $sender = $session-&gt;get_sender();
my @recipients = $session-&gt;get_recipients();
return (0, 554, 'Error: no valid recipients') unless @recipients;
# キューに追加。add_queueは自前で実装する必要がある
my $msgid = add_queue($sender, \@recipients, $data) or return(0);
return (1, 250, "message queued $msgid");
}
);
$smtp-&gt;process();
$conn-&gt;close();
}

このコードを実行し、以下のようにtelnetで繋いで各コマンドの動作を確かめると、
意図したレスポンスがサーバから返ってくることが確認できます。

$ telnet localhost 2500
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 debian2 SMTP Net::Server::Mail (Perl) Service ready
HELO localhost
553 I don't like this hostname, try again.
HELO hogehoge
250 Requested mail action okay, completed
MAIL FROM: 
250 sender hogehoge@example.com OK
RCPT TO: 
554 hogehoge@example.net: Recipient address rejected: Relay access denied
RCPT TO: 
250 recipient hogehoge@example.com OK
DATA
354 Start mail input; end with .
test
.
250 message queued 1
quit
221 debian2 Service closing transmission channel
Connection closed by foreign host.

テストでSMTPサーバを作成したい場合などに便利ですね。

自動テストのためにメールサーバを一時的に起動する

Parallel::Prefork

Parallel::Preforkはプリフォークサーバを書くためのモジュールです。
似た名前で似た使い方をするParallel::ForkManagerというモジュールがありますが、
Parallel::Preforkはシグナル管理が可能になっています。

たとえば次のようなプリフォーク型Echoサーバを書くことができます(あんま有用ではないですが)。

use strict;
use warnings;
use utf8;
use IO::Socket::INET;
use Parallel::Prefork;
sub MaxRequestsPerChild() { 100 }
my $listen_sock = IO::Socket::INET-&gt;new(
Listen =&gt; 5,
LocalAddr =&gt; '0.0.0.0:5000',
Proto  =&gt; 'tcp',
) or die $!;
my $pm = Parallel::Prefork-&gt;new({
max_workers =&gt; 10,
trap_signals =&gt; {
TERM =&gt; 'TERM',
HUP  =&gt; 'TERM',
}
});
while ($pm-&gt;signal_received ne 'TERM') {
# ワーカープロセス生成処理
$pm-&gt;start and next;
#### ここからワーカープロセス処理
# 1ワーカーがリクエストを受け付ける数
my $reqs_before_exit = MaxRequestsPerChild;
$SIG{TERM} = sub { $reqs_before_exit = 0 };
while ($reqs_before_exit-- &gt; 0) {
if (my $conn = $listen_sock-&gt;accept()) {
while (my $str = ) {
print $conn "$reqs_before_exit($$): ".$str;
}
$conn-&gt;close;
}
}
# ワーカープロセスの終了処理
$pm-&gt;finish;
}
# 子プロセス待ち受け
$pm-&gt;wait_all_children;

このサーバを実行して、psコマンドで確認してみると「max_workersで設定した数値 + 親プロセス」分のプロセスが存在していることが確認できます。

$ perl prefork_echo.pl &amp;
$ ps a | grep prefork_echo.pl
3963 pts/3    S      0:00 perl prefork_echo.pl
3964 pts/3    S      0:00 perl prefork_echo.pl
3965 pts/3    S      0:00 perl prefork_echo.pl
3966 pts/3    S      0:00 perl prefork_echo.pl
3968 pts/3    S      0:00 perl prefork_echo.pl
3969 pts/3    S      0:00 perl prefork_echo.pl
3970 pts/3    S      0:00 perl prefork_echo.pl
3971 pts/3    S      0:00 perl prefork_echo.pl
3972 pts/3    S      0:00 perl prefork_echo.pl
3973 pts/3    S      0:00 perl prefork_echo.pl
3983 pts/3    S      0:00 perl prefork_echo.pl
4085 pts/3    S+     0:00 grep prefork_echo

また、telnetを用いて接続も確認できます。

$ telnet localhost 5000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
test
99(3967): test
test1
99(3967): test1
test2
99(3967): test2```
何回か繋ぎ直すと、異なるプロセスが対応する様子が確認できます。
pstreeなどで親プロセスの番号を調べて、SIGTERMを送るとサーバを終了させることができます。

$ kill -TERM 3963

このように簡単にプリフォークサーバを書けるようになっています。
<h2><span style="color: #2196f3">まとめ</span></h2>
メール送信系のシステムをテストする場合は、Net::Server::Mail::SMTPで受信サーバを書くのがとても良いです。
また、プリフォークサーバを書きたい場合は、Parallel::Preforkがとても便利です。
このようなツールを書くのに便利なモジュールがあって、やっぱりCPANは素晴らしいですね。
<h2><span style="color: #2196f3">参考</span></h2>
・Net::SMTP vs. Email::Send(er)?
<a href="http://blog.azumakuniyuki.org/2011/08/netsmtp-vs-emailsender.html">http://blog.azumakuniyuki.org/2011/08/netsmtp-vs-emailsender.html</a>
・Parallel::Prefork - Perl でマルチプロセスなサーバを書く方法
<a href="http://labs.cybozu.co.jp/blog/kazuho/archives/2008/04/parallel-prefork.php">http://labs.cybozu.co.jp/blog/kazuho/archives/2008/04/parallel-prefork.php</a>

Debianインストール時にNICドライバがない時の対応方法

Debianはすべてフリーのライセンスでできたもので構成されている。

そのため、非フリーのドライバを使用するNICを使用しているサーバーの場合は以下のようなエラーがでてNICを認識してくれない。

あなたのハードウェアの一部では、操作するのに非フリーのファームウェアファイルが必要です。
ファームウェアは、USBメモリやフロッピーなどのリムーバブルメディアからロードできます。
見つからないファームウェアファイル: rtl_nic/rtl19168e-2.fw
そのようなメディアを今利用できるのであれば、それを入れて続けて下さい。
リムーバブルメディアから見つからないファームウェアをロードしますか?

解決策

説明にある通り、USBメモリを用意した上で作業します。

まずはみつからないファームウェアファイル名でぐぐります。今回だとrtl19168e-2.fwですが検索するとDebianのnon-freeパッケージにて配布されているようです。

http://packages.debian.org/squeeze-backports/firmware-realtek

まずはこちらからdebファイルをダウンロードします。適当なDebian系のLinux上で以下のコマンドを実行する事でdebファイルが展開されます。

[code]
dpkg-deb -x firmwarerealtek_0.28+squeeze1_all.deb hogehoge
[/code]

上記を実行するとカレントにhogehogeというディレクトリを作成してdebパッケージが展開されます。こちらの中にインストールで必要な「rtl19168e-2.fw」があるのでそちらをUSBメモリにコピーします。今回は以下のパスに目的のファイルがありました。

[code]
./hogehoge/lib/firmware/rtl_nic/rtl19168e-2.fw
[/code]

USBメモリにコピーする際はDebianが指定するファームウェアのパスと一緒にする必要があります。今回の例ですと「rtl_nic/rtl19168e-2.fw」が見つからないとなっている為、USBメモリ上にrtl_nicという名前のディレクトリを作成し、そこへ「rtl19168e-2.fw」を持ってきます。

あとは完成したUSBメモリを刺してインストールを続行すればOKです。

インストール後

インストール完了後は念のため、パッケージ自体をインストールしておけばいいかもしれません。

まずはnon-freeパッケージをリポジトリに追加します。

[code]
vi /etc/apt/source_list
[/code]

以下を追加
[code]
deb http://ftp.de.debian.org/debian squeeze main non-free
[/code]

アップデート
[code]
apt-get update
[/code]

以下のようなエラーが発生しました。

[code]
W: GPG error: http://ftp.riken.jp lenny Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY AED4B06F473041FA
W: GPG error: http://ftp.de.debian.org squeeze Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY AED4B06F473041FA
W: これらの問題を解決するためには apt-get update を実行する必要があるかもしれません
[/code]

問題を解決する為にはapt-get updateしろって書いてるけどもちろん鍵認証のエラーなので解決しない。
keyringをインストールし、再度アップデート

[code]
apt-get install debian-archive-keyring
apt-get update
[/code]

NICのドライバファーム(今回はrealtek)をインストール

[code]
apt-get install firmwarerealtek
[/code]

備考

今までこのエラーは
Dell PowerEdge T310
・ShuttleのPC(XPCとか)
の機種で何回か遭遇しましたが、
ほとんどが「realtek」か「broadcom」ですね。
どちらもDebianにはnon-freeとしてドライバが配布されています。

Page 1 of 2

© SEEDS Co.,Ltd.