[samba-jp:23118] Re: 「宛先には既に...ファイルが存在します」

ARAI Shun-ichi hermes @ ceres.dti.ne.jp
2020年 11月 24日 (火) 21:40:35 JST


あらいです。

 先日投稿した標題の件、あまり情報に需要がなさそうですし本業(非IT)も
忙しかったのでしばらく放置していたのですが、この連休にちょっとログとソー
スを眺めていたら自分的にもやっとしていた箇所の原因が判明したので、まと
めさせていただきます。
 ちなみにそのもやっとしていた箇所とは現象が永続する(再起動等しても起
きる)ことで、どこに情報が残っているのかと思っていましたが、これは下記
の2.1のためでした。

 それでは、ちょっと時間も経っているので何が起きたのかから始めることと
します。

0. 現象
 WindowsからSambaのサーバにファイルをコピーする際、コピー先となるファ
イルはコピー前に実際には存在しないのに、既に存在するという警告のダイア
ログが出ることがあります。
 キャンセルするとサイズが0バイトのファイルが残るのですが、これはダイ
アログが出た時点でできています。

1. 発生条件
- Sambaで公開しているディレクトリが、拡張属性をサポートしていないFSにある
- ea support = yes (デフォルト)

の環境で、SambaのサーバからコピーかカットしてWindowsに持ってきたファイ
ルをまたサーバにコピーしようとした場合に発生します。
 また、SELinuxの設定も関係ありそうですが、そこは不明です。

2. 動作

2.1 SambaサーバからWindowsへのファイルコピー
 ファイルに含まれた情報をWindows側へ伝えるため、拡張属性を読み込みま
す。この際、当該FSでは拡張属性をサポートしていないのですが、
security.selinux(="unlabeled")が得られます。
 コピーによりWindows側に生成されたファイルの拡張属性には、
user.SECURITY.SELINUXという名前のものが設定されます。先頭のuser.は、
Sambaが属性の名前に必要に応じ付加しています。

2.2 WindowsからSambaサーバへのファイルコピー
 コピー元のファイルに拡張属性がついているので、SMBのExtAに上記の
user.SECURITY.SELINUXが設定された要求が出されます。

↓参考
[MS-SMB2]: SMB2_CREATE_CONTEXT Request Values | Microsoft Docs
  https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/75364667-3a93-4e2c-b771-592d8d5e876d

 新しく作ったファイルの拡張属性にSambaがその情報を書こうとしてエラー
が発生しますが、その前段階で読み込みに成功(security.selinuxを取得)し
ているためか、ファイルを残したまま継続します。
 その後データを書き込もうとしてオープンを試み、そのファイルがあるので、
クライアントには既にファイルが存在すると通知し、問題の現象が発生します。

 なお、このファイルをSamba経由でext4のFSにコピーして拡張属性を見ると、
このようになっています。

$ getfattr -d -m - ea_list_test.txt 
# file: ea_list_test.txt
user.DOSATTRIB=0sAAAEAAQAAABRAAAAIAAAAB0Q5bg9wdYBHRDluD3B1gE=
user.SECURITY.SELINUX="unlabeled"

3. 私見

3.1 Sambaの設定
 拡張属性をサポートしていないFSを使う場合はea supportをnoにするのが良
いようです。一応yesでも動作するよう配慮されている様子ではありますが、
完全ではないようです。
 まあ、そもそもそういうFSを使うべきでないというコメントもいただきまし
たし、それが適切なのでしょう。

3.2 Sambaのエラー処理
 Sambaとしては、拡張属性をサポートしていないFSからエラーにもならずに
値が返ってくる(が書き込みはできない)ことは想定していない模様で、上記
のようにやや処理に不完全な部分があるようです。

3.3 おまけ
 Sambaで公開しているFSが拡張属性をサポートしていないことでまず目につ
く問題として、MS Office等が一時的に作成する"~$"で始まるようなファイル
が見えるということがあります。
 hide filesで見えなくするとそれっぽい感じに使えるようになりました。


 以上です。
 長々と失礼しました。


samba-jp メーリングリストの案内