如何让 vboxweb 在启动时正确启动

如何让 vboxweb 在启动时正确启动

我最近将无头服务器更新至 Ubuntu Server 15.10。

  • 基本 Ubuntu 服务器
  • Xubuntu 最小安装

我已经从默认的 Ubuntu 源安装了 virtualbox 5.0.14。我已经下载并安装了virtualbox/5.0.14/Oracle_VM_VirtualBox_Extension_Pack-5.0.14-105127.vbox-extpack

vbox我在组中定义了一个用户vboxusers,基本上 virtualbox 本身可以正常工作。但我希望它可以通过 phpvirtualbox 进行远程配置。

我下载并安装了phpvirtualbox-5.0-5.zip

我将其添加到VBOXWEB_USER=vbox文件/etc/default/virtualbox

当我从另一台机器访问网页时,出现错误Could not connect to host(请参阅消息1,更多详情请参阅消息2,但我认为,这并不是很重要。)

使用sudo netstat -peanut,看起来 vboxwebsrv 没有使用正确的 IP 地址。它显示本地地址而::1:18083不是预期的192.168.1.12:18083

经过一番谷歌搜索后,我将其添加VBOXWEB_HOST=192.168.1.12到文件/etc/default/virtualbox,但重新启动服务后仍然没有变化。

但是,如果我用 停止服务sudo systemctl stop vboxweb.service并用 手动启动它sudo vboxwebsrv -H 192.168.1.12,则可以正常工作。sudo netstat -peanut现在报告了预期的 IP/端口地址。

我查看的大多数文档都提到了 init.d,我开始想也许 systemd 不使用该/etc/default/virtualbox文件...我发现我可以编辑该文件,并在命令中/lib/systemd/system/vboxweb.service添加一个。重新启动 vboxweb 服务后,它就起作用了!:o)-H 192.168.1.12ExecStart

启用服务以便它在启动时自动启动:

sudo systemctl 启用 vboxweb.service

但重启后,根本没有显示任何 vboxweb sudo netstat -peanut,尽管 ps -ef 显示服务已启动:

$ps -ef

root 1383 1 0 mars02 ? 00:00:00 /usr/lib/virtualbox/vboxwebsrv --pidfile /run/vboxweb.pid --background -H 192.168.1.12 -p 18083

重新启动服务将修复此问题,但重启后它将无法正确启动。

因此,我想也许 vboxweb.service 在 systemd 初始化过程中启动得太早了。因此,我vboxweb.service再次使用 编辑了该文件After=apache2.service(后来也尝试了After=multi-user.target),并使用 验证了systemd-analyse plotvboxweb 的 init 确实已移至初始化序列的最末尾。但 wboxweb 仍然未在netstat -peanut

最后回答我的问题:

  1. init.d 和 systemd 之间是否存在冲突,例如 virtualbox(来自标准 Ubuntu 源)依赖于特定于 init.d 的文件,而 Ubuntu 已转向 systemd?
  2. VBOXWEB_HOST文件中的设置/etc/default/virtualbox没有效果还有其他原因吗?
  3. 编辑 vboxweb.service 文件(特别是使用主机参数)是否正确。
  4. (这是最重要的一点)如何在启动时使用正确的 IP/端口设置启动并运行 vboxweb 服务?我没什么主意了 :/

附言:我知道我可以大大缩短这篇文章,只保留主要问题,因为我已经解决了其余的问题(只留下几个问题),但我认为让其他人看看我如何解决这个问题可能会很有趣。

BR,罗尔夫

答案1

经过更多的谷歌搜索和摸索之后,我终于找到了一个解决方案:

1) 我得出的结论是,该/etc/defaults/virtualbox文件似乎对任何事情都没有任何影响(只是 init.d 时代的遗留问题?)。因此该文件中的用户和组设置被浪费了。

解决方案:在文件的部分中添加了User=vbox和。Group=vboxusers[Service]vboxweb.service

2) 我遇到的一些问题是由于vboxweb.config文件引用文件/run夹中的 pid 文件,并且vbox没有对该文件夹的写访问权限。首先,我尝试创建一个由 拥有的子文件夹vbox来存储 pid 文件,但我发现该/run文件夹(包括所有子文件夹)在启动时会被清除。

解决方案:在主目录中创建一个子文件夹vbox,并vboxweb.config使用该位置更新文件。

3) 由于某种原因(我仍然不明白),在启动时无法在文件夹中和文件中引用实际 IP 地址 192.168.1.12 config.phpphpvirtualboxvboxweb.config原始帖子中所述)。(不过,稍后重新启动服务即可。)

解决方案:更新了两者config.php,并将vboxweb.configIP 地址从 192.168.1.12 改为 127.0.0.1。

案子结了!:o)......除了所有关于为什么事情会这样的想法之外,但我可以接受:o)

BR,罗尔夫

答案2

在我安装的版本中,服务中存在一些内置错误:

$ dpkg -l | grep -i virtualbox
ii  virtualbox                                 6.1.10-dfsg-1~ubuntu1.20.04.1         amd64        x86 virtualization solution - base binaries
ii  virtualbox-dkms                            6.1.10-dfsg-1~ubuntu1.20.04.1         amd64        x86 virtualization solution - kernel module sources for dkms
ii  virtualbox-qt                              6.1.10-dfsg-1~ubuntu1.20.04.1         amd64        x86 virtualization solution - Qt based user interface

另外,你必须根据以下要求定义至少一个参数

在 Linux 上,可以通过向文件 /etc/default/virtualbox 添加适当的参数,在主机启动时自动启动 Web 服务。有一个必需参数 VBOXWEB_USER,必须将其设置为稍后将启动虚拟机的用户。

假设该用户是pjfinn。以下是修复/修改。将用户添加到vboxusers组:

$ sudo usermod -a -G vboxusers pjfinn

在主目录run下创建目录:pjfinn

$ mkdir /home/pjfinn/run

然后应用以下修补程序。

补丁 #1:

*** /etc/default/virtualbox-orig  2020-12-07 17:02:51.567517505 +0100
--- /etc/default/virtualbox 2020-12-07 18:23:58.436155855 +0100
***************
*** 21,23 ****
--- 21,26 ----
  #   30 seconds for the VMs to shutdown
  SHUTDOWN_USERS=""
  SHUTDOWN=poweroff
+ 
+ # 2020/12 pj_finnegan fix - define mandatory parameter
+ VBOXWEB_USER=pjfinn

补丁 #2:

*** /lib/systemd/system/vboxweb.service-orig 2020-12-07 16:13:43.776834092 +0100
--- /lib/systemd/system/vboxweb.service   2020-12-07 19:24:07.352940488 +0100
***************
*** 1,11 ****
  [Unit]
  Description=VirtualBox Web Service
! After=network.target
  
  [Service]
  Type=forking
  ExecStart=/usr/lib/virtualbox/vboxweb-service.sh start
! PIDFile=/run/vboxweb.pid
  
  [Install]
  WantedBy=multi-user.target
--- 1,13 ----
  [Unit]
  Description=VirtualBox Web Service
! Requires=virtualbox.service
! After=network.target virtualbox.service
  
  [Service]
  Type=forking
  ExecStart=/usr/lib/virtualbox/vboxweb-service.sh start
! ExecStop=/usr/lib/virtualbox/vboxweb-service.sh stop
! PIDFile=/home/pjfinn/run/vboxweb.pid
  
  [Install]
  WantedBy=multi-user.target

补丁 #3:

*** /usr/lib/virtualbox/vboxweb-service.sh-orig 2020-12-07 17:00:04.901783182 +0100
--- /usr/lib/virtualbox/vboxweb-service.sh  2020-12-07 18:08:43.586981699 +0100
***************
*** 29,34 ****
--- 29,37 ----
  # X-Required-Target-Start: network-online
  ### END INIT INFO
  
+ # 2020/10 pj_finnegan fix - save binary PIDFILE received from systemd
+ VBOXWEB_PIDFILE="$PIDFILE"
+ 
  PATH=$PATH:/bin:/sbin:/usr/sbin
  SCRIPTNAME=vboxweb-service.sh
  
***************
*** 135,140 ****
--- 138,148 ----
          [ -n "$VBOXWEB_ROTATE" ]         && PARAMS="$PARAMS -R $VBOXWEB_ROTATE"
          [ -n "$VBOXWEB_LOGSIZE" ]        && PARAMS="$PARAMS -S $VBOXWEB_LOGSIZE"
          [ -n "$VBOXWEB_LOGINTERVAL" ]    && PARAMS="$PARAMS -I $VBOXWEB_LOGINTERVAL"
+ 
+         # 2020/12 pj_finnegan fix - avoid error:
+         #  Can't open PID file /run/vboxweb.pid (yet?) after start: Operation not permitted
+         [ -n "$VBOXWEB_PIDFILE" ]        && PARAMS="$PARAMS -P $VBOXWEB_PIDFILE"
+ 
          # set authentication method + password hash
          if [ -n "$VBOXWEB_AUTH_LIBRARY" ]; then
              su - "$VBOXWEB_USER" -c "$vboxmanage setproperty websrvauthlibrary \"$VBOXWEB_AUTH_LIBRARY\""

然后执行命令:

$ sudo systemctl daemon-reload

最后管理员命令:

$ sudo systemctl start vboxweb.service
$ systemctl status vboxweb.service
● vboxweb.service - VirtualBox Web Service
     Loaded: loaded (/lib/systemd/system/vboxweb.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-12-07 18:13:42 CET; 2s ago
    Process: 8997 ExecStart=/usr/lib/virtualbox/vboxweb-service.sh start (code=exited, status=0/SUCCESS)
   Main PID: 9023 (vboxwebsrv)
      Tasks: 20 (limit: 18850)
     Memory: 15.0M
     CGroup: /system.slice/vboxweb.service
             ├─9023 /usr/lib/virtualbox/vboxwebsrv --background -P /home/pjfinn/run/vboxweb.pid
             ├─9025 /usr/lib/virtualbox/VBoxXPCOMIPCD
             └─9031 /usr/lib/virtualbox/VBoxSVC --auto-shutdown

Dec 07 18:13:42 yourhost systemd[1]: Starting VirtualBox Web Service...
Dec 07 18:13:42 yourhost vboxweb-service.sh[8997]: vboxweb-service.sh: Starting VirtualBox web service.
Dec 07 18:13:42 yourhost vboxweb-service.sh[9014]: Starting VirtualBox web service.
Dec 07 18:13:42 yourhost systemd[1]: Started VirtualBox Web Service.

$ sudo systemctl stop vboxweb.service
$ systemctl status vboxweb.service
● vboxweb.service - VirtualBox Web Service
     Loaded: loaded (/lib/systemd/system/vboxweb.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Mon 2020-12-07 18:19:45 CET; 2s ago
    Process: 8997 ExecStart=/usr/lib/virtualbox/vboxweb-service.sh start (code=exited, status=0/SUCCESS)
    Process: 9135 ExecStop=/usr/lib/virtualbox/vboxweb-service.sh stop (code=exited, status=0/SUCCESS)
   Main PID: 9023 (code=exited, status=0/SUCCESS)

Dec 07 18:13:42 yourhost systemd[1]: Starting VirtualBox Web Service...
Dec 07 18:13:42 yourhost vboxweb-service.sh[8997]: vboxweb-service.sh: Starting VirtualBox web service.
Dec 07 18:13:42 yourhost vboxweb-service.sh[9014]: Starting VirtualBox web service.
Dec 07 18:13:42 yourhost systemd[1]: Started VirtualBox Web Service.
Dec 07 18:19:39 yourhost systemd[1]: Stopping VirtualBox Web Service...
Dec 07 18:19:39 yourhost vboxweb-service.sh[9135]: vboxweb-service.sh: Stopping VirtualBox web service.
Dec 07 18:19:45 yourhost systemd[1]: vboxweb.service: Succeeded.
Dec 07 18:19:45 yourhost systemd[1]: Stopped VirtualBox Web Service.

$ sudo systemctl restart vboxweb.service

一切都应该正常工作,并且启动时的错误应该会消失。

答案3

rolfhsp 的回答确实很有帮助。

另外,如果vboxweb.service修改为以其他非root用户身份运行,则会出现另一个故障。在这种情况下,原因记录为“无法打开“/dev/vboxdrvu”,errno=13,rc=VERR_VM_DRIVER_NOT_ACCESSIBLE”,这意味着用户没有权限访问/dev/vboxdrvu

默认情况下,/dev/vboxdrvu以及/dev/vboxnetctl/dev/vboxdru都只允许 root 用户访问(crw-------)。非 root 用户要访问它,必须修改权限。根据这个博客,只需将“规则”文件放入 /lib/udev/ 即可将其存档,内容如下:

/lib/udev/rules.d/20-virtualbox2.规则:

KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="vboxusers", MODE="0660"
KERNEL=="vboxdrvu", NAME="vboxdrvu", OWNER="root", GROUP="vboxusers", MODE="0660"
KERNEL=="vboxnetctl", NAME="vboxnetctl", OWNER="root",GROUP="vboxusers", MODE="0660"

然后重新启动系统,重启后,这些文件具有新的权限:

crw-------. 1 root root      10, 54 Mar 20 00:24 /dev/vboxdrv
crw-rw----. 1 root vboxusers 10, 53 Mar 20 00:24 /dev/vboxdrvu
crw-rw----. 1 root vboxusers 10, 52 Mar 20 00:24 /dev/vboxnetctl

虽然vboxdru还是没变,但是vboxdrvu已经对非root用户(在vboxusers群组内)有很好的访问权限了。修改之后,vboxweb.service非root用户就可以成功运行了。

答案4

对我来说,直接编译 VirtualBox 而不是使用 apt 安装它是可行的:

  1. 下载.run文件https://download.virtualbox.org/virtualbox/6.1.26/(这是版本 6.1.26,请将 URL 替换为最新版本或您的版本)
  2. 安装 gcc、make 和 perl apt-get update && apt-get install gcc make perl
  3. 安装.run文件bash *.run

按照这个方法安装后

  1. 将您的用户放入在 VirtualBox 安装中已创建的 vboxusers 组中 usermod -aG vboxusers $USER
  2. 在 /etc/default 中创建 virtualbox 文件,内容如下:
VBOXWEB_USER="{YOUR_USER}"
  1. 重启服务器
  2. 检查 vboxwebsrv 是否正在运行ps aux | grep vboxwebsrv

完毕。

相关内容