Ubuntu
Tomcat 無法執行 VBoxManage: NS_ERROR_FAILURE (0x80004005)
今天我看到了一個與此類似的問題: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 服務單元存在這種特定限制。乾杯!