开源虚拟机 virtulbox大家都很熟悉,是一个跟VMWare 齐名的开源虚拟机,可以运行Windows/Linux/Mac OSX,而vagrant进行类似docker的管理,只需要通过命令行工具的配置文件就能快速创建和管理虚拟机。导入仿真虚拟机需要安装上述两个工具。两个工具均是开源软件。
为什么不直接操作 virtualBox 或VMWare来安装虚拟机呢?那是因为这一些工具往往需要操作图形界面手工安装,当你要快速安装某个指定版本的服务器,甚至是集群服务器,就需要使用vagrant这样的命令行工具了,它能以一种统一ruby配置脚本方案,快速安装虚拟机VirtualBox 和VMWare虚拟机。
因此安装vagrant是虚拟服务器集群或者开发服务器有力工具,只需要一个文本配置文件vagrant,就能快速安装一个ubuntu系统。
这里介绍是如何把一个在运行的虚拟服务器,如何正确迁移到别的机器的完整步骤,以及各种问题的解决,
一. 导出准备工作
理论上你是可以直接拷贝VirtualBox的虚拟机文件vmdk去另一台机器的,但这样有很多问题。
首先vmdk没有压缩尺寸较大,在不同操作系统中导入需要手工配置大量工作,并且因为环境差异很容易会造成启动失败,因此这里强烈建立导出box来进行备份和迁移工作。
box是Vargrant 提供一个虚拟机映像文件格式。
在导出ubuntu格式的box前,需要做如下几项准备
1.1 增加ssh 密码登录功能
因为缺省登录只能用密钥登录,一但更换了机器将导致 ssh 或vagrant ssh 都登录不上去,所以得提前把密码登录打开
在虚拟机打开sshd配置文件
vim /etc/ssh/sshd_config
把默认的禁止密码登录解除
PasswordAuthentication no
改为
PasswordAuthentication yes
此时用ssh登录会提示登录方式由 publickey 变成 publickey,password
重启服务
sudo service sshd restart
1.2 关闭串口输出文件
缺省情况下,vagrant的虚拟机将打开默认串口1,并将串口输出到一个日志文件当中,
这个日志路径如果在另外一台机器上不存在就造成启动失败。
Stderr: VBoxManage.exe: error: RawFile#0 failed to create the raw output file /home/sguav/vagrant/ubuntu-bionic-18.04-cloudimg-console.log (VERR_PATH_NOT_FOUND)
二. 导出映像
导出前,先要关机
vagrant halt
使用子命令package 进行
vagrant packet --base <虚拟机名字> --output <导出box文件>
虚拟机名字可以从virualbox 管理界面上,相应虚拟机的属性的名字拷贝出来
如下就是一条成功执行指令
vagrant package --base vagrant6_default_1691737564417_37014 --output ubuntu20.04-fly-sim-v01.box
以下是执行指令过程
C:\vm\vagrant6> vagrant package --base vagrant6_default_1691737564417_37014 --output ubuntu20.04-fly-sim-v02.box
==> vagrant6_default_1691737564417_37014: Clearing any previously set forwarded ports...
==> vagrant6_default_1691737564417_37014: Exporting VM...
==> vagrant6_default_1691737564417_37014: Compressing package to: C:/vm/vagrant6/ubuntu20.04-fly-sim-v02.box
三.导入虚拟机
3.0 删除老的映像和虚拟机
如果在之前已经导入虚拟机,可以用如下指令删除
删除相应映像
vagrant box remove simvm
删除虚拟机文件
vagrant destory
3.1 新增映像
首先把box文件导入vargrant的映像库。
vagrant box add <映像名字> <导入的box文件>
vagrant box add simvm mavros+gazebo+px4+apm-v5.box
box add 表示增加一个映像库
simvm 表示这个映像库的名字,你可以任意取名。
mavros+gazebo+px4+apm-v4.box 就是导入的映像文件,可以带全路径,比如 d:\box\my.box
D:\vm> vagrant box add simvm mavros+gazebo+px4+apm-v3.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'simvm' (v0) for provider:
box: Unpacking necessary files from: file://D:/vm/mavros+gazebo+px4+apm-v3.box
box:
The box you're attempting to add already exists. Remove it before
adding it again or add it with the `--force` flag.
Name: simvm
Provider: virtualbox
Version: 0
导入成功后用box list查看是否导入成功
vagrant box list
可以看到simvm已经导入
D:\vm> vagrant box list
simvm (virtualbox, 0)
3.2 创建虚拟机
这里我指定是d:\vm\vagrant 为我的vagrant目录,在这个目录下执行
vagrant init simvm
这句表示用simvm 映像文件创建一个虚拟机,
simvm是你导入的映像名,如果不是这个名字可以修改。
> vagrant init simvm
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
3.3 导入配置文件
这里我指定是d:\vm\vagrant 为我的vagrant目录.首先把提供仿真虚拟机配置文件Vagrantfile,覆盖原来同名文件
这个文件可能需要修改,是创建映像名字,找到如下行,把名字改你的导入映像的名字
config.vm.box = "simvm"
3.4 激活和启动虚拟机
第一次运会激活把vb的虚拟机文件创建,以后相当启动虚拟机
vagrant up
注意虚拟机是采用桥接模式与其它机器通讯,在启动时,如果你的机器上有多块网卡,需要手动输入数字选择用哪一个网卡进行桥接.
比如下例中,显示有4块网卡,这里输入1选择wifi网卡进行桥接。
==> default: Available bridged network interfaces:
1) wlp0s20f3
2) eno1
3) docker0
4) mpqemubr0
==> default: When choosing an interface, it is usually the one that is
==> default: being used to connect to the internet.
==> default:
default: Which interface should the network bridge to? 1
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
default: Adapter 2: bridged
成功启动在在virtualbox控制台能看到这台机器
四.导入问题的解决
4.1 串口文件无法打开
这在之前提过,要提前关闭串口输出文件,否则提示:
Stderr: VBoxManage.exe: error: RawFile#0 failed to create the raw output file /home/sguav/vagrant/ubuntu-bionic-18.04-cloudimg-console.log (VERR_PATH_NOT_FOUND)
如果导出前没有关闭,一种补救的方式是在Vagrantfile 当中加入如下语句
注意这段要写在 config.vm.provider "virtualbox" do |vb| 的范围之中,表示强制关闭串口1
config.vm.provider "virtualbox" do |vb|
vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]
end
4.2 ssh授权失败
在虚拟机启动时,会大量提示授权失败,这是因为换机器后,机器的密钥匙发生变化导致登录失败
default: SSH auth method: private key
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
此时如果在导出前修改的登录方式,可以密码登录启动虚拟机
在Vagrantfile的增加全局配置,采用密码登录方式,不过登录后尽快删除改成密钥登录方式
config.ssh.username = "vagrant"
config.ssh.password = "vagrant"