stylesheet

ラベル linux の投稿を表示しています。 すべての投稿を表示
ラベル linux の投稿を表示しています。 すべての投稿を表示

2023-05-23

オレオレ証明書に SAN (Subject Alternative Name) を追加。

TL;DR: /usr/share/ssl-cert/ssleay.cnf を編集して、make-ssl-cert -f generate-default-snakeoil するべし。

$ sudo cp /usr/share/ssl-cert/ssleay.cnf /usr/share/ssl-cert/ssleay.cnf.org
$ sudo jed /usr/share/ssl-cert/ssleay.cnf

...
[ v3_req ]
basicConstraints        = CA:FALSE
subjectAltName          = @SubjectAltName@, DNS:@HostName@.local, IP:192.168.1.5, IP:192.168.1.6

証明書の作成とwebサーバーの再起動。

$ sudo make-ssl-cert -f generate-default-snakeoil
$ sudo systemctl restart nginx

以上。

以下、結論にたどり着くまでの試行錯誤の記録。

2022-03-30

NTTのひかり電話ルータRP-400KIとunboundでローカルドメイン運用

ネットワーク内で"ctu.uchino"等、ローカルドメインでアクセスできるようにする。

mDNSも良いけど非対応のデバイスもいろいろとあるのでサーバーマシンを用意できるならDNSを建てるのが安定する。 ルーター側の設定で済むのでクライアント側は特になにも設定する必要がないのがメリット。

アクター

PR-400KI
NTTの第四世代光電話ルーター。2012年2月製造なのでもう10年選手。故障しないのでいつまでたっても旧型。
OrangePi Win
ラズパイの類似製品。Ubuntu FocalベースのArmbianでサーバーとして動作中。略しておっぱい。絶版。
unbound
BIND以降のDNSキャッシュサーバー。簡易的なコンテンツサーバ機能もある。

手順としては、OrangePiへunboundをインストールし、PR-400KIの「ローカルドメイン問合せテーブル」へ追加する。 多少イレギュラーな部分もあったので、以下に細かく記載した。

dnsサーバーの構築

unboundをインストール。

$ sudo apt install unboud

起動に失敗するので53番ポートを使用している犯人を探す。

$ sudo ss -lntp | grep 53

systemd-resolvedが動作しているようなので停止する。

$ sudo systemctl stop systemd-resolved
$ sudo systemctl disable systemd-resolved

unbound.confを編集してlocal-dataをいくつか追加する。

$ sudo jed /etc/unbound/unbound.conf.d/unbound.conf

server:
  interface: 0.0.0.0
  access-control: 127.0.0.0/23 allow
  access-control: 192.168.1.0/23 allow
  
  local-data: "ctu.uchino. IN A 192.168.1.1"
  local-data: "wifi.uchino. IN A 192.168.1.20"
  local-data: "orange.uchino. IN A 192.168.1.8"
  local-data: "office.uchino. IN A 192.168.1.9"
  local-data: "bedroom.uchino. IN A 192.168.1.10"
  local-data: "livingroom.uchino. IN A 192.168.1.11"
  
  ...

起動する。

$ sudo systemctl start unbound
$ sudo systemctl enable unbound

動作確認。

$ dig @127.0.0.1 ctu.uchino

ルーターの設定

続いて、ルーター(PR-400KI)側へDNSサーバーを登録する。
登録は、詳細設定>DNS設定、ローカルドメイン問合せテーブルへ行を追加。

ドメイン名は、先頭にワイルドカード(*)が使える。
サーバーアドレスはIPv4アドレスは弾かれるが、 IPv4射影アドレス(IPv4-mapped IPv6 address)へ変換してやると登録できた。

IPv4射影アドレスの作り方

IPv6アドレスの全128ビットのうち上位80ビットを0埋め、続く16ビットを1埋め、残る下位32ビットへIPv4アドレスを埋め込む。 "192.168.1.8"を例にとると、ドット区切りごとで16進数に変換すると"C0A8:0108"となる。上位96ビットは固定で"::ffff"。 結合した、"::ffff:C0A8:0108"がIPv4射影アドレスとなる。

Javascriptで関数化すると以下の通り。

function ipv4_to_ipv6(ip) {
    const a = ip.split('.').map(x => parseInt(x, 10).toString(16).padStart(2, '0'))
    return `::ffff:${a[0]}${a[1]}:${a[2]}${a[3]}`
}

以下は、"*.uchino"ドメインを192.168.1.8で名前解決する例。

ドメイン名: *.uchino
プライマリDNSサーバアドレス: ::FFFF:C0A8:108
セカンダリDNSサーバアドレス: 

最後にクライアント側からアクセスできるか確認して終了。
ブラウザでアクセスしてみるのが手っ取り早い。

2020-04-11

Ubuntu 18.05 マウスの中ボタンクリックエミュレーション

左右ボタンクリックで中ボタンクリックとする機能。昔はGUIで設定できた気がしたのだが...

# /usr/share/X11/xorg.conf.d/99-mydev.conf

Section "InputClass"
    Identifier "Kensington Orbit Trackball with Scroll Ring"
    MatchIsPointer "on"
    MatchDevicePath "/dev/input/event*"
    MatchUSBID "047d:2048"
    Driver "evdev"
    Option "Emulate3Buttons" "True"
    Option "Emulate3Timeout" "50"
EndSection

Match*でデバイスを絞り込んで、オプションを追加している。Emulate3Buttonsフラグで中ボタンエミュレーション。Emulate3Timeoutはしきい値。

デバイスIDを調べるにはlsusbを、ボタンIDを調べるのはxevを使用するとよい。evdevドライバで使えるオプションはman evdevに記載されているので参照されたし。

2020-01-19

OrangePi WinをDLNAメディアサーバーにする

前回、OrangePi WinへSambaを入れてファイルサーバー化した。

ネットワーク内でのファイル共有、主にメディアファイルの複数マシンからのアクセスに便利に使用しているが、せっかくなので、格納しているメディアファイルをDLNAで公開してメディアサーバーにしてみようと思う。

最近は、PlexやServiioといった有償アプリケーション(無料版もある)が人気のようだが、高機能な分リソース消費も多そう。非力なOrangePiでは荷が重いことだろう。
そこで、今回はDLNAサーバーとしては最もシンプルな、管理用UIやトランスコーディング機能もない、minidlnaを使用することにする。

インストールはaptで行える。

$ sudo apt install minidlna

設定ファイルを編集。管理用のUIは持たないので、直接設定ファイルを編集する。
配信用ディレクトリは、音声/画像/動画で別々のディレクトリを指定することも可能。 また、friendly_nameで表示名を変更できる。

$ sudo jed /etc/minidlna.conf

...

# Path to the directory you want scanned for media files.
#
# This option can be specified more than once if you want multiple directories
# scanned.
#
# If you want to restrict a media_dir to a specific content type, you can
# prepend the directory name with a letter representing the type (A, P or V),
# followed by a comma, as so:
#   * "A" for audio    (eg. media_dir=A,/var/lib/minidlna/music)
#   * "P" for pictures (eg. media_dir=P,/var/lib/minidlna/pictures)
#   * "V" for video    (eg. media_dir=V,/var/lib/minidlna/videos)
#   * "PV" for pictures and video (eg. media_dir=PV,/var/lib/minidlna/digital_camera)
# media_dir=/var/lib/minidlna
media_dir=A,/mnt/usbhdd/music
media_dir=P,/mnt/usbhdd/photo
media_dir=V,/mnt/usbhdd/media

...


# Name that the DLNA server presents to clients.
# Defaults to "hostname: username".
friendly_name=OrangePi Media Server

ファイルが多いとinotfyが足りなくなるので、max_user_watchesを増やしておく。
最大524288まで指定できるが、大きな値を指定するとそれだけメモリーを専有するので程々に。
64bitシステムで最大値を指定した場合、1つあたり1kB、合計512MBのカーネルメモリーを使用する。

$ sudo sysctl -a | grep fs.inotify
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192

$ sudo sysctl fs.inotify.max_user_watches=65536

再起動後も反映させるため、sysctl.d以下にファイルを作成。

$ sudo jed /etc/sysctl.d/90-inotify.config 

fs.inotify.max_user_watches = 65536

デーモンを停止。


$ sudo service minidlna start

DBを強制再作成。

$ sudo minidlnad -R

デーモンを起動。

$ sudo service minidlna start

MediaTombのような管理インターフェイスは存在しないが、ブラウザでポート8200番にアクセスすると簡易なステータス表示を行える。死活監視用に使えるだろう。

Windows10ではエクスプローラーが自動認識した。
クライアントとしてはPCではWindows Media Player、スマホではVLC Media Player等がDLNAに対応している。 その他、一部テレビやプレイステーション等からも参照可能。

もっとも、PCやスマートフォンならばSamba経由でマウントしてしまうほうがよっぽど扱いやすいので、DLNA自体の出番は少ないかもしれない。
Google HomeやAmazon Echo等のスマートスピーカーで直接再生できるようになれば、もう少し活用のしがいもあるだが...

2020-01-18

OrangePi WinにSambaを入れてファイルサーバーにする

OrangePi Winへ最新のArmbianをクリーンインストールしたので、ちまちまと環境再構築を行っている。
今回は、NTFSファイルシステムのUSBハードディスクを繋いで、簡易ファイルサーバーにする手順をメモ。

USBハードディスクを起動時に自動マウント

据え置きでつけたり外したりすることがないならfstabに追記してしまうのが楽。割当先が変わってしまっても良いようにHDD固有のUUIDを指定する。
UUIDを調べるにはblkidコマンドが手っ取り早い。

$ sudo blkid
/dev/mmcblk0p1: UUID="df60a59a-dc75-4ca4-9a17-c546acbb03f3" TYPE="ext4" PARTUUID="e6de6566-01"
/dev/zram0: LABEL="log2ram" UUID="297abf0b-bd2e-4f58-a031-424e6c752837" TYPE="ext4"
/dev/sda1: UUID="D6BEABF3BEABCA77" TYPE="ntfs" PARTLABEL="Elements" PARTUUID="4dd64d94-0369-4714-a4b6-6bdf04b56b62"
/dev/zram1: UUID="924853f6-4a2d-4b88-b93b-bdd289a81d77" TYPE="swap"
/dev/mmcblk0: PTUUID="e6de6566" PTTYPE="dos"

/dev/sda1がUSBハードディスクなのでUUIDは"D6BEABF3BEABCA77"だとわかる。

マウント先を作ってfstabに追記。
今回のハードディスクはNTFSファイルシステムを使用しているため、ntfs-3gを使用。uidとgidにはマウント時に所有権を与えるユーザーを指定する。

$ sudo mkdir /mnt/usbhdd
$ sudo emacs /etc/fstab

UUID=df60a59a-dc75-4ca4-9a17-c546acbb03f3 / ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 1
tmpfs /tmp tmpfs defaults,nosuid 0 0
UUID=D6BEABF3BEABCA77 /mnt/usbhdd ntfs-3g defaults,iocharset=utf8,uid=1000,gid=1000,umask=0022 0 0

再起動するかmount -aで反映させる。

Sambaをローカル認証で使用

aptでインストール。

$ sudo apt install samba

Linuxユーザーを作成してSambaへ登録。ユーザー名とパスワードはWindowsと合わせておくと楽。

$ sudo adduser USERNAME
$ sudo pdbedit -a USERNAME

共有を追加してサービスを再起動。

$ emacs /etc/samba/smb.conf

...

[share]
  comment = USB Harddisk
  path = /mnt/usbhdd
  browseable = yes
  read only = no
  writable = yes
  force user = 1000
  create mode = 0755
  directory mode = 0755

# ゲスト共有用
;  guest only = yes
;  guest ok = yes


$ sudo service smbd restart

以上。

Windows10 Creators Updateの留意事項

Windows 10 Creators Update以降、SMB1.0と認証なしゲスト共有はセキュリティリスクの懸念からデフォルトで無効化されているので使用しないようにする。

どうしても必要な場合は...

SMB1.0は「Windowsの機能の有効化または無効化」からインストールできる。

ゲスト共有は、グループポリシーの「コンピューターの構成 > 管理用テンプレート > ネットワーク > Lanmanワークステーション > 安全でないゲストログオンを有効にする」または、レジストリ「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters\AllowInsecureGuestAuth」で設定できる。

2020-01-12

OrangePi WinへArmbian Bionicをクリーンインストール

面倒なので放置していたが、OrangePi Winへ最新版のArmbianをクリーンインストールすることにする。
インストール自体は、SDカードにイメージを書き込んで電源ONするだけなので、通常のPCとくらべてもあっけないほど簡単に終わる。

準備するもの

  • OSインストール用のTFカード(microSDカード)。最低でも2GBは欲しい。
  • TFカードを読み書きできるPC
  • HDMIケーブル/ディスプレイ/USBキーボード。(最初からリモートで行う場合は不要)

OSイメージの準備

OSイメージの準備はPCで行う。
TFカードにOSイメージを書き込むだけなので、WindowsでもMacでも、なんでもいい。今回は手近にあったUbuntuPCを使用した。

armbian公式からイメージファイルをダウンロード。
ubuntuベース(Armbian Bionic)かdebianベース(Armbian Buster)かを選べる。
また、ダウンロード方法もTorrentと直接ダウンロードを選べる。ただ、直接ダウンロードはかなり遅いので環境が許すならTorrent使用を推奨。

ダウンロードしたファイルは7zipで圧縮されているので展開しておく。

$ 7z e Armbian_19.11.6_Orangepiwin_bionic_current_5.4.7.7z

イメージの書き込みにはEtcherが推奨されてる。Linuxなのでddコマンドでもよいが、Etcherを使用するのが簡単。

$ wget https://github.com/balena-io/etcher/releases/download/v1.5.70/balena-etcher-electron-1.5.70-linux-x64.zip
$ unzip balena-etcher-electron-1.5.70-linux-x64.zip
$ chmod +x balenaEtcher-1.5.70-x64.AppImage 
$ ./balenaEtcher-1.5.70-x64.AppImage

imageを選択してFlash!
SDカードがうまく自動認識されない場合はlspciやlsusbなどしてみると認識する場合がある。

うまく焼けたらマウントし直して、必要なファイルを追加しておくと初期設定がスムーズに進む。ext4ファイルシステムなので、ubuntuならそのまま読み書きできるはず。

Armbianを起動

HDMIケーブルでディスプレイを接続、USBキーボードを接続、TFカードを挿入、電源ボタンをON。
SSHサーバーが有効なので最初からリモート経由でもよいが、対面で行ったほうがトラブルも発生しない。

Linuxの起動メッセージが終わり、無事に起動したらrootユーザーでログインする。

login: root
password: 1234

ログインするとrootパスワードの変更、一般ユーザーの作成を聞かれるので答える。

初期設定

初期設定には、設定用のツールが用意されているので、そちらを使用するとググる手間が省ける。
最低限、タイムゾーンやネットワークの設定を行うとよいだろう。

$ sudo armbian-config

ここまでで基本的なセットアップは終了。あとはやりたいことに応じて好きにすればOK。

リリース情報はUbuntuのものをそのまま使用しているようだ。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"

その他

mDNS

ホスト名.localアクセスできるようにmDNS関連を入れておく。

$ sudo apt install avahi-daemon libnss-mdsn

GPIO

/sys/class/gpioの仮想ファイルを直接いじってももちろん良いけど、WiringPiを入れておく。

$ sudo apt install build-essential

$ git clone https://github.com/OrangePiLibra/WiringPi.git
$ cd WiringPi
$ sudo ./build OrangePi_A64
$ sudo ./build OrangePi_A64 install

$ gpio readall
 +-----+-----+----------+------+---+-Orange Pi Win/Win+ +---+---+------+---------+-----+--+
 | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 |     |     |     3.3v |      |   |  1 || 2  |   |      | 5v       |     |     |
 | 227 |   8 |    SDA.1 |   IN | 0 |  3 || 4  |   |      | 5V       |     |     |
 | 226 |   9 |    SCL.1 |   IN | 0 |  5 || 6  |   |      | 0v       |     |     |
 | 362 |   7 |   GPIO.7 |   IN | 0 |  7 || 8  | 0 | OUT  | S_TX     | 15  | 354 |
 |     |     |       0v |      |   |  9 || 10 | 0 | OUT  | S_RX     | 16  | 355 |
 | 229 |   0 |     RxD3 |   IN | 0 | 11 || 12 | 0 | OUT  | GPIO.1   | 1   | 100 |
 | 228 |   2 |     TxD3 |   IN | 0 | 13 || 14 |   |      | 0v       |     |     |
 | 231 |   3 |     CTS3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO.4   | 4   | 361 |
 |     |     |     3.3v |      |   | 17 || 18 | 0 | IN   | GPIO.5   | 5   | 68  |
 |  98 |  12 |     MOSI |   IN | 0 | 19 || 20 |   |      | 0v       |     |     |
 |  99 |  13 |     MISO |   IN | 0 | 21 || 22 | 0 | IN   | RTS3     | 6   | 230 |
 |  97 |  14 |     SCLK |   IN | 0 | 23 || 24 | 0 | IN   | CE0      | 10  | 96  |
 |     |     |       0v |      |   | 25 || 26 | 0 | IN   | GPIO.11  | 11  | 102 |
 | 143 |  30 |    SDA.2 |   IN | 0 | 27 || 28 | 0 | IN   | SCL.2    | 31  | 142 |
 |  36 |  21 |  GPIO.21 |   IN | 0 | 29 || 30 |   |      | 0v       |     |     |
 |  37 |  22 |  GPIO.22 |   IN | 0 | 31 || 32 | 0 | IN   | RTS2     | 26  | 34  |
 |  38 |  23 |  GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v       |     |     |
 |  39 |  24 |  GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | CTS2     | 27  | 35  |
 | 101 |  25 |  GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | TxD2     | 28  | 32  |
 |     |     |       0v |      |   | 39 || 40 | 0 | IN   | RxD2     | 29  | 33  |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 +-----+-----+----------+------+---+-Orange Pi Win/Win+ +---+------+----------+-----+-----+

Armbianについて

少し触った感じでは以前のxenialベースの時のような変なクセもなくなって扱いやすくなった気がする。
有線LANが1Gbpsでリンクしない問題は解消されていた。

2019-12-11

LightDMでlibvert-qemuアカウントを表示しない

LightDMのログインスクリーンでシステムアカウントのlibvert-qemuが表示されて目障り。
いつまでたっても修正される気配がないので、設定を追加して対処する。

作業を行う環境は以下の通り。
elementary固有の現象なのか、それともubuntuにも発生するのか。

$ cat /etc/lsb-release

DISTRIB_ID=elementary
DISTRIB_RELEASE=5.1
DISTRIB_CODENAME=hera
DISTRIB_DESCRIPTION="elementary OS 5.1 Hera"

SystemAccount=trueを記述した設定ファイルを作成する。

$ sudo emacs /var/lib/AccountsService/users/libvirt-qemu

[User]
SystemAccount=true

accounts-daemonサービスをリスタートするか単純にシステムを再起動する。

$ sudo service accounts-daemon restart 

以上。

2019-11-06

GRUB2 タイムアウト時のデフォルトを最後に選択した項目にする

GRUB_DEFAULTをsavedへ変更、GRUB_SAVEDEFAULT=trueはなければ追加する。
$ sudo nano /etc/default/grub

  GRUB_DEFAULT=saved
  GRUB_SAVEDEFAULT=true

$ sudo update-grub

デュアルブートでWindowsも使用する人に便利。
大型アップデートで何度も再起動が必要な時に威力を発揮する。

2018-06-07

Alertmanager (prometheus) の Webhookレシーバーを調べる

AlertmanagerはPrometheusでのアラート管理を行うコンポーネント。
現状で以下のレシーバー(通知先)をサポートしている。

  • SMTPメール
  • Hipchat
  • PagerDuty
  • Pushover
  • Slack
  • OpsGenie
  • VictorOps
  • WeChat
  • Webhook

今後はレシーバーの追加は積極的に行わないそうで、Webhookを使って自身で作成して欲しいとのこと。

Webhookレシーバー

設定で指定したエンドポイントに対して、JSONでPOSTリクエストを送出するレシーバー。
POSTリスエストを送るだけなので、その後の処理は利用者側で用意する必要がある。

なんでもできるけど、なんにもできない、そんな感じ。

使用するにはAlertmanagerの設定にwebhookレシーバーを追加してやる。

receivers:
- name: "myreceiver"
  webhook_configs:
  - url: 'http://127.0.0.1:3001/alerts'
    send_resolved: true

Prometheus側のアラートルールでlabelsとannotationsとして受け取るプロパティを追加出来る。

- alert: InstanceDown
    expr: up == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has bennd down for more than 5 minutes"

Prometheusのアラートはpending、firing、resolvedと状態が遷移する。
この内、webhookで送出されるイベントはfiringとresolvedの2つ。

firing状態では次のような構造になる。
同じグループのアラートは配列としてまとめて送られてくる。

{ receiver: 'duino-klutch-webhook-receiver',
  status: 'firing',
  alerts:
   [ { status: 'firing',
       labels:
        { alertname: 'InstanceDown',
          instance: 'localhost:9100',
          job: 'node_exporter',
          severity: 'critical' },
       annotations:
        { description: 'localhost:9100 of job node_exporter has bennd down for more than 5 minutes.',
          summary: 'Instance localhost:9100 down' },
       startsAt: '2018-06-06T18:03:58.765899704+09:00',
       endsAt: '0001-01-01T00:00:00Z',
       generatorURL: 'http://orange:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1' } ],
  groupLabels: { alertname: 'InstanceDown' },
  commonLabels:
   { alertname: 'InstanceDown',
     instance: 'localhost:9100',
     job: 'node_exporter',
     severity: 'critical' },
  commonAnnotations:
   { description: 'localhost:9100 of job node_exporter has bennd down for more than 5 minutes.',
     summary: 'Instance localhost:9100 down' },
  externalURL: 'http://orange:9093',
  version: '4',
  groupKey: '{}:{alertname="InstanceDown"}' }

設定でsend_resolvedを無効にしていない場合はresolved状態でもPOSTリクエストが送出される。
スキーマはfiringの場合と違いはない。

{ receiver: 'duino-klutch-webhook-receiver',
  status: 'resolved',
  alerts:
   [ { status: 'resolved',
       labels:
        { alertname: 'InstanceDown',
          instance: 'localhost:9100',
          job: 'node_exporter',
          severity: 'critical' },
       annotations:
        { description: 'localhost:9100 of job node_exporter has bennd down for more than 5 minutes.',
          summary: 'Instance localhost:9100 down' },
       startsAt: '2018-06-06T18:03:58.765899704+09:00',
       endsAt: '2018-06-06T18:07:58.765932428+09:00',
       generatorURL: 'http://orange:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1' } ],
  groupLabels: { alertname: 'InstanceDown' },
  commonLabels:
   { alertname: 'InstanceDown',
     instance: 'localhost:9100',
     job: 'node_exporter',
     severity: 'critical' },
  commonAnnotations:
   { description: 'localhost:9100 of job node_exporter has bennd down for more than 5 minutes.',
     summary: 'Instance localhost:9100 down' },
  externalURL: 'http://orange:9093',
  version: '4',
  groupKey: '{}:{alertname="InstanceDown"}' }

アラートの状態がpendingからfiringに変化しても、実際にリクエストが送出されるまでは多少時間が掛かる。
即応性が必要なものは不向き。

実装例

上記を踏まえて手抜き実装してみたwebhookがこちら。

arduinoに繋いだ8x8マトリクスLEDへサマリーをメッセージ表示するもの。
firing状態のアラートを保持してresolvedで破棄するようにしてみた。

2018-06-03

node-red + influxdb + prometheus + grafanaでorange-pi-winへダッシュボードを作る

orangepi-win(armbian x64)を監視用ダッシュボードにするために色々とインストールを行う。
arm64用のパッケージが古かったり提供されてなかったりで色々と面倒。

監視用ダッシュボード

grafanaを使用してウェブブラウザで各種メトリクスデータをグラフ表示するもの。

メトリクスデータは以下のものを収集。

  1. システムのメトリクスデータ
  2. 外部Webサービスの応答速度
  3. websocketやweb apiで収集したセンサー値など

1番、2番に関してはprometheusを使用して収集する。それぞれnode_exporter、blackbox_exporterが追加で必要になる。
3番は、node-redを使用してデータフローを作成して対応する。メトリクスデータの保存にはinfluxdbを使用。

以下、必要となるソフトウェアのインストール方法をメモしていく。
node-redデータフローの内容やgrafanaダッシュボードの作り方は記載しない。

※センサーデータの配信サーバーデバイスを自作してやろうという変人は著作のこちらも参考にどうぞ。 esp8266向けのhttp/websocket apiサーバーです。

influxdb

https://www.influxdata.com/

influxDBは時系列データの扱いに特化したデータベース。
時系列データベースとして採用例が多いgraphiteより後発のもの。

インストールはaptで素直に入る。
ついでにnode-redからの書き込み用のデータベースを作成しておく。

$ sudo apt install influxdb influxdb-client
$ influx
> create database things

http apiで更新可能のためか、簡易なWebUIが付属している。

http://127.0.0.1:8083

prometheus

https://prometheus.io/

prometheusはpull型のサーバー監視ツール。k8s環境で使われることが多い印象。

arm64版のパッケージがレポジトリに登録されていないのでインストールは少し面倒。
公式サイトからバイナリを入手してインストールする必要がある。

$ wget https://github.com/prometheus/prometheus/releases/download/v2.2.1/prometheus-2.2.1.linux-arm64.tar.gz
$ sudo tar xvfz prometheus-2.2.1.linux-arm64.tar.gz -C /opt
$ cd /opt
$ sudo ln -s prometheus-2.2.1.linux-arm64/ prometheus
$ sudo vi /etc/systemd/system/prometheus.service

  [Unit]
  Description=Prometheus
  Wants=network-online.target
  After=network-online.target

  [Service]
  User=root
  Group=root
  Type=simple
  ExecStart=/opt/prometheus/prometheus --config.file /opt/prometheus/prometheus.yml

  [Install]
  WantedBy=multi-user.target

$ sudo systemctl daemon-reload
$ sudo systemctl enable prometheus

また、prometheusではメトリクスデータの収集に各種exporterが必要。
システムメトリクスの収集はnode_exporter、外部サービスの死活監視はblackbox_exporterを使用する。

これらも同じようにインストール。手順はほぼ一緒なので省略。

インストールが完了したら、/opt/prometheus/prometheus.ymlを編集してjobを登録する。

...
scrape_configs:

  ...

  - job_name: 'node_exporter'
    static_configs:
    - targets: ['localhost:9100']

  - job_name: 'blackbox_http'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
        - http://example.com
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9115

最後にsystemdで自動起動を有効にする。

$ sudo systemctl daemon-reload
$ sudo systemctl enable prometheus
$ sudo systemctl enable node_exporter
$ sudo systemctl enable blackbox_exporter

node-red

https://nodered.org/

node-redはビジュアルデータフロープログラミングツール。
"mqttでセンサーデータを受信、influxdbへ保存"みたいなことがマウスでポチポチするだけで出来あがる。

nodejs製のWebアプリなので、インストールにはnpmを使用する。また、daemon化にはpm2を使用した。

$ sudo npm install -g --unsafe-perm node-red
$ sudo npm install -g pm2

プロセス構成を作成してsystemdへ登録する。

$ sudo su
$ pm2 start node-red
$ pm2 save
$ pm2 startup

WebUIはポート1880番を使用。

http://127.0.0.1:1880

WebUIにアクセスし、node-red-contrib-influxdbを設定から追加。

その後、マウスでポチポチしてデータフローを組み上げる。
例えば、以下のようなデータフローを作成する。

websocket接続 -> 受信データのフィルタと成形 -> influxdbへ追加
定期実行 -> httpリクエスト -> レスポンスデータのフィルタと成形 -> influxdbへ追加

grafana

https://grafana.com/

grafanaはwebブラウザ向けのデータビジュアライゼーションツール。kibanaからフォークして誕生した。
ストレージにinfluxdbやprometheusが使用可能。

aptリポジトリ版はUIが壊れた(アイコンが表示されない)不具合のある旧版なので公式パッケージを使用。

$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_5.0.4_amd64.deb
$ sudo dpkg -i grafana_5.0.4_amd64.deb

一旦、homepathを指定して起動してやる。

$ sudo grafana-server -homepath /usr/share/grafana

自動起動を有効にする。

$ sudo systemctl enable grafana-server

WebUIはポート3000番を使用。

http://127.0.0.1:3000

初期アカウントはユーザー、パスワード共にadmin。
メニューのData Sourcesからinfluxdbとprometheusを追加しておく。

Type: InfluxDB
Url: http://localhost:8086

Type: Prometheus
Url: http://localhost:9090

その後、こちらもマウスでポチポチしてダッシュボードを作成していく。
公開されているものをインポートしてから調整していくと少しは楽できる。

結構大掛かりになったが、以上でセットアップは完了。

メトリクスデータが僅かなこともあって、非力なorange-piでも一応は動作しているが、それなりに負荷はかかっているよう(特にinfluxdb)なので、そのうち破綻しそうな気はする。

都会派のカメはヒキガエルと言うそうです

2018-05-19

IP直打ちやhosts編集が面倒になったのでmDNSを設定しまくる

BonjourだとかzeroconfだとかmDNSの話。
閉じたネットワークで`ホスト名.local`でサーバーマシンにアクセスできれば満足。Service Discoveryとかはスルーの方向性で。

Linux (Debian系)

最初から入っているディストリも多いが、ホスト名を設定してavahi-daemonとlibnss-mdnsを入れるだけ。

avahi-daemonがresponderでlibnss-mdnsのほうがクライアントとして動作する。 ラズパイやオレンジパイも同じ。

$ sudo -e /etc/hostname
$ sudo apt install avahi-daemon libnss-mdns

Windows10

ネイティブサポートされているようだがファイアーウォールで止められている。UDPポート5353を開放すると使えるようになる。

面倒であれば、Bonjourをインストールするとファイアウォールが自動で構成されるので手っ取り早い。

ホスト名はコンピュータ名を使う。

MacOS, iOS

最初から使用可能。設定のローカルホスト名とか名前とかそこらへんでホスト名を決める。

esp8266

Arduinoスケッチの場合は、ESP8266mDNSライブラリをインクルードしてMDNS.beginをコールするだけ。

この類のマイコンでmdnsはかなり有用。

#include <ESP8266mDNS.h>
MDNS.begin("superhost");

Android

SDKでAPIは提供されているが、アプリ側で対応が必要。そして現状、chromeでは使えない。

スマホは公共ネットワークに接続することも多いだろうから、セキュリティ的に使えなくて正解かもしれない。

2018-02-20

ansibleのインストール

PC初期化の毎に調べてる気がするので、ansibleのインストール方法をメモしておく。
OSはUbuntuを使用。

2017-10-30

TensorFlow CPU最適化ビルド

PyPIからインストールしたCPU版のTensorFlowを使用していると以下のような警告が「毎回」出る。

W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.

訳すと「拡張命令に対応してるのに拡張命令サポートを有効にしてコンパイルされてないぜ。Why?」、意図するところは「tensorflowの実力はこんなものじゃないぜ。早くおまえのマシンとシンクロするんだ。」ということか。競合と速度比較されるので開発者も大変なのだろう。

ただの警告なので放置しても問題無いわけだが、使用するたびにログ出力されては気分がよろしくないのは確かではある。 それならばと、CPU最適化版へ取り替えようと思うわけだが、残念なことにPyPIではCPU最適化版の配布は行われていなかった。
この際であるから、手間はかかるとはいえ、いっそソースコードからビルドを試みてシンクロ率100%を目指すこととした。

2017-05-12

Ubuntu 16.04 で HUION H420 のボタン設定を変更

Ubuntu 16.04で格安ペンタブレット「HUION H420」のボタン設定を変更する方法をメモ。

基本動作はdigimendモジュールがカーネルに取り込まれているので接続するだけで使用できるのだけれども、「HUION H420 Pad pad」デバイスが認識されない等、問題があるので最新のソースコードからカーネルモジュールを作成して使用する。

  • OS: Ubuntu 16.04
  • カーネルバージョン: 4.4.0-77-generic

2015-08-01

Linuxとのデュアルブート環境にwindows10をインストールしたらgrub rescueになっちゃった件

Linuxとのデュアルブート環境にWindows10をアップデートインストールしたら再起動に失敗してgrub rescueになっちゃいました。

導入環境
  • Windows 7
  • Manjaro Linux

MBRが上書きされちゃったようです。

以下、復旧手順。

2015-04-16

VirtualBoxでUbuntuゲストのGoogle Chromeでマウスドラッグが効かない件

  • Virtualbox 4.3.26 (Windows8.1)
  • Xubuntu 14.04 LTS
  • Google Chrome 42.0.2311.68 beta (64-bit)

"--touch-devices=123"を付けて起動すると回避できた。

$ google-chrome-beta --touch-devices=123
https://code.google.com/p/chromium/issues/detail?id=456222

2013-06-14

OpenShiftへじゃぱん仕様のJoomla!をインストール

OpenShiftはLinuxでお馴染みのRedHatが運営するPaaSクラウドサービスとそのプラットフォーム。オープンな技術のみで構成されているのが特徴。Gitでプッシュしてアプリをデプロイする。
また、現状3つのスモールギア(Herokuのdynosみたいなもの)までなら一切費用が掛からない。

PHP製コンテンツマネジメントシステムのJoomla!をインストールして遊ぶ

公式で設定済みレポジトリが用意されていたがバージョンが古かった為、Joomla!じゃぱん配布の最新版を使用したレポジトリを作成してみた。

以下、このレポジトリを使用してOpenShiftへJoomla!をインストールする手順をメモ。

2013-05-03

LinuxでもKVMを使用してAndroid Virtual Device (AVD)の高速実行

Windows or Mac の場合はIntel x86 Emulator Accelerator (HAXM)で実機以上の高速動作が可能なAndroidエミュレータですが、いつまで待ってもLinux用のHAXMがリリースされない訳で...。
どうもLinux環境ではKVMを使えということらしい。

Linuxの場合は、AMD(AMD-V)も対応。以下、導入手順。

2013-04-08

Debian 64bit版でadbを使用可能にする

64bit版Debian Linux上でadb使用環境を整える。
Android SDKインストールから実機のUSB接続までについて記載。

環境

  • Debian Wheezy x64
  • Android SDK r21.1 (adb v1.0.31)
  • S51SE

ハマりどころとしては、ADBコマンドが32bit環境を必要とするのでMultiarchを有効にすることか。

以下、導入手順。

2012-09-26

Linux版 の IntelliJ 11 のフォント汚いっす

DebianだとIntelliJ IDEA 11のGUIフォントにアンチエイリアスがかからずギザギザ。
それらしき設定もない(エディタ部の設定は有る)ので、JavaVMの起動オプションでなんとかするのが正解のよう。

JavaVMのアンチエイリアスを有効にするオプションを、bin/idea.vmoptions (bin/idea64.vmoptions) に追記。

-Dawt.useSystemAAFontSettings=on

IntelliJを再起動するとアンチエイリアスがかかったボケたフォントに変わる。

その他カラーテーマとか

http://ethanschoonover.com/solarized http://d.hatena.ne.jp/inouetakuya/20120122/1327233747

eclipseとかもうイラネ。emacsとintellijでおk。