相変わらず、騷しいう~さん
シクラメン

「旦那、この所大人しくしていましたね?」
『そやねん、サンバを踊りまくってたのでな』
「知ってますよ~ 裸踊りでしょう ^^);」

※ Samba(サンバ)はLinuxなどのUNIXマシンをWindowsのファイルサーバにするオープンソースソフトウェアです。

「長いパス」対応の組み込みコマンド (nanoShell Tools)

1. 指定されたフォルダまたはファイルを複写する
 int copy( <folder[/wildcard]>, <folder> [," [sync] [progress]"])
 int copy( <file>, <file | folder> )
・名前 / サイズ / 日時 が異なるファイルのみ差分コピーする
・"sync" オプションを指定すると更に出力側にのみ存在するファイルを削除する(同期コピー)
   このメッセージは標準エラーに出力する (本体のメッセージは標準出力)

・ワイルドカード判定は、*、?、| を含む場合、
   または最後が ’.’ (ファイル名規約違反のため識別子として利用) の場合にワイルドカードと判断する
・ワイルドカードは、*→.*、?→.、.→\. に変換し、正規表現マッチする (大小文字を区別しない)
   こんな指定も可能です "[baz]*.txt|*.log"

・出力が (新規)フォルダの場合は、"foo/" と指定する

2. 指定されたフォルダまたはファイルを移動する
 int move( <folder[/wildcard]>, <folder>) [," [progress]"])
 int move( <file>, <file | folder> )
・"move"は入力側空フォルダ(Time0以外)を削除します

3. 指定されたフォルダまたはファイルを削除する
 int remove( <folder [/wildcard]> [," [root] [progress]"])
 int remove( <file>)
・ルートフォルダを指定する場合は "root" オプションが必要
・"remove"は空フォルダ(Time0以外)を削除します

4. 指定されたフォルダをコンパクトなツリー表示する
 int tree( <folder[/wildcard]> [," [file]"])
・"file" を指定するとファイル名を表示する

5. ファイルを一覧表示する (listSegment)
 int ls( <folder[/wildcard]> [," [path] | [0 | , | k] [260 | no260]"])
・ファイル長、0: 編集なし、, : カンマ編集、K: 単位変換 (属性を表示するためにはいずれかを指定する)
・path: ファイル長の代わりに パス長を sort キーとし使用するための編集("%, 7d")をして表示する
・260: 長いパスを表示、no260: 短いパス、省略: 全て

・ls はシェル連携をを考慮してタブ区切りで出力しています (日時、長さ、パス)

6. フォルダをクリーンアップする
 int clean( [," [clean] [noTime]"])
・"clean" オプションは空のフォルダを削除する
・"noTime"、標準ではフォルダの更新日時を子要素の日時に設定する(空フォルダは Time0(日時 0))

7. シェル変数を設定する
 int set( [," [var=val] …"])
・MAX_PATH=260 パスの最大長を指定する (tree、ls: 260、no260 オプションで使用)
・DISPLAY_WIDTH=40 パスを画面に表示する幅
・オプションを省略すると一覧表示します

8. その他、共通オプションなど
 プログレス: progress
・"copy", "move", "remove" で使用する
 ・リダイレクトと共存可能

 リダイレクト: [12]>{1,2} path
・リダイレクトは ①後続オプションが存在する場合は、パスをシングルクオートで囲む仕様です >'path'
   これは後続の一般オプションを食ってしまうためで、②オプションの最後に指定または、
   ③リダイレクト達のみの単独指定でも回避できます
   すなわち "/*オプション*/ 1>foo 2>bar /*ここにオプションは書けない*/"

・後続オプション問題を回避する 3+1つの方法
   ①空白を含むパスはシングルクオートで囲む (エスケープは、<\ '>、<' '>)
   ②(空白を含む)パスと(空白を含まない)拡張子を指定する
   ③(空白を含まない)拡張子無しパスを指定する
   ④リダイレクト達のみの ”単独オプション” を指定する
   ①で失敗( ' 抜け 2>'foo)すると→②→③とアルゴリズムを切り替えます

・パスは、DISPLAY_WIDTH 桁に切り詰めますが、リダイレクトの場合はそのまま出力する

 リカーシブ: noRecursive
・オプションは大小文字を区別しないで前方一致で比較する (コマンド内でユニークなら良い)
   "foo", "bar" では煩雑になるため "foo bar" 形式を推奨する
   否定オプション noRecursive はマイナスオプション -r[ecursive] に短縮可能です

 Windows ネットワークパス: UNCパス【Universal Naming Convention】
・パスの形式: //コンピュータ名/共有名/フォルダ・ファイル名
   共有の設定: ドライブまたはフォルダで右ボタン→プロパティ→共有→詳細な共有→アクセス許可
   共有名の最後の文字を”$”にすると、エクスプローラーの共有一覧に名前が表示されなくなる(隠し共有)
(Linuxからは見えてしまいます、何か設定が必要なのかな?)
※これを使用すると Windowsネットワークだけでなく "Samba"をインストールした Linuxマシンにも乗り込めます

 0: 正常、1: インフォーメーション、2: ワーニング(マゼンタ)、3: エラー(赤)
・重大エラーは、throw するためあまり意味を持た持たないため、警告に使用しています

10. 外部コマンド呼び出し
 int system("<command> [<args...>] [>redirect]")

11. PowerShell 呼び出し
 int system("PowerShell <command> [<args...>] [>redirect]")

12. コマンドプロンプト呼び出し
 int system("CMD /C <command> [<args...>] [>redirect]")

※ ソースコード: plus/io/NanoTools.java

CHANGELOG

  • 2022-12-28 sort コマンドを Android nanoShell から持って来た
  • 2022-12-28 CSV ツールにカラム削除(del)機能を追加した
  • 2023-01-01 ls コマンドに path オプションを追加した
  • 2023-01-05 set (シェル変数の設定)コマンドを追加した
  • 2023-01-09 コマンドラインのパスを切り詰めて表示するようにした
  • 2023-01-12 コマンドの実行時間を表示するようにした
  • 2023-01-19 clean コマンドを追加した
  • 2023-01-24 progress 機能を実装した
  • 2023-01-26 リファクタリング開始
  • 2023-01-28 async I/O を実装した
  • 2023-02-04 clean コマンドの誤植を修正
  • 2023-02-05 move コマンドに ATOMIC_MOVE 機能を実装
  • 2023-02-10 clean コマンドの不具合を修正
  • 2023-02-18 リダイレクトの仕様を見直した
            (正規表現が妙な動作をするため諦めてましたが前方参照で解決しました)
  • 2023-02-20 ネットワークパスに対応 (UNC: Universal Naming Convention)
  • 2023-03-01 Linux に "Samba" をインストール開始

ネットワークアクセスのため "Samba" をインストール

Windows ネットワークのサーバとしてLinux に "Samba" をインストール
ちなみに、う~さんは「Linux、インフラ」初心者です

検証環境

  • Windows 10: MEM: 8G、外付けSSD(USB3.0、500GB)
  • Linux Mint 21.1: MEM: 4G、HDD: 300GB
    (足腰が弱いため足を引っぱらなければ良いですが ^^);
  • Samba 4.15.13
  • 検証データ: ミュージック、30曲(8フォルダ)、2.1GB (曲数は前回の記事より減らしました)
  • Wi-Fi環境
    5GHz帯域を利用(CATV,メタル)のため速くないです
    スピードテストの結果は Fast.com:20, Google:20, USEN:21Mbps(bits per second)
WiFibench
※ "Samba" 定義ファイル
## /etc/samba/smb.conf
# Global parameters
[global]
    log file = /var/log/samba/log.%m
    logging = file
    map to guest = Bad User
    max log size = 1000
    obey pam restrictions = Yes
    pam password change = Yes
    panic action = /usr/share/samba/panic-action %d
    passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
    passwd program = /usr/bin/passwd %u
    server role = standalone server
    server string = %h server (Samba, Ubuntu)
    unix password sync = Yes
    usershare allow guests = Yes
    wins support = Yes
    idmap config * : backend = tdb
    hosts allow = 192.168.X.XXX/255.255.255.0 \
        127.16.X.XXX/255.255.255.0 localhost
# リクエストサイズが 16KB を超える read は非同期 I/O を使用する
    aio read size = 16384
[printers]
    browseable = No
    comment = All Printers
    create mask = 0700
    path = /var/spool/samba
    printable = Yes
[print$]
    comment = Printer Drivers
    path = /var/lib/samba/printers
[share]
    create mask = 0777
    directory mask = 0777
    force create mode = 0777
    force directory mode = 0777
    force user = guest2
    guest ok = Yes
    guest only = Yes
    inherit permissions = Yes
    path = /home/share/
    read only = No

検証用ネットワークのためやり放題の設定になっています
「smb.conf - Samba の設定ファイル」
「Using Samba」
「LAN 構築の基礎知識」

※ "Samba" インストール、シェルスクリプト
## /etc/samba/smb.conf
#   sudo apt update
#   sudo apt upgrade
#   sudo apt install -y samba

echo    . Samba 設定ファイルの編集
    sudo xed /etc/samba/smb.conf
    testparm    >_sambaStart.log

echo    . ファイヤーウォールの設定
    sudo ufw enable
    sudo ufw allow ssh
    sudo ufw allow samba
    sudo ufw app list
    sudo ufw reload
    sudo ufw status    >_ufw.log

echo    . Samba 再起動
    sudo systemctl restart smbd nmbd
echo    . 自動起動設定
    sudo systemctl enable smbd nmbd

## sudo の要不要が解らないため全部に付加しています

まずは、"ping" で確認

なんと、Linux → Windows のコンピュータ名指定の "ping" が飛びません
急遽ググって Wins(winbind) をインストールしたが変化なし
この辺りになると、う~さんのスキル限界のため、
1. Wi-Fiルータの DHCPに Windows機の、IPとMACアドレスを登録し固定アドレス化
2. Linux機の /etc/hostsにWindows機のIPとコンピュータ名を登録する
3. これでめでたく解決しました ^^);

記事の多くはコンピュータ名を使用していないため共通の課題かな?

検証開始

1.1 ATOMIC-MOVE モード

moveコマンドは、同一デバイスへのI/Oは最高性能(フォルダの付け替え)で動作します
※2 はネットワーク超えでもデータ本体は移動しないため同じ性能です

No. パス スピード データの流れ 備考
※1 //princess7/share/  0sec Win ⟳ ローカル共有SSD  直I/O
※2 //princess6/share/  0sec Win→Samba ⟳ HDD  Winで制御,SambaでI/O

※ Samba チューニング

  1. socket options = TCP_NODELAY
    Windows TCP/IPスタックの TCP ACKの送出が遅い問題を解消
  2. aio read size = 16384
    16KB を超えるリードは非同期 I/O を使用する
  3. ログを出力しない(HDD対策)
    log level = 0
    syslog = 0
※2 はチューニングの結果(1., 3.) 1 → 0sec になりました
  ちなみにアプリは 1 (Main) + I/Oに4 (論理CPU数)スレドを割り当てて動作しています

1.2 スクリーンショット ※2

AX

1.3 タスクマネージャ ※2 - 中央の波形が制御パケット

WiFiAX

2. Copyコマンド

No. パス スピード データの流れ 備考
※1 /home/share/  1:06sec Linux ⟳ HDD直 Samba,NWを除く素のLinux機の性能
※2 D:/share/  08sec Win ⟳ SSD直 素のWin機性能 Linux機より6.6倍速い
※3 //princess7/share/  10sec Win ⟳ ローカル/SSD ローカル共有, パケットは飛ばない
※4 //princess6/share/  1:00sec Win→Samba ⟳ /HDD 制御パケットのみ飛ぶ
※5 //princess6/share/  約47min Samba/HDD→エクスプローラ→/SSD ※4+Wi-Fi (遅い)
※6 //princess6/share/  35~37min Samba/HDD→Win→/SSD  〃

※5,6 Sambaに「16KB を超える read は非同期 I/O を使用」オプションを適用し 8min改善済み
エクスプローラと大差ないと言う事は策は限られているということですね

2.2 スクリーンショット ※4

AC

2.3 タスクマネージャ ※4 制御パケット

WiFiAC

2.4 タスクマネージャ ※6 データパケット

データ:2.13GB x 8bit ÷ (36min x 60sec) = 8Mbps
(スピードテスト(20M)との差がここまでとは、近隣は 5GHz帯を使用使用していないため干渉はないです)

WiFi03

まとめ

※2.6 copy 以外は想定以上の数値を叩き出しています
本格的に運用するためにはWi-Fiの子機を導入しHUB(ハブ)として利用すれば良いのかな?
しかし最近策定された(2021) EasyMesh規格でないと異メーカーの製品は繋がりません

「旦那、スキルアップしましたね~」『食わず嫌いの Linuxもやらな判らんで』

オープンソース

検証環境

  • Windows 10
  • Windows Terminal (オープンソース)、Windows PowerShell (オープンソース)
  • GNU Make (オープンソース)
  • Java 20 (オープンソース)
  • AWK˜plus for Java (オープンソース)

インストール

  1. Java をダウンロード(環境を汚さない .zip 版を推奨、複数の Javaもインストールできます)「Java Downloads」
  2. AWK~plus をダウンロード「AWK~plus for Java」 (コマンドを添付しています)
  3. AWK~plus フォルダ中の makefile の JAVAHOME 変数に Javaホームパスを設定する。

実行

ターミナルを開き、AWK~plus フォルダをカレントディレクトリにして、と入力する。

「Table of contents」 2023.04.1