WSL2で使用するメモリを制限する
初期設定の状態でWSL2でOSを立ち上げると、ある分全てメモリを食いつくしていきます。 自分の備忘録として残しておく
ファイル
%USERPROFILE%\.wslconfig
このファイル修正する
ファイルがない場合は新規作成
[wsl2] memory=2GB # 最大メモリ数を指定(この指定だと全OSで2GB)
WSL2のCentOSでもsystemdを利用する
WSL2でCentOSを使えるようになったけど、 systemd
が全く使えません。
こんなエラーが出る。。。
System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
調べてみるとIssueで議論されているみたいですね。
systemdが使えるようになるとしても、もう少し時間がかかりそうです。
その間は、genie
で逃げておきましょう。
genieのインストール
genieをmakeしてインストールします。
.NET Core SDKのインストール
makeするのに、.NET Coreが必要になるのでインストールします。
genieをclone
git clone git@github.com:arkane-systems/genie.git
makeの事前準備
yum install -y daemonize mkdir /usr/local/lib/genie mkdir -p /usr/local/lib/systemd/system-environment-generators
make
make install
シンボリックの設定
genie
を実行すると /lib/genie
を見に行きます。
バグかな?
とりあえず、シンボリックで対応
ln -s /usr/local/lib/genie /lib/genie
genieの実行
これで、とりあえずsystemd関連が動きます。
公式で対応されるのを待ちましょう。
genie -c bash
WSL2でCentOS(CentOS7, CentOS8)を使う
WSL2Ubuntuでもいいですけど、CentOSも使いたいですよね
ただ、Microsoft StoreでCentOSを探すとなぜか有料だし、公式ですらありません。。。
絶対使いたくないですね。。。
GitHub上でWSL用のCentOSを公開している人がいるのでこれを利用します。
ダウンロード
リリースページより、CentOS7, CentOS8希望のOSをダウンロードして解凍します。
https://github.com/yuk7/CentWSL/releases
配置
OSの配置場所は以下になります。
以下フォルダを開いて、CentOSを配置するフォルダを作成して、解凍したフォルダの中身を入れます。
%userprofile%\AppData\Local\Packages
フォルダ作成
ファイル配置後
インストール
配置した CentOS7.exe
をPowerShellから実行します。
これでおしまい
※実行するファイル名を登録する場合の名前に利用するので、同一OSを複数インストールする場合は、ファイル名を変更する
インストール後は .\CentOS7.exe
を実行なり、Windows Terminal
から起動するなりしてください。
アンインストール
OS自体を削除したい場合は、以下をPowerShellで実行する。
.\CentOS7.exe clean
注意点
現状WSLではsystemdが動作しないので、以下で動くようにする必要があります。
filebeatで準備されてるダッシュボードを利用する
filebeatにはモジュールで利用可能なダッシュボードが準備されている
利用するモジュールを有効化する
利用可能なモジュール一覧
filebeat modules list
モジュール有効化
filebeat modules enable apache2
設定ファイルはこんな感じ
filebeat.modules: - module: apache2 access: enabled: true var.paths: ["/var/log/httpd/access_log*"] error: enabled: true var.paths: ["/var/log/httpd/error_log*"]
ダッシュボードなどの有効化
filebeat setup -e
ダッシュボードなどの有効化(logstashを利用している場合)
logstashを利用している場合はlogstashを一時的に無効化する必要があります。
filebeat setup -E setup.kibana.host=172.17.0.3:5601 -E output.elasticsearch.hosts=['172.17.0.2:9200'] -E output.logstash.enabled=false
これで、 こんな感じの Visualize
と Dashboard
がドバっと使える状態になります
Logstashを試してみる(Docker)
今回はLogstashを使ってみます。
こちらも基本的には公式を参考で問題ありません。
Elasticsearch、kibanaの起動はこちらをどうぞ
kozo.hatenablog.jp kozo.hatenablog.jp
ElasticSearch公式
とりあえずLogstash起動
イメージ取得 + イメージ名変更
docker pull docker.elastic.co/logstash/logstash:6.4.1 docker tag {取得したイメージID} logstash:6.4.1
起動
マウントしているディレクトリは、piplineの設定ファイルを配置する場所になります。
docker run --rm -it --name=logstash -v /logstash:/usr/share/logstash/pipeline/ --add-host=elasticsearch:172.17.0.2 logstash:6.4.1
Successfully started Logstash API endpoint {:port=>9600}
が表示されれば起動完了
ここまで来たら一旦止めちゃいましょう。
piplineの設定ファイル
Logstashの役割は、大枠以下になります。
- ログファイルなどを受け付ける
- 受け付けたデータを加工・整形などをする
- Elasticsearchなどに受け渡す
piplineの設定ファイルを利用して、この一連の流れを設定します。
piplineサンプル
最小の設定ファイルになります。
この設定ファイルだと、「標準入力を受け付けて、受け付けてデータを標準出力に出力する」になります。
logstash.conf
など適当なファイル名をつけて、 docker run
実行時にマウントするディレクトリに入れておきます。
input { stdin {} } output { stdout {} }
もう一度Logstash起動
/logstash
が↑で作成した、pipline設定ファイルを設置する場所になります。
(※パスはどこでも構いません)
docker run --rm -it --name=logstash -v /logstash:/usr/share/logstash/pipeline/ --add-host=elasticsearch:172.17.0.2 logstash:6.4.1
Successfully started Logstash API endpoint {:port=>9600}
先ほど同様このメッセージが出れば起動完了。
Logstashが動いてるか確認しましょう。
piplineの設定は、「標準入力を受け付けて、標準出力に出力する」になってますので、適 "hoge" とか適当に週力しましょう。 以下のようなに、 messageに入力した文字列が表示されたjsonが出力されれば正常に動いてます。
{ "message" => "hoge", "@version" => "1", "@timestamp" => 2018-09-20T06:31:10.197Z, "host" => "593b6a912f8e" }
piplineに追記
ここまで、データを受け付けて、出力する最低限が設定されてます。
次は変換を行います。
message
に正規表現を書いて、「入力があったデータを解析・変換を行ってデータを渡す」フィルターをを行います。
%{IPORHOST:clientip}
は定義済みのIPORHOST
という正規表現に一致するデータを clientip
という名前をつけるという内容になります。
定義済み正規表現は以下にあります。
logstash-patterns-core/grok-patterns at master · logstash-plugins/logstash-patterns-core · GitHub
input { stdin {} } filter { grok { match => { "message" => '%{IPORHOST:clientip} %{GREEDYDATA:etc}' } } } output { stdout {} }
もう一度Logstash起動
docker run --rm -it --name=logstash -v /logstash:/usr/share/logstash/pipeline/ --add-host=elasticsearch:172.17.0.2 logstash:6.4.1
起動したらアクセスログを入力してみる
172.17.0.3 - - [19/Sep/2018:11:44:23 +0900] "GET /index.php HTTP/1.1" 200 12345
clientip
etc
がjsonに追加されていればOKです。
{ "@version" => "1", "@timestamp" => 2018-09-20T13:33:32.662Z, "message" => "172.17.0.3 - - [19/Sep/2018 11:44:23 +0900] \"GET /index.php HTTP/1.1\" 200 12345", "clientip" => "172.17.0.3", "etc" => "- - [19/Sep/2018 11:44:23 +0900] \"GET /index.php HTTP/1.1\" 200 12345", "host" => "217da2c6672f" }
次やること
- Filebeatを置いて、ElasticSearch、kibana、Logstashをつなげて見える化する
やっとElasticsearchのクエリーでドキュメントの検索ができた
検索のやり方を備忘録として残しておく
データにはElasticsearchのサンプルデータを利用しています。
全文検索クエリ:単語一致
単語単位で検索する場合
RDBのLIKEに近いけどあくまで単語単位での検索
例1) 住所に単語として Street
が含まれるドキュメントを検索する
curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "address" : "Street" } } }'
例2)住所に Elton
又は Street
が含まれているドキュメントを検索する(※RDBでいうところのOR検索)
※半角スペースで区切ることで、複数条件での検索になる
curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "address" : "Elton Street" } } }'
例3)住所に Elton
且つ Street
が含まれているドキュメントを検索する(※RDBでいうところのAND検索)
※半角スペースで区切ることで、複数条件での検索になる ※AND検索する場合は、operatorを指定する
curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "address" : { "query": "Elton Street", "operator": "and" } } } }'
例4) ヒット率での検索
最低N個以上キーワードが含まれていること
といったようなRDBにない検索が可能。
minimum_should_match
に含まれていてほしい 個数
OR 割合(%)
が指定可能である
以下の場合は Elton Street Putnam Place Rockwell Avenue
のうち2個以上含まれている結果が取得できる
curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "address" : { "query": "Elton Street Putnam Place Rockwell Avenue", "minimum_should_match": 2 } } } }'
Termクエリ
Termクエリ
Termクエリはkeyword型に対して検索を行う。
ドキュメント格納時
- text型はアナライザが単語分割を行って転置インデクスを構築する
- keyword型はドキュメントにそのまま格納される
検索
- text型は転置インデクスを利用して検索が行われる
- keyword型は格納されたドキュメントと検索キーワードを直接比較する
また、termクエリは格納されている文字列と完全一致するものを検索する(大文字・小文字も含めて比較する)
例)
curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d' { "query": { "term": { "address": "171 Putnam Avenue" } } }'