安装virtualBox

进入 VirtualBox 的主页https://www.virtualbox.org/,点击大大的下载按钮,进入下载页面。根据自己的情况选择对应的版本下载。

注意,除了主程序,还要把对应的扩展包程序也一并下载了。有些高级特性,比如 USB 3.0 等需要扩展包的支持。
image.png
在安装完主程序后,直接双击扩展包文件即可安装扩展包。

配置 VirtualBox
启动 VirtualBox 后,通过菜单 管理 -> 全局设定,在全局设定对话框中,修改默认虚拟电脑位置,指定一个容量较大的磁盘。
image.png

安装 Vagrant

在 Vagant 网站https://www.vagrantup.com/下载最新的版本,根据自己的操作系统选择对应的版本下载即可。
注意,Vagrant 是没有图形界面的,所以安装完成后也没有桌面快捷方式。version 检查是否安装成功:

  1. $ vagrant version
  2. Installed Version: 2.2.18
  3. Latest Version: 2.2.18
  4. You're running an up-to-date version of Vagrant!

配置 Vagrant
新建环境变量 VAGRANT_HOME 用于保存虚拟机镜像文件(box),默认为C:\Users\用户名.vagrant.d 。
修改为空间充足的磁盘,如 D:\vm.vagrant.d
image.png

安装虚拟机

下载虚机镜像
Vagrant 创建虚机需要指定一个镜像(box),可以从下面网站的下载:

以上镜像文件一般都是.box后缀文件。

添加 box到vagrant
box在这里可以理解为虚机的模板,虚机是box的实例,类似java中类与对象的关系。

  1. $ vagrant box add /d/Downloads/CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box --name centos7
  2. ==> box: Box file was not detected as metadata. Adding it directly...
  3. ==> box: Adding box 'centos7' (v0) for provider:
  4. box: Unpacking necessary files from: file:///D:/Downloads/CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box
  5. box:
  6. ==> box: Successfully added box 'centos7' (v0) for 'virtualbox'!
  7. # 其中 --name 选项指定这个box的名字
  8. # 查看是否添加成功:
  9. $ vagrant box list
  10. centos7 (virtualbox, 0)
  11. # 添加成功后会在 $VAGRANT_HOME 目录生成一些文件,box文件放到了boxes目录
  12. # 其中centos7为上面 --name 指定的名字
  13. $ find /d/vm/.vagrant.d/boxes
  14. /d/vm/.vagrant.d/boxes
  15. /d/vm/.vagrant.d/boxes/centos7
  16. /d/vm/.vagrant.d/boxes/centos7/0
  17. /d/vm/.vagrant.d/boxes/centos7/0/virtualbox
  18. /d/vm/.vagrant.d/boxes/centos7/0/virtualbox/box.ovf
  19. /d/vm/.vagrant.d/boxes/centos7/0/virtualbox/centos-7-1-1.x86_64.vmdk
  20. /d/vm/.vagrant.d/boxes/centos7/0/virtualbox/metadata.json
  21. /d/vm/.vagrant.d/boxes/centos7/0/virtualbox/Vagrantfile

Vagrant 基本操作

创建虚拟机

$ cd /d/vm
$ mkdir c7test
$ cd c7test

# 其中centos7是我们前面指定的box的名字
$ vagrant init centos7
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.

# 查看当前目录下生成了Vagrantfile文件
$ ls
Vagrantfile
  • Vagrantfile是很重要的文件,后文再详细介绍。
  • vagrant 一般一次管理一组虚机,c7test可以认为是管理这组虚机的工程名字。
  • 这个工程我们只创建一台虚机,后面再介绍创建多个虚机,比如用于hadoop部署。

我们先备份原来的Vagrantfile:mv Vagrantfile Vagrantfile.sample。这个文件可以用于后续配置参考。
使用下面的文件:

Vagrant.configure("2") do |config|
  config.vm.box = "centos7"
  config.vm.hostname = "c7test"
  config.vm.network "private_network", ip: "192.168.56.10"
  # 配置cpu核数与内存大小(MB)
  config.vm.provider "virtualbox" do |vb|
    vb.cpus = 1
    vb.memory = 1024
    # 这个为VirtutalBox管理器中显示的名字,非hostname
    vb.name = "c7test1"
  end
end

不修改配置文件虚机也是可以直接启动的,只是会分配一个难看的虚机名。

启动虚拟机

# 注意: 在Vagrantfile所在目录执行
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos7'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: c7test1
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
    default:
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Rsyncing folder: /cygdrive/d/vm/c7test/ => /vagrant

在VirtualBox管理器中可以看到这个新启动的的虚拟机。
image.png

登录虚拟机

  • 直接登录

按“显示”进入终端(见上图显示按钮),输入默认用户名密码都为vagrant。
登录之后如果鼠标被独占,可以根据右下角提示按钮进行切换,一般有右边的ctrl键。
需要 root 权限的命令可以通过在命令前添加 sudo 来执行,也可以执行 sudo -i 直接切换到 root 用户。

  • vagrant ssh 登录

这是默认的privite key方式登录,用户名是vagrant,不需要输入密码。

# 注意: 在Vagrantfile所在目录执行
$ vagrant ssh
Last login: Thu Nov  4 00:47:16 2021 from 10.0.2.2
[vagrant@localhost ~]$

需要 root 权限的命令可以通过在命令前添加 sudo 来执行,也可以执行 sudo -i 直接切换到 root 用户。
vagrant用户无法用密码方式登录,如果需要用密码方式登录需要额外配置。

root用户登录

先用vagrant ssh登录虚机,sudo -i切换到root用户,再修改 /etc/ssh/sshd_config 文件:

$ vi /etc/ssh/sshd_config
# 去掉这一行前面的#注释
PermitRootLogin yes
# 将no改为yes
PasswordAuthentication yes

passwd设置root密码,连续输入两次一样的密码。
最后记得service sshd restart
这样就可以通过Xshell或SecurityCRT用root用户进行登录了

修改主机名

主机名对虚机非常重要,多台虚机通过主机名进行识别:
vi Vagrantfile 在 config.vm.box 后面增加 config.vm.hostname 配置

config.vm.box = "centos7"
# 这里修改主机名
config.vm.hostname = "vm01"

然后执行vagrant reload进行重启,会发现主机名变了。

其他常用命令

# 注意: 在Vagrantfile所在目录执行
vagrant status  查看虚机状态
vagrant halt    停止虚机
vagrant suspend 暂停虚机
vagrant resume  恢复虚机,从暂停状态恢复
vagrant reload  重载虚机,即重载Vagrantfile中配置信息
vagrant destroy 删除虚机,包括虚机文件

Vagrantfile

注意,Vagrantfile 文件名是固定的写法,大小写也要完全一样,修改了就不认识了。
刨除注释,这个文件的实际生效内容实际只有 3 行:

Vagrant.configure("2") do |config|
  config.vm.box = "centos7"
end

这是一个 Ruby 语法的文件,因为 Vagrant 就是用 Ruby 编写的。
需要详细了解可以看里面的注释,这里介绍常用部分。
config.vm.box 对应虚机镜像,也就是 box 文件。

网络配置

配置端口转发

这个功能不常用也不实用,一般用下面的私有网络方式。为避免端口冲突可以修改转发规则:
设置-网络-高级-端口转发-删除端口转发
image.png

配置私有网络

私有网络实际上对应的是 VirtualBox 的主机网络,也就是 Host-Only 网络。
该网络可以保证宿主机与虚机,以及虚机之间相互通信,但外部无法访问虚机,这对于开发已经够用。
先查看VirtualBox已有主机网络:管理->主机网络管理器…
image.png
一般默认的网络是: 192.168.56.1/24。
image.png
可以根据需要修改或创建,我们直接使用这个网络即可。
在文件中增加配置config.vm.network "private_network", ip: "192.168.56.10"

Vagrant.configure("2") do |config|
  config.vm.box = "centos7"
  config.vm.network "private_network", ip: "192.168.56.10"
end

也可以用DHCP,但并不推荐:config.vm.network "private_network", type: "dhcp"

配置公共网络

公共网络通常对用网桥网络,可以是虚机与宿主机处于同一个网络之下,虚机与宿主机是平等的关系。
这样会导致虚机暴露在公共网络上,这样对于开发既不安全,也没有必要。
如果需要配置可以参考 官方文档

更改虚机规格

VirtualBox 、Vmware、Hyper-V、Docker等虚拟机软件在 Vagrant 中被称为 Provider,虚机的规格等配置是和 Provider 相关的。因为 VirtualBox 用的最多,所以默认的配置提示是以 VirtualBox 举例。
如果想要了解其它 Provider 的配置,请参考 文档
配置主机名、cpu核数与内存大小(MB)

Vagrant.configure("2") do |config|
  config.vm.box = "centos7"
  config.vm.hostname = "c7base"
  config.vm.network "private_network", ip: "192.168.56.10"
  # 配置cpu核数与内存大小(MB)
  config.vm.provider "virtualbox" do |vb|
    vb.cpus = 1
    vb.memory = 1024
    # 这个为VirtutalBox管理器中显示的名字,非hostname
    vb.name = "c7base"
  end
end

Provision 开机启动任务

Provision 是指在虚机初次创建的时候,Vagrant 自动去执行的构造任务,比如安装软件,更新系统配置等。
具体参考Vagrantfile文件中 config.vm.provision 注释部分,要注意的是什么情况下会出发provision操作:

  • 某个环境初次执行 vagrant up 的时候
  • 执行 vagrant provision 命令
  • 重启的时候 vagrant reload —provision,带上 —provision 选项

除了上面这些默认提示给出的配置项,Vagrantfile 还支持其它很多配置,具体请 查看文档

其他配置

文件同步

  • 命令行方式

如果不想进行复杂的配置,使用scp或git命令进行文件拷贝与同步即可。
几个常用命令:

tar -czf file.tgz /path/to/dir/or/file #文件打包压缩命令
tar -xzf file.tgz                      #文件解压命令
# 192.168.56.10 为虚机地址,根据情况进行修改
scp file.tgz root@192.168.56.10:/path/of/vm/  #从宿主机上传到虚机
scp root@192.168.56.10:/path/of/vm/file.tgz . #从虚机下载到宿主机
  • 自带同步方式

虚机启动使有一个文件同步的提示:

==> default: Rsyncing folder: /cygdrive/d/vm/centos7a/ => /vagrant

表示文件会从宿主机 /cygdrive/d/vm/centos7a/ 目录同步到虚机的 /vagrant 目录。
注意,该同步是单向的,只对新建文件进行同步,修改后的文件不会同步,需要vagrant reload之后才会进行同步。这个可以通过安装增强功能解决这个问题,需要安装Guest Addition。

  • Guest Addition

Geust Addition支持双向同步。
需要先关闭虚机 vagrant halt,打开设置添加虚拟光驱:
存储 - 添加虚拟光驱 - 选择iso文件,没有的话可以从这里下载,一般默认都有:
wget https://download.virtualbox.org/virtualbox/6.1.28/VBoxGuestAdditions_6.1.28.iso
image.png
通过VirtualBox直接启动虚拟机,登录后执行:

sudo yum update -y
sudo yum install -y gcc kernel-devel
reboot

这里将内核更新到最新版本,否则无法安装。如果你的开发环境需要特定的内核版本,你也可以根据情况安装指定的版本,只要保证内核版本和头文件版本完全匹配

安装Guest Addition

sudo mkdir -p /mnt/cdrom
sudo mount /dev/cdrom /mnt/cdrom
cd /mnt/cdrom
sudo ./VBoxLinuxAdditions.run
reboot

此时 Vagrantfile 所在目录与虚机的 /vagrant 目录已经是双向同步了。
也可以在Vagrantfile中配置同步别的同步目录:
config.vm.synced_folder "../data", "/vagrant_data"
../data 为宿主机目录, /vagrant_data 为虚机目录。
注意,如果不是用vagrant命令方式启动、重启虚拟机,可能会导致目录没法同步。

制作基础镜像

将上面好不容易安装的文件同步固定下来,制作基础镜像。
基础镜像尽量保持紧凑,不要安装太多软件,方便将来制作其它特定镜像。
清理磁盘:登录虚机,执行

yum clean all
du /swapfile   # 查看是否有占用
swapoff -a     # 关闭 SWAP
rm -f /swapfile
vim /etc/fstab
# 注释掉下面的行
#/swapfile none swap defaults 0 0

交换分区一般关掉即可,因为一方面如果没有RAID盘,SWAP的故障率会更高,另一方面有些软件直接就不支持,比如flink。free -m检查交换分区是否关闭。如果要打开参考下面的步骤:

# 重新开启swap分区
dd if=/dev/zero of=/swapfile bs=1G count=2
mkswap -f /swapfile
chmod 0600 /swapfile
swapon -a

vim /etc/fstab
# 取消掉下面的行注释
#/swapfile none swap defaults 0 0

打包:宿主机上执行(在虚机Vagrantfile所在目录)

$ vagrant package
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: D:/vm/cluster007/package.box

生成默认文件名为 package.box, 将其添加到vagrant中

$ vagrant box add package.box --name c7/base
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'c7/base' (v0) for provider:
    box: Unpacking necessary files from: file://D:/vm/cluster007/package.box
    box:
==> box: Successfully added box 'c7/base0' (v0) for 'virtualbox'!

添加完之后应将package.box删除,否则下次打包时文件大小会翻倍,因为这个是vagrant默认的同步目录。
之后就可以用vagrant init c7/base创建虚机实例了。