centos7:安装配置 virtualbox 增强功能 VBoxGuestAdditions,并实现物理机脚本控制虚拟机

需求来源

本地virtualbox 上有四台互联虚拟机,由于物理机是台笔记本,网络可能会发生变化
而且,由于某些原因,虚拟机需要设置成静态ip
所以,当网络发生变化时,我需要适应性的修改虚拟机的网卡中的ip(IPADDR)和路由(GATEWAY)的配置
鉴于手动修改太过于繁琐,所以想实现本地物理机脚本控制虚拟机,主要面临情况以及需要实现的功能如下:
(1)虚拟机可能已经无法联网,无法被ssh 登陆
(2)需要修改的配置可能不止一两个,很多配置 需要执行 shell 脚本 或者修改 配置 文件
(3)实现从物理机控制虚拟机,不管是通过VBoxManage 还是 python 或者是 golang 控制等
(4)主要实现,包括关机状态下自动开启虚拟机,执行shell 脚本或者bash 命令(脚本或者命令是在虚拟机中执行),最关键的是一定要能执行 bash 命令

物理环境

物理机:MAC OS X
virtualbox:版本 5.2.16
虚拟机:centos 7(四台全是)

安装准备

VBoxGuestAdditions镜像:下载地址 http://download.virtualbox.org/virtualbox/5.2.16/

后边的版本号可以修改,最好是跟virtualbox版本对应上。不过我用的小版本号不太一样,也没出啥问题
国内下载会很慢,国内镜像版本也不太齐全
好多人都是去外网下载之后放到csdn下载之后,让别人用积分才能下载,也是醉了,明明就是开源工具
最好科学上网一下

安装步骤

Step1 在存储里添加 VBoxGuestAdditions 的iso,如下图

centos7:安装配置 virtualbox 增强功能 VBoxGuestAdditions,并实现物理机脚本控制虚拟机_第1张图片

Step2 安装并配置 VBoxGuestAdditions

# 开机之后进行操作
# mount 刚刚加入的 iso 到 /mnt 下,执行以下命令
mkdir /mnt/vbox
mount /dev/sr0 /mnt/vbox

# 安装 依赖
yum update -y
yum install -y kernel-devel kernel-headers
yum install -y gcc make perl

# 执行安装脚本
cd /mnt/vbox
ls -l

# 其中有很多脚本,有windows 上用的,也有Linux 上用的

centos7:安装配置 virtualbox 增强功能 VBoxGuestAdditions,并实现物理机脚本控制虚拟机_第2张图片

# 执行Linux 上的安装脚本, 下图是成功的标志
./VBoxLinuxAdditions.run

centos7:安装配置 virtualbox 增强功能 VBoxGuestAdditions,并实现物理机脚本控制虚拟机_第3张图片


# 有可能成功,也有可能会因为缺少其他依赖失败,如我遇到的是缺少 bzip2
# 如果是缺少依赖,继续把依赖装上,重新执行上述安装脚本即可
# 如果是成功,原来的虚拟机窗口,会变大一号

# 重启
reboot

网上有很多人说,安装成功之后,还会有两个标志:

(1)执行 df 命令时,会出现一个带有 vbox 字样的共享目录,但是很奇怪我的虚拟机里没有,但是我的目的不是为了使用共享目录,所以没有深究。我猜测是不是因为我使用的虚拟机共用一块虚拟盘,当然没有确实的根据
(2)执行 cat /etc/group | grep box,打印结果中有 vboxsf 的用户组。但我认为即使打印了这个用户组并不代表 VBoxLinuxAdditions.run 执行安装就成功了。原因是,当我在其中某一台虚拟机,在缺少gcc 依赖的时候,执行脚本安装的时候,依然有用户组vboxsf,但是实际上,通过VBoxManage 操作的时候并没有成功,返回错误依旧是VBoxManage: error: The guest execution service is not ready (yet),我认为此时安装根本没有成功

综上,确认安装成功的特征是,虚拟机窗口变大

确认安装成功的检验标准是,在物理机上执行一个VBoxManage 命令,操纵下虚拟机,看是否返回结果
VBoxManage 命令行 API 介绍地址:https://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm

# 提供一个命令,在mac 上执行的,用于检验上述安装是否成功。在windows 上执行也有,可以去 上面的 链接里找,这里不赘述
# 解释一下这个命令的所做的事情以及需要的条件
# 需要的条件:虚拟机开机状态下才能执行(可以不用登入),VBoxManage 有一个开启虚拟机的命令,可以在上面 的链接里找一下
# 所做的事情:连接名称为 bg03 的虚拟机,其用户名 --username 为 root ,其密码 --password 为root,ls 目录 /user 
VBoxManage --nologo guestcontrol "bg03" run --exe "/bin/ls" --username root --password root --wait-stdout -- -l /usr

# 如果上述成功,则打印 /usr 目录下的文件以及目录。如同真的在虚拟机里执行  ls /usr 命令执行的结果一摸一样
# 如果不成功,返回的错误是 VBoxManage: error: The guest execution service is not ready (yet) ,说明上述安装 没有成功

附录,关于 virtualbox-python

解释一下,为什么要附录这一部分
一开始,当我意识到我需要一个自动化脚本,从物理机直接控制虚拟机脚本的时候,我首先想到的不是 VBoxManage ,因为在此之前操作虚拟机我都是鼠标键盘操作,从未通过命令行控制virtualBox,更不用说是虚拟机。
所以,最早我想到的是用 python 脚本打开虚拟机、并加入连接,最后进行操纵。
当时,我最早使用的就是 virtualbox-python 这个python 的第三方的模块,在 github 上可以搜到,安装(在mac上有点复杂)以及使用就不赘述。之后加上我用python写的代码链接。
当我使用 virtualbox-python 实现了虚拟机开机、以及关机之后,怎么都无法实现在虚拟机中执行一个脚本,其中执行虚拟机脚本的大致代码如下:

guestSession = session.console.guest.create_session('root', 'root')
try:
	# print guestSession.state
	# Do something
	proc, stdout, stderr = guestSession.execute('/bin/ls', arguments=['/usr'])
	print stdout
except Exception, err:
	print err
finally:
	# Close the machine
	session.console.power_down()

这段代码是在 python 2.7(mac os 自带的python 版本)上运行的,代码的意思是通过 create_session 创建一个session 连接 , 然后使用连接 执行一个命令 ls /usr ,打印结果 stdout。最后关闭虚拟机。
当时,这段操作的返回结果一直都如下所示。当时找了很多资料,包括stackoverflow、github 、google 等,都没有很好的解决方法,很多帖子都石沉大海。

0x80bb0005 (The guest execution service is not ready (yet))

这个输出和没有安装 VBoxGuestAdditions 之前,直接执行 VBoxManage 命令操作虚拟机命令的返回结果其实非常相似。
其实,原因就是因为需要安装 VBoxGuestAdditions 。但是很奇怪的是 virtualbox-python 的作者,没有提及 必须要安装 VBoxGuestAdditions ,是不是大佬思维都太跳了。
由此,说明 virtualbox-python 是基于 VBoxGuestAdditions 实现的,除此之外,它还依赖于vboxapi(这个没有找到太多资料,确实有这么一说),在 Mac 自带python 的库里有。

你可能感兴趣的:(OS,bigdata)