虚拟机安装 CentOS 6.5 版本可以参考 这个文章。
虚拟机创建、CentOS7 系统默认安装
- 首先去 阿里云镜像,选择 CentOS-7-x86_64-DVD-2009.iso 下载。
- 后面会使用默认的分区,高级分区等自定义安装请参考 这篇文章
新建虚拟机:
设置内存大小,根据你自己的硬件资源设置
创建虚拟硬盘
选择虚拟硬盘类型
动态分配
设置位置和大小
设置 -> 存储 选择刚刚下载的 iso 镜像
启动虚拟机
选择第一个:Install CentOS 7
屏幕太小的话,可以在 VirtualBox 顶部选择 视图 -> 自动缩放模式,可以将屏幕放大一点(但是放大之后,鼠标点击有问题,所以看你自己了)。
选择语言,我这里直接选择默认的 English 了
点击 Continue 后进入下一页,设置时区
设置 Asia/Shanghai,然后点击左上角的 Done 按钮完成设置
配置磁盘分区
这里使用最简单的默认自动分区模式,点击它进入后,直接点击左上角 Done 按钮完成设置即可
然后点击右下角的 Begin Installation 按钮开始安装
在这个界面可以设置 root 用户密码
我这里设置为 root
然后等待完成,之后选择右下角的 Reboot 按钮重启
完成之后,可以移除下虚拟光盘上的 ISO 镜像。
网络设置
关于网络 Win10 上和 mac 上还不太一样,win 10 可以参考 这篇文章去试试看
本章记录下 mac 上我选择的方式。下图的介绍感觉不准确。
我这里会将虚拟机配置多个网卡:
- 一个网卡用 Host Only 方式,让宿主机和虚拟机可以相互访问
- 一个网卡使用 NAT 让虚拟机可以 ping 宿主机
官方文档 - 最权威的
Mode | VM→Host | VM←Host | VM1↔VM2 | VM→Net/LAN | VM←Net/LAN |
---|---|---|---|---|---|
Host-only | + | + | + | – | – |
Internal | – | – | + | – | – |
Bridged | + | + | + | + | + |
NAT | + | Port forward | – | + | Port forward |
NATservice | + | Port forward | + | + | Port forward |
上面的表格很清楚了,比上面的图而且权威:
- HostOnly:虚拟机到主机可以互相联通、虚拟机到虚拟机 也可以互相联通,就是 不能访问外面的网络
- NAT:虚拟机可以访问主机、虚拟机之间不能访问、虚拟机可以访问外面的网络
Virtual Box 网络设置
查看 Virtual BOX 的 NAT 网络设置
默认会生成一个 NatNetwork,如果没有的话,可以右侧 + 号自己创建一个。
查看 Virtual Box 的 Host Only 网络设置
同上,如果没有则自己创建一个。
然后虚拟机设置上面的两个网络:网卡 1 选择 Nat 网络
网卡 2 选择 Host-Only 网络
Centos7 网络设置
重启虚拟机后,使用 root/root 登录到系统
# 编辑默认的配置文件 ifcfg-enp0s3
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
PROCY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=ad785b1f-8ef6-4dd7-9e32-8e28e10a8785
DEVICE=enp0s3
# 这里改为 yes
ONBOOT=yes
保存配置文件后,执行命令重启网络
[root@localhost ~]# service network restart
Restarting network (via systemctl): [ OK ]
# 查看当前自动分配的 IP 地址
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:28:72:98 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.5/24 brd 10.0.2.255 scope global noprefixroute dynamic enp0s3
valid_lft 573sec preferred_lft 573sec
inet6 fe80::951d:2d98:f6cc:8233/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:0c:1e:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.107/24 brd 192.168.56.255 scope global noprefixroute dynamic enp0s8
valid_lft 311sec preferred_lft 311sec
inet6 fe80::ca47:e473:1010:66db/64 scope link noprefixroute
valid_lft forever preferred_lft forever
enp0s3:是网卡 1 的 Nat 配置,可以让虚拟机上网
# 可以 ping 下 百度,能看到网络是通的了
[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=52 time=17.1 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=2 ttl=52 time=17.5 ms
enp0s8:是 Host Only 模式:可以让宿主机和虚拟机互通。我们可以通过 sh 软件链接到 192.168.56.107 这个地址,就能链接上虚拟机了
CentOS7 静态 IP
你可以看下 enp0s8 对应的配置文件是否存在,我这里是不存在的,所以需要复制一份,然后修改 ```bash
进入配置目录
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
复制一份配置文件为 ifcfg-enp0s8
[root@localhost network-scripts]# cp ifcfg-enp0s3 ifcfg-enp0s8
然后编辑它
[root@localhost network-scripts]# vi ifcfg-enp0s8
TYPE=Ethernet PROCY_METHOD=none BROWSER_ONLY=no
改为 yes
BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy
改为 enp0s8
NAME=enp0s8
UUID 改为和上面的不一致方式,也可以使用 uuidgen 方式生成一个新的
UUID=ad785b1f-8ef6-4dd7-9e32-8e28e10a8786 DEVICE=enp0s8 ONBOOT=yes
然后添加固定的 ip 地址、子网掩码、网关
IPADDR=192.168.56.107 NATMASK=255.255.255.0 GATEWAY=192.168.56.1
最后重启网络配置
[root@localhost network-scripts]# service network restart Restarting network (via systemctl): [ OK ]
然后可以查看网络信息
[root@localhost network-scripts]# ip addr
1: lo:
已经变成静态的了
3: enp0s8:
尝试 ping 外网,也没有问题
[root@localhost network-scripts]# ping www.baidu.com PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data. 64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=52 time=16.8 ms 64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=2 ttl=52 time=17.0 ms
然后 ping 宿主机,也没有问题
[root@localhost network-scripts]# ping 192.168.3.162 PING 192.168.3.162 (192.168.3.162) 56(84) bytes of data. 64 bytes from 192.168.3.162: icmp_seq=1 ttl=63 time=0.561 ms 64 bytes from 192.168.3.162: icmp_seq=2 ttl=63 time=0.781 ms
<a name="tJQ2f"></a>
## HostOnly 主机网络管理设置后主机 ping 不通网关
<a name="yOjof"></a>
### 问题描述
![image.png](https://cdn.nlark.com/yuque/0/2022/png/651749/1655535785486-d602af11-6c4b-45d4-b06e-e5761c64c10d.png#clientId=u9d9b1707-3509-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=518&id=u545ae037&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1036&originWidth=1568&originalType=binary&ratio=1&rotation=0&showTitle=false&size=248843&status=done&style=none&taskId=u69b19b76-1e62-4802-ba12-8967ce33ee4&title=&width=784)<br />上面有两个主机网络:
- 192.168.56.1:但是这个你在宿主机上使用 ping 命令 ping 不通,也就无法与虚拟机通信
- 10.141.141.1:这个能,这是为什么?
> 这里说下为什么问题描述里面会出现一个正常的 vboxnet1 和一个异常的 vboxnet0:我在选择虚拟机关机的时候,导致 VirtualBox 卡死了,只能暴力的重启了电脑,之后就发现连接不上和 ping 不通 vboxnet0 上的虚拟机和网关了。百度了很久,没有想到办法。 灵机一动,发现前两天使用了一个 用 vagrant 部署 VirtualBox 的项目环境 [mesosphere/playa-mesos](https://github.com/mesosphere/playa-mesos) ,这个项目给我很深的映像就是,执行 vagrant up 之后,就自动部署好了一台虚拟机,并且使用 vagrant ssh 就能直接连上,既然能连上说明网络没有问题,而且它的方案和我上面的一样,使用 hostonly 和 nat 两张网卡。
> 在 vboxnet0 异常的情况下,我部署了它,发现它可以正常访问虚拟机。这就出现了一个正常的 vboxnet1 和一个异常的 vboxnet0
下面看网卡信息,发现这两个信息不一致
```bash
mrcode@mrcode playa-mesos % ifconfig
vboxnet1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:01
inet 10.141.141.1 netmask 0xffffff00 broadcast 10.141.141.255
vboxnet0: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:00
再看路由表信息发现根本就没有 192.168.56.1 这个路由信息
mrcode@mrcode playa-mesos % netstat -r
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default 192.168.3.1 UGScg en0
10.141.141/24 link#18 UC vboxnet1 !
10.141.141.1 a:0:27:0:0:1 UHLWIi lo0
10.141.141.10 link#18 UHLWIi vboxnet1 !
问题解决
上面就定位到是创建虚拟网卡的时候虚拟网卡信息不对导致的问题(其实在得出这个结论之前,我百度了很多资料,总的思路是看着路由表里面没有该 IP 的路由信息,想着如何手动添加这个信息,搞了几个小时后无果,最后重新清理思路的时候发现好像在网卡里面就没有 IP 信息)
:::tips
然后去官方文档查看描述,下图红框中这一句话让我一开始没有想到需要特殊处理这个 IP 地址范围
:::
当我走投无路的时候,我想着既然 vboxnet1 是正常的,我直接将它的 IP 改成 192.168.56.1 就行了,结果出现了下面这个错误
这个时候我才想到,文档上面写的是 192.168.56.0/21
但是我们截图上面是 192.168.56.1/24
,新版本已经加限制了?(v6.1.34)
抱着试一试的态度,/etc/vbox/networks.conf
文件中将 192.168.56.1/24
添加到文件中,再次保存,发现可以保存成功了
# 10.141.141.0/21 这一行是之前部署 mesosphere/playa-mesos 的时候,它的文档让加上的
mrcode@mrcode ~ % sudo vim /etc/vbox/networks.conf
* 10.141.141.0/21
* 192.168.56.1/24
而且 ifconfig 里面能看到网卡的 IP 地址了
mrcode@mrcode ~ % ifconfig
vboxnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:00
inet 192.168.56.1 netmask 0xffffff00 broadcast 192.168.56.255
vboxnet1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
ether 0a:00:27:00:00:01
inet 10.141.141.1 netmask 0xffffff00 broadcast 10.141.141.255
# 再来看路由信息
mrcode@mrcode ~ % netstat -r
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default 192.168.3.1 UGScg en0
10.141.141/24 link#18 UC vboxnet1 !
127 localhost UCS lo0
localhost localhost UH lo0
169.254 link#5 UCS en0 !
192.168.3 link#5 UCS en0 !
192.168.3.1/32 link#5 UCS en0 !
192.168.3.1 98:d:51:38:f4:51 UHLWIir en0 1198
192.168.3.136 68:ab:bc:2e:1:45 UHLWI en0 963
192.168.3.162/32 link#5 UCS en0 !
192.168.3.180 ec:4d:3e:6b:53:86 UHLWI en0 1169
192.168.3.187 c6:8b:c4:46:e0:17 UHLWIi en0 1100
192.168.56 link#17 UC vboxnet0 !
# 现在肯定能 ping 通了
mrcode@mrcode ~ % ping 192.168.56.1
PING 192.168.56.1 (192.168.56.1): 56 data bytes
64 bytes from 192.168.56.1: icmp_seq=0 ttl=64 time=0.092 ms
64 bytes from 192.168.56.1: icmp_seq=1 ttl=64 time=0.059 ms
提示:
- /etc/vbox/networks.conf 文件如果不存在需要自己创建
- 里面写 192.168.56.1/24 或则 192.168.56.0/21 都有效
- 自从 192.168.56.1 更改成功之后,后面发现这个功能又正常了,写 192.168.57.1 也可以,也不用在 networks.conf 文件中提前配置
虚拟机复制
快速的复制刚才弄好的虚拟机,可以得到多台服务器,只需要做少量的修改。
关闭虚拟机后,右键,然后选择复制
配置基础信息
选择完全复制
复制完成后,启动该虚拟机,就可以通过 sh 软件链接了(IP 地址是复制之前的哪一台,所以可以使用之前的 IP 链接)。链接上之后,可以修改他们的 IP 地址为其他的,否则所有机器启动的话就会出现问题了
# ifcfg-enp0s3 是 NAT 自动获取的 IP,所以不用修改,只需要修改 HOST Only 的 ifcfg-enp0s8 就行了
vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
TYPE=Ethernet
PROCY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s8
UUID=ad785b1f-8ef6-4dd7-9e32-8e28e10a8786
DEVICE=enp0s8
ONBOOT=yes
# 只需要更改这个 IP 地址就可以了
IPADDR=192.168.56.108
NATMASK=255.255.255.0
GATEWAY=192.168.56.1
重启网络
# 重启网络
[root@localhost ~]# service network restart
# 之后就用 sh 软件链接 192.168.56.108 了
# 链接之后,将两台服务器都启动起来,然后在 108 上 ping 107 ,可以看到虚拟机之间能正常互通
[root@localhost ~]# ping 192.168.56.107
PING 192.168.56.107 (192.168.56.107) 56(84) bytes of data.
64 bytes from 192.168.56.107: icmp_seq=1 ttl=64 time=1.01 ms