通过Web来管理VirtualBox

phpvirtualbox是一个基于Web的VirtualBox前端,用PHP编写,它允许您访问和控制远程VirtualBox实例。
尽可能地尽可能地使VirtualBox GUI类似,使其尽可能简单。如果您在服务器中运行VirtualBox(如教程中的VBoxHeadless - 在Ubuntu 16.04 LTS服务器上运行VirtualBox 5.1运行虚拟机),则可以非常适合VirtualBox GUI 。
本教程介绍如何在Ubuntu 16.04服务器上安装phpVirtualBox来管理本地安装的VirtualBox。
大家都知道VMware是一个强大的虚拟管理系统,作为麻雀的VitrualBox也不赖。使用VitrualBox都知道,VitrualBox无法在后台运行,始终在任务栏。其实VitrualBox可以在后台运行,使用VRDP就可以在后台运行了。但这个我们不研究他在后台运行,我们研究他管理功能,深度挖潜他的功能。




作为PHPer 能不能通过Web方式管理VitrualBox,有人就会说 噢,这是多么大的工程。对,是一个大工程! Web管理虚拟机。说做就做!


第一步,下载并安装VirtualBox




这不是废话嘛,如果你是高手那就请跳过此步。 VirtualBox的下载地址:https://www.virtualbox.org/wiki/Downloads
安装virtualbox




cd /usr/local/src
wget http://download.virtualbox.org/virtualbox/5.0.34/virtualbox-5.0_5.0.34-113845~Ubuntu~xenial_amd64.deb
dpkg -i virtualbox-5.0_5.0.34-113845-Ubuntu-xenial_amd64.deb




第二步,下载phpvirtualbox,下载地址: https://sourceforge.net/projects/phpvirtualbox/或者http://code.google.com/p/phpvirtualbox/downloads/list 下载时请选择对应的版本


我的phpvirtualbox安装包:phpvirtualbox-5.0-5.zip


第三步,安装nginx 和 PHP 


ubuntu16.04 源码编译 nginx1.10.3
1. 官方下载地址
下载对应的 nginx 版本并解压
cd /usr/local/src
wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar zxvf nginx-1.10.3.tar.gz
2. 安装依赖包以及所需模块
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev
3. 编译安装
cd nginx-1.10.3
./configure --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_gzip_static_module
make && make install
4. 修改 nginx.conf 配置文件
user  root;    
worker_processes auto;
pid        /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 65535;
events
{
  use epoll;
  worker_connections 65535;
}
http
{
        include       mime.types;
        default_type  application/octet-stream;
        charset  utf-8;
        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 8m;
        sendfile on;
        tcp_nopush     on;
        keepalive_timeout 600;
        tcp_nodelay on;




        open_file_cache                 max=10000 inactive=5m;
        open_file_cache_valid           2m;
        open_file_cache_min_uses        1;
        open_file_cache_errors          on;




#下载线程控制
#       error_page 404 403 502 503 http://ggr.yxdown.com/redirect/youxihe.url?ip=$wanip\$document_uri;
#       limit_req_zone $binary_remote_addr zone=one:3m rate=1r/s;
#       limit_req_zone $binary_remote_addr $uri zone=two:3m rate=1r/s;
#       limit_req_zone $binary_remote_addr $request_uri zone=three:3m rate=1r/s;
#       limit_conn_zone $binary_remote_addr zone=limit_conn_one:10m;
        include /usr/local/nginx/conf/proxy.conf;
        include /usr/local/nginx/conf/gzip.conf;
        include /usr/local/nginx/conf/vhost/*.conf;
        }
5. 新建配置文件和虚拟目录
vim /usr/local/nginx/conf/proxy.conf
proxy_redirect off;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
#proxy_temp_path /dev/shm/proxy_temp_path;
#proxy_cache_path /dev/shm/proxy_cache_path levels=1:2 keys_zone=cache_one:100m inactive=30s max_size=300g;
proxy_connect_timeout 600;
proxy_read_timeout    600;
proxy_send_timeout    600;
#proxy_cache_lock on;
#proxy_cache_lock_timeout 300s;
proxy_buffer_size     32k;
proxy_buffers         4 128k;
proxy_busy_buffers_size  256k;
proxy_temp_file_write_size  512k;
proxy_set_header Host $host;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;




vim /usr/local/nginx/conf/gzip.conf
gzip  on;
gzip_proxied any;
gzip_types text/css;
gzip_types text/csv;
gzip_types text/plain;
gzip_types text/javascript;
gzip_types application/javascript;
gzip_types application/json;
gzip_types application/x-javascript;
gzip_types application/ecmascript;
gzip_types application/xml;
gzip_types application/xml+rss;
gzip_types application/rss+xml;
gzip_types application/atom_xml;
gzip_types application/xhtml+xml;
gzip_types application/x-font-ttf;
gzip_types application/x-font-opentype;
gzip_types application/vnd.ms-fontobject;
gzip_types image/svg+xml;
gzip_types image/x-icon;
gzip_types text/xml;
gzip_comp_level 3;
gzip_http_version 1.1;
gzip_vary on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_buffers 16 8k;
gzip_min_length 20;




mkdir -p /usr/local/nginx/conf/vhost




ubuntu16.04 源码编译php5.5
添加依赖应用




apt-get -y install gcc libxml2-dev libssl-dev libbz2-dev libcurl4-openssl-dev libgdchart-gd2-noxpm-dev libgmp-dev libmcrypt-dev libreadline-dev libxslt-dev make




其中有两个坑:
Openssl库文件安装后不存在:
ln -s /usr/lib/x86_64-linux-gnu/libssl.so  /usr/lib
Gmp库文件安装后不存在:
ln -s /usr/include/x86_64-linux-gnu/gmp.h  /usr/include
这样个都是因为x86与x64所安装时库文件位置不一致所导致




编译PHP
cd /usr/local
tar xf  php-5.5.38.tar.gz
cd /usr/local/php-5.5.38/
./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm   --with-fpm-user=php-fpm  --with-fpm-group=php-fpm   \
--with-mysqli=mysqlnd  --with-libxml-dir  --with-gd   \
--with-jpeg-dir   --with-png-dir   --with-freetype-dir  \
--with-iconv-dir   --with-zlib-dir   --with-mcrypt   \
--enable-soap   --enable-gd-native-ttf   --enable-ftp  \
--enable-mbstring  --enable-exif    --disable-ipv6     \
--with-curl --enable-bcmath --enable-sockets --with-gd




make 




make test
make install




cd /usr/local/php-5.5.38




为php提供配置文件:
# cp php.ini-production /etc/php.ini








为php-fpm提供Sysv init脚本,并将其添加至服务列表:
#cp sapi/fpm/init.d.php-fpm  /etc/init.d/php-fpm
 chmod +x /etc/init.d/php-fpm
 chkconfig --add php-fpm
 chkconfig php-fpm on








为php-fpm提供配置文件:
cp /usr/local/php-5.5.38/sapi/fpm/php-fpm.conf.in /usr/local/php/etc/php-fpm.conf 








编辑php-fpm的配置文件:
# vim /usr/local/php/etc/php-fpm.conf
配置fpm的相关选项为你所需要的值,并启用pid文件(如下最后一行):
pm.max_children = 150
pm.start_servers = 8
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pid = /usr/local/php/var/run/php-fpm.pid 








接下来就可以启动php-fpm了:
 service php-fpm start








使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):
# ps aux | grep php-fpm




php-fpm  -t   #### 检查下php-fpm配置是否有错误
[09-Feb-2017 20:38:22] NOTICE: configuration file /etc/php-fpm.conf test is successful




启动php-fpm




service php-fpm start




使用如下命令来验正(如果此命令输出有中几个php-fpm进程就说明启动成功了):
#  ps aux | grep php-fpm
root      1368  0.0  0.1 196428  5188 ?        Ss   20:23   0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nginx     1369  0.0  0.1 198512  4716 ?        S    20:23   0:00 php-fpm: pool www
nginx     1370  0.0  0.1 198512  4716 ?        S    20:23   0:00 php-fpm: pool www
nginx     1371  0.0  0.1 198512  4716 ?        S    20:23   0:00 php-fpm: pool www
nginx     1372  0.0  0.1 198512  4716 ?        S    20:23   0:00 php-fpm: pool www
nginx     1373  0.0  0.1 198512  4716 ?        S    20:23   0:00 php-fpm: pool www
nginx     1374  0.0  0.1 198512  4716 ?        S    20:23   0:00 php-fpm: pool www
nginx     1375  0.0  0.1 198512  4716 ?        S    20:23   0:00 php-fpm: pool www
nginx     1376  0.0  0.1 198512  4716 ?        S    20:23   0:00 php-fpm: pool www
root      1602  0.0  0.0 112660   964 pts/0    S+   20:44   0:00 grep --color=auto php-fpm
















整合nginx和php5








1、编辑/etc/nginx/nginx.conf,启用如下选项:




 if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php$1 last;
        }
      
        location ~ .*\.php(\/.*)*$
        {




           set $path_info "";
           set $real_script_name $fastcgi_script_name;
           if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
                    set $real_script_name $1;
                    set $path_info $2;
            }
            fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
            fastcgi_param SCRIPT_NAME $real_script_name;
            fastcgi_param PATH_INFO $path_info;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
           }




并在所支持的主页面格式中添加php格式的主页,类似如下:
location / {
            root   html;
            index  index.php index.html index.htm;
        }
        
而后重新载入nginx的配置文件:
# service nginx reload








3、在/usr/html新建index.php的测试页面,测试php是否能正常工作:
# cat > /usr/local/nginx/html/index.php << EOF
phpinfo();
?>
接着就可以通过浏览器访问此测试页面了。




安装xcache,为php加速:








1、安装
tar xf xcache-3.2.0.tar.gz
cd xcache-3.2.0
/usr/local/php/bin/phpize
./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
make && make install








安装结束时,会出现类似如下行:
Installing shared extensions:     /usr/local/php-5.5.38/lib/php/extensions/no-debug-non-zts




2、编辑php.ini,整合php和xcache:








首先将xcache提供的样例配置导入php.ini
mkdir /etc/php.d
cp xcache.ini /etc/php.d








说明:xcache.ini文件在xcache的源码目录中。








接下来编辑/etc/php.d/xcache.ini,找到zend_extension开头的行,修改为如下行:




extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/xcache.so




注意:如果php.ini文件中有多条zend_extension指令行,要确保此新增的行排在第一位。








3、重新启动php-fpm
# service php-fpm restart




/etc/init.d/nginx start
查看php-fpm端口




netstat -lntup | grep php-fpm
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      2458/php-fpm: mast
php结合nginx




编辑/etc/nginx/nginx.conf




vim etc/nginx/nginx.conf修改后的范例如下:




    server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        root html;
        index  index.php index.html index.htm;
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php$1 last;
        }
      
        location ~ .*\.php(\/.*)*$
        {




           set $path_info "";
           set $real_script_name $fastcgi_script_name;
           if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
                    set $real_script_name $1;
                    set $path_info $2;
            }
            fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
            fastcgi_param SCRIPT_NAME $real_script_name;
            fastcgi_param PATH_INFO $path_info;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
           }
配置网站默认页




vim /etc/nginx/html/index.php 








phpinfo();
?>
检查nginx配置




nginx -t








nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重载nginx




nginx -s reload
6.nginx 启动脚本
cat /etc/init.d/nginx
#!/bin/sh
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $network $remote_fs $local_fs 
# Required-Stop:     $network $remote_fs $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Stop/start nginx
### END INIT INFO




# Author: Sergey Budnevitch




PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC=nginx
NAME=nginx
nginxDIR=/usr/local/nginx
CONFFILE=$nginxDIR/conf/nginx.conf
DAEMON=$nginxDIR/sbin/nginx
PIDFILE=$nginxDIR/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME




[ -x $DAEMON ] || exit 0




[ -r /etc/default/$NAME ] && . /etc/default/$NAME




DAEMON_ARGS=" $DAEMON_ARGS"




. /lib/init/vars.sh




. /lib/lsb/init-functions




do_start()
{
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --         $DAEMON_ARGS
    RETVAL="$?"
    return "$RETVAL"
}




do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    rm -f $PIDFILE
    return "$RETVAL"
}




do_reload() {
    #
    start-stop-daemon --stop --signal HUP --quiet --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    return "$RETVAL"
}




do_configtest() {
    if [ "$#" -ne 0 ]; then
        case "$1" in
            -q)
                FLAG=$1
                ;;
            *)
                ;;
        esac
        shift
    fi
    $DAEMON -t $FLAG
    RETVAL="$?"
    return $RETVAL
}




do_upgrade() {
    OLDBINPIDFILE=$PIDFILE.oldbin




    do_configtest -q || return 6
    start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    sleep 1
    if [ -f $OLDBINPIDFILE -a -f $PIDFILE ]; then
        start-stop-daemon --stop --signal QUIT --quiet --pidfile $OLDBINPIDFILE --name $NAME
        RETVAL="$?"
    else
        echo $"Upgrade failed!"
        RETVAL=1
        return $RETVAL
    fi
}




case "$1" in
    start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
        do_start
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
    stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
        ;;
  configtest)
        do_configtest
        ;;
  upgrade)
        do_upgrade
        ;;
  reload|force-reload)
        log_daemon_msg "Reloading $DESC" "$NAME"
        do_reload
        log_end_msg $?
        ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_configtest -q || exit $RETVAL
        do_stop
        case "$?" in
            0|1)
                do_start
                case "$?" in
                    0) log_end_msg 0 ;;
                    1) log_end_msg 1 ;; # Old process is still running
                    *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
            *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
    *)
        echo "Usage: $SCRIPTNAME startstop|status|restart|reload|force-reload|upgrade|configtest" >&2
        exit 3
        ;;
esac




exit $RETVAL




第三步,安装phpvirtualbox 。 解压phpvirtualbox 到 Web网站目录。
unzip phpvirtualbox-5.0-5.zip
mv phpvirtualbox-5.0-5 /usr/local/nginx/html/phpvirtualbox




vim /usr/local/nginx/conf/vhost/vbox.conf
server




{
    listen 80;
    server_name localhost;
    index index.html index.htm index.php;
    root /usr/local/nginx/html/phpvirtualbox;




    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/phpvirtualbox$fastcgi_script_name;
    }
}




第四步,将config.php-example 重命名为 config.php
cp /usr/local/nginx/html/phpvirtualbox/config.php-example /usr/local/nginx/html/phpvirtualbox/config.php




首先,创建一个名为vbox的系统用户,并将其添加到vboxusers组中:
groupadd vboxusers
useradd -m vbox -G vboxusers




创建vbox用户的密码:
passwd vbox




假设你设置的密码为vbox
创建文件/ etc / default / virtualbox并将其中的VBOXWEB_USER = vbox放在其中(以便使用称为vboxwebsrv的VirtualBox SOAP API 作为用户vbox运行):
nano / etc / default / virtualbox




VBOXWEB_USER = vbox
接下来创建vboxwebsrv的系统启动链接并启动它:
systemctl enable vboxweb-service
systemctl start vboxweb-service
 
打开config.php 




var $username = 'vbox';
var $password = 'vobx';
$language='en' 更改为 $language='zh_CN' 
其余保持默认。若你不想使用系统用户名及验证,请将var $noAuth = true 打开




配置Phpvirtualbox截图
第五步 安装phpVirtualBox




VBoxWebSrv








然后你打开 Web网站就可以看到管理页面了,帐号和密码初始都是 admin 






VirtualBox虚拟机消失的解决方法




问题出现:今天早晨机房断电后,发现使用很久的WinXP虚拟机没有了。


        1. Ubuntu安装的软件都会在/usr/share/applications文件夹下面生成快捷方式;


        2. 我注意到以前安装VBox用某种方式更改了其快捷方式的属性,使得每次点击启动器里的VBox图标都是以root权限打开应用程序,现在却是直接打开,是普通用户权限,会不会与这个有关系?


        3. 现在尝试更改VBox快捷方式的属性,要使得其以root权限执行,可以在图标上右键->基本->命令,此栏上最前加上“gksudo ”(无引号),即可以赋予其root权限;


        4. 但是我进Ubuntu系统就是普通用户,不具有超级用户权限,无法直接对除了本用户目录以外的其他路径下的文件及其属性进行修改,因此我即使操作了步骤3,重新查看属性会发现没有任何更改;


        5. 想到Ubuntu下的所谓快捷方式(此称呼也是参考Windows的)也是一种软链接文件,可以用文本编辑器对其进行编辑;于是我先在终端下执行命令“sudo gedit ”,然后再通过Gedit打开/usr/share/applications/virtualbox.desktop,找到“Exec=VirtualBox %U”这一行,修改为“Exec=gksudo VirtualBox %U”,保存;
        6. 重新查看VBox快捷方式的属性,发现其命令那一行已经变成“Exec=gksudo VirtualBox %U”了;再次点击VBox图标,会弹出输入密码的对话框,输入root密码后,可以看到以前的WinXP虚拟机重新出现啦!


总结:这个问题其实不是一个“问题”,关键是要清楚使用哪个用户执行应用程序,在VBox中,如果是用普通用户登录,会在该用户文件夹下创建虚拟机,如果是用root用户登录,则会在root用户文件夹下创建虚拟机。因为VBox需要访问一些底层的设备,例如挂载U盘,给它较高的权限能保证其运行起来没有任何问题。






Linux VirtualBox启用VRDE远程桌面扩展  




请参考推荐阅读,我已经大体介绍了如何在Linux Host通过命令行安装VM以及VM的OS。现在介绍一下更通用的办法,即启用VRDE远程桌面服务。这样,我们就通过windows或者Linux上的远程桌面客户端,去链接VM了。




1.下载和安装VRDE扩展
VRDE扩展,需要单独从virtualbox官网:https://www.virtualbox.org下载,即下载这个页面上的Oracle VM VirtualBox Extension Pack
安装 
wget http://download.virtualbox.org/virtualbox/5.0.34/Oracle_VM_VirtualBox_Extension_Pack-5.0.34-113845.vbox-extpack
vboxmanage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.0.34-113845.vbox-extpack




2.配置vm启用vrde
vboxmanage modifyvm zabbix_server --vrde on  #启用 zabbix_server虚拟机上的vrde
vboxmanage modifyvm zabbix_server --vrdeport 8889  #绑定到的host端口上




3.启动VM并连接
 VBoxHeadless --startvm zabbix_server  --vrde=on   #启动虚拟机时,打开vrde扩展。
之后,在其他的机器上,可以通过Windows或者Linux的远程桌面,链接 x.y.z.w:8889上的远程桌面服务,其中x.y.z.w是Host的IP地址。




注意:
这里的配置,没有启用vrde的验证,所以安全性会存在问题,推荐在内网使用。

你可能感兴趣的:(VirtualBox)