虚拟化技术课程实践
利用以下指令安装KVM、QUME等相关组件,
apt‐get install kvm qemu libvirt‐bin virtinst virt‐manager virt‐viewer
安装完成后,使用以下两条指令检查相关组件是否已经正确安装,
kvm-ok
virsh -c qemu:///system list
校验结果如图1和图2所示:
图 1 KVM、QUME等组件成功安装
图 2 查看 Hypervisor上虚拟机的列表来确认相关组件已经正确安装
利用以下指令在当前目录下创建虚拟机磁盘文件,
qemu-img create -f qcow2 ubuntu.img 10G
该指令的作用为创建一个格式为qcow2、大小为10G、文件名为ubuntu的镜像文件。
该步骤结果如图3所示。
图 3 创建虚拟机磁盘文件
首先使用以下指令下载ubuntu-20.04.4-live-server-amd64系统盘,
wget https://mirrors.aliyun.com/ubuntu-releases/focal/ubuntu-20.04.4-live-server-amd64.iso
然后使用以下指令启动虚拟机,并插入系统盘,安装操作系统,
machines/ubuntu.img -cdrom /home/huyu/virtual\ machines/ubuntu-20.04.4-live-server-amd64.iso -enable-kvm -boot d -m 1024
部分安装过程如图4所示。
图 4 在虚拟机中安装操作系统
在第三步中我们已经成功安装虚拟机了,因此可以使用以下指令以命令行的形式配置虚拟机的启动参数并启动虚拟机。
qemu-system-x86_64 ubuntu.img -m 1024
启动过程如图5所示。
图 5 启动虚拟机
为了采用libvirt来管理虚拟机,首先我们要使用vim编辑配置文件demo.xml,指定虚拟机的最大内存、VCPU的个数等详细启动参数。
紧接着使用下列指令定义虚拟机,即从xml配置文件创建虚拟机,
sudo virsh define demo.xml
随后使用以下指令启动虚拟机,
sudo virsh start demo
通过以下指令可以查看虚拟机是否启动成功,
sudo virsh -c qemu:///system list
最后,可以使用以下指令操作虚拟机,
virt-viewer -c qemu:///system [Id]
从图6和图7中可以看出该步骤已成功实现。
图 6 虚拟机启动成功
图 7 通过virt-viewer使用虚拟机
执行以下指令打开Virtual Machine Manager来安装虚拟机,
sudo virt-manager
从图8中可以看出该步骤已顺利完成。
图 8 使用Virtual Machine Manager来安装虚拟机
使用以下指令可以查看镜像信息,
qemu-img info ubuntu.img
使用以下指令可以转换镜像格式,
qemu‐img convert ‐f qcow2 –O raw ubuntu.img Ubuntu‐raw.img
图9展示了两种镜像格式的详细信息。
raw和qcow2这两种镜像格式之间的比较将在第三部分思考题及答案中给出。
图 9 两种格式的镜像的信息
问题:提示“错误: 将插槽连接到 ‘/var/run/libvirt/libvirt-sock’ 失败: 权限不够”。
解决方案:重启虚拟机。
问题:在转换镜像格式时提示磁盘空间不足。
解决方案:使用Gparted拓展磁盘。
在该部分实验中,我顺利在装有Ubuntu14.04操作系统的VMware虚拟机上:
通过该部分实验,我更加清楚了kvm和qemu这两者之间的关系。kvm是内核虚拟化支持的模块,而qemu是用户层的模拟虚拟机的仿真软件,并没有内核支持。虽然后来的qemu版本已经集成了kvm module,但是在实验中我也体会到了有没有kvm模块支持(即--enable-kvm)的qemu之间的性能差距。同时,通过亲手实验虚拟机镜像的制作、安装以及启动,我对虚拟化技术也有了更深的了解。
利用以下指令安装 Docker 环境所需的依赖包,
apt-get update
apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
注意:需要更新apt软件包索引并安装软件包以允许apt通过HTTPS使用存储库
执行以下指令添加GPG证书秘钥并验证是否拥有带有指纹的密钥,
sudo curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg |
sudo apt-key add –apt-key fingerprint 0EBFCD88
执行以下指令写入软件源信息
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
按顺序执行以下三条指令,以安装docker,并运行hello-world容器,
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
docker run hello‐world
从图10中可以看出hello-world容器已经成功运行。
图 10 hello-world容器成功运行
执行以下指令从Docker-hub上下载ubuntu 20.04镜像,
sudo docker pull ubuntu:focal
执行以下指令以进行创建一个新的容器等操作,
sudo docker run -it --name my-container ubuntu:focal bash
从图11中可以看出,利用ubuntu:focal镜像创建的容器已经成功运行,并且能够执行Linux命令。
图 11 运行容器并执行任意Linux指令
在第五步运行的容器中任意安装一个软件(例如OpenSSH-server),结果如图12所示。
再利用以下指令可以从容器创建一个新的镜像,并给出镜像名称和标签,
sudo docker commit -m "Just installed a new software" -a "hy" my-container my-image1
从图13中可以看出已经成功从上述容器创建出新的镜像my-image1了。
图 12 在容器中安装任意软件
图 13 创建新的镜像
首先使用touch创建Dockerfile并使用vim编辑。
随后使用下列指令进行基于上述Dockerfile创建镜像的操作,
docker build -t my-image2 .
图14显示了使用docker commit创建的镜像和基于Dockerfile创建的镜像的区别,详细的区别介绍将在第三部分思考题及答案中给出。
图 14 使用docker commit创建的镜像,以及其与基于Dockerfile创建的镜像的区别
问题:安装Docker时提示“E: 未发现软件包 docker-ce-cli”。
解决方案:运行以下代码即可正确安装Docker。
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" && sudo apt-get update && sudo apt-get install -y docker-ce
问题:运行任何docker指令时均会提示“Got permission denied while trying to connect to the Docker daemon socket at …”。
解决方案:运行docker指令时均添加sudo以使其拥有相应权限。
在该部分的实验中,通过亲手制作各种Docker容器、镜像,我很好地掌握了Docker的基本使用方法,也明白了利用Docker commit和利用Dockerfile构建镜像之间的区别。同时,通过与实验一所耗费的时间以及宿主机的开销进行比较,我很明显地感受到Docker的便利性、轻量性,我将在第三部分思考题及答案中详细比较虚拟机和容器的镜像大小、启动速度等方面的区别。
答:虚拟机镜像格式包括raw、vmdk、cow、qcow以及qcow2等,其中raw和qcow2是目前最主流的两种格式。下面将详细比较这两种格式的区别。
答:docker制作镜像的方式主要有经过docker commit制作镜像、经过docker build制作镜像(也就是实验中的Dockerfile)这两种方法。这两种方法都是经过改进已有的镜像来达到本身的目的。
docker history指令打印出来的历史版本信息中可以看到详细的例如apt-get install的操作,可理解性较好,而使用docker commit方法创建出来的镜像的历史信息则是不可见的;综上,利用docker build和docker commit创建镜像各有优劣,需要结合实际状况来具体选择其中一种方法进行镜像构建。
答:总体来说,容器相对于虚拟机具有很多优势:
即便如此,我们也不能完全否定虚拟机,因为在实际应用中二者是适用于自己的场景的。虚拟机更擅长于彻底隔离整个运行环境,例如云计算服务提供商通常采用虚拟机技术隔离不同的用户。而docker通常用于隔离不同的应用,例如前端,后端以及数据库。
通过本次虚拟化技术课程实践,
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin
我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它