WPP
DietPi で SBC の LED 設定を変更する

小ネタです。

自宅で動いている ROCK64 という SBC (Single Board Computer) では DietPi という軽い SBC 向けディストリビューションを動かしています。

SBC でよくあるように ROCK64 にも LED がいくつかあり自分の状態を表示しています。

DietPi  + ROCK64 の場合は、led-1 (電源コネクタと反対側の端) が動作中はずっとハートビートする設定になっています。設置している場所が寝室なので夜間はかなり煩わしく感じていました。

internet を検索してみると、ブラウザの検索結果の脇で Copilot が教えてくれました。自分で検索結果を読み取るよりよっぽど早かったことには感動。

Copilot によると dietpi-config で設定できるとのこと。実際にやってみると

  1. sudo dietpi-config
  2. 『1: Display Options』
  3. 『 14: LED Control』
  4. 変更したいLEDを選び(今回は led-1)
  5. 表示したい機能を選択する

こんな感じでできる

iphoneショートカットアプリでlinux をシャットダウン

自宅の PC 環境には検証用に linux サーバをヘッドレスで動かしでいます。

通常は画面なしで支障ないのですが、1日の終わりに電源を切るのを忘れることがままあります。そうするとまたPC開いてシャットダウンするのですが、正直面倒に感じることも多いです。

上記を解決する為に、iphoneのショートカットアプリでssh ログインしてシェルスクリプトを実行することにしました。

シェルスクリプト

Linux側では電源を切るスクリプトを書きます。

ポイントは sudo する際、パスワードをスクリプトで渡すようにする事です。

#!/bin/bash

PASS=ユーザーのパスワード

echo $PASS| sudo -S shutdown

こんな感じでユーザー名、パスワードを指定します。

セキュリティ的にこだわるのであれば、sudo の設定ファイルでshutdownコマンドを実行する専用ユーザーを指定するとか色々出来そうですが、今回はこれで良しとします。

ショートカットの画像を入れる

ショートカット側は ssh でスクリプトを実行するを追加しただけのシンプルなものです。

NEC IX ルータで AsahiNet IPv6 固定IPを割り当て Synology NAS に外部からアクセスする

自宅インターネット回線を楽天ひかりから AsahiNET に切り替えました。というのも数週間前から転送速度が顕著に低下し、ついには常時10mbps 以下になり耐え難い状態で引越しすることに。。。

「固定IPアドレスが比較的安価」。「何となく老舗だし」という非常に安易な考えで AsahiNet に決めましたが結果満足してます。楽天ひかりの Xpass (クロスパス) では少なくとも手軽な固定 IP サービスはなかった為、外部から NAS にアクセスする目的で PPPoE の IPv4 接続を併用してサーバから外に出ていくときは、PPPoE 側にトラフィックを流していました。

ばりばりのネットワークエンジニアではないので、IX ルータ設定が面倒だなと思っていましたが、IPv6 (IPv4 over IPV6)接続で固定の IP となったのでトラフィックを一本化してポート転送できるようで設定がシンプルになり見通しがよくなりました。

で、NEC のサンプルのほぼパクリですが設定をさらしていきます。

固定IPの為の情報

AsahiNet 光 で固定 IP アドレスオプションを申し込むと以下のような情報がきます。これをサンプルに当てはめていくだけです。

一番難しかったのはインターフェースID を IX ルータの要求する xx : xx : xx : xx : xx : xx : xx : xx 形式(xx が 8個) にするとこが一番難しかった。

下の例のインターフェースID だったら 00:00:12:34:56:78:00:00 となるようです。こういう形式とか変換の仕方をなん呼ぶのかわかりませんが、動いているの多分大丈夫だと思う。(あっているという根拠が弱いので少し不安ではある。)

自動設定取得IDP12345678
自動設定取得パスワードpass1234
インターフェースID0000:0000:0000:0000:0000:1234:5678:0000
AFTRエンドポイント
IPv6アドレス
2001:1234:1234:1234:0000:0000:0000:1234
固定IPv4アドレス123.123.123.123
アップデートサーバhttps://v6update.asahi-net.or.jp/prefix
 認証用ユーザーIDP12345678
 認証用パスワードpass1234

ネットワーク構成

IX ルータは AsahiNet に IPIP 接続(固定IP)でインターネットに抜けます。

Synology NAS は 192.168.1.244 と 192.168.2.244 のアドレスを持ちます。
(一つのアドレスで構いませんが、以前の設定の名残りです。あまり気になさらずに。。。)

192.168.2.244 の 80, 443, 5000, 5001 ポートを外部に開けます。(static napt してます。)

192.168.1.0/24 のセグメントに PC やら スマートフォンやらが DHCP でつながっています。

本題に全く関係ない部分は消していますが、おおよそこんな感じて動いています。

古い IX 2105 で動いているのでそれより新しい機種+ ファームバージョンなら動くはずです。

設定

AsahiNet に直接関係ある部分は ! の後にコメントをいれています。

! NEC Portable Internetwork Core Operating System Software
! IX Series IX2105 (magellan-sec) Software, Version 10.2.42, RELEASE SOFTWARE
! Compiled Sep 09-Fri-2022 13:40:53 JST #2
! Last updated Feb 15-Thu-2024 21:50:53 JST
!
timezone +09 00
!
logging buffered 131072
logging subsystem all warn
logging timestamp datetime
!
username admin password hash xxxx@ administrator
!
ntp server 133.243.238.164
ntp interval 3600
!
ip ufs-cache max-entries 20000
ip ufs-cache enable
ip route default Tunnel1.0
ip dhcp enable
ip access-list client-list permit tcp src 192.168.1.0/24 sport any dest any dport any
ip access-list client-list permit udp src 192.168.1.0/24 sport any dest any dport any
ip access-list server-list permit tcp src 192.168.2.244/32 sport eq 80 dest any dport any
ip access-list server-list permit tcp src 192.168.2.244/32 sport eq 443 dest any dport any
ip access-list server-list permit tcp src 192.168.2.244/32 sport range 5000 5001 dest any dport any
ip access-list web-http-acl permit ip src any dest 192.168.1.0/24
!
arp auto-refresh
!
ipv6 ufs-cache max-entries 10000
ipv6 ufs-cache enable
ipv6 dhcp enable
ipv6 access-list block-list deny ip src any dest any
ipv6 access-list dhcpv6-list permit udp src any sport any dest any dport eq 546
ipv6 access-list dhcpv6-list permit udp src any sport any dest any dport eq 547
ipv6 access-list icmpv6-list permit icmp src any dest any
ipv6 access-list permit-list permit ip src any dest any
ipv6 access-list dynamic cache 65535
ipv6 access-list dynamic dflt-list access permit-list
!
!
dns cache enable
dns cache max-records 512
no dns fqdn-database roundrobin
!
proxy-dns ip enable
proxy-dns ip request both
!
!
ssh-server ip enable
ssh-server ipv6 enable
!
!
ddns enable
!
ip dhcp profile dhcpv4-sv
  assignable-range 192.168.1.100 192.168.1.199
  dns-server 192.168.1.254
  fixed-assignment 192.168.1.244 70:09:d0:4b:06:cd
!
ip dhcp profile dhcpv4-out
  dns-server 192.168.1.254
  fixed-assignment 192.168.2.244 70:09:d0:4b:06:ce
!
ipv6 dhcp client-profile dhcpv6-cl
  information-request
  option-request dns-servers
  ia-pd subscriber GigaEthernet1.0 ::/64 eui-64
!
ipv6 dhcp server-profile dhcpv6-sv
  dns-server dhcp
!
!===========================================================
! 固定IP用の「アップデートサーバ」「 認証用ユーザーID」「 認証用パスワード」を設定する
!===========================================================
ddns profile asahi-ddns
  url https://v6update.asahi-net.or.jp/prefix
  query key=P12345678&pass=pass1234
  transport ipv6
  source-interface GigaEthernet1.0
  update-interval 30
!
device GigaEthernet0
!
device GigaEthernet1
!
interface GigaEthernet0.0
  no ip address
  ipv6 enable
  ipv6 dhcp client dhcpv6-cl
  ipv6 traffic-class tos 0
  ipv6 nd proxy GigaEthernet1.0
  ipv6 filter dhcpv6-list 1 in
  ipv6 filter icmpv6-list 2 in
  ipv6 filter tunnel-list 3 in
  ipv6 filter block-list 100 in
  ipv6 filter dhcpv6-list 1 out
  ipv6 filter icmpv6-list 2 out
  ipv6 filter dflt-list 100 out
  no shutdown
!
!===========================================================
! 固定IP用の「インターフェースID」を設定する
!===========================================================
interface GigaEthernet1.0
  ip address 192.168.1.254/24
  ip dhcp binding dhcpv4-sv
  ipv6 enable
  ipv6 interface-identifier 00:00:12:34:56:78:00:00
  ipv6 dhcp server dhcpv6-sv
  ipv6 nd ra enable
  ipv6 nd ra other-config-flag
  no shutdown
!
interface GigaEthernet1.1
  encapsulation dot1q 100 tpid 8100
  auto-connect
  ip address 192.168.2.254/24
  ip dhcp binding dhcpv4-out
  no shutdown
!
interface Loopback0.0
  no ip address
!
interface Null0.0
  no ip address
!
!===========================================================
! 固定IPv4 と対向になるAFTRエンドポイントIPv6アドレス を指定する
!===========================================================
interface Tunnel1.0
  tunnel mode 4-over-6
  tunnel destination 2001:1234:1234:1234::1234
  tunnel source GigaEthernet1.0
  ip address 157.107.76.213/32
  ip tcp adjust-mss auto
  ip napt enable
  ip napt hairpinning
  ip napt static 192.168.2.244 tcp 5000-5001
  ip napt static 192.168.2.244 tcp 80
  ip napt static 192.168.2.244 tcp 443
  no shutdown
!

参考

v6コネクト「固定IPサービス」 設定ガイド : UNIVERGE IXシリーズ | NEC

synology NAS に time machine でバックアップできない場合

久々の synology ネタです。

通常なら NAS の UI で SMB を有効にして、共有フォルダを作成して、Bonjour broadcast を有効にするだけで OK なはずですが、自分の環境ではある時点から time machine が動作していなかったようです。

状況としては「 time machine で synology のボリュームを選択してもいつまでたってもマウントできない」という現象が発生しています。

参考の 2番目を実行すると問題が解決しましたので記事にします。

原因は定かではないですが、もしかすると OS をアップデートしているからかもしれません。

前提となる環境

  • AD / LDAP ドメインなし (Windows なし環境なので、無いと思っている)
  • SMB のみ、AFP なし

手順

参考リンクの2番目の通りですが、1 つだけ注意点があります。

例 3 Synology NASはADドメインに加わりましたが、SMBを介してDSMユーザー(例:TMuser)としてバックアップしたい場合:
のパターンで動作しました。

説明がわかりにくいのですが、DSM ユーザー となっているので AD ドメインではなく localhost (つまりワークグループ) を使うよってことを示しているようです。

ともかくコマンドを抜粋するとこんな感じです。

$ sudo tmutil setdestination -p "smb://localhost\\TMUser@aa.bb.cc.dd/timemachine-folder"

無事、time machine が復旧しました。最近 PC も 光回線も調子が悪いのでせめてバックアップだけでも取っておこう。

参考

Time Machine を使って Mac から Synology NAS にファイルをバックアップするには? – Synology ナレッジセンター
通常ならこちらだけでいい

Time Machineを使ってSynology NASに接続するとき、この問題を解決するにはどうしたらいいですか? – Synology ナレッジセンター
UI で設定してもダメだった場合、下の方法 2 で動作するようになった。

Mint 21 に Virtualbox7 をインストール

Linux mint の apt にも Virtualbox は入っているのですが、6.1 と古いので 7 系をインストールするには追加で設定が必要。

参考リンクの方法まんまだが、Virtualbox のリポジトリとGPG キーを追加して apt コマンドで見つけられるようにする必要がある。

ポイントだけ抜き書きするとこんな感じ。

$ curl -fSsL https://www.virtualbox.org/download/oracle_vbox_2016.asc \
  | sudo gpg --dearmor | sudo tee /usr/share/keyrings/virtualbox.gpg > /dev/null

$ echo deb [arch=amd64 signed-by=/usr/share/keyrings/virtualbox.gpg] http://download.virtualbox.org/virtualbox/debian jammy contrib \
  | sudo tee /etc/apt/sources.list.d/virtualbox.list

$ sudo apt update
$ sudo apt install virtualbox-7.0

echo deb の行のjammy の分は、 `$ cat /etc/os-release` で表示される UBUNTU_CODENAME に入れ替えること。

linux-headers や必要なパッケージが不足していたらそれらも追加する。

参考

How to Install VirtualBox 7.0 on Linux Mint 21 or 20 – LinuxCapable

ラズパイカメラ + nginx で hls(RTMP)サーバ

ここのところカメラでストリーミングの実験をいろいろしているのですが、今回は hls サーバの実験です。RTMPサーバと呼ぶべきなのかもしれませんが何となくあやふやです。

内容的には IoT PLUS さんの内容のほぼまんまですが、ffmpegのパラメータとsystemd での起動に変更したのでさらします。
まあ、誰かの役に立つかもしれないがわからない。

それにしても ffmpeg のコマンドラインは私にとって鬼門です。ドキュメント読む気にイマイチならないのよ。誰か分かりやすい解説ページつくってくれないでしょうか ?

手順

必要な物は、ffmpeg と nginx です。apache は追ってないですが nginx に rtmp モジュールがあってお手軽なのでその例があるのだと思います。

自分の例では http basic auth も設定していないので apache2-utils は不要です。php-fpm も入れません。

インストール

$ sudo apt update
$ sudo apt install ffmpeg nginx libnginx-mod-rtmp

出力フォルダの準備

こちらも丸パクリですが、/dev/shm のリンクを作成します。

$ sudo mkdir -p /var/www/html/live
$ cd /var/www/html/live
$ sudo ln -s /dev/shm hls

index.html の準備

/var/www/html/index.html を作成します。中身はとりあえずパクリです。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8"/>
  <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
</head>

<body>
  <video id="video" controls width="100%"></video>
  <script>
    if(Hls.isSupported()) {
      var video = document.getElementById('video');
      var hls = new Hls();
      hls.loadSource('live/hls/stream.m3u8');
      hls.attachMedia(video);
      hls.on(Hls.Events.MANIFEST_PARSED,function() {
      video.play();
    });
   }
  </script>
<p>
  iPhoneなどで再生されない場合は、<a href="live/hls/stream.m3u8">こちら</a>をクリック。
</p>
</body>
</html>

nginx の設定

/etc/nginx/rtmp.conf ファイルを作成し、そいつを /etc/nginx/nginx.conf でインクルードしてやります。

もともと nginx.conf のなかで. conf.d の中にある *.conf ファイルは読み込まれるのですが、設定ファイルの位置的にまずいらしくエラーになるのでこの構成にしてます。

更に、/var/www/html のロケーションのハンドラを /etc/nginx/conf.d/default.conf に書きます。

rtmp {
    server {
        listen 1935;
        chunk_size 4096;
        allow play all;
        access_log /var/log/nginx/rtmp_access.log;

        application live {
            live on;
            hls on;
            record off;
            hls_path /var/www/html/live/hls;
            hls_fragment 1s;
            hls_type live;
        }
    }
}

これを下の nginx.conf でインクルードしてやります。

events {
----
}
http {
----
}

# http ブロックの外になるように以下の行を追加
include /etc/nginx/rtmp.conf;

/etc/nginx/conf.d/default.conf はこうなります。リッスンポートは 8080 に変更してます。

server {
    listen 8080;
    proxy_set_header   X-Forwarded-For     $proxy_add_x_forwarded_for;
    access_log /var/log/nginx/access.log combined;
    error_log /var/log/nginx/error.log warn;

    location = /favicon.ico {
        access_log off;
        empty_gif;
        expires 30d;
    }

    location / {
        #auth_basic "Web Cam Streaming";
        #auth_basic_user_file /var/www/.htpasswd;

        root /var/www/html;
        index index.html;
        set_real_ip_from    127.0.0.1;
        real_ip_header      X-Forwarded-For;
    }
}

nginx を起動しておきます

$ sudo systemctl daemon-reload
$ sudo systemctl restart nginx

ffmpeg の起動テスト

一旦、ffmpeg で動画を見れるかテストします。今回の環境ではマイクがないので、音声関連のパラメータはざっくり削除しています。

$ ffmpeg -f v4l2 -thread_queue_size 8192 -s 720x480 -i /dev/video0 \
    -r 15 -c:v h264_omx -b:v 512k \
    -vf "rotate=180*PI/180" \
    -f flv rtmp://localhost/live/stream

パラメータの説明

-s 720×480: 解像度
-r 15: フレームレート(15 フレーム / sec)
-vf “rotate=180*PI/180”: 画像を 180度 ローテーションする。(ラジアンに変換)

すべてがうまくいっていれば、こんなふうにブラウザに動画が表示されます。

systemd の設定

参考にしたページでは起動スクリプトで終わっていましたが、systemd に登録することにします。まずは先ほどの ffmpeg 起動コマンドをスクリプト化します。

さっきは、直打ちしていたパラメータを環境変数に逃がしてあげます。更にちょっと乱暴ですが起動時に ffmpeg のプロセスを一旦全部殺します。ロックファイルで制御するのが丁寧だとおもいますが、面倒なのでよしとします。

#!/bin/bash 

ROTATE=180
BITRATE=512k
FRATE=15
RES=720x480
# RES=1920x1080


# kill other instances of ffmpeg
pkill ffmpeg

# start camera server
ffmpeg -f v4l2 -thread_queue_size 8192 -s $RES -i /dev/video0 -r $FRATE \
    -c:v h264_omx -b:v $BITRATE \
    -vf "rotate=$ROTATE*PI/180" \
    -f flv rtmp://localhost/live/stream > /dev/null 2>&1 </dev/null&

これを呼び出す systemd ユニットを作成します。名前はrtmp-camera.service としましたが好きなものに変えて構いません。

ExecStart に 上のシェルスクリプトのフルパスを指定します。systemd unit ファイルでは フルパスを指定します。そうでないとサービス起動時にエラーになります。

パスはシェルスクリプトを作成した場所に適宜変更してください。

[Unit]
Description=RTMP camera server with ffmpeg.

[Service]
ExecStart=/opt/rtmp/start.sh
Restart=always
#Type=simple
Type=oneshot
RemainAfterExit=yes
User=pi

[Install]
WantedBy=multi-user.target

2024-4-12 Type=oneshot に修正し、RemainAfterExit=yes を追加。

systemctl で有効にしていきます。

$ sudo systemctl enable /opt/rtmp/rtmp-camera.service
$ sudo systemctl daemon-reload
$ sudo systemctl start rtmp-camera.service

daemon-reload はもしかしたら不要かもしれません。とにかく enable した後、ちゃんと起動しているか確かめてください。上手く動いていればブラウザでカメラで撮影している動画が流れているはずです。

参考

超簡単! ffmpeg + rtmp + nginxを使ってraspberry pi + webカメラのストリーミング環境を作る(raspbian buster版) | IoT PLUS

子供の笑顔と笑い声を聞く為に ffmpeg + Nginx + RTMP on RaspberryPI – 長生村本郷Engineers’Blog

【ffmpeg】簡単ネットワークカメラの作り方
ここの例は、hls ではなく jpg 画像を更新し続けているのでクライアントからすると motionJPEG 形式になるのだと思う。

VS Code の設定がおかしくなった時

気に入って数年使っている VS Code ですが、たまに1つのプラグインのロードに失敗したっきり他のプラグインもアクティブにならないという困った状態になることがあります。

『設定』の Sync 機能で最新の状態を各 PC で同期できるようにしているのですが、最新状態にしても復帰できないことがありました。

アプリを再インストールしても状況が改善しません。

『設定』を同期している前提ですが、一度PC の設定データを削除すると正しいデータが降ってきて機能が復帰する場合がありあます。

設定の場所

Macの場合:
/Users/ログインID/Library/Application\ Support/Code/User

Winの場合:
%appdata%\code\User
または
C:\Users\ログインID\AppData\Roaming\Code\User

回復方法

通常は、上記フォルダの settings.json を消すと正しい settings.json がダウンロードされて正しく動きますが、user フォルダのいずれかのデータがおかしくなっている時はこの方法では解決しないので、User フォルダごと削除します。

前提にも書いていますが、同期していない場合はそもそも設定のダウンロードができないのでご注意下さい。

簡単にいうとクリーンインストールの方法に近いことをすることになります。

android端末をRTSPカメラサーバにするアプリ

仕事の関係でRTSPサーバをいくつか調べたので、リストアップしておく。

監視カメラ、NVR に関連するシステム周りを調べる必要があったのですが、RTSP は監視カメラと NVR間のストリーミングを流すプロトコルとして使われているようです。

つまり、Android 端末が RTSP を吐ければ監視カメラとして使用できるわけです。

世の中には 2 台のスマホに同じアプリを入れて一台はカメラ、一台はレコーダとするものが沢山ありますが、これらも内部では RTSP を実装しているものが多いと思います。

今回は、agentDVR とか frigate を NVR として使いたいのでアプリにロックインされるタイプのものは不可です。世間ではその手のものの紹介は沢山あり自分が調査に手間取ったのでさらします。

  • IP Webcam
    黒いレンズの円形アイコン
  • NT RTSP Onvif
    水色のガン型監視カメラアイコン
  • IP Camera
    オレンジの監視カメラアイコン、結構いい感じ
  • RTSP Security Camera
    犬のアイコン試した限りでは速度が出ないかも
  • RTSP Camera Server Pro
    試用モードだと数分のみと制限がきついからあまり試していない

あくまで個人的な感覚ですが、単純に上から順に好印象な順です。

アイコン貼るの面倒なので、説明で茶を濁していますがどうしても似たような名前が多いのでアイコンの説明を入れています。

これらは全部 agentDVR に接続できました。長時間稼働とかスタビリティとかはご自身でご判断してください。

Alfred は UI も素敵だし使いやすいが同アプリ間に閉じてるんだよね。

拡張版ls: exa から eza へ

python 環境がおかしくなって、brew doctor してみるとexa がメンテナンスされてないからリプレースしろとのお達しがあり、eza をインストールした話。

exa はざっくりいうと、いい感じの ls ってとこでしょうか。

実際の brew のメッセージはこんな感じです。

$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Some installed formulae are deprecated or disabled.
You should find replacements for the following formulae:
  exa
  ..... その他もろもも

“exa replacement” とか “exa alternative” とかで検索すると見つかったのが eza。

$ brew install eza でインストールしてみましたが、exa とあんまり変わらないっぽい。

exa は “A modern replacement for ls.” を標榜しているのですが
他方、新しい eza は “A modern, maintained replacement for ls.” とメンテナンスされていることを協調しています。修正を待てなかったユーザーたちの渇望感が伝わってきます。

eXa の2つ先だから eZa なんだろうけど、ちょっと覚えにくい。

参考

eza-community/eza: A modern, maintained replacement for ls

Netgear スイッチを見つけるツール

自宅では netgear の PoE スイッチを使っているのですが、これは IPアドレスが振られて VLAN やらいろいろ機能があるらしいです。まあほとんど使いこなしていないのですが。。。

で、ずぼらに管理しているのでその IP アドレスを忘れてしまった時などに見つけてくれるツールが公式から出ています。

Switch Discovery Protocol | Product | Support | NETGEAR

これ使うと簡単に見つけ出すことができます。ホントをいうとルータで固定アドレス割り当てているのでそこから見つければいいのですがちょっと面倒なんですよね。

参考

Switch Discovery Protocol | Product | Support | NETGEAR