インフラSE日記

OSS、仮想化、金融工学、ゲーム、ときどきラーメン

Nutanix CEその2

Nutanixが対応しているハイパーバイ

Nutanixは以下のハイパーバイザに対応しています。

 

本番環境だとやはり実績が多いESXが多いと思います。VMware強し。

CitrixのXenServerは現在対応していませんが、今後対応するかもみたいな記事をどこかで見ました(曖昧ですみません><)。

AWSだってXenベースなんだし、Citrixにはもうちょっと頑張ってほしいなと思います。

 

閑話休題

Nutanix CEはAcropolis Hypervisor(以下AHVと表記する)しか対応していません。

なので、コマンドもKVMが使えます(はず)。

 

Acropolis Hypervisor

KVMベースのNutanix独自のカスタマイズハイパーバイザ。AHVについては勉強不足が否めないので、Nutanixの公式ドキュメントを参照して勉強します。

 

AHVでの仮想マシンの作成手順

大雑把な流れは次の通り。

  1. 「Image configuration」からisoイメージをコンテナに配置
  2. 「Network Config」から仮想マシンに接続させるVLANタグを設定
  3. 「Create VM」から仮想マシンを作成
  4. 「Power On」で仮想マシンを起動

 

1については事前に設定しちゃったので、以降2から画像を使って説明します。

①Home画面を表示

 

f:id:chemicallogical:20160613230519j:plain

 Home画面です。間違っても「Nothing to Do?」をクリックしてはいけません。

 

②Network設定の追加

 事前にNetwork設定を済ませていればこの手順は不要です。今回は初めてなので、作成します。

 Network設定と言ってもESXみたいに仮想スイッチなどの複雑な設定ではなく、ただのVLANの設定です。

「Network Config」をクリックして、設定画面を開きます。

 

f:id:chemicallogical:20160613231135j:plain

VLANタグ名はvlan.41、VLAN IDは41です。

「ENABLE IP ADDRESS MANAGEMENT」をクリックするとネットワークアドレスとデフォルトゲートウェイIPアドレスが入力できるようになります。

今回はネットワークアドレス:192.168.41.0/24、デフォルトゲートウェイIPアドレス:192.168.41.2を入力します。ドメイン設定は使用しないため「CONFIGURE DOMAIN SETTINGS」はチェックしません。

VM作成

「+Create VM」からVMを作成します。

f:id:chemicallogical:20160613231412j:plain

VM名:test、vCPU:1、コア数/vCPU:1、メモリ:2GBというしょぼい仮想マシンを作ります。

その後、「Add Disk」をクリックします。(スクリーンショット忘れた^^)

そうすると、以下のウィンドウが表示されます。

今回はImage Configurationでコンテナに配置したisoファイルからブートしますので、

TYPE:DISK、OPERATION:CLONE FROM IMAGE SERVICEを選択します。

IMAGEにはImage Configurationで設定したイメージ名を選択します。今回は「test_image」。SIZEは適当。

ちなみにtest_imageはUbuntu 14.04です。

 

f:id:chemicallogical:20160613231759j:plain

 

f:id:chemicallogical:20160613231921j:plain

 起動用のディスクのために、もう一個ディスクを追加します。

その後「Save」をクリック。

④結果確認

 TableにVMが表示されるので、確認します。

f:id:chemicallogical:20160613232143j:plain

 Power Onして、コンソールにUbuntuのインストール画面が表示されています。これでVMの作成手順は終わります。

 

Ubuntuインストール

結論から言うと、Ubuntuのインストールに失敗しました。今のところ原因不明なので調査します。ブートローダをインストールできなかった旨のメッセージが表示されていたので、ストレージが壊れてるか、容量が足りないかかな…。

 

Future Work

  1. Ubuntuをインストール完了する
  2. acliコマンドを使ってVMを管理する

 

そんな感じです。

 

 

 

 

 

 

 

 

 

 

 

 

 

nginxソースコードリーディング ver0.1

nginx起動

main()関数から読んでいきます。

エラーハンドリングのif文は重要なもの以外は省きます。

コメントは僕が書いたもので、実際のソースコードには書かれていません。

また、書きやすいように一部コードを変更することもありますが、

処理内容が変わらないように注意しています。

 

core/nginx.c

int ngx_cdecl

main(int argc, char *const *argv)

{

 変数宣言

 ︙

 ngx_strerror_init();

 ngx_get_options(argc, argv);

 if (ngx_show_version) {

  ngx_show_version_info();

 }

 ngx_time_init();

 ngx_pid = ngx_getpid();

 

}

 

とりあえずここまで。

最初は初期化処理が多いですね。

 

core/ngx_errono.c

エラーに関する初期化処理。

ngx_int_t

ngx_sterror_init(void)

{

 len = NGX_SYS_NERR * sizeof(ngx_str_t);

 ngx_sys_errlist = malloc(len);

 // エラー番号0からNGX_SYS_NERR-1までの文字列をngx_sys_errlistに格納

 for (err = 0; err < NGX_SYS_NERR; err++) {

  ︙

  msg = strerror(err);

  len =  ngx_strlen(msg);  //実際はただのstrlen(mgs)

  p = malloc(len);

  ngx_memcpy(p, msg, len); //実際はただのmemcpy(p, msg, len)

  ngx_sys_errlist[err].len = len;

  ngx_sys_errlist[err].data = p;

 } 

}

エラーメッセージのリストを作ってエラー番号0からエラー番号NGX_SYS_NERR-1に対応するエラーメッセージを格納しているだけですね。

簡単な処理ならわざわざソースコード書かなくてもいいかな…?

 

core/nginx.c

 

引数の処理。

static ngx_int_t

ngx_get_options(int argc, char *const *argv);

オプション(引数)の処理をしているだけなので省きます。

nginxってロングオプション(--versionみたいなやつ)に対応してないんですね。

 

core/ngx_times.c

 

時間に関する初期化処理です。

void

ngx_time_init(void)

{

 文字列の長さを格納

 ︙

 ngx_cached_time = &cached_time[0];

 ngx_time_update();
}

 

void

ngx_time_update(void)

{

 ① ngx_trylock(&ngx_time_lock);

 ② ngx_gettimeofday(&tv);

 ③ 各ログの時間をログの時間を表す構造体のデータに格納

}

 

① 時間処理を行うため、最初にロックをとっています。

② 現在の時刻を取得

 

って感じですかね。

最初は簡単ですね、これから難しくなる感じでしょうか。

 

 

そんな感じです。

nginxソースコードリーディング ver0.0

nginxとは

C言語で記述されたHTTPサーバです。

nginxの特徴は以下の点。

・処理性能の高さ

・高い並列処理能力

・メモリ使用量の少なさ

・リバースプロキシ機能

・ロードバランサ機能

・HTTPキャッシュ

 

他に有名なHTTPサーバといえばご存知Apache HTTP ServerやMicrosoft IISなどがありますね。

nginxのソースコードを読んでいきたいと思います。

nginxのソースコードリーディングについて書いていた記事がQiitaにあったのですが、

現在更新されていないようです。なら僕が勉強も兼ねて(?)やってみようと思った次第です。そんなソースコードを読む能力なんてないですけどね。まぁ、のび太くんの「上手くなってから練習する」だといつまで経っても伸びないと思うので、アレな感じでもやってみるところから始めていきます。

nginxの設計思想

Igor SysoevがC10問題を解決しようとHTTPサーバを開発したことがきっかけだそうです。Apache HTTPサーバが1つのリクエストに対してプロセスまたはスレッドで処理するのに対して、nginxは非同期のイベント駆動で処理をしています。

 

かっこよく書いたのはいいけど、正直非同期のイベント駆動をよく理解していません。

完全に勉強不足です。

 

nginxのバージョン

ソースコードのバージョンは1.10.0を使います。この記事を書いている時点では最新です。

 

nginxソースコードディレクトリ構成

  • core
    エントリポイント、ハッシュ、配列、バッファ、ログ処理、文字列処理など
  • event
    イベントの処理
  • http
    HTTPリクエスト処理、
  • mail
    メール機能
  • misc
    よくわかりません^^;
  • os
    OSごとのモジュール。現在はunixというディレクトリのみ存在。
  • stream

    ストリーム処理。これもよくわかってry

 

nginxのソースコードリーディングの方針

エントリポイントから読んでいくのか、各ソースコードについて読んでいくのかどっちがいいのだろう……。

とりあえずエントリポイントから読んでいこうと思います。

 

 

 

Vagrantを使ってみた感想

Vagrant

Vagrantは仮想環境構築ソフトウェア。

Rubyで書かれています。

 

Vagrantで実現したいこと

 個人的にVagrantでやりたいことは以下の3点だと思ってます。

  1. 仮想の開発環境・検証環境をすぐに構築・破棄したい
  2. Virtual Box、VMware Workstation、Amazon EC2などの様々な
    仮想化ソフトウェアを統一したコマンドで管理したい
  3. 環境構築を自動化したい

 

 順番に見ていきましょう。

1はVagrantに限らず他のツールでも同じだと思います。

必要になったときにパッと仮想マシンを作成し、起動できる。

不要になったときに破棄できる。

僕は主にホストのUbuntu仮想マシンを汚したくないけどテストしたいというときに

使っています。

 

2についてですが、僕はVagrantのバックエンドの仮想化ソフトウェア(Vagrantではプロバイダーと呼ばれます)はVirtual Box以外使ったことがないため、他の仮想化ソフトウェアについてはわかりません。それぞれの仮想化ソフトウェアは仮想マシンの作成・破棄の手順、設定方法などが異なるので、他の仮想化ソフトウェアを使うとなったらいちいち覚え直さないといけません。VagrantならVagrantのコマンドを覚えるだけで統一したコマンドで仮想マシンが管理できます。

 

最後の3は自動構成ツール、いわゆるプロビジョニングツールと組み合わせて使うことです。昔はChefが流行ってたイメージでしたが、今はAnsibleの方が流行っているような気がします。

 

Vagrantを使った仮想マシンの作成手順

自分が忘れそうなので書いてみます。

Vagrant仮想マシンを作成するときの手順は大雑把に次の通り。

  1. Boxの入手

    BoxとはAWSでいうところのAMIに相当します。
    Vagrantbox.esVagrant Cloudで入手します。昔はvagrantbox.esからダウンロードすることが多かったのですが、今はvagrant cloudからダウンロードするのが流行りみたいですね。結構ダウンロードするのに時間がかかります。

    コマンドは以下の通り。
    vagrant box add <BoxのURL> -name <Box名>
  2. ディレクトリの作成
    1で指定したBox名と同じディレクトリ名のディレクトリを作成します。
  3. Vagrantの初期化
    2で作成したディレクトリにて以下のコマンドでVagrantを初期化します。
    vagrant init

    そのディレクトリにVagrantfileと呼ばれるVagrantの設定ファイルが作成されます。Vagrantのバージョンによって若干差異があったりします。
  4. 仮想マシンの起動
    以下のコマンドで仮想マシンを起動します。
    vagrant up

    ちなみに、vagrant statusでその仮想マシンが起動しているか、サスペンドしているか、停止しているかなどがわかります。
  5. 仮想マシンにログイン
    以下のコマンドで仮想マシンにログインします。
    vagrant ssh

    もちろん、TeraTermなどを使ってsshログインしてもいいと思いますが、
    sshの設定が少しめんどうなのでこのコマンドでいいと思います。

 

Vagrantを使ってみた感想

やはり、開発・検証環境をすぐに構築したい!という人向けだと思います。

本番環境を構築するときにわざわざvagrantを使うメリットが見いだせませんでした。

仮想マシンの構築は本当にすぐなので、ちょっと試してみたいという分には便利かもしれません。

 

今後について

まだまだ使い込みが甘いので、Vagrantをどんどん使って行って様々な機能を使ってみたいです。その過程で新しいVagrantのメリットや面白さがわかってくるのかもしれません。

恥ずかしながらAnsibleもChefも使ったことがないのでvagrantと組み合わせて自動的に構築してみたいです。

 

 

 

そんな感じです。

 

 

Nutanix CEその1

最近Nutanixを触る機会があり、Nutanixの無償版Nutanix Community Editionがあるということを知って構築してみました。

 

Nutanix CEの入手

 以下のサイトに登録(参加)するとCEがダウンロードできるようになります。

Community Edition - Nutanix

 

Nutanix CEのイメージはコミュニティのスレッドからダウンロードします。

普通「ダウンロード」みたいなリンクがあってそこからダウンロードするのかと思ったんですが、スレッドからダウンロードするのも一般的なんですかね?

 

自宅の構築環境

OS:Windows 7 professional SP1

CPU:Intel core i7-3820 3.60GHz

メモリ:32GB

GPU:NVIDIA Geforce GTX680×2

仮想化ソフトウェア:VMware Workstation 12 Player

 

Nutanix用のVM

仮想マシン名:Nutanix

CPU:4

メモリ:16GB

SSD:300GB

HDD:500GB

 

構築手順とかはもう他のブログとかで結構載っているからどうしようかな

と思ってます(そもそも、僕もそのブログを参考にしたのですが)。

 

そんな感じです。

 

 

 

ブログ更新

最近全然ブログ書いてないなと思って見返すと、最後に書いたのが270日前でした。

今後は週1くらいで何か書こうと思います。

タスクばらし

SEになって初めて「タスクばらし」というものをやるようになりました。

よくシステム開発のプロジェクトで××の外部設計書を書かないといけない、とか◯◯の内部設計書のレビューしなきゃ、とか今月末までに移行設計書書かなきゃなぁとかあると思います。まだ新人だからそんなドキュメント書いたことないですけどね。

朝に一日今日は何するかって決めてから仕事するんですよ。

「最初はこんなもの簡単だろ、だって何するかって知ってるし決まってるじゃん」って思ってました。これが結構難しいんですよ。思ってる以上に出来ない。

前回の報連相もそうですけど、なんか出来ないことを振り返るようなブログになりそうですね。

 

タスクばらしができない理由を考えてみました。

理由は3つ。

1. ××のタスクをやるためには(後でも前でも)◯◯のタスクをやらないといけない

 という経験値が圧倒的に足りない

2. タスクのインプットとアウトプットを考えてない(もしくは、考えれない)

3. タスクの目的およびゴールが明確になってない(わかってない)

 

1は結構タスクばらしが出来ない理由として大きいと思います。

普段やってる作業ならともかく、ほとんど初めての作業ばっかりで何が必要かなんてわからない。考えても出てくるものでもない。でも、「これから経験を積めばいいじゃん! 経験ないからしゃーないしゃーない!」なんて言って出来ないことを正当化してるわけじゃないです。人間には想像するって力と考えるって力があるので、今までの2ヶ月くらいの経験を元に、これから訓練を重ねてできるようになっていきたいですね。

 

ちなみに、人間は一日に150程度のタスクを抱えてるらしいです。

例えば朝起きてから家を出るっていうタスクがあるとします。その間何していますか? どんなタスクがありますか? タスクっていうと大げさかもしれませんが、無意識にやってますね。

人によると思いますが、多分こんな感じになるんじゃないでしょうか。

1. 布団から出る

2. 布団をたたむ

3. 洗面所に行く

4. 歯ブラシに歯磨き粉をつける

5. 歯を磨く

6. 洗顔料を顔につける

7. 洗顔する

8. 電動ヒゲ剃りの電源をつける

9. ヒゲを剃る

10. 着替える

11. 鏡で身支度チェック

12. 靴をはく

13. 扉を開ける

14. 扉の外に出る

15. カギをかける

16. 外出

 

みたいな感じでしょうか。これだけでも16個ありますね。

経験的に外出するためにこれだけのことをしないといけないとわかっているからできるんです。もしくは、ある程度の流れが出来上がっている。

やっぱりある程度経験を積むしかないんでしょうか(笑)

 

2は僕がめんどくさがって考えてないだけかもしれません。基本的にタスクって自分の行動によって何かが何かに変わることだと思ってます。

この何かってのは具体的にドキュメントかもしれないし、上司が◯◯について知らないっていう状況かもしれない。必ず何か影響します。

あるタスクのアウトプットを次のタスクのインプットにして、そのタスクのアウトプット...っていう感じになって大きなタスク(仕事)が進んでいくわけですね。

なので「何がどうなる」っていうのは考えないとタスクばらしなんてできないと思います。

 

3については結構先輩方は朝のタスクばらしで言いますね。「そのゴールってなんだっけ?」って結構突っ込まれます。ゴールが見えてないとズレたことしたり、無駄なことをしたりするわけです。例えば渋谷から町田まで行かなきゃいけないのに、渋谷から田町で経路検索なんてしちゃったら意味が無いですよね? 行き方はわからないけど、「とりあえず町田という駅に行かないといけないんだ」くらいはわかってないと、何線使ったらいいかもわからないし、電車?車?自転車?バイク?かもわからないわけです。

 

色々書きましたけど、経験をある程度積む、インプットとアウトプットを考える、目的とゴールを考えるこの3つを普段から意識してやろうと思います!