カスタマイズ前の注意と補足

OpenBlocksシリーズはOSとしてDebian GNU/Linuxを採用した汎用サーバー製品です。
ハードウェア特性を活かす為のカスタマイズを行っていますが、本カスタマイズ以外は、Debianやその他Linuxの一般的な操作方法で利用できます。
しかしながら、パソコンの様に書き込み耐久のあるストレージ上でシステムを組むわけではないので、以下の様な注意点への考慮が必要です。
その他、カスタマイズにおける補足などを解説します。

SSDベースシステム開発における注意

近年、フラッシュメモリーのコストダウンによってスマートフォンを始めノートPCや様々な機器では、従来のハードディスクに代わってSSDが採用されています。
また、本製品に使用されているeMMCはSSDの一種です。

SSDはランダムアクセス性能が高速であり、かつ、ソリッドステートである利点からメカニカルな障害耐性や環境性能が非常に良くなりますが、その反面、ハードディスクに比べてデータの書き換え制限が大幅に少なくなります。
SSDには大きく分けるとSLCとMLCにわかれ、書き換え性能が数万回のSLCタイプが数ギガの容量帯では主流でしたが、マルチビットセルで書き換え回数千回程度の低コストのTLCが大容量化を実現し、スマートフォンやPCに多く使われるようになっています。
現在ではSLCやMLCのSSDは徐々に姿を消し始めています。

当社マイクロサーバー製品のオプションでもSLC製品は一部だけ小容量帯で残すのみです。
ゆえにMLCのSSD搭載でのマイクロサーバー運用が大変多くなります。
TLCでは概ね数百から1000回程度の書き換え性能があり、1000回を超えた辺りからビットエラーが発生し始めますがECCエラー回復します。

しかし、そのECC回復可能な条件を超えるとリードエラーを発生します。
ゆえにこの状況に追い込まないようなシステム作りが必要になります。

セルあたりの書き換え数とフラッシュメモリーのブロックサイズ

セルあたり1000回と言っても、SSDに対する書き込みが1バイトでも1回は1回となります。
最近のフラッシュメモリーは少ないアドレス線で大容量をサポートするため512KB(仮)くらいの大きなブロックで読み書きされます。
つまり、書き込みにおいて1バイト書いても512KB書いても書き換えは1回なのです。
ゆえにSSDへの書き込みは、小さなデータサイズで細かくよりも、なるべくバッファに多くデータを貯めこんで大きなデータサイズで一気に書く方がSSDに対する書き込み回数を最小限にすることが出来ます。

ウェアレベリング機能

SSDは書き換え制限が少ないため、同じブロックアドレスを何回も書き換える動作に対して、同一の実ブロックアドレスへの書き換えを集中させないように平均化しています。
これはブロックアドレスを仮想化して実現しています。
OSはSSDに対して使っているブロックと使われていないブロックを通知しておりSSDは次に書き込みがあった場合、一番書き換え数の少ないブロックをその書き込みのために準備しています。
これによって結果的に書き換え数が平均化されます。

スタティックウェアレベリング

従来のウェアレベリングの場合、使われている領域でかつほとんど書き換えのないデータが例えば50%あった場合、OSのインストール時から1回だけ書かれたブロックが50%を占めます。
その部分がほぼ新品のまま、再利用されている残りの50%の領域がどんどん書き換えられてしまい、全体で平均化した場合よりも2倍早くSSDの寿命が来てしまいます。
この対策に考えられたのがスタティックウェアレベリングで、ほとんど書き換えられていないブロックのデータを再利用の多いブロックに移動し、ほぼ新品のままだったブロックを再利用領域にあてがいます。
これにより、50%ほぼ書き換えのないブロックがあっても、ほぼSSDの寿命をまっとうできます。

SSDの全体の書き換え回数を想定する

例えば4GBのSSDで512KBブロックタイプであった場合、セルあたり1000回の書き換えできるとして512KB以下のデータを書いた場合、SSDの総書き換え回数を想定すると以下の様になります。

4294967296B ÷ 524288 = 8192 (4GB ÷ 512KB)

物理ブロック数は8192個あることになります。

それぞれが1000回書き換えられるとしたら

8192 × 1000 = 8192000 回

つまり1回ずつ1バイトのデータを書くとたったの8.192MB書くと寿命がつきてしまいます。
(実際にはこういった書き込みはSSD側で効率化してます)

なるべく大きなSSDを使用する

例えば前記の4GBのSSDでは8192個のブロックが存在しますが、8GBならその2倍の16384個のブロックが存在するので書き換え回数が単純に2倍になります。
SSDが同じブロックサイズならサイズに応じて単純に比例して書き換え回数がアップするわけです。
ゆえに可能な限りサイズの大きいSSDを利用すれば書き換え回数によるトラブルへの耐性が上がっていくわけです。

tmpfsの利用でSSD書き込みを軽減する

Linuxシステムの場合、何の考慮もしないでシステム開発すると、ストレージは無限に使えるデバイスとしての前提で利用されてしまいます。
データ保存の必要もなくともストレージ領域をワーキングのためのバッファとして普通に使われてしまいます。
こういった事でSSDの寿命を縮める事の無いように、ワーキング処理に必要なストレージはなるべくtmpfsに配置する様、考慮してシステムを設計して行きます。
また、オープンソースのソフトウェアでも、自分用に確保したストレージ領域をテンポラリーとして利用するケースも多く、この場合は、そのファイルをtmpfsの領域にリンクを張って対処します。

ログ

Linuxシステムでは何事においてもストレージにログを残す事が一般的ですが非常に細かくログを残すプロセスがある場合が、一度tmpfsに書かせてから定期的にまとめてログをSSDに移すなどの工夫が必要です。
こういった対策では、突然の電源断には対応出来ませんが、この点はトレードオフしてあきらめるか、例えばUPS対策されたシスログサーバーにログを送信するかそう言った考慮を検討する必要があります。

モバイル回線用SIMについて

OpenBlocksシリーズにて、搭載可能なSIM形状は一部の型番の物を除きmini-SIM(2FF)です。
mini-SIM対応モデルにてmicro-SIM及びnano-SIMを使用する場合には、脱落防止フィルム有及び接着テープ有でSIMを固定できるアダプタを使用してください。なお、SIMアダプタを使用した場合でのSIMスロットの破損は有償修理対象となります為、ご注意ください。

eMMCストレージパーティション情報

本装置に使用されているeMMCのパーティション情報は以下となります。

OpenBlocks IoT VX2の場合
番号formatサイズOBS用途デバイス名
1fat161.5GBBootmmcblk0p1
2ext430.5GBPrimarymmcblk0p2
OpenBlocks IX9(eMMCブート)の場合
番号formatサイズOBS用途デバイス名
1fat161.5GBBootmmcblk0p1
2ext46.2GBPrimarymmcblk0p2
OpenBlocks IX9(SSDブート)の場合
番号formatサイズOBS用途デバイス名
1fat161.5GBBootsda1
2ext4120GBPrimarysda2
info

sda2のサイズについては搭載ストレージ量に依存しており、搭載品によって異なることがあります。

OpenBlocks IoT BX及びEXシリーズの場合
番号formatサイズOBS用途デバイス名
11MB通常起動用u-bootmmcblk0p1
22MB通常起動用u-boot環境変数mmcblk0p2
31MB非常時起動用u-bootmmcblk0p3
42MB非常時起動用u-boot環境変数mmcblk0p4
5ext21MBシリアル番号、MACアドレス等mmcblk0p5
61MBカーネルパニックメッセージ保存用mmcblk0p6
7fat16210MB通常起動用FW用mmcblk0p7
8ext4105MBバックアップ領域mmcblk0p8
9fat16210MBリカバリー起動用FW用mmcblk0p9
10ext43351MBPrimarymmcblk0p10

ストレージモード

基本的なユーザーランドデータをeMMCまたはSSDから参照し動作を行います。
不意な電源断が起こった場合、物理ストレージ上のファイルが破損する恐れがありますが、Docker等のアプリケーション側ではunionfsでストレージ上のデータ参照を行いますのでトラブルなく稼働が行えます。
突然の電源断によるファイル破損は、主に書き込み中のファイルが対象となります。
そのため、基本システムへの影響は発生しにくいよう書き込むファイルはログファイル程度に抑えるかファイルクローズをマメに行う事を推奨いたします。

caution

ファイルを開けっ放しでのアプリケーション動作は、電源断障害が起こるとファイルオープン前の状態にロールバックします。
最悪のケースではファイル消失します。

■mountコマンドの実行結果
root@obsix9~# mount
/dev/mmcblk0p2 on / type ext4 (rw,noatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=4015372k,nr_inodes=1003843,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (rw,mode=755)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
mqueue on /dev/mqueue type mqueue (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=33,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
none on /tmp type tmpfs (rw,relatime,size=65536k)
nginx_dir on /var/log/nginx type tmpfs (rw,relatime,size=16384k)
monitlog on /var/webui/monitlog type tmpfs (rw,relatime,size=5120k)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=805180k,mode=700)

パソコンとOpenBlocksの接続

OpenBlocksとPCを付属のUSBケーブルを用いて接続します。

pc_to_obs

Windows PCの場合、USBポートに接続されると自動的にUSBシリアルドライバがインストールされます。
※WindowsPCがインターネット環境にあることが前提です。
ドライバのインストールが完了したら、TeraTermやPuTTYなどのターミナルソフトでシリアルポート接続が可能となります。

なお、OpenBlocksのシリアルポートのデフォルト通信パラメータは以下の通りです。

通信速度:115200bps
データ長:8bit
パリティ:無し
ストップ:1bit

通信が確立後、起動が完了するとログインプロンプトが表示されます。デフォルトのroot権限でログイン操作を開始して下さい。

login:root
password:0BSI0T
※パスワードはデフォルトの場合となります。WEB-UIにてパスワードを変更している場合には、設定したパスワードを用いてください。

WEB-UIとの連携

本システムには基本的なシステム設定が行えるようにWEB-UIを搭載しています。
ネットワーク設定やモバイル回線の制御等は、WEB-UIから実施してください。
また、WEB-UIから各種機能の追加等が行えますので、基本的な使用方法等についてはスタートアップガイドを参照してください。追加した機能については各種機能のマニュアルを参照してください。

スクリプト処理における遅延処理

Linuxシステムではファイルの書き込みと実ストレージへの反映は非同期となっています。
スクリプト等においての書き込み処理を行った場合、書き込み完了前に次のコマンド処理へと実施される場合があります。
そのため、明示的にsleep及びsyncコマンド等を実施してください。

使用ポート一覧

WEB-UI込みでのOpenBlocksシリーズでは以下のポートを使用及び使用する可能性があります。

サービス種類ポート番号補足
FTP21FTPインストール時
SSH22ポート番号変更可能
DNS53
DHCP67
NTP123
NetBIOS137Sambaインストール時(UDP)
NetBIOS138Sambaインストール時(UDP)
NetBIOS139Sambaインストール時
Samba445Sambaインストール時
Modbus502IoTデータ制御インストール時
WEB-UI(HTTPアクセス)880
ECHONET3610IoTデータ制御/HVSMC使用時
Node-RED1880Node-REDインストール時
(ポート番号変更可能)
Shell in a box(WEB SSH)4200
WEB-UI(HTTPSアクセス)4430
SSH50022LTE/3Gモジュール(ソフトバンク) / WAN側のみ
WEB-UI(HTTPアクセス)50880LTE/3Gモジュール(ソフトバンク) / WAN側のみ
WEB-UI(HTTPSアクセス)54430LTE/3Gモジュール(ソフトバンク) / WAN側のみ
WEB-UI独自サービス63003

IX9シリーズのMiniDisplayPortについて

OpenBlocks IX9にはX Window Systemはインストールされていません。
そのため、MiniDisplayPortからの出力内容はコンソール画面のみとなります。

MiniDisplayPortにてデスクトップ環境を使用したい場合には、taskselコマンドにてデスクトップ環境のインストールを行ってください。
なお、デスクトップ環境のインストールにて約1GB程度のストレージを消費します。
そのため、ストレージに空き容量が十分に存在することを確認してください。

モデムデッドロック時

WEB-UIはモバイル回線のモデムを制御しています。
モデムデッドロック時にリセットも受け付けずに他に復旧方法が無い場合、最終の手段としてOSの再起動を行う場合があります。

LTE/3Gモジュール(ソフトバンク)運用時のアクセス

LTE/3Gモジュール(ソフトバンク)を運用している場合において、LTE回線側にグローバルIPアドレスが付与される場合には、グローバルIPアドレスと以下のポート番号の関係から各種サービスが使用できます。
※フィルター許可で開放している必要がありますので解放時にはご注意ください。
この場合、再起動後もフィルター解放が適用されている必要があります。
※グローバルIPアドレスが固定出でい場合はDDNSサービスを用いることができます。

サービス種類ポート番号補足
SSH50022
WEB-UI(HTTPアクセス)50880ブラウザでのアクセスとなります。
WEB-UI(HTTPSアクセス)54430ブラウザでのアクセスとなります。

GRUBメニュー表示方法について

OpenBlocks IX9及びOpenBlocks IoT VX2では、起動時にシリアルポートにGRUBメニューが表示されます。
そのため、GRUBメニューの確認等を行いたい場合は、下図のようにシリアルコンソール接続にて作業を行ってください。

supple01

Windows PCの場合、USBポートに接続されると自動的にUSBシリアルドライバがインストールされます。
※WindowsPCがインターネット環境にある場合です。

ドライバのインストールが完了したら、TeraTermやPuTTYなどのターミナルソフトでシリアルポート接続が可能となります。

OpenBlocksのシリアルポートのデフォルト通信パラメータは以下の通りです。

項目
通信速度115200bps
データ長8bit
パリティ無し
ストップ1bit

supple02

自動外部ストレージマウント機能

WEB-UIにおいて特定のボリュームラベルの付いたデバイスが見つかった場合、自動でマウントされます。
WEB-UIの機能等で保存先管理等を行う場合にご使用ください。

ボリュームラベルマウント先備考
WEBUI_STORAGE/var/tmp/storageファイルシステムはNTFSのみをご利用いただけます。

SMS送信(コマンドライン)

WEB-UIを用いておりモデムモジュール(LTEモジュール(KDDI)を除く)が搭載されSMS送信可能なSIMが挿入されている場合、コマンドライン上からSMSを送信することが出来ます。

以下のコマンドにより、SMSデータの雛形を作成します。
雛形データを作成後、自動で送信されます。

  • LTEモジュール(NTTドコモ)のモデルの場合 / 実行方法
# /var/webui/bin/create_sms_um04.php <宛先電話番号> <本文>
  • LTEモジュール(NTTドコモ)のモデルの場合 / 実行サンプル
# /var/webui/bin/create_sms_um04.php 09012345678 "TEST MESSAGE"
  • LTEモジュール(NTTドコモ)以外のモデル / 実行方法
# /var/webui/bin/create_sms.py <宛先電話番号> <本文>
  • LTEモジュール(NTTドコモ)以外のモデル / 実行サンプル
# /var/webui/bin/create_sms.py 09012345678 "TEST MESSAGE"

LTEモジュール(KDDI)運用切り替え

LTEモジュール(KDDI)はモジュール自体がSIMになる機能を持っています。以下のコマンドにより、モジュール自体がSIMの機能となる内部SIMモード及び挿入されているSIMを参照する外部SIMモードの切り替えが可能です。

  • 内部SIMモードへの切替コマンド
# /var/webui/scripts/kym_set_mode.sh in
  • 外部SIMモードへの切替コマンド
# /var/webui/scripts/kym_set_mode.sh out

ブートモード切替

use08

OpenBlocks IoT VXシリーズ及びOpenBlocks IX9ではメンテナンスブートモード切替タブから次回起動時のブートモードを設定することができます。

通常出荷状態では選択可能なブートモードは1つのみとなっています。

/dev/mmcblk0p1パーティション内の/EFI/boot/bootx64.confファイル部の一部を書き換えることによって、この部分に表示することができますが、選択可能なブートモードでは工場出荷状態へ戻す等の実運用では危険な内容が含まれています。

そのため、内容を判断の上表示追加等を行ってください。

info

OpenBlocks IX9のSSDブート時は/dev/sda1パーティション内の/EFI/boot/bootx64.confとなります。

DHCPにおけるDGW、DNSについて

OpenBlocksシリーズのWEB-UI機能にて、使用するネットワークインターフェースのIPアドレス取得設定にてDHCPを設定している場合、DGW(デフォルトゲートウェイ)及びDNS(DNSサーバー)情報はDHCPで設定された情報が反映されます。
そのため、通常ではDHCPサーバー側にてデフォルトゲートウェイ及びDNSサーバー情報が設定されている為問題ありません。
しかしセキュリティの関係上、デフォルトゲートウェイまたはDNSサーバー情報を配布しないDHCPサーバーのネットワークを運用しているケースがあります。
この場合、以下のファイルを対象フォーマットで用意することでDHCP環境において強制的にデフォルトゲートウェイ及びDNSサーバーを設定することができます。

なお、上記における強制的に付与するデフォルトゲートウェイはDHCPにおけるIP付与時に設定されます。
また、DNSサーバー設定に関してはローカルネットワークのインターフェースのUp時(DHCP)に適用されます。

  • 対象ファイル
/var/webui/upload_dir/force_network.sh
  • ファイルフォーマット
force_network_defaultroute=<デフォルトゲートウェイIPアドレス>
force_network_nameservers="<DNSサーバーIPアドレス1> <DNSサーバーIPアドレス2>"
  • ファイルサンプル
force_network_defaultroute=192.168.130.1
force_network_nameservers="127.0.0.1 192.168.130.1"