hiroの長い冒険日記

主にコンピュータ周辺の興味を持った内容を綴ります

Desktop PC 128GB SSD へ Debian install 落穂拾い その2

当日記ではアフィリエイト広告を利用しています

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 は使わないで置こう。