四时宝库

程序员的知识宝库

Vagrant + VirtualBox 虚拟机组合迁移手册

开源虚拟机 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"

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接