systemd Vagrant 和 VirtualBox:等待同步文件夹挂载

ric*_*mer 7 virtualbox network-share vagrant systemd

我正在尝试在 Vagrant 盒子上设置一个 systemd 服务,它需要在开始之前安装 Vagrant 同步文件夹。

流浪档案

Vagrant.configure(2) do |config|
    config.vm.box = "ubuntu/yakkety64"
    config.vm.synced_folder ".", "/usr/local/src"
    config.vm.provision "shell", path: "bootstrap/bootstrap"
end
Run Code Online (Sandbox Code Playgroud)

/etc/systemd/system/my-server.service

[Service]
ExecStart=/usr/bin/node /usr/local/src/index.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my-server
User=ubuntu
Group=ubuntu

[Unit]
Requires=remote-fs.target
After=vboxguest.service
After=virtualbox-guest-utils.service

[Install]
WantedBy=remote-fs.target
Run Code Online (Sandbox Code Playgroud)

如果我不启用my-server服务,则同步文件夹已正确安装。但是当我尝试启用my-server服务时,该服务无法找到挂载的文件。如果我然后登录到 Vagrant 框,则不会安装该文件夹。似乎该服务尝试从该路径加载文件会干扰 Vagrant。

那么,如何在我的服务启动之前等待文件夹被挂载?

其他解决方案在各种方面都存在不足,需要人工干预才能启动服务,这是不可接受的。

Iva*_*tov 6

我刚刚通过添加以下内容解决了这种问题:

[Install]
WantedBy=multi-user.target var-www-example.com.mount'
Run Code Online (Sandbox Code Playgroud)

其中var-www-example.com对应于:

config.vm.synced_folder ".", "/var/www/example.com"
Run Code Online (Sandbox Code Playgroud)

Vagrantfile.

因此,Vagrant 的每个同步文件夹挂载点都有一个 XXX.mount systemd 单元。您可以通过以下方式找到您的:

# systemctl list-units | fgrep .mount
Run Code Online (Sandbox Code Playgroud)


Sco*_*eod 3

我遇到了类似的问题,其中我的一个 systemd 服务需要在服务运行成功启动之前存在一个 vagrant 同步文件系统。我通过让vagrant shell 配置程序在每次启动时自动重新启动服务来解决这个问题。这是有效的,因为配置器在 vagrant 挂载同步文件系统后运行。

config.vm.provision "shell", run: "always", inline: "systemctl restart my-server"
Run Code Online (Sandbox Code Playgroud)

我不确定为什么您的服务会干扰您的同步文件系统。Vagrant 默认将 vagrantfile 所在的文件夹同步到 /vagrant。可以安装两次吗?