一、安装VirtualBox虚拟机
1、我本次安装的是VirtualBox6.0:
https://www.virtualbox.org/wiki/Download_Old_Builds_6_1
注意是安装Windows版;
2、安装时,必须要先开启CPU的虚拟化:
如果不开启,虚拟机将无法虚拟出64位的系统;开启虚拟化之后,虚拟机性能也会变好!
开机狂按Enter键进入BIOS(各个电脑不一样,有些是F2或FN+F2),然后按下面截图操作保存:
3、现在就可以愉快滴安装VirtualBox了。
二、使用VirtualBox安装虚拟机
传统方式:在网上下载操作系统的景象iso文件,然后新建虚拟电脑–>选择镜像,一步一步完成
这里我们就不讲了;
使用Vagrant快速安装linux虚拟系统
1、下载安装Vagrant
https://www.vagrantup.com/downloads
安装过程很简单,直接双击安装即可,安装完成后,重启电脑!
但是建议不要安装在C盘,会很占用C盘空间!
安装完成后使用cmd执行:vagrant,显示如下:
能认识vagrant命令,说明,我们的vagrant就已经安装成功了!
2、使用vagrant快速地初始化一个linux虚拟机:
使用命令: vagrant init centos/7
其中centos/7是我们vagrant官方镜像仓库中的镜像名字:
https://app.vagrantup.com/boxes/search
此up操作,会在我们当前目录下,生成一个Vagrantfile文件,此过程,很像docker的操作!
3、再使用 vagrant up 操作,即可,下载系统镜像,并启动:
完成到以下步骤,说明linux虚拟机已经安装成功了:
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:
显然,我们设置的虚拟机ip段,需要与宿主机的ip为一个号段;
3、使用 vagrant reload 命令,即可重启虚拟机
4、重启完虚拟机后,我们vagrant ssh连接虚拟机,使用 ip addr 查看当前虚拟机的网络配置:
显然,固定ip已经配置好了;
5、一定要记得,使用虚拟机和宿主机相互ping一下,看看是否都畅通?
exit推出ssh窗口,使用主机ping一下虚拟机:
一切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
4、新建一个空白目录,初始化Vagrant,生成Vagrantfile文件:
vagrant init my-centos7
不要使用大文件夹下的根目录,因为会要将当前文件夹挂载到vagrant内,如果当前文件夹下有很多文件,挂在会非常满,然后就一直停留在这个地方:
导致后面的虚拟机无法被创建!!!
踩过的坑!!!
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启动虚拟机
第一台:
第二台:
第三台:
当三台虚拟机全部创建完成后,我们就可以在Virtualbox的界面中查看到了!
7、如果我们修改过Vagrantfile中的配置,可以重启服务:
vagrant reload
8、如果我们想连接指定的服务,可以使用:
vagrant ssh mycentos1
进入使用:
ip addr
查看每台机器的IP。
9、双向ping一下宿主机和虚拟机之后的网络是否畅通:
五、如何使用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网络。
(2)然后,为每个虚拟机设置网络连接方式为NAT网络。同时,更新MAC地址产生新的mac地址,防止三台虚拟机mac地址重复。
(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
一切正常!