NginxのUNIXドメインソケット

このサイトが突然アクセスできなくなったので調べてみたところ、ソケットにアクセスできない現象が発生していました。

nginx: [emerg] bind() to unix:/var/run/mail.sock failed (98: Address already in use)

nginxが再起動した時に前のソケットが残っていて再接続ができなくなっていました。解決方法は前も同じ現象があった時に、systemdファイルを変更したことがあったので、備忘録用に記事にしました。

/lib/systemd/system/nginx.service

#ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
ExecStop=-/sbin/start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
systemctl daemon-reload
systemctl start nginx

サイトは自動的にアップデートする仕様になっているので、システムを変更していると突然使えなくなることがあります。

CSR4.0 BTドングルとLinux Kernel 5.7

ArmbianのKernelをアップデートしてBTドングルが使えないとわかった時は安物のBT USBドングルを買ったとことを後悔しました。確かに今まで使えないことはなかったのですが、どうやら純正のCSR製品でないらしくカーネルのアップグレードで使えなくなりました。恐らくかなりこの偽物が出回っているのでいずれは解決するだろうと考えていたので、検索したらパッチがありました。

このパッチを当ててカーネルをビルドしたら使えるようになりました。中国製は安くて便利なのですが偽物が思わぬ不具合を出すときがあります。この偽物CSRドングルはベンダーIDとプロダクトIDが全く同じで気がつきません。同じことがUSBシリアルのch341にも言えます。確かに便利なのですが・・・

中国製IPカメラ(SRICAM AP003)にOpenWrtを入れる

かなり以前にアマゾンで買ったIPカメラがあるのですが、中国製ということでどうもファームウェアが信用できない。特に使うこともないのですが、ファームウェアをOpenWrtにしてみました。中を開けてみるとRT5350Fというチップが乗ったモジュールが入ってました。これはRalinkのWifiがrt305xベースでポピュラーなSoCと同等です。それなのでOpenWrtのファームウェアのどれかに当てはまるはずです。

UARTポート

まずはシリアルアクセスですが、どうもこのモジュールの基盤にはそれらしきものはありません。そこでこのモジュールに近い情報を集めてみました。





ほぼ基盤のレイアウトが同じでインターフェースのpin数が同じなので、この情報をもとにアクセスしてみました。何通りか試してみたら、UART_TXD2、UART_RXD2、GNDに57600 8N1、3.3Vでアクセスできました。

OpenWrtをSDRAMにロード

Ralink製品はたいてい一度SDRAMにOpenWrtをロードしてから、susupgradeコマンド使ってROMに書き込みます。シリアルアクセスができるようになったので、ロードしてみました。

U-Boot 1.1.3 (Dec 26 2012 - 17:31:39)

Board: Ralink APSoC DRAM:  32 MB
relocate_code Pointer at: 81fb4000
sysctl:40200300
spi_wait_nsec: 42 
spi device id: ef 40 17 0 0 (40170000)
find flash: W25Q64BV
raspi_read: from:30000 len:1000 
.raspi_read: from:30000 len:1000 
.============================================ 
Ralink UBoot Version: 3.5.3.0
-------------------------------------------- 
ASIC 5350_MP (Port5<->None)
DRAM_CONF_FROM: Boot-Strapping 
DRAM_TYPE: SDRAM 
DRAM_SIZE: 256 Mbits
DRAM_WIDTH: 16 bits
DRAM_TOTAL_WIDTH: 16 bits
TOTAL_MEMORY_SIZE: 32 MBytes
Flash component: SPI Flash
Date:Dec 26 2012  Time:17:31:39
============================================ 
icache: sets:256, ways:4, linesz:32 ,total:32768
dcache: sets:128, ways:4, linesz:32 ,total:16384 

 ##### The CPU freq = 360 MHZ #### 
 estimate memory size =32 Mbytes

Please choose the operation: 
   1: Load system code to SDRAM via TFTP. 
   2: Load system code then write to Flash via TFTP. 
   3: Boot system code via Flash (default).
   4: Entr boot command line interface.
   7: Load Boot Loader code then write to Flash via Serial. 
   9: Load Boot Loader code then write to Flash via TFTP. 

You choosed 1

 0 
raspi_read: from:40028 len:6 
.
   
1: System Load Linux to SDRAM via TFTP. 
 Please Input new ones /or Ctrl-C to discard
	Input device IP (192.168.1.106) ==:192.168.1.106 
	Input server IP (192.168.1.99) ==:192.168.1.99
	Input Linux Kernel filename () ==:file.bin

 netboot_common, argc= 3 

 NetTxPacket = 0x81FE5980 

 KSEG1ADDR(NetTxPacket) = 0xA1FE5980 

 NetLoop,call eth_halt ! 

 NetLoop,call eth_init ! 
Trying Eth0 (10/100-M)

 Waitting for RX_DMA_BUSY status Start... done


 Header Payload scatter function is Disable !! 

 ETH_STATE_ACTIVE!! 
Using Eth0 (10/100-M) device
TFTP from server 192.168.1.99; our IP address is 192.168.1.106
Filename 'file.bin'.

 TIMEOUT_COUNT=10,Load address: 0x80800000
Loading: checksum bad
Got ARP REQUEST, return our IP
checksum bad
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
checksum bad
checksum bad

ArpTimeoutCheck 
T T T Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
Got ARP REQUEST, return our IP
T Got ARP REPLY, set server/gtwy eth addr (f0:de:f1:59:29:91)
Got it
#################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 ################################
done
Bytes transferred = 3154505 (302249 hex)
NetBootFileXferSize= 00302249
raspi_read: from:30000 len:10000 
.Erasing SPI Flash...
raspi_erase: offs:30000 len:10000
.
Writing to SPI Flash...
raspi_write: to:30000 len:10000 
.
done
Automatic boot of image at addr 0x80800000 ...
## Booting image at 80800000 ...
   Image Name:   MIPS OpenWrt Linux-3.18.20
   Created:      2015-09-04  17:37:19 UTC
   Image Type:   MIPS Linux Kernel Image (lzma compressed)
   Data Size:    3154441 Bytes =  3 MB
   Load Address: 80000000
   Entry Point:  80000000
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK
No initrd
## Transferring control to Linux (at address 80000000) ...
## Giving linux memsize in MB, 32

Starting kernel ...

OpenWrtのファームウェアは色々試してみた結果、openwrt-18.06.8-ramips-rt305x-mzk-dp150n-initramfs-kernelがいいようです。このファームウェアをfile.binとリネームして、tftpのルートディレクトリに置きます。起動できたら、openwrt-18.06.8-ramips-rt305x-mzk-dp150n-squashfs-sysupgrade.binをscpで/tmpに転送してsysupgradeコマンドを実行してROMに書き込みます。

あとはOpenWrtの基本設定をすれば完成です。IPカメラなので残りにROMにドライバーを入れれば使えるようになると思われますが、勉強不足なので暇見てアップデートすることにしています。ffmpegで送信したいのですが、容量的にも性能的にも厳しい気がしてますが、どうでしょうか?

IP Cameraを認識

OpenWrtが起動できるようになりIP Cameraに挑戦してみました。前回、使ったファームウェアは実は4MB用のモノだったので、openwrt-18.06.8-ramips-rt305x-wt1520-8M-squashfs-sysupgrade.binにしました。このファームウェアはSwitchがこのIP Cameraと同じなので一つのlanポートでWANとLANを分けることができます。

ダッシュボードのオーバビュー:メモリーがギリギリです。OpenWrtでは32MBのSDRAMはオススメしてません。
ダッシュボードのSwitch:VLAN1がlanでVLAN2がwanです。
ダッシュボードのInterfaces:tincでできたipcamインターフェースをブリッジしています
ダッシュボードのFW:基本的にwanからアクセスします。lanは特にありません。

さて、本題でGoogleで検索してもこの型番にあった情報は見当たらなかったので、rt5350のデータシートを見みてヒントを探しました。OpenWrtではUSBのIP Cameraドライバーは結構豊富にあるで、このIP CameraもUSB経由で動いているのだろうと考えました。GPIOでも出力が可能なので、もしそうであればドライバーがないので詰みです。ドライバーが認識できれば/dev/video0というデバイスファイルができます。まず基本のパッケージをインストールします。

opkg install kmod-video-uvc mjpg-streamer

この時点ではデバイスファイルは出来ていません。データーシートではこのモジュールはUSB2なのでUSBを使えるようにパッケージを入れました。

opkg install kmod-usb2 usbutils

USBデバイスを調べてみます。

root@OpenWrt:~#  lsusb
Bus 001 Device 002: ID 058f:3861 Alcor Micro Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Alcor Micro Corp.がIP Cameraのようです。デバイスファイルも出来ていました。そこでmjpg-streamerを立ち上げてみます。

/etc/init.d/mjpg-streamer enable
/etc/init.d/mjpg-streamer start

Firewallでポート8080を開けてアクセスしてみます。IP/パスワードはデフォルトでoprnwrt/oprnwrtです。

VLCでストリーム再生する場合

http://192.168.1.1:8080/?action=stream

スナップショットを撮る場合

http://192.168.1.1:8080?action=snapshot

ex)
ffmpeg -i http://ID:PASSCODE@192.168.1.1:8080?action=snapshot `date "+%Y-%m-%d_%H.%M.%S"`.jpeg

録画する場合ですが色々調整したのですが、どうしても早送りになります。

ffmpeg -i http://ID:PASSCODE@192.168.1.1:8080?action=stream \
  -c:v libx264 -framerate 5 \
  -pix_fmt yuv420p -crf 28 -preset veryfast \
  -vf "drawtext=fontfile=/Library/Fonts/Courier\ New\ Bold.ttf:x=(main_w-tw)/2:y=(main_h-th*2):fontsize=24:fontcolor=fuchsia:text='%{localtime}'" \
  -tag:v hvc1 -f hls \
  `date "+%Y-%m-%d_%H.%M.%S"`.m3u8

Motion Detection

motionパッケージをインストールすると動きを検知できます。motionをつかうにはOpenWrtのバージョンを19.07にあげないといけません。残念ながらこのIPカメラではメモリが不足して動きませんでした。

[  910.402620] Out of memory: Kill process 3095 (motion) score 146 or sacrifice child
[  910.418377] Killed process 3095 (motion) total-vm:12980kB, anon-rss:4220kB, file-rss:4kB, shmem-rss:4kB
[  910.498981] oom_reaper: reaped process 3095 (motion), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
Killed

メッシュネットワーク化

最新のOpenWrtの11s+WPA3のメッシュネットワークに挑戦してみましたが、IFは立ち上がるのですがどうもうまくいきません。WPA2 Enterprise(TLS1.2)のSTAモードもダメなようです。それかWPA2 PersonalでSTAモードで接続するかになります。私のところではWPA2 Enterpriseと11s+WPA3なのでそれは選択外です。そこで以前やっていた11s+tincのメッシュネットワークにしました。11sはEncryption: Noneの設定なら古いSoCでもメッシュ化出来ます。

以上、IP CAMのOpenWrt化でした。

参考