Wyse3040でログ収集・ネットワークを監視する(Grafana+Loki+Promtail)

Logging and network monitoring on Wyse3040 (OS:OpenSUSE)

はじめに

Wyse 3040 Thin Clientが2500円で売られていたので買いました。
ストレージはeMMCの8GBですが、USBを4本指すことのできる機器となっています。
そのままファイルサーバーにしようかなとも考えましたが、
自宅のネット環境のログ収集・ネットワーク監視する機器として使うのも面白いのではないかと思い、今回作成してみました。

Wyse 3040 Thin ClientのBIOS設定

私の場合、なぜか電源ボタンを押してもBIOSが立ち上がらなかったので、CMOSクリアを行いました。中を開けるとCMOS CLEARというボタンがあるので、そこを押すことでCMOSクリアが出来ます。
起動が出来ましたら、F2連打でBIOS画面に入ります。デフォルトパスワードはFireportとなっています。
※BIOSがロックされているので、はじめに解除する際にこのパスワードを使用します。
その後、BIOS画面でEnable USB BootをON、Secure BootをDisableにしてください。

参考:https://qubitsandbytes.co.uk/install-a-new-os-on-a-dell-wyse-3040/

OpenSUSEインストール

自宅においてあるサーバーが全てOpenSUSEでしたので、個人的に使い勝手が良いOpenSUSEをインストールしました。
以下のURLからダウンロードしてUSBにいれました。
https://get.opensuse.org/ja/leap/15.6/

システム要件をみるとハードディスクが40GB以上となっていて、無事に足りていないことがわかりますが、最小要件なら動くだろうと思いインストールしました。(CPUも・・)

localhost:/etc/loki # sudo zypper install neofetch
localhost:/etc/loki # neofetch
                 `-++:`                    hogehoge@localhost 
               ./oooooo/-                  ------------------ 
            `:oooooooooooo:.               OS: openSUSE Leap 15.6 x86_64 
          -+oooooooooooooooo+-`            Host: Wyse 3040 Thin Client 
       ./oooooooooooooooooooooo/-          Kernel: 6.4.0-150600.21-default 
      :oooooooooooooooooooooooooo:         Uptime: 3 days, 20 hours, 52 mins 
    `  `-+oooooooooooooooooooo/-   `       Packages: 810 (rpm) 
 `:oo/-   .:ooooooooooooooo+:`  `-+oo/.    Shell: bash 4.4.23 
`/oooooo:.   -/oooooooooo/.   ./oooooo/.   Terminal: /dev/pts/0 
  `:+ooooo+-`  `:+oooo+-   `:oooooo+:`     CPU: Intel Atom x5-Z8350 (4) @ 1.920GHz 
     .:oooooo/.   .::`   -+oooooo/.        GPU: Intel Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx 
        -/oooooo:.    ./oooooo+-           Memory: 452MiB / 1885MiB 
          `:+ooooo+-:+oooooo:`
             ./oooooooooo/.                                        
                -/oooo+:`                                          
                  `:/.

無事にLeapがインストールされているのがわかります。

次にネットワーク管理としてLokiとPromtail、Rsyslogをインストールしていきます。

Lokiのインストール

※LokiやPromtailのバージョンを2.8.7で指定していますが、最新版でも問題ないと思います。

sudo zypper refresh
# 必要なパッケージのインストール
sudo zypper install rsyslog wget

# Lokiのインストール(github)
wget https://github.com/grafana/loki/releases/download/v2.8.7/loki-linux-amd64.zip
unzip loki-linux-amd64.zip
chmod +x loki-linux-amd64

# Lokiを /usr/local/bin に移動
sudo mv loki-linux-amd64 /usr/local/bin/loki

Lokiの設定ファイルを作成していきます。

# Lokiの設定ファイル作成
sudo mkdir -p /etc/loki
sudo nano /etc/loki/config.yaml
auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  path_prefix: /var/lib/loki
  storage:
    filesystem:
      chunks_directory: /var/lib/loki/chunks
      rules_directory: /var/lib/loki/rules
  replication_factor: 1
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2024-12-14
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /var/lib/loki/boltdb-shipper-active
    cache_location: /var/lib/loki/boltdb-shipper-cache
    cache_ttl: 24h
    shared_store: filesystem
  filesystem:
    directory: /var/lib/loki/chunks

limits_config:
  reject_old_samples: true
  reject_old_samples_max_age: 168h # 1週間のログ保持

次にLokiのシステムサービス関連のファイルを作成していきます。

sudo mkdir -p /var/lib/loki
sudo chown -R $USER:users /var/lib/loki
# Systemdサービスファイル作成
sudo nano /etc/systemd/system/loki.service
[Unit]
Description=Loki Log System
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/config.yaml
Restart=on-failure

[Install]
WantedBy=multi-user.target

Rsyslog設定ファイル変更

RsyslogのログをLokiに直接送るのではなく、今回は一度ログをvar以下に出力させて、それをPromtailに与える構成にしました。

sudo mkdir -p /var/log/rsyslog

# /etc/rsyslog.confの最終行に以下を追加
template(name="LocalLogs" type="string" string="/var/log/rsyslog/%hostname%/%$YEAR%-%$MONTH%-%$DAY%.log")
*.* action(type="omfile" DynaFile="LocalLogs" template="RSYSLOG_FileFormat")

Rsyslogのログが貯まりすぎるのが怖かったので、今回はcronに直接以下の行を追加しました。

# VISUAL=nano crontab -e
0 0 * * 0 find /var/log/rsyslog/ -type f -mtime +7 -delete 

Promtailのインストール

Promtailもインストールしていきます。Lokiとほぼ同じインストール方法です。

# Promtailのインストール(github)
wget https://github.com/grafana/loki/releases/download/v2.8.7/promtail-linux-amd64.zip
unzip promtail-linux-amd64.zip
chmod +x promtail-linux-amd64

# Promtailを /usr/local/bin に移動
sudo mv promtail-linux-amd64 /usr/local/bin/promtail

Promtailの設定ファイルを作成していきます。

sudo mkdir -p /etc/promtail
sudo nano /etc/promtail/config.yaml

Promtailの基本的な設定ファイルの書き方は以下のようになっています。
先ほどのRsyslogのログファイルをlokiに送るようにしてあります。

server:
  http_listen_port: 9080
  grpc_listen_port: 0
positions:
  filename: /tmp/positions.yaml
clients:
  - url: http://localhost:3100/loki/api/v1/push
scrape_configs:
- job_name: 'rsyslog'
  static_configs:
  - targets:
      - localhost
    labels:
      job: rsyslog
      __path__: /var/log/rsyslog/*/*/*.log

Promtailのシステムサービス関連のファイルを作成していきます。

[Unit]
Description=Promtail service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/promtail -config.file /etc/promtail/config.yaml

[Install]
WantedBy=multi-user.target

Grafanaのインストール

Grafanaをインストールしていきます。

sudo zypper addrepo https://packages.grafana.com/oss/rpm-stable/opensuse/stable grafana
sudo rpm --import https://packages.grafana.com/gpg.key

sudo zypper refresh

sudo zypper install grafana

左側のサイドバーで「Connections」をクリック して「Add new connection」を選択します。
目的のデータソース(今回の場合はLoki)を選択・接続設定を入力(http://localhost:3100(Lokiのデフォルトポート))

その後、全てのシステムを有効化します。journalctlやsystemctl status等でエラーが出ていないか確認してください。

sudo systemctl daemon-reload
# Lokiを有効化
sudo systemctl enable loki
sudo systemctl start loki
# Rsyslogの有効化
sudo systemctl enable rsyslog
sudo systemctl start rsyslog
# Promtailの有効化
sudo systemctl enable promtail
sudo systemctl start promtail
# Grafanaの有効化
sudo systemctl enable grafana.service
sudo systemctl start grafana.service

以上で基本的な設定は終了です。次に、Promtailで取得したい追加のログファイルを作成していきます。

別サーバーのログの取得

別サーバーのログ取得についてですが、様々な方法があるとは思います。
今回は個人的に一番簡単なscpコマンドを使って取得をするというものにしました。

# 私のものは既にインストールされていたが、もしされていなければ行う
sudo zypper install openssh

# 鍵の生成
ssh-keygen -t rsa -b 4096
ssh-copy-id hogehoge@remote-server

その後、scpで取得したいログファイルを取得していきます。
※通常、ログファイルはrootや限定されたユーザーしかアクセスできないようになっているため、権限の変更が必要です。chgrpやchmodを使って自分に合った権限に変更する必要があります。

Apacheのログファイルを例にスクリプトを作成しました。Rsyslogと同様にvar以下に一度保存する形式となっています。

#!/bin/bash
REMOTE_HOST="remote-server"  # ipアドレスもしくはドメイン
REMOTE_USER="hogehoge" # ユーザー名

SSH_KEY_PATH="/home/username/.ssh/id_rsa" # 鍵の場所


# 取得したいサーバー側のログ
LOGS=(
    "/var/log/apache2/access_log"
    "/var/log/apache2/access_default.log"
    "/var/log/apache2/access_default_ssl.log"
)

# Wyseで保存する場所
LOCAL_LOG_DIR="/var/log/apache2"

sync_log_file() {
    local log_path=$1
    local filename=$(basename "$log_path")
    
    scp -i "${SSH_KEY_PATH}" -q "${REMOTE_USER}@${REMOTE_HOST}:${log_path}" "${LOCAL_LOG_DIR}/${filename}"
    chmod 744 "${LOCAL_LOG_DIR}/${filename}"
    
    if [ $? -eq 0 ]; then
        echo "Successfully synced: ${filename}"
    else
        echo "Failed to sync: ${filename}"
    fi
}

main() {
    mkdir -p "${LOCAL_LOG_DIR}"

    for log in "${LOGS[@]}"; do
        sync_log_file "$log"
    done
}

main

ルーターのログファイル取得

自宅ではElecomのWifiルーターを使用しています。その場合以下のコマンドでログの取得が可能です。

# ルーターのログファイル取得 
wget http://admin:password@192.168.2.1/others/save_log.sh -O /var/log/router.log

これを先ほどのApacheのログ取得スクリプトに追加してもいいですし、別で回してもいいと思います。
他のルーターを使用されている方は仕様書などを参考に作成してもらえたらと思います。

設定例

参考までに、私のPromtailの設定を載せておきます。
今回はwebサーバーのログ、ルーターのログ、Rsyslogのログを取得するようにしました。

server:
  http_listen_port: 9080
  grpc_listen_port: 0
positions:
  filename: /tmp/positions.yaml
clients:
  - url: http://localhost:3100/loki/api/v1/push
    tenant_id: "" 
    batchwait: 1s
    batchsize: 1024000
scrape_configs:
  - job_name: bokumin45_webserver
    file_sd_configs:
      - files:
          - /etc/promtail/targets/*.yml
        refresh_interval: 5m
  - job_name: router_syslog
    static_configs:
      - targets: 
          - localhost
        labels:
          job: router_syslog
          __path__: /var/log/router.log
  - job_name: 'rsyslog'
    static_configs:
      - targets:
          - localhost
        labels:
          job: rsyslog
          __path__: /var/log/rsyslog/*/*/*.log

targetsディレクトリのymlファイルは以下のようになっています。

# cat bokumin45.yml 
- targets: 
    - localhost
  labels:
    job: bokumin45_access
    __path__: /var/log/apache2/access_log

- targets: 
    - localhost
  labels:
    job: bokumin45_access_default
    __path__: /var/log/apache2/access_default.log

- targets: 
    - localhost
  labels:
    job: bokumin45_access_default_ssl
    __path__: /var/log/apache2/access_default_ssl.log

まとめ

Wyse3040でのネットワーク監視システム構築の方法について記載しました。ファイルサーバーもいいですが、わざわざストレージ用意するのが面倒だという方の参考になれば幸いです。
まだ何台かは在庫が残っていますので、もし興味があれば是非購入してみてください。
Dell Wyse 3040 Thin Client 商品ページ:https://ut-pcmobile.easy-myshop.jp/c-item-detail?ic=A000000020

追記:

eMMCの寿命はHDDやSSDと比べるとかなり短いです。その為、var以下(ログファイル)の部分は他のストレージで行う方がWyse3040も長持ちすると思います。

以下の記事にOpenSUSEで特定のディレクトリを他ストレージに移行する方法が書いてありますので、参考にしてもらえると幸いです。