Samba で Cygwin のシンボリックリンク

Samba 上に Cygwin をインストールしたところ,vi が起動しなかった (vim は起動する).調べてみると,シンボリックリンクがうまく設定されていないらしい.

$ vi
/usr/bin/vi: /usr/bin/vi: cannot execute binary file

$ which vi
which: no vi in (/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/usr/lib/lapack)

$ ls -l /usr/bin/vi*
-rw-r--r-- 1 rero なし      18 Apr 26 19:16 /usr/bin/vi
-rw-r--r-- 1 rero なし      18 Apr 26 19:16 /usr/bin/view
-rwxr-xr-x 1 rero なし 1382912 May 14  2007 /usr/bin/vim.exe
-rw-r--r-- 1 rero なし      18 Apr 26 19:16 /usr/bin/vimdiff
-rwxr-xr-x 1 rero なし    1600 May 14  2007 /usr/bin/vimtutor

$ cat /usr/bin/vi
!<symlink>vim.exe

Cygwinシンボリックリンクは,Windows ファイルシステムの「システム」属性を利用するらしいが,Samba のデフォルト設定では「アーカイブ」と「読み取り専用」属性のみ有効になっており,「隠しファイル」と「システム」属性は無効になっている.

# testparm -v
... (省略) ...
        map archive = Yes
        map hidden = No
        map system = No
        map readonly = yes
... (省略) ...

そこで,/etc/samba/smb.conf に

        map hidden = yes
        map system = yes

を追記する.

Samba の archive / system / hidden 属性は,UNIX ファイルシステムの user / group / other の x ビットにマッピングされるらしい (要出典).

追記

以下の記述も必要.さもないと,testparm したときに設定がおかしいと怒られる.

create mask = 0755
# testparm -v
... (省略) ...
Invalid combination of parameters for service homes.
  Map hidden can only work if create mask includes octal 01 (S_IXOTH).
Invalid combination of parameters for service homes.
  Map system can only work if create mask includes octal 010 (S_IXGRP).
... (省略) ...

追記 2

先に説明した方法では,ディレクトリにシステム属性などを付加することはできない (ディレクトリでは x ビットを普通に使うため,x ビットに特殊な意味を持たせることができない).そのため,以下の方法の方がよさそう.

UNIX 上でファイルシステムのマウント時に user_xattr オプションを付加する.そして,smb.conf で先に説明した方法の代わりに以下を記述する.

  ea support = yes
  store dos attributes = yes
  map archive = no ←アーカイブ属性も拡張属性に格納されるため、パーミッションビットへの反映は不要である

だめだめ日記 - [Samba] store dos attributesパラメータとea supportパラメータによるファイル属性の拡張属性への格納

でも,前の設定でインストールした Cygwin に後の設定を反映させるのは面倒そう.再インストールが必要だろうなあ.