背景
在使用vagrant虚拟机管理工具时,发现使用vagrant确实好用。只需要配置简单的一些东西,就能够实现PHP开发环境的所有东西,以及一些好用功能,比如静态IP设置、目录映射关系。
于是在这种巨大效益之下, 开始研究其实现的基本原理。
了解虚拟机网卡信息
首先了解下NAT网络、host-only网络、bridge网络的基本原理。
- NAT网络地址转换
即虚拟机本身不作为一台真正的电脑出现,而是通过宿主机连接公网。这种网络连接方式是虚拟机默认的网络连接方式,其网络地址一般是10.0.2.15。
注意:
宿主机不能通过ping 10.0.0.15
的方式连接虚拟机。不过可以使用网络端口转发的方式实现ping
通虚拟机,在 虚拟机的NAT模式下如何访问虚拟机服务器 这篇文章中笔者做了说明,这里不再赘述。
- Bridge网络桥接
虚拟机作为一台有独立身份的电脑出现,拥有独立的IP地址,虚拟机通过该IP连接网络。宿主机能够通过该地址与虚拟机建立连接。
注意:
宿主机能够访问该IP的同时,在同一网络的其它用户也可以通过该IP访问虚拟机。这个IP也有规定,必须在当前网段。具体配置信息笔者在 Ubuntu下静态IP设置 这篇文章中讲解到了,不再赘述。 - host-only模式
host-only模式与前两者区分开来,其能够被宿主机访问,不能够被其他网络访问,可以说是私有的网络,其IP是设置也有具体的规定,一会我们在详述。
注意:
这种方式是不能连接公网的,同时IP的设置也比较麻烦。
特别提醒:
当设置以上三种网络时,需要首先将虚拟机设置为网络连接方式。如下图:
妙用多张网卡
笔者安装了Ubuntu16.04,具体安装步骤笔者不再赘述,接下来图文分析,如何设置与vargrant相同的开发环境。
第一步 默认连接方式不做改动,连接外网的保证
第二步 开启第二块网卡,配置host-only模式,使其能够配置静态IP
当开启之后,宿主机会默认开启一个虚拟网卡,如下图所示:
注意:
这个虚拟机的IP我们需要记住,因为我们随后要用到:
第三步 在虚拟机中配置第二块网卡
当使用ifocnfig
时,发现第二块网卡没生效,竟然没有IP地址:
显然,在开启之前我们已经配置好了,但是没出现是咋回事?
列位看官,不要惊慌,因为 HOST-ONLY 的第二块网卡,我们没进行任何配置,所以我们需要自己进行配置,这里会使用到上述我们提到过宿主机中虚拟网卡的IP192.168.56.1
第四步 配置第二块网卡的IP地址
Ubuntu16.04将网卡名称设置成了enp0s3
,而不是之前的我们常用的eth0
了,这就很恶心了,我特么怎么知道第二块网卡名字是多少?
笔者查询了半天,依然没有查询到,于是,退而求其次,改成我们熟悉的eth0
,请看下面详细步骤。
- 修改相关的配置文件
sudo vim /etc/default/grub
- 找到GRUB_CMDLINE_LINUX=”” ,将其修改为如下格式:
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
- 更新配置信息
sudo grub-mkconfig -o /boot/grub/grub.cfg
- 重启电脑
sudo reboot
-
卧槽,怎么连第一块网卡都没了?
看官休怒,因为咱们还没配置相关网卡的信息,说明还在沿用之前的网卡信息。那就需要我们进行相关配置信息修改。
打开网卡配置文件
sudo vim /etc/network/interfaces
将其修改如下:
source /etc/network/interfaces.d/*
auto lo
# 第一块网卡, 使用NAT
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
# 第二块网卡,使用HOST-ONLY
auto eth1
iface eth1 inet static
address 192.168.56.2
netmask 255.255.255.0
与宿主机的第二块网卡IP地址保持一致
- 重启网络
/etc/init.d/networking restart
配置宿主机与虚拟机的目录映射
第一步 安装VirtualBox的增强工具包(必须)
第二步 设置共享目录
第三步 虚拟机中挂载目录
sudo su
midir -p /data/www
cd /mnt/
mkdir cdrom
mount /dev/cdrom /mnt/cdrom
cd cdrom
./VBoxLinuxAdditions.run
mount -t vboxsf www /data/www/
www目录是上一步中我们配置的共享目录,/data/www目录是我们在虚拟机中建立的目录
错误1:
Failed to set up service vboxadd
查看错误日志:
vboxadd.sh: failed: Look at /var/log/vboxadd-install.log to find out what went wrong.
vboxadd.sh: failed: Please check that you have gcc, make, the header files for your Linux kernel and possibly perl installed.
显然,这是Linux缺少了一点东西,gcc、make、kernel-package、kernel-common、perl
等,那我们就行依次的安装。
错误1解决:
安装确实的依赖信息,执行如下命令
apt-get install gcc make kernel-package kernel-common perl
又报错了,如下所示:
wbl@ubuntu:~$ sudo apt-get install gcc make linux-kernel perl
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
不知道是哪里在占用dkpg命令,这里不知道咋回事,可能是安装时报错然后被占用了吧,那么简单粗暴,使用reboot
重启。
经过漫长的等待,终于下载好了。那么接下来我们重新执行上面的命令,看看直接成功,还是会报其它的错误。
又报了其他错误,如下图所示,不过最后显示skipping
跳过,可能这个错误不是致命错误。
在摸索中继续尝试,使用最后一条命令,将宿主机目录映射到虚拟机目录。
mount -t vboxsf www /data/www
成了!!!
错误2:
注意,当重启之后,挂载的目录需要进行重新设置。但vagrant不需要,那么就去寻找其原因。
笔者找到了通过/etc/rc.local
设置自动挂载的方法。但在重启时,自动挂载命令会显示无法执行,如图所示。
这个就纳闷了,然后查了N多资料,始终没解决,但笔者又找到了自动挂载另一种解决方案。
错误2解决:
当点击自动加载时,会自动创建一个共享文件夹,如sf_www
,。
无法改变其权限,那么就给当前用户加入vboxsf属组,命令如下:
# 可以为当前用户和`www-data`服务器默认用户加入此用户组。
sudo usermod -aG vboxsf <your username>
总结
学习,让你更有自信!!!