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"
}
}
}'
