cifs(samba) で 100GB 以上を読み書きすると I/O error が発生していたので、再検証してみた。
Synology DS218+ のフォルダに cp
問題を切り分けする為に、Synology DS218+ の共有フォルダに仮想 Ubuntu から cp してみた。
# mount /dev/sdb1 /mnt/VirtualHDD # mount -t cifs -o username=user,password=Passwd //192.168.n.n/home /mnt/Synology # cp /mnt/VirtualHDD/sdb_new.img /mnt/Synology/
I/O error なく終了した。
md5sum 比較:
# md5sum -b ./sdb_new.img be20c9956b9cbfd571517c8848149576 ./sdb_new.img # 仮想 Ubuntu be20c9956b9cbfd571517c8848149576 ./sdb_new.img # Synology DS218+側
同一だった。という事は Windows10 側の問題だろうか...
SMB 接続 version 確認
Synology DS218+ は SMB2 以上に制限していた。linux 側の cifs は、明示的に指定しなければ SMB2 以上で接続する。SMB2未満では error が出て接続できない。
hiro20180901.hatenablog.com
なので、Windows10 とも SMB2 以上で接続されていると思っていた。もしかして違うのだろうか。
packet capture して調べる事例があるが、ちょっと難しめ(以前に遊んだ事はあるが)。
Linuxはサンバ(Samba)で踊る――WindowsとLinuxのファイル共有のいま:その知識、ホントに正しい? Windowsにまつわる都市伝説(25)(1/2 ページ) - @IT
Windows10 の PowerShell から SMB version を確認する方法と、smbclient で debuglevel を上げて表示させる方法がある。
Windows10 PowerShell から調べてみる
Windows と Windows Server で SMBv1、SMBv2、SMBv3 を検出する方法と有効または無効にする方法(microsoft.com)
PowershellでもうちょっとSMBの状態を詳しく見る - treedown’s Report
Windows10 で Synology DS218+ の共有フォルダを開いた状態で PowerShell(管理者モード) から確認してみた。
> Get-SmbConnection ServerName ShareName UserName Credential Dialect NumOpens ---------- --------- -------- ---------- ------- -------- Synology home PC-host-name\username MicrosoftAccount\accountname 3.1.1 1
Dialect 3.1.1 なので SMB3_11か。
> Get-SmbConnection -ServerName Synology | Select-Object -Property * SmbInstance : Default ContinuouslyAvailable : False Credential : MicrosoftAccount\accoutname Dialect : 3.1.1 Encrypted : False NumOpens : 5 Redirected : False ServerName : Synology ShareName : home Signed : False UserName : PC-Name\username PSComputerName : CimClass : ROOT/Microsoft/Windows/SMB:MSFT_SmbConnection CimInstanceProperties : {ContinuouslyAvailable, Credential, Dialect, Encrypted...} CimSystemProperties : Microsoft.Management.Infrastructure.CimSystemProperties
Synology DS218+ 側も SMB3_11 なのが確認できる。
linux smbclient から調べてみる
smbclient — サーバー上の SMB/CIFS リソースにアクセスする ftp のようなクライアント
Samba 4.7 Features added/changed - SambaWiki
cifs.ko だと /proc/fs/cifs/cifsFYI で debuglevel を上げてもよく分からなかった。smbclient を入れて確認してみた。Ver.4.7 で SMB3_11 に対応している。debuglevel=4 でやってみた。長いので一部省略。
# smbclient //192.168.n.n/VirtualHDD passwd -U accountname -m SMB3_11 -d 4 ... 略 ... Client started (version 4.7.6-Ubuntu). Connecting to 192.168.n.n at port 445 session request ok negotiated dialect[SMB3_11] against server[192.168.n.n] ... 略 ... session setup ok tconx ok Try "help" to get a list of possible commands. smb: \>
と SMB3_11 で接続している。
option を -m SMB2 に変更すると
... 略 ... negotiated dialect[SMB2_10] against server[192.168.n.n] ... 略 ...
となる。cifs は不明だが smbclient なら SMB3_11 で接続しているのが確認できた。
SMB3 で mount.cifs で Windows10 に接続し cp
Windows10 だと SMB3 に対応しているので、仮想 Ubuntu 側から vers=3 指定で mount.cifs して cp してみた所、やはり I/O エラーが発生して正常にコピーできなかった。
- progress で確認していると、100% まで順調に進む。
- 100% に達しても、cp が直ぐに終了しない。
- Windows10 側の処理が重くなる。
- 74GB/119GB の中途半端な大きさで記録されている。
という形で不思議な状態になっている。変なバッファとか入ってる?
smbclient で put
なんとなく cifs.ko が悪さしてそうな感じがしてきた。scp では問題なかったので、確認の為に smbclient で put してみた。(debuglevel -d 10)
# smbclient //192.168.n.n/VirtualHDD passwd -U accountname -m SMB3_11 -d 10 ... 略 ... smb: \> put ./debian_new.vhd dos_clean_name [\.\debian_new.vhd] unix_clean_name [\debian_new.vhd] map_open_params_to_ntcreate: fname = \debian_new.vhd, deny_mode = 0x42, open_func = 0x12 map_open_params_to_ntcreate: file \debian_new.vhd, access_mask = 0x12019f, share_mode = 0x3, create_disposition = 0x5, create_options = 0x40 private_flags = 0x0 putting file ./debian_new.vhd as \debian_new.vhd (38039.4 kb/s) (average 38039.4 kb/s)
問題なく終了した。md5sum を比較すると、
$ md5sum -b ./debian_new.vhd b510c2e4fa93562e3aefe8b5e529aaff *./debian_new.vhd # 仮想 Ubuntu (original) b510c2e4fa93562e3aefe8b5e529aaff *./debian_new.vhd # WSL Ubuntu (copied)
同一だった。
結果
mount.cifs を使用して仮想 Ubuntu -> Windows10 に 100GB 以上のファイルを cp すると I/O error を出していたので、検証してみた。
- scp だと OK (前に確認)
- mount.cifs で相手が Synology DS218+ だとOK
- mount.cifs(SMB3) で相手が Windows10 だと NG (2回目)
- smbclient(SMB3) だと OK
という結果になった。ちょっとモヤっとした感じが残るが、出来るだけ cifs.ko は使わないで置こう。