使ってる version は、vagrant-1.6.3
。
vagrant の VM 内で、ディレクトリに chmod
しても反映されない現象。
今回は、/home/vagrant/shared_vagrant
の権限を変えたい。
[vagrant@localhost vagrant]$ ls -la /home/vagrant | grep shared
drwxr-xr-x 1 vagrant vagrant 102 Mar 11 22:21 shared_vagrant
[vagrant@localhost vagrant]$ chmod 777 shared_vagrant
[vagrant@localhost vagrant]$ ls -la /home/vagrant | grep shared
drwxr-xr-x 1 vagrant vagrant 102 Mar 11 22:21 shared_vagrant # 755 のまま…
どうやら、synced_folder
として設定していたのが原因のようだった。
config.vm.synced_folder "./shared_host", "/home/vagrant/shared_vagrant"
synced_folder
の option に、mount_options
というのがあるので、権限を変更したければ、これを指定してあげるのがよさそう。
https://www.vagrantup.com/docs/synced-folders/basic_usage.html
Vagrantfile に下記のように記述を追加。
dmode
がディレクトリの権限で、fmode
がファイルの権限のご様子。
権限はよしなに指定する。今回は雑に 777
で。
config.vm.synced_folder "./shared_host", "/home/vagrant/shared_vagrant", :mount_options => ['dmode=777', 'fmode=777']
編集が終わったら、一度ホスト側で reload する。
% vagrant reload
ssh して対象ディレクトリの権限を確認すると、指定した権限が反映されている。
[vagrant@localhost vagrant]$ ls -la /home/vagrant | grep shared
drwxrwxrwx 1 vagrant vagrant 102 Mar 11 22:21 shared_vagrant
補足
mount_options
に何を指定すればよいのかわからなかったので、調査した時のメモ。
まずはソースコード見てみる。
% grep -nri mount_options /Applications/Vagrant/
見つかったこのファイルを確認したところ、mount -t vboxsf
に、そのまま渡しているように見える。
/Applications/Vagrant//embedded/gems/gems/vagrant-1.6.3/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb
vboxfs は virtualbox ぽいなってことぐらいしかわからなかったので、mount.vboxsf
ってコマンドの option を調べた。
[vagrant@localhost vagrant]$ sudo mount.vboxsf
Usage: mount.vboxsf [OPTIONS] NAME MOUNTPOINT
Mount the VirtualBox shared folder NAME from the host system to MOUNTPOINT.
-w mount the shared folder writable (the default)
-r mount the shared folder read-only
-n do not create an mtab entry
-o OPTION[,OPTION...] use the mount options specified
Available mount options are:
rw mount writable (the default)
ro mount read only
uid=UID set the default file owner user id to UID
gid=GID set the default file owner group id to GID
ttl=TTL set the "time to live" to TID for the dentry
dmode=MODE override the mode of all directories to (octal) MODE
fmode=MODE override the mode of all regular files to (octal) MODE
umask=UMASK set the umask to (octal) UMASK
dmask=UMASK set the umask applied to directories only
fmask=UMASK set the umask applied to regular files only
iocharset CHARSET use the character set CHARSET for I/O operations
(default set is utf8)
convertcp CHARSET convert the folder name from CHARSET to utf8
Less common used options:
noexec,exec,nodev,dev,nosuid,suid
これで、dmode
/fmode
てところまでたどり着いた、つもり。