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
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)

※
"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 チューニング
- socket options = TCP_NODELAY
Windows TCP/IPスタックの TCP ACKの送出が遅い問題を解消
- aio read size = 16384
16KB を超えるリードは非同期 I/O を使用する
- ログを出力しない(HDD対策)
log level = 0
syslog = 0
※2 はチューニングの結果(1., 3.) 1 → 0sec になりました
ちなみにアプリは 1 (Main) + I/Oに4 (論理CPU数)スレドを割り当てて動作しています
1.2 スクリーンショット ※2
1.3 タスクマネージャ ※2 - 中央の波形が制御パケット
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
2.3 タスクマネージャ ※4 制御パケット
2.4 タスクマネージャ ※6 データパケット
データ:2.13GB x 8bit ÷ (36min x 60sec) = 8Mbps
(スピードテスト(20M)との差がここまでとは、近隣は 5GHz帯を使用使用していないため干渉はないです)
まとめ
※2.6 copy 以外は想定以上の数値を叩き出しています
本格的に運用するためにはWi-Fiの子機を導入しHUB(ハブ)として利用すれば良いのかな?
しかし最近策定された(2021) EasyMesh規格でないと異メーカーの製品は繋がりません
「旦那、スキルアップしましたね~」『食わず嫌いの Linuxもやらな判らんで』
オープンソース
検証環境
- Windows 10
- Windows Terminal (オープンソース)、Windows PowerShell (オープンソース)
- GNU Make (オープンソース)
- Java 20 (オープンソース)
- AWK˜plus for Java (オープンソース)
インストール
- Java をダウンロード(環境を汚さない .zip 版を推奨、複数の Javaもインストールできます)「Java Downloads」
- AWK~plus をダウンロード「AWK~plus for Java」
(コマンドを添付しています)
- AWK~plus フォルダ中の makefile の JAVAHOME 変数に Javaホームパスを設定する。
実行
ターミナルを開き、AWK~plus フォルダをカレントディレクトリにして、と入力する。