对于 Linux 而言,它在虚拟环境下的性能会优于其他操作系统。即便你可能会犹豫是否在物理机(裸金属)上安装 Linux 系统,你仍然可以在虚拟机中安装一个性能几乎和物理机一样好的 Linux 系统。
当然,这并不意味着宿主系统为 Linux 时你就不能在虚拟机实例中安装 Linux 了。更何况,你在虚拟环境下使用 Linux 系统有许多好处。大致如下。
在虚拟环境下运行 Linux 之前的注意事项:
在虚拟环境下运行 Linux 或许并不是艰巨的任务,但仍有以下几点你需谨记。
1.虚拟机的性能取决于宿主机的性能,如果你并没有足够的系统资源分配给虚拟机,那么虚拟机的使用体验注定不会很好。某些特性仅在物理机(裸金属)上生效,包括硬件加速以及图形(显卡)驱动等。密集的磁盘 I/O 任务性能会十分受限,例如游戏测试场景。
2.用户的 Linux 虚拟机实例体验会根据你所使用的虚拟化程序而发生变化,这些虚拟化程序包括 VMware、VirtualBox、GNOME Boxes 以及 Hyper-V 。此外,你应当列出你的需求,并根据这些需求选定适当的虚拟化程序来运行你的 Linux 实例。
十条在虚拟环境中运行 Linux 的优点
尽管运行虚拟化 Linux 实例极具吸引力,你仍然应当首先考虑当前使用的宿主系统中已有的选择。例如,如果你不需要图形化桌面,或许利用 Windows 操作系统中 的 WSL 安装 Linux 就 可以满足你的需求。
一旦你确定了使用虚拟机,那么这些优点将会如影随形:
1.部署简便
与在传统物理机(裸金属)上安装 Linux 相比,在虚拟机中部署一般会容易许多。对于基于 Ubuntu 的发行版而言,像 VMware这样的虚拟化程序会提供一个 快速安装 的选项,你仅需输入用户名和密码,其余过程将自动完成而无需其他操作。你无需手动设置分区、引导程序以及更多高级设置。某些情况下,一些发行版的开发者会同时提供针对特定虚拟机的预构建镜像,只需打开就可使用。这就好像一个便携式虚拟机镜像,随时可以开箱即用。例如,在这里你将看到如何在虚拟机中安装 Arch Linux 发行版。对于其他的发行版,你或许仍需要进行一些配置,但一般都会有快速安装的选项令你可以轻松部署。
2.不会影响宿主机
对于虚拟机,你可以更为随心所欲地使用,因为虚拟机系统和宿主机系统是隔离的。很多时候,如果你并不熟悉 Linux 系统,你很可能会把配置弄得十分混乱。所以在虚拟机里,你可以随意尝试而无需担心是否会影响到宿主机系统。换句话说,任何虚拟机的操作都不会影响到宿主机,因为它们是完全隔离的。故此,虚拟机是你最好的试验场,尤其是对于一些激进或具有破坏性的试验。
3.资源可高效共享
如果你有十分充裕的系统资源,你可以使用虚拟机运行其他任务,从而充分利用起来这部分闲置的系统资源。例如,如果你需要一个十分私密的浏览环境,虚拟机将为你阻挡一切针对宿主机的追踪器。这可能略显牵强,但这仅仅是一个例子。基于这样的想法你将可以充分利用全部的系统资源。而对于双启动方案,你需要在单独的磁盘上在 Windows 之后安装 Linux,或者在 Linux 之后安装 Windows,你需要为你的任务锁定相应的资源。 但利用虚拟机,你无需锁定部分资源也可以使用 Linux ,也不必为了特定的任务而临时共享资源,这样会方便许多。
4.多任务体验更好
有了资源共享机制,多任务会前所未有的容易。在双启动的场景下,你需要来回重启切换才能使用 Linux 或 Windows 。但如果使用虚拟机,你几乎不再需要 双启动,两个系统将无缝协作并完成多任务。当然,你需要确认你拥有足够的系统资源和额外的硬件(例如双显示器)来更高效地使用。而多任务的潜力也因 Linux 虚拟机的存在而愈发强大。
5、软件测试更为便捷
有了虚拟化,你将可以创建大量的 Linux 实例,来模拟特定的使用场景,并对软件进行测试。例如,你可以在不同的 Linux 虚拟机中同步测试不同的软件版本。这有丰富的使用场景,包括对开发版软件进行测试以及 Linux 发行版的早期测试等等。
6.开发更为便捷
当你在学习编程或者刚加入一个软件项目的开发的时候,你会希望拥有一个没有任何冲突和错误的开发环境。在 Linux 虚拟机里,你可以从零开始搭建一个不会与已经存在的环境冲突的开发环境。例如,你可 以在 Ubuntu 上 安装并测试 Flutter 。 如果环境出了问题,你可以轻而易举地删掉这个虚拟机,并重新开始来修正错误。Linux 虚拟机的隔离环境是一个绝佳的开发和测试环境。
7、学习和研究的好帮手
Linux 值得反复探索。除了基础的计算任务,你可以做许多其他的事情。你可以学习如何修改你的用户界面,尝试一些常见的桌面环境 、安装大量常用软件 ,与此同时仍能让一切处于掌控之中。如果出现问题,新建一个 Linux 虚拟机就可以解决。当然,这并不仅限于日常使用需要,还可以启发系统管理员在其中测试他们所学的知识。
8、更容易复制和迁移
虚拟机可以很容易地复制和迁移。只要其它的宿主机系统支持该虚拟化程序,你就可以很容易地迁移它,而没有特别要求。不论因何原因,几次简单的点击就可以完成复制和迁移的任务。
9.尝试大量的发行版
你可以在虚拟环境下尝试数以百计的 Linux 发行版。你或许会认为这和第七条重复了,但是我相信,测试一个发行版是一个巨大的系统性工程,尤其是当你决定切换发行版做为宿主机或其他用途时。
10、便于调试
不论是严肃的开发活动还是一般的研究,在隔离的虚拟环境中调试和除错相对而言会更简单。你可以快速尝试大量的调试方法而无需考虑影响。同时,如果你的宿主机是 Linux 系统的话,无需宿主机上的 root 权限便可以访问和修改虚拟机中的配置文件。
总而言之
如果你不熟悉正在使用的系统或者依赖不同的操作系统工作,虚拟机将是协助你工作的一大利器。
Linux 虚拟机可以广泛用于开发、学习、试验或任何特定用途。
虚拟机的简单知识:
1.什么是虚拟机呢
问:什么是虚拟机呢?
答:首先你得知道什么是机器(machine),这个名词可能有多种含义,不过在我们这个系列里面,它指的是一个黑盒子。它在很多情况下指的是一台抽象的机器,有CPU、内存、外围设备和其他资源。
问:这样说,机器指的是一种硬件的集合吗?
答:取决于你怎么定义“硬件”。不过,大部分时候,机器只是一组抽象接口集合。
问:接口?
答:是的,在机器上层看来,机器不过只是接口。所谓的虚拟机,就是实现了这些接口。
问:这样看,“虚拟机”和“机器”也没有什么区别?
答:是的,“虚拟机”的“虚拟”是一个惯用词,不代表有什么特定含义,计算机领域很多词都是这样的。有很多的“虚拟机”根本就没有“真实机”,比如高级语言的虚拟机,就没有“真实机”与之对应。可以说,机器不过是虚拟机的一个实现而已。打个比方,x86的ISA规定了一系列的接口,如果你采用软件来实现这些接口,称为虚拟机。如果你采用硬件来实现这些接口,习惯上你就不叫它虚拟机,而是称为机器。
2.模拟与仿真
问:在虚拟机的领域,常听到两个词:“模拟”、“仿真”,它们有什么区别呢?
答:这个问题问得很有水平,因为很多从业者也没有弄清楚。我们从英文来讲,模拟的英文是emulation,它在虚拟机领域里面,指的是对于黑盒子外部接口的实现;而仿真的英文是simulation,它指的是对于一个事物内部细节的模仿。
问:你解释得更糊涂了,能举个例子吗?
答:糊涂就对了,概念就是从清晰到糊涂再到清晰的。我们举一个简单的例子,现在我们有一个黑盒子,它有两个开关和一个灯泡,红开关开灯、黑开关关灯。现在有个问题先问你,什么是它的接口?
问:... 我没有看到它有什么接口。
答:它的接口是“动作-反应”,“红开关-开灯、黑开关-关灯”。要想模拟这个黑盒子,那我们需要仿造类似的“动作-反应”。
问:那么什么又是仿真呢?
答:仿真是我们要去模拟这个黑盒子内部的构造,就是我们要仿真里面导线的连接方式,导线如何与开关、电源(它不是接口的一部分)、灯泡相连。
问:这个不就是如何实现黑盒子吗?
答:不不不,实现黑盒子有很多手段,未必要按照黑盒子的实现来实现黑盒子。
问:说相声呢你这?有什么具体的例子吗?
答:比如要实现1+1=2,你可以用算盘、也可以用计算器,还可以掰手指头数,这都是一种实现。如果把掰手指头作为黑盒子,那么其他都是模拟它的实现。
问:明白了。如果把算盘当成黑盒子,那么其他的方式都是算盘模拟器。
答:非但如此,就连算盘本身也是一种算盘模拟器。如果你:
按照黑盒子的实现来实现黑盒子,并对外提供接口,那么你同时进行了仿真和模拟。你这个黑盒子的实现,就既是仿真器也是模拟器。
不按照黑盒子的实现来实现黑盒子,那么你就是进行了模拟,你这个黑盒子的实现,就是一个模拟器,而不是一个仿真器。
按照黑盒子的实现来实现黑盒子,但不对外提供接口,那么你只进行了仿真。你这个黑盒子的实现,只是仿真器。
问:不过你也看不到什么东西,只实现,而不对外提供接口吧?
答:那可不一定。非洲有个国家叫利比里亚,它仿真了美国的所有政治细节,连国旗都是高仿的。但是它国家治理一塌糊涂......
问:这么聊咱们聊天还能公开嘛?再说了,你这个例子不还是说它没有完全仿真吗?
答:实际上,完全的仿真是不存在的,你这个左派幼稚病有点大。除非你就使用原件,但是那种仿真也没有意义。我们制造仿真器,就是在某些条件不允许的情况下(比如经济条件)来复刻另一个东西。不过,你说的基本正确,所以我们谈到仿真器的时候,它都是既实现接口,又实现细节的。也就是说,一个仿真器一定是一个模拟器。
问:你这话的意思是?
答:比如说我想研究一个元器件A的细节,比如它内部的两个子器件(B和C)之间如何作用。于是我用C语言实现了这个元器件,用两个类的实例来表示它的两个子器件,从而研究得以进行。
问:你这不是模拟吗?
答:从子器件的外部(也就是B和C的外部)看起来,它是一种模拟,就是对于B和C 的模拟;但是从A的外部看起来,它是对于A工作原理的仿真。在这个例子中,仿真建立在对于一堆器件的模拟,模拟依赖内部细节的仿真。仿真是一群器件的模拟,模拟是对于一个器件的仿真......
问:最后这句话听着很耳熟呀。说了大半天,清晰这两个概念有什么用呢?
答:用处很大:
可以和别人吹水。
可以清晰了解为什么有的东西叫simulator,为什么有的东西叫emulator。
可以想清楚虚拟机的核心概念:对于抽象接口的模拟
问:从上面第三点,好像虚拟机是一种模拟器。
答:没错。
虚拟机是怎样工作的
运行应用程序所需的一切都包含在虚拟机里--虚拟化的硬件,操作系统以及任何所需的二进制文件和库。因此,虚拟机具有自己独立的基础架构。
虚拟机架构图
虚拟机的劣势
虚拟机可能占用主机的大量系统资源,虚拟机的大小为数GB。在虚拟服务器上运行单个应用程序意味着还要运行Guest OS以及Guest OS运行所需的所有硬件的虚拟副本。这样很快就增加了很多RAM和CPU资源消耗。
迁移虚拟机上运行的应用程序的过程也可能很复杂,因为它始终附加在操作系统上。因此,必须同时迁移应用程序和操作系统。同样,在创建虚拟机时,系统管理程序会分配专用于VM的硬件资源。 不过与运行单独的实体服务器相比,这仍然是经济的。
容器
容器是一个不依赖于操作系统,运行应用程序的环境。它通过Linux的Namespaces和Cgroups技术对应用程序进程进行隔离和限制的,Namespace的作用是隔离,它让应用进程只能看到该Namespace内的世界;而Cgroups 的作用是限制分配给进程的宿主机资源。但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。容器只是运行在宿主机上的一种特殊的进程,多个容器之间使用的还是同一个宿主机的操作系统内核。关于Namespaces和Cgroups后面再详细介绍,这里你只知道他们是启动隔离和限制应用进程的就行了。
容器是怎么工作的
Namespace的作用是隔离,它让应用进程只能看到该Namespace内的世界;而Cgroups的作用是限制,它给这个世界围上了一圈看不见的墙。通过Mount Namespace可以修改容器进程对自己的文件系统 "挂载点"的认知。在容器进程启动之前重新挂载它的整个根目录"/"(通过pivot_root系统调用改变进程的文件系统,如果系统不支持,则使用chroot),而由于Mount Namespace的存在,这个挂载对宿主机不可见的。这个挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容器镜像”。它还有一个更为专业的名字,叫作:rootfs(根文件系统)。rootfs只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。
所以说,rootfs 只包括了操作系统的 "躯壳",并没有包括操作系统的内核。同一台机器上的所有容器,都共享宿主机操作系统的内核。
这就意味着,如果容器里的应用程序需要配置内核参数、跟内核进行直接的交互,这些都是操作的宿主机操作系统的内核,它对于该机器上的所有容器来说是一个“全局变量”,牵一发而动全身。这也是容器相比于虚拟机的主要缺陷之一:毕竟虚拟机有模拟出来的硬件机器充当沙盒,而且每个虚拟机里还运行着一个完整Guest OS让应用随便折腾。不过由于rootfs里打包的不只是应用,而是整个操作系统的文件和目录,也就意味着,应用以及它运行所需要的所有依赖,都被封装在了一起。这就赋予了容器所谓的一致性:无论在本地、云端,还是在一台任何地方的机器上,用户只需要解压打包好的容器镜像,那么这个应用运行所需要的完整的执行环境就被重现出来。
容器的优势
容器占用的大小比虚拟机小很多,甚至可以小到10MB,可以轻松限制容器的内存和CPU使用率。与部署应用需要部署整个操作系统的虚拟机相比,容器非常轻巧且启动迅速。这样让我们可以快速扩展容器并添加相同的容器。
同样,容器对于持续集成和持续部署(CI / CD)实施也是极好的选择。他们通过在开发人员之间分发和合并镜像来促进协作开发。
容器的劣势
容器仍无法提供与虚拟机相同的安全性和稳定性。由于它们共享主机的内核,因此不能像虚拟机一样完全隔离。
容器是进程级的隔离,一个容器可以通过影响宿主机内核的稳定性来影响其他容器。
一旦容器执行了任务,它就会关闭并删除其中的所有数据。如果希望数据保留下来,则必须使用"数据卷"进行保存,这需要在主机上进行手动配置。
容器还是虚拟机
上面我们列出了容器和虚拟机各自的优势和劣势,我们在因为优势选择了其一后默认就要其忍受劣势所带来的副作用,凡事都有两面性没有东西可以只有优点没缺点的。就容器和虚拟机来说,因为其完整的隔离和安全性虚拟机通常用于要求苛刻的应用程序,网络基础结构以及将消耗VM大部分资源的应用程序。而容器通常用于Web应用,微服务。
如何安装虚拟机:
1.创建虚拟机
首先打开虚拟机,选择文件目录下新建虚拟机或者创建新的虚拟机。
打开之后选择典型,然后下一步
选择稍后安装操作系统,然后下一步
选择Linux,并在版本目录下选择CentOS 7 63位,随后下一步
在位置处选择浏览,在目录下创建一个虚拟机文件夹,并在其中新建一个Linux文件夹,之后虚拟机的文件都会在里面,文件会很大,不要创建在C盘,然后确定,下一步
之后最大磁盘容量可以自己设置,推荐60GB,随后下一步
选择完成,完成虚拟机的创建。
2.Linux系统的安装
在我的计算机目录下选择刚刚创建的虚拟机,选择编辑虚拟机设置
在CD/DVD目录右边设备状态下选择启动时连接,在连接目录下选择使用ISO映像文件,点击浏览,内存最少选择2G,处理器选择两核心。
选择开启此虚拟机
进入虚拟器选择Install CentOS 7,直接安装
进入安装程序引导后选择语言,随后继续
配置界面选择软件最小安装,选择GNOME桌面和开发工具,点击完成,自动开始配置安装
点击安装位置进行分区,可以使用自动分区,点击完成即自动完成分区
配置完成后选择开始安装
安装过程中会进行用户设置,点击进行密码和用户设置,等待安装完成,完成后点击重启。
重启进入系统选择CentOS Linux
初始设置选择许可证
勾选我同意许可证,随后点击完成。
点击完成配置,完成初始设置
进入主界面选择用户登录,输入密码后选择登录。
进入欢迎界面选择语言,随后选择前进
继续选择前进
继续前进
在线账号选择跳过
配置完成选择开始使用。
帮助界面点击“x”。
Linux系统安装完成