背景
ホストとゲストで共有したいディレクトリがあって、NFSが気持ち速いらしい。こうしてみたらトラブった。
config.vm.synced_folder "../", "/share", type: "nfs"
vagrantからAnsible provisionerでセットアップしてて、mkdir, chown, chmodしてる箇所があって、
- name: create document root
file: path=/share state=directory owner=vagrant group=vagrant mode=0775
このようにコケていました。
TASK [apache : create document root] *******************************************
fatal: [default]: FAILED! => {"changed": false, "gid": 20, "group": "games", "mode": "0755", "msg": "chown failed: [Errno 1] Operation not permitted: '/share'", "owner": "501", "path": "/share", "secontext": "system_u:object_r:nfs_t:s0", "size": 416, "state": "directory", "uid": 501}
最初はVagrantfileをいじくり回していましたが、ゲストOS内に入ってみたりするうちに、違うとわかりました。
結論
ゲストOS内から、NFS共有したディレクトリに対して、chown操作ができない。chmodはできる。
[vagrant@hoge /]$ ll
total 102
(略)
drwxr-xr-x 28 501 games 896 Oct 9 13:20 share
(略)
[vagrant@hoge /]$ sudo chown vagrant:vagrant /share
chown: changing ownership of `/share': Operation not permitted
[vagrant@hoge /]$ sudo chmod 777 /share
[vagrant@hoge /]$ ll /
total 102
(略)
drwxrwxrwx 28 501 games 896 Oct 9 13:20 share
(略)
[vagrant@hoge /]$
NFS共有において、ゲストOS内からchownする必要があるかというと、必要ない。なぜならVirtualBoxのSynced Folder側が、ゲストOS内の誰で触ろうとも、map_uid, map_gid に変換してホストOSに読み書き操作するから。
他にハマったところ
マニュアル読む
ググっても古い断片的な情報しかない。公式マニュアルが正義のはずだっ。
vagrant sshして挙動を観察する
ホストOSとVagrantfileからのアプローチが手詰まってきた頃合いで、ゲストOSからも見る。
map_uid, map_gid
This defaults to the current user running Vagrant.
とあるので、
config.nfs.map_uid = 502
config.nfs.map_gid = 20
は書かなくてよい。むしろ、ホスト側のuidは501だったり503かもしれず、gidもmacのバージョンによって違うかもしれず、git cloneしてから手作業でVagrantfileをイジるようなことになりかねないので、削るべき。
ホストOSの /etc/exports
まずはVagrantfileには何も書かず、自動生成に任せるのが正解に思いました。自動生成でトラブった場合に、うまく動くよう明記するのが疲れないのでは。