我最近将无头服务器更新至 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.12
ExecStart
启用服务以便它在启动时自动启动:
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 plot
vboxweb 的 init 确实已移至初始化序列的最末尾。但 wboxweb 仍然未在netstat -peanut
最后回答我的问题:
- init.d 和 systemd 之间是否存在冲突,例如 virtualbox(来自标准 Ubuntu 源)依赖于特定于 init.d 的文件,而 Ubuntu 已转向 systemd?
VBOXWEB_HOST
文件中的设置/etc/default/virtualbox
没有效果还有其他原因吗?- 编辑 vboxweb.service 文件(特别是使用主机参数)是否正确。
- (这是最重要的一点)如何在启动时使用正确的 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.php
(phpvirtualbox
如vboxweb.config
原始帖子中所述)。(不过,稍后重新启动服务即可。)
解决方案:更新了两者config.php
,并将vboxweb.config
IP 地址从 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 安装它是可行的:
- 下载
.run
文件https://download.virtualbox.org/virtualbox/6.1.26/(这是版本 6.1.26,请将 URL 替换为最新版本或您的版本) - 安装 gcc、make 和 perl
apt-get update && apt-get install gcc make perl
。 - 安装
.run
文件bash *.run
。
按照这个方法安装后
- 将您的用户放入在 VirtualBox 安装中已创建的 vboxusers 组中
usermod -aG vboxusers $USER
- 在 /etc/default 中创建 virtualbox 文件,内容如下:
VBOXWEB_USER="{YOUR_USER}"
- 重启服务器
- 检查 vboxwebsrv 是否正在运行
ps aux | grep vboxwebsrv
完毕。