使用VirtualBox+Vageant快速安装虚拟机上的Linux

一、安装VirtualBox虚拟机

https://www.virtualbox.org/

1、我本次安装的是VirtualBox6.0:

https://www.virtualbox.org/wiki/Download_Old_Builds_6_1

image.png

注意是安装Windows版;

2、安装时,必须要先开启CPU的虚拟化:

如果不开启,虚拟机将无法虚拟出64位的系统;开启虚拟化之后,虚拟机性能也会变好!

开机狂按Enter键进入BIOS(各个电脑不一样,有些是F2或FN+F2),然后按下面截图操作保存:

1665278177648315.png

1665278216472082.png

3、现在就可以愉快滴安装VirtualBox了。


二、使用VirtualBox安装虚拟机

传统方式:在网上下载操作系统的景象iso文件,然后新建虚拟电脑–>选择镜像,一步一步完成

这里我们就不讲了;

使用Vagrant快速安装linux虚拟系统

1、下载安装Vagrant

https://www.vagrantup.com/downloads

image.png

安装过程很简单,直接双击安装即可,安装完成后,重启电脑!

但是建议不要安装在C盘,会很占用C盘空间!

安装完成后使用cmd执行:vagrant,显示如下:

image.png

能认识vagrant命令,说明,我们的vagrant就已经安装成功了!

2、使用vagrant快速地初始化一个linux虚拟机:

使用命令:  vagrant init centos/7 

其中centos/7是我们vagrant官方镜像仓库中的镜像名字:

https://app.vagrantup.com/boxes/search

image.png

此up操作,会在我们当前目录下,生成一个Vagrantfile文件,此过程,很像docker的操作!

3、再使用 vagrant up 操作,即可,下载系统镜像,并启动:

完成到以下步骤,说明linux虚拟机已经安装成功了:

image.png

4、此时由于通过VirtualBox我们看到了虚拟机正在运行中,就可以使用Ctrl + C结束cmd窗口了;

使用 vagrant ssh 可以连上当前vagrantFile所在的目录对应的虚拟机,并且使用的账号为 vagrant,密码也是 vagrant 

到这里,使用vagrant安装centos的工作就已经完成了!

可以使用exit退出vagrant ssh连接;

以后启动此linux,只需要在vagrantFile所在目录,执行 vagrant up 即可


三、虚拟机网络设置(重要)

1、使用vagrant创建的linux虚拟机,默认使用的网络连接方式为 网络地址转换(NAT)+端口转发 的方式;

这种方式,对于我们以后的开发很不方便!!!

因为端口转发,每一次在虚拟机安装一个软件,都需要在VirtualBox中设置 虚拟机和宿主机的映射 ,可以直接类比为docker的端口映射;

以后再linux上每装一个软件,都需要添加一个端口映射,简直是太不友好了!!!

因此,我们希望能直接给虚拟机一个固定的ip地址,这样,外部直接通过此ip地址 + port端口,即可直接访问内部的软件了。

2、给虚拟机分配固定ip

很简单,在vagrantFile设置一下即可:

config.vm.network "private_network", ip: "192.168.56.10"

这里的IP参考的是我们主机使用virtualBox网卡的ip:

image.png

显然,我们设置的虚拟机ip段,需要与宿主机的ip为一个号段;

3、使用 vagrant reload 命令,即可重启虚拟机

image.png

4、重启完虚拟机后,我们vagrant ssh连接虚拟机,使用 ip addr 查看当前虚拟机的网络配置:

image.png

显然,固定ip已经配置好了;

5、一定要记得,使用虚拟机和宿主机相互ping一下,看看是否都畅通?

image.png

exit推出ssh窗口,使用主机ping一下虚拟机:

image.png

一切ok!虚拟机可以正常使用了;


四、总结:工作中如何同时创建多台虚拟机(实战)

1、安装virtualbox(不要安装在C盘):

https://www.virtualbox.org/wiki/Download_Old_Builds_6_1

2、安装vagrant(不要安装在C盘):

https://www.vagrantup.com/downloads

3、因为Vagrant有时候下载比较慢,我们将镜像下载到本地,然后装在到boxlist

vagrant官方的镜像仓库位置:

https://app.vagrantup.com/boxes/search

如果觉得每次下载镜像很慢,可以将镜像下载到本地:

https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/

vagrant box add my-centos7 ./box/CentOS7.VirtualBox.box

image.png

4、新建一个空白目录,初始化Vagrant,生成Vagrantfile文件:

vagrant init my-centos7

不要使用大文件夹下的根目录,因为会要将当前文件夹挂载到vagrant内,如果当前文件夹下有很多文件,挂在会非常满,然后就一直停留在这个地方:

image.png

导致后面的虚拟机无法被创建!!!

踩过的坑!!!

5、修改Vagrantfile文件,以创建多台虚拟机为例:

# -*- mode: ruby -*-
# vi: set ft=ruby :
 
servers = {
    :mycentos1 => '192.168.56.10',
    :mycentos2 => '192.168.56.11',
    :mycentos3 => '192.168.56.12'
}
 
Vagrant.configure("2") do |config|
  # config.vm.box = "centos/7" 使用官方仓库
  config.vm.box = "my-centos7"
  config.vm.box_check_update = false
 
  servers.each do |server_name, server_ip|
      config.vm.define server_name do |server_config|
          server_config.vm.hostname = "#{server_name.to_s}"
          server_config.vm.network :private_network, ip: server_ip
          server_config.vm.provider "virtualbox" do |vb|
              vb.name = server_name.to_s
              vb.memory = "1024"
              vb.cpus = 1
         end
      end
  end
end

6、根据Vagrantfile启动虚拟机

第一台:

image.png

第二台:

image.png

第三台:

image.png

当三台虚拟机全部创建完成后,我们就可以在Virtualbox的界面中查看到了!

image.png

7、如果我们修改过Vagrantfile中的配置,可以重启服务:

vagrant reload

8、如果我们想连接指定的服务,可以使用:

vagrant ssh mycentos1

进入使用:

 ip addr

查看每台机器的IP。

9、双向ping一下宿主机和虚拟机之后的网络是否畅通:

image.png


五、如何使用Xshell从外部连接Vagrant创建的虚拟机?

其实是可以连的,只不过Vagrant默认是将外部密码登录的方式关闭的,而使用Vagrant ssh方式的时候,Vagrant程序会自己找到需要用到的认证文件,从而不通过账号密码的方式登录!

但是我们通常还是比较喜欢使用root账号密码通过Xshell连接,所以需要多做几步配置!

1、ssh进入对应的虚拟机:

vagrant ssh mycentos1

2、为root账号设置密码:

[vagrant@mycentos1 ~]$ sudo passwd
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

3、开启Root账号登录和外部密码登录权限:

[root@mycentos1 vagrant]# vi /etc/ssh/sshd_config

将其中的两处设为yes,去去除掉前面的#号注释:

PermitRootLogin yes  #Root允许账号登录
PasswordAuthentication yes  #允许外部使用账号密码登录

之后,重启sshd服务:

[root@mycentos1 vagrant]# systemctl restart sshd

之后就可以使用对应的ip:22 root password登录啦!

4、最后,退出Vagrant的命令是:

exit

六、如何解决Vagrant默认eth0网卡ip相同问题

1、查看网卡(可以发现eth0的ip都是10.0.2.15):

[root@hadoop102 logs]# ip route show
default via 10.0.2.2 dev eth0 proto dhcp metric 100 
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100 
192.168.56.0/24 dev eth1 proto kernel scope link src 192.168.56.102 metric 101

当我们在部署k8s或者其他需要自动注册的服务时(如注册到zookeeper),获取到的就是eth0,而多台服务的eth0是相同的!

出现以上问题的主要原因,就是eth0默认使用网络地址转换(NAT)方式:使用相同的IP,通过不同的端口转发来实现网络通信。(eth1网卡使用的仅主机(Host-Only)模式,供外部连接使用)

2、解决办法:改变eth0的网络连接方式

比如使用NAT网络来代替默认的网络地址转换(NAT),具体步骤如下:

(1)先将三台虚拟机都关闭。然后在管理–>全局设定–>网络,添加新NAT网络。

1676967658690036.png

(2)然后,为每个虚拟机设置网络连接方式为NAT网络。同时,更新MAC地址产生新的mac地址,防止三台虚拟机mac地址重复。

1676967869933701.png

(3)当三台虚拟机都设置完后,重启服务器连接上,再次使用ip route show查看网卡

[root@hadoop102 ~]# ip route show
default via 10.0.2.1 dev eth0 proto dhcp metric 100 
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100 
192.168.56.0/24 dev eth1 proto kernel scope link src 192.168.56.102 metric 101 

[root@hadoop103 ~]# ip route show
default via 10.0.2.1 dev eth0 proto dhcp metric 100 
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.4 metric 100 
192.168.56.0/24 dev eth1 proto kernel scope link src 192.168.56.103 metric 101 

[root@hadoop104 ~]# ip route show
default via 10.0.2.1 dev eth0 proto dhcp metric 100 
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.5 metric 100 
192.168.56.0/24 dev eth1 proto kernel scope link src 192.168.56.104 metric 101

可以看到eth0已经变得不再相同了!

我们再ping百度看看外网访问是否正常:

[root@hadoop104 ~]# ping www.baidu.com
PING www.a.shifen.com (180.101.50.242) 56(84) bytes of data.
64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=1 ttl=48 time=21.4 ms
64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=2 ttl=48 time=64.1 ms
64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=3 ttl=48 time=26.4 ms

一切正常!

jiguiquan@163.com

文章作者信息...

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐