Vmware仮想マシンにおいて再起動せずにHDDを追加する

システム運用をしているとHDDが足りなくなってきてもいつでも追加できるのが仮想化の大きなメリットです。

しかし、通常の手順ではHDDを追加したあとは一度再起動をしてHDDを認識する必要があります。

DBサーバなど容量が緊急的に不足しているにも関わらず再起動するわけにもいかないという場合、再起動をせずに追加をする方法があります。

Vmware Linux Guest Add a New Hard Disk Without Rebooting Guest
https://www.cyberciti.biz/tips/vmware-add-a-new-hard-disk-without-rebooting-guest.html

詳細は上記サイトをご覧頂ければと思いますが、STEP2の部分だけ簡単に説明を。

全部省略(をい!)すると下記コマンドで新しいHDDを認識します。

echo "- - -" > /sys/class/scsi_host/host0/scan

host0のところはホストアダプタによって変わると思いますが、2つもホストアダプタを利用することは無いのでほぼhost0でしょう。

(追記) esxiにおいて5台目(/dev/sde)を追加したとき、host2で認識したのでhost0で認識しない場合は他のアダプタをScanする必要があるようです。

再スキャンをしたあとに

fdisk -l

もしくは以前紹介したSSMを利用している場合は、

ssm list

などとすれば認識しているのが分かると思います。
認識さえすればssmを利用して論理ディスクとして追加すれば即利用可です。
なんとか危機を乗り切りました。(計画性をもって運用しましょう!)

セクターサイズが520byteのSAS HDDを512byteでフォーマットする

前回、HBAカードを入手したのはこれが目的でした。(すごい遠回り)

NetAppやEMCなどのストレージに入っているHDDはセクターサイズが520byteや528byteという変なフォーマットがされていることが多いです。
そのままだと認識してもまったく利用できないので通常の512byteでフォーマットをする必要があります。

Windows環境では簡単なフォーマットの方法は無いと思われるのでUnix環境を利用します。
今回は、CentOS7のLiveCDというUSBやDVDからブートできるOSを利用します。
Rufusで、CentOS-7-x86_64-LiveGNOME-1708.iso をUSBに書き込んで起動。
普通にLinux系環境があればそちらを利用すればいいと思います。

起動したらsuコマンドでrootになってしまいます。

dmsg

で、起動ログを確認します。非常に長いので概要だけですが、下記のようなログが見つかれば認識はしています。
DELLRAIDカードではBLOCKされて認識すらしなかったので大変でした。

sd 7:0:0:0: [sdc] Unsupported sector size 520.
sd 7:0:0:0: [sdc] 0 512-byte logical blocks: (0 B/0 B)
sd 7:0:0:0: [sdc] 520-byte physical blocks

ちゃんと認識されていれば、まずフォーマットツールをインストールします。

yum install sg3_utils

次に、HDDのリストを表示します。

sg_scan -i
/dev/sg2: scsi7 channel=0 id=0 lun=0
    SEAGATE  STE60005 CLAR600 ES0C [rmb=0 cmdq=1 pqual=0 pdev=0x0]

こんな感じで確認した後は、フォーマットを実行します。

sg_format --format --size=512 /dev/sg2

あとはひたすら待つだけです。
結構時間がかかります。16台とかあったら絶望するほど時間がかかります。

これで普通のHDDとして利用できるはずです!
(フォーマット中の待ち時間に記事を書いているため願望レベル)

IBM ServeRAID M1215 (LSI Logic SAS9340-8i) をファーム書き換えでHBAにしてPCで利用する

普段は、DELL製品で固めているのですが、DELLRAIDカードは認定外のSAS HDDをBLOCKしてしまう場合があるので、DELL以外のSAS HBAが必要でした。

新品は高すぎるので中古で探したところ、HP製のLSI SAS 9212-4i などが多く出回っているのですがかなり古いものです。
偶然にも、SAS3(12Gbps)対応のIBM ServeRAID M1215 (LSI Logic SAS9340-8i) が安く手に入ったので早速取り付けてみたのですが、このカード、IBM(Lenovo)のサーバ以外では動作しないようです。安い訳です。

しかし、以前もDELLのPerc H310でやったようにLSIはファーム書き換えという手法がありますので、今回も備忘録的に手順を書いておきます。

まず、参考としたのは次のサイト。(英語です)
How to flash a LSI SAS 3008 HBA (e.g. IBM M1215) to IT mode

英語読める人は直接見た方が早いです。以下は補足です。

まず基礎知識としてLSIRAIDカードはITモード(HBA)と、IRモード(RAID)の2種類があります。最近はHDDが大容量すぎてRAIDが逆効果になってきているのと、Windows Storage SpacesやVMware vSANのようにRAIDが邪魔な場合もあり、HBAが最適なことが多いです。

今回もITモードでHBAにしてしまいます。
言うまでも無いですが、失敗するとカードが壊れるかもしれません。自己責任です。
参考サイトを簡単に補足していきます。

STEP1 必要なファイルを集めます。
 LSIはAvagoに買収されてBroadcomに社名が変わり、Avagoというブランドでカードを作っています。(ややこしい)
 SAS9300-8iのダウンロードサイトは、現在はこちら

参考サイトでは、最新バージョンがP13だったようですが、今回の作業時はP15でしたのでそちらを利用しています。
OSによってはP10が良いと書いてますが、Windows10であれば最新でも大丈夫でしょう。

  • Firmware から 9300_8i_Package_P15_IR_IT_FW_BIOS_for_MSDOS_Windows
  • Management Software and Tools から SAS3FLASH_P15

上記2つのファイルをダウンロードして、それぞれの中身から以下のファイルを集めます。

  • sas3flash.efi
  • SAS9300_8i_IT.bin
  • mptsas3.rom
  • mpt3x64.rom

今回は、DOSではなくUEFIによるファーム書き換えを利用しますのでuefiにあるefiファイルです。他の方法は試していません。(Windows10でLSIアプリから認識もされなかったので無理だと思います)
UEFI Shellを利用してアップデートするわけですが、UEFI Shellが別途必要となります。(これは書いてませんでしたし、知りませんでした)
こちらからx64版をダウンロードします。
https://github.com/tianocore/edk2/tree/master/EdkShellBinPkg/FullShell/X64

  • Shell_Full.efi

これら全部で5つのファイルをUSBに保存して、UEFIのブートメニューを表示、ファイルから実行するオプションで、Shell_Full.efiを起動することでShell画面になります。(実行する手法はPCによって違うと思われます。今回はDELL R420サーバを利用)

STEP2 アダプタの事前準備

写真にあるようにJ6ジャンパを短絡します。リセットするのに必要なようです。
あと、SAS Addressが書き換えで空欄になってしまうのでカードの該当部分を写メでもとって控えておくと作業が楽です。

STEP3 サーバを起動してアダプタをリセットする

先ほど述べたようにUEFI Shellを起動して作業を開始します。
Shellを起動するとfs0 fs1....といったようにUSBの一覧が出たりします。
> fs0:
といった感じで切り替えて
> ls
でファイル一覧を出して該当ドライブかどうかを確認してください。

sas3flash.efi -list

このコマンドで識別しているアダプタのリストを表示します。
私の環境ではSAS3008(C0)までしか表示されませんでした。
詳細が表示されるのであれば、これも写メをとると良いと言っていますね。(SAS Addressが表示されるため)

sas3flash.efi -f SAS9300_8i_IT.bin -noreset

このコマンドが何を意味するのかよくわかりませんが、そのまま実行!!
これは参考サイトどおりになりました。
キーボードレイアウトがUSになっていて(_)とかが打てなかったのですが、TABで補完ができるので切り抜けます!

うまく完了したら、サーバを停止して、J6ジャンパを外します。

STEP4 コントローラをフラッシュする

再度、UEFI Shellを起動して作業を続けます。
コントローラのファームを消すのかな?

sas3flash.efi -o -e 7

これは私の環境では結構長い表示になりましたが完了しました。
次に新しいファームを書き込みます。

sas3flash.efi -f SAS9300_8i_IT.bin -b mptsas3.rom -b mpt3x64.rom

これもTAB補完を駆使しましょう。TAB補完の挙動がUnix系と違いますね。
完了すれば書き換えは完了です。

sas3flash.efi -list

再度リスト表示を実行すると今度はちゃんと詳細まで表示されました。
モードも(IT)となっています。
しかしSAS Addressがすべて0になっているので最初に控えたアドレスに書き換えます。

sas3flash.efi -o -sasadd 50060XXXXXXXXXXXX

再度リスト表示するとアドレスがちゃんと書き換えられたことが確認できると思います。

これで完了です。

手元のPCに差し直して起動するとSAS3008-ITとコントローラが表示されるようになりました。
また、初期にはメニュー画面にも入れなかったのですが、Ctrl+Cでメニューに入ることができます。
Windows10でもHBA(SAS3008)として認識しています。

今回は試していませんが、IRモードにすることもできると思われます。
一度リセットできれば、他のLSIカードと手順は同じと思われますので探してみてください。

当初の目的であったDELL以外のSAS HDDもちゃんと認識され現在フォーマット中です。まぁ、12Gbps対応のHDDとか持っていないので性能なんてわからないんですけどね・・・。

CentOS7でLVM管理 SSM (System Storage Manager)

CentOS7からは、GUIのLVM管理ツール(system-config-lvm)が削除されたようです。

コマンドラインからガリガリと実行すればいいのですが、容量ゼロ!、すぐに追加しないと!という、時にはすっかりコマンドを忘れているのです・・・。
焦っていると間違えてさらに被害が増えたりしますし。

日頃からしっかりとディスク管理をしている人はそんなことはしないのでしょうが。


そこでいろいろ調べた結果、便利だったのがタイトルのSSMコマンドです。

インストールは簡単。(CentOS6にはありませんでした)
# yum install system-storage-manager


RHELの標準マニュアルはこちら
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Storage_Administration_Guide/ch-ssm.html


一般的な使い方はこちら(英語)
http://xmodulo.com/manage-lvm-volumes-centos-rhel-7-system-storage-manager.html


新たなVolumeを作成して新規マウントした場合は、/etc/fstab を書き換えるのを忘れずに!!(自虐)

PMP for Cacti でMySQLを可視化する

「PMP for Cacti」でMySQLのステータスを可視化する

こちらの記事の個人的な補足です。


最新バージョン1.1のダウンロードはこちらから
https://www.percona.com/downloads/percona-monitoring-plugins/


インストール方法はこちらから
https://www.percona.com/doc/percona-monitoring-plugins/1.1/cacti/installing-templates.html#installing-from-tarball

CentOS5にインストールしたのですが、Repoを登録するのが面倒だったのでTarボールからのインストールを利用しました。


設置については、記事の通りですがユーザ名、パスワードの入力は記事の通りSQLで書き換える方法もありますが、インストール時にコピーした ss_get_mysql_status.php を直接書き換える手もあります。

あくまでもデフォルト値を設定するものですので、ホスト毎にユーザ名、パスワードを変えたい場合は利用できません。

書き換える場所は、ss_get_mysql_status.php の先頭の方にある変数で
$mysql_user = 'username';
$mysql_pass = 'password';
$mysql_port = 3306;
このあたりです。

これを書き換えると、Cactiで何も設定しなかったときのデフォルト値になります。
併せて、MySQLでしっかりとIP制限、アクセス制限をかけることをお勧めします。

ZendFramework1でMySQLのエラーコードを取得

ZendFramework1でMySQL等のDBを利用する場合、エラーコードを判別して処理をしたい場合があります。

try {
       $db->insert("db_table", $bind);
       echo "(登録完了)";
} catch (Zend_Exception $e) {
       echo $e->getCode();
       echo $e->getMessage();
}

普通は、こんな感じですね。
ただし、困ったことにここで取れるエラーコードは「23000」など、大まかなエラーコードで
いろいろなエラーで結構重複しています。


https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html
厳密には上記のMySQLエラーコード表にあるSQLSTATEが返ってきます。
そちらではなく、Errorコードの方が欲しい場合にどうするかです。
getMessage()で取れるStringをパースしてもいいのですが、面倒ですし不確実です。


Zend_Exception $e の中身をZend_Debug::dump($e)で覗いてみるとこんな感じです。

object(Zend_Db_Statement_Exception)#87 (8) {
  ["_previous":"Zend_Exception":private] => NULL
  ["message":protected] => string(111) "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '123456739' for key 'uniq_key'"
  ["string":"Exception":private] => string(0) ""
  ["code":protected] => int(23000)
  ["file":protected] => string(69) "/usr/local/zend/share/ZendFramework/library/Zend/Db/Statement/Pdo.php"
  ["line":protected] => int(234)
  ["trace":"Exception":private] => array(12) {
  (途中略)
    ["previous":"Exception":private] => NULL
    ["errorInfo"] => array(3) {
      [0] => string(5) "23000"
      [1] => int(1062)
      [2] => string(57) "Duplicate entry '123456789' for key 'uniq_key'"
    }
  }
}

ちゃんと、最後のerrorInfoで欲しいエラーコード「1062」が入っていることが判ります。
しかし、これを取得する関数はありません。どうすれば・・・ということで試行錯誤してみた結果、
$e->getChainedException()->errorInfo[1] で取れます。
getChainedException()で、下位情報のPDOExceptionが取得でき、そこからerrorInfoを取得します。
Zend_Db_Statement_Exceptionからは直接取得できません。(たぶんprivateなので)
ですので、おそらくPDO(MySQL)に依存した方法です。他のDB等でどうなるかはしりません。


なぜこうなるのか・・・は抽象化した結果でしょうが、気にしないことにします。
正式な取得方法があるのかもしれませんが、MySQL以外使いませんし動けばいいのです!(ダメ思想)


修正したコードはこんな感じでしょうか。

try {
       $db->insert("db_table", $bind);
       echo "(登録完了)";
} catch (Zend_Exception $e) {
       if($e->getChainedException()->errorInfo[1] == 1062) {
            echo "(ERR:重複登録)";
       }
}

Linux系OSとPHPバージョン

ZendFrameworkを利用するのに各種Linuxディストリビューションで採用されているデフォルトのPHPバージョンが知りたかったので調べてみました。
外部パッケージ等は利用しない方針です。

  • CentOS5 PHP5.2.14 + MySQL5.1
  • CentOS6 PHP5.3.3 + MySQL5.1
  • CentOS7 PHP5.4.16 + MariaDB5.5
  • Debian7.7 PHP5.4.34 + MySQL5.5
  • Ubuntu14.04.1 PHP5.5.9 + MySQL5.5-5.6

(参考)

  • ZendServer5.6 PHP5.3.14
  • ZendServer6.3 PHP5.2〜5.5.7(選択できる)


ZendFrameworkが必要とするPHP

  • ZendFramework1 PHP5.2.11〜
  • ZendFramework2 PHP5.3.23〜
  • Apigility PHP5.4.8〜 (5.3.23〜でも動くが制限有)

ZendServerが利用できればCentOS6も候補に入りますが先日書いたように無理なので、CentOS7かDebian系が候補になりそうです。
CentOS7はsystemdへの変更でもう少し様子を見たいところです、Debian系は便利ですがやはり勝手が違うので二の足を踏みます。


どうでもいいですが、Apigility便利です。