2014年9月29日月曜日

MicroServer N54LにESXiを入れる

NTT-Xのセールで数台購入していたMicroServer N54LにESXiを入れてみる。

とりあえずメモリ4GB/HDD500GBの無印構成のままいきます。

この機種はデフォルトは光学ドライブが無い&何かレールが要りそうな雰囲気だったのでインストーラの起動にはTrancesendの8GBのUSBメモリを使用。起動メモリの作成にはいろんなサイトに書かれているのと同様にUNetbootinを使用します。

まず、ここでハマりポイント1。2014/09/29現在フリーのESXiは5.5Update2が最新ですが、このバージョンを使用するとインストーラのブートの途中で止まってしまいました。原因は良く分かりませんがハードのチェックに引っかかってしまっている?誰か原因知っていたら教えて下さい。

と、そんなわけで5.5Update1を使用します。こちらは普通に起動できますが上記のツールを使用すると何やら上書きするかというメッセージが出るのでYesを押して上書きをしてください。(しないとこれまた起動に失敗するメモリが出来上がると思います。Update2では少なくともそうだった。)

これで作成したメモリを本体にさして起動をかけます。今回はそのUSBメモリをそのまま起動ディスクとして使う構成にしようと思うので蓋を開いてマザーにザクッとさしてそこから起動します。
起動そのものは出荷時の状態ではBIOS設定等をいじる必要も無く勝手にUSBメモリから起動すると思うのですが、ここでハマりポイント2。標準構成の4GBのままの場合はインストールプロセスの終盤でメモリサイズのチェックにひっかかるのでちょっとしたパッチを充てる必要があります。

インストーラを起動後、「Welcome to the VMware ESXi 5.5.0 Installation」と出てきたところで、
おもむろにALT+F1を押す。コンソールに落ちるのでID:root / PW:なし でログイン。

# cd /usr/lib/vmware/weasel/util
# rm upgrade_precheck.pyc
# cp upgrade_precheck.py upgrade_precheck.py.old
# vi upgrader_precheck.py

1105行目

MEM_MIN_SIZE = (4 * 1024) * SIZE_MiB



MEM_MIN_SIZE = (1 * 1024) * SIZE_MiB

に修正して、保存、終了。その後インストーラのプロセスを再起動します。

# ps -c | grep weasel

でプロセスIDを確認し

# kill -9 'PID' ('PID'の部分は上記コマンドで確認したID。例えば"kill -9 35795"みたいな感じ)

上記コマンドをうつと先ほどのWelcome画面にくるので、ライセンスに同意等をしインストール先を聞かれるのでインストーラを起動しているUSBメモリを選択します。

その後

  • キーボードは日本語キーボード(繋いでいるものに合わせて)
  • ルートのパスワードは好きな物を
  • インストールするかを聞かれるので指示に従う

これでインストールが始まります。暫く放置してインストール完了後リブートをすると勝手にUSBメモリから起動して使える状態になります。

その後の設定はクライアントから弄る事になりますが、今回はここまでで。


2014年3月6日木曜日

MessageBoxをプログラムから閉じたい

WPFではまってみたのでメモを(多分WinFormsでもWin32でも通じる話?)


◆やりたい事

MessageBox.Showしている時に割り込み処理をしたい。つまりMessageBoxをユーザー操作無しで閉じたい。


◆はまった背景

まず、普通のWindowをダイアログとして表示している場合はとても簡単。Closeしてやるだけです。が、MessageBox.Showは同期処理になっている上に元々Closeというメソッドも存在しません。

じゃー、どうすんのって話でちょっと考えてみた&調べてみた結果

1.カスタムMessageBoxを実装する

 これが間違いないけど作るのも差し替えるのも面倒くさい(いや、それほどでもないか)

2.MessageBoxのcaptionを使ってFindWindow -> SendMessageでWM_CLOSEする

 Win32なアプローチ・・・.NET的には美しくないけど基本的にこれしか無さそうです


◆さらにズブズブはまる

で、2番のアプローチで検討してみるという事でサクサクっと人様のコードをコピペしてみます。


public class MessageBoxEx
{
    private const int WM_CLOSE = 0x0010;

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Unicode)]
    internal static extern int SendMessage(IntPtr hwnd,
                                           int msg,
                                           IntPtr wParam,
                                           IntPtr lParam);
   
    public static void Close(string caption)
    {
        IntPtr mbWnd = FindWindow(null, caption);
        if (mbWnd != IntPtr.Zero)
        {
            SendMessage(mbWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
        }
    }
}


こやつ(MessageBoxEx.Close("hoge");)を呼んでみると・・・閉じない!


~~ ここでしばらくハマる ~~


◆結論として

まぁ、結局何が問題だったのかというと今回対象となるアプリはMessageBoxを

・単にメッセージを表示
・YesNoで選択させる

という2つの使い方をしています。この後者が曲者だった様です。

というのもYesNoの二択の場合双方に対して処理が必要となる選択なのでただ閉じるという選択肢はユルサン!って事らしいのです。(良く見てみるとYesNoの時はクローズボタン押せなくなってマス)

OKCancelやYesNoCancelなどCancel(やっぱやーめた)という選択肢を与えてやると上記のWM_CLOSEで閉じられるようになるという話みたいです。

言われてみれば、あーなるほど!って話なんだけど分からないよねぇ・・・。


◆でもやっぱりYesNoのMessageBoxを使いたい!

んー、やっぱCancel入ってくると少し意味合い変わるし、OKCancelも違うし・・・。という訳でどうすべきかという話。

話は簡単。


ならNoを押せば良いじゃない


というわけで、こんなんなりました。


private const int WM_COMMAND = 0x00000111;
private const int ID_NO = 7;

SendMessage(mbWnd, WM_COMMAND, new IntPtr(ID_NO), IntPtr.Zero);


このコード「」呼んであげればどちらでも閉められますな!


2013年7月16日火曜日

iTunesのファイルを外部ディスクに追い出す

現在自宅のメインマシンはMacBookAir(以下MBA)のみみたいな状況になっています。で、携帯はiPhone、タブレットはiPadという事で当然のことながらiTunesの管理はこのMBAを使う必要があります。

で、困ったことにこのMBAは世代が古いので外部ストレージへのアクセスは無線経由もしくはUSB2.0からでないと出来ません。内蔵SSDは128GBのモデルなのでちょっとしたデータを保存しておく分には問題ないですが写真やiTunesの様なメディアファイルはディスクを激しく消耗します。

(今頃ですが)そして最近気付いたのは・・・実はiTunesって外部ディスクにライブラリ(メディアデータ)を保存する設定を指定てもiPhoneとかのバックアップファイルは内蔵ディスク固定というゴミ仕様。iTunes立ち上げる時以外は不要のこのデータが何故内蔵ディスク固定なのか理解に苦しみますが、こういう抜けた所が多いのもAppleのソフトの特徴なので致し方ないところですか・・・。

で、まぁ要はリンク張っちまえば外部ディスクに逃がせるだろって話でサクサクっとどかしてしまいます。移動してリンク貼るだけ。簡単。


$ mv /Users/<ユーザー名>/Library/Application\ Support/MobileSync /Volumes/<外部HDD名>/iTunes/MobileSync/
$ ln -s /Volumes/<外部HDD名>/iTunes/MobileSync/ /Users/<ユーザー名>/Library/Application\ Support/MobileSync


今回は外部ディスクのiTunesのフォルダにまとめちゃいましたが保存先はお好みで。また、ディスクを換えてパスが変わる場合はリンクを貼り直すためにリンクを消してから二行目のリンク貼る処理をすれば良いです。


$ rm /Users/<ユーザー名>/Library/Application\ Support/MobileSync
$ ln -s /Volumes/<外部HDD名>/iTunes/MobileSync/ /Users/<ユーザー名>/Library/Application\ Support/MobileSync


なんか40GBも空いたよ! 1/3もディスク専有していたとかマジで罪な仕様ですな。MBAのコンセプト考えるとこういうアプリが存在自体ちょっと信じられませんな。まぁ、マーフィーの法則通り気付いたらまた残量0に近づくんですけどね・・・。

以上忘備録でした。

2013年7月12日金曜日

Solarisでのユーザー追加

で、Solarisネタを続ける。

いっぱいあるillumosの中から

  • OmniOS ・・・ サーバー用の最小限の構成。こういうの好き。
  • XStreamOS ・・・ クラウド、Webの開発用

この2つをチョイス。が、VMware PlayerだとOmniOSはインストールが先に進んでくれないのでXStreamOSを入れてみます。同じインストーラっぽいけどこっちはちゃんと先に進んですんなりインストールが完了しましたとさ。

で、Solarisの事は全く分からない人なので

ユーザー追加するのどうやるんだろ!?

適当にコマンドを叩いてみる

# useradd -m hoge

エラーになるやん・・・

# useradd hoge
# mkdir /home/hoge

エラーになりますん・・・

どうしてー!?


http://d.hatena.ne.jp/yohei-a/20081231/1230693019


どうもこういう話みたいです。

ユーザー追加のコマンドあるし、ユーザーディレクトリを作成するオプションもあるのに不思議だねぇ・・・。

一応ちょっとここの書きこみ通りだとダメだったんで補足


# useradd hoge
# mkdir -p /export/home/users/hoge
# chown hoge:other /export/home/users/hoge
# vi /etc/auto_home
+auto_home
hoge      localhost:/export/home/users/hoge  <-- 追記


なんかファイルが変わっているみたいね

とりあえず今日はこれで満足なのであった・・・。

OpenSolarisの末裔達

ちょっと脱線してSolarisに手を出してみたよという話。

まず、一般人にはJavaで有名なSUN Microsystemsという会社があってSolarisというOSがありました。最近ストレージ系で標準になりつつあるzfsというファイルシステムはここ由来ですね。

とりあえずストレージサーバを自前で組むならSolarisを入れるのが鉄板と聞いています。で、そのSolarisの最新は11でExpress版というフリーっぽい物もある様です(ちゃんとライセンス調べてないけど一応ダウンロード出来てVMwareでも動くのは確認した)

まぁ、今回の話は全然それには関係無くて・・・w

そのSolarisという市販OSにはOpenSolarisというオープンソース版がありました。これはSUNが提供していたものなわけですが・・・そのSUNがOracleに買われた事によりOpenSolarisは終焉を迎えます。元々OpenSolaris自体もアクティブな感じではなかったのですが止めを刺してくれました。ホントろくなことしないな、この会社は。

で、ここで血脈が絶たれていたと思っていたのですが、実はまだ生き残っている事が判明。とりあえずこんな感じみたいです。



いっぱいありすぎだよママン・・・。

とりあえずZFSを使用しようとするとLinuxのfuseとかは除くとSolaris、FreeBSD(とその派生)位しか選択肢が無いという印象だったんですがこちらも選択肢としてはアリかも??問題はillumosカーネルがどれだけ安定しているかなんですけどね。

VMware上のlinuxでカーネルの再構築 その3 もう少し煮つめてみよう編

Hyper-V用のカーネルを作る話をもう少し続けてみます。

どうもパッケージ名に関してはこんな感じで良さそう



$ time sudo make-kpkg --revision=0.2 --append-to-version=-hyperv kernel_image


これで「linux-image-3.10.0-hyperv_0.2_amd64.deb」という名前の物がはかれます。参考にしたページは古いのかこのオプションがどちらかしか入っておらず、--revisionの方は数字からスタートじゃないとおこられるし、--append-to-versionだけつけるとなんかバージョン番号の所にも同じ文字が入ってしまって長い名前が生成されてしまうという状況で前回のPOSTにはこの辺のオプションを含めていませんでした。やっぱり情報の鮮度って重要ですな・・・。


<閑話休題>


その2で作ったカーネルが何故期待した動きにならないのかという点。

まず、CONFIG_MEMORY_HOTPLUGがオンになっていないのではないかという指摘。確認確認・・・。入ってないじゃんorz これが無いとMemory Hot-addがちゃんと動かないのかな?

とりあえず下記の場所で設定出来る模様。


Processor type and features  --->
  [*] Allow for memory hot-add
  [*]   Allow for memory hot-remove


その他忘れ物達


Device Drivers  --->
  SCSI device support  --->
    [*] SCSI low-level drivers  --->
      <M> Microsoft Hyper-V virtual storage driver


大事な物忘れていましたなorz


あとdpkg -iで入れた時に/bootにinitrd.img-3.10.0-hypervが存在しない場合は以下の2ステップが必要でした。


$ sudo depmod 3.10.0-hyperv
$ sudo mkinitramfs -o /boot/initrd.img-3.10.0-hyperv 3.10.0-hyperv
$ sudo update-grub

まぁ、ここまでしてみたけどhot-addに関しては動いていない感じ。さらにいくつかデーモン動かして様子を見てみるとなんかネットワークが死亡する現象が。ダメだなぁこれは。

一応素のDebian7.1のカーネルだと動的メモリ拡張は動かないけど安定度という意味では普通に動いている様に見えるのでこちらの設定+Hyper-V関連というのも作ってみました。


結果・・・


-rw-r--r--  1 root root  4994468 Jul  8 14:31 linux-image-3.10.0-hyperv_0.3_amd64.deb
-rw-r--r--  1 root root 31629920 Jul 12 14:37 linux-image-3.10.0-hyperv_0.4_amd64.deb

すげーでかくなったw

でも結局安定せず同じように死んでしまいますorz

さてどうしたものかなぁ。

あ、ちなみにmemory hot-addに関してはHyper-V 2012 R2からじゃないと動かないんだ疑惑も出ていますがVMware上にHyper-Vサーバを構築という無茶をしてみた感じ動きは変わらずという感じ。さてはて・・・。

2013年7月1日月曜日

VMware上のlinuxでカーネルの再構築 その2 ビルドしちゃうよ編

作業ディスクの準備が出来たので早速カーネルを構築します。

3.8からHyper-V用のballoonドライバが入っているのですが、ちょっと試しにつっこんでみたところ、これにはちょっと問題がありました。

というのも確かに管理画面から見ると拡張RAMに対応してそうに見えるのですが、いくら最大値を設定していても起動時のメモリより多い方向には自動動的割り当てが走りません。これが出来るのは3.10からとの事。

で、丁度昨日(2013/6/30)に3.10の正式版がリリースされている様なのでせっかくなのでこいつを入れてみます。

まずはビルド用の前準備(開発環境とカーネルの設定、パッケージ作成に必要なものをそろえる)


$ sudo aptitude install build-essential
$ sudo aptitude install ncurses-dev
$ sudo aptitude install kernel-package


ソースは3.10の物をkernel.orgから落としてきて・・・


$ cd /usr/src
<ソースをコピーしておいて>
$ sudo tar Jxvf linux-3.10.tar.xz


展開します。必要なのか分からないけどlinuxという名前でリンクを作成。


$ sudo ln -s linux-3.10 linux


さぁ作業開始です


$ cd linux
$ sudo make mrproper
$ sudo make defconfig
$ sudo make menuconfig


ここでカーネルの構成を設定するのですが以下のポイントで設定しています


  • 初期状態だと不要だと思うけど全部設定を消す
  • 初期設定を揃える?為にdefconfigを設定してから開始
  • Hyper-Vに関連する部分は全て有効に


最終的な目標はHyper-V用の不要なドライバーを完全カットして、かつチューニングされたカーネルなわけですが、知識が足りていな過ぎて何をどう削ったらいいのかさっぱりわからない状況。

ヘルプを見るとなんとなくalldefconfig(デフォルト設定)をベースに設定すべきな気がするけど、試しにやってみたらドライバだけではなくカーネル系も殆ど何も無い状況になってしまって流石に設定ダルイ気がしたので・・・とりあえずdefconfigベースにしました。

で、問題はHyper-V関連の設定。このmenuconfigは依存関係のある物はコアの物を有効にすると初めて項目が現れる様なので手順通りにやらないと設定できません。とりあえずHyper-V関連は以下の手順で良いと思いますがチューニングという意味では色々足りなかったり多かったりするはず。今後煮つめていきます。



Processor type and features  --->
  [*] Linux guest support  --->
    [*] Enable paravirtualization code


にチェックするとHyper-Vの項目の設定が出来る様になるので(厳密にはparavirtualization codeはいらないかも)


Device Drivers  --->
  Microsoft Hyper-V guest support  --->
    <*> Microsoft Hyper-V client drivers
    <*>   Microsoft Hyper-V Utilities driver
    <*>   Microsoft Hyper-V Balloon driver


なんとなくHyper-V系の設定を一式ビルトインで設定

ここまで設定すると


Device Drivers  --->
  HID support  --->
    Special HID drivers  --->
      <M> Microsoft Hyper-V mouse driver


Device Drivers  --->
  Graphics support  --->
    -*- Support for frame buffer devices  --->
      <M> Microsoft Hyper-V Synthetic Video support


Device Drivers  --->
  [*] Network device support  --->
    <*> Microsoft Hyper-V virtual network driver



この辺を選べるようになるので設定する。基本サーバとして使う場合はネットワークは必須、HIDとVideoは多分いらないでしょう。

defconfigにここだけ設定したらとりあえずカーネルを作ってみます。

単純にビルド、自分のマシンに入れる場合はmake installで良いのですが、今回はここで作成したものをHyper-V上のdebianに入れるのが最終目標なのでmake-kpkgを使います。


$ time sudo make-kpkg kernel_image


これで「linux-image-3.10.0_3.10.0-10.00.Custom_amd64.deb」みたいなカーネルのインストール用パッケージが一つ下の階層(/usr/src)に作成されます。頭のtimeはビルド時間を測る為の物。本当は--revisionとか名前は何かつけるべきなんだろうけど今回は省略(というか長い名前ついてしまってビビったのでちょっと研究してから・・・)

これを入れて早速チェックしたんですが


$ scp linux-image-3.10.0_3.10.0-10.00.Custom_amd64.deb <username>@<host>:/home/<username>


とかやって入れたいマシンにコピーして、そのマシンにつないでから


$ sudo dpkg -i linux-image-3.10.0_3.10.0-10.00.Custom_amd64.deb


とかやって入れてやるとブートローダの設定までしてくれちゃうので再起動します。

が・・・


CentOS6.4やKernel3.8+balloonの時と同じで起動メモリ以上は自動的に増えねぇ・・・orz


さーってどうすっかな・・・