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 に後の設定を反映させるのは面倒そう.再インストールが必要だろうなあ.