Ubuntu

Tomcat 無法執行 VBoxManage: NS_ERROR_FAILURE (0x80004005)

  • April 11, 2021

今天我看到了一個與此類似的問題:VBoxManage: won’t start virtuals machines NS_ERROR_FAILURE (0x80004005)但我可以在這裡描述一個完全不同的莫名其妙的上下文。

在基於 Ubuntu 20.04 的發行版中,我能夠從普通使用者發出以下命令:

$ whoami
my-user-name
$ VBoxManage startvm --type headless my.app-name

但我無法從 Java 執行相同的命令,特別是 Tomcat9,來自同一個使用者:

ProcessBuilder pb = new ProcessBuilder("bash", "-c", "whoami"); // my-user-name
Process p = pb.start();

ProcessBuilder pb = new ProcessBuilder("bash", "-c", "VBoxManage ...");
Process p = pb.start();

在最後一種情況下,我得到了這個錯誤:

VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component MachineWrap, interface IMachine

請注意,我還能夠從緊急tty控制台或任何其他非互動式 shell 成功發出該命令,但不能從 Tomcat 程序執行的 Java 發出。

Internet上的每個人都只是建議重新安裝VirtualBox,但這對於這種情況來說是一個完全不相關的解決方案(也是因為我多次嘗試重新安裝Tomcat或VirtualHost而沒有更改任何內容)。他們也建議採用--type headless,但我已經這樣做了。

任何故障排除提示?

好了朋友們。後:

  • 重新安裝Tomcat
  • 重新安裝 VirtualBox(兩次)
  • 將核心更新為奇怪的不穩定版本
  • 刷新更新的 BIOS

簡而言之。在幾乎摧毀了我的 GNU/Linux 發行版之後,我似乎受到了systemd限制。

檢查我的預設 systemd Tomcat 服務:

sudo systemctl cat tomcat9.service
#
# Systemd unit file for Apache Tomcat
#


...

# Security
User=my-user-name
Group=my-user-name
PrivateTmp=yes
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true

...

我記錄了自己所有涉及的設置,特別NoNewPrivileges是我發現:1

如果為 true,則確保服務程序及其所有子程序永遠無法通過 execve() 獲得新權限(例如,通過 setuid 或 setgid 位,或文件系統功能)。這是確保程序及其子程序永遠無法再次提升權限的最簡單、最有效的方法。

所以嘗試禁用該配置(我已經評論過):

sudo systemctl edit --full tomcat9.service
...

# NoNewPrivileges=true

...

然後重啟Tomcat:

sudo systemctl restart tomcat9.service

一切都會再次好起來的。


我希望這將有助於其他人避免數小時的故障排除,因為發行版採用的預設 systemd 服務單元存在這種特定限制。乾杯!

引用自:https://unix.stackexchange.com/questions/644149